// Copyright 2024-present Puter Technologies Inc. All rights reserved. // Generated on 2026-03-17 07:52 (()=>{"use strict";var e={614(e){class t{#e;constructor(e=[]){this.#e=[new Map(e)]}get size(){return this.#e.reduce((e,t)=>e+t.size,0)}clear(){this.#e=[new Map]}delete(e){return this.#e.some(t=>t.delete(e))}get(e){for(const t of this.#e)if(t.has(e))return t.get(e)}has(e){return this.#e.some(t=>t.has(e))}set(e,t){let n=this.#e[0];for(const t of this.#e)if(t.has(e)){n=t;break}return!n.has(e)&&n.size>=8388608&&(this.#e.unshift(new Map),n=this.#e[0]),n.set(e,t),this}*[Symbol.iterator](){for(const e of this.#e)yield*e}*keys(){for(const e of this.#e)yield*e.keys()}*values(){for(const e of this.#e)yield*e.values()}*entries(){for(const e of this.#e)yield*e.entries()}forEach(e,t){for(const[n,r]of this)e.call(t,r,n,this)}}e.exports=t},429(e,t,n){const r=n(614);function s(e,t){const n=e.toLowerCase(),r=t.toLowerCase();if(""===r)return!1;if(-1===r.indexOf("*")&&-1===r.indexOf("?")&&-1===r.indexOf("[")&&-1===r.indexOf("{"))return n===r;let i=r;const o=i.match(/\{([^}]+)\}/);if(o)return o[1].split(",").map(e=>i.replace(o[0],e.trim())).some(t=>s(e,t));let a="",c=0;for(;c{this.store.set(e,t),this._initCleanupLoop(20),this.isIndexedDBAvailable&&this.db&&this._persistToIndexedDB(e,t)},this._initIndexedDB()}_initIndexedDB(){"undefined"!=typeof window&&window.indexedDB&&this.dbName?(this.isIndexedDBAvailable=!0,this.initPromise=this._setupIndexedDB()):this.isInitialized=!0}async _setupIndexedDB(){try{this.db=await this._openDatabase(),await this._loadFromIndexedDB(),this.isInitialized=!0}catch(e){console.warn("Failed to initialize IndexedDB:",e),this.isIndexedDBAvailable=!1,this.isInitialized=!0}}_openDatabase(){return new Promise((e,t)=>{const n=indexedDB.open(this.dbName,this.dbVersion);n.onerror=()=>t(n.error),n.onsuccess=()=>e(n.result),n.onupgradeneeded=e=>{const t=e.target.result;t.objectStoreNames.contains("store")||t.createObjectStore("store",{keyPath:"key"}),t.objectStoreNames.contains("expireTimes")||t.createObjectStore("expireTimes",{keyPath:"key"})}})}async _loadFromIndexedDB(){if(this.db)try{const e=this.db.transaction(["store","expireTimes"],"readonly"),t=e.objectStore("store"),n=e.objectStore("expireTimes"),r=t.getAll(),s=n.getAll(),[i,o]=await Promise.all([new Promise((e,t)=>{r.onsuccess=()=>e(r.result),r.onerror=()=>t(r.error)}),new Promise((e,t)=>{s.onsuccess=()=>e(s.result),s.onerror=()=>t(s.error)})]);i.forEach(e=>{this.store.set(e.key,e.value)}),o.forEach(e=>{this.expireTimes.set(e.key,e.expireTime)});const a=Date.now();for(const[e,t]of this.expireTimes.entries())a>t&&(this.store.delete(e),this.expireTimes.delete(e),this._removeFromIndexedDB(e))}catch(e){console.warn("Failed to load data from IndexedDB:",e)}}async _persistToIndexedDB(e,t){if(this.db)try{this.db.transaction(["store"],"readwrite").objectStore("store").put({key:e,value:t})}catch(e){console.warn("Failed to persist to IndexedDB:",e)}}async _persistExpirationToIndexedDB(e,t){if(this.db)try{const n=this.db.transaction(["expireTimes"],"readwrite").objectStore("expireTimes");void 0!==t?n.put({key:e,expireTime:t}):n.delete(e)}catch(e){console.warn("Failed to persist expiration to IndexedDB:",e)}}async _removeFromIndexedDB(e){if(this.db)try{const t=this.db.transaction(["store","expireTimes"],"readwrite"),n=t.objectStore("store"),r=t.objectStore("expireTimes");n.delete(e),r.delete(e)}catch(e){console.warn("Failed to remove from IndexedDB:",e)}}async waitForInitialization(){this.isInitialized||this.initPromise&&await this.initPromise}set(e,t,n={}){const{NX:r=!1,XX:s=!1,GET:i=!1,EX:o,PX:a,EXAT:c,PXAT:l,KEEPTTL:h=!1}=n,u=r,d=s,p=i;let g=o?parseInt(o,10):void 0,f=a?parseInt(a,10):void 0,m=c?parseInt(c,10):void 0,y=l?parseInt(l,10):void 0;const b=h,w=this.store.has(e);if(d&&!w)return;if(u&&w)return;let v;if(p&&w&&(v=this.store.get(e)),this.storeSet(e,t),void 0!==g||void 0!==f||void 0!==m||void 0!==y||b){let t;void 0!==g?t=Date.now()+1e3*g:void 0!==f?t=Date.now()+f:void 0!==m?t=1e3*m:void 0!==y?t=y:b&&w&&(t=this.expireTimes.get(e)),void 0!==t&&(this.expireTimes.set(e,t),this.isIndexedDBAvailable&&this.db&&this._persistExpirationToIndexedDB(e,t))}else this.expireTimes.delete(e),this.isIndexedDBAvailable&&this.db&&this._persistExpirationToIndexedDB(e,void 0);return!p||v}get(e){if(!this._checkAndRemoveExpiredKey(e))return this.store.get(e)}del(...e){let t=0;for(const n of e)this._checkAndRemoveExpiredKey(n)||this.store.delete(n)&&(this.expireTimes.delete(n),this.isIndexedDBAvailable&&this.db&&this._removeFromIndexedDB(n),t++);return t}exists(...e){let t=0;for(const n of e)this._checkAndRemoveExpiredKey(n)||this.store.has(n)&&t++;return t}incr(e){return this.incrby(e,1)}incrby(e,t){let n=this.store.get(e);if(void 0===n)n=0;else if(!Number.isInteger(Number(n)))throw new Error("ERR value is not an integer");const r=Number(n)+t;return this.storeSet(e,r.toString()),r}decr(e){try{return this.decrby(e,1)}catch(e){throw e}}decrby(e,t){let n=this.store.get(e);if(void 0===n)n=0;else if(!Number.isInteger(Number(n)))throw new Error("ERR value is not an integer");const r=Number(n)-t;return this.storeSet(e,r.toString()),r}expire(e,t,n={}){if(!this.store.has(e))return 0;const{NX:r=!1,XX:s=!1,GT:i=!1,LT:o=!1}=n,a=Date.now(),c=this.expireTimes.get(e);return r&&void 0!==c||s&&void 0===c||i&&(void 0===c||c<=a+1e3*t)||o&&(void 0===c||c>=a+1e3*t)?0:(this.expireTimes.set(e,a+1e3*t),1)}keys(e){const t=[];for(const[n,r]of this.store.entries())if(s(n,e)){const e=this.expireTimes.get(n);(void 0===e||e>Date.now())&&t.push(n)}return t}mget(...e){return e.map(e=>this.get(e))}mset(...e){if(e.length%2!=0)throw new Error("MSET requires an even number of arguments");for(let t=0;t=c?0:this.pexpire(e,a)}pexpire(e,t,n={}){const{NX:r=!1,XX:s=!1,GT:i=!1,LT:o=!1}=n;if(r&&this.store.has(e)||s&&!this.store.has(e))return 0;if(i||o){const n=this.pttl(e);if(i&&n>=t||o&&n<=t)return 0}return this.expireTimes.set(e,Date.now()+t),1}pexpireat(e,t){const n=t-Date.now();return n<=0?(this.store.delete(e),this.expireTimes.delete(e),0):this.pexpire(e,n)}pttl(e){if(!this.store.has(e))return-2;if(!this.expireTimes.has(e))return-1;const t=this.expireTimes.get(e)-Date.now();return t>0?t:-2}ttl(e){if(!this.store.has(e))return-2;if(!this.expireTimes.has(e))return-1;const t=Math.floor((this.expireTimes.get(e)-Date.now())/1e3);return t>0?t:-2}persist(e){return this.store.has(e)&&this.expireTimes.has(e)?(this.expireTimes.delete(e),this.isIndexedDBAvailable&&this.db&&this._persistExpirationToIndexedDB(e,void 0),1):0}getrange(e,t,n){const r=this.get(e);return"string"!=typeof r?"":r.slice(t,n+1)}getset(e,t){const n=this.get(e);return this.set(e,t),n}setex(e,t,n){if(this.store.has(e))return this.set(e,t),this.expire(e,n),!0}setrange(e,t,n){if("number"!=typeof t||t<0)throw new Error("Invalid offset value");if("string"!=typeof n)throw new Error("Value must be a string");let r=this.get(e);void 0!==r&&void 0!==r||(r="");const s=r.slice(0,t)+n+r.slice(t+n.length);return this.set(e,s),s.length}strlen(e){const t=this.get(e);return void 0===t?0:t.length}msetnx(...e){if(e.length%2!=0)throw new Error("MSETNX requires an even number of arguments");for(let t=0;t=8*n.length)return 0;const r=Math.floor(t/8),s=7-t%8;return n.charCodeAt(r)>>s&1}setbit(e,t,n){if(0!==n&&1!==n)throw new Error("ERR bit is not an integer or out of range");let r=this.get(e);void 0===r&&(r="");const s=Math.floor(t/8),i=7-t%8;for(;s>=r.length;)r+="\0";const o=r.charCodeAt(s),a=o>>i&1,c=o&~(1<{const t=this.store.get(e);if(void 0===t)return new Set;if(!(t instanceof Set))throw new Error("ERR Operation against a key holding the wrong kind of value");return t}),n=new Set(t[0]);for(let e=1;en.has(e)?1:0)}smove(e,t,n){const r=this.store.get(e);if(void 0===r||!r.has(n))return 0;if(!(r instanceof Set))throw new Error("ERR Operation against a key holding the wrong kind of value");const s=this.store.get(t)||new Set;if(!(s instanceof Set))throw new Error("ERR Operation against a key holding the wrong kind of value");return r.delete(n),s.add(n),this.storeSet(t,s),1}spop(e,t=1){const n=this.store.get(e);if(void 0===n)return[];if(!(n instanceof Set))throw new Error("ERR Operation against a key holding the wrong kind of value");const r=[];for(const e of n){if(r.length>=t)break;r.push(e),n.delete(e)}return r}srandmember(e,t=1){const n=this.store.get(e);if(void 0===n)return[];if(!(n instanceof Set))throw new Error("ERR Operation against a key holding the wrong kind of value");const r=Array.from(n),s=[];for(let e=0;e=a.length?0:l,c]}sunion(...e){const t=new Set;for(const n of e){const e=this.store.get(n)||new Set;if(!(e instanceof Set))throw new Error("ERR Operation against a key holding the wrong kind of value");for(const n of e)t.add(n)}return Array.from(t)}sunionstore(e,...t){const n=new Set;for(const e of t){const t=this.store.get(e)||new Set;if(!(t instanceof Set))throw new Error("ERR Operation against a key holding the wrong kind of value");for(const e of t)n.add(e)}return this.storeSet(e,n),n.size}lset(e,t,n){const r=this.store.get(e);if(void 0===r)throw new Error("ERR no such key");if(!Array.isArray(r))throw new Error("ERR Operation against a key holding the wrong kind of value");if(t<0||t>=r.length)throw new Error("ERR index out of range");return r[t]=n,!0}ltrim(e,t,n){const r=this.store.get(e);if(void 0===r)return!0;if(!Array.isArray(r))throw new Error("ERR Operation against a key holding the wrong kind of value");const s=r.length,i=t>=0?t:Math.max(s+t,0),o=n>=0?n:Math.max(s+n,-1),a=r.slice(i,o+1);return this.storeSet(e,a),!0}rpop(e){const t=this.store.get(e);return void 0!==t&&Array.isArray(t)?t.pop():null}rpoplpush(e,t){const n=this.rpop(e);return void 0===n?null:(this.lpush(t,n),n)}rpush(e,...t){let n=this.store.get(e);if(void 0===n)n=[],this.storeSet(e,n);else if(!Array.isArray(n))throw new Error("ERR Operation against a key holding the wrong kind of value");return n.push(...t),n.length}rpushx(e,t){const n=this.store.get(e);return void 0!==n&&Array.isArray(n)?(n.push(t),n.length):0}lpush(e,...t){let n=this.store.get(e);if(void 0===n)n=[],this.storeSet(e,n);else if(!Array.isArray(n))throw new Error("ERR Operation against a key holding the wrong kind of value");return n.unshift(...t),n.length}lpushx(e,...t){const n=this.store.get(e);return void 0!==n&&Array.isArray(n)?(n.unshift(...t),n.length):0}lrange(e,t,n){const r=this.store.get(e);if(void 0===r||!Array.isArray(r))return[];const s=r.length,i=t>=0?t:Math.max(s+t,0),o=n>=0?n:Math.max(s+n,-1);return r.slice(i,o+1)}lrem(e,t,n){const r=this.store.get(e);if(void 0===r||!Array.isArray(r))return 0;let s=0;if(t>0)for(let e=0;e=0&&s<-t;e--)r[e]===n&&(r.splice(e,1),s++);else s=r.filter(e=>e===n).length,this.storeSet(e,r.filter(e=>e!==n));return s}lmove(e,t,n,r){const s="LEFT"===r?"lpush":"rpush",i=this["LEFT"===n?"lpop":"rpop"](e);return void 0===i?null:(this[s](t,i),i)}lmpop(e,t,n){const r="LEFT"===n?"lpop":"rpop",s=[];for(let n=0;n=0?s:Math.max(c+s,0),h=i>=0?i:Math.max(c+i,-1);for(let e=l;e<=h;e++)if(o[e]===t){if(a===r)return e;a++}}brpoplpush(e,t,n){const r=this.brpop(e,n);return void 0===r?null:(this.lpush(t,r),r)}lindex(e,t){const n=this.store.get(e);return void 0!==n&&Array.isArray(n)?(t<0&&(t=n.length+t),void 0!==n[t]?n[t]:null):null}linsert(e,t,n,r){const s=this.store.get(e);if(void 0===s)return 0;if(!Array.isArray(s))throw new Error("ERR Operation against a key holding the wrong kind of value");const i=s.indexOf(n);if(-1===i)return 0;if("BEFORE"===t)s.splice(i,0,r);else{if("AFTER"!==t)throw new Error("ERR syntax error");s.splice(i+1,0,r)}return s.length}llen(e){const t=this.store.get(e);return void 0===t?0:t.length}blmove(e,t,n,r,s){const i="LEFT"===r?"lpush":"rpush",o=this["LEFT"===n?"blpop":"brpop"]([e],s);return void 0===o?null:(this[i](t,o[1]),o[1])}blmpop(e,t,...n){const r=[],s=1e3*t,i=1===n.length?"brpop":"brpoplpush",o=n.concat(s);for(let t=0;t0){const e=r.pop();return 0===r.length&&this.store.delete(n),[n,e]}}return null}expiretime(e){return this.expireTimes.get(e)}pexpiretime(e){const t=this.expireTimes.get(e);return t?1e3*t:null}zadd(e,t,n){return this._checkAndRemoveExpiredKey(e)?0:(this.store.has(e)||this.storeSet(e,new r),this.store.get(e).set(n,Number(t)),1)}zcard(e){return this._checkAndRemoveExpiredKey(e)?0:this.store.has(e)?this.store.get(e).size:0}zcount(e,t,n){if(this._checkAndRemoveExpiredKey(e))return 0;if(!this.store.has(e))return 0;const r=this.store.get(e);let s=0;for(const e of r.values())e>=t&&e<=n&&s++;return s}zdiff(...e){if(0===e.length)return new Set;const t=e.map(e=>this._checkAndRemoveExpiredKey(e)?new r:this.store.get(e)||new r),n=new Set(t[0].keys());for(let e=1;e{const n=this.store.get(t);return n?n.get(e):void 0}).filter(e=>void 0!==e);n.length>0&&s.set(e,Math.min(...n))}return this.storeSet(e,s),s.size}bzmpop(e,...t){const n=[];for(const r of t){const t=this.store.get(r);if(t&&t.size>0){const s=Array.from(t.entries()).sort((e,t)=>e[1]-t[1]).slice(0,e).map(([e,n])=>(t.delete(e),[e,n]));n.push([r,...s]);break}}return n}bzpopmax(e,t){const n=this.store.get(e);if(!n||0===n.size)return[];const r=Array.from(n.entries()).sort((e,t)=>t[1]-e[1]).slice(0,t).map(([e,t])=>(n.delete(e),[e,t]));return[e,...r]}bzpopmin(e,t){const n=this.store.get(e);if(!n||0===n.size)return[];const r=Array.from(n.entries()).sort((e,t)=>e[1]-t[1]).slice(0,t).map(([e,t])=>(n.delete(e),[e,t]));return[e,...r]}zincrby(e,t,n){this.store.has(e)||this.storeSet(e,new r);const s=this.store.get(e),i=(s.get(n)||0)+Number(t);return s.set(n,i),i}zinter(...e){if(0===e.length)return new Set;const t=e.map(e=>this.store.get(e)||new r),n=new Set(t[0].keys());for(let e=1;e{const n=this.store.get(t);return n?n.get(e):void 0}).filter(e=>void 0!==e);n.length>0&&s.set(e,Math.max(...n))}return this.storeSet(e,s),s.size}zlexcount(e,t,n){const s=this.store.get(e)||new r,i=Array.from(s.keys()).sort();let o=0;for(const e of i)e>=t&&e<=n&&o++;return o}zmpop(e,...t){const n=[];for(const r of t){const t=this.store.get(r);if(t&&t.size>0){const s=Array.from(t.entries()).sort((e,t)=>e[1]-t[1]).slice(0,e).map(([e,n])=>(t.delete(e),[e,n]));n.push([r,...s]);break}}return n}zmscore(e,...t){const n=this.store.get(e)||new r;return t.map(e=>n.get(e))}zpopmax(e,t){const n=this.store.get(e);if(!n||0===n.size)return[];const r=Array.from(n.entries()).sort((e,t)=>t[1]-e[1]).slice(0,t).map(([e,t])=>(n.delete(e),[e,t]));return r}zpopmin(e,t){const n=this.store.get(e);if(!n||0===n.size)return[];const r=Array.from(n.entries()).sort((e,t)=>e[1]-t[1]).slice(0,t).map(([e,t])=>(n.delete(e),[e,t]));return r}zrandmember(e,t=1){const n=this.store.get(e);if(!n||0===n.size)return[];const r=Array.from(n.keys()),s=[];for(let e=0;ee[1]-t[1]);return t<0&&(t=i.length+t),n<0&&(n=i.length+n),i.slice(t,n+1).map(([e,t])=>[e,t])}zrangebylex(e,t,n,s={}){const i=this.store.get(e)||new r;let o=Array.from(i.keys()).sort().filter(e=>e>=t&&e<=n);if(s.limit){const{offset:e,count:t}=s.limit;o=o.slice(e,e+t)}return o}zrangebyscore(e,t,n,s={}){const i=this.store.get(e)||new r,o=Array.from(i.entries()).sort((e,t)=>e[1]-t[1]);let a=o.filter(([,e])=>e>=t&&e<=n);if(a=s.withscores?a.map(([e,t])=>[e,t]):a.map(([e])=>e),s.limit){const{offset:e,count:t}=s.limit;a=a.slice(e,e+t)}return a}zrangestore(e,t,n,s){const i=this.store.get(t)||new r,o=Array.from(i.entries()).sort((e,t)=>e[1]-t[1]);n<0&&(n=o.length+n),s<0&&(s=o.length+s);const a=new r(o.slice(n,s+1));return this.storeSet(e,a),a.size}zrank(e,t){const n=this.store.get(e);if(!n)return;const r=Array.from(n.entries()).sort((e,t)=>e[1]-t[1]);for(let e=0;e=t&&e<=n&&(r.delete(e),i++);return i}zremrangebyrank(e,t,n){const r=this.store.get(e);if(!r)return 0;const s=Array.from(r.entries()).sort((e,t)=>e[1]-t[1]);t<0&&(t=s.length+t),n<0&&(n=s.length+n);let i=0;for(let e=t;e<=n;e++)r.delete(s[e][0])&&i++;return i}zremrangebyscore(e,t,n){const r=this.store.get(e);if(!r)return 0;const s=Array.from(r.entries()).sort((e,t)=>e[1]-t[1]);let i=0;for(const[e,o]of s)o>=t&&o<=n&&(r.delete(e),i++);return i}zrevrange(e,t,n){const s=this.store.get(e)||new r,i=Array.from(s.entries()).sort((e,t)=>t[1]-e[1]);return t<0&&(t=i.length+t),n<0&&(n=i.length+n),i.slice(t,n+1).map(([e,t])=>[e,t])}zrevrangebylex(e,t,n,s={}){const i=this.store.get(e)||new r;let o=Array.from(i.keys()).sort().reverse().filter(e=>e>=n&&e<=t);if(s.limit){const{offset:e,count:t}=s.limit;o=o.slice(e,e+t)}return o}zrevrangebyscore(e,t,n,s={}){const i=this.store.get(e)||new r,o=Array.from(i.entries()).sort((e,t)=>t[1]-e[1]);let a=o.filter(([,e])=>e>=n&&e<=t);if(a=s.withscores?a.map(([e,t])=>[e,t]):a.map(([e])=>e),s.limit){const{offset:e,count:t}=s.limit;a=a.slice(e,e+t)}return a}zrevrank(e,t){const n=this.store.get(e);if(!n)return;const r=Array.from(n.entries()).sort((e,t)=>t[1]-e[1]);for(let e=0;ee[1]-t[1]),o=[];let a=n.count||10,c=t;for(;a>0&&c=i.length?0:c,o]}zscore(e,t){const n=this.store.get(e);if(n)return n.get(t)}zunion(e){const t=new r;for(const n of e){const e=this.store.get(n);if(e)for(const[n,r]of e.entries())t.set(n,(t.get(n)||0)+r)}return Array.from(t.entries()).sort((e,t)=>e[1]-t[1])}zunionstore(e,t){const n=this.zunion(t),s=new r(n);return this.storeSet(e,s),s.size}geoadd(e,t,n,s){if("number"!=typeof t||"number"!=typeof n)throw new Error("Invalid longitude or latitude value");const i=this.store.get(e)||new r;if(!i.get(s)){const r={longitude:t,latitude:n};return i.set(s,r),this.storeSet(e,i),1}return 0}geodist(e,t,n,r="m"){const s=this.store.get(e);if(!s)return;const i=s.get(t),o=s.get(n);if(!i||!o)return;const a=this._haversineDistance(i.latitude,i.longitude,o.latitude,o.longitude);return this._convertDistance(a,r)}geohash(e,...t){const n=this.store.get(e);return n?t.map(e=>{const t=n.get(e);return t?this._encodeGeohash(t.latitude,t.longitude):null}):[]}geopos(e,...t){const n=this.store.get(e);return n?t.map(e=>{const t=n.get(e);return t?[t.latitude,t.longitude]:null}):[]}georadius(e,t,n,r,s="m"){const i=this.store.get(e);if(!i)return[];const o=this._convertDistance(r,s,"m"),a=[];for(const[e,r]of i.entries())this._haversineDistance(n,t,r.latitude,r.longitude)<=o&&a.push(e);return a}georadius_ro(e,t,n,r){return this.georadius(e,t,n,r,!0)}georadiusbymember(e,t,n){const r=this.geopos(e,t);if(r)return this.georadius(r[0],r[1],n,e)}georadiusbymember_ro(e,t,n){const r=this.geopos(e,t);if(r)return this.georadius(r[0],r[1],n,e,!0)}geosearch(e,t,n,r){return this.georadius(t,n,r,e)}geosearchstore(e,t,n,r,s){const i=this.georadius(n,r,s,t);return this.set(e,i),i.length}scan(e,t="*",n=10){const r=this.keys(t),s=Math.min(e+n,r.length);return[s===r.length?0:s,r.slice(e,s)]}sort(e,t="ASC",n=!1){const r=this.store.get(e);if(!Array.isArray(r))return[];const s=r.slice().sort((e,r)=>n?"ASC"===t?e.localeCompare(r):r.localeCompare(e):"ASC"===t?e-r:r-e);return s}touch(...e){return e.reduce((e,t)=>e+(this.exists(t)?1:0),0)}sort_ro(e,t="ASC",n=!1){return this.sort(e,t,n)}unlink(...e){let t=0;for(const n of e)this.del(n)&&t++;return t}hset(e,t,n){this.store.has(e)||this.storeSet(e,new r);const s=this.store.get(e),i=!s.has(t);return s.set(t,n),i?1:0}hdel(e,...t){const n=this.store.get(e);if(!n)return 0;let r=0;for(const e of t)n.delete(e)&&r++;return r}hget(e,t){const n=this.store.get(e);return n?n.get(t):void 0}hgetall(e){const t=this.store.get(e);if(!t)return{};const n={};for(const[e,r]of t)n[e]=r;return n}hincrby(e,t,n){const s=this.store.get(e)||new r,i=parseInt(s.get(t)||0,10)+n;return s.set(t,i.toString()),this.storeSet(e,s),i}hincrbyfloat(e,t,n){const s=this.store.get(e)||new r,i=parseFloat(s.get(t)||0)+n;return s.set(t,i.toString()),this.storeSet(e,s),i}hkeys(e){const t=this.store.get(e);return t?Array.from(t.keys()):[]}hlen(e){const t=this.store.get(e);return t?t.size:0}hmget(e,...t){const n=this.store.get(e)||new r;return t.map(e=>n.get(e))}hmset(e,...t){const n=this.store.get(e)||new r;for(let e=0;ee.includes(n)),a=Math.min(t+s,o.length);return[a===o.length?0:a,o.slice(t,a).map(e=>[e,i.get(e)])]}hexists(e,t){const n=this.store.get(e);return n&&n.has(t)?1:0}hrandfield(e,t=1){const n=this.store.get(e);if(!n)return[];const r=Array.from(n.keys()),s=[];for(let e=0;et)&&(this.store.delete(e),this.expireTimes.delete(e),this.isIndexedDBAvailable&&this.db&&this._removeFromIndexedDB(e),!0)}_initCleanupLoop(e){1===this.store.size&&(this.cleanupLoop=setInterval(()=>{if(0===this.store.size&&this.cleanupLoop)clearInterval(this.cleanupLoop);else for(const e of this.expireTimes.keys())this._checkAndRemoveExpiredKey(e)},e),"object"==typeof this.cleanupLoop&&"function"==typeof this.cleanupLoop.unref&&this.cleanupLoop.unref())}_haversineDistance(e,t,n,r){const s=e=>e*Math.PI/180,i=s(n-e),o=s(r-t),a=Math.sin(i/2)*Math.sin(i/2)+Math.cos(s(e))*Math.cos(s(n))*Math.sin(o/2)*Math.sin(o/2);return 2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a))*6371e3}_convertDistance(e,t,n){const r={m:1,km:.001,mi:621371e-9,ft:3.28084};if(!r[t]||!r[n])throw new Error("Invalid distance unit");return e*r[t]/r[n]}_encodeGeohash(e,t){let n="",r=-90,s=90,i=-180,o=180,a=!0,c=0,l=0;for(;n.length<12;){if(a){const e=(i+o)/2;t>e?(l=1+(l<<1),i=e):(l<<=1,o=e)}else{const t=(r+s)/2;e>t?(l=1+(l<<1),r=t):(l<<=1,s=t)}a=!a,c<4?c++:(n+="0123456789bcdefghjkmnpqrstuvwxyz"[l],c=0,l=0)}return n}flushall(){return this.store.clear(),this.expireTimes.clear(),this.isIndexedDBAvailable&&this.db&&this._clearIndexedDB(),!0}async _clearIndexedDB(){if(this.db)try{const e=this.db.transaction(["store","expireTimes"],"readwrite"),t=e.objectStore("store"),n=e.objectStore("expireTimes");t.clear(),n.clear()}catch(e){console.warn("Failed to clear IndexedDB:",e)}}}}},t={},n=function n(r){var s=t[r];if(void 0!==s)return s.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}(429);const r=class{constructor(e={}){this.config={enabled:e.enabled??!1,...e}}updateConfig(e){this.config={...this.config,...e}}enable(){this.config.enabled=!0}disable(){this.config.enabled=!1}isEnabled(){return this.config.enabled}logRequest(e={}){if(!this.isEnabled())return;const{service:t="unknown",operation:n="unknown",params:r={},result:s=null,error:i=null}=e;let o="{}";if(r&&Object.keys(r).length>0)try{o=JSON.stringify(r)}catch(e){o="[Unable to serialize params]"}const a=`${t} - ${n} - ${o}`;i?console.error(a,{error:i.message||i,result:s}):console.log(a,s)}getStats(){return{enabled:this.config.enabled,config:{...this.config}}}},s=47;function i(e){return e===s}function o(e,t,n,r){let i="",o=0,a=-1,c=0,l=0;for(let h=0;h<=e.length;++h){if(h2){const e=i.lastIndexOf(n);-1===e?(i="",o=0):(i=i.slice(0,e),o=i.length-1-i.lastIndexOf(i,n)),a=h,c=0;continue}if(0!==i.length){i="",o=0,a=h,c=0;continue}}t&&(i+=i.length>0?`${n}..`:"..",o=2)}else i.length>0?i+=`${n}${e.slice(a+1,h)}`:i=e.slice(a+1,h),o=h-a-1;a=h,c=0}else 46===l&&-1!==c?++c:c=-1}return i}const a={resolve(...e){let t="",n=!1;for(let r=e.length-1;r>=-1&&!n;r--){const i=r>=0?e[r]:"/";0!==i.length&&(t=`${i}/${t}`,n=i.charCodeAt(0)===s)}return t=o(t,!n,"/",i),n?`/${t}`:t.length>0?t:"."},normalize(e){if(0===e.length)return".";const t=e.charCodeAt(0)===s,n=e.charCodeAt(e.length-1)===s;return 0===(e=o(e,!t,"/",i)).length?t?"/":n?"./":".":(n&&(e+="/"),t?`/${e}`:e)},isAbsolute:e=>e.length>0&&e.charCodeAt(0)===s,join(...e){if(0===e.length)return".";let t;for(let n=0;n0&&(void 0===t?t=r:t+=`/${r}`)}return void 0===t?".":a.normalize(t)},relative(e,t){if(e===t)return"";if((e=a.resolve(e))===(t=a.resolve(t)))return"";const n=e.length,r=n-1,i=t.length-1,o=ro){if(t.charCodeAt(1+l)===s)return t.slice(1+l+1);if(0===l)return t.slice(1+l)}else r>o&&(e.charCodeAt(1+l)===s?c=l:0===l&&(c=0));let h="";for(l=1+c+1;l<=n;++l)l!==n&&e.charCodeAt(l)!==s||(h+=0===h.length?"..":"/..");return`${h}${t.slice(1+c)}`},toNamespacedPath:e=>e,dirname(e){if(0===e.length)return".";const t=e.charCodeAt(0)===s;let n=-1,r=!0;for(let t=e.length-1;t>=1;--t)if(e.charCodeAt(t)===s){if(!r){n=t;break}}else r=!1;return-1===n?t?"/":".":t&&1===n?"//":e.slice(0,n)},basename(e,t){let n=0,r=-1,i=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t===e)return"";let o=t.length-1,a=-1;for(let c=e.length-1;c>=0;--c){const l=e.charCodeAt(c);if(l===s){if(!i){n=c+1;break}}else-1===a&&(i=!1,a=c+1),o>=0&&(l===t.charCodeAt(o)?-1===--o&&(r=c):(o=-1,r=a))}return n===r?r=a:-1===r&&(r=e.length),e.slice(n,r)}for(let t=e.length-1;t>=0;--t)if(e.charCodeAt(t)===s){if(!i){n=t+1;break}}else-1===r&&(i=!1,r=t+1);return-1===r?"":e.slice(n,r)},extname(e){let t=-1,n=0,r=-1,i=!0,o=0;for(let a=e.length-1;a>=0;--a){const c=e.charCodeAt(a);if(c!==s)-1===r&&(i=!1,r=a+1),46===c?-1===t?t=a:1!==o&&(o=1):-1!==t&&(o=-1);else if(!i){n=a+1;break}}return-1===t||-1===r||0===o||1===o&&t===r-1&&t===n+1?"":e.slice(t,r)},format:function(e,t){validateObject(t,"pathObject");const n=t.dir||t.root,r=t.base||`${t.name||""}${t.ext||""}`;return n?n===t.root?`${n}${r}`:`${n}${e}${r}`:r}.bind(null,"/"),parse(e){const t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;const n=e.charCodeAt(0)===s;let r;n?(t.root="/",r=1):r=0;let i=-1,o=0,a=-1,c=!0,l=e.length-1,h=0;for(;l>=r;--l){const t=e.charCodeAt(l);if(t!==s)-1===a&&(c=!1,a=l+1),46===t?-1===i?i=l:1!==h&&(h=1):-1!==i&&(h=-1);else if(!c){o=l+1;break}}if(-1!==a){const r=0===o&&n?1:o;-1===i||0===h||1===h&&i===a-1&&i===o+1?t.base=t.name=e.slice(r,a):(t.name=e.slice(r,i),t.base=e.slice(r,a),t.ext=e.slice(i,a))}return o>0?t.dir=e.slice(0,o-1):n&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null},c=a;var l={},h={};l.length=0,l.getItem=function(e){return e in h?h[e]:null},l.setItem=function(e,t){void 0===t?l.removeItem(e):(h.hasOwnProperty(e)||l.length++,h[e]=`${t}`)},l.removeItem=function(e){h.hasOwnProperty(e)&&(delete h[e],l.length--)},l.key=function(e){return Object.keys(h)[e]||null},l.clear=function(){h={},l.length=0},"object"==typeof exports&&(module.exports=l);const u=l,d=Symbol("readyState"),p=Symbol("headers"),g=Symbol("response headers"),f=Symbol("AbortController"),m=Symbol("method"),y=Symbol("URL"),b=Symbol("MIME"),w=Symbol("dispatch"),v=Symbol("errored"),k=Symbol("timeout"),A=Symbol("timedOut"),_=Symbol("isResponseText");function x(...e){const t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t);return e.forEach((e,t,r)=>{const s=r.slice(0,t).reduce((e,t)=>e+t.length,0);n.set(e,s)}),n}async function I(e){const t=this.responseType||"text",n=new TextDecoder,r=this[b]||this[g].get("content-type")||"text/plain";switch(t){case"text":this.response=n.decode(e);break;case"blob":this.response=new Blob([e],{type:r});break;case"arraybuffer":this.response=e.buffer;break;case"json":this.response=JSON.parse(n.decode(e))}}const T=class extends EventTarget{onreadystatechange(){}set readyState(e){this[d]!==e&&(this[d]=e,this.dispatchEvent(new Event("readystatechange")),this.onreadystatechange(new Event("readystatechange")))}get readyState(){return this[d]}constructor(){super(),this.readyState=this.constructor.UNSENT,this.response=null,this.responseType="",this.responseURL="",this.status=0,this.statusText="",this.timeout=0,this.withCredentials=!1,this[p]=Object.create(null),this[p].accept="*/*",this[g]=Object.create(null),this[f]=new AbortController,this[m]="",this[y]="",this[b]="",this[v]=!1,this[k]=0,this[A]=!1,this[_]=!0}static get UNSENT(){return 0}static get OPENED(){return 1}static get HEADERS_RECEIVED(){return 2}static get LOADING(){return 3}static get DONE(){return 4}upload={addEventListener(){}};get responseText(){if(this[v])return null;if(this.readyState`${e}: ${t}`)).join("\r\n")}getResponseHeader(e){const t=this[g].get(String(e).toLowerCase());return"string"==typeof t?t:null}send(e=null){this.timeout>0&&(this[k]=setTimeout(()=>{this[A]=!0,this[f].abort()},this.timeout));const t=this.responseType||"text";this[_]="text"===t,this.setRequestHeader("user-agent","puter-js/1.0"),this.setRequestHeader("origin","https://puter.work"),this.setRequestHeader("referer","https://puter.work/"),fetch(this[y],{method:this[m]||"GET",signal:this[f].signal,headers:this[p],credentials:this.withCredentials?"include":"same-origin",body:e}).then(async e=>{if(this.responseURL=e.url,this.status=e.status,this.statusText=e.statusText,this[g]=e.headers,this.readyState=this.constructor.HEADERS_RECEIVED,e.headers.get("content-type").includes("application/x-ndjson")||this.streamRequestBadForPerformance){let t=new Uint8Array;for await(const n of e.body)this.readyState=this.constructor.LOADING,t=x(t,n),I.call(this,t),this[w](new CustomEvent("progress"))}else{const t=[];for await(const n of e.body)t.push(n);I.call(this,x(...t))}this.readyState=this.constructor.DONE,this[w](new CustomEvent("load"))},e=>{let t="abort";"AbortError"!==e.name?(this[v]=!0,t="error"):this[A]&&(t="timeout"),this.readyState=this.constructor.DONE,this[w](new CustomEvent(t))}).finally(()=>this[w](new CustomEvent("loadend"))).finally(()=>{clearTimeout(this[k]),this[w](new CustomEvent("loadstart"))})}};"object"==typeof module&&module.exports?module.exports=T:(globalThis||self).XMLHttpRequestShim=T;const E=T;class S{constructor(){this.result=null,this.error=null,this.onloadend=null}readAsDataURL(e){const t=this;!async function(){try{let n;n=e&&"function"==typeof e.arrayBuffer?await e.arrayBuffer():e instanceof ArrayBuffer?e:ArrayBuffer.isView(e)?e.buffer:new Uint8Array(0).buffer;const r=function(e){const t=new Uint8Array(e).reduce((e,t)=>e+String.fromCharCode(t),"");return"function"==typeof btoa?btoa(t):Buffer.from(t,"binary").toString("base64")}(n),s=e&&e.type||"application/octet-stream";t.result="data:"+s+";base64,"+r,"function"==typeof t.onloadend&&t.onloadend()}catch(e){t.error=e,"function"==typeof t.onloadend&&t.onloadend()}}()}}class P extends(globalThis.HTMLElement||Object){constructor(e){super(),this.message=e||"You have reached your usage limit for this account.",this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=`\n \n \n
\n \n
\n \n \n \n
\n

