aspect-sync 0.1.33 → 0.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +11 -11
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as Yo}from"commander";import ir from"node:path";import{readFileSync as Vo,realpathSync as or}from"node:fs";import{fileURLToPath as Qo}from"node:url";import ge from"node:fs/promises";import xt from"node:path";import ur from"fs/promises";import dr from"path";function qt(n,e){let t=new Map;for(let c of n){let u=dr.dirname(c.targetPath??c.path);t.has(u)||t.set(u,[]),t.get(u).push(c)}let r=new Map;for(let[c,u]of t.entries()){let d=u.reduce((m,g)=>m+g.size,0);r.set(c,d)}let s=Array.from(t.keys()).sort(),o=[],i=[],a=0,l=1;for(let c of s){let u=t.get(c),d=r.get(c);if(d>e){if(i.length>0&&(o.push({batchNumber:l++,files:i,totalSize:a}),i=[],a=0),u.length===1)o.push({batchNumber:l++,files:u,totalSize:d});else for(let m of u)a+m.size>e&&i.length>0&&(o.push({batchNumber:l++,files:i,totalSize:a}),i=[],a=0),i.push(m),a+=m.size;continue}a+d>e&&i.length>0&&(o.push({batchNumber:l++,files:i,totalSize:a}),i=[],a=0),i.push(...u),a+=d}return i.length>0&&o.push({batchNumber:l++,files:i,totalSize:a}),o}async function Jt(n){try{await ur.unlink(n)}catch(e){if(e.code!=="ENOENT")throw e}}import{Readable as Rr}from"node:stream";import Zt from"axios";function re(n,e){if(e.length===0)return n.finalizedStatus?n.finalizedStatus:n.isCreatingFolders?"creating-folders":"queued";if(n.isCreatingFolders)return"creating-folders";let t={queued:0,paused:0,inProgress:0,success:0,failed:0,cancelled:0};for(let s of e)switch(s.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 r=e.length;return t.failed===r?"all-failed":t.failed>0?"some-failed":t.success===r?"success":t.paused>0&&t.queued===0&&t.inProgress===0?"paused":t.queued>0||t.inProgress>0?t.queued+t.paused===r?"queued":"in-progress":"cancelled"}function at(n,e){let t=re(n,e);return t==="creating-folders"||t==="in-progress"||t==="queued"||t==="paused"?"cancelled":t}function lt(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 ct(n){for(let e of Object.values(n))if(e.status==="queued"||e.status==="in-progress"||e.status==="paused")return!0;return!1}function se(n){let t=Object.values(n).reduce((r,s)=>{switch(s.status!=="failed"&&s.status!=="cancelled"&&(r.totalBytesToUpload+=s.totalBytesToUpload,r.totalBytesUploaded+=s.bytesUploaded),r.totalAssetCount+=1,s.status){case"queued":r.queuedAssetCount+=1;break;case"paused":r.pausedAssetCount+=1;break;case"in-progress":r.inProgressAssetCount+=1;break;case"success":r.successAssetCount+=1;break;case"failed":r.failedAssetCount+=1;break;case"cancelled":r.cancelledAssetCount+=1;break}return r},{totalBytesToUpload:0,totalBytesUploaded:0,totalAssetCount:0,queuedAssetCount:0,pausedAssetCount:0,inProgressAssetCount:0,successAssetCount:0,failedAssetCount:0,cancelledAssetCount:0,hasActiveUploads:!1,progress:0});return t.hasActiveUploads=t.totalAssetCount-t.successAssetCount-t.failedAssetCount-t.cancelledAssetCount>0,t.progress=t.hasActiveUploads?t.totalBytesUploaded/t.totalBytesToUpload:0,t}function Pe(n,e){if(e.length===0)return null;let t=e.reduce((r,s)=>(s.status!=="failed"&&s.status!=="cancelled"&&(r.totalBytes+=s.totalBytesToUpload,r.uploadedBytes+=s.bytesUploaded),s.status==="success"?r.filesSucceeded++:s.status==="failed"&&r.filesFailed++,(s.status==="success"||s.status==="failed"||s.status==="cancelled")&&r.filesCompleted++,r),{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 ut(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 dt(n){return Object.values(n).some(e=>e.status==="paused")}import hi from"axios";var oe=class{#e;#s;#t;#o;#r;#n=0;#i=0;#c=0;#a=0;#u=0;#p=0;constructor(e){this.#e=e?.alphaFast??.1,this.#s=e?.alphaMax??.5,this.#t=e?.consecutiveForBoost??3,this.#o=e?.minSamples??3,this.#r=e?.maxGapSeconds??2}sample(e){let t=Date.now();if(this.#a===0){this.#a=t,this.#u=e;return}let s=(t-this.#a)/1e3,o=e-this.#u;if(s<=0||o<0)return;if(s>this.#r){this.#a=t,this.#u=e;return}let i=o/s;if(this.#p===0)this.#n=i;else{let l=i-this.#n>=0?1:-1;this.#c!==0&&l===this.#c?this.#i++:this.#i=0,this.#c=l;let c=Math.min(1,this.#i/this.#t),u=this.#e+(this.#s-this.#e)*c;this.#n=u*i+(1-u)*this.#n}this.#a=t,this.#u=e,this.#p++}etaSeconds(e){return!this.isWarmedUp||this.#n<=0?0:e/this.#n}adjustTotalBytes(e){this.#u+=e}reset(){this.#n=0,this.#i=0,this.#c=0,this.#a=0,this.#u=0,this.#p=0}serialize(){return{displaySpeedBps:this.#n,lastSampleTimestamp:this.#a,lastSampleTotalBytes:this.#u,sampleCount:this.#p}}get speedBps(){return this.#n}get speedMbps(){return this.#n*8/1e6}get isWarmedUp(){return this.#p>=this.#o}};function O(n){let e={"X-Aspect-Share-Id":n.shareId};return n.shareAuthentication&&(e["X-Aspect-Share-Authentication"]=n.shareAuthentication),e}var ie=class{#e;#s;#t;#o;#r;#n;#i;#c;#a;#u;#p;#l;#k;#g;#I;#P;#C;#h;#b;#E;#R;#m;#y;#T;#d;#v;#f;#w;#U;#B;#D;#M;constructor(e){this.#s=e?.minConcurrency??1,this.#t=e?.maxConcurrency??8,this.#e=this.#j(e?.initialConcurrency??this.#s),this.#o=e?.errorThreshold??1,this.#r=(e?.cooldownSeconds??10)*1e3,this.#n=e?.plateauThreshold??.05,this.#i=Math.max(this.#t,Math.floor(e?.sampleWindowSize??64)),this.#c=Math.max(2,Math.floor(e?.minSamples??4)),this.#a=Math.max(1.1,e?.increaseFactor??1.5),this.#u=e?.onChange,this.#p=e?.now??Date.now,this.#l=this.#e,this.#k=0,this.#g=[],this.#I=0,this.#P=0,this.#C=-1,this.#h=0,this.#b=void 0,this.#E=0,this.#R=0,this.#m=0,this.#y=this.#l,this.#T=0,this.#d=1/0,this.#v=0,this.#f=6e4,this.#w=0,this.#U=1/0,this.#B=0,this.#D=0,this.#M=0}recordSuccess(e,t,r){if(e<=0)return;if(r?.generation!==void 0){if(r.generation!==this.#k){r.generation===this.#C&&this.#h>0&&(this.#h--,this.#h===0&&(this.#b=r.completedAtMs??this.#p()));return}if(this.#h>0||this.#b!==void 0&&r.startedAtMs!==void 0&&r.startedAtMs<this.#b)return}else if(this.#P>0){this.#P--;return}let s=r?.completedAtMs??this.#p();for(this.#g.push({bytes:e,completedAtMs:s,startedAtMs:r?.startedAtMs,durationMs:t!==void 0&&t>0?t:void 0});this.#g.length>this.#i;)this.#g.shift();this.#I++,this.#E=0;let o=this.#z();this.#D=o.throughputBps,this.#M=o.latencyMsPerMB,this.#x(o)}recordError(){if(this.#E++,this.#E<this.#o)return;let e=this.#l;e===this.#w&&(this.#U=Math.min(this.#U,e),this.#B=this.#p()+3e4),this.#w=e;let t=this.#j(Math.floor(e/2));this.#R=this.#p()+this.#r,this.#E=0,e<=this.#y&&(this.#y=t,this.#T=0),e>t&&(this.#d=Math.min(this.#d,e),this.#W()),this.#A(t)}get concurrency(){return this.#l}get generation(){return this.#k}get speedBps(){return this.#D}get latencyMsPerMB(){return this.#M}reset(){this.#l=this.#e,this.#k++,this.#g=[],this.#I=0,this.#P=0,this.#C=-1,this.#h=0,this.#b=void 0,this.#E=0,this.#R=0,this.#m=0,this.#y=this.#l,this.#T=0,this.#d=1/0,this.#v=0,this.#f=6e4,this.#w=0,this.#U=1/0,this.#B=0,this.#D=0,this.#M=0,this.#u?.(this.#l)}#x(e){if(this.#g.length<this.#K()||this.#I<this.#K()||e.throughputBps<=0)return;let t=this.#p();if(t<this.#R)return;if(e.averageDurationMs>=2e4&&this.#l>=4){this.#y=Math.max(this.#s,Math.floor(this.#l/2)),this.#T=0,this.#A(this.#y);return}if(this.#T===0){this.#N(e.throughputBps),this.#_(e);return}let r=(e.throughputBps-this.#T)/this.#T;if(r>=this.#n){this.#N(e.throughputBps),this.#_(e);return}if(this.#l>this.#y){let s=r<=-.08,o=r<this.#n;(s||o)&&(this.#d=Math.min(this.#d,this.#l),this.#W(),this.#A(this.#y));return}if(this.#l<this.#y){this.#_(e);return}this.#l===this.#y&&(this.#T=Math.max(this.#T,e.throughputBps),t>=this.#m&&this.#_(e))}#_(e){let t=this.#Y();if(this.#l>=t){this.#I=0;return}if(e.averageDurationMs>=5e3&&this.#l>=4&&this.#T>0){this.#I=0;return}if(this.#L()){let s=this.#p();if(this.#v===0){this.#v=s+this.#f,this.#m=this.#v,this.#I=0;return}if(s<this.#v){this.#I=0;return}}let r=this.#S(t);if(r===this.#l){this.#I=0;return}this.#A(r)}#N(e){this.#y=this.#l,this.#T=e,this.#d<=this.#l&&(this.#d=1/0),this.#v=0,this.#f=6e4,this.#m=0}#S(e){if(this.#d<1/0){let s=Math.floor((this.#l+this.#d)/2);return s>this.#l&&s<this.#d?Math.min(e,s):Math.min(e,this.#l+1)}if(this.#l<4)return Math.min(e,this.#l+1);let t=Math.ceil(this.#l*this.#a),r=this.#l+2;return Math.min(e,Math.max(r,t))}#A(e){let t=this.#l,r=this.#k,s=this.#j(e);s!==t&&(this.#O(),this.#l=s,this.#k++,this.#C=r,this.#h=Math.max(0,t-1),this.#b=this.#h===0?this.#p():void 0,this.#P=Math.max(0,t-1),this.#u?.(this.#l))}#O(){this.#g=[],this.#I=0,this.#P=0}#L(){return this.#d<1/0&&this.#l===this.#y&&this.#d<=this.#y+1}#W(){let e=this.#d<1/0&&this.#d<=this.#y+1,t=e?this.#f:1e4;this.#m=this.#p()+t,e&&(this.#v=this.#m,this.#f=Math.min(this.#f*2,3e5))}#K(){return Math.max(this.#c,this.#l)}#Y(){return this.#U<1/0&&this.#p()>=this.#B&&(this.#U=1/0,this.#B=0),Math.max(this.#s,Math.min(this.#t,this.#U-1))}#j(e){return Math.max(this.#s,Math.min(this.#t,e))}#z(){let e=0,t=0,r=0,s=0;for(let l of this.#g)e+=l.bytes,l.durationMs!==void 0&&(t+=l.durationMs,r++,s+=l.durationMs/(l.bytes/(1024*1024)));if(r>0&&t>0)return{throughputBps:e/(t/1e3)*this.#l,latencyMsPerMB:s/r,averageDurationMs:t/r,durationSampleCount:r};if(this.#g.length<2)return{throughputBps:0,latencyMsPerMB:0,averageDurationMs:0,durationSampleCount:0};let o=this.#g[0],a=this.#g[this.#g.length-1].completedAtMs-o.completedAtMs;return{throughputBps:a>0?e/a*1e3:0,latencyMsPerMB:0,averageDurationMs:a>0?a/Math.max(1,this.#g.length-1):0,durationSampleCount:0}}};var j=class{#e;#s;#t;#o;#r;constructor(e){let t=e===0?null:e;this.#e=t,this.#s=t??0,this.#t=Date.now(),this.#o=[],this.#r=null}setLimit(e){let t=e===0?null:e;if(t===null){this.#e=null,this.#s=0,this.#u();let s=this.#o.splice(0);for(let o of s)o.resolve();return}let r=this.#e;this.#e=t,r===null?(this.#s=t,this.#t=Date.now()):(this.#n(),this.#s=Math.min(this.#s,t)),this.#a()}getLimit(){return this.#e}acquire(e){if(this.#e!==null){if(this.#n(),this.#o.length===0&&this.#s>=e){this.#s-=e;return}return this.#i(e)}}#n(){let e=Date.now(),t=(e-this.#t)/1e3;if(t<=0)return;let r=this.#e,s=t*r,o=this.#o.length>0?Math.max(r,this.#o[0].bytes):r;this.#s=Math.min(this.#s+s,o),this.#t=e}#i(e){return new Promise(t=>{this.#o.push({bytes:e,resolve:t}),this.#r===null&&this.#c()})}#c(){if(this.#o.length===0||this.#e===null){this.#r=null;return}let t=this.#o[0].bytes-this.#s,r=t>0?Math.ceil(t/this.#e*1e3):0;if(r<=0){this.#r=null,this.#a();return}this.#r=setTimeout(()=>{this.#r=null,this.#n(),this.#a()},r)}#a(){for(;this.#o.length>0;){if(this.#e===null){let t=this.#o.splice(0);for(let r of t)r.resolve();return}this.#n();let e=this.#o[0];if(this.#s>=e.bytes)this.#s-=e.bytes,this.#o.shift(),e.resolve();else{this.#c();return}}}#u(){this.#r!==null&&(clearTimeout(this.#r),this.#r=null)}};function Yt(n){let e=`[${n}]`;return{info:(...t)=>console.info(e,...t),warn:(...t)=>console.warn(e,...t),error:(...t)=>console.error(e,...t)}}var pt=Yt("transfer");var Qt="transportDiagnostics";function B(n){return typeof n=="string"&&n.length>0?n:null}function Vt(n){if(n===null||typeof n!="object")return null;let e=n,t=B(e.O),r=B(e.CN),s=[t,r].filter(o=>o!==null);return s.length>0?s.join(" / "):null}function pr(n){if(!n)return{};let e={remoteAddress:B(n.remoteAddress),remoteFamily:B(n.remoteFamily),tlsAuthorized:typeof n.authorized=="boolean"?n.authorized:null};if(typeof n.getProtocol=="function"&&(e.tlsProtocol=B(n.getProtocol())),typeof n.getCipher=="function"){let t=n.getCipher();t!==null&&typeof t=="object"&&(e.tlsCipher=B(t.name))}if(typeof n.getPeerCertificate=="function"){let t=n.getPeerCertificate();if(t!==null&&typeof t=="object"){let r=t;e.peerCertIssuer=Vt(r.issuer),e.peerCertSubject=Vt(r.subject)}}return e}function mt(n){let e={errorCode:null,hadResponse:!1,reusedSocket:null,remoteAddress:null,remoteFamily:null,tlsProtocol:null,tlsCipher:null,peerCertIssuer:null,peerCertSubject:null,tlsAuthorized:null};if(n===null||typeof n!="object")return e;let t=n;e.errorCode=B(t.code),e.hadResponse=t.response!=null;let r=t.request;if(r){e.reusedSocket=typeof r.reusedSocket=="boolean"?r.reusedSocket:null;let s=r.socket??r.res?.socket??null;Object.assign(e,pr(s))}return e}function ht(n,e){n===null||typeof n!="object"||(n[Qt]=e)}function ft(n){if(n===null||typeof n!="object")return null;let e=n[Qt];return e??null}var gt=n=>!Number.isFinite(n)||n<=0?"Calculating...":n<1?`${(n*1e3).toFixed(0)} Kbps`:`${n.toFixed(1)} Mbps`,yt=n=>{if(!Number.isFinite(n)||n<=0)return"Calculating...";let e=Math.floor(n/3600),t=Math.floor(n%3600/60),r=Math.floor(n%60);return e>0?`${e}h ${t}m left`:t>0?`${t}m ${r}s left`:`${r}s left`};var Re=class{uploadAssets={};uploadGroups={};#e=new oe;get uploadSpeedState(){return this.#e.serialize()}uploadStats={uploadSpeedMbps:0,timeRemainingSeconds:0,formattedSpeed:"Calculating...",formattedTime:"Calculating..."};dirtyAssetIds=new Set;dirtyGroupIds=new Set;dirtyHistoryGroupIds=new Set;#s(e){e!==0&&this.#e.adjustTotalBytes(-e)}adjustSpeedBaselineForSkippedBytes(e){e!==0&&this.#e.adjustTotalBytes(e)}#t(){Object.values(this.uploadAssets).some(t=>t.status==="queued"||t.status==="in-progress")||this.#e.reset()}#o(e){this.dirtyAssetIds.add(e)}#r(e){this.dirtyGroupIds.add(e)}addUploadAsset({assetId:e,fileReader:t,abortController:r,parentId:s,projectId:o,groupId:i,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:s,projectId:o,groupId:i,retryCount:0,chunkSize:a??0,fileReader:t,abortController:r,shareContext:l},this.#o(e)}updateUploadProgress(e,t){let r=this.uploadAssets[e];if(!r||r.status==="paused"||r.status==="cancelled"||r.status==="success"||r.status==="failed")return;let s=t>0&&r.status==="queued"?"in-progress":r.status,o=Math.min(t,r.totalBytesToUpload);r.bytesUploaded=o,r.status=s,this.#o(e)}markUploadInProgress(e){let t=this.uploadAssets[e];t&&(t.status="in-progress",this.#o(e))}markUploadSuccess(e){let t=this.uploadAssets[e];t&&(t.status="success",t.bytesUploaded=t.totalBytesToUpload,this.#o(e),this.#t(),this.cleanupOnCompletion(e))}markUploadFailed(e,t){let r=this.uploadAssets[e];if(!r)return;let s=r.bytesUploaded;r.status="failed",r.errorMessage=t,r.bytesUploaded=0,this.#o(e),this.#s(s),this.#t(),this.cleanupOnCompletion(e)}removeUploadAsset(e){let r=this.uploadAssets[e]?.bytesUploaded??0;delete this.uploadAssets[e],this.#o(e),this.#s(r),this.#t()}clearAllUploads(){this.uploadAssets={},this.#e.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.#e.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.#o(e))}resetAssetForRetrying(e){let t=this.uploadAssets[e];t&&(t.status="queued",t.bytesUploaded=0,t.retryCount=0,this.#o(e))}pauseUpload(e){let t=this.uploadAssets[e];if(!t||t.status!=="queued"&&t.status!=="in-progress")return;let r=0;if(t.chunkedState){let{completedChunkIndices:o,chunkSize:i}=t.chunkedState;for(let a of o){let l=a*i,c=Math.min(l+i,t.totalBytesToUpload);r+=c-l}}let s=t.bytesUploaded-r;t.status="paused",t.bytesUploaded=r,this.#o(e),this.#s(s),this.#t(),t.abortController.abort()}unpauseUpload(e){let t=this.uploadAssets[e];t&&t.status==="paused"&&(t.status="queued",this.#o(e))}pauseUploadGroup(e){let t=this.uploadGroups[e];if(t&&!t.isCreatingFolders){t.isPaused=!0,this.#r(e);for(let r of t.assetIds)this.pauseUpload(r)}}unpauseUploadGroup(e){let t=this.uploadGroups[e];t&&(t.isPaused=!1,this.#r(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 r=t.bytesUploaded;t.status="cancelled",this.#o(e),this.#s(r),this.#t(),this.cleanupOnCompletion(e)}setChunkedState(e,t){let r=this.uploadAssets[e];r&&(r.chunkedState=t,this.#o(e))}addCompletedChunkIndex(e,t){let r=this.uploadAssets[e];!r||!r.chunkedState||(r.chunkedState={...r.chunkedState,completedChunkIndices:[...r.chunkedState.completedChunkIndices,t]},this.#o(e))}clearChunkedState(e){let t=this.uploadAssets[e];t&&(t.chunkedState=void 0,this.#o(e))}hasGroupsCreatingFolders(){return Object.values(this.uploadGroups).some(e=>e.isCreatingFolders===!0)}areAllUploadsPaused(){return ut(this.uploadAssets)}hasPausedUploads(){return dt(this.uploadAssets)}getUploadAsset(e){return this.uploadAssets[e]}getSerializableAsset(e){let t=this.uploadAssets[e];if(t)return this.#n(t)}getUploadSummary(){return se(this.#c())}getAllUploadAssetsSortedByRecent(){return Object.values(this.uploadAssets).map(e=>this.#n(e)).sort((e,t)=>t.i-e.i)}getGroupAssets(e){let t=this.uploadGroups[e];return!t||!t.assetIds?[]:t.assetIds.map(r=>this.uploadAssets[r]).filter(Boolean).map(r=>this.#n(r))}getGroupAssetsInternal(e){let t=this.uploadGroups[e];return!t||!t.assetIds?[]:t.assetIds.map(r=>this.uploadAssets[r]).filter(Boolean)}addUploadGroup(e){let t=crypto.randomUUID();return this.uploadGroups[t]={...e,id:t,fileReaders:new Map},this.#r(t),t}updateUploadGroup(e,t){let r=this.uploadGroups[e];r&&(Object.assign(r,t),this.#r(e))}addAssetToGroup(e,t){let r=this.uploadGroups[e];r&&(r.assetIds.push(t),this.#r(e))}finalizeEmptyGroup({groupId:e,status:t,errorMessage:r}){let s=this.uploadGroups[e];s&&(s.assetIds.length>0||s.finalizedStatus||(s.finalizedStatus=t,s.errorMessage=r,s.isCreatingFolders=!1,s.completedAt=new Date().toISOString(),this.#r(e),this.dirtyHistoryGroupIds.add(e)))}removeUploadGroup(e){let t=this.uploadGroups[e];if(t)for(let r of t.assetIds)delete this.uploadAssets[r],this.#o(r);delete this.uploadGroups[e],this.#r(e)}getUploadGroup(e){let t=this.uploadGroups[e];if(t)return this.#i(t)}getAllUploadGroups(){return Object.values(this.uploadGroups).map(e=>this.#i(e)).sort((e,t)=>t.createdAt.localeCompare(e.createdAt))}getUploadGroupProgress(e){let t=this.uploadGroups[e];if(!t)return null;let r=this.getGroupAssets(e);return Pe(this.#i(t),r)}getUploadGroupStatus(e){let t=this.uploadGroups[e];if(!t)return null;let r=this.getGroupAssets(e);return re(this.#i(t),r)}getAssetsByParentId(e){return Object.values(this.uploadAssets).filter(t=>t.parentId===e).map(t=>this.#n(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.#i(e))}cleanupOnCompletion(e){let t=this.uploadAssets[e];if(!t)return;let r=t.groupId;if(r){let o=this.uploadGroups[r];if(o){let i=this.getGroupAssets(r),a=this.#i(o);this.dirtyHistoryGroupIds.add(r),!i.some(c=>c.status==="queued"||c.status==="in-progress")&&!o.completedAt&&(o.completedAt=new Date().toISOString(),this.#r(r))}}let s=this.getUploadSummary();if(s.cancelledAssetCount+s.failedAssetCount+s.successAssetCount===s.totalAssetCount)for(let o of Object.keys(this.uploadAssets)){let i=this.uploadAssets[o];i&&(i.bytesUploaded=0,this.#o(o))}}updateUploadStats(){let e=this.getUploadSummary(),t=e.queuedAssetCount>0||e.inProgressAssetCount>0;t&&this.#e.sample(e.totalBytesUploaded);let r=this.#e.isWarmedUp?this.#e.speedMbps:0,s=t&&this.#e.isWarmedUp?this.#e.etaSeconds(e.totalBytesToUpload-e.totalBytesUploaded):0;this.uploadStats={uploadSpeedMbps:r,timeRemainingSeconds:s,formattedSpeed:gt(r),formattedTime:yt(s)}}buildHistoryItem(e){let t=this.uploadGroups[e];if(!t)return null;let r=this.getGroupAssets(e),s=this.#i(t);return{groupId:t.id,name:t.name,type:t.type,fileCount:t.fileCount,folderCount:t.folderCount,topLevelFileCount:t.topLevelFileCount,topLevelFolderCount:t.topLevelFolderCount,status:at(s,r),createdAt:t.createdAt,completedAt:t.completedAt,rootDirectoryId:t.rootDirectoryId,projectId:t.projectId,errorMessage:t.errorMessage,conflictResolution:t.conflictResolution}}#n({fileReader:e,abortController:t,shareContext:r,...s}){return s}#i({fileReaders:e,...t}){return t}#c(){let e={};for(let[t,r]of Object.entries(this.uploadAssets))e[t]=this.#n(r);return e}#a(){let e={};for(let[t,r]of Object.entries(this.uploadGroups))e[t]=this.#i(r);return e}getSerializableSnapshot(){return{uploadAssets:this.#c(),uploadGroups:this.#a(),uploadStats:{...this.uploadStats},uploadSpeedState:this.uploadSpeedState}}getDirtyDelta(){let e={};for(let r of this.dirtyAssetIds){let s=this.uploadAssets[r];s&&(e[r]=this.#n(s))}let t={};for(let r of this.dirtyGroupIds){let s=this.uploadGroups[r];s&&(t[r]=this.#i(s))}return{assets:e,groups:t}}clearDirtyFlags(){this.dirtyAssetIds.clear(),this.dirtyGroupIds.clear(),this.dirtyHistoryGroupIds.clear()}};function hr(n,e){let t=new Date(n).getTime(),r=Date.now();return t-r<=e}var Te=class{#e;#s=new Map;#t=new Map;constructor(e){this.#e=e}seedToken(e,t,r){this.#s.set(e,{token:t,expiresAt:r})}async getToken(e,t){let r=this.#s.get(e);if(r&&!hr(r.expiresAt,3e5))return r.token;let s=this.#t.get(e);if(s)return s;let o=t?O(t):void 0,i=this.#e.post(`/assets/${e}/token`,{},o).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.#t.delete(e),a.token}).catch(a=>{throw this.#t.delete(e),a});return this.#t.set(e,i),i}clearCache(e){e?this.#s.delete(e):this.#s.clear()}};var ke=class{#e=[];registerAsset(e){this.#e.push({assetId:e.assetId,totalChunks:e.totalChunks,nextChunkToClaim:0,completedChunkIndices:new Set(e.completedChunkIndices),isPaused:!1})}claimNextChunk(){for(let e of this.#e)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 r=this.#s(e);return r?(r.completedChunkIndices.add(t),r.completedChunkIndices.size>=r.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.#t(t))}removeAsset(e){this.#e=this.#e.filter(t=>t.assetId!==e)}hasAsset(e){return this.#e.some(t=>t.assetId===e)}isAssetComplete(e){let t=this.#s(e);return t?t.completedChunkIndices.size>=t.totalChunks:!1}clear(){this.#e=[]}#s(e){return this.#e.find(t=>t.assetId===e)}#t(e){for(let t=0;t<e.totalChunks;t++)if(!e.completedChunkIndices.has(t)){e.nextChunkToClaim=t;return}e.nextChunkToClaim=e.totalChunks}};var fr=/[/\\:*?"<>|\x00-\x1F]/g,gr=["CON","PRN","AUX","NUL","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9"];function H(n){let e=n.replace(fr,"_");e=e.replace(/[. ]+$/,""),(!e||e==="."||e==="..")&&(e="unnamed");let t=e.includes(".")?e.substring(0,e.lastIndexOf(".")):e;gr.includes(t.toUpperCase())&&(e=`_${e}`);let r=new TextEncoder;if(r.encode(e).length>255){let s=e.lastIndexOf("."),o=s>0?e.substring(s):"",i=s>0?e.substring(0,s):e,l=255-r.encode(o).length;for(;r.encode(i).length>l&&i.length>0;)i=i.slice(0,-1);e=i+o}return e}var U=class extends Error{constructor(){super("Upload cancelled"),this.name="CancelledError"}};function M(n){return n instanceof U||n instanceof Error&&n.name==="CancelledError"||n instanceof Error&&n.name==="CanceledError"||n instanceof Error&&n.name==="AbortError"}function Er(n){return M(n)||n instanceof Error&&n.name==="NoAuthError"}function wr(n){return new Promise(e=>setTimeout(e,n))}function Ir(n){return n instanceof Blob?n.size:n.byteLength}var le=class{#e;#s;#t;#o;#r;#n;#i;#c;#a;#u;#p;#l;#k;#g=null;#I=0;#P=!1;#C=[];#h=new Set;#b=!1;#E=!1;#R=!1;#m=[];#y=!1;#T=!1;#d=new ke;#v=0;#f=new Map;#w=new Map;#U=[];#B=!1;#D=null;#M;#x="keep_both";#_=new Map;#N=null;#S=!1;#A=null;#O=!1;constructor(e){this.#e=e.httpClient,this.#s=new Te(e.httpClient),this.#t=new Re,this.#o=e.historyStore??null,this.#r=e.settingsStore??null,this.#n=e.analytics??null,this.#i=e.logger??pt,this.#c=e.onChange??null,this.#a=e.onClear??null,this.#u=e.onSummary??null,this.#p=e.onConcurrencyAdjusted??null,this.#k=e.deltaIntervalMs??333;let t=e.maxConcurrency??4;if(e.adaptiveConcurrency!==!1){let r=e.adaptiveConcurrencyConfig;this.#A=new ie({initialConcurrency:r?.initialConcurrency??Math.min(4,t),minConcurrency:r?.minConcurrency??1,maxConcurrency:r?.maxConcurrency??t,errorThreshold:r?.errorThreshold,cooldownSeconds:r?.cooldownSeconds??10,plateauThreshold:r?.plateauThreshold,onChange:s=>{let o=this.#l;if(this.setMaxConcurrency(s),o===s)return;let i=this.#O?"reset":s>o?"probe_increase":"error_decrease",a=Math.round(this.#A.speedBps*8/1e6*100)/100,l=Math.round(this.#A.latencyMsPerMB*100)/100;this.#i.info(`Adaptive concurrency: ${o} \u2192 ${s} (${i}), measuredAt=${o}, speed=${a}Mbps, latency=${l}ms/MB`),this.#p?.({previousConcurrency:o,newConcurrency:s,reason:i,speedMbps:a,latencyMsPerMB:l})},now:r?.now}),this.#l=this.#A.concurrency}else this.#l=t;this.#o&&(this.#C=this.#o.load()),this.#r&&(this.#D=this.#r.getBandwidthLimitBps(),this.#x=this.#r.getConflictResolution()),this.#M=new j(this.#D),(this.#c||this.#u)&&(this.#g=setInterval(()=>{this.#ce()},this.#k)),this.#n&&(this.#N=setInterval(()=>{this.#de()},6e4))}startUpload(e){let t=e.assetId||crypto.randomUUID(),r=!!e.assetId,s;if(r){let i=this.#t.getUploadAsset(t);if(!i)throw new Error(`Cannot retry: asset ${t} not found`);s=i.chunkSize}else{if(e.chunkSize===void 0||e.chunkSize===null)throw new Error("chunkSize is required for new uploads");s=e.chunkSize}let o=new AbortController;if(r){if(this.#t.getUploadAsset(t).status==="cancelled")return t;e.resetRetryCount&&this.#t.resetAssetForRetrying(t);let a=this.#t.getUploadAsset(t);a.abortController=o,a.fileReader=e.fileReader,e.shareContext&&(a.shareContext=e.shareContext)}else this.#t.addUploadAsset({assetId:t,fileReader:e.fileReader,abortController:o,parentId:e.directoryId,projectId:e.projectId,groupId:e.groupId,chunkSize:s,shareContext:e.shareContext});return this.#m.push(t),this.#L(),this.#F(),t}startGroupUpload(e){this.#t.clearTerminalState();let t=this.#t.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.#x});return this.#_.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.#t.dirtyHistoryGroupIds.add(t),this.#$(),this.#F(),t}pauseUpload(e){let t=this.#t.getUploadAsset(e);this.#t.pauseUpload(e),this.#m=this.#m.filter(r=>r!==e),this.#d.pauseAsset(e),!this.#S&&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.#F()}unpauseUpload(e){this.#t.unpauseUpload(e),this.#F()}cancelUpload(e){let t=this.#t.getUploadAsset(e);if(!t||t.status==="success"||t.status==="failed"||t.status==="cancelled")return;let r=t.fileName,s=t.totalBytesToUpload,o=t.bytesUploaded,i=t.projectId,a=t.chunkedState?.assetId;(t.status==="queued"||t.status==="in-progress")&&t.abortController.abort(),this.#m=this.#m.filter(l=>l!==e),this.#d.removeAsset(e),this.#f.delete(e),this.#w.delete(e),this.#t.markUploadCancelled(e),this.#t.clearChunkedState(e),t.fileReader.close?.(),!this.#S&&this.#n&&this.#n("upload:file_cancelled",{file_name:r,file_size:s,bytes_uploaded:o,project_id:i??""}),this.#F(),this.#z(),this.#L(),this.#V(),a&&(this.#U.push(a),this.#X())}cancelAllUploads(){let e=this.#Q();this.#S=!0;try{let r=Object.values(this.#t.uploadAssets).filter(s=>s.status==="queued"||s.status==="in-progress"||s.status==="paused");for(let s of r)this.cancelUpload(s.assetId)}finally{this.#S=!1}this.#n?.("upload:all_cancelled",e)}retryUpload(e){let t=this.#t.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.#t.getUploadAsset(e);if(!t||t.status!=="paused")return;!this.#S&&this.#n&&this.#n("upload:file_resumed",{file_name:t.fileName,file_size:t.totalBytesToUpload,bytes_uploaded:t.bytesUploaded,project_id:t.projectId??""});let r=new AbortController;t.abortController=r,this.#t.unpauseUpload(e),this.#d.hasAsset(e)?(this.#d.unpauseAsset(e),this.#F(),this.#d.isAssetComplete(e)?this.#J(e).catch(s=>{this.#G(e,s)}):this.#z()):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.#t.uploadGroups[e];if(!t)return;let r=this.#S;this.#S=!0,this.#t.pauseUploadGroup(e);for(let s of t.assetIds)this.#m=this.#m.filter(o=>o!==s),this.#d.pauseAsset(s);this.#S=r,this.#S||this.#te(e,t,"upload:group_paused"),this.#F()}unpauseUploadGroup(e){this.#t.unpauseUploadGroup(e),this.#F()}cancelUploadGroup(e){let t=this.#t.uploadGroups[e];if(!t)return;let{totalBytes:r,bytesUploaded:s,filesRemaining:o}=this.#ee(t),i=this.#S;this.#S=!0;for(let a of t.assetIds)this.cancelUpload(a);t.assetIds.length===0&&(this.#t.finalizeEmptyGroup({groupId:e,status:"cancelled"}),this.#$(),this.#F()),this.#S=i,this.#S||this.#n?.("upload:group_cancelled",{file_count:t.assetIds.length,files_remaining:o,total_bytes:r,bytes_uploaded:s,project_id:t.projectId}),this.#_.delete(e)}resumeUploadGroup(e){let t=this.#t.uploadGroups[e];if(!t)return;this.#S||this.#te(e,t,"upload:group_resumed");let r=this.#S;this.#S=!0,this.#t.unpauseUploadGroup(e);for(let s of t.assetIds){let o=this.#t.getUploadAsset(s);o&&o.status==="paused"&&this.resumeUpload(s)}this.#S=r}retryUploadGroup(e){let t=this.#t.uploadGroups[e];if(t)for(let r of t.assetIds){let s=this.#t.getUploadAsset(r);s&&s.status==="failed"&&this.retryUpload(r)}}setGroupCreatingFolders(e,t){this.#t.updateUploadGroup(e,{isCreatingFolders:t}),this.#F()}markEmptyGroupFailed(e,t){let r=this.#t.uploadGroups[e];r&&(r.assetIds.length>0||r.finalizedStatus||(this.#i.error("Empty group upload failed",{groupId:e,groupName:r.name,errorMessage:t}),this.#t.finalizeEmptyGroup({groupId:e,status:"all-failed",errorMessage:t}),this.#$(),this.#_.delete(e),this.#F()))}markEmptyGroupCompleted(e){this.#t.finalizeEmptyGroup({groupId:e,status:"success"}),this.#$(),this.#_.delete(e),this.#F()}addAssetToGroup(e,t){this.#t.addAssetToGroup(e,t)}pauseAllUploads(){let e=this.#Q();this.#S=!0;try{for(let t of Object.values(this.#t.uploadAssets))t.groupId||this.pauseUpload(t.assetId);for(let t of Object.values(this.#t.uploadGroups))t.isCreatingFolders||this.pauseUploadGroup(t.id)}finally{this.#S=!1}this.#n?.("upload:all_paused",e),this.#F()}resumeAllUploads(){let e=this.#Q();this.#S=!0;try{for(let t of Object.values(this.#t.uploadAssets))!t.groupId&&t.status==="paused"&&this.resumeUpload(t.assetId);for(let t of Object.values(this.#t.uploadGroups))t.isPaused&&this.resumeUploadGroup(t.id)}finally{this.#S=!1}this.#n?.("upload:all_resumed",e),this.#F()}clearAllUploads(){this.#m=[],this.#d.clear(),this.#f.clear(),this.#w.clear(),this.#t.clearAllUploads(),this.#t.uploadGroups={},this.#A&&(this.#O=!0,this.#A.reset(),this.#O=!1),this.#a?.({all:!0}),this.#u?.(this.#H())}clearHistory(){this.#C=[],this.#o?.clear(),this.#b=!0,this.#h.clear(),this.#R=!0,this.#F()}removeHistoryItem(e){this.#C=this.#C.filter(t=>t.groupId!==e),this.#o?.remove(e),this.#h.add(e),this.#R=!0,this.#F()}removeGroup(e){this.#t.removeUploadGroup(e),this.#C=this.#C.filter(t=>t.groupId!==e),this.#o?.remove(e),this.#h.add(e),this.#R=!0,this.#a?.({groupId:e}),this.#u?.(this.#H()),this.#F()}getHttpClient(){return this.#e}setBandwidthLimit(e){let t=e!==this.#D;this.#D=e,this.#M.setLimit(e),this.#r?.setBandwidthLimitBps(e),t&&this.#A&&(this.#O=!0,this.#A.reset(),this.#O=!1),this.#R=!0,this.#F()}getBandwidthLimit(){return this.#D}setConflictResolution(e){this.#x=e,this.#r?.setConflictResolution(e),this.#R=!0,this.#F()}getConflictResolution(){return this.#x}getGroupConflictResolution(e){return this.#t.getUploadGroup(e)?.conflictResolution??this.#x}setMaxConcurrency(e){this.#l=e,this.#z()}getSnapshot(){return this.#t.updateUploadStats(),{...this.#t.getSerializableSnapshot(),uploadHistory:[...this.#C??[]],uploadSummary:this.#H(),bandwidthLimitBps:this.#D,conflictResolution:this.#x}}getUploadAsset(e){return this.#t.getSerializableAsset(e)}getUploadSummary(){return this.#H()}getGroupAssets(e){return this.#t.getGroupAssets(e)}getUploadGroupStatus(e){return this.#t.getUploadGroupStatus(e)}getUploadGroupProgress(e){return this.#t.getUploadGroupProgress(e)}hasGroupsCreatingFolders(){return this.#t.hasGroupsCreatingFolders()}areAllUploadsPaused(){return this.#t.areAllUploadsPaused()}hasPausedUploads(){return this.#t.hasPausedUploads()}hasActiveUploads(){return ct(this.#t.getSerializableSnapshot().uploadAssets)}getServerAssetIdsToCancel(){return lt(this.#t.getSerializableSnapshot().uploadAssets)}async cancelActiveServerUploads(){let e=this.getServerAssetIdsToCancel();if(e.length!==0)try{await this.#e.post("/assets/cancel-uploads",{asset_ids:e})}catch{await this.#e.post("/assets/cancel-uploads",{asset_ids:e})}}destroy(){this.#E=!0,this.#g&&(clearInterval(this.#g),this.#g=null),this.#N&&(clearInterval(this.#N),this.#N=null),this.#m=[],this.#d.clear();for(let e of Object.values(this.#t.uploadAssets))e.abortController.abort(),e.fileReader.close?.()}#L(){this.#T||(this.#T=!0,queueMicrotask(()=>{this.#T=!1,this.#W().catch(e=>{this.#i.error("Initiation pipeline error",{queueLength:this.#m.length},e)})}))}async#W(){if(!this.#y){this.#y=!0;try{await this.#K()}finally{this.#y=!1}}}async#K(){for(;this.#m.length>0&&!(this.#f.size>5);){let e=Math.min(this.#m.length,20-this.#f.size);if(e<=0)break;let t=[],r=[];for(let s=0;s<e&&this.#m.length>0;s++){let o=this.#m[0],i=this.#t.getUploadAsset(o);if(!i||i.status==="cancelled"){this.#m.shift(),s--;continue}if(this.#m.shift(),r.push(o),i.chunkedState)try{this.#Y(o,i),this.#z()}catch(a){M(a)||this.#G(o,a)}else t.push(o)}if(t.length>0){let s=new Map;for(let o of t){let a=this.#t.getUploadAsset(o)?.shareContext?.shareId??"",l=s.get(a);l||(l=[],s.set(a,l)),l.push(o)}for(let o of s.values())try{await this.#j(o)}catch(i){for(let a of o)this.#G(a,i instanceof Error?i:new Error(String(i)))}this.#z()}}}#Y(e,t){let r=t.chunkedState,s={serverAssetId:r.assetId,chunkIds:r.chunkIds,chunkSize:r.chunkSize,totalChunks:r.totalChunks,sizeBytes:r.sizeBytes},o=r.completedChunkIndices;this.#f.set(e,s);let i=new Array(s.totalChunks).fill(0);if(o.length>0){for(let l of o){let c=l*s.chunkSize,u=Math.min(c+s.chunkSize,t.totalBytesToUpload);i[l]=u-c}let a=i.reduce((l,c)=>l+c,0);this.#t.updateUploadProgress(e,a)}if(this.#w.set(e,i),s.totalChunks===0||o.length>=s.totalChunks){this.#J(e).catch(a=>{this.#G(e,a)});return}this.#d.registerAsset({assetId:e,totalChunks:s.totalChunks,completedChunkIndices:o})}async#j(e){let t=[],r=[];for(let a of e){let l=this.#t.getUploadAsset(a);if(!l||l.status==="cancelled")continue;let c=H(l.fileName),u=l.groupId?this.#t.getUploadGroup(l.groupId)?.conflictResolution??this.#x:this.#x,d=(()=>{switch(u){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:c,size_bytes:l.totalBytesToUpload,...d}),r.push(a)}if(t.length===0)return;let s=this.#t.getUploadAsset(r[0]),o=s?.shareContext?O(s.shareContext):void 0,i=await this.#e.post("/assets/chunked/initiate",t,o);for(let a=0;a<r.length;a++){let l=r[a],c=i[a];if(!c||c.error){this.#G(l,new Error(c?.error??"Unknown batch initiation error"));continue}if(c.skipped){let C=this.#t.getUploadAsset(l);C&&(this.#t.adjustSpeedBaselineForSkippedBytes(C.totalBytesToUpload),this.#t.markUploadSuccess(l),this.#t.dirtyHistoryGroupIds.add(C.groupId??""),this.#$(),C.fileReader.close?.());continue}let u=c.result,d=this.#t.getUploadAsset(l);if(!d||d.status==="cancelled"||d.status==="paused"){(!d||d.status==="cancelled")&&(this.#U.push(u.asset_id),this.#X());continue}let m=Math.ceil(d.totalBytesToUpload/u.chunk_size),g=Array.from({length:m},()=>crypto.randomUUID());this.#s.seedToken(u.asset_id,u.token,u.token_expires_at);let p={serverAssetId:u.asset_id,chunkIds:g,chunkSize:u.chunk_size,totalChunks:m,sizeBytes:d.totalBytesToUpload};this.#t.setChunkedState(l,{assetId:p.serverAssetId,chunkIds:p.chunkIds,completedChunkIndices:[],chunkSize:p.chunkSize,totalChunks:p.totalChunks,sizeBytes:p.sizeBytes}),this.#f.set(l,p);let y=new Array(p.totalChunks).fill(0);if(this.#w.set(l,y),p.totalChunks===0){this.#J(l).catch(C=>{this.#G(l,C)});continue}this.#d.registerAsset({assetId:l,totalChunks:p.totalChunks,completedChunkIndices:[]})}}#z(){if(!this.#E)for(;this.#v<this.#l;){let e=this.#d.claimNextChunk();if(!e)break;this.#v++;let{assetId:t,chunkIndex:r}=e,s=this.#A?.generation;this.#re(t,r,s).then(o=>{this.#v--,this.#oe(t,r,o),this.#z()}).catch(o=>{if(this.#v--,M(o)){this.#z();return}this.#ie(t,r,o),this.#z()})}}async#re(e,t,r){let s;for(let o=0;o<3;o++)try{let i=this.#w.get(e);return i&&(i[t]=0,this.#q(e)),await this.#se(e,t,r)}catch(i){if(M(i))throw i;if(s=i instanceof Error?i:new Error(String(i)),this.#A?.recordError(),this.#ae(e,t,s,o),o===2)throw s;let a=this.#w.get(e);a&&(a[t]=0,this.#q(e));let l=1e3*Math.pow(2,o);await wr(l)}throw s||new Error("Unknown error during chunk upload")}async#se(e,t,r){let s=this.#t.getUploadAsset(e);if(!s)throw new U;if(s.abortController.signal.aborted)throw new U;let o=this.#f.get(e);if(!o)throw new Error(`No chunk metadata for asset ${e}`);let i=t*o.chunkSize,a=Math.min(i+o.chunkSize,s.totalBytesToUpload),l=await s.fileReader.readChunk(i,a),c=Ir(l);if(s.abortController.signal.aborted)throw new U;let u=o.chunkIds[t],d=await this.#s.getToken(o.serverAssetId,s.shareContext),m=`/uploads/chunks/${u}`,g=Date.now(),p=await this.#e.putWithToken(m,l,d,{signal:s.abortController.signal,onProgress:k=>{let E=this.#w.get(e);E&&(E[t]=k,this.#q(e))},contentType:"application/octet-stream",limiter:this.#M}),y=Date.now(),C=p.uploadCompletedAtMs??y,S=C-g;if(!p.status||p.status<200||p.status>=300)throw this.#i.error("Chunk upload returned unexpected status",{chunkIndex:t,chunkId:u,assetId:e,serverAssetId:o.serverAssetId,chunkSizeBytes:c,durationMs:S,httpStatus:p.status,statusText:p.statusText,responseBody:p.data,responseHeaders:p.headers}),new Error(`Chunk ${t} upload failed: unexpected status ${p.status}`);let we=this.#w.get(e);return we&&(we[t]=c,this.#q(e)),{durationMs:S,startedAtMs:g,completedAtMs:C,adaptiveGeneration:r}}#q(e){let t=this.#w.get(e);if(!t)return;let r=t.reduce((s,o)=>s+o,0);this.#t.updateUploadProgress(e,r)}#oe(e,t,r){if(this.#A){let o=this.#f.get(e);if(o){let i=t*o.chunkSize,l=Math.min(i+o.chunkSize,o.sizeBytes)-i;this.#A.recordSuccess(l,r.durationMs,{generation:r.adaptiveGeneration,startedAtMs:r.startedAtMs,completedAtMs:r.completedAtMs})}}this.#t.addCompletedChunkIndex(e,t),this.#d.markChunkCompleted(e,t)&&this.#J(e).catch(o=>{this.#G(e,o)})}#ie(e,t,r){this.#G(e,r)}#ae(e,t,r,s){if(!this.#n)return;let o=this.#t.getUploadAsset(e);if(!o)return;let i=this.#f.get(e);if(!i)return;let a=t*i.chunkSize,c=Math.min(a+i.chunkSize,i.sizeBytes)-a,u=r,d=typeof u.code=="string"?u.code:null,m=u.response?.status,g=typeof m=="number"?m:null,p=r.cause?r.cause instanceof Error?r.cause.message:String(r.cause):null,y=ft(r);this.#n("upload:chunk_error",{file_name:o.fileName,file_size:o.totalBytesToUpload,chunk_index:t,chunk_size:c,chunks_total:i.totalChunks,attempt:s+1,max_attempts:3,is_final_attempt:s===2,error_type:r.name,error_message:r.message,error_code:d,http_status:g,error_stack:r.stack??null,error_cause:p,project_id:o.projectId??"",had_response:y?.hadResponse??null,reused_socket:y?.reusedSocket??null,remote_address:y?.remoteAddress??null,remote_family:y?.remoteFamily??null,tls_protocol:y?.tlsProtocol??null,tls_cipher:y?.tlsCipher??null,peer_cert_issuer:y?.peerCertIssuer??null,peer_cert_subject:y?.peerCertSubject??null,tls_authorized:y?.tlsAuthorized??null})}#le(e,t,r,s){if(!this.#n||M(t))return;let o=t instanceof Error?t.message:"Unknown error",i=t,a=t instanceof Error&&t.cause?t.cause instanceof Error?t.cause.message:String(t.cause):null,l=typeof i.code=="string"?i.code:null,c=i.response?.status,u=typeof c=="number"?c:null,d=this.#f.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:r+1,max_attempts:4,is_final_attempt:s,error_type:t instanceof Error?t.name:"Unknown",error_message:o,error_code:l,http_status:u,error_stack:t instanceof Error?t.stack??null:null,error_cause:a,project_id:e.projectId??""})}async#J(e){let t=this.#t.getUploadAsset(e);if(!t)return;let r=this.#f.get(e);if(!r)return;if(t.abortController.signal.aborted)throw new U;let s=crypto.randomUUID(),o=JSON.stringify(r.chunkIds),i=new TextEncoder().encode(o),a=await this.#s.getToken(r.serverAssetId,t.shareContext),l=`/uploads/manifests/${s}`;try{await this.#e.putWithToken(l,i,a,{signal:t.abortController.signal,contentType:"application/json"})}catch(c){throw M(c)||this.#i.error("Manifest upload failed",{assetId:e,serverAssetId:r.serverAssetId,manifestId:s},c),c}if(t.abortController.signal.aborted)throw new U;try{let c=t.shareContext?O(t.shareContext):void 0;await this.#e.post(`/assets/${r.serverAssetId}/revisions/commit`,{manifest_id:s,size_bytes:r.sizeBytes,is_initial_upload:!0,client_performed_at:new Date().toISOString()},c)}catch(c){throw this.#i.error("Commit revision failed",{assetId:e,serverAssetId:r.serverAssetId,manifestId:s,sizeBytes:r.sizeBytes},c),c}this.#t.markUploadSuccess(e),this.#t.clearChunkedState(e),this.#$(),this.#F(),this.#f.delete(e),this.#w.delete(e),this.#d.removeAsset(e),await t.fileReader.close?.(),this.#ne(e),this.#L(),this.#V()}#G(e,t){let r=this.#t.getUploadAsset(e);if(!r||M(t)||r.status==="paused"||r.status==="cancelled")return;let s=r.retryCount,o=s>=3||Er(t);if(this.#le(r,t,s,o),o){let i=t instanceof Error?t.message:"Unknown error";this.#i.error("Asset upload permanently failed",{assetId:e,fileName:r.fileName,totalRetries:s,bytesUploaded:r.bytesUploaded,totalBytes:r.totalBytesToUpload,chunksCompleted:r.chunkedState?.completedChunkIndices.length??0},t),r.abortController.abort(),this.#t.markUploadFailed(e,i),this.#d.removeAsset(e),this.#f.delete(e),this.#w.delete(e),this.#$(),this.#F(),this.#ne(e),this.#L(),this.#V()}else{this.#i.warn("Asset upload failed, scheduling retry",{assetId:e,fileName:r.fileName,retryAttempt:s+1,maxRetries:3},t);let i=r.chunkedState;r.abortController.abort(),this.#d.removeAsset(e),this.#f.delete(e),this.#w.delete(e),this.#t.resetAssetForRetryQueue(e),this.#F(),this.#L();let a=2e3*Math.pow(2,s);setTimeout(()=>{if(this.#E)return;let l=this.#t.getUploadAsset(e);!l||l.status!=="queued"||this.startUpload({fileReader:l.fileReader,directoryId:l.parentId??"",projectId:l.projectId,groupId:l.groupId,assetId:e,resumeChunked:i,shareContext:l.shareContext})},a)}}#V(){this.#A&&(this.hasActiveUploads()||(this.#O=!0,this.#A.reset(),this.#O=!1))}#X(){this.#B||(this.#B=!0,queueMicrotask(()=>{this.#B=!1;let e=this.#U.splice(0);e.length!==0&&this.#e.post("/assets/cancel-uploads",{asset_ids:e}).catch(t=>{this.#i.error("Failed to batch abort uploads",{assetIds:e},t)})}))}#H(){return se(this.#t.getSerializableSnapshot().uploadAssets)}#F(){this.#P||(this.#P=!0,queueMicrotask(()=>{this.#P=!1,this.#ue()}))}#ce(){this.#Z(!0)}#ue(){this.#Z(!1)}#Z(e){if(this.#E||!this.#c&&!this.#u)return;e?this.#t.updateUploadStats():(this.#I++,this.#I%3===0&&this.#t.updateUploadStats());let t=this.#t.getDirtyDelta();if(!this.#R&&Object.keys(t.assets).length===0&&Object.keys(t.groups).length===0&&this.#t.dirtyHistoryGroupIds.size===0)return;this.#R=!1,this.#t.dirtyHistoryGroupIds.size>0&&this.#$();let s=this.#t.dirtyHistoryGroupIds.size>0?this.#pe():void 0,o=this.#b?!0:void 0,i=this.#h.size>0?[...this.#h]:void 0;this.#b=!1,this.#h.clear();let a=this.#H(),l={assets:t.assets,groups:t.groups,uploadStats:{...this.#t.uploadStats},uploadSpeedState:this.#t.uploadSpeedState,historyItems:s,removedHistoryGroupIds:i,historyCleared:o,uploadSummary:a,bandwidthLimitBps:this.#D,conflictResolution:this.#x};this.#t.clearDirtyFlags(),this.#c?.(l),this.#u?.(a)}#ee(e){let t=0,r=0,s=0;for(let o of e.assetIds){let i=this.#t.getUploadAsset(o);i&&(t+=i.totalBytesToUpload,r+=i.bytesUploaded,i.status!=="success"&&i.status!=="failed"&&i.status!=="cancelled"&&s++)}return{totalBytes:t,bytesUploaded:r,filesRemaining:s}}#Q(){let e=0,t=0,r=0,s=0;for(let o of Object.values(this.#t.uploadGroups)){e++;for(let i of o.assetIds){let a=this.#t.getUploadAsset(i);a&&(a.status==="success"||a.status==="failed"||a.status==="cancelled"||(t++,r+=a.totalBytesToUpload,s+=a.bytesUploaded))}}return{group_count:e,file_count:t,total_bytes:r,bytes_uploaded:s}}#de(){if(!(!this.#n||this.#E))for(let e of Object.values(this.#t.uploadGroups)){let t=!1,r=0,s=0,o=0,i=0,a=0,l=0,c=0,u=0,d=0,m=0;for(let y of e.assetIds){let C=this.#t.getUploadAsset(y);if(!C)continue;let S=C.totalBytesToUpload;switch(r+=S,s+=C.bytesUploaded,C.status){case"success":o++,i+=S;break;case"failed":a++,l+=S;break;case"cancelled":c++,u+=S;break;case"in-progress":d++,t=!0;break;case"queued":m++,t=!0;break;case"paused":t=!0;break}}if(!t)continue;let g=this.#_.get(e.id),p=g?Date.now()-g:0;this.#n("upload:group_progress",{group_id:e.id,file_count:e.assetIds.length,total_bytes:r,bytes_uploaded:s,duration_ms:p,project_id:e.projectId,succeeded_count:o,succeeded_bytes:i,failed_count:a,failed_bytes:l,cancelled_count:c,cancelled_bytes:u,in_progress_count:d,queued_count:m,progress:r>0?s/r:0,concurrency:this.#l,upload_speed_mbps:this.#t.uploadStats.uploadSpeedMbps})}}#te(e,t,r){if(!this.#n)return;let{totalBytes:s,bytesUploaded:o}=this.#ee(t);this.#n(r,{file_count:t.fileCount,total_bytes:s,bytes_uploaded:o,project_id:t.projectId})}#ne(e){if(!this.#n)return;let t=this.#t.getUploadAsset(e);if(!t?.groupId)return;let r=this.#t.uploadGroups[t.groupId];if(!r)return;let s=!0,o=0,i=0,a=0,l=0,c=0,u=0,d=0;for(let p of r.assetIds){let y=this.#t.getUploadAsset(p);if(!y)continue;let C=y.totalBytesToUpload;if(d+=C,y.status==="success")o++,i+=C;else if(y.status==="failed")a++,l+=C;else if(y.status==="cancelled")c++,u+=C;else{s=!1;break}}if(!s)return;let m=this.#_.get(r.id),g=m?Date.now()-m:0;this.#n("upload:group_completed",{file_count:r.assetIds.length,total_bytes:d,duration_ms:g,project_id:r.projectId,succeeded_count:o,succeeded_bytes:i,failed_count:a,failed_bytes:l,cancelled_count:c,cancelled_bytes:u}),this.#_.delete(r.id)}#pe(){let e={};for(let t of this.#t.dirtyHistoryGroupIds){let r=this.#t.buildHistoryItem(t);r&&(e[t]=r)}return e}#$(){if(!this.#o)return;let e={};for(let t of this.#t.dirtyHistoryGroupIds){let r=this.#t.buildHistoryItem(t);if(r){e[t]=r;let s=this.#C.findIndex(o=>o.groupId===t);s>=0?this.#C[s]=r:this.#C.unshift(r)}}Object.keys(e).length>0&&this.#o.merge(e)}};var Pr={keep_both:"Keep Both",replace:"Replace",skip:"Skip"};var Ba=new Set(["success","all-failed","some-failed","cancelled"]),Ma=new Set(["all-failed","some-failed"]),Na=new Set(["queued","in-progress"]),za=new Set(["queued","creating-folders","in-progress"]),Ga=new Set(["queued","in-progress"]),$a=new Set(["queued","in-progress","paused"]);var ue=class{#e=65536;#s=0;async*createIterator(e,t,r){let s=0,o=Math.max(65536,Math.min(e.byteLength,this.#e)),i=this.#s;for(;s<e.byteLength;){if(r?.aborted)return;let a=t?t.getLimit():null,l=a!==null&&a>0;if(l){let p=Math.round(a*50/1e3);o=Math.max(65536,Math.min(e.byteLength,p))}let c=Math.min(s+o,e.byteLength),u=e.subarray(s,c),d=u.byteLength;if(l&&(await t.acquire(d),r?.aborted))return;let m=performance.now();yield u;let g=performance.now()-m;if(s=c,!l){if(g>=.5){let p=d/g*1e3;i=i===0?p:i*(1-.3)+p*.3}else i===0&&(o=Math.min(e.byteLength,o*2));if(i>0){let p=Math.round(i*50/1e3);o=Math.max(65536,Math.min(e.byteLength,p))}}this.#e=o,this.#s=i}}};var x=class{#e;#s;#t;#o;#r=new ue;#n=new Set;constructor(e){this.#e=Zt.create({baseURL:e.apiUrl}),this.#s=Zt.create({baseURL:e.edgeWorkerUrl}),this.#t=e.apiKey,this.#o=e.sessionId}get skippedAssetIds(){return this.#n}async post(e,t,r){let s=await this.#e.post(e,t,{headers:{Authorization:`Bearer ${this.#t}`,"X-Aspect-Session-Id":this.#o,"Content-Type":"application/json",...r}});return this.#c(e,t,s.data),s.data}async get(e,t){return(await this.#e.get(e,{headers:{Authorization:`Bearer ${this.#t}`,"X-Aspect-Session-Id":this.#o,...t}})).data}async delete(e,t){await this.#e.delete(e,{headers:{Authorization:`Bearer ${this.#t}`,"X-Aspect-Session-Id":this.#o,...t}})}async putWithToken(e,t,r,s){let o=await this.#i(t),i=this.#r.createIterator(o,s.limiter??null,s.signal),a=Rr.from(i,{highWaterMark:1}),l;try{l=await this.#s.put(e,a,{timeout:0,signal:s.signal,headers:{"Content-Type":s.contentType??"","Content-Length":o.byteLength.toString(),Authorization:`Bearer ${r}`},transformRequest:[c=>c],maxRedirects:0,onUploadProgress:c=>s.onProgress?.(c.loaded)})}catch(c){throw ht(c,mt(c)),c}return{status:l.status,statusText:l.statusText,headers:Object.fromEntries(Object.entries(l.headers)),data:l.data,raw:l}}async#i(e){if(e instanceof Uint8Array)return e;let t=await e.arrayBuffer();return new Uint8Array(t)}#c(e,t,r){if(e!=="/assets/chunked/initiate"||!Array.isArray(t)||!Array.isArray(r))return;let s=t;r.forEach((i,a)=>{let l=s[a];i.skipped===!0&&typeof l?.id=="string"&&this.#n.add(l.id)})}};import pe from"node:path";import D from"node:path";function b(n){let e=n.replace(/\\/g,"/");if(e.split("/").some(o=>o===".."))throw new Error(`Remote path cannot contain parent directory segments: ${n}`);let s=D.posix.normalize(e).replace(/^\/+/,"");if(s===""||s===".")throw new Error(`Remote path must resolve to a file path: ${n}`);return s}function Le(n){let e=new Map;for(let o of n){let i=b(o.targetPath??o.path);e.set(i,(e.get(i)??0)+1)}let t=new Set,r=[],s=[];for(let o of n){let i=b(o.path),a=b(o.targetPath??o.path),l=de(a),c=St(l,t),u=(e.get(a)??0)>1,d=c!==i;t.add(c),r.push({...o,targetPath:c,requiresIdentityDownload:o.requiresIdentityDownload===!0||u}),(d||u)&&s.push({sourcePath:o.path,targetPath:c,reason:u||c!==l?"duplicate":"sanitized"})}return{files:r,changes:s}}function A(n){return b(n.targetPath??n.path)}function Ue(n,e){let t=A(n);return{relativePath:t,absolutePath:D.join(e,t),fileName:D.posix.basename(t),size:n.size}}function de(n){return n.split("/").map(t=>H(t)).join("/")}function St(n,e){if(!e.has(n))return n;let t=D.posix.dirname(n),r=D.posix.basename(n),s=D.posix.extname(r),o=s.length>0?r.slice(0,-s.length):r,i=2;for(;;){let a=`${o} (${i})${s}`,l=t==="."?a:`${t}/${a}`;if(!e.has(l))return l;i+=1}}function Ct(n,e){if(!e.has(n))return n;let t=D.posix.dirname(n),r=D.posix.basename(n),s=2;for(;;){let o=`${r} ${s}`,i=t==="."?o:`${t}/${o}`;if(!e.has(i))return i;s+=1}}var en=500,Tr=8,xe=class{#e;#s;#t=new Map;constructor(e){this.#e=e.rootDirectoryId,this.#s=e.httpClient}async ensureDirectories(e){await this.loadExistingDirectories();let t=this.#o(e);for(let r of t){if(this.#t.has(r))continue;let s=pe.posix.dirname(r),o=pe.posix.basename(r),i=s==="."?this.#e:this.#t.get(s);if(!i)throw new Error(`Parent directory ID not found for path: ${r}`);let a=await this.#a(i,o);if(a.name!==o)throw new Error(`Server created renamed directory "${a.name}" for planned path "${r}". Refusing to map uploads to an unexpected target path.`);this.#t.set(r,a.id)}return e.map(r=>({file:r,directoryId:this.getDirectoryIdForFile(r.relativePath)}))}async loadExistingDirectories(){let e=await this.#r(this.#e);this.#t.clear(),this.#c(e,"")}getDirectoryIdForFile(e){let t=b(e),r=pe.posix.dirname(t);if(r===".")return this.#e;let s=this.#t.get(r);if(!s)throw new Error(`Directory ID not found for path: ${r}`);return s}getExistingDirectoryIdForFile(e){let t=b(e),r=pe.posix.dirname(t);return r==="."?this.#e:this.#t.get(r)??null}async checkAssetsExistence(e,t=!0){if(e.length===0)return[];let r=[];for(let s=0;s<e.length;s+=en){let o=e.slice(s,s+en),i=await this.#s.post("/assets/check-exists-and-uploaded",{items:o,delete_if_not_exist:t});r.push(...i.items)}return r}async listFilesInSubtree(e={}){let t=[{id:this.#e,relativePath:""}],r=[],s=0;for(;s<t.length;){let o=t.slice(s,s+Tr),i=await Promise.all(o.map(a=>this.#n(a)));s+=o.length;for(let a of i)t.push(...a.directories),r.push(...a.files);e.onProgress?.({scannedDirectoryCount:s,queuedDirectoryCount:t.length,fileCount:r.length})}return r}#o(e){let t=new Set;for(let r of e){let s=b(r.relativePath),o=pe.posix.dirname(s);if(o===".")continue;let i=o.split("/");for(let a=0;a<i.length;a++)t.add(i.slice(0,a+1).join("/"))}return Array.from(t).sort((r,s)=>r.split("/").length-s.split("/").length)}async#r(e){return this.#s.get(`/directories/${e}/tree`)}async#n(e){let[t,r]=await Promise.all([this.#s.post("/fs/list/directories",{parent_id:e.id}),this.#s.post("/fs/list/assets",{parent_id:e.id})]);return{directories:t.map(s=>({id:s.id,relativePath:this.#i(e.relativePath,s.name)})),files:r.map(s=>({assetId:s.id,relativePath:this.#i(e.relativePath,s.name),sizeBytes:s.size_bytes,isUploaded:s.is_uploaded??!0,uploadStateKnown:typeof s.is_uploaded=="boolean"}))}}#i(e,t){let r=e===""?t:`${e}/${t}`;return b(r)}#c(e,t){let r=t===""?"":t==="."?e.name:`${t}/${e.name}`;r!==""&&this.#t.set(r,e.id);for(let s of e.children){let o=t===""?".":r;this.#c(s,o)}}async#a(e,t){return this.#s.post(`/directories/${e}/directories`,{name:t,auto_rename:"numeric"})}};import{PostHog as kr}from"posthog-node";var N=null,De="",bt={};function tn(n){N||n.config.analytics.disabled||!n.config.analytics.posthogKey||(De=n.user.id,bt={service:"data-sync",package_version:n.packageVersion,platform:process.platform,arch:process.arch,node_version:process.version,max_concurrent:n.config.maxConcurrent,batch_mode:n.config.batchSizeBytes!==void 0,batch_size_bytes:n.config.batchSizeBytes??null,source_kind:n.config.source.kind,...n.config.source.kind==="rclone"?{rclone_transfers:n.config.source.rcloneOptions.transfers,rclone_multi_thread_streams:n.config.source.rcloneOptions.multiThreadStreams}:{}},N=new kr(n.config.analytics.posthogKey,{host:n.config.analytics.posthogHost}),N.identify({distinctId:De,properties:{user_id:n.user.id,email:n.user.email,first_name:n.user.first_name,last_name:n.user.last_name,utm_source_latest:null,utm_medium_latest:null,utm_campaign_latest:null,utm_content_latest:null}}))}function nn(n,e){N&&N.capture({distinctId:De,event:n,properties:{...bt,...e}})}async function rn(){let n=N;if(vr(),!!n)try{await n.flush()}catch{}}function vr(){N=null,De="",bt={}}import{spawn as Oe}from"child_process";import*as Be from"fs";import*as K from"path";var Lr=2e3,w=class extends Error{constructor(t,r){super(t);this.stderr=r;this.name="RcloneError"}stderr};function Ur(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 xr(n){let e=["lsjson",n.remoteSource,"--recursive","--fast-list"];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function Dr(n){let e=["backend","query",`${n.remote}:`,n.query];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function _r(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 Or(n){let e=["backend","copyid",`${n.remote}:`,n.fileId,n.localTargetPath,"--progress","--stats","1s","--stats-one-line","-v"];return n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function W(n,e){let t=e.trim(),r={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*(r[t]||1)}function sn(n){let e=0,t=n.match(/(\d+)h/),r=n.match(/(\d+)m/),s=n.match(/(\d+)s/);return t&&(e+=parseInt(t[1],10)*3600),r&&(e+=parseInt(r[1],10)*60),s&&(e+=parseInt(s[1],10)),e}function Br(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+(.+)$/,r=e.match(t);if(r){let l=r[8].trim(),c={bytesTransferred:W(parseFloat(r[1]),r[2]),totalBytes:W(parseFloat(r[3]),r[4]),percentComplete:parseFloat(r[5]),speed:W(parseFloat(r[6]),r[7]),eta:l==="-"?0:sn(l)};return{...c,currentFile:c}}let s=e.match(/Transferred:\s+([\d.]+)\s*([A-Za-z]+)\s*\/\s*([\d.]+)\s*([A-Za-z]+),\s*([\d.]+)%/);if(!s)return null;let o=e.match(/([\d.]+)\s*([A-Za-z]+)\/s/),i=e.match(/ETA\s+([^\s]+)$/),a={bytesTransferred:W(parseFloat(s[1]),s[2]),totalBytes:W(parseFloat(s[3]),s[4]),percentComplete:parseFloat(s[5]),speed:o?W(parseFloat(o[1]),o[2]):0,eta:i&&i[1]!=="-"?sn(i[1]):0};return{...a,aggregate:a}}function At(n){return new Promise((e,t)=>{let r=Oe("rclone",n.args,{stdio:["ignore","pipe","pipe"]}),s="",o=0,i,a,l=c=>{for(let u of c.split(`
|
|
2
|
+
import{Command as Yo}from"commander";import ir from"node:path";import{readFileSync as Vo,realpathSync as or}from"node:fs";import{fileURLToPath as Qo}from"node:url";import ge from"node:fs/promises";import xt from"node:path";import ur from"fs/promises";import dr from"path";function qt(n,e){let t=new Map;for(let c of n){let u=dr.dirname(c.targetPath??c.path);t.has(u)||t.set(u,[]),t.get(u).push(c)}let r=new Map;for(let[c,u]of t.entries()){let d=u.reduce((m,g)=>m+g.size,0);r.set(c,d)}let s=Array.from(t.keys()).sort(),o=[],i=[],a=0,l=1;for(let c of s){let u=t.get(c),d=r.get(c);if(d>e){if(i.length>0&&(o.push({batchNumber:l++,files:i,totalSize:a}),i=[],a=0),u.length===1)o.push({batchNumber:l++,files:u,totalSize:d});else for(let m of u)a+m.size>e&&i.length>0&&(o.push({batchNumber:l++,files:i,totalSize:a}),i=[],a=0),i.push(m),a+=m.size;continue}a+d>e&&i.length>0&&(o.push({batchNumber:l++,files:i,totalSize:a}),i=[],a=0),i.push(...u),a+=d}return i.length>0&&o.push({batchNumber:l++,files:i,totalSize:a}),o}async function Jt(n){try{await ur.unlink(n)}catch(e){if(e.code!=="ENOENT")throw e}}import{Readable as Rr}from"node:stream";import Zt from"axios";function re(n,e){if(e.length===0)return n.finalizedStatus?n.finalizedStatus:n.isCreatingFolders?"creating-folders":"queued";if(n.isCreatingFolders)return"creating-folders";let t={queued:0,paused:0,inProgress:0,success:0,failed:0,cancelled:0};for(let s of e)switch(s.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 r=e.length;return t.failed===r?"all-failed":t.failed>0?"some-failed":t.success===r?"success":t.paused>0&&t.queued===0&&t.inProgress===0?"paused":t.queued>0||t.inProgress>0?t.queued+t.paused===r?"queued":"in-progress":"cancelled"}function at(n,e){let t=re(n,e);return t==="creating-folders"||t==="in-progress"||t==="queued"||t==="paused"?"cancelled":t}function lt(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 ct(n){for(let e of Object.values(n))if(e.status==="queued"||e.status==="in-progress"||e.status==="paused")return!0;return!1}function se(n){let t=Object.values(n).reduce((r,s)=>{switch(s.status!=="failed"&&s.status!=="cancelled"&&(r.totalBytesToUpload+=s.totalBytesToUpload,r.totalBytesUploaded+=s.bytesUploaded),r.totalAssetCount+=1,s.status){case"queued":r.queuedAssetCount+=1;break;case"paused":r.pausedAssetCount+=1;break;case"in-progress":r.inProgressAssetCount+=1;break;case"success":r.successAssetCount+=1;break;case"failed":r.failedAssetCount+=1;break;case"cancelled":r.cancelledAssetCount+=1;break}return r},{totalBytesToUpload:0,totalBytesUploaded:0,totalAssetCount:0,queuedAssetCount:0,pausedAssetCount:0,inProgressAssetCount:0,successAssetCount:0,failedAssetCount:0,cancelledAssetCount:0,hasActiveUploads:!1,progress:0});return t.hasActiveUploads=t.totalAssetCount-t.successAssetCount-t.failedAssetCount-t.cancelledAssetCount>0,t.progress=t.hasActiveUploads?t.totalBytesUploaded/t.totalBytesToUpload:0,t}function Pe(n,e){if(e.length===0)return null;let t=e.reduce((r,s)=>(s.status!=="failed"&&s.status!=="cancelled"&&(r.totalBytes+=s.totalBytesToUpload,r.uploadedBytes+=s.bytesUploaded),s.status==="success"?r.filesSucceeded++:s.status==="failed"&&r.filesFailed++,(s.status==="success"||s.status==="failed"||s.status==="cancelled")&&r.filesCompleted++,r),{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 ut(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 dt(n){return Object.values(n).some(e=>e.status==="paused")}import hi from"axios";var oe=class{#e;#s;#t;#o;#r;#n=0;#i=0;#c=0;#a=0;#u=0;#d=0;constructor(e){this.#e=e?.alphaFast??.1,this.#s=e?.alphaMax??.5,this.#t=e?.consecutiveForBoost??3,this.#o=e?.minSamples??3,this.#r=e?.maxGapSeconds??2}sample(e){let t=Date.now();if(this.#a===0){this.#a=t,this.#u=e;return}let s=(t-this.#a)/1e3,o=e-this.#u;if(s<=0||o<0)return;if(s>this.#r){this.#a=t,this.#u=e;return}let i=o/s;if(this.#d===0)this.#n=i;else{let l=i-this.#n>=0?1:-1;this.#c!==0&&l===this.#c?this.#i++:this.#i=0,this.#c=l;let c=Math.min(1,this.#i/this.#t),u=this.#e+(this.#s-this.#e)*c;this.#n=u*i+(1-u)*this.#n}this.#a=t,this.#u=e,this.#d++}etaSeconds(e){return!this.isWarmedUp||this.#n<=0?0:e/this.#n}adjustTotalBytes(e){this.#u+=e}reset(){this.#n=0,this.#i=0,this.#c=0,this.#a=0,this.#u=0,this.#d=0}serialize(){return{displaySpeedBps:this.#n,lastSampleTimestamp:this.#a,lastSampleTotalBytes:this.#u,sampleCount:this.#d}}get speedBps(){return this.#n}get speedMbps(){return this.#n*8/1e6}get isWarmedUp(){return this.#d>=this.#o}};function O(n){let e={"X-Aspect-Share-Id":n.shareId};return n.shareAuthentication&&(e["X-Aspect-Share-Authentication"]=n.shareAuthentication),e}var ie=class{#e;#s;#t;#o;#r;#n;#i;#c;#a;#u;#d;#l;#R;#g;#I;#P;#C;#h;#b;#E;#T;#m;#y;#k;#p;#v;#f;#w;#U;#B;#D;#M;constructor(e){this.#s=e?.minConcurrency??1,this.#t=e?.maxConcurrency??8,this.#e=this.#j(e?.initialConcurrency??this.#s),this.#o=e?.errorThreshold??1,this.#r=(e?.cooldownSeconds??10)*1e3,this.#n=e?.plateauThreshold??.05,this.#i=Math.max(this.#t,Math.floor(e?.sampleWindowSize??64)),this.#c=Math.max(2,Math.floor(e?.minSamples??4)),this.#a=Math.max(1.1,e?.increaseFactor??1.5),this.#u=e?.onChange,this.#d=e?.now??Date.now,this.#l=this.#e,this.#R=0,this.#g=[],this.#I=0,this.#P=0,this.#C=-1,this.#h=0,this.#b=void 0,this.#E=0,this.#T=0,this.#m=0,this.#y=this.#l,this.#k=0,this.#p=1/0,this.#v=0,this.#f=6e4,this.#w=0,this.#U=1/0,this.#B=0,this.#D=0,this.#M=0}recordSuccess(e,t,r){if(e<=0)return;if(r?.generation!==void 0){if(r.generation!==this.#R){r.generation===this.#C&&this.#h>0&&(this.#h--,this.#h===0&&(this.#b=r.completedAtMs??this.#d()));return}if(this.#h>0||this.#b!==void 0&&r.startedAtMs!==void 0&&r.startedAtMs<this.#b)return}else if(this.#P>0){this.#P--;return}let s=r?.completedAtMs??this.#d();for(this.#g.push({bytes:e,completedAtMs:s,startedAtMs:r?.startedAtMs,durationMs:t!==void 0&&t>0?t:void 0});this.#g.length>this.#i;)this.#g.shift();this.#I++,this.#E=0;let o=this.#z();this.#D=o.throughputBps,this.#M=o.latencyMsPerMB,this.#x(o)}recordError(){if(this.#E++,this.#E<this.#o)return;let e=this.#l;e===this.#w&&(this.#U=Math.min(this.#U,e),this.#B=this.#d()+3e4),this.#w=e;let t=this.#j(Math.floor(e/2));this.#T=this.#d()+this.#r,this.#E=0,e<=this.#y&&(this.#y=t,this.#k=0),e>t&&(this.#p=Math.min(this.#p,e),this.#W()),this.#A(t)}get concurrency(){return this.#l}get generation(){return this.#R}get speedBps(){return this.#D}get latencyMsPerMB(){return this.#M}reset(){this.#l=this.#e,this.#R++,this.#g=[],this.#I=0,this.#P=0,this.#C=-1,this.#h=0,this.#b=void 0,this.#E=0,this.#T=0,this.#m=0,this.#y=this.#l,this.#k=0,this.#p=1/0,this.#v=0,this.#f=6e4,this.#w=0,this.#U=1/0,this.#B=0,this.#D=0,this.#M=0,this.#u?.(this.#l)}#x(e){if(this.#g.length<this.#K()||this.#I<this.#K()||e.throughputBps<=0)return;let t=this.#d();if(t<this.#T)return;if(e.averageDurationMs>=2e4&&this.#l>=4){this.#y=Math.max(this.#s,Math.floor(this.#l/2)),this.#k=0,this.#A(this.#y);return}if(this.#k===0){this.#N(e.throughputBps),this.#_(e);return}let r=(e.throughputBps-this.#k)/this.#k;if(r>=this.#n){this.#N(e.throughputBps),this.#_(e);return}if(this.#l>this.#y){let s=r<=-.08,o=r<this.#n;(s||o)&&(this.#p=Math.min(this.#p,this.#l),this.#W(),this.#A(this.#y));return}if(this.#l<this.#y){this.#_(e);return}this.#l===this.#y&&(this.#k=Math.max(this.#k,e.throughputBps),t>=this.#m&&this.#_(e))}#_(e){let t=this.#Y();if(this.#l>=t){this.#I=0;return}if(e.averageDurationMs>=5e3&&this.#l>=4&&this.#k>0){this.#I=0;return}if(this.#L()){let s=this.#d();if(this.#v===0){this.#v=s+this.#f,this.#m=this.#v,this.#I=0;return}if(s<this.#v){this.#I=0;return}}let r=this.#S(t);if(r===this.#l){this.#I=0;return}this.#A(r)}#N(e){this.#y=this.#l,this.#k=e,this.#p<=this.#l&&(this.#p=1/0),this.#v=0,this.#f=6e4,this.#m=0}#S(e){if(this.#p<1/0){let s=Math.floor((this.#l+this.#p)/2);return s>this.#l&&s<this.#p?Math.min(e,s):Math.min(e,this.#l+1)}if(this.#l<4)return Math.min(e,this.#l+1);let t=Math.ceil(this.#l*this.#a),r=this.#l+2;return Math.min(e,Math.max(r,t))}#A(e){let t=this.#l,r=this.#R,s=this.#j(e);s!==t&&(this.#O(),this.#l=s,this.#R++,this.#C=r,this.#h=Math.max(0,t-1),this.#b=this.#h===0?this.#d():void 0,this.#P=Math.max(0,t-1),this.#u?.(this.#l))}#O(){this.#g=[],this.#I=0,this.#P=0}#L(){return this.#p<1/0&&this.#l===this.#y&&this.#p<=this.#y+1}#W(){let e=this.#p<1/0&&this.#p<=this.#y+1,t=e?this.#f:1e4;this.#m=this.#d()+t,e&&(this.#v=this.#m,this.#f=Math.min(this.#f*2,3e5))}#K(){return Math.max(this.#c,this.#l)}#Y(){return this.#U<1/0&&this.#d()>=this.#B&&(this.#U=1/0,this.#B=0),Math.max(this.#s,Math.min(this.#t,this.#U-1))}#j(e){return Math.max(this.#s,Math.min(this.#t,e))}#z(){let e=0,t=0,r=0,s=0;for(let l of this.#g)e+=l.bytes,l.durationMs!==void 0&&(t+=l.durationMs,r++,s+=l.durationMs/(l.bytes/(1024*1024)));if(r>0&&t>0)return{throughputBps:e/(t/1e3)*this.#l,latencyMsPerMB:s/r,averageDurationMs:t/r,durationSampleCount:r};if(this.#g.length<2)return{throughputBps:0,latencyMsPerMB:0,averageDurationMs:0,durationSampleCount:0};let o=this.#g[0],a=this.#g[this.#g.length-1].completedAtMs-o.completedAtMs;return{throughputBps:a>0?e/a*1e3:0,latencyMsPerMB:0,averageDurationMs:a>0?a/Math.max(1,this.#g.length-1):0,durationSampleCount:0}}};var j=class{#e;#s;#t;#o;#r;#n;#i;#c;constructor(e,t){this.#n=t?.now??(()=>Date.now()),this.#i=t?.setTimer??((s,o)=>setTimeout(s,o)),this.#c=t?.clearTimer??(s=>clearTimeout(s));let r=e===0?null:e;this.#e=r,this.#s=r??0,this.#t=this.#n(),this.#o=[],this.#r=null}setLimit(e){let t=e===0?null:e;if(t===null){this.#e=null,this.#s=0,this.#R();let s=this.#o.splice(0);for(let o of s)o.resolve();return}let r=this.#e;this.#e=t,r===null?(this.#s=t,this.#t=this.#n()):(this.#a(),this.#s=Math.min(this.#s,t)),this.#l()}getLimit(){return this.#e}acquire(e){if(this.#e!==null){if(this.#a(),this.#o.length===0&&this.#s>=e){this.#s-=e;return}return this.#u(e)}}#a(){let e=this.#n(),t=(e-this.#t)/1e3;if(t<=0)return;let r=this.#e,s=t*r,o=this.#o.length>0?Math.max(r,this.#o[0].bytes):r;this.#s=Math.min(this.#s+s,o),this.#t=e}#u(e){return new Promise(t=>{this.#o.push({bytes:e,resolve:t}),this.#r===null&&this.#d()})}#d(){if(this.#o.length===0||this.#e===null){this.#r=null;return}let t=this.#o[0].bytes-this.#s,r=t>0?Math.ceil(t/this.#e*1e3):0;if(r<=0){this.#r=null,this.#l();return}this.#r=this.#i(()=>{this.#r=null,this.#a(),this.#l()},r)}#l(){for(;this.#o.length>0;){if(this.#e===null){let t=this.#o.splice(0);for(let r of t)r.resolve();return}this.#a();let e=this.#o[0];if(this.#s>=e.bytes)this.#s-=e.bytes,this.#o.shift(),e.resolve();else{this.#d();return}}}#R(){this.#r!==null&&(this.#c(this.#r),this.#r=null)}};function Yt(n){let e=`[${n}]`;return{info:(...t)=>console.info(e,...t),warn:(...t)=>console.warn(e,...t),error:(...t)=>console.error(e,...t)}}var pt=Yt("transfer");var Qt="transportDiagnostics";function B(n){return typeof n=="string"&&n.length>0?n:null}function Vt(n){if(n===null||typeof n!="object")return null;let e=n,t=B(e.O),r=B(e.CN),s=[t,r].filter(o=>o!==null);return s.length>0?s.join(" / "):null}function pr(n){if(!n)return{};let e={remoteAddress:B(n.remoteAddress),remoteFamily:B(n.remoteFamily),tlsAuthorized:typeof n.authorized=="boolean"?n.authorized:null};if(typeof n.getProtocol=="function"&&(e.tlsProtocol=B(n.getProtocol())),typeof n.getCipher=="function"){let t=n.getCipher();t!==null&&typeof t=="object"&&(e.tlsCipher=B(t.name))}if(typeof n.getPeerCertificate=="function"){let t=n.getPeerCertificate();if(t!==null&&typeof t=="object"){let r=t;e.peerCertIssuer=Vt(r.issuer),e.peerCertSubject=Vt(r.subject)}}return e}function mt(n){let e={errorCode:null,hadResponse:!1,reusedSocket:null,remoteAddress:null,remoteFamily:null,tlsProtocol:null,tlsCipher:null,peerCertIssuer:null,peerCertSubject:null,tlsAuthorized:null};if(n===null||typeof n!="object")return e;let t=n;e.errorCode=B(t.code),e.hadResponse=t.response!=null;let r=t.request;if(r){e.reusedSocket=typeof r.reusedSocket=="boolean"?r.reusedSocket:null;let s=r.socket??r.res?.socket??null;Object.assign(e,pr(s))}return e}function ht(n,e){n===null||typeof n!="object"||(n[Qt]=e)}function ft(n){if(n===null||typeof n!="object")return null;let e=n[Qt];return e??null}var gt=n=>!Number.isFinite(n)||n<=0?"Calculating...":n<1?`${(n*1e3).toFixed(0)} Kbps`:`${n.toFixed(1)} Mbps`,yt=n=>{if(!Number.isFinite(n)||n<=0)return"Calculating...";let e=Math.floor(n/3600),t=Math.floor(n%3600/60),r=Math.floor(n%60);return e>0?`${e}h ${t}m left`:t>0?`${t}m ${r}s left`:`${r}s left`};var Re=class{uploadAssets={};uploadGroups={};#e=new oe;get uploadSpeedState(){return this.#e.serialize()}uploadStats={uploadSpeedMbps:0,timeRemainingSeconds:0,formattedSpeed:"Calculating...",formattedTime:"Calculating..."};dirtyAssetIds=new Set;dirtyGroupIds=new Set;dirtyHistoryGroupIds=new Set;#s(e){e!==0&&this.#e.adjustTotalBytes(-e)}adjustSpeedBaselineForSkippedBytes(e){e!==0&&this.#e.adjustTotalBytes(e)}#t(){Object.values(this.uploadAssets).some(t=>t.status==="queued"||t.status==="in-progress")||this.#e.reset()}#o(e){this.dirtyAssetIds.add(e)}#r(e){this.dirtyGroupIds.add(e)}addUploadAsset({assetId:e,fileReader:t,abortController:r,parentId:s,projectId:o,groupId:i,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:s,projectId:o,groupId:i,retryCount:0,chunkSize:a??0,fileReader:t,abortController:r,shareContext:l},this.#o(e)}updateUploadProgress(e,t){let r=this.uploadAssets[e];if(!r||r.status==="paused"||r.status==="cancelled"||r.status==="success"||r.status==="failed")return;let s=t>0&&r.status==="queued"?"in-progress":r.status,o=Math.min(t,r.totalBytesToUpload);r.bytesUploaded=o,r.status=s,this.#o(e)}markUploadInProgress(e){let t=this.uploadAssets[e];t&&(t.status="in-progress",this.#o(e))}markUploadSuccess(e){let t=this.uploadAssets[e];t&&(t.status="success",t.bytesUploaded=t.totalBytesToUpload,this.#o(e),this.#t(),this.cleanupOnCompletion(e))}markUploadFailed(e,t){let r=this.uploadAssets[e];if(!r)return;let s=r.bytesUploaded;r.status="failed",r.errorMessage=t,r.bytesUploaded=0,this.#o(e),this.#s(s),this.#t(),this.cleanupOnCompletion(e)}removeUploadAsset(e){let r=this.uploadAssets[e]?.bytesUploaded??0;delete this.uploadAssets[e],this.#o(e),this.#s(r),this.#t()}clearAllUploads(){this.uploadAssets={},this.#e.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.#e.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.#o(e))}resetAssetForRetrying(e){let t=this.uploadAssets[e];t&&(t.status="queued",t.bytesUploaded=0,t.retryCount=0,this.#o(e))}pauseUpload(e){let t=this.uploadAssets[e];if(!t||t.status!=="queued"&&t.status!=="in-progress")return;let r=0;if(t.chunkedState){let{completedChunkIndices:o,chunkSize:i}=t.chunkedState;for(let a of o){let l=a*i,c=Math.min(l+i,t.totalBytesToUpload);r+=c-l}}let s=t.bytesUploaded-r;t.status="paused",t.bytesUploaded=r,this.#o(e),this.#s(s),this.#t(),t.abortController.abort()}unpauseUpload(e){let t=this.uploadAssets[e];t&&t.status==="paused"&&(t.status="queued",this.#o(e))}pauseUploadGroup(e){let t=this.uploadGroups[e];if(t&&!t.isCreatingFolders){t.isPaused=!0,this.#r(e);for(let r of t.assetIds)this.pauseUpload(r)}}unpauseUploadGroup(e){let t=this.uploadGroups[e];t&&(t.isPaused=!1,this.#r(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 r=t.bytesUploaded;t.status="cancelled",this.#o(e),this.#s(r),this.#t(),this.cleanupOnCompletion(e)}setChunkedState(e,t){let r=this.uploadAssets[e];r&&(r.chunkedState=t,this.#o(e))}addCompletedChunkIndex(e,t){let r=this.uploadAssets[e];!r||!r.chunkedState||(r.chunkedState={...r.chunkedState,completedChunkIndices:[...r.chunkedState.completedChunkIndices,t]},this.#o(e))}clearChunkedState(e){let t=this.uploadAssets[e];t&&(t.chunkedState=void 0,this.#o(e))}hasGroupsCreatingFolders(){return Object.values(this.uploadGroups).some(e=>e.isCreatingFolders===!0)}areAllUploadsPaused(){return ut(this.uploadAssets)}hasPausedUploads(){return dt(this.uploadAssets)}getUploadAsset(e){return this.uploadAssets[e]}getSerializableAsset(e){let t=this.uploadAssets[e];if(t)return this.#n(t)}getUploadSummary(){return se(this.#c())}getAllUploadAssetsSortedByRecent(){return Object.values(this.uploadAssets).map(e=>this.#n(e)).sort((e,t)=>t.i-e.i)}getGroupAssets(e){let t=this.uploadGroups[e];return!t||!t.assetIds?[]:t.assetIds.map(r=>this.uploadAssets[r]).filter(Boolean).map(r=>this.#n(r))}getGroupAssetsInternal(e){let t=this.uploadGroups[e];return!t||!t.assetIds?[]:t.assetIds.map(r=>this.uploadAssets[r]).filter(Boolean)}addUploadGroup(e){let t=crypto.randomUUID();return this.uploadGroups[t]={...e,id:t,fileReaders:new Map},this.#r(t),t}updateUploadGroup(e,t){let r=this.uploadGroups[e];r&&(Object.assign(r,t),this.#r(e))}addAssetToGroup(e,t){let r=this.uploadGroups[e];r&&(r.assetIds.push(t),this.#r(e))}finalizeEmptyGroup({groupId:e,status:t,errorMessage:r}){let s=this.uploadGroups[e];s&&(s.assetIds.length>0||s.finalizedStatus||(s.finalizedStatus=t,s.errorMessage=r,s.isCreatingFolders=!1,s.completedAt=new Date().toISOString(),this.#r(e),this.dirtyHistoryGroupIds.add(e)))}removeUploadGroup(e){let t=this.uploadGroups[e];if(t)for(let r of t.assetIds)delete this.uploadAssets[r],this.#o(r);delete this.uploadGroups[e],this.#r(e)}getUploadGroup(e){let t=this.uploadGroups[e];if(t)return this.#i(t)}getAllUploadGroups(){return Object.values(this.uploadGroups).map(e=>this.#i(e)).sort((e,t)=>t.createdAt.localeCompare(e.createdAt))}getUploadGroupProgress(e){let t=this.uploadGroups[e];if(!t)return null;let r=this.getGroupAssets(e);return Pe(this.#i(t),r)}getUploadGroupStatus(e){let t=this.uploadGroups[e];if(!t)return null;let r=this.getGroupAssets(e);return re(this.#i(t),r)}getAssetsByParentId(e){return Object.values(this.uploadAssets).filter(t=>t.parentId===e).map(t=>this.#n(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.#i(e))}cleanupOnCompletion(e){let t=this.uploadAssets[e];if(!t)return;let r=t.groupId;if(r){let o=this.uploadGroups[r];if(o){let i=this.getGroupAssets(r),a=this.#i(o);this.dirtyHistoryGroupIds.add(r),!i.some(c=>c.status==="queued"||c.status==="in-progress")&&!o.completedAt&&(o.completedAt=new Date().toISOString(),this.#r(r))}}let s=this.getUploadSummary();if(s.cancelledAssetCount+s.failedAssetCount+s.successAssetCount===s.totalAssetCount)for(let o of Object.keys(this.uploadAssets)){let i=this.uploadAssets[o];i&&(i.bytesUploaded=0,this.#o(o))}}updateUploadStats(){let e=this.getUploadSummary(),t=e.queuedAssetCount>0||e.inProgressAssetCount>0;t&&this.#e.sample(e.totalBytesUploaded);let r=this.#e.isWarmedUp?this.#e.speedMbps:0,s=t&&this.#e.isWarmedUp?this.#e.etaSeconds(e.totalBytesToUpload-e.totalBytesUploaded):0;this.uploadStats={uploadSpeedMbps:r,timeRemainingSeconds:s,formattedSpeed:gt(r),formattedTime:yt(s)}}buildHistoryItem(e){let t=this.uploadGroups[e];if(!t)return null;let r=this.getGroupAssets(e),s=this.#i(t);return{groupId:t.id,name:t.name,type:t.type,fileCount:t.fileCount,folderCount:t.folderCount,topLevelFileCount:t.topLevelFileCount,topLevelFolderCount:t.topLevelFolderCount,status:at(s,r),createdAt:t.createdAt,completedAt:t.completedAt,rootDirectoryId:t.rootDirectoryId,projectId:t.projectId,errorMessage:t.errorMessage,conflictResolution:t.conflictResolution}}#n({fileReader:e,abortController:t,shareContext:r,...s}){return s}#i({fileReaders:e,...t}){return t}#c(){let e={};for(let[t,r]of Object.entries(this.uploadAssets))e[t]=this.#n(r);return e}#a(){let e={};for(let[t,r]of Object.entries(this.uploadGroups))e[t]=this.#i(r);return e}getSerializableSnapshot(){return{uploadAssets:this.#c(),uploadGroups:this.#a(),uploadStats:{...this.uploadStats},uploadSpeedState:this.uploadSpeedState}}getDirtyDelta(){let e={};for(let r of this.dirtyAssetIds){let s=this.uploadAssets[r];s&&(e[r]=this.#n(s))}let t={};for(let r of this.dirtyGroupIds){let s=this.uploadGroups[r];s&&(t[r]=this.#i(s))}return{assets:e,groups:t}}clearDirtyFlags(){this.dirtyAssetIds.clear(),this.dirtyGroupIds.clear(),this.dirtyHistoryGroupIds.clear()}};function hr(n,e){let t=new Date(n).getTime(),r=Date.now();return t-r<=e}var Te=class{#e;#s=new Map;#t=new Map;constructor(e){this.#e=e}seedToken(e,t,r){this.#s.set(e,{token:t,expiresAt:r})}async getToken(e,t){let r=this.#s.get(e);if(r&&!hr(r.expiresAt,3e5))return r.token;let s=this.#t.get(e);if(s)return s;let o=t?O(t):void 0,i=this.#e.post(`/assets/${e}/token`,{},o).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.#t.delete(e),a.token}).catch(a=>{throw this.#t.delete(e),a});return this.#t.set(e,i),i}clearCache(e){e?this.#s.delete(e):this.#s.clear()}};var ke=class{#e=[];registerAsset(e){this.#e.push({assetId:e.assetId,totalChunks:e.totalChunks,nextChunkToClaim:0,completedChunkIndices:new Set(e.completedChunkIndices),isPaused:!1})}claimNextChunk(){for(let e of this.#e)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 r=this.#s(e);return r?(r.completedChunkIndices.add(t),r.completedChunkIndices.size>=r.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.#t(t))}removeAsset(e){this.#e=this.#e.filter(t=>t.assetId!==e)}hasAsset(e){return this.#e.some(t=>t.assetId===e)}isAssetComplete(e){let t=this.#s(e);return t?t.completedChunkIndices.size>=t.totalChunks:!1}clear(){this.#e=[]}#s(e){return this.#e.find(t=>t.assetId===e)}#t(e){for(let t=0;t<e.totalChunks;t++)if(!e.completedChunkIndices.has(t)){e.nextChunkToClaim=t;return}e.nextChunkToClaim=e.totalChunks}};var fr=/[/\\:*?"<>|\x00-\x1F]/g,gr=["CON","PRN","AUX","NUL","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9"];function H(n){let e=n.replace(fr,"_");e=e.replace(/[. ]+$/,""),(!e||e==="."||e==="..")&&(e="unnamed");let t=e.includes(".")?e.substring(0,e.lastIndexOf(".")):e;gr.includes(t.toUpperCase())&&(e=`_${e}`);let r=new TextEncoder;if(r.encode(e).length>255){let s=e.lastIndexOf("."),o=s>0?e.substring(s):"",i=s>0?e.substring(0,s):e,l=255-r.encode(o).length;for(;r.encode(i).length>l&&i.length>0;)i=i.slice(0,-1);e=i+o}return e}var U=class extends Error{constructor(){super("Upload cancelled"),this.name="CancelledError"}};function M(n){return n instanceof U||n instanceof Error&&n.name==="CancelledError"||n instanceof Error&&n.name==="CanceledError"||n instanceof Error&&n.name==="AbortError"}function Er(n){return M(n)||n instanceof Error&&n.name==="NoAuthError"}function wr(n){return new Promise(e=>setTimeout(e,n))}function Ir(n){return n instanceof Blob?n.size:n.byteLength}var le=class{#e;#s;#t;#o;#r;#n;#i;#c;#a;#u;#d;#l;#R;#g=null;#I=0;#P=!1;#C=[];#h=new Set;#b=!1;#E=!1;#T=!1;#m=[];#y=!1;#k=!1;#p=new ke;#v=0;#f=new Map;#w=new Map;#U=[];#B=!1;#D=null;#M;#x="keep_both";#_=new Map;#N=null;#S=!1;#A=null;#O=!1;constructor(e){this.#e=e.httpClient,this.#s=new Te(e.httpClient),this.#t=new Re,this.#o=e.historyStore??null,this.#r=e.settingsStore??null,this.#n=e.analytics??null,this.#i=e.logger??pt,this.#c=e.onChange??null,this.#a=e.onClear??null,this.#u=e.onSummary??null,this.#d=e.onConcurrencyAdjusted??null,this.#R=e.deltaIntervalMs??333;let t=e.maxConcurrency??4;if(e.adaptiveConcurrency!==!1){let r=e.adaptiveConcurrencyConfig;this.#A=new ie({initialConcurrency:r?.initialConcurrency??Math.min(4,t),minConcurrency:r?.minConcurrency??1,maxConcurrency:r?.maxConcurrency??t,errorThreshold:r?.errorThreshold,cooldownSeconds:r?.cooldownSeconds??10,plateauThreshold:r?.plateauThreshold,onChange:s=>{let o=this.#l;if(this.setMaxConcurrency(s),o===s)return;let i=this.#O?"reset":s>o?"probe_increase":"error_decrease",a=Math.round(this.#A.speedBps*8/1e6*100)/100,l=Math.round(this.#A.latencyMsPerMB*100)/100;this.#i.info(`Adaptive concurrency: ${o} \u2192 ${s} (${i}), measuredAt=${o}, speed=${a}Mbps, latency=${l}ms/MB`),this.#d?.({previousConcurrency:o,newConcurrency:s,reason:i,speedMbps:a,latencyMsPerMB:l})},now:r?.now}),this.#l=this.#A.concurrency}else this.#l=t;this.#o&&(this.#C=this.#o.load()),this.#r&&(this.#D=this.#r.getBandwidthLimitBps(),this.#x=this.#r.getConflictResolution()),this.#M=new j(this.#D),(this.#c||this.#u)&&(this.#g=setInterval(()=>{this.#ce()},this.#R)),this.#n&&(this.#N=setInterval(()=>{this.#de()},6e4))}startUpload(e){let t=e.assetId||crypto.randomUUID(),r=!!e.assetId,s;if(r){let i=this.#t.getUploadAsset(t);if(!i)throw new Error(`Cannot retry: asset ${t} not found`);s=i.chunkSize}else{if(e.chunkSize===void 0||e.chunkSize===null)throw new Error("chunkSize is required for new uploads");s=e.chunkSize}let o=new AbortController;if(r){if(this.#t.getUploadAsset(t).status==="cancelled")return t;e.resetRetryCount&&this.#t.resetAssetForRetrying(t);let a=this.#t.getUploadAsset(t);a.abortController=o,a.fileReader=e.fileReader,e.shareContext&&(a.shareContext=e.shareContext)}else this.#t.addUploadAsset({assetId:t,fileReader:e.fileReader,abortController:o,parentId:e.directoryId,projectId:e.projectId,groupId:e.groupId,chunkSize:s,shareContext:e.shareContext});return this.#m.push(t),this.#L(),this.#F(),t}startGroupUpload(e){this.#t.clearTerminalState();let t=this.#t.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.#x});return this.#_.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.#t.dirtyHistoryGroupIds.add(t),this.#$(),this.#F(),t}pauseUpload(e){let t=this.#t.getUploadAsset(e);this.#t.pauseUpload(e),this.#m=this.#m.filter(r=>r!==e),this.#p.pauseAsset(e),!this.#S&&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.#F()}unpauseUpload(e){this.#t.unpauseUpload(e),this.#F()}cancelUpload(e){let t=this.#t.getUploadAsset(e);if(!t||t.status==="success"||t.status==="failed"||t.status==="cancelled")return;let r=t.fileName,s=t.totalBytesToUpload,o=t.bytesUploaded,i=t.projectId,a=t.chunkedState?.assetId;(t.status==="queued"||t.status==="in-progress")&&t.abortController.abort(),this.#m=this.#m.filter(l=>l!==e),this.#p.removeAsset(e),this.#f.delete(e),this.#w.delete(e),this.#t.markUploadCancelled(e),this.#t.clearChunkedState(e),t.fileReader.close?.(),!this.#S&&this.#n&&this.#n("upload:file_cancelled",{file_name:r,file_size:s,bytes_uploaded:o,project_id:i??""}),this.#F(),this.#z(),this.#L(),this.#V(),a&&(this.#U.push(a),this.#X())}cancelAllUploads(){let e=this.#Q();this.#S=!0;try{let r=Object.values(this.#t.uploadAssets).filter(s=>s.status==="queued"||s.status==="in-progress"||s.status==="paused");for(let s of r)this.cancelUpload(s.assetId)}finally{this.#S=!1}this.#n?.("upload:all_cancelled",e)}retryUpload(e){let t=this.#t.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.#t.getUploadAsset(e);if(!t||t.status!=="paused")return;!this.#S&&this.#n&&this.#n("upload:file_resumed",{file_name:t.fileName,file_size:t.totalBytesToUpload,bytes_uploaded:t.bytesUploaded,project_id:t.projectId??""});let r=new AbortController;t.abortController=r,this.#t.unpauseUpload(e),this.#p.hasAsset(e)?(this.#p.unpauseAsset(e),this.#F(),this.#p.isAssetComplete(e)?this.#J(e).catch(s=>{this.#G(e,s)}):this.#z()):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.#t.uploadGroups[e];if(!t)return;let r=this.#S;this.#S=!0,this.#t.pauseUploadGroup(e);for(let s of t.assetIds)this.#m=this.#m.filter(o=>o!==s),this.#p.pauseAsset(s);this.#S=r,this.#S||this.#te(e,t,"upload:group_paused"),this.#F()}unpauseUploadGroup(e){this.#t.unpauseUploadGroup(e),this.#F()}cancelUploadGroup(e){let t=this.#t.uploadGroups[e];if(!t)return;let{totalBytes:r,bytesUploaded:s,filesRemaining:o}=this.#ee(t),i=this.#S;this.#S=!0;for(let a of t.assetIds)this.cancelUpload(a);t.assetIds.length===0&&(this.#t.finalizeEmptyGroup({groupId:e,status:"cancelled"}),this.#$(),this.#F()),this.#S=i,this.#S||this.#n?.("upload:group_cancelled",{file_count:t.assetIds.length,files_remaining:o,total_bytes:r,bytes_uploaded:s,project_id:t.projectId}),this.#_.delete(e)}resumeUploadGroup(e){let t=this.#t.uploadGroups[e];if(!t)return;this.#S||this.#te(e,t,"upload:group_resumed");let r=this.#S;this.#S=!0,this.#t.unpauseUploadGroup(e);for(let s of t.assetIds){let o=this.#t.getUploadAsset(s);o&&o.status==="paused"&&this.resumeUpload(s)}this.#S=r}retryUploadGroup(e){let t=this.#t.uploadGroups[e];if(t)for(let r of t.assetIds){let s=this.#t.getUploadAsset(r);s&&s.status==="failed"&&this.retryUpload(r)}}setGroupCreatingFolders(e,t){this.#t.updateUploadGroup(e,{isCreatingFolders:t}),this.#F()}markEmptyGroupFailed(e,t){let r=this.#t.uploadGroups[e];r&&(r.assetIds.length>0||r.finalizedStatus||(this.#i.error("Empty group upload failed",{groupId:e,groupName:r.name,errorMessage:t}),this.#t.finalizeEmptyGroup({groupId:e,status:"all-failed",errorMessage:t}),this.#$(),this.#_.delete(e),this.#F()))}markEmptyGroupCompleted(e){this.#t.finalizeEmptyGroup({groupId:e,status:"success"}),this.#$(),this.#_.delete(e),this.#F()}addAssetToGroup(e,t){this.#t.addAssetToGroup(e,t)}pauseAllUploads(){let e=this.#Q();this.#S=!0;try{for(let t of Object.values(this.#t.uploadAssets))t.groupId||this.pauseUpload(t.assetId);for(let t of Object.values(this.#t.uploadGroups))t.isCreatingFolders||this.pauseUploadGroup(t.id)}finally{this.#S=!1}this.#n?.("upload:all_paused",e),this.#F()}resumeAllUploads(){let e=this.#Q();this.#S=!0;try{for(let t of Object.values(this.#t.uploadAssets))!t.groupId&&t.status==="paused"&&this.resumeUpload(t.assetId);for(let t of Object.values(this.#t.uploadGroups))t.isPaused&&this.resumeUploadGroup(t.id)}finally{this.#S=!1}this.#n?.("upload:all_resumed",e),this.#F()}clearAllUploads(){this.#m=[],this.#p.clear(),this.#f.clear(),this.#w.clear(),this.#t.clearAllUploads(),this.#t.uploadGroups={},this.#A&&(this.#O=!0,this.#A.reset(),this.#O=!1),this.#a?.({all:!0}),this.#u?.(this.#H())}clearHistory(){this.#C=[],this.#o?.clear(),this.#b=!0,this.#h.clear(),this.#T=!0,this.#F()}removeHistoryItem(e){this.#C=this.#C.filter(t=>t.groupId!==e),this.#o?.remove(e),this.#h.add(e),this.#T=!0,this.#F()}removeGroup(e){this.#t.removeUploadGroup(e),this.#C=this.#C.filter(t=>t.groupId!==e),this.#o?.remove(e),this.#h.add(e),this.#T=!0,this.#a?.({groupId:e}),this.#u?.(this.#H()),this.#F()}getHttpClient(){return this.#e}setBandwidthLimit(e){let t=e!==this.#D;this.#D=e,this.#M.setLimit(e),this.#r?.setBandwidthLimitBps(e),t&&this.#A&&(this.#O=!0,this.#A.reset(),this.#O=!1),this.#T=!0,this.#F()}getBandwidthLimit(){return this.#D}setConflictResolution(e){this.#x=e,this.#r?.setConflictResolution(e),this.#T=!0,this.#F()}getConflictResolution(){return this.#x}getGroupConflictResolution(e){return this.#t.getUploadGroup(e)?.conflictResolution??this.#x}setMaxConcurrency(e){this.#l=e,this.#z()}getSnapshot(){return this.#t.updateUploadStats(),{...this.#t.getSerializableSnapshot(),uploadHistory:[...this.#C??[]],uploadSummary:this.#H(),bandwidthLimitBps:this.#D,conflictResolution:this.#x}}getUploadAsset(e){return this.#t.getSerializableAsset(e)}getUploadSummary(){return this.#H()}getGroupAssets(e){return this.#t.getGroupAssets(e)}getUploadGroupStatus(e){return this.#t.getUploadGroupStatus(e)}getUploadGroupProgress(e){return this.#t.getUploadGroupProgress(e)}hasGroupsCreatingFolders(){return this.#t.hasGroupsCreatingFolders()}areAllUploadsPaused(){return this.#t.areAllUploadsPaused()}hasPausedUploads(){return this.#t.hasPausedUploads()}hasActiveUploads(){return ct(this.#t.getSerializableSnapshot().uploadAssets)}getServerAssetIdsToCancel(){return lt(this.#t.getSerializableSnapshot().uploadAssets)}async cancelActiveServerUploads(){let e=this.getServerAssetIdsToCancel();if(e.length!==0)try{await this.#e.post("/assets/cancel-uploads",{asset_ids:e})}catch{await this.#e.post("/assets/cancel-uploads",{asset_ids:e})}}destroy(){this.#E=!0,this.#g&&(clearInterval(this.#g),this.#g=null),this.#N&&(clearInterval(this.#N),this.#N=null),this.#m=[],this.#p.clear();for(let e of Object.values(this.#t.uploadAssets))e.abortController.abort(),e.fileReader.close?.()}#L(){this.#k||(this.#k=!0,queueMicrotask(()=>{this.#k=!1,this.#W().catch(e=>{this.#i.error("Initiation pipeline error",{queueLength:this.#m.length},e)})}))}async#W(){if(!this.#y){this.#y=!0;try{await this.#K()}finally{this.#y=!1}}}async#K(){for(;this.#m.length>0&&!(this.#f.size>5);){let e=Math.min(this.#m.length,20-this.#f.size);if(e<=0)break;let t=[],r=[];for(let s=0;s<e&&this.#m.length>0;s++){let o=this.#m[0],i=this.#t.getUploadAsset(o);if(!i||i.status==="cancelled"){this.#m.shift(),s--;continue}if(this.#m.shift(),r.push(o),i.chunkedState)try{this.#Y(o,i),this.#z()}catch(a){M(a)||this.#G(o,a)}else t.push(o)}if(t.length>0){let s=new Map;for(let o of t){let a=this.#t.getUploadAsset(o)?.shareContext?.shareId??"",l=s.get(a);l||(l=[],s.set(a,l)),l.push(o)}for(let o of s.values())try{await this.#j(o)}catch(i){for(let a of o)this.#G(a,i instanceof Error?i:new Error(String(i)))}this.#z()}}}#Y(e,t){let r=t.chunkedState,s={serverAssetId:r.assetId,chunkIds:r.chunkIds,chunkSize:r.chunkSize,totalChunks:r.totalChunks,sizeBytes:r.sizeBytes},o=r.completedChunkIndices;this.#f.set(e,s);let i=new Array(s.totalChunks).fill(0);if(o.length>0){for(let l of o){let c=l*s.chunkSize,u=Math.min(c+s.chunkSize,t.totalBytesToUpload);i[l]=u-c}let a=i.reduce((l,c)=>l+c,0);this.#t.updateUploadProgress(e,a)}if(this.#w.set(e,i),s.totalChunks===0||o.length>=s.totalChunks){this.#J(e).catch(a=>{this.#G(e,a)});return}this.#p.registerAsset({assetId:e,totalChunks:s.totalChunks,completedChunkIndices:o})}async#j(e){let t=[],r=[];for(let a of e){let l=this.#t.getUploadAsset(a);if(!l||l.status==="cancelled")continue;let c=H(l.fileName),u=l.groupId?this.#t.getUploadGroup(l.groupId)?.conflictResolution??this.#x:this.#x,d=(()=>{switch(u){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:c,size_bytes:l.totalBytesToUpload,...d}),r.push(a)}if(t.length===0)return;let s=this.#t.getUploadAsset(r[0]),o=s?.shareContext?O(s.shareContext):void 0,i=await this.#e.post("/assets/chunked/initiate",t,o);for(let a=0;a<r.length;a++){let l=r[a],c=i[a];if(!c||c.error){this.#G(l,new Error(c?.error??"Unknown batch initiation error"));continue}if(c.skipped){let C=this.#t.getUploadAsset(l);C&&(this.#t.adjustSpeedBaselineForSkippedBytes(C.totalBytesToUpload),this.#t.markUploadSuccess(l),this.#t.dirtyHistoryGroupIds.add(C.groupId??""),this.#$(),C.fileReader.close?.());continue}let u=c.result,d=this.#t.getUploadAsset(l);if(!d||d.status==="cancelled"||d.status==="paused"){(!d||d.status==="cancelled")&&(this.#U.push(u.asset_id),this.#X());continue}let m=Math.ceil(d.totalBytesToUpload/u.chunk_size),g=Array.from({length:m},()=>crypto.randomUUID());this.#s.seedToken(u.asset_id,u.token,u.token_expires_at);let p={serverAssetId:u.asset_id,chunkIds:g,chunkSize:u.chunk_size,totalChunks:m,sizeBytes:d.totalBytesToUpload};this.#t.setChunkedState(l,{assetId:p.serverAssetId,chunkIds:p.chunkIds,completedChunkIndices:[],chunkSize:p.chunkSize,totalChunks:p.totalChunks,sizeBytes:p.sizeBytes}),this.#f.set(l,p);let y=new Array(p.totalChunks).fill(0);if(this.#w.set(l,y),p.totalChunks===0){this.#J(l).catch(C=>{this.#G(l,C)});continue}this.#p.registerAsset({assetId:l,totalChunks:p.totalChunks,completedChunkIndices:[]})}}#z(){if(!this.#E)for(;this.#v<this.#l;){let e=this.#p.claimNextChunk();if(!e)break;this.#v++;let{assetId:t,chunkIndex:r}=e,s=this.#A?.generation;this.#re(t,r,s).then(o=>{this.#v--,this.#oe(t,r,o),this.#z()}).catch(o=>{if(this.#v--,M(o)){this.#z();return}this.#ie(t,r,o),this.#z()})}}async#re(e,t,r){let s;for(let o=0;o<3;o++)try{let i=this.#w.get(e);return i&&(i[t]=0,this.#q(e)),await this.#se(e,t,r)}catch(i){if(M(i))throw i;if(s=i instanceof Error?i:new Error(String(i)),this.#A?.recordError(),this.#ae(e,t,s,o),o===2)throw s;let a=this.#w.get(e);a&&(a[t]=0,this.#q(e));let l=1e3*Math.pow(2,o);await wr(l)}throw s||new Error("Unknown error during chunk upload")}async#se(e,t,r){let s=this.#t.getUploadAsset(e);if(!s)throw new U;if(s.abortController.signal.aborted)throw new U;let o=this.#f.get(e);if(!o)throw new Error(`No chunk metadata for asset ${e}`);let i=t*o.chunkSize,a=Math.min(i+o.chunkSize,s.totalBytesToUpload),l=await s.fileReader.readChunk(i,a),c=Ir(l);if(s.abortController.signal.aborted)throw new U;let u=o.chunkIds[t],d=await this.#s.getToken(o.serverAssetId,s.shareContext),m=`/uploads/chunks/${u}`,g=Date.now(),p=await this.#e.putWithToken(m,l,d,{signal:s.abortController.signal,onProgress:k=>{let E=this.#w.get(e);E&&(E[t]=k,this.#q(e))},contentType:"application/octet-stream",limiter:this.#M}),y=Date.now(),C=p.uploadCompletedAtMs??y,S=C-g;if(!p.status||p.status<200||p.status>=300)throw this.#i.error("Chunk upload returned unexpected status",{chunkIndex:t,chunkId:u,assetId:e,serverAssetId:o.serverAssetId,chunkSizeBytes:c,durationMs:S,httpStatus:p.status,statusText:p.statusText,responseBody:p.data,responseHeaders:p.headers}),new Error(`Chunk ${t} upload failed: unexpected status ${p.status}`);let we=this.#w.get(e);return we&&(we[t]=c,this.#q(e)),{durationMs:S,startedAtMs:g,completedAtMs:C,adaptiveGeneration:r}}#q(e){let t=this.#w.get(e);if(!t)return;let r=t.reduce((s,o)=>s+o,0);this.#t.updateUploadProgress(e,r)}#oe(e,t,r){if(this.#A){let o=this.#f.get(e);if(o){let i=t*o.chunkSize,l=Math.min(i+o.chunkSize,o.sizeBytes)-i;this.#A.recordSuccess(l,r.durationMs,{generation:r.adaptiveGeneration,startedAtMs:r.startedAtMs,completedAtMs:r.completedAtMs})}}this.#t.addCompletedChunkIndex(e,t),this.#p.markChunkCompleted(e,t)&&this.#J(e).catch(o=>{this.#G(e,o)})}#ie(e,t,r){this.#G(e,r)}#ae(e,t,r,s){if(!this.#n)return;let o=this.#t.getUploadAsset(e);if(!o)return;let i=this.#f.get(e);if(!i)return;let a=t*i.chunkSize,c=Math.min(a+i.chunkSize,i.sizeBytes)-a,u=r,d=typeof u.code=="string"?u.code:null,m=u.response?.status,g=typeof m=="number"?m:null,p=r.cause?r.cause instanceof Error?r.cause.message:String(r.cause):null,y=ft(r);this.#n("upload:chunk_error",{file_name:o.fileName,file_size:o.totalBytesToUpload,chunk_index:t,chunk_size:c,chunks_total:i.totalChunks,attempt:s+1,max_attempts:3,is_final_attempt:s===2,error_type:r.name,error_message:r.message,error_code:d,http_status:g,error_stack:r.stack??null,error_cause:p,project_id:o.projectId??"",had_response:y?.hadResponse??null,reused_socket:y?.reusedSocket??null,remote_address:y?.remoteAddress??null,remote_family:y?.remoteFamily??null,tls_protocol:y?.tlsProtocol??null,tls_cipher:y?.tlsCipher??null,peer_cert_issuer:y?.peerCertIssuer??null,peer_cert_subject:y?.peerCertSubject??null,tls_authorized:y?.tlsAuthorized??null})}#le(e,t,r,s){if(!this.#n||M(t))return;let o=t instanceof Error?t.message:"Unknown error",i=t,a=t instanceof Error&&t.cause?t.cause instanceof Error?t.cause.message:String(t.cause):null,l=typeof i.code=="string"?i.code:null,c=i.response?.status,u=typeof c=="number"?c:null,d=this.#f.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:r+1,max_attempts:4,is_final_attempt:s,error_type:t instanceof Error?t.name:"Unknown",error_message:o,error_code:l,http_status:u,error_stack:t instanceof Error?t.stack??null:null,error_cause:a,project_id:e.projectId??""})}async#J(e){let t=this.#t.getUploadAsset(e);if(!t)return;let r=this.#f.get(e);if(!r)return;if(t.abortController.signal.aborted)throw new U;let s=crypto.randomUUID(),o=JSON.stringify(r.chunkIds),i=new TextEncoder().encode(o),a=await this.#s.getToken(r.serverAssetId,t.shareContext),l=`/uploads/manifests/${s}`;try{await this.#e.putWithToken(l,i,a,{signal:t.abortController.signal,contentType:"application/json"})}catch(c){throw M(c)||this.#i.error("Manifest upload failed",{assetId:e,serverAssetId:r.serverAssetId,manifestId:s},c),c}if(t.abortController.signal.aborted)throw new U;try{let c=t.shareContext?O(t.shareContext):void 0;await this.#e.post(`/assets/${r.serverAssetId}/revisions/commit`,{manifest_id:s,size_bytes:r.sizeBytes,is_initial_upload:!0,client_performed_at:new Date().toISOString()},c)}catch(c){throw this.#i.error("Commit revision failed",{assetId:e,serverAssetId:r.serverAssetId,manifestId:s,sizeBytes:r.sizeBytes},c),c}this.#t.markUploadSuccess(e),this.#t.clearChunkedState(e),this.#$(),this.#F(),this.#f.delete(e),this.#w.delete(e),this.#p.removeAsset(e),await t.fileReader.close?.(),this.#ne(e),this.#L(),this.#V()}#G(e,t){let r=this.#t.getUploadAsset(e);if(!r||M(t)||r.status==="paused"||r.status==="cancelled")return;let s=r.retryCount,o=s>=3||Er(t);if(this.#le(r,t,s,o),o){let i=t instanceof Error?t.message:"Unknown error";this.#i.error("Asset upload permanently failed",{assetId:e,fileName:r.fileName,totalRetries:s,bytesUploaded:r.bytesUploaded,totalBytes:r.totalBytesToUpload,chunksCompleted:r.chunkedState?.completedChunkIndices.length??0},t),r.abortController.abort(),this.#t.markUploadFailed(e,i),this.#p.removeAsset(e),this.#f.delete(e),this.#w.delete(e),this.#$(),this.#F(),this.#ne(e),this.#L(),this.#V()}else{this.#i.warn("Asset upload failed, scheduling retry",{assetId:e,fileName:r.fileName,retryAttempt:s+1,maxRetries:3},t);let i=r.chunkedState;r.abortController.abort(),this.#p.removeAsset(e),this.#f.delete(e),this.#w.delete(e),this.#t.resetAssetForRetryQueue(e),this.#F(),this.#L();let a=2e3*Math.pow(2,s);setTimeout(()=>{if(this.#E)return;let l=this.#t.getUploadAsset(e);!l||l.status!=="queued"||this.startUpload({fileReader:l.fileReader,directoryId:l.parentId??"",projectId:l.projectId,groupId:l.groupId,assetId:e,resumeChunked:i,shareContext:l.shareContext})},a)}}#V(){this.#A&&(this.hasActiveUploads()||(this.#O=!0,this.#A.reset(),this.#O=!1))}#X(){this.#B||(this.#B=!0,queueMicrotask(()=>{this.#B=!1;let e=this.#U.splice(0);e.length!==0&&this.#e.post("/assets/cancel-uploads",{asset_ids:e}).catch(t=>{this.#i.error("Failed to batch abort uploads",{assetIds:e},t)})}))}#H(){return se(this.#t.getSerializableSnapshot().uploadAssets)}#F(){this.#P||(this.#P=!0,queueMicrotask(()=>{this.#P=!1,this.#ue()}))}#ce(){this.#Z(!0)}#ue(){this.#Z(!1)}#Z(e){if(this.#E||!this.#c&&!this.#u)return;e?this.#t.updateUploadStats():(this.#I++,this.#I%3===0&&this.#t.updateUploadStats());let t=this.#t.getDirtyDelta();if(!this.#T&&Object.keys(t.assets).length===0&&Object.keys(t.groups).length===0&&this.#t.dirtyHistoryGroupIds.size===0)return;this.#T=!1,this.#t.dirtyHistoryGroupIds.size>0&&this.#$();let s=this.#t.dirtyHistoryGroupIds.size>0?this.#pe():void 0,o=this.#b?!0:void 0,i=this.#h.size>0?[...this.#h]:void 0;this.#b=!1,this.#h.clear();let a=this.#H(),l={assets:t.assets,groups:t.groups,uploadStats:{...this.#t.uploadStats},uploadSpeedState:this.#t.uploadSpeedState,historyItems:s,removedHistoryGroupIds:i,historyCleared:o,uploadSummary:a,bandwidthLimitBps:this.#D,conflictResolution:this.#x};this.#t.clearDirtyFlags(),this.#c?.(l),this.#u?.(a)}#ee(e){let t=0,r=0,s=0;for(let o of e.assetIds){let i=this.#t.getUploadAsset(o);i&&(t+=i.totalBytesToUpload,r+=i.bytesUploaded,i.status!=="success"&&i.status!=="failed"&&i.status!=="cancelled"&&s++)}return{totalBytes:t,bytesUploaded:r,filesRemaining:s}}#Q(){let e=0,t=0,r=0,s=0;for(let o of Object.values(this.#t.uploadGroups)){e++;for(let i of o.assetIds){let a=this.#t.getUploadAsset(i);a&&(a.status==="success"||a.status==="failed"||a.status==="cancelled"||(t++,r+=a.totalBytesToUpload,s+=a.bytesUploaded))}}return{group_count:e,file_count:t,total_bytes:r,bytes_uploaded:s}}#de(){if(!(!this.#n||this.#E))for(let e of Object.values(this.#t.uploadGroups)){let t=!1,r=0,s=0,o=0,i=0,a=0,l=0,c=0,u=0,d=0,m=0;for(let y of e.assetIds){let C=this.#t.getUploadAsset(y);if(!C)continue;let S=C.totalBytesToUpload;switch(r+=S,s+=C.bytesUploaded,C.status){case"success":o++,i+=S;break;case"failed":a++,l+=S;break;case"cancelled":c++,u+=S;break;case"in-progress":d++,t=!0;break;case"queued":m++,t=!0;break;case"paused":t=!0;break}}if(!t)continue;let g=this.#_.get(e.id),p=g?Date.now()-g:0;this.#n("upload:group_progress",{group_id:e.id,file_count:e.assetIds.length,total_bytes:r,bytes_uploaded:s,duration_ms:p,project_id:e.projectId,succeeded_count:o,succeeded_bytes:i,failed_count:a,failed_bytes:l,cancelled_count:c,cancelled_bytes:u,in_progress_count:d,queued_count:m,progress:r>0?s/r:0,concurrency:this.#l,upload_speed_mbps:this.#t.uploadStats.uploadSpeedMbps})}}#te(e,t,r){if(!this.#n)return;let{totalBytes:s,bytesUploaded:o}=this.#ee(t);this.#n(r,{file_count:t.fileCount,total_bytes:s,bytes_uploaded:o,project_id:t.projectId})}#ne(e){if(!this.#n)return;let t=this.#t.getUploadAsset(e);if(!t?.groupId)return;let r=this.#t.uploadGroups[t.groupId];if(!r)return;let s=!0,o=0,i=0,a=0,l=0,c=0,u=0,d=0;for(let p of r.assetIds){let y=this.#t.getUploadAsset(p);if(!y)continue;let C=y.totalBytesToUpload;if(d+=C,y.status==="success")o++,i+=C;else if(y.status==="failed")a++,l+=C;else if(y.status==="cancelled")c++,u+=C;else{s=!1;break}}if(!s)return;let m=this.#_.get(r.id),g=m?Date.now()-m:0;this.#n("upload:group_completed",{file_count:r.assetIds.length,total_bytes:d,duration_ms:g,project_id:r.projectId,succeeded_count:o,succeeded_bytes:i,failed_count:a,failed_bytes:l,cancelled_count:c,cancelled_bytes:u}),this.#_.delete(r.id)}#pe(){let e={};for(let t of this.#t.dirtyHistoryGroupIds){let r=this.#t.buildHistoryItem(t);r&&(e[t]=r)}return e}#$(){if(!this.#o)return;let e={};for(let t of this.#t.dirtyHistoryGroupIds){let r=this.#t.buildHistoryItem(t);if(r){e[t]=r;let s=this.#C.findIndex(o=>o.groupId===t);s>=0?this.#C[s]=r:this.#C.unshift(r)}}Object.keys(e).length>0&&this.#o.merge(e)}};var Pr={keep_both:"Keep Both",replace:"Replace",skip:"Skip"};var Ba=new Set(["success","all-failed","some-failed","cancelled"]),Ma=new Set(["all-failed","some-failed"]),Na=new Set(["queued","in-progress"]),za=new Set(["queued","creating-folders","in-progress"]),Ga=new Set(["queued","in-progress"]),$a=new Set(["queued","in-progress","paused"]);var ue=class{#e=65536;#s=0;async*createIterator(e,t,r){let s=0,o=Math.max(65536,Math.min(e.byteLength,this.#e)),i=this.#s;for(;s<e.byteLength;){if(r?.aborted)return;let a=t?t.getLimit():null,l=a!==null&&a>0;if(l){let p=Math.round(a*50/1e3);o=Math.max(65536,Math.min(e.byteLength,p))}let c=Math.min(s+o,e.byteLength),u=e.subarray(s,c),d=u.byteLength;if(l&&(await t.acquire(d),r?.aborted))return;let m=performance.now();yield u;let g=performance.now()-m;if(s=c,!l){if(g>=.5){let p=d/g*1e3;i=i===0?p:i*(1-.3)+p*.3}else i===0&&(o=Math.min(e.byteLength,o*2));if(i>0){let p=Math.round(i*50/1e3);o=Math.max(65536,Math.min(e.byteLength,p))}}this.#e=o,this.#s=i}}};var x=class{#e;#s;#t;#o;#r=new ue;#n=new Set;constructor(e){this.#e=Zt.create({baseURL:e.apiUrl}),this.#s=Zt.create({baseURL:e.edgeWorkerUrl}),this.#t=e.apiKey,this.#o=e.sessionId}get skippedAssetIds(){return this.#n}async post(e,t,r){let s=await this.#e.post(e,t,{headers:{Authorization:`Bearer ${this.#t}`,"X-Aspect-Session-Id":this.#o,"Content-Type":"application/json",...r}});return this.#c(e,t,s.data),s.data}async get(e,t){return(await this.#e.get(e,{headers:{Authorization:`Bearer ${this.#t}`,"X-Aspect-Session-Id":this.#o,...t}})).data}async delete(e,t){await this.#e.delete(e,{headers:{Authorization:`Bearer ${this.#t}`,"X-Aspect-Session-Id":this.#o,...t}})}async putWithToken(e,t,r,s){let o=await this.#i(t),i=this.#r.createIterator(o,s.limiter??null,s.signal),a=Rr.from(i,{highWaterMark:1}),l;try{l=await this.#s.put(e,a,{timeout:0,signal:s.signal,headers:{"Content-Type":s.contentType??"","Content-Length":o.byteLength.toString(),Authorization:`Bearer ${r}`},transformRequest:[c=>c],maxRedirects:0,onUploadProgress:c=>s.onProgress?.(c.loaded)})}catch(c){throw ht(c,mt(c)),c}return{status:l.status,statusText:l.statusText,headers:Object.fromEntries(Object.entries(l.headers)),data:l.data,raw:l}}async#i(e){if(e instanceof Uint8Array)return e;let t=await e.arrayBuffer();return new Uint8Array(t)}#c(e,t,r){if(e!=="/assets/chunked/initiate"||!Array.isArray(t)||!Array.isArray(r))return;let s=t;r.forEach((i,a)=>{let l=s[a];i.skipped===!0&&typeof l?.id=="string"&&this.#n.add(l.id)})}};import pe from"node:path";import D from"node:path";function b(n){let e=n.replace(/\\/g,"/");if(e.split("/").some(o=>o===".."))throw new Error(`Remote path cannot contain parent directory segments: ${n}`);let s=D.posix.normalize(e).replace(/^\/+/,"");if(s===""||s===".")throw new Error(`Remote path must resolve to a file path: ${n}`);return s}function Le(n){let e=new Map;for(let o of n){let i=b(o.targetPath??o.path);e.set(i,(e.get(i)??0)+1)}let t=new Set,r=[],s=[];for(let o of n){let i=b(o.path),a=b(o.targetPath??o.path),l=de(a),c=St(l,t),u=(e.get(a)??0)>1,d=c!==i;t.add(c),r.push({...o,targetPath:c,requiresIdentityDownload:o.requiresIdentityDownload===!0||u}),(d||u)&&s.push({sourcePath:o.path,targetPath:c,reason:u||c!==l?"duplicate":"sanitized"})}return{files:r,changes:s}}function A(n){return b(n.targetPath??n.path)}function Ue(n,e){let t=A(n);return{relativePath:t,absolutePath:D.join(e,t),fileName:D.posix.basename(t),size:n.size}}function de(n){return n.split("/").map(t=>H(t)).join("/")}function St(n,e){if(!e.has(n))return n;let t=D.posix.dirname(n),r=D.posix.basename(n),s=D.posix.extname(r),o=s.length>0?r.slice(0,-s.length):r,i=2;for(;;){let a=`${o} (${i})${s}`,l=t==="."?a:`${t}/${a}`;if(!e.has(l))return l;i+=1}}function Ct(n,e){if(!e.has(n))return n;let t=D.posix.dirname(n),r=D.posix.basename(n),s=2;for(;;){let o=`${r} ${s}`,i=t==="."?o:`${t}/${o}`;if(!e.has(i))return i;s+=1}}var en=500,Tr=8,xe=class{#e;#s;#t=new Map;constructor(e){this.#e=e.rootDirectoryId,this.#s=e.httpClient}async ensureDirectories(e){await this.loadExistingDirectories();let t=this.#o(e);for(let r of t){if(this.#t.has(r))continue;let s=pe.posix.dirname(r),o=pe.posix.basename(r),i=s==="."?this.#e:this.#t.get(s);if(!i)throw new Error(`Parent directory ID not found for path: ${r}`);let a=await this.#a(i,o);if(a.name!==o)throw new Error(`Server created renamed directory "${a.name}" for planned path "${r}". Refusing to map uploads to an unexpected target path.`);this.#t.set(r,a.id)}return e.map(r=>({file:r,directoryId:this.getDirectoryIdForFile(r.relativePath)}))}async loadExistingDirectories(){let e=await this.#r(this.#e);this.#t.clear(),this.#c(e,"")}getDirectoryIdForFile(e){let t=b(e),r=pe.posix.dirname(t);if(r===".")return this.#e;let s=this.#t.get(r);if(!s)throw new Error(`Directory ID not found for path: ${r}`);return s}getExistingDirectoryIdForFile(e){let t=b(e),r=pe.posix.dirname(t);return r==="."?this.#e:this.#t.get(r)??null}async checkAssetsExistence(e,t=!0){if(e.length===0)return[];let r=[];for(let s=0;s<e.length;s+=en){let o=e.slice(s,s+en),i=await this.#s.post("/assets/check-exists-and-uploaded",{items:o,delete_if_not_exist:t});r.push(...i.items)}return r}async listFilesInSubtree(e={}){let t=[{id:this.#e,relativePath:""}],r=[],s=0;for(;s<t.length;){let o=t.slice(s,s+Tr),i=await Promise.all(o.map(a=>this.#n(a)));s+=o.length;for(let a of i)t.push(...a.directories),r.push(...a.files);e.onProgress?.({scannedDirectoryCount:s,queuedDirectoryCount:t.length,fileCount:r.length})}return r}#o(e){let t=new Set;for(let r of e){let s=b(r.relativePath),o=pe.posix.dirname(s);if(o===".")continue;let i=o.split("/");for(let a=0;a<i.length;a++)t.add(i.slice(0,a+1).join("/"))}return Array.from(t).sort((r,s)=>r.split("/").length-s.split("/").length)}async#r(e){return this.#s.get(`/directories/${e}/tree`)}async#n(e){let[t,r]=await Promise.all([this.#s.post("/fs/list/directories",{parent_id:e.id}),this.#s.post("/fs/list/assets",{parent_id:e.id})]);return{directories:t.map(s=>({id:s.id,relativePath:this.#i(e.relativePath,s.name)})),files:r.map(s=>({assetId:s.id,relativePath:this.#i(e.relativePath,s.name),sizeBytes:s.size_bytes,isUploaded:s.is_uploaded??!0,uploadStateKnown:typeof s.is_uploaded=="boolean"}))}}#i(e,t){let r=e===""?t:`${e}/${t}`;return b(r)}#c(e,t){let r=t===""?"":t==="."?e.name:`${t}/${e.name}`;r!==""&&this.#t.set(r,e.id);for(let s of e.children){let o=t===""?".":r;this.#c(s,o)}}async#a(e,t){return this.#s.post(`/directories/${e}/directories`,{name:t,auto_rename:"numeric"})}};import{PostHog as kr}from"posthog-node";var N=null,De="",bt={};function tn(n){N||n.config.analytics.disabled||!n.config.analytics.posthogKey||(De=n.user.id,bt={service:"data-sync",package_version:n.packageVersion,platform:process.platform,arch:process.arch,node_version:process.version,max_concurrent:n.config.maxConcurrent,batch_mode:n.config.batchSizeBytes!==void 0,batch_size_bytes:n.config.batchSizeBytes??null,source_kind:n.config.source.kind,...n.config.source.kind==="rclone"?{rclone_transfers:n.config.source.rcloneOptions.transfers,rclone_multi_thread_streams:n.config.source.rcloneOptions.multiThreadStreams}:{}},N=new kr(n.config.analytics.posthogKey,{host:n.config.analytics.posthogHost}),N.identify({distinctId:De,properties:{user_id:n.user.id,email:n.user.email,first_name:n.user.first_name,last_name:n.user.last_name,utm_source_latest:null,utm_medium_latest:null,utm_campaign_latest:null,utm_content_latest:null}}))}function nn(n,e){N&&N.capture({distinctId:De,event:n,properties:{...bt,...e}})}async function rn(){let n=N;if(vr(),!!n)try{await n.flush()}catch{}}function vr(){N=null,De="",bt={}}import{spawn as Oe}from"child_process";import*as Be from"fs";import*as K from"path";var Lr=2e3,w=class extends Error{constructor(t,r){super(t);this.stderr=r;this.name="RcloneError"}stderr};function Ur(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 xr(n){let e=["lsjson",n.remoteSource,"--recursive","--fast-list"];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function Dr(n){let e=["backend","query",`${n.remote}:`,n.query];return n.extraArgs?.length&&e.push(...n.extraArgs),e}function _r(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 Or(n){let e=["backend","copyid",`${n.remote}:`,n.fileId,n.localTargetPath,"--progress","--stats","1s","--stats-one-line","-v"];return n.rcloneOptions.extraRcloneArgs?.length&&e.push(...n.rcloneOptions.extraRcloneArgs),e}function W(n,e){let t=e.trim(),r={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*(r[t]||1)}function sn(n){let e=0,t=n.match(/(\d+)h/),r=n.match(/(\d+)m/),s=n.match(/(\d+)s/);return t&&(e+=parseInt(t[1],10)*3600),r&&(e+=parseInt(r[1],10)*60),s&&(e+=parseInt(s[1],10)),e}function Br(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+(.+)$/,r=e.match(t);if(r){let l=r[8].trim(),c={bytesTransferred:W(parseFloat(r[1]),r[2]),totalBytes:W(parseFloat(r[3]),r[4]),percentComplete:parseFloat(r[5]),speed:W(parseFloat(r[6]),r[7]),eta:l==="-"?0:sn(l)};return{...c,currentFile:c}}let s=e.match(/Transferred:\s+([\d.]+)\s*([A-Za-z]+)\s*\/\s*([\d.]+)\s*([A-Za-z]+),\s*([\d.]+)%/);if(!s)return null;let o=e.match(/([\d.]+)\s*([A-Za-z]+)\/s/),i=e.match(/ETA\s+([^\s]+)$/),a={bytesTransferred:W(parseFloat(s[1]),s[2]),totalBytes:W(parseFloat(s[3]),s[4]),percentComplete:parseFloat(s[5]),speed:o?W(parseFloat(o[1]),o[2]):0,eta:i&&i[1]!=="-"?sn(i[1]):0};return{...a,aggregate:a}}function At(n){return new Promise((e,t)=>{let r=Oe("rclone",n.args,{stdio:["ignore","pipe","pipe"]}),s="",o=0,i,a,l=c=>{for(let u of c.split(`
|
|
3
3
|
`)){if(u.trim().length===0)continue;let d=Br(u);if(!d)continue;i=d.currentFile??i,a=d.aggregate??a;let m=Date.now();if(!(d.percentComplete>=100)&&m-o<500)continue;o=m;let p=a?{...a,aggregate:a,currentFile:i}:{...d,currentFile:i};n.onProgress?.(p)}};r.stdout.on("data",c=>{l(c.toString())}),r.stderr.on("data",c=>{let u=c.toString();s+=u,l(u)}),r.on("close",async c=>{c===0?e():t(new w(`rclone exited with code ${c}`,s))}),r.on("error",c=>{t(new w(`Failed to start rclone: ${c.message}`,""))})})}async function Me(){return new Promise((n,e)=>{let t=Oe("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",r=>{r===0?n():e(new Error("rclone is not installed or not in PATH. Please install rclone first: https://rclone.org/install/"))})})}async function Mr(n,e,t,r,s,o){let i=`${n}:${e}`;return At({args:Ur({remoteSource:i,localPath:t,rcloneOptions:s,batchFilePath:r}),remoteSource:i,onProgress:o})}async function on(n,e,t=[]){let r=`${n}:${e}`;return new Promise((s,o)=>{let i=Oe("rclone",xr({remoteSource:r,extraArgs:t})),a="",l="";i.stdout.on("data",c=>{a+=c.toString()}),i.stderr.on("data",c=>{l+=c.toString()}),i.on("close",async c=>{if(c===0)try{let u=JSON.parse(a||"[]");if(!Array.isArray(u))throw new Error("rclone lsjson did not return an array");let d=Nr(u),m=await zr({remote:n,files:d.files,directories:d.directories,extraArgs:t});s(m)}catch(u){o(new w(`Failed to parse file listing from ${r}: ${u instanceof Error?u.message:String(u)}`,l))}else o(new w(`Failed to list files from ${r}`,l))}),i.on("error",c=>{o(new w(`Failed to start rclone: ${c.message}`,""))})})}async function an(n){let e=new Ft({localPath:n.localPath,files:n.files,onProgress:n.onProgress});e.start();let t=r=>{e.updateCurrentFile(r.currentFile)};try{let r=[],s=[];for(let o of n.files)Kr(o)?s.push(o):r.push(o);r.length>0&&(await Be.promises.writeFile(n.batchFilePath,`${r.map(o=>o.path).join(`
|
|
4
4
|
`)}
|
|
5
|
-
`,"utf-8"),await Mr(n.remote,n.remotePath,n.localPath,n.batchFilePath,n.rcloneOptions,t));for(let o of s)await qr({remote:n.remote,remotePath:n.remotePath,localPath:n.localPath,file:o,rcloneOptions:n.rcloneOptions,onProgress:t})}finally{await e.stop()}}var Ft=class{#e;#s;#t;#o=null;#r=null;#n=null;#i;#c=!1;constructor(e){this.#e=e.localPath,this.#s=e.files,this.#t=e.onProgress}start(){this.#t&&(this.#a(),this.#o=setInterval(()=>{this.#a()},Lr))}async stop(){this.#o&&(clearInterval(this.#o),this.#o=null),await this.#a()}updateCurrentFile(e){this.#i=e??this.#i,this.#i&&this.#r!==null&&this.#n!==null&&this.#a()}async#a(){if(!(!this.#t||this.#c)){this.#c=!0;try{let e=Date.now(),t=await this.#u(),r=this.#s.reduce((c,u)=>c+u.size,0),s=this.#n===null?0:Math.max((e-this.#n)/1e3,.001),o=this.#r===null?0:Math.max(t-this.#r,0),i=s>0?o/s:0,a=Math.max(r-t,0),l={bytesTransferred:t,totalBytes:r,percentComplete:r>0?t/r*100:100,speed:i,eta:i>0?Math.ceil(a/i):0};this.#r=t,this.#n=e,this.#t({...l,aggregate:l,currentFile:this.#i})}finally{this.#c=!1}}}async#u(){let e=0;for(let t of this.#s){let r=K.join(this.#e,A(t)),s=await Be.promises.stat(r).then(o=>o.isFile()?o.size:0).catch(o=>{if(o.code==="ENOENT")return 0;throw o});e+=Math.min(s,t.size)}return e}};function Nr(n){let e=[],t=[];for(let r of n){let s=r;if(typeof s.Path!="string")continue;let o=typeof s.ID=="string"&&s.ID.length>0?s.ID:void 0;if(s.IsDir===!0){t.push({path:b(s.Path),id:o});continue}let i=typeof s.Size=="number"&&Number.isFinite(s.Size)?s.Size:0;e.push({path:b(s.Path),size:i,id:o})}return{files:e,directories:t}}async function zr(n){let e=Gr(n.directories);if(e.length===0)return n.files;let t=e.map(i=>i[0].path),r=n.files.filter(i=>!t.some(a=>cn(i.path,a))),s=$r(n.directories),o=[];for(let i of e)for(let a of i){if(!a.id)throw new Error(`Cannot preserve duplicate remote folder without a stable rclone folder ID: ${a.path}`);let l=de(a.path),c=Ct(l,s);s.add(c),o.push(...await ln({remote:n.remote,parentId:a.id,sourcePrefix:a.path,targetPrefix:c,extraArgs:n.extraArgs}))}return[...r,...o]}function Gr(n){let e=new Map;for(let o of n){let i=e.get(o.path)??[];i.push(o),e.set(o.path,i)}let t=Array.from(e.values()).filter(o=>o.length>1).sort((o,i)=>o[0].path.split("/").length-i[0].path.split("/").length),r=[],s=[];for(let o of t){let i=o[0].path;s.some(a=>cn(i,a))||(s.push(i),r.push(o))}return r}function $r(n){let e=new Map;for(let r of n)e.set(r.path,(e.get(r.path)??0)+1);let t=new Set;for(let r of n)(e.get(r.path)??0)>1||t.add(de(r.path));return t}async function ln(n){let e=await jr({remote:n.remote,parentId:n.parentId,extraArgs:n.extraArgs}),t=new Set,r=[];for(let s of e){if(typeof s.name!="string"||typeof s.id!="string")continue;let o=`${n.sourcePrefix}/${s.name}`,i=`${n.targetPrefix}/${de(s.name)}`,a=s.mimeType==="application/vnd.google-apps.folder"?Ct(i,t):St(i,t);if(t.add(a),s.mimeType==="application/vnd.google-apps.folder"){r.push(...await ln({remote:n.remote,parentId:s.id,sourcePrefix:o,targetPrefix:a,extraArgs:n.extraArgs}));continue}r.push({path:o,targetPath:a,size:Hr(s.size),id:s.id,requiresIdentityDownload:!0})}return r}function jr(n){let e=`'${Wr(n.parentId)}' in parents and trashed = false`;return new Promise((t,r)=>{let s=Oe("rclone",Dr({remote:n.remote,query:e,extraArgs:n.extraArgs}),{stdio:["ignore","pipe","pipe"]}),o="",i="";s.stdout.on("data",a=>{o+=a.toString()}),s.stderr.on("data",a=>{i+=a.toString()}),s.on("close",a=>{if(a!==0){r(new w(`Failed to query children for Google Drive folder ${n.parentId}`,i));return}try{let l=JSON.parse(o||"[]");if(!Array.isArray(l))throw new Error("rclone backend query did not return an array");t(l)}catch(l){r(new w(`Failed to parse children for Google Drive folder ${n.parentId}: ${l instanceof Error?l.message:String(l)}`,i))}}),s.on("error",a=>{r(new w(`Failed to start rclone: ${a.message}`,""))})})}function Hr(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 cn(n,e){return n===e||n.startsWith(`${e}/`)}function Wr(n){return n.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}function Kr(n){let e=A(n),t=b(n.path);return n.requiresIdentityDownload===!0||e!==t}async function qr(n){let e=K.join(n.localPath,A(n.file));if(await Be.promises.mkdir(K.dirname(e),{recursive:!0}),n.file.requiresIdentityDownload===!0){if(!n.file.id)throw new Error(`Cannot preserve duplicate remote file without a stable rclone file ID: ${n.file.path}`);await At({args:Or({remote:n.remote,fileId:n.file.id,localTargetPath:e,rcloneOptions:n.rcloneOptions}),remoteSource:`${n.remote}:${n.file.path}`,onProgress:n.onProgress});return}await At({args:_r({remoteFileSource:`${n.remote}:${Jr(n.remotePath,n.file.path)}`,localTargetPath:e,rcloneOptions:n.rcloneOptions}),remoteSource:`${n.remote}:${n.file.path}`,onProgress:n.onProgress})}function Jr(n,e){let t=n.replace(/\/+$/,""),r=e.replace(/^\/+/,"");return t.length===0?r:`${t}/${r}`}var Ne=class{#e;constructor(e){this.#e=e}get displayName(){return`${this.#e.remote}:${this.#e.remotePath}`}async prepare(){await Me()}async listFiles(){return on(this.#e.remote,this.#e.remotePath,this.#e.rcloneOptions.extraRcloneArgs??[])}resolveLocalFile(e,t){return Ue(e,t)}async materializeBatch(e){await an({remote:this.#e.remote,remotePath:this.#e.remotePath,localPath:e.batchDir,batchFilePath:e.batchFilePath,files:e.files,rcloneOptions:this.#e.rcloneOptions,onProgress:e.onProgress})}async shutdown(){}};import Et from"node:fs/promises";import wt from"node:path";var q=class{#e;constructor(e){this.#e=e}get displayName(){return this.#e.rootPath}async prepare(){let e=await Et.stat(this.#e.rootPath).catch(()=>null);if(!e||!e.isDirectory())throw new Error(`Local source path is not a readable directory: ${this.#e.rootPath}`)}async listFiles(){let e=[];return await this.#s(this.#e.rootPath,"",e),e.sort((t,r)=>t.path.localeCompare(r.path)),e}resolveLocalFile(e,t){let r=A(e);return{relativePath:r,absolutePath:wt.join(this.#e.rootPath,...e.path.split("/")),fileName:wt.posix.basename(r),size:e.size}}async materializeBatch(e){}async shutdown(){}async#s(e,t,r){let s=await Et.readdir(e,{withFileTypes:!0});for(let o of s){let i=wt.join(e,o.name),a=t===""?o.name:`${t}/${o.name}`;if(o.isDirectory()){await this.#s(i,a,r);continue}if(!o.isFile())continue;let l=await Et.stat(i);r.push({path:a,size:l.size})}}};import ze from"node:fs/promises";import ts from"node:path";import{spawn as Yr}from"node:child_process";var Vr=18e4,Qr=2e3,Xr=3e4,Zr=4e3,J=class{#e;#s;#t=null;#o="";#r=null;#n=!1;constructor(e){this.#e=e,this.#s=e.spawnFn??Yr}get isRunning(){return this.#t!==null&&this.#r===null}get daemonOutputTail(){return this.#o}async checkClientInstalled(){await this.#a({args:["list"],failureMessage:"LucidLink client is not installed or not in PATH. Install it from https://www.lucidlink.com/download before running aspect-sync sync lucidlink."})}async start(){if(this.#t)throw new Error("LucidLink daemon already started");let e=["--instance",String(this.#e.instanceId),"daemon","--fs",this.#e.filespace,"--user",this.#e.user,"--mount-point",this.#e.mountPoint,"--root-path",this.#e.cacheRootPath],t=this.#s("lucid",e,{stdio:["pipe","pipe","pipe"]});this.#t=t,t.stdout?.on("data",r=>this.#
|
|
6
|
-
${this.#o}`)}),t.on("error",r=>{this.#r=-1,this.#
|
|
5
|
+
`,"utf-8"),await Mr(n.remote,n.remotePath,n.localPath,n.batchFilePath,n.rcloneOptions,t));for(let o of s)await qr({remote:n.remote,remotePath:n.remotePath,localPath:n.localPath,file:o,rcloneOptions:n.rcloneOptions,onProgress:t})}finally{await e.stop()}}var Ft=class{#e;#s;#t;#o=null;#r=null;#n=null;#i;#c=!1;constructor(e){this.#e=e.localPath,this.#s=e.files,this.#t=e.onProgress}start(){this.#t&&(this.#a(),this.#o=setInterval(()=>{this.#a()},Lr))}async stop(){this.#o&&(clearInterval(this.#o),this.#o=null),await this.#a()}updateCurrentFile(e){this.#i=e??this.#i,this.#i&&this.#r!==null&&this.#n!==null&&this.#a()}async#a(){if(!(!this.#t||this.#c)){this.#c=!0;try{let e=Date.now(),t=await this.#u(),r=this.#s.reduce((c,u)=>c+u.size,0),s=this.#n===null?0:Math.max((e-this.#n)/1e3,.001),o=this.#r===null?0:Math.max(t-this.#r,0),i=s>0?o/s:0,a=Math.max(r-t,0),l={bytesTransferred:t,totalBytes:r,percentComplete:r>0?t/r*100:100,speed:i,eta:i>0?Math.ceil(a/i):0};this.#r=t,this.#n=e,this.#t({...l,aggregate:l,currentFile:this.#i})}finally{this.#c=!1}}}async#u(){let e=0;for(let t of this.#s){let r=K.join(this.#e,A(t)),s=await Be.promises.stat(r).then(o=>o.isFile()?o.size:0).catch(o=>{if(o.code==="ENOENT")return 0;throw o});e+=Math.min(s,t.size)}return e}};function Nr(n){let e=[],t=[];for(let r of n){let s=r;if(typeof s.Path!="string")continue;let o=typeof s.ID=="string"&&s.ID.length>0?s.ID:void 0;if(s.IsDir===!0){t.push({path:b(s.Path),id:o});continue}let i=typeof s.Size=="number"&&Number.isFinite(s.Size)?s.Size:0;e.push({path:b(s.Path),size:i,id:o})}return{files:e,directories:t}}async function zr(n){let e=Gr(n.directories);if(e.length===0)return n.files;let t=e.map(i=>i[0].path),r=n.files.filter(i=>!t.some(a=>cn(i.path,a))),s=$r(n.directories),o=[];for(let i of e)for(let a of i){if(!a.id)throw new Error(`Cannot preserve duplicate remote folder without a stable rclone folder ID: ${a.path}`);let l=de(a.path),c=Ct(l,s);s.add(c),o.push(...await ln({remote:n.remote,parentId:a.id,sourcePrefix:a.path,targetPrefix:c,extraArgs:n.extraArgs}))}return[...r,...o]}function Gr(n){let e=new Map;for(let o of n){let i=e.get(o.path)??[];i.push(o),e.set(o.path,i)}let t=Array.from(e.values()).filter(o=>o.length>1).sort((o,i)=>o[0].path.split("/").length-i[0].path.split("/").length),r=[],s=[];for(let o of t){let i=o[0].path;s.some(a=>cn(i,a))||(s.push(i),r.push(o))}return r}function $r(n){let e=new Map;for(let r of n)e.set(r.path,(e.get(r.path)??0)+1);let t=new Set;for(let r of n)(e.get(r.path)??0)>1||t.add(de(r.path));return t}async function ln(n){let e=await jr({remote:n.remote,parentId:n.parentId,extraArgs:n.extraArgs}),t=new Set,r=[];for(let s of e){if(typeof s.name!="string"||typeof s.id!="string")continue;let o=`${n.sourcePrefix}/${s.name}`,i=`${n.targetPrefix}/${de(s.name)}`,a=s.mimeType==="application/vnd.google-apps.folder"?Ct(i,t):St(i,t);if(t.add(a),s.mimeType==="application/vnd.google-apps.folder"){r.push(...await ln({remote:n.remote,parentId:s.id,sourcePrefix:o,targetPrefix:a,extraArgs:n.extraArgs}));continue}r.push({path:o,targetPath:a,size:Hr(s.size),id:s.id,requiresIdentityDownload:!0})}return r}function jr(n){let e=`'${Wr(n.parentId)}' in parents and trashed = false`;return new Promise((t,r)=>{let s=Oe("rclone",Dr({remote:n.remote,query:e,extraArgs:n.extraArgs}),{stdio:["ignore","pipe","pipe"]}),o="",i="";s.stdout.on("data",a=>{o+=a.toString()}),s.stderr.on("data",a=>{i+=a.toString()}),s.on("close",a=>{if(a!==0){r(new w(`Failed to query children for Google Drive folder ${n.parentId}`,i));return}try{let l=JSON.parse(o.trim()||"[]");if(l===null){t([]);return}if(!Array.isArray(l))throw new Error("rclone backend query did not return an array");t(l)}catch(l){r(new w(`Failed to parse children for Google Drive folder ${n.parentId}: ${l instanceof Error?l.message:String(l)}`,i))}}),s.on("error",a=>{r(new w(`Failed to start rclone: ${a.message}`,""))})})}function Hr(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 cn(n,e){return n===e||n.startsWith(`${e}/`)}function Wr(n){return n.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}function Kr(n){let e=A(n),t=b(n.path);return n.requiresIdentityDownload===!0||e!==t}async function qr(n){let e=K.join(n.localPath,A(n.file));if(await Be.promises.mkdir(K.dirname(e),{recursive:!0}),n.file.requiresIdentityDownload===!0){if(!n.file.id)throw new Error(`Cannot preserve duplicate remote file without a stable rclone file ID: ${n.file.path}`);await At({args:Or({remote:n.remote,fileId:n.file.id,localTargetPath:e,rcloneOptions:n.rcloneOptions}),remoteSource:`${n.remote}:${n.file.path}`,onProgress:n.onProgress});return}await At({args:_r({remoteFileSource:`${n.remote}:${Jr(n.remotePath,n.file.path)}`,localTargetPath:e,rcloneOptions:n.rcloneOptions}),remoteSource:`${n.remote}:${n.file.path}`,onProgress:n.onProgress})}function Jr(n,e){let t=n.replace(/\/+$/,""),r=e.replace(/^\/+/,"");return t.length===0?r:`${t}/${r}`}var Ne=class{#e;constructor(e){this.#e=e}get displayName(){return`${this.#e.remote}:${this.#e.remotePath}`}async prepare(){await Me()}async listFiles(){return on(this.#e.remote,this.#e.remotePath,this.#e.rcloneOptions.extraRcloneArgs??[])}resolveLocalFile(e,t){return Ue(e,t)}async materializeBatch(e){await an({remote:this.#e.remote,remotePath:this.#e.remotePath,localPath:e.batchDir,batchFilePath:e.batchFilePath,files:e.files,rcloneOptions:this.#e.rcloneOptions,onProgress:e.onProgress})}async shutdown(){}};import Et from"node:fs/promises";import wt from"node:path";var q=class{#e;constructor(e){this.#e=e}get displayName(){return this.#e.rootPath}async prepare(){let e=await Et.stat(this.#e.rootPath).catch(()=>null);if(!e||!e.isDirectory())throw new Error(`Local source path is not a readable directory: ${this.#e.rootPath}`)}async listFiles(){let e=[];return await this.#s(this.#e.rootPath,"",e),e.sort((t,r)=>t.path.localeCompare(r.path)),e}resolveLocalFile(e,t){let r=A(e);return{relativePath:r,absolutePath:wt.join(this.#e.rootPath,...e.path.split("/")),fileName:wt.posix.basename(r),size:e.size}}async materializeBatch(e){}async shutdown(){}async#s(e,t,r){let s=await Et.readdir(e,{withFileTypes:!0});for(let o of s){let i=wt.join(e,o.name),a=t===""?o.name:`${t}/${o.name}`;if(o.isDirectory()){await this.#s(i,a,r);continue}if(!o.isFile())continue;let l=await Et.stat(i);r.push({path:a,size:l.size})}}};import ze from"node:fs/promises";import ts from"node:path";import{spawn as Yr}from"node:child_process";var Vr=18e4,Qr=2e3,Xr=3e4,Zr=4e3,J=class{#e;#s;#t=null;#o="";#r=null;#n=!1;constructor(e){this.#e=e,this.#s=e.spawnFn??Yr}get isRunning(){return this.#t!==null&&this.#r===null}get daemonOutputTail(){return this.#o}async checkClientInstalled(){await this.#a({args:["list"],failureMessage:"LucidLink client is not installed or not in PATH. Install it from https://www.lucidlink.com/download before running aspect-sync sync lucidlink."})}async start(){if(this.#t)throw new Error("LucidLink daemon already started");let e=["--instance",String(this.#e.instanceId),"daemon","--fs",this.#e.filespace,"--user",this.#e.user,"--mount-point",this.#e.mountPoint,"--root-path",this.#e.cacheRootPath],t=this.#s("lucid",e,{stdio:["pipe","pipe","pipe"]});this.#t=t,t.stdout?.on("data",r=>this.#d(r)),t.stderr?.on("data",r=>this.#d(r)),t.on("exit",r=>{this.#r=r??-1,this.#n||console.error(`LucidLink daemon exited unexpectedly (code ${this.#r}). Recent output:
|
|
6
|
+
${this.#o}`)}),t.on("error",r=>{this.#r=-1,this.#d(Buffer.from(`spawn error: ${r.message}
|
|
7
7
|
`))}),t.stdin?.write(`${this.#e.password}
|
|
8
8
|
`),t.stdin?.end(),await this.#i(),this.#e.cacheSize&&await this.#a({args:["--instance",String(this.#e.instanceId),"config","--set","--local","--DataCache.Size",this.#e.cacheSize],failureMessage:`Failed to set LucidLink DataCache.Size to ${this.#e.cacheSize}`})}async stop(){let e=this.#t;if(!e||this.#r!==null){this.#t=null;return}this.#n=!0,await this.#a({args:["--instance",String(this.#e.instanceId),"exit"],failureMessage:"Failed to request LucidLink daemon exit"}).catch(t=>{console.error(t.message)}),await this.#u(e),this.#t=null}assertHealthy(){if(this.#t&&this.#r!==null&&!this.#n)throw new Error(`LucidLink daemon exited unexpectedly (code ${this.#r}). Recent output:
|
|
9
9
|
${this.#o}`)}async#i(){let e=this.#e.linkTimeoutMs??Vr,t=this.#e.linkPollIntervalMs??Qr,r=Date.now();for(;Date.now()-r<e;){if(this.#r!==null)throw new Error(`LucidLink daemon exited before linking (code ${this.#r}). Check the filespace name and credentials. Recent output:
|
|
10
10
|
`+this.#o);let s=await this.#c();if(s!==null&&/\bLinked\b/i.test(s))return;await es(t)}throw new Error(`Timed out after ${Math.round(e/1e3)}s waiting for LucidLink filespace "${this.#e.filespace}" to link. Recent daemon output:
|
|
11
|
-
${this.#o}`)}async#c(){return new Promise(e=>{let t=this.#s("lucid",["--instance",String(this.#e.instanceId),"status"],{stdio:["ignore","pipe","pipe"]}),r="";t.stdout?.on("data",s=>{r+=s.toString()}),t.on("exit",s=>{e(s===0?r:null)}),t.on("error",()=>{e(null)})})}#a(e){return new Promise((t,r)=>{let s=this.#s("lucid",e.args,{stdio:["ignore","pipe","pipe"]}),o="";s.stderr?.on("data",i=>{o+=i.toString()}),s.on("exit",i=>{i===0?t():r(new Error(`${e.failureMessage} (exit code ${i}): ${o.trim()}`))}),s.on("error",i=>{r(new Error(`${e.failureMessage}: ${i.message}`))})})}async#u(e){this.#r===null&&await new Promise(t=>{let r=setTimeout(()=>{e.kill("SIGKILL")},Xr);e.on("exit",()=>{clearTimeout(r),t()}),this.#r!==null&&(clearTimeout(r),t())})}#
|
|
12
|
-
`,{encoding:"utf-8",mode:384}),await je.chmod(n,384)}function vt(n){let e={clientId:n.clientId,accessToken:n.token.access_token,refreshToken:n.token.refresh_token??n.previousRefreshToken,expiresAt:new Date(Date.now()+n.token.expires_in*1e3).toISOString(),tokenType:n.token.token_type};return n.defaultAccountId&&(e.defaultAccountId=n.defaultAccountId),e}async function bn(n,e){let t=await n.text();if(!n.ok)throw new Error(`Adobe IMS ${e} failed: ${n.status} ${n.statusText} ${t}`);let s=JSON.parse(t);if(!s.access_token||typeof s.expires_in!="number")throw new Error(`Adobe IMS ${e} returned an invalid token response: ${t}`);return s}var We=class{#e;#s=null;#t=null;#o=null;#r=new Map;constructor(e){this.#e=e}get displayName(){return`frameio:${this.#e.accountId}/${this.#e.folderId}`}async prepare(){await(await this.#u()).validateFolderAccess({accountId:this.#e.accountId,folderId:this.#e.folderId})}async listFiles(){let e=await this.#u(),t=[];await this.#n({client:e,folderId:this.#e.folderId,relativePrefix:"",files:t}),t.sort((r,s)=>r.path.localeCompare(s.path)),this.#r.clear();for(let r of t)this.#r.set(r.id,r);return t}resolveLocalFile(e,t){return Ue(e,t)}async materializeBatch(e){let t={bytesTransferred:0,totalBytes:e.files.reduce((o,i)=>o+i.size,0),startedAt:Date.now()},r=0,s=async()=>{for(;r<e.files.length;){let o=r;r+=1,await this.#i({file:e.files[o],batchDir:e.batchDir,totals:t,onProgress:e.onProgress})}};await Promise.all(Array.from({length:Math.min(this.#e.downloadConcurrency,e.files.length)},()=>s()))}async shutdown(){}async#n(e){let t=await e.client.listFolderChildren({accountId:this.#e.accountId,folderId:e.folderId,pageSize:this.#e.pageSize});for(let r of t){if(r.type==="folder"){let o=r;await this.#n({client:e.client,folderId:o.id,relativePrefix:this.#a(e.relativePrefix,o.name),files:e.files});continue}if(r.type!=="file")continue;let s=Pt(r);e.files.push({id:s.id,path:this.#a(e.relativePrefix,s.name),size:s.sizeBytes})}}async#i(e){if(!e.file.id)throw new Error(`Frame.io listing missing file ID for ${e.file.path}`);let t=Fs.join(e.batchDir,A(e.file)),r=this.#r.get(e.file.id),o=await(await this.#u()).getFileWithOriginalMediaLink({accountId:this.#e.accountId,fileId:e.file.id}),i={...o,name:r?.path??o.name,sizeBytes:e.file.size},a=0;await dn({file:i,outputPath:t,onProgress:l=>{e.totals.bytesTransferred+=Math.max(l-a,0),a=l,e.onProgress?.(this.#c(e.totals))}})}#c(e){let t=Math.max((Date.now()-e.startedAt)/1e3,.001),r=e.bytesTransferred/t,s=Math.max(e.totalBytes-e.bytesTransferred,0);return{bytesTransferred:e.bytesTransferred,totalBytes:e.totalBytes,speed:r,eta:r>0?Math.ceil(s/r):0,percentComplete:e.totalBytes>0?e.bytesTransferred/e.totalBytes*100:100}}#a(e,t){let r=e===""?t:`${e}/${t}`;return b(r)}async#u(){if(this.#o)return await this.#o;this.#o=this.#
|
|
13
|
-
`))}#
|
|
14
|
-
`)}#P(e,t){let r=this.#y(),s=r.successFileCount+r.failedFileCount+r.cancelledFileCount,o=Math.max(t.batchFilesTotal-t.batchFilesSkipped,0),i=Math.max(t.batchBytesTotal-t.batchBytesSkipped,0),a=i>0?(r.uploadedBytes/i*100).toFixed(1):"0.0",l=this.#E(t,r,i),c=l?.formattedSpeed??null,u=l?.formattedTime??null,d=r.totalFileCount>0&&r.totalFileCount<o?`, ${f.gray(`Enqueued: ${r.totalFileCount}/${o}`)}`:"",m=c&&u?`, ${c}, ETA: ${u}`:"",g=t.batchFilesSkipped>0?`, ${f.yellow(`Skipped: ${t.batchFilesSkipped} files / ${h(t.batchBytesSkipped)}`)}`:"",p=i>0&&r.uploadedBytes>=i&&s<o?"Finalizing":"Uploading";return`${e}: ${f.blue(p)} (${s}/${o} files, ${h(r.uploadedBytes)} / ${h(i)}, ${a}%${d}${m}${g})`}#C(e){let t=this.#y(),r=e.batchFilesSkipped+t.successFileCount+t.failedFileCount+t.cancelledFileCount,s=e.batchBytesSkipped+t.uploadedBytes,o=e.overallFilesCompleted+r,i=e.overallBytesCompleted+s,a=Math.max(e.overallBytesTotal-i,0),l=this.#h(e),c=this.#b(e,t),u=l!==null&&c!==null?l+c:null;return[`Completed: ${o}/${e.overallFilesTotal} files`,`${h(i)} / ${h(e.overallBytesTotal)}`,f.yellow(`${h(a)} remaining`),`Download ETA: ${fe(l)??"..."}`,`Upload ETA: ${fe(c)??"..."}`,`Total ETA: ${fe(u)??"..."}`].join(", ")}#h(e){let t=e.overallBytesCompleted+e.batchBytesSkipped+(this.#r?.bytesTransferred??0),r=Math.max(e.overallBytesTotal-t,0);if(r===0)return e.currentPhase==="downloading"&&this.#r?(this.#i=this.#r.eta,this.#r.eta):(this.#i=0,0);if(this.#r&&this.#r.speed>0){let s=Math.ceil(r/this.#r.speed);return this.#i=s,s}return e.currentPhase==="uploading"||e.currentPhase==="cleaning"||e.currentPhase==="complete"?(this.#i=0,0):this.#i}#b(e,t){let r=e.overallBytesCompleted+e.batchBytesSkipped+t.uploadedBytes,s=Math.max(e.overallBytesTotal-r,0),o=Math.max(e.batchBytesTotal-e.batchBytesSkipped,0),i=this.#E(e,t,o);if(s===0)return e.currentPhase==="uploading"&&i?(this.#c=i.timeRemainingSeconds,i.timeRemainingSeconds):(this.#c=0,0);if(i&&i.uploadSpeedMbps>0){let a=i.uploadSpeedMbps*1024*1024/8,l=Math.ceil(s/a);return this.#c=l,l}return this.#c}#E(e,t,r){let s=this.#t?.uploadStats,o=r>0&&t.uploadedBytes>=r;return s&&s.uploadSpeedMbps>0&&s.formattedSpeed!=="Calculating..."&&!o?(this.#u={uploadSpeedMbps:s.uploadSpeedMbps,formattedSpeed:s.formattedSpeed,formattedTime:s.formattedTime,timeRemainingSeconds:s.timeRemainingSeconds},this.#u):e.currentPhase==="uploading"&&o&&this.#u?this.#u:s?{uploadSpeedMbps:s.uploadSpeedMbps,formattedSpeed:s.formattedSpeed,formattedTime:s.formattedTime,timeRemainingSeconds:s.timeRemainingSeconds}:null}#
|
|
15
|
-
`)})}get isJsonMode(){return this.#e.progressMode==="json"}start({kind:e,title:t,extraLines:r=[],humanMode:s="banner"}){if(this.#o=e,!this.isJsonMode){if(s==="message"){console.log(t);return}console.log(t),console.log(`Session: ${this.#e.sessionName}`),console.log(`Source: ${this.#s}`),console.log(`Root directory ID: ${this.#e.directoryId}`),console.log(`Project ID: ${this.#e.projectId}`),console.log(`Temp directory: ${this.#e.localTempDir}`),console.log(`Edge worker URL: ${this.#e.edgeWorkerUrl}`),console.log(`Shard: ${this.#U()}`);for(let o of r)console.log(o);console.log("");return}this.#h({jobId:this.#e.sessionName,type:"start",emittedAt:new Date().toISOString(),sessionName:this.#e.sessionName,sourceDisplayName:this.#s,aspectProjectId:this.#e.projectId,aspectDirectoryId:this.#e.directoryId,tempDir:this.#e.localTempDir,edgeWorkerUrl:this.#e.edgeWorkerUrl,message:[t,...r].join(" ").trim()||void 0,snapshot:this.#b({status:"running"})})}log(e){if(!this.isJsonMode){console.log(e);return}this.#I(e)}warn(e){if(!this.isJsonMode){console.warn(e);return}this.#I(e)}blank(){this.isJsonMode||console.log("")}startLiveDisplay(){this.isJsonMode||P.start()}stopLiveDisplay(){this.isJsonMode||P.stop()}updateBatchState(e){if(this.#r=e,!this.isJsonMode){P.updateBatchState(e);return}this.#P(e.extraDetails)}updateDownloadProgress(e){if(this.#i=e,!this.isJsonMode){P.updateDownloadProgress(e);return}e&&this.#P()}updateUploadSnapshot(e){if(this.#n=e,!this.isJsonMode){P.updateSnapshot(e);return}this.#P()}resetUploadSnapshot(){this.#n=null,this.#i=null,this.isJsonMode||(P.resetUploadSnapshot(),P.updateDownloadProgress(null))}persistCurrentBatchLine(){if(!this.#r||this.#r.currentPhase!=="complete")return;let e={batchNumber:this.#r.currentBatch,filesCompleted:this.#r.batchFilesTotal,bytesCompleted:this.#r.batchBytesTotal},t=this.#
|
|
11
|
+
${this.#o}`)}async#c(){return new Promise(e=>{let t=this.#s("lucid",["--instance",String(this.#e.instanceId),"status"],{stdio:["ignore","pipe","pipe"]}),r="";t.stdout?.on("data",s=>{r+=s.toString()}),t.on("exit",s=>{e(s===0?r:null)}),t.on("error",()=>{e(null)})})}#a(e){return new Promise((t,r)=>{let s=this.#s("lucid",e.args,{stdio:["ignore","pipe","pipe"]}),o="";s.stderr?.on("data",i=>{o+=i.toString()}),s.on("exit",i=>{i===0?t():r(new Error(`${e.failureMessage} (exit code ${i}): ${o.trim()}`))}),s.on("error",i=>{r(new Error(`${e.failureMessage}: ${i.message}`))})})}async#u(e){this.#r===null&&await new Promise(t=>{let r=setTimeout(()=>{e.kill("SIGKILL")},Xr);e.on("exit",()=>{clearTimeout(r),t()}),this.#r!==null&&(clearTimeout(r),t())})}#d(e){this.#o=(this.#o+e.toString()).slice(-Zr)}};function es(n){return new Promise(e=>setTimeout(e,n))}var Ge=class{#e;#s;#t;constructor(e,t){this.#e=e,this.#s=t??new J({filespace:e.filespace,user:e.user,password:e.password,instanceId:e.instanceId,mountPoint:e.mountPoint,cacheRootPath:e.cacheRootPath,cacheSize:e.cacheSize}),this.#t=new q({kind:"local",rootPath:this.#o()})}get displayName(){let e=this.#e.filespacePath===""?"":`/${this.#e.filespacePath}`;return`lucidlink:${this.#e.filespace}${e}`}async prepare(){await this.#s.checkClientInstalled(),await ze.mkdir(this.#e.mountPoint,{recursive:!0}),await ze.mkdir(this.#e.cacheRootPath,{recursive:!0}),console.log(`Mounting LucidLink filespace ${this.#e.filespace} at ${this.#e.mountPoint}...`),await this.#s.start(),console.log("Filespace linked and mounted");let e=await ze.stat(this.#o()).catch(()=>null);if(!e||!e.isDirectory())throw new Error(`Path "${this.#e.filespacePath}" does not exist in filespace ${this.#e.filespace}`)}async listFiles(){return this.#s.assertHealthy(),this.#t.listFiles()}resolveLocalFile(e,t){return this.#t.resolveLocalFile(e,t)}async materializeBatch(e){this.#s.assertHealthy(),await this.#t.materializeBatch(e)}async shutdown(){await this.#s.stop(),await ze.rm(this.#e.workDir,{recursive:!0,force:!0})}#o(){return this.#e.filespacePath===""?this.#e.mountPoint:ts.join(this.#e.mountPoint,...this.#e.filespacePath.split("/"))}};import Fs from"node:path";import un from"node:fs";import ns from"node:path";var rs="https://api.frame.io/v4",ss="https://api.frame.io",me=4,os=1e3,is=15e3,z=class{#e;constructor(e){this.#e=e.token}async listAccounts(){return(await this.#s("/accounts")).data}async listWorkspaces(e){return(await this.#s(`/accounts/${e}/workspaces`)).data}async listProjects(e){let t=[],r=`/accounts/${e.accountId}/workspaces/${e.workspaceId}/projects`,s={page_size:String(e.pageSize??100)};for(;r;){let o=await this.#s(r,s);t.push(...o.data),r=o.links?.next??null,s=void 0}return t}async listAccountProjects(e){let t=[],r=`/accounts/${e.accountId}/projects`,s={page_size:String(e.pageSize??100)};for(;r;){let o=await this.#s(r,s,{"api-version":"experimental"});t.push(...o.data),r=o.links?.next??null,s=void 0}return t}async getProject(e){let t=await this.#s(`/accounts/${e.accountId}/projects/${e.projectId}`);return"data"in t&&t.data?t.data:t}async listFolderChildren(e){let t=[],r=`/accounts/${e.accountId}/folders/${e.folderId}/children`,s={page_size:String(e.pageSize),type:"file,folder,version_stack",...e.includeOriginalMediaLinks?{include:"media_links.original"}:{}};for(;r;){let o=await this.#s(r,s);t.push(...o.data),r=o.links?.next??null,s=void 0}return t}async validateFolderAccess(e){await this.#s(`/accounts/${e.accountId}/folders/${e.folderId}/children`,{page_size:"1"})}async getFileWithOriginalMediaLink(e){let t=await this.#s(`/accounts/${e.accountId}/files/${e.fileId}`,{include:"media_links.original"}),r="data"in t&&t.data?t.data:t;return Pt(r)}async#s(e,t,r={}){let s=as(e);for(let[o,i]of Object.entries(t??{}))s.searchParams.set(o,i);for(let o=0;o<me;o+=1)try{let i=await fetch(s,{headers:{Authorization:`Bearer ${this.#e}`,Accept:"application/json",...r}});if(!i.ok){let a=await i.text().catch(()=>"");if(us(i)&&o<me-1){await It($e(i.headers.get("retry-after"),o));continue}throw new Error(`Frame.io API ${i.status} ${i.statusText} for ${s.pathname}: ${a}`)}return await i.json()}catch(i){if(pn(i)&&o<me-1){await It($e(null,o));continue}throw i}throw new Error(`Frame.io API request failed for ${s.pathname}`)}};function as(n){return n.startsWith("http")?new URL(n):n.startsWith("/v4/")?new URL(`${ss}${n}`):new URL(`${rs}${n}`)}function Pt(n){return{id:n.id,name:n.name??n.id,sizeBytes:ls(n),downloadUrl:n.media_links?.original?.download_url??void 0}}function ls(n){let e=[n.file_size,n.filesize,n.size,n.size_bytes,n.bytes];for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"){let r=Number(t);if(Number.isFinite(r))return r}}return 0}async function dn(n){if(!n.file.downloadUrl)throw new Error(`Frame.io file ${n.file.id} has no original download URL`);for(let e=0;e<me;e+=1)try{return await cs(n)}catch(t){if(ds(t)&&e<me-1){await It(ms(t,e));continue}throw t}throw new Error(`Download failed for ${n.file.name}`)}async function cs(n){if(!n.file.downloadUrl)throw new Error(`Frame.io file ${n.file.id} has no original download URL`);let e=new AbortController,t=n.maxSeconds===void 0?null:setTimeout(()=>e.abort(),n.maxSeconds*1e3),r=null,s=Date.now(),o=0;try{n.outputPath&&(await un.promises.mkdir(ns.dirname(n.outputPath),{recursive:!0}),r=un.createWriteStream(n.outputPath));let a=await fetch(n.file.downloadUrl,{signal:e.signal,headers:{Accept:"application/octet-stream"}});if(!a.ok||!a.body){let c=await a.text().catch(()=>"");throw new he(`Download failed for ${n.file.name}: ${a.status} ${a.statusText} ${c}`,a.status,a.headers.get("retry-after"))}let l=a.body.getReader();for(;;){let{done:c,value:u}=await l.read();if(c)break;o+=u.byteLength,n.onProgress?.(o),r&&await fs(r,u)}}catch(a){if(a.name!=="AbortError")throw a}finally{t&&clearTimeout(t),r&&await gs(r)}let i=Math.max((Date.now()-s)/1e3,.001);return{id:n.file.id,name:n.file.name,bytesRead:o,seconds:i,outputPath:n.outputPath}}var he=class extends Error{status;retryAfter;constructor(e,t,r){super(e),this.status=t,this.retryAfter=r}};function us(n){return n.status===408||n.status===425||n.status===429||n.status>=500}function ds(n){return n instanceof he?ps(n.status):pn(n)}function ps(n){return n===408||n===425||n===429||n>=500}function pn(n){if(!(n instanceof Error)||n.name==="AbortError")return!1;if(n instanceof TypeError)return!0;let e=n.code;return e==="ECONNRESET"||e==="ETIMEDOUT"||e==="UND_ERR_SOCKET"}function ms(n,e){return n instanceof he?$e(n.retryAfter,e):$e(null,e)}function $e(n,e){let t=hs(n);return t!==null?t:Math.min(os*2**e,is)}function hs(n){if(!n)return null;let e=Number(n);if(Number.isFinite(e))return Math.max(e*1e3,0);let t=Date.parse(n);return Number.isFinite(t)?Math.max(t-Date.now(),0):null}function It(n){return new Promise(e=>setTimeout(e,n))}function fs(n,e){return new Promise((t,r)=>{if(n.write(e)){t();return}n.once("drain",t),n.once("error",r)})}function gs(n){return new Promise((e,t)=>{n.end(e),n.once("error",t)})}import Rt from"node:crypto";import je from"node:fs/promises";import ys from"node:os";import mn from"node:path";var Ss="https://ims-na1.adobelogin.com/ims/authorize/v2",hn="https://ims-na1.adobelogin.com/ims/token/v3",Cs="eac24c58b3bb4e8ab26105ad17adf779",bs=300*1e3;function fn(){return process.env.FRAMEIO_CLIENT_ID||Cs}function Y(){return mn.join(ys.homedir(),".config","aspect-sync","frameio-auth.json")}function gn(){let n=Rt.randomBytes(32).toString("base64url"),e=Rt.createHash("sha256").update(n).digest("base64url");return{verifier:n,challenge:e}}function yn(n){let e=new URL(Ss);return e.searchParams.set("client_id",n.clientId),e.searchParams.set("scope","openid email profile offline_access additional_info.roles"),e.searchParams.set("response_type","code"),e.searchParams.set("code_challenge",n.codeChallenge),e.searchParams.set("code_challenge_method","S256"),e.searchParams.set("state",n.state??Rt.randomBytes(16).toString("hex")),e.toString()}function Sn(n){let e=n.trim();if(!e)throw new Error("Authorization code cannot be empty");if(!e.includes("code="))return e;let r=new URL(e).searchParams.get("code");if(!r)throw new Error("Redirect URL did not include a code parameter");return r}async function Cn(n){let e=await fetch(`${hn}?client_id=${encodeURIComponent(n.clientId)}`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({code:n.code,grant_type:"authorization_code",code_verifier:n.codeVerifier})});return bn(e,"authorization code exchange")}async function As(n){let e=await fetch(`${hn}?client_id=${encodeURIComponent(n.clientId)}`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:n.refreshToken})});return bn(e,"refresh token exchange")}async function He(){let n=Y(),e=await Tt(n),t=Date.parse(e.expiresAt);if(Number.isFinite(t)&&t-Date.now()>bs)return e.accessToken;if(!e.refreshToken)throw new Error(`Frame.io auth file ${n} has no refresh token; run aspect-sync frameio login`);let r=await As({clientId:e.clientId,refreshToken:e.refreshToken}),s=vt({clientId:e.clientId,token:r,previousRefreshToken:e.refreshToken,defaultAccountId:e.defaultAccountId});return await kt(n,s),s.accessToken}async function Tt(n){let e=await je.readFile(n,"utf-8").catch(t=>{throw t.code==="ENOENT"?new Error(`Frame.io auth file not found at ${n}; run aspect-sync frameio login`):t});return JSON.parse(e)}async function kt(n,e){await je.mkdir(mn.dirname(n),{recursive:!0}),await je.writeFile(n,`${JSON.stringify(e,null,2)}
|
|
12
|
+
`,{encoding:"utf-8",mode:384}),await je.chmod(n,384)}function vt(n){let e={clientId:n.clientId,accessToken:n.token.access_token,refreshToken:n.token.refresh_token??n.previousRefreshToken,expiresAt:new Date(Date.now()+n.token.expires_in*1e3).toISOString(),tokenType:n.token.token_type};return n.defaultAccountId&&(e.defaultAccountId=n.defaultAccountId),e}async function bn(n,e){let t=await n.text();if(!n.ok)throw new Error(`Adobe IMS ${e} failed: ${n.status} ${n.statusText} ${t}`);let s=JSON.parse(t);if(!s.access_token||typeof s.expires_in!="number")throw new Error(`Adobe IMS ${e} returned an invalid token response: ${t}`);return s}var We=class{#e;#s=null;#t=null;#o=null;#r=new Map;constructor(e){this.#e=e}get displayName(){return`frameio:${this.#e.accountId}/${this.#e.folderId}`}async prepare(){await(await this.#u()).validateFolderAccess({accountId:this.#e.accountId,folderId:this.#e.folderId})}async listFiles(){let e=await this.#u(),t=[];await this.#n({client:e,folderId:this.#e.folderId,relativePrefix:"",files:t}),t.sort((r,s)=>r.path.localeCompare(s.path)),this.#r.clear();for(let r of t)this.#r.set(r.id,r);return t}resolveLocalFile(e,t){return Ue(e,t)}async materializeBatch(e){let t={bytesTransferred:0,totalBytes:e.files.reduce((o,i)=>o+i.size,0),startedAt:Date.now()},r=0,s=async()=>{for(;r<e.files.length;){let o=r;r+=1,await this.#i({file:e.files[o],batchDir:e.batchDir,totals:t,onProgress:e.onProgress})}};await Promise.all(Array.from({length:Math.min(this.#e.downloadConcurrency,e.files.length)},()=>s()))}async shutdown(){}async#n(e){let t=await e.client.listFolderChildren({accountId:this.#e.accountId,folderId:e.folderId,pageSize:this.#e.pageSize});for(let r of t){if(r.type==="folder"){let o=r;await this.#n({client:e.client,folderId:o.id,relativePrefix:this.#a(e.relativePrefix,o.name),files:e.files});continue}if(r.type!=="file")continue;let s=Pt(r);e.files.push({id:s.id,path:this.#a(e.relativePrefix,s.name),size:s.sizeBytes})}}async#i(e){if(!e.file.id)throw new Error(`Frame.io listing missing file ID for ${e.file.path}`);let t=Fs.join(e.batchDir,A(e.file)),r=this.#r.get(e.file.id),o=await(await this.#u()).getFileWithOriginalMediaLink({accountId:this.#e.accountId,fileId:e.file.id}),i={...o,name:r?.path??o.name,sizeBytes:e.file.size},a=0;await dn({file:i,outputPath:t,onProgress:l=>{e.totals.bytesTransferred+=Math.max(l-a,0),a=l,e.onProgress?.(this.#c(e.totals))}})}#c(e){let t=Math.max((Date.now()-e.startedAt)/1e3,.001),r=e.bytesTransferred/t,s=Math.max(e.totalBytes-e.bytesTransferred,0);return{bytesTransferred:e.bytesTransferred,totalBytes:e.totalBytes,speed:r,eta:r>0?Math.ceil(s/r):0,percentComplete:e.totalBytes>0?e.bytesTransferred/e.totalBytes*100:100}}#a(e,t){let r=e===""?t:`${e}/${t}`;return b(r)}async#u(){if(this.#o)return await this.#o;this.#o=this.#d();try{return await this.#o}finally{this.#o=null}}async#d(){let e=await He();return(!this.#s||this.#t!==e)&&(this.#s=new z({token:e}),this.#t=e),this.#s}};function V(n){switch(n.kind){case"rclone":return new Ne(n);case"local":return new q(n);case"lucidlink":return new Ge(n);case"frameio":return new We(n);default:{let e=n;throw new Error(`Unsupported sync source: ${JSON.stringify(e)}`)}}}import*as qe from"fs/promises";import*as Je from"path";var Es={".mp4":"video/mp4",".mov":"video/quicktime",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".webm":"video/webm",".wmv":"video/x-ms-wmv",".flv":"video/x-flv",".m4v":"video/x-m4v",".mpg":"video/mpeg",".mpeg":"video/mpeg",".3gp":"video/3gpp",".ts":"video/mp2t",".mts":"video/mp2t",".mxf":"application/mxf",".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".tiff":"image/tiff",".tif":"image/tiff",".svg":"image/svg+xml",".heic":"image/heic",".heif":"image/heif",".avif":"image/avif",".mp3":"audio/mpeg",".wav":"audio/wav",".aac":"audio/aac",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".wma":"audio/x-ms-wma",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".rtf":"application/rtf",".json":"application/json",".xml":"application/xml"};function ws(n){let e=Je.extname(n).toLowerCase();return Es[e]??""}var Ke=class n{#e;#s=null;#t=null;#o=!1;#r;#n;#i;constructor(e,t,r,s){this.#e=e,this.#r=t,this.#n=r,this.#i=s}static async create(e){let t=await qe.stat(e),r=Je.basename(e),s=ws(r);return new n(e,t.size,r,s)}get name(){return this.#n}get size(){return this.#r}get type(){return this.#i}async readChunk(e,t){if(!this.#s){this.#t||(this.#t=qe.open(this.#e,"r"));let o=await this.#t;if(this.#t=null,this.#o)return Buffer.alloc(0);this.#s=o}let r=t-e,s=Buffer.alloc(r);return await this.#s.read(s,0,r,e),s}async close(){this.#o=!0;let e=this.#t;await this.#s?.close(),this.#s=null,e&&await(await e.catch(()=>null))?.close(),this.#t=null}};var Is=new Set(["success","failed","cancelled"]),An=1e3,Ps=250,Rs=4*1024*1024,Lt=class{#e;name;constructor(e,t){this.#e=e,this.name=t}get size(){return this.#e.size}get type(){return this.#e.type}readChunk(e,t){return this.#e.readChunk(e,t)}async close(){await this.#e.close?.()}},Ye=class{#e;#s;#t;#o;#r;constructor(e){this.#e=e.config,this.#s=e.httpClient??new x({apiUrl:e.config.apiUrl,apiKey:e.config.apiKey,edgeWorkerUrl:e.config.edgeWorkerUrl,sessionId:e.config.sessionName}),this.#t=e.createFileReader??(t=>Ke.create(t)),this.#o=e.onSnapshot,this.#r=e.analytics}async uploadFiles(e){let t=e.filter(a=>a.preSkipped===!0),r=e.filter(a=>a.preSkipped!==!0);if(r.length===0)return{totalFileCount:e.length,successFileCount:0,skippedFileCount:t.length,failedFileCount:0,cancelledFileCount:0,failedFiles:[]};let s=new le({httpClient:this.#s,maxConcurrency:this.#e.maxConcurrent,deltaIntervalMs:An,adaptiveConcurrency:!1,analytics:this.#r}),o=[],i=0;try{let a=s.startGroupUpload({name:`${r.length} files`,type:"files",fileCount:r.length,folderCount:0,topLevelFileCount:r.length,topLevelFolderCount:0,rootDirectoryId:this.#e.directoryId,projectId:this.#e.projectId,totalBytes:r.reduce((c,u)=>c+u.file.size,0),conflictResolutionOverride:"skip"});for(let c of r){let u=await this.#t(c.file.absolutePath),d=u.name===c.file.fileName?u:new Lt(u,c.file.fileName),m=s.startUpload({fileReader:d,directoryId:c.directoryId,projectId:this.#e.projectId,groupId:a,chunkSize:Rs});s.addAssetToGroup(a,m),o.push({assetId:m,file:c.file,fileReader:d});let g=Date.now();(o.length===1||o.length===r.length||g-i>=Ps)&&(i=g,this.#o?.(s.getSnapshot()))}await this.#n(s);let l=s.getSnapshot();return this.#o?.(l),this.#i({snapshot:l,startedUploads:o,preSkippedCount:t.length})}finally{s.destroy()}}async#n(e){let r=Date.now();for(;Date.now()-r<864e5;){let s=e.getSnapshot();this.#o?.(s);let o=Object.values(s.uploadAssets);if(o.length>0&&o.every(i=>Is.has(i.status)))return;await new Promise(i=>setTimeout(i,An))}throw new Error("Timed out waiting for upload session to finish")}#i(e){let t=[],r=0,s=0,o=0,i=0;for(let a of e.startedUploads){let l=e.snapshot.uploadAssets[a.assetId];if(!l){o+=1,t.push({fileName:a.file.fileName,relativePath:a.file.relativePath,errorMessage:"Upload state missing from upload engine"});continue}if(l.status==="success"){this.#s.skippedAssetIds.has(a.assetId)?s+=1:r+=1;continue}l.status==="cancelled"?i+=1:o+=1,t.push({fileName:a.file.fileName,relativePath:a.file.relativePath,errorMessage:l.errorMessage})}return{totalFileCount:e.startedUploads.length+e.preSkippedCount,successFileCount:r,skippedFileCount:e.preSkippedCount+s,failedFileCount:o,cancelledFileCount:i,failedFiles:t}}};var h=(n,e=2)=>{if(n===0)return"0 B";let t=1e3,r=e<0?0:e,s=["B","KB","MB","GB","TB","PB","EB"],o=Math.floor(Math.log(n)/Math.log(t));return`${(n/Math.pow(t,o)).toFixed(r)} ${s[o]}`},Ve=n=>{if(n===null)return null;let t=n*8/(1e3*1e3);return t<1?`${(t*1e3).toFixed(0)} Kbps`:`${t.toFixed(1)} Mbps`},fe=n=>{if(n===null)return null;let e=Math.floor(n/3600),t=Math.floor(n%3600/60),r=Math.floor(n%60);return e>0?`${e}h ${t}m`:t>0?`${t}m ${r}s`:`${r}s`};function Fn(n,e){return!e||e.count===1?n:n.filter(t=>Ts(A(t),e.count)===e.index)}function Ts(n,e){let t=2166136261;for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0)%e}import f from"chalk";import En from"log-update";var ks=1e3,Ut=class{#e=null;#s=!1;#t=null;#o=null;#r=null;#n=new Map;#i=null;#c=null;#a=null;#u=null;start(){this.#s||(this.#s=!0,this.#n.clear(),this.#i=null,this.#c=null,this.#a=null,this.#u=null,this.#e=setInterval(()=>this.render(),ks))}stop(){this.#s&&(this.#s=!1,this.#e&&(clearInterval(this.#e),this.#e=null),this.render(),En.done())}updateSnapshot(e){this.#t=e}updateBatchState(e){this.#o=e}updateDownloadProgress(e){if(!e){this.#r=null;return}let t=e.percentComplete>=100||e.bytesTransferred>=e.totalBytes;!t&&e.speed>0&&(this.#a=e),this.#r=t&&this.#a?{...e,speed:this.#a.speed,eta:this.#a.eta}:e}persistCurrentBatchLine(){!this.#o||this.#o.currentPhase!=="complete"||this.#n.set(this.#o.currentBatch,this.#g(this.#o))}resetUploadSnapshot(){this.#t=null,this.#r=null,this.#a=null,this.#u=null}render(){if(!this.#s)return;let e=this.#o?this.#R(this.#o):this.#l();En(e.join(`
|
|
13
|
+
`))}#d(e,t){let r=[`${f.green(h(t.bytesTransferred))} / ${f.gray(h(t.totalBytes))}`,f.cyan(`${t.percentComplete.toFixed(1)}%`),f.magenta(Ve(t.speed)??"..."),`${f.yellow("ETA")}: ${f.yellow(fe(t.eta)??"...")}`];return`${f.blue(e)}: ${r.join(" | ")}`}#l(){let e=this.#y();return[this.#T(e),this.#m(e)]}#R(e){let t=[];for(let r=1;r<e.currentBatch;r++){let s=this.#n.get(r);s&&t.push(s)}return t.push(this.#g(e)),t.push(this.#C(e)),t}#g(e){let t=`Batch ${e.currentBatch}/${e.totalBatches}`;switch(e.currentPhase){case"downloading":return this.#r?this.#I(t,this.#r):`${t}: ${f.blue("Downloading...")}`;case"scanning":return`${t}: ${f.yellow(e.extraDetails??"Scanning...")}`;case"syncing_folders":return`${t}: ${f.yellow(e.extraDetails??"Syncing folders...")}`;case"uploading":return this.#P(t,e);case"cleaning":return`${t}: ${f.yellow("Cleaning...")}`;case"complete":return`${t}: ${f.green("Complete")} (${e.batchFilesTotal} files, ${h(e.batchBytesTotal)}${e.extraDetails?`, ${e.extraDetails}`:""})`}}#I(e,t){let r=t.aggregate?[`${e}: ${this.#d("Downloading batch",t.aggregate)}`]:[`${e}: ${f.blue("Downloading...")}`];return t.currentFile&&r.push(this.#d("Downloading current file",t.currentFile)),r.join(`
|
|
14
|
+
`)}#P(e,t){let r=this.#y(),s=r.successFileCount+r.failedFileCount+r.cancelledFileCount,o=Math.max(t.batchFilesTotal-t.batchFilesSkipped,0),i=Math.max(t.batchBytesTotal-t.batchBytesSkipped,0),a=i>0?(r.uploadedBytes/i*100).toFixed(1):"0.0",l=this.#E(t,r,i),c=l?.formattedSpeed??null,u=l?.formattedTime??null,d=r.totalFileCount>0&&r.totalFileCount<o?`, ${f.gray(`Enqueued: ${r.totalFileCount}/${o}`)}`:"",m=c&&u?`, ${c}, ETA: ${u}`:"",g=t.batchFilesSkipped>0?`, ${f.yellow(`Skipped: ${t.batchFilesSkipped} files / ${h(t.batchBytesSkipped)}`)}`:"",p=i>0&&r.uploadedBytes>=i&&s<o?"Finalizing":"Uploading";return`${e}: ${f.blue(p)} (${s}/${o} files, ${h(r.uploadedBytes)} / ${h(i)}, ${a}%${d}${m}${g})`}#C(e){let t=this.#y(),r=e.batchFilesSkipped+t.successFileCount+t.failedFileCount+t.cancelledFileCount,s=e.batchBytesSkipped+t.uploadedBytes,o=e.overallFilesCompleted+r,i=e.overallBytesCompleted+s,a=Math.max(e.overallBytesTotal-i,0),l=this.#h(e),c=this.#b(e,t),u=l!==null&&c!==null?l+c:null;return[`Completed: ${o}/${e.overallFilesTotal} files`,`${h(i)} / ${h(e.overallBytesTotal)}`,f.yellow(`${h(a)} remaining`),`Download ETA: ${fe(l)??"..."}`,`Upload ETA: ${fe(c)??"..."}`,`Total ETA: ${fe(u)??"..."}`].join(", ")}#h(e){let t=e.overallBytesCompleted+e.batchBytesSkipped+(this.#r?.bytesTransferred??0),r=Math.max(e.overallBytesTotal-t,0);if(r===0)return e.currentPhase==="downloading"&&this.#r?(this.#i=this.#r.eta,this.#r.eta):(this.#i=0,0);if(this.#r&&this.#r.speed>0){let s=Math.ceil(r/this.#r.speed);return this.#i=s,s}return e.currentPhase==="uploading"||e.currentPhase==="cleaning"||e.currentPhase==="complete"?(this.#i=0,0):this.#i}#b(e,t){let r=e.overallBytesCompleted+e.batchBytesSkipped+t.uploadedBytes,s=Math.max(e.overallBytesTotal-r,0),o=Math.max(e.batchBytesTotal-e.batchBytesSkipped,0),i=this.#E(e,t,o);if(s===0)return e.currentPhase==="uploading"&&i?(this.#c=i.timeRemainingSeconds,i.timeRemainingSeconds):(this.#c=0,0);if(i&&i.uploadSpeedMbps>0){let a=i.uploadSpeedMbps*1024*1024/8,l=Math.ceil(s/a);return this.#c=l,l}return this.#c}#E(e,t,r){let s=this.#t?.uploadStats,o=r>0&&t.uploadedBytes>=r;return s&&s.uploadSpeedMbps>0&&s.formattedSpeed!=="Calculating..."&&!o?(this.#u={uploadSpeedMbps:s.uploadSpeedMbps,formattedSpeed:s.formattedSpeed,formattedTime:s.formattedTime,timeRemainingSeconds:s.timeRemainingSeconds},this.#u):e.currentPhase==="uploading"&&o&&this.#u?this.#u:s?{uploadSpeedMbps:s.uploadSpeedMbps,formattedSpeed:s.formattedSpeed,formattedTime:s.formattedTime,timeRemainingSeconds:s.timeRemainingSeconds}:null}#T(e){return[`Total: ${e.totalFileCount}`,f.green(`Success: ${e.successFileCount}`),f.red(`Failed: ${e.failedFileCount}`),f.red(`Cancelled: ${e.cancelledFileCount}`),f.blue(`Active: ${e.activeFileCount}`),f.gray(`Queued: ${e.queuedFileCount}`)].join(" | ")}#m(e){let t=Math.max(e.totalBytes-e.uploadedBytes,0),r=this.#t?` | ${f.cyan(`Speed: ${this.#t.uploadStats.formattedSpeed}`)} | ${f.magenta(`Time remaining: ${this.#t.uploadStats.formattedTime}`)}`:"";return[`Total: ${h(e.totalBytes)}`,f.green(`Uploaded: ${h(e.uploadedBytes)}`),f.yellow(`Remaining: ${h(t)}`)].join(" | ")+r}#y(){return this.#t?Object.values(this.#t.uploadAssets).reduce((t,r)=>{switch(t.totalFileCount+=1,t.totalBytes+=r.totalBytesToUpload,t.uploadedBytes+=r.status==="success"?r.totalBytesToUpload:r.bytesUploaded,r.status){case"success":t.successFileCount+=1;break;case"failed":t.failedFileCount+=1;break;case"cancelled":t.cancelledFileCount+=1;break;case"in-progress":t.activeFileCount+=1;break;default:t.queuedFileCount+=1;break}return t},{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}):{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}}},P=new Ut;var Qe=class{#e;#s;#t;#o="sync";#r=null;#n=null;#i=null;#c=null;#a=null;#u;#d=[];#l=null;#R=null;constructor(e){this.#e=e.config,this.#s=e.sourceDisplayName,this.#t=e.writeJsonLine??(t=>{process.stdout.write(`${t}
|
|
15
|
+
`)})}get isJsonMode(){return this.#e.progressMode==="json"}start({kind:e,title:t,extraLines:r=[],humanMode:s="banner"}){if(this.#o=e,!this.isJsonMode){if(s==="message"){console.log(t);return}console.log(t),console.log(`Session: ${this.#e.sessionName}`),console.log(`Source: ${this.#s}`),console.log(`Root directory ID: ${this.#e.directoryId}`),console.log(`Project ID: ${this.#e.projectId}`),console.log(`Temp directory: ${this.#e.localTempDir}`),console.log(`Edge worker URL: ${this.#e.edgeWorkerUrl}`),console.log(`Shard: ${this.#U()}`);for(let o of r)console.log(o);console.log("");return}this.#h({jobId:this.#e.sessionName,type:"start",emittedAt:new Date().toISOString(),sessionName:this.#e.sessionName,sourceDisplayName:this.#s,aspectProjectId:this.#e.projectId,aspectDirectoryId:this.#e.directoryId,tempDir:this.#e.localTempDir,edgeWorkerUrl:this.#e.edgeWorkerUrl,message:[t,...r].join(" ").trim()||void 0,snapshot:this.#b({status:"running"})})}log(e){if(!this.isJsonMode){console.log(e);return}this.#I(e)}warn(e){if(!this.isJsonMode){console.warn(e);return}this.#I(e)}blank(){this.isJsonMode||console.log("")}startLiveDisplay(){this.isJsonMode||P.start()}stopLiveDisplay(){this.isJsonMode||P.stop()}updateBatchState(e){if(this.#r=e,!this.isJsonMode){P.updateBatchState(e);return}this.#P(e.extraDetails)}updateDownloadProgress(e){if(this.#i=e,!this.isJsonMode){P.updateDownloadProgress(e);return}e&&this.#P()}updateUploadSnapshot(e){if(this.#n=e,!this.isJsonMode){P.updateSnapshot(e);return}this.#P()}resetUploadSnapshot(){this.#n=null,this.#i=null,this.isJsonMode||(P.resetUploadSnapshot(),P.updateDownloadProgress(null))}persistCurrentBatchLine(){if(!this.#r||this.#r.currentPhase!=="complete")return;let e={batchNumber:this.#r.currentBatch,filesCompleted:this.#r.batchFilesTotal,bytesCompleted:this.#r.batchBytesTotal},t=this.#d.findIndex(r=>r.batchNumber===e.batchNumber);if(t===-1?this.#d.push(e):this.#d[t]=e,!this.isJsonMode){P.persistCurrentBatchLine();return}this.#h({jobId:this.#e.sessionName,type:"batch_complete",emittedAt:new Date().toISOString(),batch:e,snapshot:this.#b({status:"running"})})}recordSourceListing({files:e,humanDescription:t="files",includeHumanTotal:r=!0}){this.#c=e.length,this.#a=vs(e),this.isJsonMode||(console.log(`Found ${this.#c} ${t}`),r&&console.log(`Total size: ${h(this.#a)}`),console.log("")),this.#g()}recordPathRenameWarnings(e){if(this.#u=e,!this.isJsonMode){let t=e.sample.map(o=>`${o.sourcePath} -> ${o.targetPath}`).join(`
|
|
16
16
|
`),r=e.count-e.sample.length,s=r>0?`
|
|
17
17
|
...and ${r} more renamed target path(s)`:"";console.warn(`Warning: ${e.count} remote file path(s) were renamed for Aspect compatibility.
|
|
18
18
|
${t}${s}
|
|
19
|
-
`),console.log("")}this.#g()}printSummary({summary:e,extraLines:t=[]}){if(!this.isJsonMode){console.log(""),console.log("=".repeat(60)),console.log("Sync Summary"),console.log("=".repeat(60)),console.log(`Total files: ${e.totalFileCount}`),console.log(`Successful: ${e.successFileCount}`),console.log(`Skipped: ${e.skippedFileCount}`),console.log(`Failed: ${e.failedFileCount}`),console.log(`Cancelled: ${e.cancelledFileCount}`);for(let r of t)console.log(r);if(console.log("=".repeat(60)),e.failedFiles.length>0){console.log(""),console.log("Failed files:");for(let r of e.failedFiles)console.log(` - ${r.relativePath}: ${r.errorMessage??"Unknown error"}`)}}this.#C({result:this.#w(e),message:t.join(" ")||void 0})}printCheckSummary(e){let t=[...e.missingFiles.map(o=>({name:o.relativePath.split("/").at(-1)??o.relativePath,relativePath:o.relativePath,errorMessage:"Missing on server"})),...e.sizeMismatches.map(o=>({name:o.relativePath.split("/").at(-1)??o.relativePath,relativePath:o.relativePath,errorMessage:`Size mismatch: source ${o.remoteSizeBytes}, server ${o.serverSizeBytes}`})),...e.extraUploadedFiles.map(o=>({name:o.relativePath.split("/").at(-1)??o.relativePath,relativePath:o.relativePath,errorMessage:"Extra uploaded file on server"})),...e.incompleteServerFiles.map(o=>({name:o.relativePath.split("/").at(-1)??o.relativePath,relativePath:o.relativePath,errorMessage:"Incomplete upload on server"}))],r=e.existingCount+e.pathOnlyMatchCount,s={jobId:this.#e.sessionName,status:t.length>0?"failed":"succeeded",successCount:r,skippedCount:0,failedCount:t.length,cancelledCount:0,completedBytes:0,failedFiles:t,completedAt:new Date().toISOString()};this.#C({result:s,stateOverrides:{overall:{filesCompleted:r,filesTotal:e.totalRemoteCount,bytesCompleted:0,bytesTotal:0,bytesRemaining:0,downloadEtaSeconds:0,uploadEtaSeconds:0,totalEtaSeconds:0},counts:{total:e.totalRemoteCount,success:r,failed:t.length,cancelled:0,active:0,queued:0,skipped:0},failedFiles:t}})}#g(){if(!this.isJsonMode||this.#c===null||this.#a===null)return;let e={jobId:this.#e.sessionName,type:"listing",emittedAt:new Date().toISOString(),filesTotal:this.#c,bytesTotal:this.#a,pathRenameWarnings:this.#u,snapshot:this.#b({status:"running",stateOverrides:{overall:{filesCompleted:0,filesTotal:this.#c,bytesCompleted:0,bytesTotal:this.#a,bytesRemaining:this.#a,downloadEtaSeconds:0,uploadEtaSeconds:0,totalEtaSeconds:0}}})};this.#h(e)}#I(e){this.#h({jobId:this.#e.sessionName,type:"progress",emittedAt:new Date().toISOString(),phase:this.#d(),message:e,snapshot:this.#b({status:"running"})})}#P(e){this.#h({jobId:this.#e.sessionName,type:"progress",emittedAt:new Date().toISOString(),phase:this.#d(),message:e,snapshot:this.#b({status:"running"})})}#C({result:e,message:t,stateOverrides:r}){this.isJsonMode&&this.#h({jobId:this.#e.sessionName,type:"summary",emittedAt:e.completedAt,result:e,message:t,snapshot:this.#b({status:e.status,stateOverrides:r})})}#h(e){this.#t(JSON.stringify(e))}#b({status:e,stateOverrides:t}){let r=this.#v(),s=this.#r?{current:this.#r.currentBatch,total:this.#r.totalBatches,filesTotal:this.#r.batchFilesTotal,bytesTotal:this.#r.batchBytesTotal,filesSkipped:this.#r.batchFilesSkipped,bytesSkipped:this.#r.batchBytesSkipped}:void 0,o=this.#r?this.#E({batchState:this.#r,counts:r}):void 0,i=this.#i?{bytesTransferred:this.#i.bytesTransferred,bytesTotal:this.#i.totalBytes,percent:this.#i.percentComplete,speedBps:this.#i.speed,etaSeconds:this.#i.eta}:void 0,a=this.#i?.currentFile?{bytesTransferred:this.#i.currentFile.bytesTransferred,bytesTotal:this.#i.currentFile.totalBytes,percent:this.#i.currentFile.percentComplete,speedBps:this.#i.currentFile.speed,etaSeconds:this.#i.currentFile.eta}:void 0,l={downloadBps:i?.speedBps??0,uploadBps:o?.speedBps??0};return{jobId:this.#e.sessionName,kind:this.#o,status:e,phase:this.#d(),sessionName:this.#e.sessionName,sourceDisplayName:this.#s,aspectProjectId:this.#e.projectId,aspectDirectoryId:this.#e.directoryId,tempDir:this.#e.localTempDir,edgeWorkerUrl:this.#e.edgeWorkerUrl,batch:s,download:i,downloadCurrentFile:a,upload:o,counts:this.#R(r),overall:this.#r?this.#m({batchState:this.#r,counts:r,uploadProgress:o}):void 0,throughput:l,pathRenameWarnings:this.#u,completedBatches:this.#p,failedFiles:[],cancelRequested:!1,discardStagingRequested:!1,updatedAt:new Date().toISOString(),...t}}#E({batchState:e,counts:t}){let r=Math.max(e.batchFilesTotal-e.batchFilesSkipped,0),s=Math.max(e.batchBytesTotal-e.batchBytesSkipped,0),o=s>0?t.uploadedBytes/s*100:0,i=this.#f();return{filesCompleted:t.successFileCount+t.failedFileCount+t.cancelledFileCount,filesTotal:r,bytesUploaded:t.uploadedBytes,bytesTotal:s,percent:o,enqueued:t.totalFileCount,speedBps:i,etaSeconds:this.#T({batchState:e,counts:t,uploadBytesTotal:s,speedBps:i})}}#R(e){return{total:e.totalFileCount,success:e.successFileCount,failed:e.failedFileCount,cancelled:e.cancelledFileCount,active:e.activeFileCount,queued:e.queuedFileCount,skipped:this.#r?.batchFilesSkipped??0}}#m({batchState:e,counts:t,uploadProgress:r}){let s=e.batchFilesSkipped+t.successFileCount+t.failedFileCount+t.cancelledFileCount,o=e.batchBytesSkipped+t.uploadedBytes,i=e.overallFilesCompleted+s,a=e.overallBytesCompleted+o,l=Math.max(e.overallBytesTotal-a,0),c=this.#y(e),u=r?.etaSeconds??0;return{filesCompleted:i,filesTotal:e.overallFilesTotal,bytesCompleted:a,bytesTotal:e.overallBytesTotal,bytesRemaining:l,downloadEtaSeconds:c,uploadEtaSeconds:u,totalEtaSeconds:c+u}}#y(e){let t=e.overallBytesCompleted+e.batchBytesSkipped+(this.#i?.bytesTransferred??0),r=Math.max(e.overallBytesTotal-t,0);if(r===0)return this.#l=0,0;if(this.#i&&this.#i.speed>0){let s=Math.ceil(r/this.#i.speed);return this.#l=s,s}return e.currentPhase==="uploading"||e.currentPhase==="cleaning"||e.currentPhase==="complete"?(this.#l=0,0):this.#l??0}#T({batchState:e,counts:t,uploadBytesTotal:r,speedBps:s}){let o=e.overallBytesCompleted+e.batchBytesSkipped+t.uploadedBytes,i=Math.max(e.overallBytesTotal-o,0);if(i===0)return this.#k=0,0;if(s>0&&r>0){let a=Math.ceil(i/s);return this.#k=a,a}return this.#k??0}#d(){if(!this.#r)return"scanning";if(this.#r.currentPhase==="uploading"){let e=this.#v(),t=Math.max(this.#r.batchFilesTotal-this.#r.batchFilesSkipped,0),r=Math.max(this.#r.batchBytesTotal-this.#r.batchBytesSkipped,0),s=e.successFileCount+e.failedFileCount+e.cancelledFileCount;if(r>0&&e.uploadedBytes>=r&&s<t)return"finalizing"}switch(this.#r.currentPhase){case"downloading":return"downloading";case"scanning":return"scanning";case"syncing_folders":return"syncing_folders";case"uploading":return"uploading";case"cleaning":return"cleaning";case"complete":return"complete";default:return this.#r.currentPhase}}#v(){return this.#n?Object.values(this.#n.uploadAssets).reduce((t,r)=>{switch(t.totalFileCount+=1,t.totalBytes+=r.totalBytesToUpload,t.uploadedBytes+=r.status==="success"?r.totalBytesToUpload:r.bytesUploaded,r.status){case"success":t.successFileCount+=1;break;case"failed":t.failedFileCount+=1;break;case"cancelled":t.cancelledFileCount+=1;break;case"in-progress":t.activeFileCount+=1;break;default:t.queuedFileCount+=1;break}return t},{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}):{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}}#f(){let e=this.#n?.uploadStats.uploadSpeedMbps;return e===void 0||e<=0||!Number.isFinite(e)?0:e*1024*1024/8}#w(e){let t=e.failedFiles.map(s=>({name:s.fileName??s.relativePath.split("/").at(-1)??s.relativePath,relativePath:s.relativePath,errorMessage:s.errorMessage??"Unknown error"})),r=e.cancelledFileCount>0&&e.failedFileCount===0?"cancelled":e.failedFileCount>0?"failed":"succeeded";return{jobId:this.#e.sessionName,status:r,successCount:e.successFileCount,skippedCount:e.skippedFileCount,failedCount:e.failedFileCount,cancelledCount:e.cancelledFileCount,completedBytes:e.completedByteCount??this.#r?.overallBytesCompleted??0,failedFiles:t,completedAt:new Date().toISOString()}}#U(){return this.#e.shard?`${this.#e.shard.index+1}/${this.#e.shard.count} (index ${this.#e.shard.index})`:"disabled"}};function vs(n){return n.reduce((e,t)=>e+(Number.isFinite(t.size)?t.size:0),0)}var Xe=200,Ze=class{#e;#s;#t;#o;#r;#n;constructor(e,t,r){this.#e=e,this.#s=t??new x({apiUrl:e.apiUrl,apiKey:e.apiKey,edgeWorkerUrl:e.edgeWorkerUrl,sessionId:e.sessionName}),this.#t=new xe({rootDirectoryId:e.directoryId,httpClient:this.#s}),this.#r=r??V(e.source),this.#n=new Qe({config:e,sourceDisplayName:this.#r.displayName}),this.#o=new Ye({config:e,httpClient:this.#s,onSnapshot:s=>this.#n.updateUploadSnapshot(s),analytics:nn})}async run(){try{await this.#i()}finally{await this.#r.shutdown()}}async runBatched(){try{await this.#c()}finally{await this.#r.shutdown()}}async runCheckOnly(){try{await this.#a()}finally{await this.#r.shutdown()}}async#i(){this.#d("Starting data sync..."),await this.#b();let e=this.#C(this.#P(await this.#u()));if(e.length===0){this.#n.log("No files to sync. Exiting."),await this.#E();return}let t={totalFileCount:0,successFileCount:0,skippedFileCount:0,failedFileCount:0,cancelledFileCount:0,completedByteCount:0},r=[],s={batchNumber:1,files:e,totalSize:this.#O(e)};this.#n.startLiveDisplay();try{let i=await this.#h({batch:s,totalBatches:1,overallFilesTotal:e.length,overallBytesTotal:s.totalSize,completedTotals:t,batchDir:this.#e.localTempDir});this.#N(t,r,i,s.totalSize)}finally{this.#n.stopLiveDisplay()}let o={...t,failedFiles:r};this.#f({summary:o}),await this.#R(o),this.#S(o)}async#c(){if(!this.#e.batchSizeBytes)throw new Error("Batch size not configured. Use batchSizeBytes in config.");this.#d("Starting batched data sync...",[`Batch size: ${h(this.#e.batchSizeBytes)}`,`Max concurrent chunks: ${this.#e.maxConcurrent}`]),await this.#b();let e=this.#C(this.#P(await this.#u()));if(e.length===0){this.#n.log("No files to sync. Exiting."),await this.#E();return}let t=qt(e,this.#e.batchSizeBytes);await this.#T(t);let r={totalFileCount:0,successFileCount:0,skippedFileCount:0,failedFileCount:0,cancelledFileCount:0,completedByteCount:0},s=[],o=this.#O(e);this.#n.startLiveDisplay();try{for(let a of t){let l=await this.#h({batch:a,totalBatches:t.length,overallFilesTotal:e.length,overallBytesTotal:o,completedTotals:r});this.#N(r,s,l,a.totalSize)}}finally{this.#n.stopLiveDisplay()}this.#f({summary:{...r,failedFiles:s},extraLines:[`Batches: ${t.length}`]});let i={...r,failedFiles:s};await this.#R(i),this.#S(i)}async#a(){this.#n.start({kind:"check",title:"Running in check-only mode (no downloads/uploads)...",humanMode:"message"}),await this.#r.prepare(),this.#n.log(`Listing source files from ${this.#r.displayName}...`);let e=await this.#r.listFiles();this.#n.recordSourceListing({files:e,humanDescription:"source files to check",includeHumanTotal:!1});let t=this.#C(this.#P(e));if(t.length===0){this.#n.log("No source files to check. Exiting.");return}this.#n.log("Fetching Aspect project summary...");let r=await this.#p();this.#n.log("Fetching existing Aspect files...");let s=await this.#t.listFilesInSubtree({onProgress:i=>this.#w(i)}),o=this.#l(t,s,r);this.#U(o),this.#n.printCheckSummary(o)}async#u(){this.#n.log("Listing all source files...");let e=await this.#r.listFiles();return this.#n.recordSourceListing({files:e}),e}async#p(){return await this.#s.get(`/projects/${this.#e.projectId}`)}#l(e,t,r){let s=e.map(S=>({relativePath:A(S),sizeBytes:this.#I(S.size)})),o=s.filter(S=>S.sizeBytes===null).length,i=t.filter(S=>S.isUploaded),a=t.filter(S=>S.uploadStateKnown&&!S.isUploaded),l=t.filter(S=>!S.uploadStateKnown).length;l>0&&(this.#n.warn(`Warning: ${l} server asset(s) did not include upload status; treating them as uploaded for check comparison.`),this.#n.blank());let c=this.#k(s),u=this.#g(i),d=new Set([...c.keys(),...u.keys()]),m=0,g=0,p=[],y=[],C=[];for(let S of d){let we=c.get(S)??[],k=u.get(S)??[],E=new Set,it=[];for(let F of we){if(F.sizeBytes===null){it.push(F);continue}let $=k.findIndex((v,Ie)=>!E.has(Ie)&&v.sizeBytes===F.sizeBytes);$>=0?(m+=1,E.add($)):it.push(F)}for(let F of it){if(F.sizeBytes===null){let v=k.findIndex((Ie,cr)=>!E.has(cr));v>=0?(E.add(v),g+=1):p.push(F);continue}let $=k.findIndex((v,Ie)=>!E.has(Ie));if($>=0){let v=k[$];E.add($),y.push({relativePath:S,remoteSizeBytes:F.sizeBytes,serverSizeBytes:v.sizeBytes,assetId:v.assetId})}else p.push(F)}for(let F=0;F<k.length;F++)E.has(F)||C.push(k[F])}return{totalRemoteCount:e.length,totalServerCount:t.length,projectAssetCount:r.num_assets,projectRootDirectoryId:r.root_directory_id,uploadedServerCount:i.length,unknownUploadStateCount:l,unknownRemoteSizeCount:o,pathOnlyMatchCount:g,existingCount:m,missingFiles:p,sizeMismatches:y,extraUploadedFiles:C,incompleteServerFiles:a}}#k(e){let t=new Map;for(let r of e){let s=b(r.relativePath),o=t.get(s)??[];o.push({...r,relativePath:s}),t.set(s,o)}return t}#g(e){let t=new Map;for(let r of e){let s=b(r.relativePath),o=t.get(s)??[];o.push({...r,relativePath:s}),t.set(s,o)}return t}#I(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}#P(e){let t=Le(e);return t.changes.length===0||this.#n.recordPathRenameWarnings({count:t.changes.length,sample:t.changes.slice(0,10).map(r=>({sourcePath:r.sourcePath,targetPath:r.targetPath}))}),t.files}#C(e){let t=Fn(e,this.#e.shard);return this.#e.shard&&(this.#n.log(`Shard ${this.#e.shard.index+1}/${this.#e.shard.count}: ${t.length} of ${e.length} planned file(s)`),this.#n.log(`Shard size: ${h(this.#O(t))}`),this.#n.blank()),t}async#h(e){let t=e.batchDir??xt.join(this.#e.localTempDir,`batch${e.batch.batchNumber}`);await ge.mkdir(t,{recursive:!0});let r=e.batch.files.map(d=>this.#r.resolveLocalFile(d,t));this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"scanning",extraDetails:`Preparing ${r.length} files...`}),this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"syncing_folders",extraDetails:"Ensuring target directories exist..."});let s=await this.#t.ensureDirectories(r);this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"scanning",extraDetails:"Checking existing assets..."});let o=await this.#m(s),i=this.#y(o),a=e.batch.files.filter((d,m)=>o[m]?.preSkipped!==!0),l=xt.join(this.#e.localTempDir,`batch${e.batch.batchNumber}.txt`),c=async()=>{await Jt(l),this.#e.keepLocal||await ge.rm(t,{recursive:!0,force:!0}),this.#n.resetUploadSnapshot()};if(a.length===0){let d={totalFileCount:o.length,successFileCount:0,skippedFileCount:o.length,failedFileCount:0,cancelledFileCount:0,failedFiles:[]};return this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+d.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete",extraDetails:"everything already synced"}),this.#n.persistCurrentBatchLine(),await c(),d}this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"downloading"}),await this.#r.materializeBatch({files:a,batchDir:t,batchFilePath:l,onProgress:d=>this.#n.updateDownloadProgress(d)}),this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"uploading"});let u=await this.#o.uploadFiles(o);return this.#A(u)?(this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+u.successFileCount+u.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete",extraDetails:"failed; local files preserved"}),this.#n.persistCurrentBatchLine(),u):(this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+u.successFileCount+u.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"cleaning"}),await c(),this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+u.successFileCount+u.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete"}),this.#n.persistCurrentBatchLine(),u)}async#b(){this.#n.log("Preparing source..."),await this.#r.prepare(),this.#n.log("Source ready"),this.#n.blank(),this.#n.log("Creating session directory..."),await ge.mkdir(this.#e.localTempDir,{recursive:!0}),this.#n.log(`Session directory: ${this.#e.localTempDir}`),this.#n.blank()}async#E(){this.#e.keepLocal||(this.#n.blank(),this.#n.log("Cleaning up session directory..."),await ge.rm(this.#e.localTempDir,{recursive:!0,force:!0}),this.#n.log(`Deleted session directory: ${this.#e.localTempDir}`))}async#R(e){if(this.#A(e)){this.#n.blank(),this.#n.log(`Preserving session directory for retry/debugging: ${this.#e.localTempDir}`);return}await this.#E()}async#m(e){let t=await this.#t.checkAssetsExistence(e.map(r=>({directory_id:r.directoryId,name:r.file.fileName,size_bytes:r.file.size})));return e.map((r,s)=>({file:r.file,directoryId:r.directoryId,preSkipped:t[s]?.exists===!0}))}#y(e){return e.reduce((t,r)=>(r.preSkipped===!0&&(t.skippedFileCount+=1,t.skippedByteCount+=r.file.size),t),{skippedFileCount:0,skippedByteCount:0})}async#T(e){this.#n.log("Creating batches..."),this.#n.log(`Created ${e.length} batches`);let t=[];for(let r of e){let s=`Batch ${r.batchNumber}: ${r.files.length} files, ${h(r.totalSize)}`;t.push(s),this.#n.log(s)}await ge.writeFile(xt.join(this.#e.localTempDir,"batches.txt"),`${t.join(`
|
|
19
|
+
`),console.log("")}this.#g()}printSummary({summary:e,extraLines:t=[]}){if(!this.isJsonMode){console.log(""),console.log("=".repeat(60)),console.log("Sync Summary"),console.log("=".repeat(60)),console.log(`Total files: ${e.totalFileCount}`),console.log(`Successful: ${e.successFileCount}`),console.log(`Skipped: ${e.skippedFileCount}`),console.log(`Failed: ${e.failedFileCount}`),console.log(`Cancelled: ${e.cancelledFileCount}`);for(let r of t)console.log(r);if(console.log("=".repeat(60)),e.failedFiles.length>0){console.log(""),console.log("Failed files:");for(let r of e.failedFiles)console.log(` - ${r.relativePath}: ${r.errorMessage??"Unknown error"}`)}}this.#C({result:this.#w(e),message:t.join(" ")||void 0})}printCheckSummary(e){let t=[...e.missingFiles.map(o=>({name:o.relativePath.split("/").at(-1)??o.relativePath,relativePath:o.relativePath,errorMessage:"Missing on server"})),...e.sizeMismatches.map(o=>({name:o.relativePath.split("/").at(-1)??o.relativePath,relativePath:o.relativePath,errorMessage:`Size mismatch: source ${o.remoteSizeBytes}, server ${o.serverSizeBytes}`})),...e.extraUploadedFiles.map(o=>({name:o.relativePath.split("/").at(-1)??o.relativePath,relativePath:o.relativePath,errorMessage:"Extra uploaded file on server"})),...e.incompleteServerFiles.map(o=>({name:o.relativePath.split("/").at(-1)??o.relativePath,relativePath:o.relativePath,errorMessage:"Incomplete upload on server"}))],r=e.existingCount+e.pathOnlyMatchCount,s={jobId:this.#e.sessionName,status:t.length>0?"failed":"succeeded",successCount:r,skippedCount:0,failedCount:t.length,cancelledCount:0,completedBytes:0,failedFiles:t,completedAt:new Date().toISOString()};this.#C({result:s,stateOverrides:{overall:{filesCompleted:r,filesTotal:e.totalRemoteCount,bytesCompleted:0,bytesTotal:0,bytesRemaining:0,downloadEtaSeconds:0,uploadEtaSeconds:0,totalEtaSeconds:0},counts:{total:e.totalRemoteCount,success:r,failed:t.length,cancelled:0,active:0,queued:0,skipped:0},failedFiles:t}})}#g(){if(!this.isJsonMode||this.#c===null||this.#a===null)return;let e={jobId:this.#e.sessionName,type:"listing",emittedAt:new Date().toISOString(),filesTotal:this.#c,bytesTotal:this.#a,pathRenameWarnings:this.#u,snapshot:this.#b({status:"running",stateOverrides:{overall:{filesCompleted:0,filesTotal:this.#c,bytesCompleted:0,bytesTotal:this.#a,bytesRemaining:this.#a,downloadEtaSeconds:0,uploadEtaSeconds:0,totalEtaSeconds:0}}})};this.#h(e)}#I(e){this.#h({jobId:this.#e.sessionName,type:"progress",emittedAt:new Date().toISOString(),phase:this.#p(),message:e,snapshot:this.#b({status:"running"})})}#P(e){this.#h({jobId:this.#e.sessionName,type:"progress",emittedAt:new Date().toISOString(),phase:this.#p(),message:e,snapshot:this.#b({status:"running"})})}#C({result:e,message:t,stateOverrides:r}){this.isJsonMode&&this.#h({jobId:this.#e.sessionName,type:"summary",emittedAt:e.completedAt,result:e,message:t,snapshot:this.#b({status:e.status,stateOverrides:r})})}#h(e){this.#t(JSON.stringify(e))}#b({status:e,stateOverrides:t}){let r=this.#v(),s=this.#r?{current:this.#r.currentBatch,total:this.#r.totalBatches,filesTotal:this.#r.batchFilesTotal,bytesTotal:this.#r.batchBytesTotal,filesSkipped:this.#r.batchFilesSkipped,bytesSkipped:this.#r.batchBytesSkipped}:void 0,o=this.#r?this.#E({batchState:this.#r,counts:r}):void 0,i=this.#i?{bytesTransferred:this.#i.bytesTransferred,bytesTotal:this.#i.totalBytes,percent:this.#i.percentComplete,speedBps:this.#i.speed,etaSeconds:this.#i.eta}:void 0,a=this.#i?.currentFile?{bytesTransferred:this.#i.currentFile.bytesTransferred,bytesTotal:this.#i.currentFile.totalBytes,percent:this.#i.currentFile.percentComplete,speedBps:this.#i.currentFile.speed,etaSeconds:this.#i.currentFile.eta}:void 0,l={downloadBps:i?.speedBps??0,uploadBps:o?.speedBps??0};return{jobId:this.#e.sessionName,kind:this.#o,status:e,phase:this.#p(),sessionName:this.#e.sessionName,sourceDisplayName:this.#s,aspectProjectId:this.#e.projectId,aspectDirectoryId:this.#e.directoryId,tempDir:this.#e.localTempDir,edgeWorkerUrl:this.#e.edgeWorkerUrl,batch:s,download:i,downloadCurrentFile:a,upload:o,counts:this.#T(r),overall:this.#r?this.#m({batchState:this.#r,counts:r,uploadProgress:o}):void 0,throughput:l,pathRenameWarnings:this.#u,completedBatches:this.#d,failedFiles:[],cancelRequested:!1,discardStagingRequested:!1,updatedAt:new Date().toISOString(),...t}}#E({batchState:e,counts:t}){let r=Math.max(e.batchFilesTotal-e.batchFilesSkipped,0),s=Math.max(e.batchBytesTotal-e.batchBytesSkipped,0),o=s>0?t.uploadedBytes/s*100:0,i=this.#f();return{filesCompleted:t.successFileCount+t.failedFileCount+t.cancelledFileCount,filesTotal:r,bytesUploaded:t.uploadedBytes,bytesTotal:s,percent:o,enqueued:t.totalFileCount,speedBps:i,etaSeconds:this.#k({batchState:e,counts:t,uploadBytesTotal:s,speedBps:i})}}#T(e){return{total:e.totalFileCount,success:e.successFileCount,failed:e.failedFileCount,cancelled:e.cancelledFileCount,active:e.activeFileCount,queued:e.queuedFileCount,skipped:this.#r?.batchFilesSkipped??0}}#m({batchState:e,counts:t,uploadProgress:r}){let s=e.batchFilesSkipped+t.successFileCount+t.failedFileCount+t.cancelledFileCount,o=e.batchBytesSkipped+t.uploadedBytes,i=e.overallFilesCompleted+s,a=e.overallBytesCompleted+o,l=Math.max(e.overallBytesTotal-a,0),c=this.#y(e),u=r?.etaSeconds??0;return{filesCompleted:i,filesTotal:e.overallFilesTotal,bytesCompleted:a,bytesTotal:e.overallBytesTotal,bytesRemaining:l,downloadEtaSeconds:c,uploadEtaSeconds:u,totalEtaSeconds:c+u}}#y(e){let t=e.overallBytesCompleted+e.batchBytesSkipped+(this.#i?.bytesTransferred??0),r=Math.max(e.overallBytesTotal-t,0);if(r===0)return this.#l=0,0;if(this.#i&&this.#i.speed>0){let s=Math.ceil(r/this.#i.speed);return this.#l=s,s}return e.currentPhase==="uploading"||e.currentPhase==="cleaning"||e.currentPhase==="complete"?(this.#l=0,0):this.#l??0}#k({batchState:e,counts:t,uploadBytesTotal:r,speedBps:s}){let o=e.overallBytesCompleted+e.batchBytesSkipped+t.uploadedBytes,i=Math.max(e.overallBytesTotal-o,0);if(i===0)return this.#R=0,0;if(s>0&&r>0){let a=Math.ceil(i/s);return this.#R=a,a}return this.#R??0}#p(){if(!this.#r)return"scanning";if(this.#r.currentPhase==="uploading"){let e=this.#v(),t=Math.max(this.#r.batchFilesTotal-this.#r.batchFilesSkipped,0),r=Math.max(this.#r.batchBytesTotal-this.#r.batchBytesSkipped,0),s=e.successFileCount+e.failedFileCount+e.cancelledFileCount;if(r>0&&e.uploadedBytes>=r&&s<t)return"finalizing"}switch(this.#r.currentPhase){case"downloading":return"downloading";case"scanning":return"scanning";case"syncing_folders":return"syncing_folders";case"uploading":return"uploading";case"cleaning":return"cleaning";case"complete":return"complete";default:return this.#r.currentPhase}}#v(){return this.#n?Object.values(this.#n.uploadAssets).reduce((t,r)=>{switch(t.totalFileCount+=1,t.totalBytes+=r.totalBytesToUpload,t.uploadedBytes+=r.status==="success"?r.totalBytesToUpload:r.bytesUploaded,r.status){case"success":t.successFileCount+=1;break;case"failed":t.failedFileCount+=1;break;case"cancelled":t.cancelledFileCount+=1;break;case"in-progress":t.activeFileCount+=1;break;default:t.queuedFileCount+=1;break}return t},{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}):{totalFileCount:0,successFileCount:0,failedFileCount:0,cancelledFileCount:0,activeFileCount:0,queuedFileCount:0,uploadedBytes:0,totalBytes:0}}#f(){let e=this.#n?.uploadStats.uploadSpeedMbps;return e===void 0||e<=0||!Number.isFinite(e)?0:e*1024*1024/8}#w(e){let t=e.failedFiles.map(s=>({name:s.fileName??s.relativePath.split("/").at(-1)??s.relativePath,relativePath:s.relativePath,errorMessage:s.errorMessage??"Unknown error"})),r=e.cancelledFileCount>0&&e.failedFileCount===0?"cancelled":e.failedFileCount>0?"failed":"succeeded";return{jobId:this.#e.sessionName,status:r,successCount:e.successFileCount,skippedCount:e.skippedFileCount,failedCount:e.failedFileCount,cancelledCount:e.cancelledFileCount,completedBytes:e.completedByteCount??this.#r?.overallBytesCompleted??0,failedFiles:t,completedAt:new Date().toISOString()}}#U(){return this.#e.shard?`${this.#e.shard.index+1}/${this.#e.shard.count} (index ${this.#e.shard.index})`:"disabled"}};function vs(n){return n.reduce((e,t)=>e+(Number.isFinite(t.size)?t.size:0),0)}var Xe=200,Ze=class{#e;#s;#t;#o;#r;#n;constructor(e,t,r){this.#e=e,this.#s=t??new x({apiUrl:e.apiUrl,apiKey:e.apiKey,edgeWorkerUrl:e.edgeWorkerUrl,sessionId:e.sessionName}),this.#t=new xe({rootDirectoryId:e.directoryId,httpClient:this.#s}),this.#r=r??V(e.source),this.#n=new Qe({config:e,sourceDisplayName:this.#r.displayName}),this.#o=new Ye({config:e,httpClient:this.#s,onSnapshot:s=>this.#n.updateUploadSnapshot(s),analytics:nn})}async run(){try{await this.#i()}finally{await this.#r.shutdown()}}async runBatched(){try{await this.#c()}finally{await this.#r.shutdown()}}async runCheckOnly(){try{await this.#a()}finally{await this.#r.shutdown()}}async#i(){this.#p("Starting data sync..."),await this.#b();let e=this.#C(this.#P(await this.#u()));if(e.length===0){this.#n.log("No files to sync. Exiting."),await this.#E();return}let t={totalFileCount:0,successFileCount:0,skippedFileCount:0,failedFileCount:0,cancelledFileCount:0,completedByteCount:0},r=[],s={batchNumber:1,files:e,totalSize:this.#O(e)};this.#n.startLiveDisplay();try{let i=await this.#h({batch:s,totalBatches:1,overallFilesTotal:e.length,overallBytesTotal:s.totalSize,completedTotals:t,batchDir:this.#e.localTempDir});this.#N(t,r,i,s.totalSize)}finally{this.#n.stopLiveDisplay()}let o={...t,failedFiles:r};this.#f({summary:o}),await this.#T(o),this.#S(o)}async#c(){if(!this.#e.batchSizeBytes)throw new Error("Batch size not configured. Use batchSizeBytes in config.");this.#p("Starting batched data sync...",[`Batch size: ${h(this.#e.batchSizeBytes)}`,`Max concurrent chunks: ${this.#e.maxConcurrent}`]),await this.#b();let e=this.#C(this.#P(await this.#u()));if(e.length===0){this.#n.log("No files to sync. Exiting."),await this.#E();return}let t=qt(e,this.#e.batchSizeBytes);await this.#k(t);let r={totalFileCount:0,successFileCount:0,skippedFileCount:0,failedFileCount:0,cancelledFileCount:0,completedByteCount:0},s=[],o=this.#O(e);this.#n.startLiveDisplay();try{for(let a of t){let l=await this.#h({batch:a,totalBatches:t.length,overallFilesTotal:e.length,overallBytesTotal:o,completedTotals:r});this.#N(r,s,l,a.totalSize)}}finally{this.#n.stopLiveDisplay()}this.#f({summary:{...r,failedFiles:s},extraLines:[`Batches: ${t.length}`]});let i={...r,failedFiles:s};await this.#T(i),this.#S(i)}async#a(){this.#n.start({kind:"check",title:"Running in check-only mode (no downloads/uploads)...",humanMode:"message"}),await this.#r.prepare(),this.#n.log(`Listing source files from ${this.#r.displayName}...`);let e=await this.#r.listFiles();this.#n.recordSourceListing({files:e,humanDescription:"source files to check",includeHumanTotal:!1});let t=this.#C(this.#P(e));if(t.length===0){this.#n.log("No source files to check. Exiting.");return}this.#n.log("Fetching Aspect project summary...");let r=await this.#d();this.#n.log("Fetching existing Aspect files...");let s=await this.#t.listFilesInSubtree({onProgress:i=>this.#w(i)}),o=this.#l(t,s,r);this.#U(o),this.#n.printCheckSummary(o)}async#u(){this.#n.log("Listing all source files...");let e=await this.#r.listFiles();return this.#n.recordSourceListing({files:e}),e}async#d(){return await this.#s.get(`/projects/${this.#e.projectId}`)}#l(e,t,r){let s=e.map(S=>({relativePath:A(S),sizeBytes:this.#I(S.size)})),o=s.filter(S=>S.sizeBytes===null).length,i=t.filter(S=>S.isUploaded),a=t.filter(S=>S.uploadStateKnown&&!S.isUploaded),l=t.filter(S=>!S.uploadStateKnown).length;l>0&&(this.#n.warn(`Warning: ${l} server asset(s) did not include upload status; treating them as uploaded for check comparison.`),this.#n.blank());let c=this.#R(s),u=this.#g(i),d=new Set([...c.keys(),...u.keys()]),m=0,g=0,p=[],y=[],C=[];for(let S of d){let we=c.get(S)??[],k=u.get(S)??[],E=new Set,it=[];for(let F of we){if(F.sizeBytes===null){it.push(F);continue}let $=k.findIndex((v,Ie)=>!E.has(Ie)&&v.sizeBytes===F.sizeBytes);$>=0?(m+=1,E.add($)):it.push(F)}for(let F of it){if(F.sizeBytes===null){let v=k.findIndex((Ie,cr)=>!E.has(cr));v>=0?(E.add(v),g+=1):p.push(F);continue}let $=k.findIndex((v,Ie)=>!E.has(Ie));if($>=0){let v=k[$];E.add($),y.push({relativePath:S,remoteSizeBytes:F.sizeBytes,serverSizeBytes:v.sizeBytes,assetId:v.assetId})}else p.push(F)}for(let F=0;F<k.length;F++)E.has(F)||C.push(k[F])}return{totalRemoteCount:e.length,totalServerCount:t.length,projectAssetCount:r.num_assets,projectRootDirectoryId:r.root_directory_id,uploadedServerCount:i.length,unknownUploadStateCount:l,unknownRemoteSizeCount:o,pathOnlyMatchCount:g,existingCount:m,missingFiles:p,sizeMismatches:y,extraUploadedFiles:C,incompleteServerFiles:a}}#R(e){let t=new Map;for(let r of e){let s=b(r.relativePath),o=t.get(s)??[];o.push({...r,relativePath:s}),t.set(s,o)}return t}#g(e){let t=new Map;for(let r of e){let s=b(r.relativePath),o=t.get(s)??[];o.push({...r,relativePath:s}),t.set(s,o)}return t}#I(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}#P(e){let t=Le(e);return t.changes.length===0||this.#n.recordPathRenameWarnings({count:t.changes.length,sample:t.changes.slice(0,10).map(r=>({sourcePath:r.sourcePath,targetPath:r.targetPath}))}),t.files}#C(e){let t=Fn(e,this.#e.shard);return this.#e.shard&&(this.#n.log(`Shard ${this.#e.shard.index+1}/${this.#e.shard.count}: ${t.length} of ${e.length} planned file(s)`),this.#n.log(`Shard size: ${h(this.#O(t))}`),this.#n.blank()),t}async#h(e){let t=e.batchDir??xt.join(this.#e.localTempDir,`batch${e.batch.batchNumber}`);await ge.mkdir(t,{recursive:!0});let r=e.batch.files.map(d=>this.#r.resolveLocalFile(d,t));this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"scanning",extraDetails:`Preparing ${r.length} files...`}),this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"syncing_folders",extraDetails:"Ensuring target directories exist..."});let s=await this.#t.ensureDirectories(r);this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:0,batchBytesSkipped:0,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"scanning",extraDetails:"Checking existing assets..."});let o=await this.#m(s),i=this.#y(o),a=e.batch.files.filter((d,m)=>o[m]?.preSkipped!==!0),l=xt.join(this.#e.localTempDir,`batch${e.batch.batchNumber}.txt`),c=async()=>{await Jt(l),this.#e.keepLocal||await ge.rm(t,{recursive:!0,force:!0}),this.#n.resetUploadSnapshot()};if(a.length===0){let d={totalFileCount:o.length,successFileCount:0,skippedFileCount:o.length,failedFileCount:0,cancelledFileCount:0,failedFiles:[]};return this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+d.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete",extraDetails:"everything already synced"}),this.#n.persistCurrentBatchLine(),await c(),d}this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"downloading"}),await this.#r.materializeBatch({files:a,batchDir:t,batchFilePath:l,onProgress:d=>this.#n.updateDownloadProgress(d)}),this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal),overallBytesTotal:e.overallBytesTotal,currentPhase:"uploading"});let u=await this.#o.uploadFiles(o);return this.#A(u)?(this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+u.successFileCount+u.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete",extraDetails:"failed; local files preserved"}),this.#n.persistCurrentBatchLine(),u):(this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+u.successFileCount+u.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"cleaning"}),await c(),this.#n.updateBatchState({currentBatch:e.batch.batchNumber,totalBatches:e.totalBatches,batchFilesTotal:r.length,batchBytesTotal:e.batch.totalSize,batchFilesSkipped:i.skippedFileCount,batchBytesSkipped:i.skippedByteCount,overallFilesCompleted:e.completedTotals.successFileCount+e.completedTotals.skippedFileCount+u.successFileCount+u.skippedFileCount,overallFilesTotal:e.overallFilesTotal,overallBytesCompleted:this.#L(e.completedTotals,e.overallBytesTotal)+e.batch.totalSize,overallBytesTotal:e.overallBytesTotal,currentPhase:"complete"}),this.#n.persistCurrentBatchLine(),u)}async#b(){this.#n.log("Preparing source..."),await this.#r.prepare(),this.#n.log("Source ready"),this.#n.blank(),this.#n.log("Creating session directory..."),await ge.mkdir(this.#e.localTempDir,{recursive:!0}),this.#n.log(`Session directory: ${this.#e.localTempDir}`),this.#n.blank()}async#E(){this.#e.keepLocal||(this.#n.blank(),this.#n.log("Cleaning up session directory..."),await ge.rm(this.#e.localTempDir,{recursive:!0,force:!0}),this.#n.log(`Deleted session directory: ${this.#e.localTempDir}`))}async#T(e){if(this.#A(e)){this.#n.blank(),this.#n.log(`Preserving session directory for retry/debugging: ${this.#e.localTempDir}`);return}await this.#E()}async#m(e){let t=await this.#t.checkAssetsExistence(e.map(r=>({directory_id:r.directoryId,name:r.file.fileName,size_bytes:r.file.size})));return e.map((r,s)=>({file:r.file,directoryId:r.directoryId,preSkipped:t[s]?.exists===!0}))}#y(e){return e.reduce((t,r)=>(r.preSkipped===!0&&(t.skippedFileCount+=1,t.skippedByteCount+=r.file.size),t),{skippedFileCount:0,skippedByteCount:0})}async#k(e){this.#n.log("Creating batches..."),this.#n.log(`Created ${e.length} batches`);let t=[];for(let r of e){let s=`Batch ${r.batchNumber}: ${r.files.length} files, ${h(r.totalSize)}`;t.push(s),this.#n.log(s)}await ge.writeFile(xt.join(this.#e.localTempDir,"batches.txt"),`${t.join(`
|
|
20
20
|
`)}
|
|
21
|
-
`,"utf-8"),this.#n.blank()}#
|
|
21
|
+
`,"utf-8"),this.#n.blank()}#p(e,t=[]){this.#n.start({kind:"sync",title:e,extraLines:t})}#v(){return this.#e.shard?`${this.#e.shard.index+1}/${this.#e.shard.count} (index ${this.#e.shard.index})`:"disabled"}#f(e){this.#n.printSummary({summary:e.summary,extraLines:e.extraLines})}#w(e){this.#n.log(`Aspect scan: ${e.scannedDirectoryCount}/${e.queuedDirectoryCount} directories, ${e.fileCount} files found`)}#U(e){if(this.#n.isJsonMode)return;let t=e.missingFiles.length+e.sizeMismatches.length+e.extraUploadedFiles.length+e.incompleteServerFiles.length;console.log(""),console.log("=".repeat(60)),console.log("Check Summary"),console.log("=".repeat(60)),console.log(`Total (remote): ${e.totalRemoteCount}`),console.log(`Total (server): ${e.totalServerCount}`),console.log(`Project asset count: ${e.projectAssetCount}`),console.log(`Project count vs scanned server: ${e.projectAssetCount-e.totalServerCount}`),console.log(`Uploaded (server): ${e.uploadedServerCount}`),console.log(`Upload status unknown: ${e.unknownUploadStateCount}`),console.log(`Exact matches: ${e.existingCount}`),console.log(`Path-only matches (unknown remote size): ${e.pathOnlyMatchCount}`),console.log(`Remote sizes unknown: ${e.unknownRemoteSizeCount}`),console.log(`Missing on server: ${e.missingFiles.length}`),console.log(`Size mismatches: ${e.sizeMismatches.length}`),console.log(`Extra on server: ${e.extraUploadedFiles.length}`),console.log(`Incomplete uploads on server: ${e.incompleteServerFiles.length}`),console.log(`Total mismatches: ${t}`),console.log("=".repeat(60)),e.projectRootDirectoryId!==this.#e.directoryId?(console.log(""),console.log(`Warning: --asp-directory-id (${this.#e.directoryId}) is not the project root directory (${e.projectRootDirectoryId}), so --check is comparing only that directory subtree.`)):e.projectAssetCount!==e.totalServerCount&&(console.log(""),console.log("Warning: project asset count differs from the live filesystem subtree scan. The project card uses cached project stats; the subtree scan is what --check compared against Drive.")),this.#B("Files missing on server:",e.missingFiles),this.#D(e.sizeMismatches),this.#M("Extra files on server:",e.extraUploadedFiles),this.#M("Incomplete uploads on server:",e.incompleteServerFiles)}#B(e,t){if(t.length!==0){console.log(""),console.log(e);for(let r of t.slice(0,Xe))console.log(` - ${r.relativePath} (${this.#_(r.sizeBytes)})`);this.#x(t.length)}}#D(e){if(e.length!==0){console.log(""),console.log("Files with size mismatches:");for(let t of e.slice(0,Xe))console.log(` - ${t.relativePath} (remote ${h(t.remoteSizeBytes)}, server ${h(t.serverSizeBytes)}, asset ${t.assetId})`);this.#x(e.length)}}#M(e,t){if(t.length!==0){console.log(""),console.log(e);for(let r of t.slice(0,Xe))console.log(` - ${r.relativePath} (${h(r.sizeBytes)}, asset ${r.assetId})`);this.#x(t.length)}}#x(e){let t=e-Xe;t>0&&console.log(` ...and ${t} more`)}#_(e){return e===null?"unknown remote size":h(e)}#N(e,t,r,s){e.totalFileCount+=r.totalFileCount,e.successFileCount+=r.successFileCount,e.skippedFileCount+=r.skippedFileCount,e.failedFileCount+=r.failedFileCount,e.cancelledFileCount+=r.cancelledFileCount,e.completedByteCount+=s,t.push(...r.failedFiles)}#S(e){let t=e.failedFileCount+e.cancelledFileCount;if(t>0)throw new Error(`Sync completed with ${t} unsuccessful upload(s)`)}#A(e){return e.failedFileCount+e.cancelledFileCount>0}#O(e){return e.reduce((t,r)=>t+r.size,0)}#L(e,t){return Math.min(e.completedByteCount,t)}};import Ls from"node:fs";import{chmod as In,mkdir as Us,writeFile as xs}from"node:fs/promises";import{stdin as _,stdout as et}from"node:process";import Ds from"node:os";import kn from"node:path";var Pn=448,Rn=384,_s="https://api.aspect.inc";function Dt(){return kn.join(Ds.homedir(),".config","aspect-sync","aspect-auth.json")}function Os(n=Dt()){let e;try{e=Ls.readFileSync(n,"utf-8")}catch(r){throw r.code==="ENOENT"?Ns(n):r}let t;try{t=JSON.parse(e)}catch(r){throw new Error(`Aspect auth file ${n} is not valid JSON: ${r.message}`)}return Un({authFilePath:n,value:t})}function vn(n=Dt()){try{return Os(n)}catch(e){if(e.code==="ENOENT")return null;throw e}}async function Bs(n,e){Un({authFilePath:n,value:e});let t=kn.dirname(n);await Us(t,{recursive:!0,mode:Pn}),await In(t,Pn),await xs(n,`${JSON.stringify(e,null,2)}
|
|
22
22
|
`,{encoding:"utf-8",mode:Rn}),await In(n,Rn)}async function Ln(n,e={}){let t=e.prompts??{promptPassword:$s},s=(n.aspApiKey??await t.promptPassword("Aspect API key: ")).trim();if(!s)throw new Error("--asp-api-key or API key prompt cannot be empty");let o=n.aspApiUrl??_s;await(e.validateApiKey??Ms)({apiUrl:o,apiKey:s});let i={apiKey:s};n.aspApiUrl&&(i.apiUrl=n.aspApiUrl),n.aspEdgeWorkerUrl&&(i.edgeWorkerUrl=n.aspEdgeWorkerUrl);let a=n.authFile??Dt();await Bs(a,i),console.log(`Saved Aspect auth to ${a}`)}async function Ms(n){let e=await fetch(new URL("/users/me",n.apiUrl),{headers:{Authorization:`Bearer ${n.apiKey}`}});if(e.ok)return;let t=await e.text();throw new Error(`Aspect API key validation failed: ${e.status} ${e.statusText}${t?` ${t}`:""}`)}function Ns(n){let e=new Error(`Error: Aspect API key not found; pass --asp-api-key, set ASPECT_API_KEY, or run aspect-sync login to create ${n}`);return e.code="ENOENT",e}function Un(n){if(!zs(n.value))throw new Error(`Aspect auth file ${n.authFilePath} must contain a non-empty apiKey string`);return n.value}function zs(n){if(!n||typeof n!="object")return!1;let e=n;return Gs(e.apiKey)&&Tn(e.apiUrl)&&Tn(e.edgeWorkerUrl)}function Gs(n){return typeof n=="string"&&n.length>0}function Tn(n){return n===void 0||typeof n=="string"}function $s(n){if(!_.isTTY||!et.isTTY)throw new Error("Interactive Aspect API key prompt requires a TTY; provide --asp-api-key");return new Promise((e,t)=>{let r=[],s=_.isRaw,o=()=>{_.off("data",i),_.setRawMode(s),_.pause()},i=a=>{let l=a.toString("utf-8");for(let c of l){if(c===""){o(),et.write(`
|
|
23
23
|
`),t(new Error("Aspect API key prompt cancelled"));return}if(c==="\r"||c===`
|
|
24
24
|
`){o(),et.write(`
|
|
25
25
|
`),e(r.join(""));return}if(c==="\x7F"){r.pop();continue}c>=" "&&r.push(c)}};et.write(n),_.setRawMode(!0),_.resume(),_.on("data",i)})}import{createInterface as Fo}from"node:readline/promises";import{stdin as Eo,stdout as wo}from"node:process";import Js from"node:fs";import Ys from"node:os";import Se from"node:path";import On from"node:fs";import{chmod as xn,mkdir as js,writeFile as Hs}from"node:fs/promises";import Ws from"node:os";import Bn from"node:path";var Dn=448,_n=384;function ye(){return Bn.join(Ws.homedir(),".config","aspect-sync","lucidlink-auth.json")}function Mn(n=ye()){let e;try{e=On.readFileSync(n,"utf-8")}catch(r){throw r.code==="ENOENT"?Ks(n):r}let t;try{t=JSON.parse(e)}catch(r){throw new Error(`LucidLink auth file ${n} is not valid JSON: ${r.message}`)}return Gn({authFilePath:n,value:t})}async function Nn(n,e){Gn({authFilePath:n,value:e});let t=Bn.dirname(n);await js(t,{recursive:!0,mode:Dn}),await xn(t,Dn),await Hs(n,`${JSON.stringify(e,null,2)}
|
|
26
|
-
`,{encoding:"utf-8",mode:_n}),await xn(n,_n)}function zn(n){let e=On.readFileSync(n,"utf-8").replace(/\r?\n$/,"");if(e.length===0)throw new Error(`Error: LucidLink password file is empty: ${n}`);return e}function Ks(n){let e=new Error(`Error: LucidLink auth file not found at ${n}; run aspect-sync lucidlink login before syncing`);return e.code="ENOENT",e}function Gn(n){if(!qs(n.value))throw new Error(`LucidLink auth file ${n.authFilePath} must contain non-empty filespace, user, and password strings`);return n.value}function qs(n){if(!n||typeof n!="object")return!1;let e=n;return _t(e.filespace)&&_t(e.user)&&_t(e.password)}function _t(n){return typeof n=="string"&&n.length>0}var Vs=
|
|
26
|
+
`,{encoding:"utf-8",mode:_n}),await xn(n,_n)}function zn(n){let e=On.readFileSync(n,"utf-8").replace(/\r?\n$/,"");if(e.length===0)throw new Error(`Error: LucidLink password file is empty: ${n}`);return e}function Ks(n){let e=new Error(`Error: LucidLink auth file not found at ${n}; run aspect-sync lucidlink login before syncing`);return e.code="ENOENT",e}function Gn(n){if(!qs(n.value))throw new Error(`LucidLink auth file ${n.authFilePath} must contain non-empty filespace, user, and password strings`);return n.value}function qs(n){if(!n||typeof n!="object")return!1;let e=n;return _t(e.filespace)&&_t(e.user)&&_t(e.password)}function _t(n){return typeof n=="string"&&n.length>0}var Vs=void 0,Qs=void 0,Xs="https://t.aspect.inc";function Ot(n){let e=n.match(/^(\d+(?:\.\d+)?)\s*(B|KB|MB|GB|TB)$/i);if(!e)return null;let t=parseFloat(e[1]),r=e[2].toUpperCase(),s={B:1,KB:1e3,MB:1e3*1e3,GB:1e3*1e3*1e3,TB:1e3*1e3*1e3*1e3};return t*(s[r]||1)}function jn(n){return tt({options:n.options,environment:n.environment,now:n.now,highResolutionTime:n.highResolutionTime,buildSourceConfig:()=>Ce(n.options)})}function Hn(n){return tt({options:n.options,environment:n.environment,now:n.now,highResolutionTime:n.highResolutionTime,buildSourceConfig:()=>to(n.options)})}function Wn(n){return tt({options:n.options,environment:n.environment,now:n.now,highResolutionTime:n.highResolutionTime,buildSourceConfig:e=>be({options:n.options,localTempDir:e.localTempDir})})}function Kn(n){return tt({options:n.options,environment:n.environment,now:n.now,highResolutionTime:n.highResolutionTime,buildSourceConfig:()=>Ae({options:n.options})})}function tt(n){let e=Q({value:n.options.aspDirectoryId,optionName:"--asp-directory-id"}),t=Q({value:n.options.aspProjectId,optionName:"--asp-project-id"}),r=eo({options:n.options,environment:n.environment})?vn():null,s=n.options.aspApiKey||n.environment.ASPECT_API_KEY||r?.apiKey||"";if(!s)throw new Error("Error: --asp-api-key is required (or set ASPECT_API_KEY env variable or run aspect-sync login)");let o=G({value:n.options.uploadConcurrent,optionName:"--upload-concurrent"}),i=io(n.options.batchSize),a=ao({shardCount:n.options.shardCount,shardIndex:n.options.shardIndex}),l=n.options.session??lo({now:n.now??new Date,highResolutionTime:n.highResolutionTime??process.hrtime.bigint()}),c=n.options.tempDir||Se.join(Ys.homedir(),".aspect","sync"),u=Se.join(c,l);return{source:n.buildSourceConfig({localTempDir:u}),directoryId:e,projectId:t,apiUrl:n.options.aspApiUrl||n.environment.ASPECT_API_URL||r?.apiUrl||"https://api.aspect.inc",edgeWorkerUrl:n.options.aspEdgeWorkerUrl||n.environment.ASPECT_EDGE_WORKER_URL||r?.edgeWorkerUrl||"https://mackinac.aspect.inc",apiKey:s,maxConcurrent:o,keepLocal:n.options.keepLocal,localTempDir:u,sessionName:l,batchSizeBytes:i,shard:a,progressMode:Zs(n.options.progress),analytics:{posthogKey:n.environment.ASPECT_POSTHOG_KEY||n.environment.POSTHOG_KEY||n.environment.POSTHOG_API_KEY||Vs,posthogHost:n.environment.ASPECT_POSTHOG_HOST||n.environment.POSTHOG_HOST||Qs||Xs,disabled:$n(n.environment.ASPECT_DISABLE_POSTHOG)||$n(n.environment.POSTHOG_DISABLED)}}}function Zs(n){if(n===void 0)return"human";if(n==="human"||n==="json")return n;throw new Error("--progress must be either human or json")}function eo(n){if(!!!(n.options.aspApiKey||n.environment.ASPECT_API_KEY))return!0;let t=!!(n.options.aspApiUrl||n.environment.ASPECT_API_URL),r=!!(n.options.aspEdgeWorkerUrl||n.environment.ASPECT_EDGE_WORKER_URL);return!t||!r}function Ce(n){let e=Q({value:n.sourcePath,optionName:"--source-path"});if(!n.remote)throw new Error("Error: --remote is required for rclone");let t=G({value:n.rcloneTransfers??"4",optionName:"--rclone-transfers"}),r=G({value:n.rcloneMultiThreadStreams??"4",optionName:"--rclone-multi-thread-streams"});return{kind:"rclone",remote:n.remote,remotePath:e,rcloneOptions:{transfers:t,checkers:t>=16?Math.floor(t/4):t,multiThreadStreams:r,multiThreadChunkSize:n.rcloneMultiThreadChunkSize??"64MiB",multiThreadCutoff:n.rcloneMultiThreadCutoff??"64MiB",bufferSize:n.rcloneBufferSize??"64M",useMmap:n.rcloneNoMmap!==!0,extraRcloneArgs:n.rcloneExtra??[]}}}function to(n){let e=Q({value:n.sourcePath,optionName:"--source-path"});return{kind:"local",rootPath:Se.resolve(e)}}function be(n){let e=Q({value:n.options.sourcePath,optionName:"--source-path"}),t=ye(),r=Mn(t),s=G({value:n.options.lucidInstance??"9001",optionName:"--lucid-instance"}),o=`${n.localTempDir}-lucid`;return{kind:"lucidlink",filespace:r.filespace,user:r.user,password:r.password,filespacePath:so(e),instanceId:s,workDir:o,mountPoint:Se.join(o,"mnt"),cacheRootPath:Se.join(o,"cache"),cacheSize:n.options.lucidCacheSize}}function Ae(n){let e=Q({value:n.options.sourceFolderId,optionName:"--source-folder-id"}),t=Y(),r=no(t);return{kind:"frameio",accountId:r,folderId:e,downloadConcurrency:G({value:n.options.frameioDownloadConcurrent??"4",optionName:"--frameio-download-concurrent"}),pageSize:G({value:n.options.frameioPageSize??"100",optionName:"--frameio-page-size"})}}function Q(n){if(!n.value)throw new Error(`Error: ${n.optionName} is required`);return n.value}function no(n){let e;try{e=Js.readFileSync(n,"utf-8")}catch(r){throw r.code==="ENOENT"?new Error(`Error: Frame.io auth file not found at ${n}; run aspect-sync frameio login before syncing`):r}let t=JSON.parse(e);if(!ro(t))throw new Error(`Error: Frame.io sync requires a default account ID in ${n}; run aspect-sync frameio login to select a default account, or add defaultAccountId to the auth file.`);return t.defaultAccountId}function ro(n){if(!n||typeof n!="object")return!1;let e=n;return typeof e.defaultAccountId=="string"&&e.defaultAccountId.length>0}function so(n){let e=n.replace(/^\/+/,"").replace(/\/+$/,"");if(e.split("/").some(t=>t===".."))throw new Error(`Error: --source-path cannot contain parent directory segments: ${n}`);return e}function G(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 oo(n){let e=parseInt(n.value,10);if(Number.isNaN(e)||e<0)throw new Error(`Error: ${n.optionName} must be a non-negative integer`);return e}function io(n){if(!n)return;let e=Ot(n);if(e===null)throw new Error(`Error: Invalid batch size format: ${n}`);return e}function ao(n){if(!n.shardCount&&!n.shardIndex)return;if(!n.shardCount||!n.shardIndex)throw new Error("Error: --shard-count and --shard-index must be provided together");let e=G({value:n.shardCount,optionName:"--shard-count"}),t=oo({value:n.shardIndex,optionName:"--shard-index"});if(t>=e)throw new Error("Error: --shard-index must be less than --shard-count");return{count:e,index:t}}function $n(n){return n?["1","true","yes"].includes(n.toLowerCase()):!1}function lo(n){let e=n.now.getFullYear(),t=String(n.now.getMonth()+1).padStart(2,"0"),r=String(n.now.getDate()).padStart(2,"0"),s=String(n.now.getHours()).padStart(2,"0"),o=String(n.now.getMinutes()).padStart(2,"0"),i=String(n.now.getSeconds()).padStart(2,"0"),a=n.highResolutionTime%1000000000n,l=String(a).padStart(9,"0");return`${e}-${t}-${r}_${s}h-${o}m-${i}s-${l}ns`}import{createReadStream as co}from"node:fs";import{mkdir as Bt,rm as Mt,writeFile as uo}from"node:fs/promises";import po from"node:os";import Fe from"node:path";var mo=20;function I(n){let e=n.session??Ao(n.commandName),t=n.tempDir??Fe.join(po.homedir(),".aspect","sync");return{sessionName:e,localTempDir:Fe.join(t,e)}}function R(n,e){let t=parseInt(n,10);if(Number.isNaN(t)||t<1)throw new Error(`${e} must be a positive integer`);return t}function X(n,e){if(!n)return;let t=Ot(n);if(t===null)throw new Error(`${e} must be a size like 500MB, 10GB, or 1TB`);return t}async function Z(n){let e=V(n.sourceConfig);try{console.log(`Doctor: ${e.displayName}`),await qn(n.localTempDir),console.log(`Writable temp path: ${n.localTempDir}`);for(let r of Co(n.sourceConfig))await qn(r),console.log(`Writable cache path: ${r}`);for(let r of n.tuningWarnings??[])console.warn(`Warning: ${r}`);await e.prepare(),console.log("Source prepared");let t=await Nt(e);Jn(t.changes),console.log(`Source root access: OK (${t.files.length} files, ${h(nt(t.files))})`),console.log("Doctor checks passed")}finally{try{await Mt(n.localTempDir,{recursive:!0,force:!0})}finally{await e.shutdown()}}}async function ee(n){let e=V(n.sourceConfig);try{await e.prepare();let t=await Nt(e);Jn(t.changes),ho({source:e,files:t.files,sampleSize:n.sampleSize??mo})}finally{await e.shutdown()}}async function te(n){let e=V(n.sourceConfig);try{await e.prepare();let t=await Nt(e),r=So({files:t.files,maxFiles:n.maxFiles,maxBytes:n.maxBytes});if(r.length===0)throw new Error("No source files available to probe");console.log(`Probe source: ${e.displayName}`),console.log(`Probe files: ${r.length}`),console.log(`Probe size: ${h(nt(r))}`);let s=Date.now(),o=await fo({source:e,sourceConfig:n.sourceConfig,files:r,localTempDir:n.localTempDir}),i=Math.max((Date.now()-s)/1e3,.001);console.log(`Probe complete: ${h(o)} in ${i.toFixed(2)}s (${Ve(o/i)})`)}finally{try{n.keepLocal!==!0&&await Mt(n.localTempDir,{recursive:!0,force:!0})}finally{await e.shutdown()}}}async function Nt(n){console.log(`Listing source files from ${n.displayName}...`);let e=await n.listFiles();return Le(e)}function ho(n){console.log(`Source: ${n.source.displayName}`),console.log(`Files: ${n.files.length}`),console.log(`Total size: ${h(nt(n.files))}`);let e=n.files.slice(0,n.sampleSize);if(e.length===0)return;console.log("Sample paths:");for(let r of e)console.log(`- ${bo(r)} (${h(r.size)})`);let t=n.files.length-e.length;t>0&&console.log(`...and ${t} more`)}function Jn(n){if(n.length===0)return;let e=n.slice(0,10).map(s=>`${s.sourcePath} -> ${s.targetPath}`).join(`
|
|
27
27
|
`),t=n.length-10,r=t>0?`
|
|
28
28
|
...and ${t} more renamed target path(s)`:"";console.warn(`Warning: ${n.length} remote file path(s) were renamed for Aspect compatibility.
|
|
29
29
|
${e}${r}
|