Low Balance

\n

${this.message}

\n
\n \n \n
\n
\n
\n `}connectedCallback(){const e=this.shadowRoot.querySelector("dialog");this.shadowRoot.querySelector(".close-btn").addEventListener("click",()=>{this.close()}),this.shadowRoot.querySelector("#close-btn").addEventListener("click",()=>{this.close()}),this.shadowRoot.querySelector("#upgrade-btn").addEventListener("click",()=>{window.open("https://puter.com/dashboard","_blank"),this.close()}),e.addEventListener("click",t=>{t.target===e&&this.close()})}open(){this.shadowRoot.querySelector("dialog").showModal()}close(){this.shadowRoot.querySelector("dialog").close(),this.remove()}}function C(e){if(void 0===globalThis.document)return void console.warn("[Puter]",e);if(document.querySelector("usage-limit-dialog"))return;const t=new P(e);document.body.appendChild(t),t.open()}void 0!==globalThis.HTMLElement&&globalThis.customElements&&(customElements.get("usage-limit-dialog")||customElements.define("usage-limit-dialog",P));class O extends(globalThis.HTMLElement||Object){constructor(e){super(),this.message=e||"Please confirm your email address to use this service.",this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=`\n \n \n
\n \n
\n \n \n \n
\n

Confirm Your Email

\n

${this.message}

\n
\n \n \n
\n
\n
\n `}connectedCallback(){const e=this.shadowRoot.querySelector("dialog");this.shadowRoot.querySelector(".close-btn").addEventListener("click",()=>{this.close()}),this.shadowRoot.querySelector("#close-btn").addEventListener("click",()=>{this.close()}),this.shadowRoot.querySelector("#confirm-email-btn").addEventListener("click",()=>{window.open("https://puter.com","_blank"),this.close()}),e.addEventListener("click",t=>{t.target===e&&this.close()})}open(){this.shadowRoot.querySelector("dialog").showModal()}close(){this.shadowRoot.querySelector("dialog").close(),this.remove()}}function D(e){if(void 0===globalThis.document)return;if(document.querySelector("email-confirmation-dialog"))return;const t=new O(e);document.body.appendChild(t),t.open()}async function R(e){if("blob"===e.responseType){const t=e.getResponseHeader("content-type");if(t.startsWith("application/json")){const t=await e.response.text();try{return JSON.parse(t)}catch(e){return t}}else if(t.startsWith("application/octet-stream"))return e.response;return{success:!0,result:e.response}}const t=e.responseText;try{return JSON.parse(t)}catch(e){return t}}void 0!==globalThis.HTMLElement&&globalThis.customElements&&(customElements.get("email-confirmation-dialog")||customElements.define("email-confirmation-dialog",O));const L=()=>{let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}};function q(e,t,n,r="post",s="text/plain;actually=json",i=void 0){const o=new XMLHttpRequest;return o.open(r,t+e,!0),n&&o.setRequestHeader("Authorization",`Bearer ${n}`),o.setRequestHeader("Content-Type",s),o.responseType=i??"",globalThis.puter?.apiCallLogger?.isEnabled()&&(o._puterRequestId={method:r,service:"xhr",operation:e.replace(/^\//,""),params:{endpoint:e,contentType:s,responseType:i}}),o}function M(e,t,n){return e&&"function"==typeof e&&e(n),t(n)}function U(e,t,n,r,s){e.addEventListener("load",async function(e){if(globalThis.puter?.apiCallLogger?.isEnabled()&&this._puterRequestId){const e=await R(this).catch(()=>null);globalThis.puter.apiCallLogger.logRequest({service:this._puterRequestId.service,operation:this._puterRequestId.operation,params:this._puterRequestId.params,result:this.status>=400?null:e,error:this.status>=400?{message:this.statusText,status:this.status}:null})}return async function(e,t,n,r,s){const i=await R(s);return 401===s.status?(t&&"function"==typeof t&&t({status:401,message:"Unauthorized"}),r({status:401,message:"Unauthorized"})):200!==s.status?(t&&"function"==typeof t&&t(i),r(i)):(!1===i.success&&"permission_denied"===i.error?.code&&(await puter.ui.requestPermission({permission:"driver:puter-image-generation:generate"})).granted,e&&"function"==typeof e&&e(i),n(i))}(t,n,r,s,this)}),e.addEventListener("error",function(e){return globalThis.puter?.apiCallLogger?.isEnabled()&&this._puterRequestId&&globalThis.puter.apiCallLogger.logRequest({service:this._puterRequestId.service,operation:this._puterRequestId.operation,params:this._puterRequestId.params,error:{message:"Network error occurred",event:e.type}}),M(n,s,this)})}const B=()=>{};class j{static callback(e){return e&&"function"==typeof e?e:void 0}}function z(e,t,n,r,s={}){return async function(...i){let o={},a={};return 1!==i.length||"object"!=typeof i[0]||Array.isArray(i[0])?(e.forEach((e,t)=>{o[e]=i[t]}),a={success:i[e.length],error:i[e.length+1]}):(o={...i[0]},a={success:o.success,error:o.error},delete o.success,delete o.error),s.preprocess&&"function"==typeof s.preprocess&&(o=s.preprocess(o)),await async function(e,t,n,r,s,i){const o=L();return N(e,o.resolve,o.reject,t,n,r,s,void 0,void 0,i),await o.promise}(a,t,n,r,o,s)}}async function N(e={},t,n,r,s,i,o,a,c="text/plain;actually=json",l={}){let h=null;if(globalThis.puter?.apiCallLogger?.isEnabled()&&(h={interface:r,driver:s,method:i,args:o}),!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){return h&&globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"drivers",operation:`${r}::${i}`,params:{interface:r,driver:s,method:i,args:o},error:{code:"auth_canceled",message:"Authentication canceled"}}),n({error:{code:"auth_canceled",message:"Authentication canceled"}})}const u=j.callback(e.success)??B,d=j.callback(e.error)??B,p=q("/drivers/call",puter.APIOrigin,void 0,"POST",c);h&&(p._puterDriverRequestInfo=h),l.responseType&&(p.responseType=l.responseType);let g=!1,f=null,m=0,y=!1,b="";const w=[];p.onreadystatechange=()=>{if(2===p.readyState){if("application/x-ndjson"!==p.getResponseHeader("Content-Type"))return;g=!0;const e=async function*(){for(;!y;){const e=L();if(f=e.resolve,await e.promise,y)break;for(;w.length>0;){const e=w.shift();if(""===e.trim())continue;const t=JSON.parse(e);"insufficient_funds"!==t?.error?.code&&!0!==t?.metadata?.usage_limited||("web"===puter.env?C("You have reached your usage limit for this account.
Please upgrade to continue."):"app"===puter.env&&await puter.ui.requestUpgrade()),"email_must_be_confirmed"===t?.error?.code&&"web"===puter.env&&D(t?.error?.message||"Email confirmation required. Go to Puter.com to confirm your email address."),"string"==typeof t.text&&Object.defineProperty(t,"toString",{enumerable:!1,value:()=>t.text}),yield t}}}();return Object.defineProperty(e,"start",{enumerable:!1,value:async t=>{const n=new TextEncoder;for await(const r of e)t.enqueue(n.encode(r));t.close()}}),t(e)}4===p.readyState&&(y=!0,g&&f?.())},p.onprogress=function(){if(!f)return;const e=p.responseText.slice(m);m=p.responseText.length;let t=!1;for(let n=0;n=400||!1===h?.success?null:h,error:s.status>=400||!1===h?.success?h:null});const p=402===s.target?.status||"insufficient_funds"===h?.error?.code||402===h?.error?.status,f=!0===h?.metadata?.usage_limited;if((p||f)&&"web"===puter.env?C("Your account has not enough funding to complete this request.
Please upgrade to continue."):(p||f)&&"app"===puter.env&&await puter.ui.requestUpgrade(),"email_must_be_confirmed"===h?.error?.code&&"web"===puter.env&&D(h?.error?.message||"Email confirmation required. Go to Puter.com to confirm your email address."),401===s.status||"token_auth_failed"===h?.code){if("token_auth_failed"===h?.code&&"web"===puter.env)try{puter.resetAuthToken(),await puter.ui.authenticateWithPuter()}catch(e){return n({error:{code:"auth_canceled",message:"Authentication canceled"}})}return d&&"function"==typeof d&&d({status:401,message:"Unauthorized"}),n({status:401,message:"Unauthorized"})}if(s.status&&200!==s.status)return d(h),n(h);{if(!1===h.success&&"permission_denied"===h.error?.code)return(await puter.ui.requestPermission({permission:`driver:${r}:${i}`})).granted?N(e,t,n,r,i,o,a,c,l):(d(h),n(h));if(!1===h.success)return d(h),n(h);let s=void 0!==h.result?h.result:h;return l.transform&&(s=await l.transform(s)),t.success&&u(s),t(s)}}),p.addEventListener("error",function(e){return this._puterDriverRequestInfo&&globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"drivers",operation:`${this._puterDriverRequestInfo.interface}::${this._puterDriverRequestInfo.method}`,params:{interface:this._puterDriverRequestInfo.interface,driver:this._puterDriverRequestInfo.driver,method:this._puterDriverRequestInfo.method,args:this._puterDriverRequestInfo.args},error:{message:"Network error occurred",event:e.type}}),M(d,n,this)}),p.send(JSON.stringify({interface:r,driver:s,test_mode:l?.test_mode,method:i,args:o,auth_token:puter.authToken}))}async function F(e){const t=new(globalThis.FileReader||S);return await new Promise((n,r)=>{t.onloadend=()=>n(t.result),t.onerror=r,t.readAsDataURL(e)})}function W(e){return new Promise((t,n)=>{const r=new(globalThis.FileReader||S);r.onload=function(e){t(e.target.result)},r.onerror=function(e){n(e)},r.readAsDataURL(e)})}const X=e=>{if("string"!=typeof e)return"aws-polly";const t=e.toLowerCase();return"openai"===t?"openai":["elevenlabs","eleven","11labs","11-labs","eleven-labs","elevenlabs-tts"].includes(t)?"elevenlabs":"aws"===t||"polly"===t||"aws-polly"===t?"aws-polly":e},V=["minimax/","google/","bytedance/","pixverse/","kwaivgi/","vidu/","wan-ai/"],K=class{constructor(e){this.puter=e,this.authToken=e.authToken,this.APIOrigin=e.APIOrigin,this.appID=e.appID}setAuthToken(e){this.authToken=e}setAPIOrigin(e){this.APIOrigin=e}async listModels(e){const t=this.authToken?{Authorization:`Bearer ${this.authToken}`}:{},n=async()=>{const n=await fetch(`${this.APIOrigin}/puterai/chat/models/details`,{headers:t});if(!n.ok)return null;const r=await n.json(),s=Array.isArray(r?.models)?r.models:[];return e?s.filter(t=>t.provider===e):s};return await(async()=>{try{const e=await n();if(null!==e)return e}catch(e){}try{return await(async()=>{const t=await puter.drivers.call("puter-chat-completion","ai-chat","models"),n=Array.isArray(t?.result)?t.result:[];return e?n.filter(t=>t.provider===e):n})()}catch(e){return[]}})()}async listModelProviders(){const e=await this.listModels(),t=new Set;return(e??[]).forEach(e=>{e?.provider&&t.add(e.provider)}),Array.from(t)}img2txt=async(...e)=>{if(!e||0===e.length)throw{message:"Arguments are required",code:"arguments_required"};const t=e=>"undefined"!=typeof Blob&&(e instanceof Blob||"undefined"!=typeof File&&e instanceof File),n=e=>e&&"object"==typeof e&&!Array.isArray(e)&&!t(e);let r={};n(e[0])?r={...e[0]}:r.source=e[0];let s=!1;for(let t=1;t{if(!e)return"aws-textract";const t=String(e).toLowerCase();return["aws","textract","aws-textract"].includes(t)?"aws-textract":["mistral","mistral-ocr"].includes(t)?"mistral":"aws-textract"})(r.provider);if(delete r.provider,delete r.testMode,!r.source)throw{message:"Source is required",code:"source_required"};if(t(r.source)?r.source=await W(r.source):r.source?.source&&t(r.source.source)&&(r.source=await W(r.source.source)),"string"==typeof r.source&&r.source.startsWith("data:")&&r.source.length>10485760)throw{message:"Input size cannot be larger than 10485760",code:"input_too_large"};const o=z(["source"],"puter-ocr",i,"recognize",{test_mode:s??!1,transform:async e=>(e=>{if(!e)return"";if(Array.isArray(e.blocks)&&e.blocks.length){let t="";for(const n of e.blocks)"string"==typeof n?.text&&(n.type&&"text/textract:LINE"!==n.type&&!n.type.startsWith("text/")||(t+=`${n.text}\n`));if(t.trim())return t}if(Array.isArray(e.pages)&&e.pages.length){const t=e.pages.map(e=>(e?.markdown||"").trim()).filter(Boolean).join("\n\n");if(t.trim())return t}return"string"==typeof e.document_annotation?e.document_annotation:"string"==typeof e.text?e.text:""})(e)});return await o.call(this,r)};txt2speech=async(...e)=>{let t={},n=!1;if(!e)throw{message:"Arguments are required",code:"arguments_required"};if("string"==typeof e[0]&&(t={text:e[0]}),e[1]&&"object"==typeof e[1]&&!Array.isArray(e[1]))Object.assign(t,e[1]);else if(e[1]&&"string"==typeof e[1])t.language=e[1],e[2]&&"string"==typeof e[2]&&(t.voice=e[2]),e[3]&&"string"==typeof e[3]&&(t.engine=e[3]);else if(e[1]&&"boolean"!=typeof e[1])throw{message:'Second argument must be an options object or language string. Use: txt2speech("text", { voice: "name", engine: "type", language: "code" }) or txt2speech("text", "language", "voice", "engine")',code:"invalid_arguments"};if(!t.text)throw{message:"Text parameter is required",code:"text_required"};const r=["standard","neural","long-form","generative"];let s=X(t.provider);if(t.engine&&"openai"===X(t.engine)&&!t.provider&&(s="openai"),t.engine&&"elevenlabs"===X(t.engine)&&!t.provider&&(s="elevenlabs"),"openai"===s)t.model||"string"!=typeof t.engine||(t.model=t.engine),t.voice||(t.voice="alloy"),t.model||(t.model="gpt-4o-mini-tts"),t.response_format||(t.response_format="mp3"),delete t.engine;else if("elevenlabs"===s)t.voice||(t.voice="21m00Tcm4TlvDq8ikWAM"),t.model||"string"!=typeof t.engine||(t.model=t.engine),t.model||(t.model="eleven_multilingual_v2"),t.output_format||t.response_format||(t.output_format="mp3_44100_128"),t.response_format&&!t.output_format&&(t.output_format=t.response_format),delete t.engine;else{if(s="aws-polly",t.engine&&!r.includes(t.engine))throw{message:`Invalid engine. Must be one of: ${r.join(", ")}`,code:"invalid_engine"};t.voice||(t.voice="Joanna"),t.engine||(t.engine="standard"),t.language||(t.language="en-US")}if(t.text.length>3e3)throw{message:"Input size cannot be larger than 3000",code:"input_too_large"};for(let t=0;t{let t;if("string"==typeof e)t=e;else if(e instanceof Blob)t=await F(e);else if(e instanceof ArrayBuffer){const n=new Blob([e]);t=await F(n)}else{if(!e||"object"!=typeof e||"function"!=typeof e.arrayBuffer)throw{message:"Unexpected audio response format",code:"invalid_audio_response"};{const n=await e.arrayBuffer(),r=new Blob([n],{type:e.type||void 0});t=await F(r)}}const n=new(globalThis.Audio||Object);return n.src=t,n.toString=()=>t,n.valueOf=()=>t,n}}).call(this,t)};speech2speech=async(...e)=>{if(!e||!e.length)throw{message:"Arguments are required",code:"arguments_required"};const t=async e=>e instanceof Blob?await W(e):e;let n={},r=!1;const s=e[0];if(!s||"object"!=typeof s||Array.isArray(s)||s instanceof Blob?n.audio=await t(s):n={...s},!e[1]||"object"!=typeof e[1]||Array.isArray(e[1])||e[1]instanceof Blob?"boolean"==typeof e[1]&&(r=e[1]):n={...n,...e[1]},"boolean"==typeof e[2]&&(r=e[2]),n.file&&(n.audio=await t(n.file),delete n.file),n.audio instanceof Blob&&(n.audio=await t(n.audio)),!n.audio)throw{message:"Audio input is required",code:"audio_required"};if("string"==typeof n.audio&&n.audio.startsWith("data:")){const e=n.audio.split(",")[1]||"",t=e.endsWith("==")?2:e.endsWith("=")?1:0;if(Math.floor(3*e.length/4)-t>26214400)throw{message:"Input size cannot be larger than 25 MB",code:"input_too_large"}}const i=((e={})=>{const t={...e};return!t.voiceId||t.voice||t.voice_id||(t.voice=t.voiceId),!t.modelId||t.model||t.model_id||(t.model=t.modelId),t.outputFormat&&!t.output_format&&(t.output_format=t.outputFormat),t.voiceSettings&&!t.voice_settings&&(t.voice_settings=t.voiceSettings),t.fileFormat&&!t.file_format&&(t.file_format=t.fileFormat),void 0!==t.removeBackgroundNoise&&void 0===t.remove_background_noise&&(t.remove_background_noise=t.removeBackgroundNoise),void 0!==t.optimizeStreamingLatency&&void 0===t.optimize_streaming_latency&&(t.optimize_streaming_latency=t.optimizeStreamingLatency),void 0!==t.enableLogging&&void 0===t.enable_logging&&(t.enable_logging=t.enableLogging),delete t.voiceId,delete t.modelId,delete t.outputFormat,delete t.voiceSettings,delete t.fileFormat,delete t.removeBackgroundNoise,delete t.optimizeStreamingLatency,delete t.enableLogging,t})({...n});return delete i.provider,await z(["audio"],"puter-speech2speech","elevenlabs-voice-changer","convert",{responseType:"blob",test_mode:r,transform:async e=>{let t;if("string"==typeof e)t=e;else if(e instanceof Blob)t=await F(e);else if(e instanceof ArrayBuffer){const n=new Blob([e]);t=await F(n)}else{if(!e||"object"!=typeof e||"function"!=typeof e.arrayBuffer)throw{message:"Unexpected audio response format",code:"invalid_audio_response"};{const n=await e.arrayBuffer(),r=new Blob([n],{type:e.type||void 0});t=await F(r)}}const n=new Audio(t);return n.toString=()=>t,n.valueOf=()=>t,n}}).call(this,i)};speech2txt=async(...e)=>{if(!e||!e.length)throw{message:"Arguments are required",code:"arguments_required"};const t=async e=>e instanceof Blob?await W(e):e;let n={},r=!1;const s=e[0];if(!s||"object"!=typeof s||Array.isArray(s)||s instanceof Blob?n.file=await t(s):n={...s},!e[1]||"object"!=typeof e[1]||Array.isArray(e[1])||e[1]instanceof Blob?"boolean"==typeof e[1]&&(r=e[1]):n={...n,...e[1]},"boolean"==typeof e[2]&&(r=e[2]),n.audio&&(n.file=await t(n.audio),delete n.audio),n.file instanceof Blob&&(n.file=await t(n.file)),!n.file)throw{message:"Audio input is required",code:"audio_required"};if("string"==typeof n.file&&n.file.startsWith("data:")){const e=n.file.split(",")[1]||"",t=e.endsWith("==")?2:e.endsWith("=")?1:0;if(Math.floor(3*e.length/4)-t>26214400)throw{message:"Input size cannot be larger than 25 MB",code:"input_too_large"}}const i=n.translate?"translate":"transcribe",o={...n};delete o.translate;const a=o.response_format;return await z([],"puter-speech2txt","openai-speech2txt",i,{test_mode:r,transform:async e=>"text"===a&&e&&"object"==typeof e&&"string"==typeof e.text?e.text:e}).call(this,o)};txt2speech=Object.assign(this.txt2speech,{listEngines:async(e={})=>{let t="aws-polly",n={};"string"==typeof e?t=X(e):e&&"object"==typeof e&&(t=X(e.provider)||t,n={...e},delete n.provider),"openai"===t&&(n.provider="openai"),"elevenlabs"===t&&(n.provider="elevenlabs");const r="openai"===t?"openai-tts":"elevenlabs"===t?"elevenlabs-tts":"aws-polly";return await z(["source"],"puter-tts",r,"list_engines",{responseType:"text"}).call(this,n)},listVoices:async e=>{let t="aws-polly",n={};return"string"==typeof e?n.engine=e:e&&"object"==typeof e&&(t=X(e.provider)||t,n={...e},delete n.provider),"openai"===t&&(n.provider="openai",delete n.engine),"elevenlabs"===t&&(n.provider="elevenlabs"),z(["source"],"puter-tts","openai"===t?"openai-tts":"elevenlabs"===t?"elevenlabs-tts":"aws-polly","list_voices",{responseType:"text"}).call(this,n)}});chat=async(...e)=>{let t={},n={},r=!1;if(!e)throw{message:"Arguments are required",code:"arguments_required"};if("string"==typeof e[0]&&(t={messages:[{content:e[0]}]}),"string"!=typeof e[0]||e[1]&&"boolean"!=typeof e[1])if("string"==typeof e[0]&&("string"==typeof e[1]||e[1]instanceof File))e[1]instanceof File&&(e[1]=await W(e[1])),t={vision:!0,messages:[{content:[e[0],{image_url:{url:e[1]}}]}]};else if("string"==typeof e[0]&&Array.isArray(e[1])){for(let t=0;t"object"==typeof e&&!Array.isArray(e)&&null!==e;for(let t=0;t(e.toString=()=>e.message?.content,e.valueOf=()=>e.message?.content,e)}).call(this,t)};txt2img=async(...e)=>{let t={},n=!1;if(!e)throw{message:"Arguments are required",code:"arguments_required"};"string"==typeof e[0]&&(t={prompt:e[0]}),"boolean"==typeof e[1]&&!0===e[1]&&(n=!0),"string"==typeof e[0]&&"object"==typeof e[1]&&(t=e[1],t.prompt=e[0]),"object"==typeof e[0]&&(t=e[0]);let r="openai-image-generation";"nano-banana"===t.model&&(t.model="gemini-2.5-flash-image-preview"),"nano-banana-pro"===t.model&&(t.model="gemini-3-pro-image-preview");return r=("string"==typeof t.driver?t.driver:void 0)||"ai-image",await z(["prompt"],"puter-image-generation",r,"generate",{responseType:"blob",test_mode:n??!1,transform:async e=>{let t;if("string"==typeof e)t=e;else if(e instanceof Blob)t=await F(e);else if(e instanceof ArrayBuffer){const n=new Blob([e]);t=await F(n)}else{if(!e||"object"!=typeof e||"function"!=typeof e.arrayBuffer)throw{message:"Unexpected image response format",code:"invalid_image_response"};{const n=await e.arrayBuffer(),r=new Blob([n],{type:e.type||void 0});t=await F(r)}}let n=new(globalThis.Image||Object);return n.src=t,n.toString=()=>n.src,n.valueOf=()=>n.src,n}}).call(this,t)};txt2vid=async(...e)=>{let t={},n=!1;if(!e)throw{message:"Arguments are required",code:"arguments_required"};if("string"==typeof e[0]&&(t={prompt:e[0]}),"boolean"==typeof e[1]&&!0===e[1]&&(n=!0),"string"==typeof e[0]&&"object"==typeof e[1]&&(t=e[1],t.prompt=e[0]),"object"==typeof e[0]&&(t=e[0]),!t.prompt)throw{message:"Prompt parameter is required",code:"prompt_required"};t.model||(t.model="sora-2"),void 0!==t.duration&&void 0===t.seconds&&(t.seconds=t.duration);let r="openai-video-generation";const s="string"==typeof t.driver?t.driver:void 0,i=s?s.toLowerCase():void 0,o="string"==typeof t.provider?t.provider:"string"==typeof t.service?t.service:void 0,a="string"==typeof o?o.toLowerCase():void 0,c="string"==typeof t.model?t.model.toLowerCase():"",l="string"==typeof t.model&&(V.some(e=>c.startsWith(e))||t.model.startsWith("togetherai:"));return"together"===i||"together-ai"===i||"together-video-generation"===i?r="together-video-generation":"openai"===i?r="openai-video-generation":s?r=s:("together"===a||"together-ai"===a||l)&&(r="together-video-generation"),await z(["prompt"],"puter-video-generation",r,"generate",{responseType:"blob",test_mode:n??!1,transform:async e=>{let t=null,n=null;if(e instanceof Blob?(t=await F(e),n=e.type||"video/mp4"):"string"==typeof e?t=e:e&&"object"==typeof e&&(t=e.asset_url||e.url||e.href||null,n=e.mime_type||e.content_type||null),!t)return e;const r=globalThis.document?.createElement("video")||{setAttribute:()=>{}};return r.src=t,r.controls=!0,r.preload="metadata",n&&r.setAttribute("data-mime-type",n),r.setAttribute("data-source",t),r.toString=()=>r.src,r.valueOf=()=>r.src,r}}).call(this,t)}},G=class{constructor(e){this.puter=e,this.authToken=e.authToken,this.APIOrigin=e.APIOrigin,this.appID=e.appID}#t(e){return e.getUsers=async t=>(t=t??{},(await puter.drivers.call("app-telemetry","app-telemetry","get_users",{app_uuid:e.uid,limit:t.limit,offset:t.offset})).result),e.users=async function*(t=100){let n=0;for(;;){const r=await e.getUsers({limit:t,offset:n});if(!r||0===r.length)return;for(const e of r)yield e;if(n+=r.length,r.length{this.#t(e)}),e}setAuthToken(e){this.authToken=e}setAPIOrigin(e){this.APIOrigin=e}list=async(...e)=>{let t={};return"object"==typeof e[0]&&null!==e[0]&&(t.params=e[0]),t.predicate=["user-can-edit"],this.#n(await z(["uid"],"puter-apps","es:app","select").call(this,t))};create=async(...e)=>{let t={};if("string"==typeof e[0]){let n=e[1],r=e[2]??e[0];t={object:{name:e[0],index_url:n,title:r}}}else if("object"==typeof e[0]&&null!==e[0]){let n=e[0];t={object:{name:n.name,index_url:n.indexURL,title:n.title??n.name,description:n.description,icon:n.icon,maximize_on_start:n.maximizeOnStart,background:n.background,filetype_associations:n.filetypeAssociations,metadata:n.metadata},options:{dedupe_name:n.dedupeName??!1}}}if(!t.object.name)throw{success:!1,error:{code:"invalid_request",message:"Name is required"}};if(!t.object.index_url)throw{success:!1,error:{code:"invalid_request",message:"Index URL is required"}};return this.#t(await z(["object"],"puter-apps","es:app","create").call(this,t))};update=async(...e)=>{let t={};if(Array.isArray(e)&&"string"==typeof e[0]){let n=e[1],r={name:n.name,index_url:n.indexURL,title:n.title,description:n.description,icon:n.icon,maximize_on_start:n.maximizeOnStart,background:n.background,filetype_associations:n.filetypeAssociations,metadata:n.metadata};t={id:{name:e[0]},object:r}}return this.#t(await z(["object"],"puter-apps","es:app","update").call(this,t))};get=async(...e)=>{let t={};return Array.isArray(e)&&"string"==typeof e[0]&&("object"==typeof e[1]&&null!==e[1]&&(t.params=e[1]),t.id={name:e[0]}),"object"==typeof e[0]&&null!==e[0]&&(t.params=e[0]),this.#t(await z(["uid"],"puter-apps","es:app","read").call(this,t))};delete=async(...e)=>{let t={};return Array.isArray(e)&&"string"==typeof e[0]&&(t={id:{name:e[0]}}),z(["uid"],"puter-apps","es:app","delete").call(this,t)};checkName=async e=>{if("string"!=typeof e||0===e.length)throw{success:!1,error:{code:"invalid_request",message:"Name is required"}};const t=await fetch(`${puter.APIOrigin}/apps/nameAvailable?name=${encodeURIComponent(e)}`,{headers:{Authorization:`Bearer ${puter.authToken}`}}),n=await t.json();if(!t.ok)throw n;return n};getDeveloperProfile=function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{success:e[0],error:e[1]},new Promise((t,n)=>{let r;return r="object"==typeof e[0]&&null!==e[0]?e[0]:{success:e[0],error:e[1]},new Promise((e,s)=>{const i=q("/get-dev-profile",puter.APIOrigin,puter.authToken,"get");U(i,r.success??t,r.error??n,e,s),i.send()})})}},H=class{#r=1;constructor(e){this.puter=e,this.authToken=e.authToken,this.APIOrigin=e.APIOrigin,this.appID=e.appID}setAuthToken(e){this.authToken=e}setAPIOrigin(e){this.APIOrigin=e}signIn=e=>(e=e||{},new Promise((t,n)=>{let r=this.#r++;var s=screen.width/2-300,i=screen.height/2-350;const o=window.open(`${puter.defaultGUIOrigin}/action/sign-in?embedded_in_popup=true&msg_id=${r}${window.crossOriginIsolated?"&cross_origin_isolated=true":""}${e.attempt_temp_user_creation?"&attempt_temp_user_creation=true":""}`,"Puter",`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=600, height=700, top=${i}, left=${s}`),a=setInterval(()=>{o.closed&&(clearInterval(a),window.removeEventListener("message",c),n({error:"auth_window_closed",msg:"Authentication window was closed by the user without completing the process."}))},100);function c(e){e.data.msg_id==r&&(clearInterval(a),delete e.data.msg_id,delete e.data.msg,e.data.success?(puter.setAuthToken(e.data.token),t(e.data)):n(e.data),window.removeEventListener("message",c))}window.addEventListener("message",c)}));isSignedIn=()=>!!puter.authToken;getUser=function(...e){if(!puter.authToken)throw{status:401,message:"Unauthorized"};let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{success:e[0],error:e[1]},new Promise((e,n)=>{const r=q("/whoami",puter.APIOrigin,puter.authToken,"get");U(r,t.success,t.error,e,n),r.send()})};signOut=()=>{puter.resetAuthToken()};async whoami(){if(!this.authToken)throw{status:401,message:"Unauthorized"};try{const e=await fetch(`${this.APIOrigin}/whoami`,{headers:{Authorization:`Bearer ${this.authToken}`}}),t=await e.json();return globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"auth",operation:"whoami",params:{},result:t}),t}catch(e){throw globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"auth",operation:"whoami",params:{},error:{message:e.message||e.toString(),stack:e.stack}}),e}}async getMonthlyUsage(){try{const e=await fetch(`${this.APIOrigin}/metering/usage`,{headers:{Authorization:`Bearer ${this.authToken}`}}),t=await e.json();return globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"auth",operation:"usage",params:{},result:t}),t}catch(e){throw globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"auth",operation:"usage",params:{},error:{message:e.message||e.toString(),stack:e.stack}}),e}}async getDetailedAppUsage(e){if(!e)throw new Error("appId is required");try{const t=await fetch(`${this.APIOrigin}/metering/usage/${e}`,{headers:{Authorization:`Bearer ${this.authToken}`}}),n=await t.json();return globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"auth",operation:"detailed_app_usage",params:{appId:e},result:n}),n}catch(t){throw globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"auth",operation:"detailed_app_usage",params:{appId:e},error:{message:t.message||t.toString(),stack:t.stack}}),t}}async getGlobalUsage(){try{const e=await fetch(`${this.APIOrigin}/metering/globalUsage`,{headers:{Authorization:`Bearer ${this.authToken}`}}),t=await e.json();return globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"auth",operation:"global_usage",params:{},result:t}),t}catch(e){throw globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"auth",operation:"global_usage",params:{},error:{message:e.message||e.toString(),stack:e.stack}}),e}}};class Y{constructor(e,t){this.puter=e,this.parameters=t,this._init()}_init(){let e=new URL(location.href).searchParams.get("enabled_logs");e||(e=""),e=e.split(";");for(const t of e)""!==t&&this.puter.logger.on(t);globalThis.addEventListener("message",async e=>{e.source===globalThis.parent&&e.data.$&&"puterjs-debug"===e.data.$&&(console.log("Got a puter.js debug event!",e.data),"log.on"===e.data.cmd&&(console.log("Got instruction to turn logs on!"),this.puter.logger.on(e.data.category)))})}}class Q{constructor({getAPIOrigin:e,getAuthToken:t}){this.getAPIOrigin=e,this.getAuthToken=t,this.response_handlers=this.constructor.response_handlers}static response_handlers={"application/x-ndjson":async e=>async function*(e){const t=e.getReader();let n,r;for(;!r&&(({value:n,done:r}=await t.read()),!r);){const e=(new TextDecoder).decode(n).split("\n");for(const t of e)""!==t.trim()&&(yield JSON.parse(t))}}(e.body),"application/json":async e=>await e.json(),"application/octet-stream":async e=>await e.blob()};async call({driver:e,method_name:t,parameters:n}){try{const r=await fetch(`${this.getAPIOrigin()}/drivers/call`,{headers:{"Content-Type":"text/plain;actually=json"},method:"POST",body:JSON.stringify({interface:e.iface_name,...e.service_name?{service:e.service_name}:{},method:t,args:n,auth_token:this.getAuthToken()})}),s=r.headers.get("content-type").split(";")[0].trim(),i=this.response_handlers[s];if(!i){const i=`unrecognized content type: ${s}`;throw console.error(i),console.error("creating blob so dev tools shows response..."),await r.blob(),globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"drivers",operation:`${e.iface_name}::${t}`,params:{interface:e.iface_name,driver:e.service_name||e.iface_name,method:t,args:n},error:{message:i}}),new Error(i)}const o=await i(r);return globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"drivers",operation:`${e.iface_name}::${t}`,params:{interface:e.iface_name,driver:e.service_name||e.iface_name,method:t,args:n},result:o}),o}catch(r){throw globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"drivers",operation:`${e.iface_name}::${t}`,params:{interface:e.iface_name,driver:e.service_name||e.iface_name,method:t,args:n},error:{message:r.message||r.toString(),stack:r.stack}}),r}}}class Z{constructor({iface:e,iface_name:t,service_name:n,call_backend:r}){this.iface=e,this.iface_name=t,this.service_name=n,this.call_backend=r}async call(e,t){return await this.call_backend.call({driver:this,method_name:e,parameters:t})}}const J=class{constructor(e){this.puter=e,this.authToken=e.authToken,this.APIOrigin=e.APIOrigin,this.appID=e.appID,this.drivers_={}}_init({puter:e}){e.call=this.call.bind(this)}setAuthToken(e){this.authToken=e}setAPIOrigin(e){this.APIOrigin=e}async list(){try{const e=await fetch(`${this.APIOrigin}/lsmod`,{headers:{Authorization:`Bearer ${this.authToken}`},method:"POST"}),t=await e.json();return globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"drivers",operation:"list",params:{},result:t.interfaces}),t.interfaces}catch(e){throw globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"drivers",operation:"list",params:{},error:{message:e.message||e.toString(),stack:e.stack}}),e}}async get(e,t){t||(t=e);const n=`${e}:${t}`;return this.drivers_[n]?this.drivers_[n]:this.drivers_[n]=new Z({call_backend:new Q({getAPIOrigin:()=>this.APIOrigin,getAuthToken:()=>this.authToken}),iface_name:e,service_name:t})}async call(...e){let t,n,r,s;4===e.length?[t,n,r,s]=e:3===e.length?[t,r,s]=e:2===e.length&&([t,s]=e,r=t);const i=await this.get(t,n);return await i.call(r,s)}},$=Object.create(null);$.open="0",$.close="1",$.ping="2",$.pong="3",$.message="4",$.upgrade="5",$.noop="6";const ee=Object.create(null);Object.keys($).forEach(e=>{ee[$[e]]=e});const te={type:"error",data:"parser error"},ne="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),re="function"==typeof ArrayBuffer,se=e=>"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer instanceof ArrayBuffer,ie=({type:e,data:t},n,r)=>ne&&t instanceof Blob?n?r(t):oe(t,r):re&&(t instanceof ArrayBuffer||se(t))?n?r(t):oe(new Blob([t]),r):r($[e]+(t||"")),oe=(e,t)=>{const n=new FileReader;return n.onload=function(){const e=n.result.split(",")[1];t("b"+(e||""))},n.readAsDataURL(e)};function ae(e){return e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}let ce;const le="undefined"==typeof Uint8Array?[]:new Uint8Array(256);for(let e=0;e<64;e++)le["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charCodeAt(e)]=e;const he="function"==typeof ArrayBuffer,ue=(e,t)=>{if("string"!=typeof e)return{type:"message",data:pe(e,t)};const n=e.charAt(0);return"b"===n?{type:"message",data:de(e.substring(1),t)}:ee[n]?e.length>1?{type:ee[n],data:e.substring(1)}:{type:ee[n]}:te},de=(e,t)=>{if(he){const n=(e=>{let t,n,r,s,i,o=.75*e.length,a=e.length,c=0;"="===e[e.length-1]&&(o--,"="===e[e.length-2]&&o--);const l=new ArrayBuffer(o),h=new Uint8Array(l);for(t=0;t>4,h[c++]=(15&r)<<4|s>>2,h[c++]=(3&s)<<6|63&i;return l})(e);return pe(n,t)}return{base64:!0,data:e}},pe=(e,t)=>"blob"===t?e instanceof Blob?e:new Blob([e]):e instanceof ArrayBuffer?e:e.buffer,ge=String.fromCharCode(30);function fe(){return new TransformStream({transform(e,t){!function(e,t){ne&&e.data instanceof Blob?e.data.arrayBuffer().then(ae).then(t):re&&(e.data instanceof ArrayBuffer||se(e.data))?t(ae(e.data)):ie(e,!1,e=>{ce||(ce=new TextEncoder),t(ce.encode(e))})}(e,n=>{const r=n.length;let s;if(r<126)s=new Uint8Array(1),new DataView(s.buffer).setUint8(0,r);else if(r<65536){s=new Uint8Array(3);const e=new DataView(s.buffer);e.setUint8(0,126),e.setUint16(1,r)}else{s=new Uint8Array(9);const e=new DataView(s.buffer);e.setUint8(0,127),e.setBigUint64(1,BigInt(r))}e.data&&"string"!=typeof e.data&&(s[0]|=128),t.enqueue(s),t.enqueue(n)})}})}let me;function ye(e){return e.reduce((e,t)=>e+t.length,0)}function be(e,t){if(e[0].length===t)return e.shift();const n=new Uint8Array(t);let r=0;for(let s=0;s(e.hasOwnProperty(n)&&(t[n]=e[n]),t),{})}const Ae=ve.setTimeout,_e=ve.clearTimeout;function xe(e,t){t.useNativeTimers?(e.setTimeoutFn=Ae.bind(ve),e.clearTimeoutFn=_e.bind(ve)):(e.setTimeoutFn=ve.setTimeout.bind(ve),e.clearTimeoutFn=ve.clearTimeout.bind(ve))}class Ie extends Error{constructor(e,t,n){super(e),this.description=t,this.context=n,this.type="TransportError"}}class Te extends we{constructor(e){super(),this.writable=!1,xe(this,e),this.opts=e,this.query=e.query,this.socket=e.socket}onError(e,t,n){return super.emitReserved("error",new Ie(e,t,n)),this}open(){return this.readyState="opening",this.doOpen(),this}close(){return"opening"!==this.readyState&&"open"!==this.readyState||(this.doClose(),this.onClose()),this}send(e){"open"===this.readyState&&this.write(e)}onOpen(){this.readyState="open",this.writable=!0,super.emitReserved("open")}onData(e){const t=ue(e,this.socket.binaryType);this.onPacket(t)}onPacket(e){super.emitReserved("packet",e)}onClose(e){this.readyState="closed",super.emitReserved("close",e)}pause(e){}createUri(e,t={}){return e+"://"+this._hostname()+this._port()+this.opts.path+this._query(t)}_hostname(){const e=this.opts.hostname;return-1===e.indexOf(":")?e:"["+e+"]"}_port(){return this.opts.port&&(this.opts.secure&&Number(443!==this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}_query(e){const t=function(e){let t="";for(let n in e)e.hasOwnProperty(n)&&(t.length&&(t+="&"),t+=encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t}(e);return t.length?"?"+t:""}}const Ee="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),Se={};let Pe,Ce=0,Oe=0;function De(e){let t="";do{t=Ee[e%64]+t,e=Math.floor(e/64)}while(e>0);return t}function Re(){const e=De(+new Date);return e!==Pe?(Ce=0,Pe=e):e+"."+De(Ce++)}for(;Oe<64;Oe++)Se[Ee[Oe]]=Oe;let Le=!1;try{Le="undefined"!=typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch($){}const qe=Le;function Me(e){const t=e.xdomain;try{if("undefined"!=typeof XMLHttpRequest&&(!t||qe))return new XMLHttpRequest}catch(e){}if(!t)try{return new(ve[["Active"].concat("Object").join("X")])("Microsoft.XMLHTTP")}catch(e){}}function Ue(){}const Be=null!=new Me({xdomain:!1}).responseType;class je extends we{constructor(e,t){super(),xe(this,t),this.opts=t,this.method=t.method||"GET",this.uri=e,this.data=void 0!==t.data?t.data:null,this.create()}create(){var e;const t=ke(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");t.xdomain=!!this.opts.xd;const n=this.xhr=new Me(t);try{n.open(this.method,this.uri,!0);try{if(this.opts.extraHeaders){n.setDisableHeaderCheck&&n.setDisableHeaderCheck(!0);for(let e in this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(e)&&n.setRequestHeader(e,this.opts.extraHeaders[e])}}catch(e){}if("POST"===this.method)try{n.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(e){}try{n.setRequestHeader("Accept","*/*")}catch(e){}null===(e=this.opts.cookieJar)||void 0===e||e.addCookies(n),"withCredentials"in n&&(n.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(n.timeout=this.opts.requestTimeout),n.onreadystatechange=()=>{var e;3===n.readyState&&(null===(e=this.opts.cookieJar)||void 0===e||e.parseCookies(n)),4===n.readyState&&(200===n.status||1223===n.status?this.onLoad():this.setTimeoutFn(()=>{this.onError("number"==typeof n.status?n.status:0)},0))},n.send(this.data)}catch(e){return void this.setTimeoutFn(()=>{this.onError(e)},0)}"undefined"!=typeof document&&(this.index=je.requestsCount++,je.requests[this.index]=this)}onError(e){this.emitReserved("error",e,this.xhr),this.cleanup(!0)}cleanup(e){if(void 0!==this.xhr&&null!==this.xhr){if(this.xhr.onreadystatechange=Ue,e)try{this.xhr.abort()}catch(e){}"undefined"!=typeof document&&delete je.requests[this.index],this.xhr=null}}onLoad(){const e=this.xhr.responseText;null!==e&&(this.emitReserved("data",e),this.emitReserved("success"),this.cleanup())}abort(){this.cleanup()}}function ze(){for(let e in je.requests)je.requests.hasOwnProperty(e)&&je.requests[e].abort()}je.requestsCount=0,je.requests={},"undefined"!=typeof document&&("function"==typeof attachEvent?attachEvent("onunload",ze):"function"==typeof addEventListener&&addEventListener("onpagehide"in ve?"pagehide":"unload",ze,!1));const Ne="function"==typeof Promise&&"function"==typeof Promise.resolve?e=>Promise.resolve().then(e):(e,t)=>t(e,0),Fe=ve.WebSocket||ve.MozWebSocket,We="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase(),Xe={websocket:class extends Te{constructor(e){super(e),this.supportsBinary=!e.forceBase64}get name(){return"websocket"}doOpen(){if(!this.check())return;const e=this.uri(),t=this.opts.protocols,n=We?{}:ke(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=We?new Fe(e,t,n):t?new Fe(e,t):new Fe(e)}catch(e){return this.emitReserved("error",e)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=e=>this.onClose({description:"websocket connection closed",context:e}),this.ws.onmessage=e=>this.onData(e.data),this.ws.onerror=e=>this.onError("websocket error",e)}write(e){this.writable=!1;for(let t=0;t{try{this.ws.send(e)}catch(e){}r&&Ne(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){void 0!==this.ws&&(this.ws.close(),this.ws=null)}uri(){const e=this.opts.secure?"wss":"ws",t=this.query||{};return this.opts.timestampRequests&&(t[this.opts.timestampParam]=Re()),this.supportsBinary||(t.b64=1),this.createUri(e,t)}check(){return!!Fe}},webtransport:class extends Te{get name(){return"webtransport"}doOpen(){"function"==typeof WebTransport&&(this.transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name]),this.transport.closed.then(()=>{this.onClose()}).catch(e=>{this.onError("webtransport error",e)}),this.transport.ready.then(()=>{this.transport.createBidirectionalStream().then(e=>{const t=function(e,t){me||(me=new TextDecoder);const n=[];let r=0,s=-1,i=!1;return new TransformStream({transform(o,a){for(n.push(o);;){if(0===r){if(ye(n)<1)break;const e=be(n,1);i=!(128&~e[0]),s=127&e[0],r=s<126?3:126===s?1:2}else if(1===r){if(ye(n)<2)break;const e=be(n,2);s=new DataView(e.buffer,e.byteOffset,e.length).getUint16(0),r=3}else if(2===r){if(ye(n)<8)break;const e=be(n,8),t=new DataView(e.buffer,e.byteOffset,e.length),i=t.getUint32(0);if(i>Math.pow(2,21)-1){a.enqueue(te);break}s=i*Math.pow(2,32)+t.getUint32(4),r=3}else{if(ye(n)e){a.enqueue(te);break}}}})}(Number.MAX_SAFE_INTEGER,this.socket.binaryType),n=e.readable.pipeThrough(t).getReader(),r=fe();r.readable.pipeTo(e.writable),this.writer=r.writable.getWriter();const s=()=>{n.read().then(({done:e,value:t})=>{e||(this.onPacket(t),s())}).catch(e=>{})};s();const i={type:"open"};this.query.sid&&(i.data=`{"sid":"${this.query.sid}"}`),this.writer.write(i).then(()=>this.onOpen())})}))}write(e){this.writable=!1;for(let t=0;t{r&&Ne(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){var e;null===(e=this.transport)||void 0===e||e.close()}},polling:class extends Te{constructor(e){if(super(e),this.polling=!1,"undefined"!=typeof location){const t="https:"===location.protocol;let n=location.port;n||(n=t?"443":"80"),this.xd="undefined"!=typeof location&&e.hostname!==location.hostname||n!==e.port}const t=e&&e.forceBase64;this.supportsBinary=Be&&!t,this.opts.withCredentials&&(this.cookieJar=void 0)}get name(){return"polling"}doOpen(){this.poll()}pause(e){this.readyState="pausing";const t=()=>{this.readyState="paused",e()};if(this.polling||!this.writable){let e=0;this.polling&&(e++,this.once("pollComplete",function(){--e||t()})),this.writable||(e++,this.once("drain",function(){--e||t()}))}else t()}poll(){this.polling=!0,this.doPoll(),this.emitReserved("poll")}onData(e){((e,t)=>{const n=e.split(ge),r=[];for(let e=0;e{if("opening"===this.readyState&&"open"===e.type&&this.onOpen(),"close"===e.type)return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(e)}),"closed"!==this.readyState&&(this.polling=!1,this.emitReserved("pollComplete"),"open"===this.readyState&&this.poll())}doClose(){const e=()=>{this.write([{type:"close"}])};"open"===this.readyState?e():this.once("open",e)}write(e){this.writable=!1,((e,t)=>{const n=e.length,r=new Array(n);let s=0;e.forEach((e,i)=>{ie(e,!1,e=>{r[i]=e,++s===n&&t(r.join(ge))})})})(e,e=>{this.doWrite(e,()=>{this.writable=!0,this.emitReserved("drain")})})}uri(){const e=this.opts.secure?"https":"http",t=this.query||{};return!1!==this.opts.timestampRequests&&(t[this.opts.timestampParam]=Re()),this.supportsBinary||t.sid||(t.b64=1),this.createUri(e,t)}request(e={}){return Object.assign(e,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new je(this.uri(),e)}doWrite(e,t){const n=this.request({method:"POST",data:e});n.on("success",t),n.on("error",(e,t)=>{this.onError("xhr post error",e,t)})}doPoll(){const e=this.request();e.on("data",this.onData.bind(this)),e.on("error",(e,t)=>{this.onError("xhr poll error",e,t)}),this.pollXhr=e}}},Ve=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,Ke=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function Ge(e){const t=e,n=e.indexOf("["),r=e.indexOf("]");-1!=n&&-1!=r&&(e=e.substring(0,n)+e.substring(n,r).replace(/:/g,";")+e.substring(r,e.length));let s=Ve.exec(e||""),i={},o=14;for(;o--;)i[Ke[o]]=s[o]||"";return-1!=n&&-1!=r&&(i.source=t,i.host=i.host.substring(1,i.host.length-1).replace(/;/g,":"),i.authority=i.authority.replace("[","").replace("]","").replace(/;/g,":"),i.ipv6uri=!0),i.pathNames=function(e,t){const n=t.replace(/\/{2,9}/g,"/").split("/");return"/"!=t.slice(0,1)&&0!==t.length||n.splice(0,1),"/"==t.slice(-1)&&n.splice(n.length-1,1),n}(0,i.path),i.queryKey=function(e,t){const n={};return t.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(e,t,r){t&&(n[t]=r)}),n}(0,i.query),i}class He extends we{constructor(e,t={}){super(),this.binaryType="arraybuffer",this.writeBuffer=[],e&&"object"==typeof e&&(t=e,e=null),e?(e=Ge(e),t.hostname=e.host,t.secure="https"===e.protocol||"wss"===e.protocol,t.port=e.port,e.query&&(t.query=e.query)):t.host&&(t.hostname=Ge(t.host).host),xe(this,t),this.secure=null!=t.secure?t.secure:"undefined"!=typeof location&&"https:"===location.protocol,t.hostname&&!t.port&&(t.port=this.secure?"443":"80"),this.hostname=t.hostname||("undefined"!=typeof location?location.hostname:"localhost"),this.port=t.port||("undefined"!=typeof location&&location.port?location.port:this.secure?"443":"80"),this.transports=t.transports||["polling","websocket","webtransport"],this.writeBuffer=[],this.prevBufferLen=0,this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},t),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),"string"==typeof this.opts.query&&(this.opts.query=function(e){let t={},n=e.split("&");for(let e=0,r=n.length;e{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this.beforeunloadEventListener,!1)),"localhost"!==this.hostname&&(this.offlineEventListener=()=>{this.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",this.offlineEventListener,!1))),this.open()}createTransport(e){const t=Object.assign({},this.opts.query);t.EIO=4,t.transport=e,this.id&&(t.sid=this.id);const n=Object.assign({},this.opts,{query:t,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[e]);return new Xe[e](n)}open(){let e;if(this.opts.rememberUpgrade&&He.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket"))e="websocket";else{if(0===this.transports.length)return void this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);e=this.transports[0]}this.readyState="opening";try{e=this.createTransport(e)}catch(e){return this.transports.shift(),void this.open()}e.open(),this.setTransport(e)}setTransport(e){this.transport&&this.transport.removeAllListeners(),this.transport=e,e.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",e=>this.onClose("transport close",e))}probe(e){let t=this.createTransport(e),n=!1;He.priorWebsocketSuccess=!1;const r=()=>{n||(t.send([{type:"ping",data:"probe"}]),t.once("packet",e=>{if(!n)if("pong"===e.type&&"probe"===e.data){if(this.upgrading=!0,this.emitReserved("upgrading",t),!t)return;He.priorWebsocketSuccess="websocket"===t.name,this.transport.pause(()=>{n||"closed"!==this.readyState&&(l(),this.setTransport(t),t.send([{type:"upgrade"}]),this.emitReserved("upgrade",t),t=null,this.upgrading=!1,this.flush())})}else{const e=new Error("probe error");e.transport=t.name,this.emitReserved("upgradeError",e)}}))};function s(){n||(n=!0,l(),t.close(),t=null)}const i=e=>{const n=new Error("probe error: "+e);n.transport=t.name,s(),this.emitReserved("upgradeError",n)};function o(){i("transport closed")}function a(){i("socket closed")}function c(e){t&&e.name!==t.name&&s()}const l=()=>{t.removeListener("open",r),t.removeListener("error",i),t.removeListener("close",o),this.off("close",a),this.off("upgrading",c)};t.once("open",r),t.once("error",i),t.once("close",o),this.once("close",a),this.once("upgrading",c),-1!==this.upgrades.indexOf("webtransport")&&"webtransport"!==e?this.setTimeoutFn(()=>{n||t.open()},200):t.open()}onOpen(){if(this.readyState="open",He.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush(),"open"===this.readyState&&this.opts.upgrade){let e=0;const t=this.upgrades.length;for(;e{this.onClose("ping timeout")},this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}onDrain(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}flush(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const e=this.getWritablePackets();this.transport.send(e),this.prevBufferLen=e.length,this.emitReserved("flush")}}getWritablePackets(){if(!(this.maxPayload&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;let e=1;for(let n=0;n=57344?n+=3:(r++,n+=4);return n}(t):Math.ceil(1.33*(t.byteLength||t.size))),n>0&&e>this.maxPayload)return this.writeBuffer.slice(0,n);e+=2}var t;return this.writeBuffer}write(e,t,n){return this.sendPacket("message",e,t,n),this}send(e,t,n){return this.sendPacket("message",e,t,n),this}sendPacket(e,t,n,r){if("function"==typeof t&&(r=t,t=void 0),"function"==typeof n&&(r=n,n=null),"closing"===this.readyState||"closed"===this.readyState)return;(n=n||{}).compress=!1!==n.compress;const s={type:e,data:t,options:n};this.emitReserved("packetCreate",s),this.writeBuffer.push(s),r&&this.once("flush",r),this.flush()}close(){const e=()=>{this.onClose("forced close"),this.transport.close()},t=()=>{this.off("upgrade",t),this.off("upgradeError",t),e()},n=()=>{this.once("upgrade",t),this.once("upgradeError",t)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?n():e()}):this.upgrading?n():e()),this}onError(e){He.priorWebsocketSuccess=!1,this.emitReserved("error",e),this.onClose("transport error",e)}onClose(e,t){"opening"!==this.readyState&&"open"!==this.readyState&&"closing"!==this.readyState||(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),"function"==typeof removeEventListener&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",e,t),this.writeBuffer=[],this.prevBufferLen=0)}filterUpgrades(e){const t=[];let n=0;const r=e.length;for(;n"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(e):e.buffer instanceof ArrayBuffer)(e))||Ze&&e instanceof Blob||Je&&e instanceof File}function et(e,t){if(!e||"object"!=typeof e)return!1;if(Array.isArray(e)){for(let t=0,n=e.length;t=0&&e.num{delete this.acks[e];for(let t=0;t{this.io.clearTimeoutFn(s),t.apply(this,[null,...e])}}emitWithAck(e,...t){const n=void 0!==this.flags.timeout||void 0!==this._opts.ackTimeout;return new Promise((r,s)=>{t.push((e,t)=>n?e?s(e):r(t):r(e)),this.emit(e,...t)})}_addToQueue(e){let t;"function"==typeof e[e.length-1]&&(t=e.pop());const n={id:this._queueSeq++,tryCount:0,pending:!1,args:e,flags:Object.assign({fromQueue:!0},this.flags)};e.push((e,...r)=>{if(n===this._queue[0])return null!==e?n.tryCount>this._opts.retries&&(this._queue.shift(),t&&t(e)):(this._queue.shift(),t&&t(null,...r)),n.pending=!1,this._drainQueue()}),this._queue.push(n),this._drainQueue()}_drainQueue(e=!1){if(!this.connected||0===this._queue.length)return;const t=this._queue[0];t.pending&&!e||(t.pending=!0,t.tryCount++,this.flags=t.flags,this.emit.apply(this,t.args))}packet(e){e.nsp=this.nsp,this.io._packet(e)}onopen(){"function"==typeof this.auth?this.auth(e=>{this._sendConnectPacket(e)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(e){this.packet({type:ot.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},e):e})}onerror(e){this.connected||this.emitReserved("connect_error",e)}onclose(e,t){this.connected=!1,delete this.id,this.emitReserved("disconnect",e,t)}onpacket(e){if(e.nsp===this.nsp)switch(e.type){case ot.CONNECT:e.data&&e.data.sid?this.onconnect(e.data.sid,e.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case ot.EVENT:case ot.BINARY_EVENT:this.onevent(e);break;case ot.ACK:case ot.BINARY_ACK:this.onack(e);break;case ot.DISCONNECT:this.ondisconnect();break;case ot.CONNECT_ERROR:this.destroy();const t=new Error(e.data.message);t.data=e.data.data,this.emitReserved("connect_error",t)}}onevent(e){const t=e.data||[];null!=e.id&&t.push(this.ack(e.id)),this.connected?this.emitEvent(t):this.receiveBuffer.push(Object.freeze(t))}emitEvent(e){if(this._anyListeners&&this._anyListeners.length){const t=this._anyListeners.slice();for(const n of t)n.apply(this,e)}super.emit.apply(this,e),this._pid&&e.length&&"string"==typeof e[e.length-1]&&(this._lastOffset=e[e.length-1])}ack(e){const t=this;let n=!1;return function(...r){n||(n=!0,t.packet({type:ot.ACK,id:e,data:r}))}}onack(e){const t=this.acks[e.id];"function"==typeof t&&(t.apply(this,e.data),delete this.acks[e.id])}onconnect(e,t){this.id=e,this.recovered=t&&this._pid===t,this._pid=t,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach(e=>this.emitEvent(e)),this.receiveBuffer=[],this.sendBuffer.forEach(e=>{this.notifyOutgoingListeners(e),this.packet(e)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(e=>e()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:ot.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(e){return this.flags.compress=e,this}get volatile(){return this.flags.volatile=!0,this}timeout(e){return this.flags.timeout=e,this}onAny(e){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(e),this}prependAny(e){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(e),this}offAny(e){if(!this._anyListeners)return this;if(e){const t=this._anyListeners;for(let n=0;n0&&e.jitter<=1?e.jitter:0,this.attempts=0}gt.prototype.duration=function(){var e=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var t=Math.random(),n=Math.floor(t*this.jitter*e);e=1&Math.floor(10*t)?e+n:e-n}return 0|Math.min(e,this.max)},gt.prototype.reset=function(){this.attempts=0},gt.prototype.setMin=function(e){this.ms=e},gt.prototype.setMax=function(e){this.max=e},gt.prototype.setJitter=function(e){this.jitter=e};class ft extends we{constructor(e,t){var n;super(),this.nsps={},this.subs=[],e&&"object"==typeof e&&(t=e,e=void 0),(t=t||{}).path=t.path||"/socket.io",this.opts=t,xe(this,t),this.reconnection(!1!==t.reconnection),this.reconnectionAttempts(t.reconnectionAttempts||1/0),this.reconnectionDelay(t.reconnectionDelay||1e3),this.reconnectionDelayMax(t.reconnectionDelayMax||5e3),this.randomizationFactor(null!==(n=t.randomizationFactor)&&void 0!==n?n:.5),this.backoff=new gt({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==t.timeout?2e4:t.timeout),this._readyState="closed",this.uri=e;const r=t.parser||ht;this.encoder=new r.Encoder,this.decoder=new r.Decoder,this._autoConnect=!1!==t.autoConnect,this._autoConnect&&this.open()}reconnection(e){return arguments.length?(this._reconnection=!!e,this):this._reconnection}reconnectionAttempts(e){return void 0===e?this._reconnectionAttempts:(this._reconnectionAttempts=e,this)}reconnectionDelay(e){var t;return void 0===e?this._reconnectionDelay:(this._reconnectionDelay=e,null===(t=this.backoff)||void 0===t||t.setMin(e),this)}randomizationFactor(e){var t;return void 0===e?this._randomizationFactor:(this._randomizationFactor=e,null===(t=this.backoff)||void 0===t||t.setJitter(e),this)}reconnectionDelayMax(e){var t;return void 0===e?this._reconnectionDelayMax:(this._reconnectionDelayMax=e,null===(t=this.backoff)||void 0===t||t.setMax(e),this)}timeout(e){return arguments.length?(this._timeout=e,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}open(e){if(~this._readyState.indexOf("open"))return this;this.engine=new He(this.uri,this.opts);const t=this.engine,n=this;this._readyState="opening",this.skipReconnect=!1;const r=ut(t,"open",function(){n.onopen(),e&&e()}),s=t=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",t),e?e(t):this.maybeReconnectOnOpen()},i=ut(t,"error",s);if(!1!==this._timeout){const e=this._timeout,n=this.setTimeoutFn(()=>{r(),s(new Error("timeout")),t.close()},e);this.opts.autoUnref&&n.unref(),this.subs.push(()=>{this.clearTimeoutFn(n)})}return this.subs.push(r),this.subs.push(i),this}connect(e){return this.open(e)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");const e=this.engine;this.subs.push(ut(e,"ping",this.onping.bind(this)),ut(e,"data",this.ondata.bind(this)),ut(e,"error",this.onerror.bind(this)),ut(e,"close",this.onclose.bind(this)),ut(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(e){try{this.decoder.add(e)}catch(e){this.onclose("parse error",e)}}ondecoded(e){Ne(()=>{this.emitReserved("packet",e)},this.setTimeoutFn)}onerror(e){this.emitReserved("error",e)}socket(e,t){let n=this.nsps[e];return n?this._autoConnect&&!n.active&&n.connect():(n=new pt(this,e,t),this.nsps[e]=n),n}_destroy(e){const t=Object.keys(this.nsps);for(const e of t)if(this.nsps[e].active)return;this._close()}_packet(e){const t=this.encoder.encode(e);for(let n=0;ne()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close"),this.engine&&this.engine.close()}disconnect(){return this._close()}onclose(e,t){this.cleanup(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",e,t),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const e=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const t=this.backoff.duration();this._reconnecting=!0;const n=this.setTimeoutFn(()=>{e.skipReconnect||(this.emitReserved("reconnect_attempt",e.backoff.attempts),e.skipReconnect||e.open(t=>{t?(e._reconnecting=!1,e.reconnect(),this.emitReserved("reconnect_error",t)):e.onreconnect()}))},t);this.opts.autoUnref&&n.unref(),this.subs.push(()=>{this.clearTimeoutFn(n)})}}onreconnect(){const e=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",e)}}const mt={};function yt(e,t){"object"==typeof e&&(t=e,e=void 0);const n=function(e,t="",n){let r=e;n=n||"undefined"!=typeof location&&location,null==e&&(e=n.protocol+"//"+n.host),"string"==typeof e&&("/"===e.charAt(0)&&(e="/"===e.charAt(1)?n.protocol+e:n.host+e),/^(https?|wss?):\/\//.test(e)||(e=void 0!==n?n.protocol+"//"+e:"https://"+e),r=Ge(e)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/";const s=-1!==r.host.indexOf(":")?"["+r.host+"]":r.host;return r.id=r.protocol+"://"+s+":"+r.port+t,r.href=r.protocol+"://"+s+(n&&n.port===r.port?"":":"+r.port),r}(e,(t=t||{}).path||"/socket.io"),r=n.source,s=n.id,i=n.path,o=mt[s]&&i in mt[s].nsps;let a;return t.forceNew||t["force new connection"]||!1===t.multiplex||o?a=new ft(r,t):(mt[s]||(mt[s]=new ft(r,t)),a=mt[s]),n.query&&!t.query&&(t.query=n.queryKey),a.socket(n.path,t)}Object.assign(yt,{Manager:ft,Socket:pt,io:yt,connect:yt});const bt=class{constructor(e){this.readURL=e.readURL??e.read_url,this.writeURL=e.writeURL??e.write_url,this.metadataURL=e.metadataURL??e.metadata_url,this.name=e.name??e.fsentry_name,this.uid=e.uid??e.uuid??e.fsentry_uid??e.fsentry_id??e.fsentry_uuid??e.id,this.id=this.uid,this.uuid=this.uid,this.path=e.path??e.fsentry_path,this.size=e.size??e.fsentry_size,this.accessed=e.accessed??e.fsentry_accessed,this.modified=e.modified??e.fsentry_modified,this.created=e.created??e.fsentry_created,this.isDirectory=!!(e.isDirectory||e.is_dir||e.fsentry_is_dir);const t={};Object.defineProperty(this,"_internalProperties",{enumerable:!1,value:t}),t.signature=e.signature??(()=>new URL(this.writeURL??this.readURL).searchParams.get("signature"))(),t.expires=e.expires??(()=>new URL(this.writeURL??this.readURL).searchParams.get("expires"))(),Object.defineProperty(t,"file_signature",{get:()=>({read_url:this.readURL,write_url:this.writeURL,metadata_url:this.metadataURL,fsentry_accessed:this.accessed,fsentry_modified:this.modified,fsentry_created:this.created,fsentry_is_dir:this.isDirectory,fsentry_size:this.size,fsentry_name:this.name,path:this.path,uid:this.uid})})}write=async function(e){return puter.fs.write(this.path,new File([e],this.name),{overwrite:!0,dedupeName:!1})};watch=function(e){};open=function(e){};setAsWallpaper=function(e,t){};rename=function(e){return puter.fs.rename(this.uid,e)};move=function(e,t=!1,n){return puter.fs.move(this.path,e,t,n)};copy=function(e,t=!1,n=!1){return puter.fs.copy(this.path,e,t,n)};delete=function(){return puter.fs.delete(this.path)};versions=async function(){};trash=function(){};mkdir=async function(e,t=!1){if(!this.isDirectory)throw new Error("mkdir() can only be called on a directory");return puter.fs.mkdir(c.join(this.path,e))};metadata=async function(){};readdir=async function(){if(!this.isDirectory)throw new Error("readdir() can only be called on a directory");return puter.fs.readdir(this.path)};read=async function(){return puter.fs.read(this.path)}},wt=e=>class{constructor(){this.form=new FormData,this.operations=[]}move(e,t,n){return this.operations.push({op:"move",source:e,destination:t,new_name:n}),this}rm(...e){return this.delete(...e)}delete(...e){for(const t of e)this.operations.push({op:"delete",path:t})}async send(){for(const e of this.operations)this.form.append("operation",JSON.stringify(e));const t=await fetch(`${e.APIOrigin}/batch`,{headers:{Authorization:`Bearer ${e.authToken}`,...["web","app"].includes(e.env)?{Origin:"https://puter.work"}:{}},method:"POST",body:this.form});return(await t.json())?.results}},vt=e=>"gui"!==puter.env||e?(/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test(e)||(e||(e="."),e&&(e.startsWith("/")||e.startsWith("~"))||(e=puter.appID?c.join("~/AppData",puter.appID,e):c.join("~/",e))),e):e,kt=function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{source:e[0],destination:e[1],overwrite:e[2]?.overwrite,new_name:e[2]?.newName||e[2]?.new_name,create_missing_parents:e[2]?.createMissingParents||e[2]?.create_missing_parents,new_metadata:e[2]?.newMetadata||e[2]?.new_metadata,original_client_socket_id:e[2]?.excludeSocketID||e[2]?.original_client_socket_id,success:e[3],error:e[4]},new Promise(async(e,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){n("Authentication failed.")}t.source=vt(t.source),t.destination=vt(t.destination);const r=q("/copy",this.APIOrigin,this.authToken);U(r,t.success,t.error,e,n),r.send(JSON.stringify({original_client_socket_id:this.socket.id,socket_id:this.socket.id,source:t.source,destination:t.destination,overwrite:t.overwrite,new_name:t.new_name||t.newName,dedupe_name:t.dedupe_name||t.dedupeName}))})},At=async function(...e){let t;t="object"==typeof e[0]&&null!==e[0]?e[0]:{paths:e[0],recursive:e[1]?.recursive??!0,descendantsOnly:e[1]?.descendantsOnly??!1};let n=t.paths;return"string"==typeof n&&(n=[n]),new Promise(async(e,r)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){r("Authentication failed.")}const s=q("/delete",this.APIOrigin,this.authToken);U(s,t.success,t.error,e,r),n=n.map(e=>vt(e)),s.send(JSON.stringify({paths:n,descendants_only:(t.descendants_only||t.descendantsOnly)??!1,recursive:t.recursive??!0}))})},_t=new Map,xt=async function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{path:e[0],..."object"==typeof e[1]?e[1]:{},success:"object"==typeof e[1]?e[2]:e[1],error:"object"==typeof e[1]?e[3]:e[2]},new Promise(async(e,n)=>{let r;if(t.consistency||(t.consistency="strong"),t.path&&(r=`item:${t.path}`),!("eventual"!==t.consistency||t.returnSubdomains||t.returnPermissions||t.returnVersions||t.returnSize)){const t=await puter._cache.get(r);if(t)return void e(t)}const s=JSON.stringify({path:t.path,uid:t.uid,returnSubdomains:t.returnSubdomains||t.returnWorkers,returnPermissions:t.returnPermissions,returnVersions:t.returnVersions,returnSize:t.returnSize,consistency:t.consistency}),i=_t.get(s),o=Date.now();if(i){if(o-i.timestamp<2e3){try{e(await i.promise)}catch(e){n(e)}return}_t.delete(s)}const a=new Promise(async(e,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){return void n("Authentication failed.")}const s=q("/stat",this.APIOrigin,void 0,"post","text/plain;actually=json");U(s,t.success,t.error,async t=>{JSON.stringify(t).length<=20971520&&puter._cache.set(r,t),e(t)},n);let i={};void 0!==t.uid?i.uid=t.uid:void 0!==t.path&&(i.path=vt(t.path)),i.return_subdomains=t.returnSubdomains||t.returnWorkers,i.return_permissions=t.returnPermissions,i.return_versions=t.returnVersions,i.return_size=t.returnSize,i.auth_token=this.authToken,s.send(JSON.stringify(i))});_t.set(s,{promise:a,timestamp:o});try{const t=await a;_t.delete(s),e(t)}catch(e){_t.delete(s),n(e)}})},It=async function(e,t="24h"){return new Promise(async(n,r)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){r("Authentication failed.")}try{const{uid:s,is_dir:i}=await xt.call(this,e);if(i)return void r("Cannot create readUrl for directory");const o=q("/auth/create-access-token",this.APIOrigin,this.authToken);U(o,()=>{},()=>{},({token:e})=>{n(`${this.APIOrigin}/token-read?uid=${encodeURIComponent(s)}&token=${encodeURIComponent(e)}`)},r),o.send(JSON.stringify({expiresIn:t,permissions:[`fs:${s}:read`]}))}catch(e){r(e)}})},Tt=function(...e){let t={};return"string"==typeof e[0]&&"object"==typeof e[1]&&!(e[1]instanceof Function)||"object"==typeof e[0]&&null!==e[0]?"string"==typeof e[0]?(t.path=e[0],Object.assign(t,e[1]),t.success=e[2],t.error=e[3]):t=e[0]:"string"==typeof e[0]&&(t.path=e[0],t.success=e[1],t.error=e[2]),new Promise(async(e,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){n("Authentication failed.")}const r=q("/mkdir",this.APIOrigin,this.authToken);U(r,t.success,t.error,e,n),t.path=vt(t.path),r.send(JSON.stringify({parent:c.dirname(t.path),path:c.basename(t.path),overwrite:t.overwrite??!1,dedupe_name:(t.rename||t.dedupeName)??!1,shortcut_to:t.shortcutTo,original_client_socket_id:this.socket.id,create_missing_parents:(t.recursive||t.createMissingParents)??!1}))})},Et=function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{source:e[0],destination:e[1],overwrite:e[2]?.overwrite,new_name:e[2]?.newName||e[2]?.new_name,create_missing_parents:e[2]?.createMissingParents||e[2]?.create_missing_parents,new_metadata:e[2]?.newMetadata||e[2]?.new_metadata,original_client_socket_id:e[2]?.excludeSocketID||e[2]?.original_client_socket_id},new Promise(async(e,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){n("Authentication failed.")}if(t.source=vt(t.source),t.destination=vt(t.destination),!t.new_name)try{if(!(await xt.bind(this)(t.destination)).is_dir)throw"is not directory"}catch(e){t.new_name=c.basename(t.destination),t.destination=c.dirname(t.destination)}const r=q("/move",this.APIOrigin,this.authToken);U(r,t.success,t.error,e,n),r.send(JSON.stringify({source:t.source,destination:t.destination,overwrite:t.overwrite,new_name:t.new_name||t.newName,create_missing_parents:t.create_missing_parents||t.createMissingParents,new_metadata:t.new_metadata||t.newMetadata,original_client_socket_id:t.excludeSocketID}))})},St=function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{path:"string"==typeof e[0]?e[0]:"object"==typeof e[0]&&null!==e[0]?e[0].path:e[0],..."object"==typeof e[1]?e[1]:{success:e[1],error:e[2]}},new Promise(async(e,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){n("Authentication failed.")}t.path=vt(t.path);const r=q(`/read?${new URLSearchParams({file:t.path,...t.offset?{offset:t.offset}:{},...t.byte_count?{byte_count:t.byte_count}:{}}).toString()}`,this.APIOrigin,this.authToken,"get","application/json;charset=UTF-8","blob");U(r,t.success,t.error,e,n),r.send()})},Pt=new Map,Ct=async function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{path:e[0],success:e[1],error:e[2]},new Promise(async(e,n)=>{if(t.consistency||(t.consistency="strong"),!t.path&&!t.uid)throw new Error({code:"NO_PATH_OR_UID",message:"Either path or uid must be provided."});let r;if(t.path&&(r=`readdir:${t.path}`),"eventual"===t.consistency){const t=await puter._cache.get(r);if(t)return void e(t)}const s=JSON.stringify({path:t.path,uid:t.uid,no_thumbs:t.no_thumbs,no_assocs:t.no_assocs,no_subdomains:t.no_subdomains,consistency:t.consistency}),i=Pt.get(s),o=Date.now();if(i){if(o-i.timestamp<2e3){try{e(await i.promise)}catch(e){n(e)}return}Pt.delete(s)}const a=new Promise(async(e,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){return void n("Authentication failed.")}const s=q("/readdir",this.APIOrigin,void 0,"post","text/plain;actually=json");U(s,t.success,t.error,async t=>{JSON.stringify(t).length<=104857600&&puter._cache.set(r,t);for(const e of t)puter._cache.set(`item:${e.path}`,e);e(t)},n);const i={no_thumbs:t.no_thumbs,no_assocs:t.no_assocs,no_subdomains:t.no_subdomains,auth_token:this.authToken};t.uid?i.uid=t.uid:t.path&&(i.path=vt(t.path)),s.send(JSON.stringify(i))});Pt.set(s,{promise:a,timestamp:o});try{const t=await a;Pt.delete(s),e(t)}catch(e){Pt.delete(s),n(e)}})},Ot=async function(e){return new Promise(async(t,n)=>{if(!e||"object"!=typeof e)return void n(new Error("Options object is required"));if(!Array.isArray(e.directory_ids)||0===e.directory_ids.length)return void n(new Error("directory_ids must be a non-empty array"));if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){return void n(new Error("Authentication failed."))}const r=q("/readdir-subdomains",this.APIOrigin,void 0,"post","text/plain;actually=json");U(r,e.success,e.error,async e=>{t(e)},n);const s={directory_ids:e.directory_ids,auth_token:this.authToken};r.send(JSON.stringify(s))})},Dt=function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{path:e[0],new_name:e[1],success:e[2],error:e[3]},new Promise(async(e,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){n("Authentication failed.")}const r=q("/rename",this.APIOrigin,this.authToken);U(r,t.success,t.error,e,n);let s={original_client_socket_id:t.excludeSocketID||t.original_client_socket_id,new_name:t.new_name||t.newName};void 0!==t.uid?s.uid=t.uid:void 0!==t.path&&(s.path=vt(t.path)),r.send(JSON.stringify(s))})},Rt=async function(e){return new Promise(async(t,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){return void n("Authentication failed.")}try{const r=q("/auth/revoke-access-token",this.APIOrigin,this.authToken);U(r,()=>{},()=>{},()=>t(),n),r.send(JSON.stringify({tokenOrUuid:"string"==typeof e?e.trim():String(e)}))}catch(e){n(e)}})},Lt=function(...e){let t;return t={app_uid:e[0],items:e[1],success:e[2],error:e[3]},new Promise(async(e,n)=>{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){n("Authentication failed.")}let r=t.items;Array.isArray(r)||(r=[r]);const s=q("/sign",this.APIOrigin,this.authToken);s.addEventListener("load",async function(s){const i=await R(this);if(200!==this.status)return t.error&&"function"==typeof t.error&&t.error(i),n(i);{let n,s=i,o=s.token;if(1==r.length)n={...s.signatures[0]};else{let e=[];for(let t=0;t{if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){n("Authentication failed.")}const r=q("/df",this.APIOrigin,this.authToken);U(r,t.success,t.error,e,n),r.send()})},Mt=async function(e,t){if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){throw"Authentication failed."}t=vt(t),e=vt(e);const n=c.basename(t),r={op:"symlink",path:c.dirname(t),name:n,target:e},s=new FormData;s.append("operation",JSON.stringify(r));try{const e=await fetch(`${this.APIOrigin}/batch`,{method:"POST",headers:{Authorization:`Bearer ${puter.authToken}`},body:s});if(200!==e.status){const t=await e.text();throw console.error("[symlink] fetch error: ",t),t}}catch(e){throw console.error("[symlink] fetch error: ",e),e}},Ut=e=>{if(!e)return 0;const t=e.indexOf(","),n=-1===t?e:e.slice(t+1);return Math.ceil(3*n.length/4)},Bt=(e,t,n,r)=>{if(!e||"undefined"==typeof document)return null;const{width:s,height:i}=((e,t,n)=>{const r=Math.max(e,t)||1,s=Math.min(1,n/r);return{width:Math.max(1,Math.round(e*s)),height:Math.max(1,Math.round(t*s))}})(e.naturalWidth||e.width,e.naturalHeight||e.height,t),o=document.createElement("canvas");o.width=s,o.height=i;const a=o.getContext("2d");if(!a)return null;a.drawImage(e,0,0,s,i);try{return o.toDataURL(n,r)}catch(e){return null}},jt=async e=>{try{if("undefined"==typeof document)return;if("undefined"==typeof File||!(e instanceof File))return;if(!(e=>{if(!e)return!1;if(e.type&&e.type.startsWith("image/"))return!0;const t=(e.name||"").toLowerCase();return[".png",".jpg",".jpeg",".gif",".bmp",".webp",".tiff",".avif",".jfif"].some(e=>t.endsWith(e))})(e))return;const t=await(e=>new Promise((t,n)=>{if("undefined"==typeof document||"undefined"==typeof URL||"undefined"==typeof Image)return t(null);const r=URL.createObjectURL(e),s=new Image;s.onload=()=>{URL.revokeObjectURL(r),t(s)},s.onerror=e=>{URL.revokeObjectURL(r),n(e)},s.src=r}))(e);if(!t)return;let n=128;const r=[{type:"image/webp",quality:.85},{type:"image/jpeg",quality:.8},{type:"image/png"}];for(;n>=32;){for(const{type:e,quality:s}of r){const r=Bt(t,n,e,s);if(r&&Ut(r)<=2097152)return r}n=Math.floor(n/2)}}catch(e){return}},zt=async function(e,t,n={}){return new Promise(async(r,s)=>{const i=globalThis.DataTransfer||class{},o=globalThis.FileList||class{},a=globalThis.DataTransferItemList||class{};if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){s(e)}const l=e=>(n.error&&"function"==typeof n.error&&n.error(e),s(e));let h=new XMLHttpRequest;if("/"===t)return l("Can not upload to root directory.");t=vt(t);const u=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16));n.init&&"function"==typeof n.init&&n.init(u,h);let d,p=0,g=0,f=0,m=!1;if(Array.isArray(e)&&e.length>0)for(let t=0;te.isDirectory&&!t.isDirectory?-1:!e.isDirectory&&t.isDirectory?1:e.isDirectory&&t.isDirectory?0:e.size-t.size);else if(e instanceof File||e[0]instanceof File||e instanceof o||e[0]instanceof o){d=Array.isArray(e)?e:e instanceof o?Array.from(e):[e],d.sort((e,t)=>e.size-t.size);for(let e=0;e{e=e?`${e}/${n}`:n;let r=c.join(t,e);b[r]||(b[r]=!0,y.push({path:r}))})}}void 0!==d[e].size&&(f+=d[e].size)}if(0===y.length&&0===w.length)return l({code:"EMPTY_UPLOAD",message:"No files or directories to upload."});let v=[];const k=n.generateThumbnails||n.thumbnailGenerator;if(w.length&&k){const e=n.thumbnailGenerator||jt;v=await Promise.all(w.map(async t=>{try{return await e(t)}catch(e){return}}))}let A;if("web"!==puter.env)try{if(A=await this.space(),A.capacity-A.usedt.path.length-e.path.length);let x=[];for(let e=0;e{e.operation_id===u&&(g+=e.loaded_diff)};this.socket.on("upload.progress",I);let T=null;h.open("post",`${this.APIOrigin}/batch`,!0),h.setRequestHeader("Authorization",`Bearer ${this.authToken}`),h.upload.addEventListener("progress",function(e){let t;null===T?(t=e.loaded,T=0):t=e.loaded-T,T+=t,p+=t;let r=((g+p)/f*100).toFixed(2);r=r>100?100:r,n.progress&&"function"==typeof n.progress&&n.progress(u,r)});let E=setInterval(function(){let e=((g+p)/f*100).toFixed(2);e=e>100?100:e,n.progress&&"function"==typeof n.progress&&n.progress(u,e)},100);h.onabort=()=>{clearInterval(E),this.socket.off("upload.progress",I),n.abort&&"function"==typeof n.abort&&n.abort(u)},h.onreadystatechange=async e=>{if(4===h.readyState){const e=await R(h);if(h.status>=400&&h.status<600||n.strict&&218===h.status){if(clearInterval(E),this.socket.off("upload.progress",I),n.strict&&218===h.status){let t;for(let n=0;nthis.authToken}),Object.defineProperty(t,"APIOrigin",{get:()=>this.APIOrigin})}initializeSocket(){this.socket&&this.socket.disconnect(),this.socket=yt(this.APIOrigin,{auth:{auth_token:this.authToken},autoUnref:"nodejs"===this.puter.env}),this.bindSocketEvents()}bindSocketEvents(){this.socket.on("item.renamed",e=>{puter._cache.flushall(),console.log("Flushed cache for item.renamed")}),this.socket.on("item.removed",e=>{puter._cache.flushall(),console.log("Flushed cache for item.removed")}),this.socket.on("item.added",e=>{puter._cache.del(`readdir:${c.dirname(e.path)}`),console.log(`deleted cache for readdir:${c.dirname(e.path)}`),puter._cache.del(`item:${c.dirname(e.path)}`),console.log(`deleted cache for item:${c.dirname(e.path)}`)}),this.socket.on("item.updated",e=>{puter._cache.flushall(),console.log("Flushed cache for item.updated")}),this.socket.on("item.moved",e=>{puter._cache.flushall(),console.log("Flushed cache for item.moved")}),this.socket.on("connect",()=>{puter.debugMode&&console.log("FileSystem Socket: Connected",this.socket.id)}),this.socket.on("disconnect",()=>{puter.debugMode&&console.log("FileSystem Socket: Disconnected")}),this.socket.on("reconnect",e=>{puter.debugMode&&console.log("FileSystem Socket: Reconnected",this.socket.id)}),this.socket.on("reconnect_attempt",e=>{puter.debugMode&&console.log("FileSystem Socket: Reconnection Attemps",e)}),this.socket.on("reconnect_error",e=>{puter.debugMode&&console.log("FileSystem Socket: Reconnection Error",e)}),this.socket.on("reconnect_failed",()=>{puter.debugMode&&console.log("FileSystem Socket: Reconnection Failed")}),this.socket.on("error",e=>{puter.debugMode&&console.error("FileSystem Socket Error:",e)})}setAuthToken(e){this.authToken=e,"gui"===this.puter.env&&(this.checkCacheAndPurge(),this.startCacheUpdateTimer()),this.initializeSocket()}setAPIOrigin(e){this.APIOrigin=e,this.initializeSocket()}invalidateCache(){localStorage.setItem(Ft,"0"),puter._cache.flushall()}async getCacheTimestamp(){return new Promise((e,t)=>{const n=q("/cache/last-change-timestamp",this.APIOrigin,this.authToken,"get","application/json");U(n,void 0,void 0,async n=>{try{const t="string"==typeof n?JSON.parse(n):n;e(t.timestamp||Date.now())}catch(e){t(new Error("Failed to parse response"))}},t),n.send()})}async checkCacheAndPurge(){try{await this.getCacheTimestamp()-(parseInt(localStorage.getItem(Ft))||0)>2e3&&(console.log("Cache is not up to date, purging cache"),puter._cache.flushall(),localStorage.setItem(Ft,"0"))}catch(e){console.error("Error checking cache timestamp:",e)}}startCacheUpdateTimer(){"gui"===this.puter.env&&(this.cacheUpdateTimer=setInterval(()=>{localStorage.setItem(Ft,Date.now().toString())},1e3))}stopCacheUpdateTimer(){this.cacheUpdateTimer&&(clearInterval(this.cacheUpdateTimer),this.cacheUpdateTimer=null)}}const Xt=class{constructor(e){this.puter=e,this.authToken=e.authToken,this.APIOrigin=e.APIOrigin,this.appID=e.appID}setAuthToken(e){this.authToken=e}setAPIOrigin(e){this.APIOrigin=e}list=async(...e)=>(await z([],"puter-subdomains",void 0,"select")(...e)).filter(e=>!e.subdomain.startsWith("workers.puter."));create=async(...e)=>{let t={};return"string"==typeof e[0]&&1===e.length?(e[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)&&(e[0]=e[0].split(".")[0]),t={object:{subdomain:e[0]}}):Array.isArray(e)&&2===e.length&&"string"==typeof e[0]?(e[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)&&(e[0]=e[0].split(".")[0]),e[1]&&(e[1]=vt(e[1])),t={object:{subdomain:e[0],root_dir:e[1]}}):"object"==typeof e[0]&&(t={object:e[0]}),await z(["object"],"puter-subdomains",void 0,"create").call(this,t)};update=async(...e)=>{let t={};return Array.isArray(e)&&"string"==typeof e[0]&&(e[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)&&(e[0]=e[0].split(".")[0]),e[1]&&(e[1]=vt(e[1])),t={id:{subdomain:e[0]},object:{root_dir:e[1]??null}}),await z(["object"],"puter-subdomains",void 0,"update").call(this,t)};get=async(...e)=>{let t={};return Array.isArray(e)&&"string"==typeof e[0]&&(e[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)&&(e[0]=e[0].split(".")[0]),t={id:{subdomain:e[0]}}),z(["uid"],"puter-subdomains",void 0,"read").call(this,t)};delete=async(...e)=>{let t={};return Array.isArray(e)&&"string"==typeof e[0]&&(e[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)&&(e[0]=e[0].split(".")[0]),t={id:{subdomain:e[0]}}),z(["uid"],"puter-subdomains",void 0,"delete").call(this,t)}},Vt=()=>{let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},Kt=["has_set_default_app_user_permissions","window_sidebar_width","sidebar_items","menubar_style","user_preferences.auto_arrange_desktop","user_preferences.show_hidden_files","user_preferences.language","user_preferences.clock_visible","toolbar_auto_hide_enabled","has_seen_welcome_window","desktop_item_positions","desktop_icons_hidden","taskbar_position","has_seen_toolbar_animation"],Gt=class{MAX_KEY_SIZE=1024;MAX_VALUE_SIZE=408576;constructor(e){this.puter=e,this.authToken=e.authToken,this.APIOrigin=e.APIOrigin,this.appID=e.appID,this.gui_cached=Vt(),this.gui_cache_init=Vt(),(async()=>{await this.gui_cache_init.promise,this.gui_cache_init=null;const e=await fetch(`${this.APIOrigin}/drivers/call`,{method:"POST",headers:{"Content-Type":"text/plain;actually=json"},body:JSON.stringify({interface:"puter-kvstore",method:"get",args:{key:Kt},auth_token:this.authToken})}),t=await e.json();if(!Array.isArray(t?.result))return this.gui_cached.resolve({}),void setTimeout(()=>{this.gui_cached=null},4e3);const n={};for(let e=0;e{this.gui_cached=null},4e3)})()}setAuthToken(e){this.authToken=e}setAPIOrigin(e){this.APIOrigin=e}set=z(["key","value","expireAt"],"puter-kvstore",void 0,"set",{preprocess:e=>{if(void 0===e.key||null===e.key)throw{message:"Key cannot be undefined",code:"key_undefined"};if(e.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};if(e.value&&e.value.length>this.MAX_VALUE_SIZE)throw{message:`Value size cannot be larger than ${this.MAX_VALUE_SIZE}`,code:"value_too_large"};return e}});async get(...e){return"string"==typeof e[0]&&Kt.includes(e[0])&&null!==this.gui_cached?(this.gui_cache_init&&this.gui_cache_init.resolve(),(await this.gui_cached.promise)[e[0]]):await this.get_(...e)}get_=z(["key"],"puter-kvstore",void 0,"get",{preprocess:e=>{if(e.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};return e},transform:e=>e});incr=async(...e)=>{let t={};if(!e||0===e.length)throw{message:"Arguments are required",code:"arguments_required"};if(t.key=e[0],t.pathAndAmountMap=e[1]?"number"==typeof e[1]?{"":e[1]}:e[1]:{"":1},t.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};return z(["key"],"puter-kvstore",void 0,"incr").call(this,t)};decr=async(...e)=>{let t={};if(!e||0===e.length)throw{message:"Arguments are required",code:"arguments_required"};if(t.key=e[0],t.pathAndAmountMap=e[1]?"number"==typeof e[1]?{"":e[1]}:e[1]:{"":1},t.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};return z(["key"],"puter-kvstore",void 0,"decr").call(this,t)};add=async(...e)=>{let t={};if(!e||0===e.length)throw{message:"Arguments are required",code:"arguments_required"};t.key=e[0];const n=e[1],r=n&&"object"==typeof n&&!Array.isArray(n);if(t.pathAndValueMap=void 0===n?{"":1}:r?n:{"":n},t.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};return z(["key"],"puter-kvstore",void 0,"add").call(this,t)};remove=async(...e)=>{if(!e||e.length<2)throw{message:"At least one path is required",code:"arguments_required"};const t=e[0],n=e.slice(1);if(Array.isArray(n[0])&&1===n.length)throw{message:"Paths must be provided as separate arguments",code:"paths_invalid"};if(null==t)throw{message:"Key cannot be undefined",code:"key_undefined"};if(t.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};if(0===n.length)throw{message:"At least one path is required",code:"arguments_required"};if(n.some(e=>"string"!=typeof e))throw{message:"All paths must be strings",code:"paths_invalid"};return z(["key","paths"],"puter-kvstore",void 0,"remove").call(this,{key:t,paths:n})};update=z(["key","pathAndValueMap","ttl"],"puter-kvstore",void 0,"update",{preprocess:e=>{if(void 0===e.key||null===e.key)throw{message:"Key cannot be undefined",code:"key_undefined"};if(e.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};if(void 0===e.pathAndValueMap||null===e.pathAndValueMap||Array.isArray(e.pathAndValueMap)||"object"!=typeof e.pathAndValueMap)throw{message:"pathAndValueMap must be an object",code:"path_map_invalid"};if(0===Object.keys(e.pathAndValueMap).length)throw{message:"pathAndValueMap cannot be empty",code:"path_map_invalid"};if(void 0!==e.ttl&&null!==e.ttl){const t=Number(e.ttl);if(Number.isNaN(t))throw{message:"ttl must be a number",code:"ttl_invalid"};e.ttl=t}return e}});expire=async(e,t)=>{let n={};if(n.key=e,n.ttl=t,n.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};return z(["key","ttl"],"puter-kvstore",void 0,"expire").call(this,n)};expireAt=async(e,t)=>{let n={};if(n.key=e,n.timestamp=t,n.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};return z(["key","timestamp"],"puter-kvstore",void 0,"expireAt").call(this,n)};del=z(["key"],"puter-kvstore",void 0,"del",{preprocess:e=>{if(e.key.length>this.MAX_KEY_SIZE)throw{message:`Key size cannot be larger than ${this.MAX_KEY_SIZE}`,code:"key_too_large"};return e}});list=async(...e)=>{let t,n={},r=!1;if(1===e.length&&e[0]&&"object"==typeof e[0]&&!Array.isArray(e[0])){const s=e[0];"string"==typeof s.pattern&&(t=s.pattern),r=!!s.returnValues,void 0!==s.limit&&(n.limit=s.limit),void 0!==s.cursor&&(n.cursor=s.cursor)}else(e&&1===e.length&&!0===e[0]||e&&2===e.length&&!0===e[1])&&(r=!0),(e&&1===e.length&&"string"==typeof e[0]||e&&2===e.length&&"string"==typeof e[0]&&!0===e[1])&&(t=e[0]);r||(n.as="keys");const s=function(e){if("string"!=typeof e)return;const t=e.trim();if(""!==t){if(t.endsWith("*")){const e=t.slice(0,-1);return""===e?void 0:e}return t}}(t);return s&&(n.pattern=s),z([],"puter-kvstore",void 0,"list").call(this,n)};flush=z([],"puter-kvstore",void 0,"flush");clear=this.flush};class Ht{#s;#i;constructor(e){this.#s=e,this.#i=(()=>{const e=new Map;for(let t of this.#s)e[t]=[];return e})()}emit(e,t){this.#s.includes(e)?this.#i[e].forEach(e=>{e(t)}):console.error(`Event name '${e}' not supported`)}on(e,t){if(this.#s.includes(e))return this.#i[e].push(t),this;console.error(`Event name '${e}' not supported`)}off(e,t){if(!this.#s.includes(e))return void console.error(`Event name '${e}' not supported`);const n=this.#i[e],r=n.indexOf(t);return-1!==r&&n.splice(r,1),this}}const Yt=new TextDecoder,Qt=new TextEncoder,Zt={1:"Reason unspecified or unknown. Returning a more specific reason should be preferred.",3:"Unexpected stream closure due to a network error.",65:"Stream creation failed due to invalid information. This could be sent if the destination was a reserved address or the port is invalid.",66:"Stream creation failed due to an unreachable destination host. This could be sent if the destination is an domain which does not resolve to anything.",67:"Stream creation timed out due to the destination server not responding.",68:"Stream creation failed due to the destination server refusing the connection.",71:"TCP data transfer timed out.",72:"Stream destination address/domain is intentionally blocked by the proxy server.",73:"Connection throttled by the server."};function Jt(e){let t=5;switch(e.packetType){case 1:e.hostEncoded=Qt.encode(e.hostname),t+=3+e.hostEncoded.length;break;case 2:t+=e.payload.byteLength;break;case 3:t+=4;break;case 4:t+=1;break;case 5:t+=2,e.password&&(t+=6),e.puterAuth&&(e.passwordEncoded=Qt.encode(e.puterAuth),t+=8+e.passwordEncoded.length);break;default:throw new Error("Not supported")}let n=new Uint8Array(t);const r=new DataView(n.buffer);switch(r.setUint8(0,e.packetType),r.setUint32(1,e.streamID,!0),e.packetType){case 1:r.setUint8(5,e.streamType),r.setUint16(6,e.port,!0),n.set(e.hostEncoded,8);break;case 2:n.set(e.payload,5);break;case 3:r.setUint32(5,e.remainingBuffer,!0);break;case 4:r.setUint8(5,e.reason);break;case 5:r.setUint8(5,2),r.setUint8(6,0),e.password&&(r.setUint8(7,2),r.setUint32(8,1,!0),r.setUint8(12,0)),e.puterAuth&&(r.setUint8(7,2),r.setUint32(8,5+e.passwordEncoded.length,!0),r.setUint8(12,0),r.setUint16(13,e.passwordEncoded.length,!0),n.set(e.passwordEncoded,15))}return n}class $t{_ws;_nextStreamID=1;_bufferMax;onReady=void 0;streamMap=new Map;constructor(e,t){const n=()=>{this._ws=new WebSocket(e),this._ws.binaryType="arraybuffer",this._ws.onmessage=e=>{const r=function(e){const t=new DataView(e.buffer,e.byteOffset),n=t.getUint8(0),r=t.getUint32(1,!0);switch(n){case 1:return{packetType:n,streamID:r,streamType:t.getUint8(5),port:t.getUint16(6,!0),hostname:Yt.decode(e.subarray(8,e.length))};case 2:return{packetType:n,streamID:r,payload:e.subarray(5,e.length)};case 3:return{packetType:n,streamID:r,remainingBuffer:t.getUint32(5,!0)};case 4:return{packetType:n,streamID:r,reason:t.getUint8(5)};case 5:const s={};s.version_major=t.getUint8(5),s.version_minor=t.getUint8(6);let i=7;for(;i{setTimeout(n(),1e3)},void(this.onReady&&this.onReady());this.streamMap.get(r.streamID).buffer=r.remainingBuffer,this._continue();break;case 4:0!==r.streamID&&this.streamMap.get(r.streamID).closeCallBack(r.reason);break;case 5:t&&this._ws.send(Jt({packetType:5,streamID:0,puterAuth:t}))}}};n()}_continue(e){const t=this.streamMap.get(e).queue;for(let n=0;n0?(n.buffer--,this._ws.send(Jt({packetType:2,streamID:e,payload:t}))):n.queue.push(t)}close(e){this._ws.send(Jt({packetType:4,streamID:e,reason:2}))}}const en=new TextEncoder;let tn,nn={server:"wss://puter.cafe/",handler:void 0};class rn extends Ht{_events=new Map;_streamID;constructor(e,t){super(["data","drain","open","error","close","tlsdata","tlsopen","tlsclose"]),(async()=>{if(!puter.authToken&&puter.env,!nn.handler){const{token:e,server:t}=await(await fetch(`${puter.APIOrigin}/wisp/relay-token/create`,{method:"POST",headers:{Authorization:puter.authToken?`Bearer ${puter.authToken}`:"","Content-Type":"application/json"},body:JSON.stringify({})})).json();nn.handler=new $t(t,e),await new Promise((e,t)=>{nn.handler.onReady=e})}const n={dataCallBack:e=>{this.emit("data",e)},closeCallBack:e=>{if(2!==e)return this.emit("error",new Error(Zt[e])),void this.emit("close",!0);this.emit("close",!1)}};this._streamID=nn.handler.register(e,t,n),setTimeout(()=>{this.emit("open",void 0)},0)})()}addListener(...e){this.on(...e)}write(e,t){if(e.buffer)nn.handler.write(this._streamID,e),t&&t();else if(e.resize)e.write(this._streamID,new Uint8Array(e)),t&&t();else{if("string"!=typeof e)throw new Error("Invalid data type (not TypedArray, ArrayBuffer or String!!)");nn.handler.write(this._streamID,en.encode(e)),t&&t()}}close(){nn.handler.close(this._streamID)}}class sn extends rn{constructor(...e){super(...e),super.on("open",async()=>{tn||(globalThis.ReadableByteStreamController||await import("https://unpkg.com/web-streams-polyfill@3.0.2/dist/polyfill.js"),tn=await import("https://puter-net.b-cdn.net/rustls.js"),await tn.default("https://puter-net.b-cdn.net/rustls.wasm"));let t=!1;const n=new ReadableStream({start:e=>{super.on("data",t=>{e.enqueue(t.buffer)}),super.on("close",()=>{t||e.close()})},pull:e=>{},cancel:()=>{t=!0}}),r=new WritableStream({write:e=>{super.write(e)},abort:()=>{super.close()},close:()=>{super.close()}});let s,i;try{const t=await tn.connect_tls(n,r,e[0]);s=t.read,i=t.write}catch(e){return void this.emit("error",new Error(`TLS Handshake failed: ${e}`))}this.writer=i.getWriter();let o=s.getReader(),a=!1;this.emit("tlsopen",void 0);try{for(;!a;){const{done:e,value:t}=await o.read();a=e,a||this.emit("tlsdata",t)}this.emit("tlsclose",!1)}catch(e){this.emit("error",e),this.emit("tlsclose",!0)}})}on(e,t){return"data"===e||"open"===e||"close"===e?super.on(`tls${e}`,t):super.on(e,t)}write(e,t){if(e.buffer)this.writer.write(e.slice(0).buffer).then(t);else if(e.resize)this.writer.write(e).then(t);else{if("string"!=typeof e)throw new Error("Invalid data type (not TypedArray, ArrayBuffer or String!!)");this.writer.write(e).then(t)}}}function on(...e){return new Promise(async(t,n)=>{try{const r=new Request(...e),s=new URL(r.url);let i,o=new Headers(r.headers);if("http:"===s.protocol)i=new puter.net.Socket(s.hostname,s.port||80);else{if("https:"!==s.protocol){const e=`Failed to fetch. URL scheme "${s.protocol}" is not supported.`;return globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"network",operation:"pFetch",params:{url:r.url,method:r.method},error:{message:e}}),void n(e)}i=new puter.net.tls.TLSSocket(s.hostname,s.port||443)}o.get("user-agent")||o.set("user-agent",navigator.userAgent);let a,c=`${r.method} ${s.pathname}${s.search} HTTP/1.1\r\nHost: ${s.host}\r\nConnection: close\r\n`;for(const[e,t]of o)c+=`${e}: ${t}\r\n`;if(r.body){if(a=new Uint8Array(await r.arrayBuffer()),o.has("content-length")){if(o.get("content-length")!==String(a.length))return n("Content-Length header does not match the body length. Please check your request.")}else o.set("content-length",a.length);c+=`Content-Length: ${a.length}\r\n`}c+="\r\n",i.on("open",async()=>{i.write(c),a&&i.write(a)});const l=new TextDecoder;let h="",u=-1;const d=[];let p=!1,g=-1,f=0,m=!1,y=-1,b=new Uint8Array(0);const w=new ReadableStream({start(e){function s(t){const n=new Uint8Array(b.length+t.length);for(n.set(b,0),n.set(t,b.length),b=n;;)if(y>0){if(!(b.length>=y+2)){e.enqueue(b),y-=b.length,b=new Uint8Array(0);break}{const t=b.slice(0,y);e.enqueue(t),b=b.slice(y+2),y=0}}else{let t=-1;for(let e=0;e+1{if(-1===u||m||(e.enqueue(n),f+=n.length),-1===u&&(d.push(n),h+=l.decode(n,{stream:!0})),m&&s(n),-1!==h.indexOf("\r\n\r\n")){u=h.indexOf("\r\n\r\n"),h=h.slice(0,u);const n=function(e){const t=e.split("\r\n"),n=t.shift().split(" "),r=Number(n[1]),s=n.slice(2).join(" ")||"",i=[];for(const e of t){const t=e.split(": "),n=t[0],r=t.slice(1).join(": ");i.push([n,r])}return new Headers(i),{headers:new Headers(i),statusText:s,status:r}}(h);g=Number(n.headers.get("content-length")),m="chunked"===n.headers.get("transfer-encoding"),globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"network",operation:"pFetch",params:{url:r.url,method:r.method},result:{status:n.status,statusText:n.statusText}}),t(new Response(w,n));const i=function(...e){const t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t);return e.forEach((e,t,r)=>{const s=r.slice(0,t).reduce((e,t)=>e+t.length,0);n.set(e,s)}),n}(...d).slice(u+4);m?s(i):(f+=i.length,e.enqueue(i))}-1===g||f!==g||m||p||(p=!0,e.close())}),i.on("close",()=>{p||(p=!0,e.close())}),i.on("error",e=>{globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"network",operation:"pFetch",params:{url:r.url,method:r.method},error:{message:`Socket errored with the following reason: ${e}`}}),n(`Socket errored with the following reason: ${e}`)})}})}catch(e){globalThis.puter?.apiCallLogger?.isEnabled()&&globalThis.puter.apiCallLogger.logRequest({service:"network",operation:"pFetch",params:{url:reqObj.url,method:reqObj.method},error:{message:e.message||e.toString(),stack:e.stack}}),n(e)}})}const an=class{constructor(e){this.puter=e,this.authToken=e.authToken,this.APIOrigin=e.APIOrigin,this.appID=e.appID}setAuthToken(e){this.authToken=e}setAPIOrigin(e){this.APIOrigin=e}user=function(...e){let t;t="object"==typeof e[0]&&null!==e[0]?e[0]:{success:e[0],error:e[1]};let n="";return t?.query&&(n=`?${new URLSearchParams(t.query).toString()}`),new Promise((e,r)=>{const s=q(`/whoami${n}`,this.APIOrigin,this.authToken,"get");U(s,t.success,t.error,e,r),s.send()})};version=function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{success:e[0],error:e[1]},new Promise((e,n)=>{const r=q("/version",this.APIOrigin,this.authToken,"get");U(r,t.success,t.error,e,n),r.send()})}};class cn{constructor(e){this.puter=e,this.authToken=e.authToken,this.APIOrigin=e.APIOrigin}setAuthToken(e){this.authToken=e}setAPIOrigin(e){this.APIOrigin=e}async req_(e,t){try{const n=await fetch(this.APIOrigin+e,{method:t?"POST":"GET",headers:{Authorization:`Bearer ${this.authToken}`,"Content-Type":"application/json"},...t?{body:JSON.stringify(t)}:{}});if(n.headers.get("content-type")?.includes("application/json")){const e=await n.json();return 200!==n.status&&(e.error=!0),e}return{error:!0,message:await n.text(),code:"unknown_error"}}catch(e){return{error:!0,message:e.message,code:"internal_error"}}}async grantUser(e,t){return await this.req_("/auth/grant-user-user",{target_username:e,permission:t})}async grantGroup(e,t){return await this.req_("/auth/grant-user-group",{group_uid:e,permission:t})}async grantApp(e,t){return await this.req_("/auth/grant-user-app",{app_uid:e,permission:t})}async grantAppAnyUser(e,t){return await this.req_("/auth/grant-dev-app",{app_uid:e,permission:t})}async grantOrigin(e,t){return await this.req_("/auth/grant-user-app",{origin:e,permission:t})}async revokeUser(e,t){return await this.req_("/auth/revoke-user-user",{target_username:e,permission:t})}async revokeGroup(e,t){return await this.req_("/auth/revoke-user-group",{group_uid:e,permission:t})}async revokeApp(e,t){return await this.req_("/auth/revoke-user-app",{app_uid:e,permission:t})}async revokeAppAnyUser(e,t){return await this.req_("/auth/revoke-dev-app",{app_uid:e,permission:t})}async revokeOrigin(e,t){return await this.req_("/auth/revoke-user-app",{origin:e,permission:t})}async createGroup(e={},t={}){return await this.req_("/group/create",{metadata:e,extra:t})}async addUsersToGroup(e,t){return await this.req_("/group/add-users",{uid:e,users:t??[]})}async removeUsersFromGroup(e,t){return await this.req_("/group/remove-users",{uid:e,users:t??[]})}async listGroups(){return await this.req_("/group/list")}requestPermission(...e){return this.request(...e)}async request(e){return await this.puter.ui.requestPermission({permission:e})}async requestEmail(){let e;return e=await this.puter.auth.whoami(),void 0!==e.email||await this.puter.ui.requestPermission({permission:`user:${e.uuid}:email:read`})&&(e=await this.puter.auth.whoami()),e.email}async requestReadDesktop(){return this.requestFolder_("Desktop","read")}async requestWriteDesktop(){return this.requestFolder_("Desktop","write")}async requestReadDocuments(){return this.requestFolder_("Documents","read")}async requestWriteDocuments(){return this.requestFolder_("Documents","write")}async requestReadPictures(){return this.requestFolder_("Pictures","read")}async requestWritePictures(){return this.requestFolder_("Pictures","write")}async requestReadVideos(){return this.requestFolder_("Videos","read")}async requestWriteVideos(){return this.requestFolder_("Videos","write")}async requestReadApps(){const e=await this.puter.auth.whoami();return await this.puter.ui.requestPermission({permission:`apps-of-user:${e.uuid}:read`})}async requestManageApps(){const e=await this.puter.auth.whoami();return await this.puter.ui.requestPermission({permission:`apps-of-user:${e.uuid}:write`})}async requestReadSubdomains(){const e=await this.puter.auth.whoami();return await this.puter.ui.requestPermission({permission:`subdomains-of-user:${e.uuid}:read`})}async requestManageSubdomains(){const e=await this.puter.auth.whoami();return await this.puter.ui.requestPermission({permission:`subdomains-of-user:${e.uuid}:write`})}async requestReadAppRootDir(e){return await this.#o("read",e)}async requestWriteAppRootDir(e){return await this.#o("write",e)}async#o(e,t){if("object"==typeof t&&null!==t&&(t=t.uid),"string"!=typeof t)throw new Error("parameter app_uid must be a strinkg");let n;const r=async()=>n=await this.req_("/auth/request-app-root-dir",{app_uid:t,access:"read"});if(await r(),!n.error)return n;const s=`app-root-dir:${t="object"==typeof app_or_uuid&&null!==t?t.uid:t}:read`;if(await this.puter.ui.requestPermission({permission:s})){await r();let e=100;const t=5e3;let s=0;for(;n.error&&ssetTimeout(t,e)),s+=e,await r(),n.error);)e=Math.min(2*e,Math.max(100,t-s))}return n.error?void 0:n}async requestFolder_(e,t){const n=`/${(await this.puter.auth.whoami()).username}/${e}`;try{if(await this.puter.fs.stat({path:n}),"write"!==t)return n}catch(e){}if(await this.puter.ui.requestPermission({permission:`fs:${n}:${t}`}))return n}}class ln extends(globalThis.HTMLElement||Object){static messageID=Math.floor(Number.MAX_SAFE_INTEGER/2);isUsingFileProtocol=()=>"file:"===window.location.protocol;#r;constructor(e,t){let n;super(),this.reject=t,this.resolve=e,this.popupLaunched=!1,this.#r=this.constructor.messageID++,this.hasUserActivation=()=>{if(navigator.userActivation)return navigator.userActivation.hasBeenActive&&navigator.userActivation.isActive;try{const e=window.open("","_blank","width=1,height=1,left=-1000,top=-1000");return!!e&&(e.close(),!0)}catch(e){return!1}},this.launchPopup=()=>{try{let n=600,r=700,s="Puter";var e=screen.width/2-n/2,t=screen.height/2-r/2;return window.open(`${puter.defaultGUIOrigin}/?embedded_in_popup=true&request_auth=true${window.crossOriginIsolated?"&cross_origin_isolated=true":""}`,s,`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${n}, height=${r}, top=${t}, left=${e}`)}catch(e){return console.error("Failed to open popup:",e),null}},this.attachShadow({mode:"open"}),n="\n ","file:"===window.location.protocol?n+='\n
\n \n
\n

Puter.js Error: Unsupported Protocol

\n

It looks like you\'ve opened this file directly in your browser (using the file:/// protocol) which is not supported by Puter.js for security reasons.

\n

To view this content properly, you need to serve it through a web server. Here are some options:

\n
    \n
  • Use a local development server (e.g., Python\'s built-in server or Node.js http-server)
  • \n
  • Upload the files to a web hosting service
  • \n
  • Use a local server application like XAMPP or MAMP
  • \n
\n

If you\'re not familiar with these options, consider reaching out to your development team or IT support for assistance.

\n
\n

\n Docs|\n Github|\n Discord\n

\n
\n
':n+='\n
\n \n \n

This website uses Puter to bring you safe, secure, and private AI and Cloud features.

\n
\n \n \n
\n

Powered by Puter

\n

By clicking \'Continue\' you agree to Puter\'s Terms of Service and Privacy Policy.

\n
\n
',this.shadowRoot.innerHTML=n,this.messageListener=async e=>{"puter.token"===e.data.msg&&(this.close(),puter.setAuthToken(e.data.token),puter.setAppID(e.data.app_uid),window.removeEventListener("message",this.messageListener),puter.puterAuthState.authGranted=!0,this.resolve(),puter.onAuth&&"function"==typeof puter.onAuth&&puter.getUser().then(e=>{puter.onAuth(e)}),puter.puterAuthState.isPromptOpen=!1,puter.puterAuthState.resolver&&(puter.puterAuthState.authGranted?puter.puterAuthState.resolver.resolve():puter.puterAuthState.resolver.reject(),puter.puterAuthState.resolver=null))}}cancelListener=()=>{this.close(),window.removeEventListener("message",this.messageListener),puter.puterAuthState.authGranted=!1,puter.puterAuthState.isPromptOpen=!1,this.reject(new Error("User cancelled the authentication")),puter.puterAuthState.resolver&&(puter.puterAuthState.resolver.reject(new Error("User cancelled the authentication")),puter.puterAuthState.resolver=null)};connectedCallback(){this.shadowRoot.querySelector("#launch-auth-popup")?.addEventListener("click",()=>{var e=screen.width/2-300,t=screen.height/2-350;window.open(`${puter.defaultGUIOrigin}/?embedded_in_popup=true&request_auth=true&msg_id=${this.#r}${window.crossOriginIsolated?"&cross_origin_isolated=true":""}`,"Puter",`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=600, height=700, top=${t}, left=${e}`)}),window.addEventListener("message",this.messageListener),this.shadowRoot.querySelector("#launch-auth-popup-cancel")?.addEventListener("click",this.cancelListener),this.shadowRoot.querySelector(".close-btn")?.addEventListener("click",this.cancelListener)}open(){if(this.hasUserActivation()){let n=600,r=700,s="Puter";var e=screen.width/2-n/2,t=screen.height/2-r/2;window.open(`${puter.defaultGUIOrigin}/?embedded_in_popup=true&request_auth=true&msg_id=${this.#r}${window.crossOriginIsolated?"&cross_origin_isolated=true":""}`,s,`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${n}, height=${r}, top=${t}, left=${e}`)}else this.shadowRoot.querySelector("dialog").showModal()}close(){this.shadowRoot.querySelector("dialog").close()}}ln.__proto__===globalThis.HTMLElement&&customElements.define("puter-dialog",ln);const hn=ln,un=()=>{let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}},dn=Symbol("FILE_SAVE_CANCELLED"),pn=Symbol("FILE_OPEN_CANCELLED");class gn extends Ht{#a="*";#c;#l;static from(e,t,{messageTarget:n,appInstanceID:r}){const s=new gn(t,{target:e.appInstanceID,usesSDK:e.usesSDK,messageTarget:n,appInstanceID:r});return s.response=e.response,s}constructor(e,{target:t,usesSDK:n,messageTarget:r,appInstanceID:s}){super(["message","close"]),this.messageTarget=r,this.appInstanceID=s,this.targetAppInstanceID=t,this.#c=!0,this.#l=n,this.log=e.logger.fields({category:"ipc"}),this.log.fields({cons_source:s,source:e.appInstanceID,target:t}).info(`AppConnection created to ${t}`,this),globalThis.document&&window.addEventListener("message",e=>{if("messageToApp"===e.data.msg){if(e.data.appInstanceID!==this.targetAppInstanceID)return;return e.data.targetAppInstanceID!==this.appInstanceID?void console.error(`AppConnection received message intended for wrong app! appInstanceID=${this.appInstanceID}, target=${e.data.targetAppInstanceID}`):void this.emit("message",e.data.contents)}if("appClosed"===e.data.msg){if(e.data.appInstanceID!==this.targetAppInstanceID)return;this.#c=!1,this.emit("close",{appInstanceID:this.targetAppInstanceID,statusCode:e.data.statusCode})}})}get usesSDK(){return this.#l}postMessage(e){this.#c?this.#l?this.messageTarget.postMessage({msg:"messageToApp",appInstanceID:this.appInstanceID,targetAppInstanceID:this.targetAppInstanceID,targetAppOrigin:"*",contents:e},this.#a):console.warn("Trying to post message to a non-SDK app"):console.warn("Trying to post message on a closed AppConnection")}close(){this.#c?this.messageTarget.postMessage({msg:"closeApp",appInstanceID:this.appInstanceID,targetAppInstanceID:this.targetAppInstanceID},this.#a):console.warn("Trying to close an app on a closed AppConnection")}}const fn=class extends Ht{#r=1;itemWatchCallbackFunctions=[];appInstanceID;parentInstanceID;#h=null;#u=[];#d;#p;#g;#s;#f=new Map;#m=!1;#y=null;#b(e,t,n={}){const r=this.#r++;this.messageTarget?.postMessage({msg:e,env:this.env,appInstanceID:this.appInstanceID,uuid:r,...n},"*"),this.#u[r]=(...e)=>{t(...e)}}#w(e,t={}){return new Promise(n=>{this.#b(e,n,t)})}#v(e,t){const n=this.util.rpc.getDehydrator({target:this.messageTarget});this.messageTarget?.postMessage({msg:e,env:this.env,appInstanceID:this.appInstanceID,value:n.dehydrate(t)},"*")}async#k({callback:e,method:t,parameters:n}){let r,s;await new Promise(e=>{r=new Promise(t=>{s=t,e()})});const i=this.util.rpc.registerCallback(s);this.messageTarget?.postMessage({$:"puter-ipc",v:2,appInstanceID:this.appInstanceID,env:this.env,msg:t,parameters:n,uuid:i},"*");const o=await r;return e&&e(o),o}constructor(e,{appInstanceID:t,parentInstanceID:n}){const r=["localeChanged","themeChanged","connection"];if(super(r),this.#s=r,this.puter=e,this.appInstanceID=t,this.parentInstanceID=n,this.appID=e.appID,this.env=e.env,this.util=e.util,"app"===this.env)this.messageTarget=window.parent;else if("gui"===this.env)return;this.parentInstanceID&&(this.#h=new gn(this.puter,{target:this.parentInstanceID,usesSDK:!0,messageTarget:this.messageTarget,appInstanceID:this.appInstanceID})),this.messageTarget?.postMessage({msg:"READY",appInstanceID:this.appInstanceID},"*"),globalThis.document&&window.addEventListener("focus",e=>{this.messageTarget?.postMessage({msg:"windowFocused",appInstanceID:this.appInstanceID},"*")});let s=null;globalThis.document&&window.addEventListener("message",async e=>{if(e.data){if(e.data.error)throw e.data.error;if(e.data.msg&&"focus"===e.data.msg)window.focus();else if(e.data.msg&&"click"===e.data.msg){const t=document.elementFromPoint(e.data.x,e.data.y);null!==t&&t.click()}else if(e.data.msg&&"drag"===e.data.msg){const t=document.elementFromPoint(e.data.x,e.data.y);if(t!==s){if(s){const t=new Event("dragleave",{bubbles:!0,cancelable:!0,clientX:e.data.x,clientY:e.data.y});s.dispatchEvent(t)}if(t){const n=new Event("dragenter",{bubbles:!0,cancelable:!0,clientX:e.data.x,clientY:e.data.y});t.dispatchEvent(n)}s=t}}else if(e.data.msg&&"drop"===e.data.msg){if(s){const t=new CustomEvent("drop",{bubbles:!0,cancelable:!0,detail:{clientX:e.data.x,clientY:e.data.y,items:e.data.items}});s.dispatchEvent(t),s=null}}else if("windowWillClose"===e.data.msg)void 0===this.#d?this.messageTarget?.postMessage({msg:!0,appInstanceID:this.appInstanceID,original_msg_id:e.data.msg_id},"*"):(this.messageTarget?.postMessage({msg:!1,appInstanceID:this.appInstanceID,original_msg_id:e.data.msg_id},"*"),this.#d());else if("itemsOpened"===e.data.msg)if(void 0===this.#p)this.messageTarget?.postMessage({msg:!0,appInstanceID:this.appInstanceID,original_msg_id:e.data.msg_id},"*");else{this.messageTarget?.postMessage({msg:!1,appInstanceID:this.appInstanceID,original_msg_id:e.data.msg_id},"*");let t=[];if(e.data.items.length>0)for(let n=0;n1){let t=[];for(let n=0;n1){let t=[];for(let n=0;n{this.messageTarget?.postMessage({$:"connection-resp",connection:e.data.appInstanceID,accept:!0,value:t},"*")},r=t=>{this.messageTarget?.postMessage({$:"connection-resp",connection:e.data.appInstanceID,accept:!1,value:t},"*")};this.emit("connection",{conn:t,accept:n,reject:r})}}}),globalThis.document?.addEventListener("mousemove",async e=>{this.mouseX=e.clientX,this.mouseY=e.clientY,this.messageTarget?.postMessage({msg:"mouseMoved",appInstanceID:this.appInstanceID,x:this.mouseX,y:this.mouseY},"*")}),globalThis.document?.addEventListener("click",async e=>{this.mouseX=e.clientX,this.mouseY=e.clientY,this.messageTarget?.postMessage({msg:"mouseClicked",appInstanceID:this.appInstanceID,x:this.mouseX,y:this.mouseY},"*")})}onWindowClose(e){this.#d=e}onItemsOpened(e){if(!this.#p){let t=new URLSearchParams(globalThis.location.search);if(t.has("puter.item.name")&&t.has("puter.item.uid")&&t.has("puter.item.read_url")){let n=t.get("puter.item.path");n.startsWith("~/")||n.startsWith("/")||(n=`~/${n}`),e([new bt({name:t.get("puter.item.name"),path:n,uid:t.get("puter.item.uid"),readURL:t.get("puter.item.read_url"),writeURL:t.get("puter.item.write_url"),metadataURL:t.get("puter.item.metadata_url"),size:t.get("puter.item.size"),accessed:t.get("puter.item.accessed"),modified:t.get("puter.item.modified"),created:t.get("puter.item.created")})])}}this.#p=e}wasLaunchedWithItems(){const e=new URLSearchParams(globalThis.location.search);return e.has("puter.item.name")&&e.has("puter.item.uid")&&e.has("puter.item.read_url")}onLaunchedWithItems(e){if(!this.#g){let t=new URLSearchParams(globalThis.location.search);if(t.has("puter.item.name")&&t.has("puter.item.uid")&&t.has("puter.item.read_url")){let n=t.get("puter.item.path");n.startsWith("~/")||n.startsWith("/")||(n=`~/${n}`),e([new bt({name:t.get("puter.item.name"),path:n,uid:t.get("puter.item.uid"),readURL:t.get("puter.item.read_url"),writeURL:t.get("puter.item.write_url"),metadataURL:t.get("puter.item.metadata_url"),size:t.get("puter.item.size"),accessed:t.get("puter.item.accessed"),modified:t.get("puter.item.modified"),created:t.get("puter.item.created")})])}}this.#g=e}requestEmailConfirmation(){return new Promise((e,t)=>{this.#b("requestEmailConfirmation",e,{})})}alert(e,t,n,r){return new Promise(r=>{this.#b("ALERT",r,{message:e,buttons:t,options:n})})}openDevPaymentsAccount(){return new Promise(e=>{this.#b("openDevPaymentsAccount",e,{})})}instancesOpen(e){return new Promise(e=>{this.#b("getInstancesOpen",e,{})})}socialShare(e,t,n,r){return new Promise(r=>{this.#b("socialShare",r,{url:e,message:t,options:n})})}prompt(e,t,n,r){return new Promise(r=>{this.#b("PROMPT",r,{message:e,placeholder:t,options:n})})}notify(e){return new Promise(t=>{const n={...e??{}};void 0!==n.roundIcon&&void 0===n.round_icon&&(n.round_icon=n.roundIcon),this.#b("showNotification",t,{options:n})})}showDirectoryPicker(e,t){return new Promise((t,n)=>{if(!globalThis.open)return n("This API is not compatible in Web Workers.");const r=this.#r++;if("app"===this.env)this.messageTarget?.postMessage({msg:"showDirectoryPicker",appInstanceID:this.appInstanceID,uuid:r,options:e,env:this.env},"*");else{let t=700,n=400,o="Puter: Open Directory";var s=screen.width/2-t/2,i=screen.height/2-n/2;window.open(`${puter.defaultGUIOrigin}/action/show-directory-picker?embedded_in_popup=true&msg_id=${r}&appInstanceID=${this.appInstanceID}&env=${this.env}&options=${JSON.stringify(e)}`,o,`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${t}, height=${n}, top=${i}, left=${s}`)}this.#u[r]=t})}showOpenFilePicker(e,t){const n=un(),r=new Promise((t,r)=>{if(!globalThis.open)return r("This API is not compatible in Web Workers.");const s=this.#r++;if("app"===this.env)this.messageTarget?.postMessage({msg:"showOpenFilePicker",appInstanceID:this.appInstanceID,uuid:s,options:e??{},env:this.env},"*");else{let t=700,n=400,r="Puter: Open File";var i=screen.width/2-t/2,o=screen.height/2-n/2;window.open(`${puter.defaultGUIOrigin}/action/show-open-file-picker?embedded_in_popup=true&msg_id=${s}&appInstanceID=${this.appInstanceID}&env=${this.env}&options=${JSON.stringify(e??{})}`,r,`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${t}, height=${n}, top=${o}, left=${i}`)}this.#u[s]=e=>{e!==pn?(n.resolve(e),t(e)):n.resolve(void 0)}});return r.undefinedOnCancel=n.promise,r}showFontPicker(e){return new Promise(t=>{this.#b("showFontPicker",t,{options:e??{}})})}showColorPicker(e){return new Promise(t=>{this.#b("showColorPicker",t,{options:e??{}})})}requestUpgrade(){return new Promise(e=>{this.#b("requestUpgrade",e,{})})}showSaveFilePicker(e,t,n){const r=un(),s=new Promise((s,i)=>{if(!globalThis.open)return i("This API is not compatible in Web Workers.");const o=this.#r++;n||"[object URL]"!==Object.prototype.toString.call(e)||(n="url");const a="url"===n?e.toString():void 0,c=["move","copy"].includes(n)?e:void 0;if("app"===this.env)this.messageTarget?.postMessage({msg:"showSaveFilePicker",appInstanceID:this.appInstanceID,content:a?void 0:e,save_type:n,url:a,source_path:c,suggestedName:t??"",env:this.env,uuid:o},"*");else{window.addEventListener("message",async n=>{"sendMeFileData"===n.data?.msg&&(n.source.postMessage({msg:"showSaveFilePickerPopup",content:a?void 0:e,url:a?a.toString():void 0,suggestedName:t??"",env:this.env,uuid:o},"*"),window.removeEventListener("message",this))});let n=new Blob([e],{type:"application/octet-stream"}),r=URL.createObjectURL(n),s=700,i=400,c="Puter: Save File";var l=screen.width/2-s/2,h=screen.height/2-i/2;window.open(`${puter.defaultGUIOrigin}/action/show-save-file-picker?embedded_in_popup=true&msg_id=${o}&appInstanceID=${this.appInstanceID}&env=${this.env}&blobUrl=${encodeURIComponent(r)}`,c,`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${s}, height=${i}, top=${h}, left=${l}`)}this.#u[o]=e=>{e!==dn?(r.resolve(e),s(e)):r.resolve(void 0)}});return s.undefinedOnCancel=r.promise,s}setWindowTitle(e,t,n){return"function"==typeof t?t=void 0:"object"==typeof t&&null!==t&&(t=t.id),new Promise(n=>{this.#b("setWindowTitle",n,{new_title:e,window_id:t})})}setWindowWidth(e,t,n){return"function"==typeof t?t=void 0:"object"==typeof t&&null!==t&&(t=t.id),new Promise(n=>{this.#b("setWindowWidth",n,{width:e,window_id:t})})}setWindowHeight(e,t,n){return"function"==typeof t?t=void 0:"object"==typeof t&&null!==t&&(t=t.id),new Promise(n=>{this.#b("setWindowHeight",n,{height:e,window_id:t})})}setWindowSize(e,t,n,r){return"function"==typeof n?n=void 0:"object"==typeof n&&null!==n&&(n=n.id),new Promise(r=>{this.#b("setWindowSize",r,{width:e,height:t,window_id:n})})}setWindowPosition(e,t,n,r){return"function"==typeof n?n=void 0:"object"==typeof n&&null!==n&&(n=n.id),new Promise(r=>{this.#b("setWindowPosition",r,{x:e,y:t,window_id:n})})}setWindowY(e,t,n){return"function"==typeof t?t=void 0:"object"==typeof t&&null!==t&&(t=t.id),new Promise(n=>{this.#b("setWindowY",n,{y:e,window_id:t})})}setWindowX(e,t,n){return"function"==typeof t?t=void 0:"object"==typeof t&&null!==t&&(t=t.id),new Promise(n=>{this.#b("setWindowX",n,{x:e,window_id:t})})}showWindow(){this.#v("showWindow")}hideWindow(){this.#v("hideWindow")}toggleWindow(){this.#v("toggleWindow")}setMenubar(e){this.#v("setMenubar",e)}async requestPermission(e){return"app"===this.env&&(await this.#w("requestPermission",{options:e})).granted}disableMenuItem(e){this.#v("disableMenuItem",{id:e})}enableMenuItem(e){this.#v("enableMenuItem",{id:e})}setMenuItemIcon(e,t){this.#v("setMenuItemIcon",{id:e,icon:t})}setMenuItemIconActive(e,t){this.#v("setMenuItemIconActive",{id:e,icon:t})}setMenuItemChecked(e,t){this.#v("setMenuItemChecked",{id:e,checked:t})}contextMenu(e){this.#v("contextMenu",e)}getEntriesFromDataTransferItems=async function(e,t={raw:!1}){const n=e=>{if(this.getEntriesFromDataTransferItems.didShowInfo)return;if("EncodingError"!==e.name)return;this.getEntriesFromDataTransferItems.didShowInfo=!0;const t=`${e.name} occurred within datatransfer-files-promise module\nError message: "${e.message}"\nTry serving html over http if currently you are running it from the filesystem.`;console.warn(t)},r=(e,t)=>new Promise((r,i)=>{e.readEntries(async e=>{let n=[];for(let r of e){const e=await s(r,t);n=n.concat(e)}r(n)},e=>{n(e),i(e)})}),s=async(e,s="")=>{if(null!==e){if(e.isFile){const r=await((e,r="")=>new Promise((s,i)=>{e.file(e=>{t.raw||(e.filepath=r+e.name),s(e)},e=>{n(e),i(e)})}))(e,s);return[r]}if(e.isDirectory){const t=await(async(e,t)=>{const n=e.createReader(),s=`${t+e.name}/`;let i,o=[];do{i=await r(n,s),o=o.concat(i)}while(i.length>0);return o})(e,s);return t.push(e),t}}};let i=[],o=[];for(let t=0,n=e.length;t{e()}):puter.puterAuthState.isPromptOpen?new Promise((e,t)=>{puter.puterAuthState.resolver={resolve:e,reject:t}}):(puter.puterAuthState.isPromptOpen=!0,puter.puterAuthState.authGranted=null,new Promise((e,t)=>{if(puter.authToken)e();else{const n=new hn(e,t);document.body.appendChild(n),n.open()}}))}launchApp=async function(e,t,n){let r,s,i,o=e;if("object"==typeof o&&null!==o){const e=o;o=e.name||e.app_name,s=e.file_paths,t=t||e.args,n=n||e.callback,r=e.pseudonym,i=e.items}if(i){Array.isArray(i)||(i=[]);for(let e=0;e{this.#b("createWindow",e=>{t(e.window)},{options:e??{}})})}menubar(){document.querySelectorAll("style.puter-stylesheet").forEach(function(e){e.remove()});const e=document.createElement("style");e.classList.add("puter-stylesheet"),e.innerHTML="\n .--puter-menubar {\n border-bottom: 1px solid #e9e9e9;\n background-color: #fbf9f9;\n padding-top: 3px;\n padding-bottom: 2px;\n display: inline-block;\n position: fixed;\n top: 0;\n width: 100%;\n margin: 0;\n padding: 0;\n height: 31px;\n font-family: Arial, Helvetica, sans-serif;\n font-size: 13px;\n z-index: 9999;\n }\n \n .--puter-menubar, .--puter-menubar * {\n user-select: none;\n -webkit-user-select: none;\n cursor: default;\n }\n \n .--puter-menubar .dropdown-item-divider>hr {\n margin-top: 5px;\n margin-bottom: 5px;\n border-bottom: none;\n border-top: 1px solid #00000033;\n }\n \n .--puter-menubar>li {\n display: inline-block;\n padding: 10px 5px;\n }\n \n .--puter-menubar>li>ul {\n display: none;\n z-index: 999999999999;\n list-style: none;\n background-color: rgb(233, 233, 233);\n width: 200px;\n border: 1px solid #e4ebf3de;\n box-shadow: 0px 0px 5px #00000066;\n padding-left: 6px;\n padding-right: 6px;\n padding-top: 4px;\n padding-bottom: 4px;\n color: #333;\n border-radius: 4px;\n padding: 2px;\n min-width: 200px;\n margin-top: 5px;\n position: absolute;\n }\n \n .--puter-menubar .menubar-item {\n display: block;\n line-height: 24px;\n margin-top: -7px;\n text-align: center;\n border-radius: 3px;\n padding: 0 5px;\n }\n \n .--puter-menubar .menubar-item-open {\n background-color: rgb(216, 216, 216);\n }\n \n .--puter-menubar .dropdown-item {\n padding: 5px;\n padding: 5px 30px;\n list-style-type: none;\n user-select: none;\n font-size: 13px;\n }\n \n .--puter-menubar .dropdown-item-icon, .--puter-menubar .dropdown-item-icon-active {\n pointer-events: none;\n width: 18px;\n height: 18px;\n margin-left: -23px;\n margin-bottom: -4px;\n margin-right: 5px;\n }\n .--puter-menubar .dropdown-item-disabled .dropdown-item-icon{\n display: inline-block !important;\n }\n .--puter-menubar .dropdown-item-disabled .dropdown-item-icon-active{\n display: none !important;\n }\n .--puter-menubar .dropdown-item-icon-active {\n display:none;\n }\n .--puter-menubar .dropdown-item:hover .dropdown-item-icon{\n display: none;\n }\n .--puter-menubar .dropdown-item:hover .dropdown-item-icon-active{\n display: inline-block;\n }\n .--puter-menubar .dropdown-item-hide-icon .dropdown-item-icon, .--puter-menubar .dropdown-item-hide-icon .dropdown-item-icon-active{\n display: none !important;\n }\n .--puter-menubar .dropdown-item a {\n color: #333;\n text-decoration: none;\n }\n \n .--puter-menubar .dropdown-item:hover, .--puter-menubar .dropdown-item:hover a {\n background-color: rgb(59 134 226);\n color: white;\n border-radius: 4px;\n }\n \n .--puter-menubar .dropdown-item-disabled, .--puter-menubar .dropdown-item-disabled:hover {\n opacity: 0.5;\n background-color: transparent;\n color: initial;\n cursor: initial;\n pointer-events: none;\n }\n \n .--puter-menubar .menubar * {\n user-select: none;\n } \n ",(document.head||document.getElementsByTagName("head")[0]).appendChild(e),document.addEventListener("click",function(e){if(e.target.classList.contains("dropdown-item-disabled"))return!1;e.target.classList.contains("menubar-item")||(document.querySelectorAll(".menubar-item.menubar-item-open").forEach(function(e){e.classList.remove("menubar-item-open")}),document.querySelectorAll(".dropdown").forEach(e=>e.style.display="none"))}),window.addEventListener("blur",function(e){document.querySelectorAll(".dropdown").forEach(function(e){e.style.display="none"}),document.querySelectorAll(".menubar-item.menubar-item-open").forEach(e=>e.classList.remove("menubar-item-open"))}),document.querySelectorAll(".menubar-item").forEach(e=>e.addEventListener("mousedown",function(e){document.querySelectorAll(".dropdown").forEach(function(e){e.style.display="none"}),document.querySelectorAll(".menubar-item.menubar-item-open").forEach(function(t){t!=e.target&&t.classList.remove("menubar-item-open")}),this.classList.contains("menubar-item-open")?document.querySelectorAll(".menubar-item.menubar-item-open").forEach(function(e){e.classList.remove("menubar-item-open")}):e.target.classList.contains("dropdown-item")||(this.classList.add("menubar-item-open"),function(e){const t=[];if(!e.parentNode)return t;let n=e.parentNode.firstChild;for(;n;)1===n.nodeType&&n!==e&&t.push(n),n=n.nextSibling;return t}(this).forEach(function(e){e.style.display="block"}))})),document.querySelectorAll(".--puter-menubar .menubar-item").forEach(e=>e.addEventListener("mouseover",function(e){const t=document.querySelectorAll(".menubar-item.menubar-item-open");t.length>0&&t[0]!==e.target&&e.target.dispatchEvent(new Event("mousedown"))}))}on(e,t){super.on(e,t),this.#s.includes(e)&&this.#f.has(e)&&t(this.#f.get(e))}#A=null;#_=null;showSpinner(e){if(this.#m)return;if(!document.getElementById("puter-spinner-styles")){const e=document.createElement("style");e.id="puter-spinner-styles",e.textContent="\n .puter-loading-spinner {\n width: 50px;\n height: 50px;\n border: 5px solid #f3f3f3;\n border-top: 5px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin-bottom: 10px;\n }\n \n .puter-loading-text {\n font-family: Arial, sans-serif;\n font-size: 16px;\n margin-top: 10px;\n text-align: center;\n width: 100%;\n }\n \n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n \n .puter-loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 120px; \n background: #ffffff; \n border-radius: 10px;\n padding: 20px;\n min-width: 120px;\n }\n ",document.head.appendChild(e)}const t=document.createElement("div");t.classList.add("puter-loading-overlay"),Object.assign(t.style,{position:"fixed",top:"0",left:"0",width:"100%",height:"100%",backgroundColor:"rgba(255, 255, 255, 0.8)",zIndex:"2147483647",display:"flex",justifyContent:"center",alignItems:"center",pointerEvents:"all"});const n=document.createElement("div");n.classList.add("puter-loading-container"),n.innerHTML=`\n
\n
${e??"Working..."}
\n `,t.appendChild(n),document.body.appendChild(t),this.#m=!0,this.#A=Date.now(),this.#y=setTimeout(()=>{this.#y=null},1e3)}hideSpinner(){if(!this.#m)return;this.#y&&(clearTimeout(this.#y),this.#y=null);const e=Date.now()-this.#A,t=Math.max(0,1200-e);t>0?(this.#_&&clearTimeout(this.#_),this.#_=setTimeout(()=>{this.#x()},t)):this.#x()}#x(){const e=document.querySelector(".puter-loading-overlay");e&&e.parentNode?.removeChild(e),this.#m=!1,this.#A=null,this.#_=null}isWorkingActive(){return this.#m}getLanguage(){return"gui"===this.env?new Promise(e=>{e(window.locale)}):new Promise(e=>{this.#b("getLanguage",e,{})})}},mn="9a9c83a4-7897-43a0-93b9-53217b84fde6";class yn{#I=1;constructor(){this.callbacks=new Map}register_callback(e){const t=this.#I++;return this.callbacks.set(t,e),t}attach_to_source(e){e.addEventListener("message",e=>{const{data:t}=e;if(t&&"object"==typeof t&&t.$SCOPE===mn){const{id:e,args:n}=t,r=this.callbacks.get(e);r&&r(...n)}})}}class bn{constructor({callbackManager:e}){this.callbackManager=e}dehydrate(e){return this.dehydrate_value_(e)}dehydrate_value_(e){if("function"==typeof e){const t=this.callbackManager.register_callback(e);return{$SCOPE:mn,id:t}}if(Array.isArray(e))return e.map(this.dehydrate_value_.bind(this));if("object"==typeof e&&null!==e){const t={};for(const n in e)t[n]=this.dehydrate_value_(e[n]);return t}return e}}class wn{constructor({target:e}){this.target=e}hydrate(e){return this.hydrate_value_(e)}hydrate_value_(e){if(e&&"object"==typeof e&&e.$SCOPE===mn){const{id:t}=e;return(...e)=>{this.target.postMessage({$SCOPE:mn,id:t,args:e},"*")}}if(Array.isArray(e))return e.map(this.hydrate_value_.bind(this));if("object"==typeof e&&null!==e){const t={};for(const n in e)t[n]=this.hydrate_value_(e[n]);return t}return e}}class vn{constructor(){this.rpc=new kn}}class kn{constructor(){this.callbackManager=new yn,this.callbackManager.attach_to_source(globalThis)}getDehydrator(){return new bn({callbackManager:this.callbackManager})}getHydrator({target:e}){return new wn({target:e})}registerCallback(e){return this.callbackManager.register_callback(e)}send(e,t,...n){e.postMessage({$SCOPE:mn,id:t,args:n},"*")}}class An{constructor(e){this.authToken=e}async create(e,t,n){if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){throw"Authentication failed."}let r;if("object"==typeof n||void 0===n){const t=puter.whoami||await puter.getUser();if(t.is_user_token&&(void 0===n||!1!==n?.sandbox)){let n;try{n=await puter.apps.get(`sandbox-${e}`)}catch(t){n=await puter.apps.create(`sandbox-${e}`,"https://worker-sandbox.puter.com/")}if(n.owner.uuid!==t.uuid)throw new Error(`Sandbox context is not owned by you! This worker's sandbox is currently owned by: ${n.owner.username}`);r=n.uid}}"string"==typeof n&&(r=(await puter.apps.list()).find(e=>e.name===n).uid),e=e.toLocaleLowerCase();let s=await puter.kv.get("user-workers");s||(s={}),t=vt(t);const i=await z(["authorization","filePath","workerName","appId"],"workers","worker-service","create")(puter.authToken,t,e,r);if(!i.success)throw new Error(i?.errors||"Driver failed to execute, do you have the necessary permissions?");return s[e]={filePath:t,url:i.url,deployTime:Date.now(),createTime:Date.now()},await puter.kv.set("user-workers",s),i}async exec(...e){if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){throw"Authentication failed."}const t=new Request(...e);return t.headers.get("puter-auth")||t.headers.get("x-puter-no-auth")||t.headers.set("puter-auth",puter.authToken),t.headers.delete("x-puter-no-auth"),fetch(t)}async list(){if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){throw"Authentication failed."}return await z([],"workers","worker-service","getFilePaths")()}async get(e){if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){throw"Authentication failed."}return e=e.toLocaleLowerCase(),(await z(["workerName"],"workers","worker-service","getFilePaths")(e))[0]}async delete(e){if(!puter.authToken&&"web"===puter.env)try{await puter.ui.authenticateWithPuter()}catch(e){throw"Authentication failed."}e=e.toLocaleLowerCase();const t=await z(["authorization","workerName"],"workers","worker-service","destroy")(puter.authToken,e);if(t.result){let t=await puter.kv.get("user-workers");return t||(t={}),delete t[e],await puter.kv.set("user-workers",t),!0}throw t.result||new Error("Worker doesn't exist"),new Error(t?.errors||"Driver failed to execute, do you have the necessary permissions?")}async getLoggingHandle(e){const t=await z([],"workers","worker-service","getLoggingUrl")(puter.authToken,e),n=new WebSocket(`${t}/${puter.authToken}/${e}`),r=new EventTarget;return r.onLog=e=>{},Object.defineProperty(r,"start",{enumerable:!1,value:async e=>{n.addEventListener("message",t=>{e.enqueue(JSON.parse(t.data))}),n.addEventListener("close",()=>{try{e.close()}catch(e){}})}}),Object.defineProperty(r,"cancel",{enumerable:!1,value:async()=>{n.close()}}),n.addEventListener("message",e=>{const t=new MessageEvent("log",{data:JSON.parse(e.data)});r.dispatchEvent(t),r.onLog(t)}),r.close=n.close,new Promise((e,t)=>{let s=!1;n.onopen=()=>{s=!0,e(r)},n.onerror=()=>{s||t("Failed to open logging connection")}})}}class _n{constructor(e={}){this.fieldsObj=e,this.enabled=new Set}on(e){this.enabled.add(e)}fields(e={}){return new _n({...this.fieldsObj,...e})}info(...e){console.log(...this._prefix(),...e)}warn(...e){console.warn(...this._prefix(),...e)}error(...e){console.error(...this._prefix(),...e)}debug(...e){console.debug(...this._prefix(),...e)}_prefix(){const e=Object.entries(this.fieldsObj);return e.length?[`[${e.map(([e,t])=>`${e}=${t}`).join(" ")}]`]:[]}}class xn{constructor(){this.locked=!1,this.queue=[]}async acquire(){this.locked?(await new Promise(e=>this.queue.push(e)),this.locked=!0):this.locked=!0}release(){const e=this.queue.shift();e?e():this.locked=!1}}const In=function(){const e=new class{env;#T="https://api.puter.com";#E="https://puter.com";get defaultAPIOrigin(){return globalThis.PUTER_API_ORIGIN||"https://api.puter.com"}set defaultAPIOrigin(e){this.#T=e}get defaultGUIOrigin(){return globalThis.PUTER_ORIGIN||"https://puter.com"}set defaultGUIOrigin(e){this.#E=e}onAuth;puterAuthState={isPromptOpen:!1,authGranted:null,resolver:null};appInstanceID;parentInstanceID;static FSItem=bt;eventHandlers={};debugMode=!1;initSubmodules=function(){this.util=new vn,this.registerModule("auth",H),this.registerModule("os",an),this.registerModule("fs",Wt),this.registerModule("ui",fn,{appInstanceID:this.appInstanceID,parentInstanceID:this.parentInstanceID}),this.registerModule("hosting",Xt),this.registerModule("apps",G),this.registerModule("ai",K),this.registerModule("kv",Gt),this.registerModule("perms",cn),this.registerModule("drivers",J),this.registerModule("debug",Y),this.path=c};constructor(){this._cache=new n({dbName:"puter_cache"}),this._opscache=new n,this.modules_=[];let e=new URLSearchParams(globalThis.location?.search);const t=e=>{if("string"!=typeof e)return null;const t=e.trim();return t&&"null"!==t&&"undefined"!==t?t:null};e.has("puter.app_instance_id")?this.env="app":!0===globalThis.puter_gui_enabled?this.env="gui":globalThis.WorkerGlobalScope?(globalThis.ServiceWorkerGlobalScope?(this.env="service-worker",globalThis.XMLHttpRequest||(globalThis.XMLHttpRequest=E),globalThis.location||(globalThis.location=new URL("https://puter.site/"))):this.env="web-worker",globalThis.localStorage||(globalThis.localStorage=u)):globalThis.process?(this.env="nodejs",globalThis.localStorage||(globalThis.localStorage=u),globalThis.XMLHttpRequest||(globalThis.XMLHttpRequest=E),globalThis.location||(globalThis.location=new URL("https://nodejs.puter.site/")),globalThis.addEventListener||(globalThis.addEventListener=()=>{})):this.env="web","gui"!==this.env&&location.hostname.replace(/\.$/,"")===new URL("https://puter.com").hostname&&(this.env="gui"),e.has("puter.args")?this.args=JSON.parse(decodeURIComponent(e.get("puter.args"))):this.args={},e.has("puter.app_instance_id")&&(this.appInstanceID=decodeURIComponent(e.get("puter.app_instance_id"))),e.has("puter.parent_instance_id")&&(this.parentInstanceID=decodeURIComponent(e.get("puter.parent_instance_id"))),e.has("puter.app.id")&&(this.appID=decodeURIComponent(e.get("puter.app.id"))),e.has("puter.app.name")&&(this.appName=decodeURIComponent(e.get("puter.app.name"))),this.appID&&(this.appDataPath=`~/AppData/${this.appID}`),this.APIOrigin=this.defaultAPIOrigin,e.has("puter.api_origin")&&"app"===this.env?this.APIOrigin=decodeURIComponent(e.get("puter.api_origin")):e.has("puter.domain")&&"app"===this.env&&(this.APIOrigin=`https://api.${e.get("puter.domain")}`);let s=new _n;if(this.logger=s,this.apiCallLogger=new r({enabled:!1}),"gui"===this.env)this.authToken=window.auth_token,this.initSubmodules();else if("app"===this.env){const n=t(e.get("puter.auth.token")??e.get("auth_token"));try{if(n)this.setAuthToken(n);else{const e=t(localStorage.getItem("puter.auth.token"));e&&this.setAuthToken(e)}const e=localStorage.getItem("puter.app.id");e&&this.setAppID(e)}catch(e){console.error("Error accessing localStorage:",e)}this.initSubmodules()}else if("web"===this.env){this.initSubmodules();try{localStorage.getItem("puter.auth.token")&&this.setAuthToken(localStorage.getItem("puter.auth.token")),localStorage.getItem("puter.app.id")&&this.setAppID(localStorage.getItem("puter.app.id"))}catch(e){console.error("Error accessing localStorage:",e)}}else"web-worker"!==this.env&&"service-worker"!==this.env&&"nodejs"!==this.env||this.initSubmodules();(async()=>{try{const e=await this.auth.whoami(),t=`[${e?.app_name??this.appInstanceID??"HOST"}]`;s=s.fields({prefix:t}),this.logger=s}catch(e){this.debugMode&&console.error("Failed to initialize prefix logger",e)}})(),this.lock_rao_=new xn,this.p_can_request_rao_=Promise.resolve(),this.rao_requested_=!1,this.net={generateWispV1URL:async()=>{const{token:e,server:t}=await(await fetch(`${this.APIOrigin}/wisp/relay-token/create`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"Content-Type":"application/json"},body:JSON.stringify({})})).json();return`${t}/${e}/`},Socket:rn,tls:{TLSSocket:sn},fetch:on},this.workers=new An(this.authToken),this.initNetworkMonitoring()}async request_rao_(){if(await this.p_can_request_rao_,"gui"===this.env)return;if(await this.lock_rao_.acquire(),this.rao_requested_)return void this.lock_rao_.release();let e=!1;try{const e=await fetch(`${this.APIOrigin}/rao`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,Origin:location.origin}});return await e.json()}catch(t){e=!0,console.error(t)}finally{this.lock_rao_.release()}e||(this.rao_requested_=!0)}registerModule(e,t,n={}){const r=new t(this,n);r.puter=this,this.modules_.push(e),this[e]=r,r._init&&r._init({puter:this})}updateSubmodules(){for(const e of this.modules_)this[e]&&(this[e]?.setAuthToken?.(this.authToken),this[e]?.setAPIOrigin?.(this.APIOrigin))}setAppID=function(e){try{localStorage.setItem("puter.app.id",e)}catch(e){console.error("Error accessing localStorage:",e)}this.appID=e};setAuthToken=function(e){if(this.authToken=e,"web"===this.env||"app"===this.env)try{localStorage.setItem("puter.auth.token",e)}catch(e){console.error("Error accessing localStorage:",e)}"gui"===this.env&&setInterval(In.checkAndUpdateGUIFScache,1e4),this.updateSubmodules(),this.request_rao_(),this.getUser().then(e=>{this.whoami=e})};setAPIOrigin=function(e){this.APIOrigin=e,this.updateSubmodules()};runWhenPuterHappensCallbacks=function(){if("gui"!==this.env)return;if(!globalThis.when_puter_happens)return;const e=Array.isArray(globalThis.when_puter_happens)?globalThis.when_puter_happens:[globalThis.when_puter_happens];for(const t of e)try{t({puter:this})}catch(e){this.debugMode&&console.error("when_puter_happens callback failed",e)}};resetAuthToken=function(){if("worker"===this.env||"service-worker"===this.env)throw new Error("Sign out is not permitted from WebWorkers or ServiceWorkers");if(this.authToken=null,"web"===this.env||"app"===this.env)try{localStorage.removeItem("puter.auth.token")}catch(e){console.error("Error accessing localStorage:",e)}this.updateSubmodules()};exit=function(e=0){e&&"number"!=typeof e&&(console.warn("puter.exit() requires status code to be a number. Treating it as 1"),e=1),globalThis.parent.postMessage({msg:"exit",appInstanceID:this.appInstanceID,statusCode:e},"*")};randName=function(e="-"){const t=["helpful","sensible","loyal","honest","clever","capable","calm","smart","genius","bright","charming","creative","diligent","elegant","fancy","colorful","avid","active","gentle","happy","intelligent","jolly","kind","lively","merry","nice","optimistic","polite","quiet","relaxed","silly","victorious","witty","young","zealous","strong","brave","agile","bold"],n=["street","roof","floor","tv","idea","morning","game","wheel","shoe","bag","clock","pencil","pen","magnet","chair","table","house","dog","room","book","car","cat","tree","flower","bird","fish","sun","moon","star","cloud","rain","snow","wind","mountain","river","lake","sea","ocean","island","bridge","road","train","plane","ship","bicycle","horse","elephant","lion","tiger","bear","zebra","giraffe","monkey","snake","rabbit","duck","goose","penguin","frog","crab","shrimp","whale","octopus","spider","ant","bee","butterfly","dragonfly","ladybug","snail","camel","kangaroo","koala","panda","piglet","sheep","wolf","fox","deer","mouse","seal","chicken","cow","dinosaur","puppy","kitten","circle","square","garden","otter","bunny","meerkat","harp"];return t[Math.floor(Math.random()*t.length)]+e+n[Math.floor(Math.random()*n.length)]+e+Math.floor(1e4*Math.random())};getUser=function(...e){let t;return t="object"==typeof e[0]&&null!==e[0]?e[0]:{success:e[0],error:e[1]},new Promise((e,n)=>{const r=q("/whoami",this.APIOrigin,this.authToken,"get");U(r,t.success,t.error,e,n),r.send()})};print=function(...e){let t={};e.length>0&&"object"==typeof e[e.length-1]&&null!==e[e.length-1]&&("escapeHTML"in e[e.length-1]||"code"in e[e.length-1])&&(t=e.pop());for(let n of e)!0!==t.escapeHTML&&!0!==t.code||"string"!=typeof n||(n=n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")),!0===t.code&&(n=`
${n}
`),document.body.innerHTML+=n};configureAPILogging=function(e={}){return this.apiCallLogger&&this.apiCallLogger.updateConfig(e),this};enableAPILogging=function(e={}){return this.apiCallLogger&&this.apiCallLogger.updateConfig({...e,enabled:!0}),this};disableAPILogging=function(){return this.apiCallLogger&&this.apiCallLogger.disable(),this};initNetworkMonitoring=function(){if(void 0===globalThis.navigator||"function"!=typeof globalThis.addEventListener)return;let e=navigator.onLine;const t=()=>{const t=navigator.onLine;if(e&&!t){console.log("Network connection lost - purging cache");try{this._cache.flushall(),console.log("Cache purged successfully")}catch(e){console.error("Error purging cache:",e)}}e=t};globalThis.addEventListener("online",t),globalThis.addEventListener("offline",t),"undefined"!=typeof document&&document.addEventListener("visibilitychange",()=>{setTimeout(t,100)})};checkAndUpdateGUIFScache=function(){if("gui"!==In.env)return;if(!In.whoami)return;let e=In.whoami.username,t=`/${e}`,n=`/${e}/Desktop`,r=`/${e}/Documents`,s=`/${e}/Public`;In._cache.get(`item:${t}`)||(console.log(`/${e} item is not cached, refetching cache`),In.fs.stat(t)),In._cache.get(`item:${n}`)||(console.log(`/${e}/Desktop item is not cached, refetching cache`),In.fs.stat(n)),In._cache.get(`item:${r}`)||(console.log(`/${e}/Documents item is not cached, refetching cache`),In.fs.stat(r)),In._cache.get(`item:${s}`)||(console.log(`/${e}/Public item is not cached, refetching cache`),In.fs.stat(s)),In._cache.get(`readdir:${t}`)||(console.log(`/${e} is not cached, refetching cache`),In.fs.readdir(t)),In._cache.get(`readdir:${n}`)||(console.log(`/${e}/Desktop is not cached, refetching cache`),In.fs.readdir(n)),In._cache.get(`readdir:${r}`)||(console.log(`/${e}/Documents is not cached, refetching cache`),In.fs.readdir(r)),In._cache.get(`readdir:${s}`)||(console.log(`/${e}/Public is not cached, refetching cache`),In.fs.readdir(s))}};return e}();globalThis.puter=In,In.runWhenPuterHappensCallbacks(),In.tools=[];const Tn=In.ui.parentApp();globalThis.puterParent=Tn,Tn&&(console.log("I have a parent, registering tools"),Tn.on("message",async e=>{if(console.log("Got tool req ",e),"requestTools"===e.$&&(console.log("Responding with tools"),Tn.postMessage({$:"providedTools",tools:JSON.parse(JSON.stringify(In.tools))})),"executeTool"===e.$){console.log("xecuting tools");const[t]=In.tools.filter(t=>t.function.name===e.toolName),n=await t.exec(e.parameters);Tn.postMessage({$:"toolResponse",response:n,tag:e.tag})}}),Tn.postMessage({$:"ready"})),globalThis.addEventListener&&globalThis.addEventListener("message",async e=>{e.origin===In.defaultGUIOrigin&&(e.data.msg&&"requestOrigin"===e.data.msg?e.source.postMessage({msg:"originResponse"},"*"):"puter.token"===e.data.msg&&(In.setAuthToken(e.data.token),In.setAppID(e.data.app_uid),In.puterAuthState.authGranted=!0,In.onAuth&&"function"==typeof In.onAuth&&In.getUser().then(e=>{In.onAuth(e)}),In.puterAuthState.isPromptOpen=!1,In.puterAuthState.resolver&&(In.puterAuthState.authGranted?In.puterAuthState.resolver.resolve():In.puterAuthState.resolver.reject(),In.puterAuthState.resolver=null)))})})();