@oxlayer/cli 0.0.24 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,354 @@
1
+ var ze=Object.defineProperty;var Oo=Object.getOwnPropertyDescriptor;var Do=Object.getOwnPropertyNames;var To=Object.prototype.hasOwnProperty;var Z=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,r)=>(typeof require<"u"?require:n)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var ie=(e,n)=>()=>(e&&(n=e(e=0)),n);var ge=(e,n)=>{for(var r in n)ze(e,r,{get:n[r],enumerable:!0})},Lo=(e,n,r,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Do(n))!To.call(e,o)&&o!==r&&ze(e,o,{get:()=>n[o],enumerable:!(i=Oo(n,o))||i.enumerable});return e};var $o=e=>Lo(ze({},"__esModule",{value:!0}),e);import Ls from"path";import{fileURLToPath as Fs}from"url";var h=ie(()=>{"use strict"});var ye={};ge(ye,{buildVerificationUrl:()=>Yo,getAccessToken:()=>rn,getAuthInfo:()=>sn,getDeviceId:()=>Ze,getDeviceName:()=>me,getManifest:()=>tn,initiateDeviceAuth:()=>en,isAuthenticated:()=>qo,isTokenExpired:()=>he,loadConfig:()=>ne,migrateFromApiKey:()=>Ho,openBrowser:()=>an,pollForToken:()=>nn,refreshManifest:()=>Nn,removeConfig:()=>Uo,saveConfig:()=>Ie,validateToken:()=>on});import{promises as ee}from"fs";import{join as Qe}from"path";import{homedir as Fo}from"os";import{randomBytes as jo}from"crypto";async function Ze(){try{let e=await Ko(),n=await jn(),r=e.devices.find(i=>i.deviceName===n);return r?(r.lastSeenAt=new Date().toISOString(),await $n(e)):(r={deviceId:Ln(),deviceName:n,createdAt:new Date().toISOString(),lastSeenAt:new Date().toISOString()},e.devices.push(r),await $n(e)),r.deviceId}catch{return Ln()}}async function me(){return jn()}function Ln(){return`oxl_dev_${jo(16).toString("hex")}`}async function jn(){return(await import("os")).hostname()}async function Ko(){try{let e=await ee.readFile(Fn,"utf-8");return JSON.parse(e)}catch{return{devices:[]}}}async function $n(e){await ee.mkdir(_e,{recursive:!0}),await ee.writeFile(Fn,JSON.stringify(e,null,2))}async function en(e="development",n){let r=await Ze(),i=await me(),s=await fetch(`${n||Xe}/v1/cli/device/code`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({deviceId:r,deviceName:i,environment:e})});if(!s.ok){let t=await s.text();throw new Error(`Failed to initiate device auth: ${t}`)}return s.json()}async function nn(e,n,r={}){let i=r.interval||No,o=r.maxAttempts||Mo;for(let s=1;s<=o;s++){r.onProgress?.(s,o);let t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({deviceCode:n})});if(!t.ok)throw new Error(`Poll request failed: ${t.statusText}`);let a=await t.json();if(!a.pending){if(a.error)throw new Error(`Authorization failed: ${a.error}`);return{...a,success:!0}}await Bo(i*1e3)}throw new Error("Authorization timed out. Please try again.")}function Bo(e){return new Promise(n=>setTimeout(n,e))}async function Ie(e){await ee.mkdir(_e,{recursive:!0}),await ee.writeFile(We,JSON.stringify(e,null,2),{mode:384})}async function ne(){try{let e=await ee.readFile(We,"utf-8");return JSON.parse(e)}catch{return null}}async function Uo(){try{await ee.unlink(We)}catch{}}async function rn(){let e=process.env.OXLAYER_TOKEN;return e||((await ne())?.token??null)}function on(e){let r=e.startsWith("eyJ"),i=e.startsWith("oxl_cli_");return typeof e=="string"&&(r||i)&&e.length>=32}function he(e){return new Date(e.tokenInfo.expiresAt)<new Date}async function Nn(e,n){let r=n||e.apiEndpoint||Xe,i=await fetch(`${r}/v1/cli/manifest`,{headers:{"Content-Type":"application/json",Authorization:`Bearer ${e.token}`}});if(!i.ok)return{...e,updatedAt:new Date().toISOString()};let o=await i.json();return{...e,manifest:o,updatedAt:new Date().toISOString()}}async function tn(e){let n=await ne();if(!n)return null;if(n.manifest&&new Date(n.manifest.expiresAt)>new Date)return n.manifest;let r=await Nn(n,e);return await Ie(r),r.manifest||null}async function qo(){let e=await ne();return!(!e||he(e))}async function sn(){let e=await ne();return e?{authenticated:!he(e),deviceId:e.tokenInfo.deviceId,organizationId:e.organizationId,expiresAt:e.tokenInfo.expiresAt,scopes:e.tokenInfo.scopes}:{authenticated:!1}}function Yo(e,n){let r=new URL(e);return r.searchParams.set("device_code",n),r.toString()}async function an(e){let{exec:n}=await import("child_process"),r=process.platform,i;switch(r){case"darwin":i=`open "${e}"`;break;case"win32":i=`start "" "${e}"`;break;default:i=`xdg-open "${e}"`}return new Promise((o,s)=>{n(i,t=>{t?s(new Error(`Failed to open browser: ${t.message}`)):o()})})}async function Ho(e){let n=await Ze(),r=await me(),o=await fetch(`${Xe}/v1/cli/migrate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e,deviceId:n,deviceName:r})});if(!o.ok)throw new Error(`Migration failed: ${o.statusText}`);let s=await o.json();return{token:s.accessToken,tokenInfo:s.tokenInfo,organizationId:s.organizationId,environment:"development",vendorDir:".ox",updatedAt:new Date().toISOString()}}var _e,We,Fn,Xe,No,Mo,B=ie(()=>{"use strict";h();_e=Qe(Fo(),".oxlayer"),We=Qe(_e,"config.json"),Fn=Qe(_e,"devices.json"),Xe="http://localhost:3001",No=5,Mo=120});var ln={};ge(ln,{default:()=>Jo,getLatestVersion:()=>Un,healthCheck:()=>Te,requestPackageDownload:()=>De,resolveCapabilities:()=>Oe});function Vo(){return"http://localhost:3001"}async function Re(e,n={}){let r=process.env.OXLAYER_TOKEN||await rn();if(!r||!on(r))throw new Error("Invalid or missing access token. Please run: oxlayer login");let i=`${Vo()}${e}`,o=await fetch(i,{...n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`,...n.headers}});if(!o.ok){let s=await o.text();throw new Error(`API request failed (${o.status}): ${s}`)}return o.json()}async function Oe(e,n="development",r){return(await Re("/v1/capabilities/resolve",{method:"POST",body:JSON.stringify({projectId:r,environment:n,requested:e})})).data}async function De(e,n){return(await Re("/v1/packages/download",{method:"POST",body:JSON.stringify({packageType:e,version:n})})).data}async function Un(){return(await Re("/v1/latest-version")).data.version}async function Te(){try{return await Re("/v1/health"),!0}catch{return!1}}var Jo,Le=ie(()=>{"use strict";h();B();Jo={resolveCapabilities:Oe,requestPackageDownload:De,getLatestVersion:Un,healthCheck:Te}});var Wn={};ge(Wn,{addSdkDependencies:()=>Jn,default:()=>Qo,freezeWorkspaceVersions:()=>zn,getInstalledVersion:()=>ae,getVendorDir:()=>be,hasPackageJson:()=>Fe,isVersionInstalled:()=>Qn,readPackageJson:()=>se,writePackageJson:()=>$e});import{promises as xe}from"fs";import{join as ve}from"path";async function se(e=process.cwd()){let n=ve(e,"package.json");try{let r=await xe.readFile(n,"utf-8");return JSON.parse(r)}catch{throw new Error(`No package.json found in ${e}`)}}async function $e(e,n=process.cwd()){let r=ve(n,"package.json");await xe.writeFile(r,JSON.stringify(e,null,2)+`
2
+ `)}async function Jn(e,n={},r=process.cwd()){let i=await se(r);i.dependencies||(i.dependencies={}),i.devDependencies||(i.devDependencies={});for(let[o,s]of Object.entries(e.packages)){let t=n.saveDev?i.devDependencies:i.dependencies;(n.save||n.saveDev)&&(t[o]=e.version)}await $e(i,r)}async function zn(e=process.cwd()){let n=await se(e),r=i=>{if(i)for(let[o,s]of Object.entries(i));};r(n.dependencies),r(n.devDependencies),await $e(n,e)}async function Fe(e=process.cwd()){try{return await xe.access(ve(e,"package.json")),!0}catch{return!1}}function be(e,n=process.cwd()){return ve(n,".ox",e)}async function Qn(e,n=process.cwd()){let r=be(e,n);try{return await xe.access(r),!0}catch{return!1}}async function ae(e=process.cwd()){let n=ve(e,".ox");try{return(await xe.readdir(n)).sort().reverse()[0]||null}catch{return null}}var Qo,we=ie(()=>{"use strict";h();Qo={readPackageJson:se,writePackageJson:$e,addSdkDependencies:Jn,freezeWorkspaceVersions:zn,hasPackageJson:Fe,getVendorDir:be,isVersionInstalled:Qn,getInstalledVersion:ae}});var xo={};ge(xo,{CORE_SCHEMA:()=>ao,DEFAULT_SCHEMA:()=>lo,FAILSAFE_SCHEMA:()=>to,JSON_SCHEMA:()=>so,Schema:()=>io,Type:()=>oo,YAMLException:()=>fo,default:()=>cs,dump:()=>po,load:()=>co,loadAll:()=>uo,safeDump:()=>yo,safeLoad:()=>mo,safeLoadAll:()=>ho,types:()=>go});function mr(e){return typeof e>"u"||e===null}function ii(e){return typeof e=="object"&&e!==null}function ti(e){return Array.isArray(e)?e:mr(e)?[]:[e]}function si(e,n){var r,i,o,s;if(n)for(s=Object.keys(n),r=0,i=s.length;r<i;r+=1)o=s[r],e[o]=n[o];return e}function ai(e,n){var r="",i;for(i=0;i<n;i+=1)r+=e;return r}function li(e){return e===0&&Number.NEGATIVE_INFINITY===1/e}function hr(e,n){var r="",i=e.reason||"(unknown reason)";return e.mark?(e.mark.name&&(r+='in "'+e.mark.name+'" '),r+="("+(e.mark.line+1)+":"+(e.mark.column+1)+")",!n&&e.mark.snippet&&(r+=`
3
+
4
+ `+e.mark.snippet),i+" "+r):i}function Se(e,n){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=n,this.message=hr(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}function dn(e,n,r,i,o){var s="",t="",a=Math.floor(o/2)-1;return i-n>a&&(s=" ... ",n=i-a+s.length),r-i>a&&(t=" ...",r=i+a-t.length),{str:s+e.slice(n,r).replace(/\t/g,"\u2192")+t,pos:i-n+s.length}}function gn(e,n){return I.repeat(" ",n-e.length)+e}function mi(e,n){if(n=Object.create(n||null),!e.buffer)return null;n.maxLength||(n.maxLength=79),typeof n.indent!="number"&&(n.indent=1),typeof n.linesBefore!="number"&&(n.linesBefore=3),typeof n.linesAfter!="number"&&(n.linesAfter=2);for(var r=/\r?\n|\r|\0/g,i=[0],o=[],s,t=-1;s=r.exec(e.buffer);)o.push(s.index),i.push(s.index+s[0].length),e.position<=s.index&&t<0&&(t=i.length-2);t<0&&(t=i.length-1);var a="",l,c,u=Math.min(e.line+n.linesAfter,o.length).toString().length,p=n.maxLength-(n.indent+u+3);for(l=1;l<=n.linesBefore&&!(t-l<0);l++)c=dn(e.buffer,i[t-l],o[t-l],e.position-(i[t]-i[t-l]),p),a=I.repeat(" ",n.indent)+gn((e.line-l+1).toString(),u)+" | "+c.str+`
5
+ `+a;for(c=dn(e.buffer,i[t],o[t],e.position,p),a+=I.repeat(" ",n.indent)+gn((e.line+1).toString(),u)+" | "+c.str+`
6
+ `,a+=I.repeat("-",n.indent+u+3+c.pos)+`^
7
+ `,l=1;l<=n.linesAfter&&!(t+l>=o.length);l++)c=dn(e.buffer,i[t+l],o[t+l],e.position-(i[t]-i[t+l]),p),a+=I.repeat(" ",n.indent)+gn((e.line+l+1).toString(),u)+" | "+c.str+`
8
+ `;return a.replace(/\n$/,"")}function vi(e){var n={};return e!==null&&Object.keys(e).forEach(function(r){e[r].forEach(function(i){n[String(i)]=r})}),n}function bi(e,n){if(n=n||{},Object.keys(n).forEach(function(r){if(yi.indexOf(r)===-1)throw new D('Unknown option "'+r+'" is met in definition of "'+e+'" YAML type.')}),this.options=n,this.tag=e,this.kind=n.kind||null,this.resolve=n.resolve||function(){return!0},this.construct=n.construct||function(r){return r},this.instanceOf=n.instanceOf||null,this.predicate=n.predicate||null,this.represent=n.represent||null,this.representName=n.representName||null,this.defaultStyle=n.defaultStyle||null,this.multi=n.multi||!1,this.styleAliases=vi(n.styleAliases||null),xi.indexOf(this.kind)===-1)throw new D('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}function er(e,n){var r=[];return e[n].forEach(function(i){var o=r.length;r.forEach(function(s,t){s.tag===i.tag&&s.kind===i.kind&&s.multi===i.multi&&(o=t)}),r[o]=i}),r}function wi(){var e={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},n,r;function i(o){o.multi?(e.multi[o.kind].push(o),e.multi.fallback.push(o)):e[o.kind][o.tag]=e.fallback[o.tag]=o}for(n=0,r=arguments.length;n<r;n+=1)arguments[n].forEach(i);return e}function hn(e){return this.extend(e)}function ki(e){if(e===null)return!0;var n=e.length;return n===1&&e==="~"||n===4&&(e==="null"||e==="Null"||e==="NULL")}function Si(){return null}function Ci(e){return e===null}function Ai(e){if(e===null)return!1;var n=e.length;return n===4&&(e==="true"||e==="True"||e==="TRUE")||n===5&&(e==="false"||e==="False"||e==="FALSE")}function Ei(e){return e==="true"||e==="True"||e==="TRUE"}function Pi(e){return Object.prototype.toString.call(e)==="[object Boolean]"}function _i(e){return 48<=e&&e<=57||65<=e&&e<=70||97<=e&&e<=102}function Ii(e){return 48<=e&&e<=55}function Ri(e){return 48<=e&&e<=57}function Oi(e){if(e===null)return!1;var n=e.length,r=0,i=!1,o;if(!n)return!1;if(o=e[r],(o==="-"||o==="+")&&(o=e[++r]),o==="0"){if(r+1===n)return!0;if(o=e[++r],o==="b"){for(r++;r<n;r++)if(o=e[r],o!=="_"){if(o!=="0"&&o!=="1")return!1;i=!0}return i&&o!=="_"}if(o==="x"){for(r++;r<n;r++)if(o=e[r],o!=="_"){if(!_i(e.charCodeAt(r)))return!1;i=!0}return i&&o!=="_"}if(o==="o"){for(r++;r<n;r++)if(o=e[r],o!=="_"){if(!Ii(e.charCodeAt(r)))return!1;i=!0}return i&&o!=="_"}}if(o==="_")return!1;for(;r<n;r++)if(o=e[r],o!=="_"){if(!Ri(e.charCodeAt(r)))return!1;i=!0}return!(!i||o==="_")}function Di(e){var n=e,r=1,i;if(n.indexOf("_")!==-1&&(n=n.replace(/_/g,"")),i=n[0],(i==="-"||i==="+")&&(i==="-"&&(r=-1),n=n.slice(1),i=n[0]),n==="0")return 0;if(i==="0"){if(n[1]==="b")return r*parseInt(n.slice(2),2);if(n[1]==="x")return r*parseInt(n.slice(2),16);if(n[1]==="o")return r*parseInt(n.slice(2),8)}return r*parseInt(n,10)}function Ti(e){return Object.prototype.toString.call(e)==="[object Number]"&&e%1===0&&!I.isNegativeZero(e)}function $i(e){return!(e===null||!Li.test(e)||e[e.length-1]==="_")}function Fi(e){var n,r;return n=e.replace(/_/g,"").toLowerCase(),r=n[0]==="-"?-1:1,"+-".indexOf(n[0])>=0&&(n=n.slice(1)),n===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:n===".nan"?NaN:r*parseFloat(n,10)}function Ni(e,n){var r;if(isNaN(e))switch(n){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(n){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(n){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(I.isNegativeZero(e))return"-0.0";return r=e.toString(10),ji.test(r)?r.replace("e",".e"):r}function Mi(e){return Object.prototype.toString.call(e)==="[object Number]"&&(e%1!==0||I.isNegativeZero(e))}function Ki(e){return e===null?!1:_r.exec(e)!==null||Ir.exec(e)!==null}function Bi(e){var n,r,i,o,s,t,a,l=0,c=null,u,p,g;if(n=_r.exec(e),n===null&&(n=Ir.exec(e)),n===null)throw new Error("Date resolve error");if(r=+n[1],i=+n[2]-1,o=+n[3],!n[4])return new Date(Date.UTC(r,i,o));if(s=+n[4],t=+n[5],a=+n[6],n[7]){for(l=n[7].slice(0,3);l.length<3;)l+="0";l=+l}return n[9]&&(u=+n[10],p=+(n[11]||0),c=(u*60+p)*6e4,n[9]==="-"&&(c=-c)),g=new Date(Date.UTC(r,i,o,s,t,a,l)),c&&g.setTime(g.getTime()-c),g}function Ui(e){return e.toISOString()}function qi(e){return e==="<<"||e===null}function Yi(e){if(e===null)return!1;var n,r,i=0,o=e.length,s=wn;for(r=0;r<o;r++)if(n=s.indexOf(e.charAt(r)),!(n>64)){if(n<0)return!1;i+=6}return i%8===0}function Hi(e){var n,r,i=e.replace(/[\r\n=]/g,""),o=i.length,s=wn,t=0,a=[];for(n=0;n<o;n++)n%4===0&&n&&(a.push(t>>16&255),a.push(t>>8&255),a.push(t&255)),t=t<<6|s.indexOf(i.charAt(n));return r=o%4*6,r===0?(a.push(t>>16&255),a.push(t>>8&255),a.push(t&255)):r===18?(a.push(t>>10&255),a.push(t>>2&255)):r===12&&a.push(t>>4&255),new Uint8Array(a)}function Gi(e){var n="",r=0,i,o,s=e.length,t=wn;for(i=0;i<s;i++)i%3===0&&i&&(n+=t[r>>18&63],n+=t[r>>12&63],n+=t[r>>6&63],n+=t[r&63]),r=(r<<8)+e[i];return o=s%3,o===0?(n+=t[r>>18&63],n+=t[r>>12&63],n+=t[r>>6&63],n+=t[r&63]):o===2?(n+=t[r>>10&63],n+=t[r>>4&63],n+=t[r<<2&63],n+=t[64]):o===1&&(n+=t[r>>2&63],n+=t[r<<4&63],n+=t[64],n+=t[64]),n}function Vi(e){return Object.prototype.toString.call(e)==="[object Uint8Array]"}function Qi(e){if(e===null)return!0;var n=[],r,i,o,s,t,a=e;for(r=0,i=a.length;r<i;r+=1){if(o=a[r],t=!1,zi.call(o)!=="[object Object]")return!1;for(s in o)if(Ji.call(o,s))if(!t)t=!0;else return!1;if(!t)return!1;if(n.indexOf(s)===-1)n.push(s);else return!1}return!0}function Wi(e){return e!==null?e:[]}function Zi(e){if(e===null)return!0;var n,r,i,o,s,t=e;for(s=new Array(t.length),n=0,r=t.length;n<r;n+=1){if(i=t[n],Xi.call(i)!=="[object Object]"||(o=Object.keys(i),o.length!==1))return!1;s[n]=[o[0],i[o[0]]]}return!0}function et(e){if(e===null)return[];var n,r,i,o,s,t=e;for(s=new Array(t.length),n=0,r=t.length;n<r;n+=1)i=t[n],o=Object.keys(i),s[n]=[o[0],i[o[0]]];return s}function rt(e){if(e===null)return!0;var n,r=e;for(n in r)if(nt.call(r,n)&&r[n]!==null)return!1;return!0}function ot(e){return e!==null?e:{}}function rr(e){return Object.prototype.toString.call(e)}function q(e){return e===10||e===13}function oe(e){return e===9||e===32}function L(e){return e===9||e===32||e===10||e===13}function pe(e){return e===44||e===91||e===93||e===123||e===125}function lt(e){var n;return 48<=e&&e<=57?e-48:(n=e|32,97<=n&&n<=102?n-97+10:-1)}function ct(e){return e===120?2:e===117?4:e===85?8:0}function ut(e){return 48<=e&&e<=57?e-48:-1}function or(e){return e===48?"\0":e===97?"\x07":e===98?"\b":e===116||e===9?" ":e===110?`
9
+ `:e===118?"\v":e===102?"\f":e===114?"\r":e===101?"\x1B":e===32?" ":e===34?'"':e===47?"/":e===92?"\\":e===78?"\x85":e===95?"\xA0":e===76?"\u2028":e===80?"\u2029":""}function pt(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function Kr(e,n,r){n==="__proto__"?Object.defineProperty(e,n,{configurable:!0,enumerable:!0,writable:!0,value:r}):e[n]=r}function ft(e,n){this.input=e,this.filename=n.filename||null,this.schema=n.schema||kn,this.onWarning=n.onWarning||null,this.legacy=n.legacy||!1,this.json=n.json||!1,this.listener=n.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function qr(e,n){var r={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return r.snippet=hi(r),new D(n,r)}function m(e,n){throw qr(e,n)}function Ke(e,n){e.onWarning&&e.onWarning.call(null,qr(e,n))}function V(e,n,r,i){var o,s,t,a;if(n<r){if(a=e.input.slice(n,r),i)for(o=0,s=a.length;o<s;o+=1)t=a.charCodeAt(o),t===9||32<=t&&t<=1114111||m(e,"expected valid JSON character");else tt.test(a)&&m(e,"the stream contains non-printable characters");e.result+=a}}function tr(e,n,r,i){var o,s,t,a;for(I.isObject(r)||m(e,"cannot merge mappings; the provided source object is unacceptable"),o=Object.keys(r),t=0,a=o.length;t<a;t+=1)s=o[t],J.call(n,s)||(Kr(n,s,r[s]),i[s]=!0)}function fe(e,n,r,i,o,s,t,a,l){var c,u;if(Array.isArray(o))for(o=Array.prototype.slice.call(o),c=0,u=o.length;c<u;c+=1)Array.isArray(o[c])&&m(e,"nested arrays are not supported inside keys"),typeof o=="object"&&rr(o[c])==="[object Object]"&&(o[c]="[object Object]");if(typeof o=="object"&&rr(o)==="[object Object]"&&(o="[object Object]"),o=String(o),n===null&&(n={}),i==="tag:yaml.org,2002:merge")if(Array.isArray(s))for(c=0,u=s.length;c<u;c+=1)tr(e,n,s[c],r);else tr(e,n,s,r);else!e.json&&!J.call(r,o)&&J.call(n,o)&&(e.line=t||e.line,e.lineStart=a||e.lineStart,e.position=l||e.position,m(e,"duplicated mapping key")),Kr(n,o,s),delete r[o];return n}function Sn(e){var n;n=e.input.charCodeAt(e.position),n===10?e.position++:n===13?(e.position++,e.input.charCodeAt(e.position)===10&&e.position++):m(e,"a line break is expected"),e.line+=1,e.lineStart=e.position,e.firstTabInLine=-1}function _(e,n,r){for(var i=0,o=e.input.charCodeAt(e.position);o!==0;){for(;oe(o);)o===9&&e.firstTabInLine===-1&&(e.firstTabInLine=e.position),o=e.input.charCodeAt(++e.position);if(n&&o===35)do o=e.input.charCodeAt(++e.position);while(o!==10&&o!==13&&o!==0);if(q(o))for(Sn(e),o=e.input.charCodeAt(e.position),i++,e.lineIndent=0;o===32;)e.lineIndent++,o=e.input.charCodeAt(++e.position);else break}return r!==-1&&i!==0&&e.lineIndent<r&&Ke(e,"deficient indentation"),i}function qe(e){var n=e.position,r;return r=e.input.charCodeAt(n),!!((r===45||r===46)&&r===e.input.charCodeAt(n+1)&&r===e.input.charCodeAt(n+2)&&(n+=3,r=e.input.charCodeAt(n),r===0||L(r)))}function Cn(e,n){n===1?e.result+=" ":n>1&&(e.result+=I.repeat(`
10
+ `,n-1))}function dt(e,n,r){var i,o,s,t,a,l,c,u,p=e.kind,g=e.result,f;if(f=e.input.charCodeAt(e.position),L(f)||pe(f)||f===35||f===38||f===42||f===33||f===124||f===62||f===39||f===34||f===37||f===64||f===96||(f===63||f===45)&&(o=e.input.charCodeAt(e.position+1),L(o)||r&&pe(o)))return!1;for(e.kind="scalar",e.result="",s=t=e.position,a=!1;f!==0;){if(f===58){if(o=e.input.charCodeAt(e.position+1),L(o)||r&&pe(o))break}else if(f===35){if(i=e.input.charCodeAt(e.position-1),L(i))break}else{if(e.position===e.lineStart&&qe(e)||r&&pe(f))break;if(q(f))if(l=e.line,c=e.lineStart,u=e.lineIndent,_(e,!1,-1),e.lineIndent>=n){a=!0,f=e.input.charCodeAt(e.position);continue}else{e.position=t,e.line=l,e.lineStart=c,e.lineIndent=u;break}}a&&(V(e,s,t,!1),Cn(e,e.line-l),s=t=e.position,a=!1),oe(f)||(t=e.position+1),f=e.input.charCodeAt(++e.position)}return V(e,s,t,!1),e.result?!0:(e.kind=p,e.result=g,!1)}function gt(e,n){var r,i,o;if(r=e.input.charCodeAt(e.position),r!==39)return!1;for(e.kind="scalar",e.result="",e.position++,i=o=e.position;(r=e.input.charCodeAt(e.position))!==0;)if(r===39)if(V(e,i,e.position,!0),r=e.input.charCodeAt(++e.position),r===39)i=e.position,e.position++,o=e.position;else return!0;else q(r)?(V(e,i,o,!0),Cn(e,_(e,!1,n)),i=o=e.position):e.position===e.lineStart&&qe(e)?m(e,"unexpected end of the document within a single quoted scalar"):(e.position++,o=e.position);m(e,"unexpected end of the stream within a single quoted scalar")}function mt(e,n){var r,i,o,s,t,a;if(a=e.input.charCodeAt(e.position),a!==34)return!1;for(e.kind="scalar",e.result="",e.position++,r=i=e.position;(a=e.input.charCodeAt(e.position))!==0;){if(a===34)return V(e,r,e.position,!0),e.position++,!0;if(a===92){if(V(e,r,e.position,!0),a=e.input.charCodeAt(++e.position),q(a))_(e,!1,n);else if(a<256&&Br[a])e.result+=Ur[a],e.position++;else if((t=ct(a))>0){for(o=t,s=0;o>0;o--)a=e.input.charCodeAt(++e.position),(t=lt(a))>=0?s=(s<<4)+t:m(e,"expected hexadecimal character");e.result+=pt(s),e.position++}else m(e,"unknown escape sequence");r=i=e.position}else q(a)?(V(e,r,i,!0),Cn(e,_(e,!1,n)),r=i=e.position):e.position===e.lineStart&&qe(e)?m(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}m(e,"unexpected end of the stream within a double quoted scalar")}function ht(e,n){var r=!0,i,o,s,t=e.tag,a,l=e.anchor,c,u,p,g,f,x=Object.create(null),y,b,T,v;if(v=e.input.charCodeAt(e.position),v===91)u=93,f=!1,a=[];else if(v===123)u=125,f=!0,a={};else return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=a),v=e.input.charCodeAt(++e.position);v!==0;){if(_(e,!0,n),v=e.input.charCodeAt(e.position),v===u)return e.position++,e.tag=t,e.anchor=l,e.kind=f?"mapping":"sequence",e.result=a,!0;r?v===44&&m(e,"expected the node content, but found ','"):m(e,"missed comma between flow collection entries"),b=y=T=null,p=g=!1,v===63&&(c=e.input.charCodeAt(e.position+1),L(c)&&(p=g=!0,e.position++,_(e,!0,n))),i=e.line,o=e.lineStart,s=e.position,de(e,n,Ne,!1,!0),b=e.tag,y=e.result,_(e,!0,n),v=e.input.charCodeAt(e.position),(g||e.line===i)&&v===58&&(p=!0,v=e.input.charCodeAt(++e.position),_(e,!0,n),de(e,n,Ne,!1,!0),T=e.result),f?fe(e,a,x,b,y,T,i,o,s):p?a.push(fe(e,null,x,b,y,T,i,o,s)):a.push(y),_(e,!0,n),v=e.input.charCodeAt(e.position),v===44?(r=!0,v=e.input.charCodeAt(++e.position)):r=!1}m(e,"unexpected end of the stream within a flow collection")}function yt(e,n){var r,i,o=mn,s=!1,t=!1,a=n,l=0,c=!1,u,p;if(p=e.input.charCodeAt(e.position),p===124)i=!1;else if(p===62)i=!0;else return!1;for(e.kind="scalar",e.result="";p!==0;)if(p=e.input.charCodeAt(++e.position),p===43||p===45)mn===o?o=p===43?nr:it:m(e,"repeat of a chomping mode identifier");else if((u=ut(p))>=0)u===0?m(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):t?m(e,"repeat of an indentation width identifier"):(a=n+u-1,t=!0);else break;if(oe(p)){do p=e.input.charCodeAt(++e.position);while(oe(p));if(p===35)do p=e.input.charCodeAt(++e.position);while(!q(p)&&p!==0)}for(;p!==0;){for(Sn(e),e.lineIndent=0,p=e.input.charCodeAt(e.position);(!t||e.lineIndent<a)&&p===32;)e.lineIndent++,p=e.input.charCodeAt(++e.position);if(!t&&e.lineIndent>a&&(a=e.lineIndent),q(p)){l++;continue}if(e.lineIndent<a){o===nr?e.result+=I.repeat(`
11
+ `,s?1+l:l):o===mn&&s&&(e.result+=`
12
+ `);break}for(i?oe(p)?(c=!0,e.result+=I.repeat(`
13
+ `,s?1+l:l)):c?(c=!1,e.result+=I.repeat(`
14
+ `,l+1)):l===0?s&&(e.result+=" "):e.result+=I.repeat(`
15
+ `,l):e.result+=I.repeat(`
16
+ `,s?1+l:l),s=!0,t=!0,l=0,r=e.position;!q(p)&&p!==0;)p=e.input.charCodeAt(++e.position);V(e,r,e.position,!1)}return!0}function sr(e,n){var r,i=e.tag,o=e.anchor,s=[],t,a=!1,l;if(e.firstTabInLine!==-1)return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=s),l=e.input.charCodeAt(e.position);l!==0&&(e.firstTabInLine!==-1&&(e.position=e.firstTabInLine,m(e,"tab characters must not be used in indentation")),!(l!==45||(t=e.input.charCodeAt(e.position+1),!L(t))));){if(a=!0,e.position++,_(e,!0,-1)&&e.lineIndent<=n){s.push(null),l=e.input.charCodeAt(e.position);continue}if(r=e.line,de(e,n,jr,!1,!0),s.push(e.result),_(e,!0,-1),l=e.input.charCodeAt(e.position),(e.line===r||e.lineIndent>n)&&l!==0)m(e,"bad indentation of a sequence entry");else if(e.lineIndent<n)break}return a?(e.tag=i,e.anchor=o,e.kind="sequence",e.result=s,!0):!1}function xt(e,n,r){var i,o,s,t,a,l,c=e.tag,u=e.anchor,p={},g=Object.create(null),f=null,x=null,y=null,b=!1,T=!1,v;if(e.firstTabInLine!==-1)return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=p),v=e.input.charCodeAt(e.position);v!==0;){if(!b&&e.firstTabInLine!==-1&&(e.position=e.firstTabInLine,m(e,"tab characters must not be used in indentation")),i=e.input.charCodeAt(e.position+1),s=e.line,(v===63||v===58)&&L(i))v===63?(b&&(fe(e,p,g,f,x,null,t,a,l),f=x=y=null),T=!0,b=!0,o=!0):b?(b=!1,o=!0):m(e,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),e.position+=1,v=i;else{if(t=e.line,a=e.lineStart,l=e.position,!de(e,r,Fr,!1,!0))break;if(e.line===s){for(v=e.input.charCodeAt(e.position);oe(v);)v=e.input.charCodeAt(++e.position);if(v===58)v=e.input.charCodeAt(++e.position),L(v)||m(e,"a whitespace character is expected after the key-value separator within a block mapping"),b&&(fe(e,p,g,f,x,null,t,a,l),f=x=y=null),T=!0,b=!1,o=!1,f=e.tag,x=e.result;else if(T)m(e,"can not read an implicit mapping pair; a colon is missed");else return e.tag=c,e.anchor=u,!0}else if(T)m(e,"can not read a block mapping entry; a multiline key may not be an implicit key");else return e.tag=c,e.anchor=u,!0}if((e.line===s||e.lineIndent>n)&&(b&&(t=e.line,a=e.lineStart,l=e.position),de(e,n,Me,!0,o)&&(b?x=e.result:y=e.result),b||(fe(e,p,g,f,x,y,t,a,l),f=x=y=null),_(e,!0,-1),v=e.input.charCodeAt(e.position)),(e.line===s||e.lineIndent>n)&&v!==0)m(e,"bad indentation of a mapping entry");else if(e.lineIndent<n)break}return b&&fe(e,p,g,f,x,null,t,a,l),T&&(e.tag=c,e.anchor=u,e.kind="mapping",e.result=p),T}function vt(e){var n,r=!1,i=!1,o,s,t;if(t=e.input.charCodeAt(e.position),t!==33)return!1;if(e.tag!==null&&m(e,"duplication of a tag property"),t=e.input.charCodeAt(++e.position),t===60?(r=!0,t=e.input.charCodeAt(++e.position)):t===33?(i=!0,o="!!",t=e.input.charCodeAt(++e.position)):o="!",n=e.position,r){do t=e.input.charCodeAt(++e.position);while(t!==0&&t!==62);e.position<e.length?(s=e.input.slice(n,e.position),t=e.input.charCodeAt(++e.position)):m(e,"unexpected end of the stream within a verbatim tag")}else{for(;t!==0&&!L(t);)t===33&&(i?m(e,"tag suffix cannot contain exclamation marks"):(o=e.input.slice(n-1,e.position+1),Nr.test(o)||m(e,"named tag handle cannot contain such characters"),i=!0,n=e.position+1)),t=e.input.charCodeAt(++e.position);s=e.input.slice(n,e.position),at.test(s)&&m(e,"tag suffix cannot contain flow indicator characters")}s&&!Mr.test(s)&&m(e,"tag name cannot contain such characters: "+s);try{s=decodeURIComponent(s)}catch{m(e,"tag name is malformed: "+s)}return r?e.tag=s:J.call(e.tagMap,o)?e.tag=e.tagMap[o]+s:o==="!"?e.tag="!"+s:o==="!!"?e.tag="tag:yaml.org,2002:"+s:m(e,'undeclared tag handle "'+o+'"'),!0}function bt(e){var n,r;if(r=e.input.charCodeAt(e.position),r!==38)return!1;for(e.anchor!==null&&m(e,"duplication of an anchor property"),r=e.input.charCodeAt(++e.position),n=e.position;r!==0&&!L(r)&&!pe(r);)r=e.input.charCodeAt(++e.position);return e.position===n&&m(e,"name of an anchor node must contain at least one character"),e.anchor=e.input.slice(n,e.position),!0}function wt(e){var n,r,i;if(i=e.input.charCodeAt(e.position),i!==42)return!1;for(i=e.input.charCodeAt(++e.position),n=e.position;i!==0&&!L(i)&&!pe(i);)i=e.input.charCodeAt(++e.position);return e.position===n&&m(e,"name of an alias node must contain at least one character"),r=e.input.slice(n,e.position),J.call(e.anchorMap,r)||m(e,'unidentified alias "'+r+'"'),e.result=e.anchorMap[r],_(e,!0,-1),!0}function de(e,n,r,i,o){var s,t,a,l=1,c=!1,u=!1,p,g,f,x,y,b;if(e.listener!==null&&e.listener("open",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,s=t=a=Me===r||jr===r,i&&_(e,!0,-1)&&(c=!0,e.lineIndent>n?l=1:e.lineIndent===n?l=0:e.lineIndent<n&&(l=-1)),l===1)for(;vt(e)||bt(e);)_(e,!0,-1)?(c=!0,a=s,e.lineIndent>n?l=1:e.lineIndent===n?l=0:e.lineIndent<n&&(l=-1)):a=!1;if(a&&(a=c||o),(l===1||Me===r)&&(Ne===r||Fr===r?y=n:y=n+1,b=e.position-e.lineStart,l===1?a&&(sr(e,b)||xt(e,b,y))||ht(e,y)?u=!0:(t&&yt(e,y)||gt(e,y)||mt(e,y)?u=!0:wt(e)?(u=!0,(e.tag!==null||e.anchor!==null)&&m(e,"alias node should not have any properties")):dt(e,y,Ne===r)&&(u=!0,e.tag===null&&(e.tag="?")),e.anchor!==null&&(e.anchorMap[e.anchor]=e.result)):l===0&&(u=a&&sr(e,b))),e.tag===null)e.anchor!==null&&(e.anchorMap[e.anchor]=e.result);else if(e.tag==="?"){for(e.result!==null&&e.kind!=="scalar"&&m(e,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+e.kind+'"'),p=0,g=e.implicitTypes.length;p<g;p+=1)if(x=e.implicitTypes[p],x.resolve(e.result)){e.result=x.construct(e.result),e.tag=x.tag,e.anchor!==null&&(e.anchorMap[e.anchor]=e.result);break}}else if(e.tag!=="!"){if(J.call(e.typeMap[e.kind||"fallback"],e.tag))x=e.typeMap[e.kind||"fallback"][e.tag];else for(x=null,f=e.typeMap.multi[e.kind||"fallback"],p=0,g=f.length;p<g;p+=1)if(e.tag.slice(0,f[p].tag.length)===f[p].tag){x=f[p];break}x||m(e,"unknown tag !<"+e.tag+">"),e.result!==null&&x.kind!==e.kind&&m(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+x.kind+'", not "'+e.kind+'"'),x.resolve(e.result,e.tag)?(e.result=x.construct(e.result,e.tag),e.anchor!==null&&(e.anchorMap[e.anchor]=e.result)):m(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return e.listener!==null&&e.listener("close",e),e.tag!==null||e.anchor!==null||u}function kt(e){var n=e.position,r,i,o,s=!1,t;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);(t=e.input.charCodeAt(e.position))!==0&&(_(e,!0,-1),t=e.input.charCodeAt(e.position),!(e.lineIndent>0||t!==37));){for(s=!0,t=e.input.charCodeAt(++e.position),r=e.position;t!==0&&!L(t);)t=e.input.charCodeAt(++e.position);for(i=e.input.slice(r,e.position),o=[],i.length<1&&m(e,"directive name must not be less than one character in length");t!==0;){for(;oe(t);)t=e.input.charCodeAt(++e.position);if(t===35){do t=e.input.charCodeAt(++e.position);while(t!==0&&!q(t));break}if(q(t))break;for(r=e.position;t!==0&&!L(t);)t=e.input.charCodeAt(++e.position);o.push(e.input.slice(r,e.position))}t!==0&&Sn(e),J.call(ir,i)?ir[i](e,i,o):Ke(e,'unknown document directive "'+i+'"')}if(_(e,!0,-1),e.lineIndent===0&&e.input.charCodeAt(e.position)===45&&e.input.charCodeAt(e.position+1)===45&&e.input.charCodeAt(e.position+2)===45?(e.position+=3,_(e,!0,-1)):s&&m(e,"directives end mark is expected"),de(e,e.lineIndent-1,Me,!1,!0),_(e,!0,-1),e.checkLineBreaks&&st.test(e.input.slice(n,e.position))&&Ke(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&qe(e)){e.input.charCodeAt(e.position)===46&&(e.position+=3,_(e,!0,-1));return}if(e.position<e.length-1)m(e,"end of the stream or a document separator is expected");else return}function Yr(e,n){e=String(e),n=n||{},e.length!==0&&(e.charCodeAt(e.length-1)!==10&&e.charCodeAt(e.length-1)!==13&&(e+=`
17
+ `),e.charCodeAt(0)===65279&&(e=e.slice(1)));var r=new ft(e,n),i=e.indexOf("\0");for(i!==-1&&(r.position=i,m(r,"null byte is not allowed in input")),r.input+="\0";r.input.charCodeAt(r.position)===32;)r.lineIndent+=1,r.position+=1;for(;r.position<r.length-1;)kt(r);return r.documents}function St(e,n,r){n!==null&&typeof n=="object"&&typeof r>"u"&&(r=n,n=null);var i=Yr(e,r);if(typeof n!="function")return i;for(var o=0,s=i.length;o<s;o+=1)n(i[o])}function Ct(e,n){var r=Yr(e,n);if(r.length!==0){if(r.length===1)return r[0];throw new D("expected a single document in the stream, but found more")}}function Ht(e,n){var r,i,o,s,t,a,l;if(n===null)return{};for(r={},i=Object.keys(n),o=0,s=i.length;o<s;o+=1)t=i[o],a=String(n[t]),t.slice(0,2)==="!!"&&(t="tag:yaml.org,2002:"+t.slice(2)),l=e.compiledTypeMap.fallback[t],l&&Vr.call(l.styleAliases,a)&&(a=l.styleAliases[a]),r[t]=a;return r}function Gt(e){var n,r,i;if(n=e.toString(16).toUpperCase(),e<=255)r="x",i=2;else if(e<=65535)r="u",i=4;else if(e<=4294967295)r="U",i=8;else throw new D("code point within a string may not be greater than 0xFFFFFFFF");return"\\"+r+I.repeat("0",i-n.length)+n}function Jt(e){this.schema=e.schema||kn,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=I.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=Ht(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.quotingType=e.quotingType==='"'?Ae:Vt,this.forceQuotes=e.forceQuotes||!1,this.replacer=typeof e.replacer=="function"?e.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function ar(e,n){for(var r=I.repeat(" ",n),i=0,o=-1,s="",t,a=e.length;i<a;)o=e.indexOf(`
18
+ `,i),o===-1?(t=e.slice(i),i=a):(t=e.slice(i,o+1),i=o+1),t.length&&t!==`
19
+ `&&(s+=r),s+=t;return s}function xn(e,n){return`
20
+ `+I.repeat(" ",e.indent*n)}function zt(e,n){var r,i,o;for(r=0,i=e.implicitTypes.length;r<i;r+=1)if(o=e.implicitTypes[r],o.resolve(n))return!0;return!1}function Ue(e){return e===It||e===Pt}function Ee(e){return 32<=e&&e<=126||161<=e&&e<=55295&&e!==8232&&e!==8233||57344<=e&&e<=65533&&e!==An||65536<=e&&e<=1114111}function lr(e){return Ee(e)&&e!==An&&e!==_t&&e!==Ce}function cr(e,n,r){var i=lr(e),o=i&&!Ue(e);return(r?i:i&&e!==Jr&&e!==zr&&e!==Qr&&e!==Wr&&e!==Xr)&&e!==yn&&!(n===Be&&!o)||lr(n)&&!Ue(n)&&e===yn||n===Be&&o}function Qt(e){return Ee(e)&&e!==An&&!Ue(e)&&e!==Ft&&e!==Mt&&e!==Be&&e!==Jr&&e!==zr&&e!==Qr&&e!==Wr&&e!==Xr&&e!==yn&&e!==Tt&&e!==$t&&e!==Rt&&e!==Ut&&e!==jt&&e!==Nt&&e!==Lt&&e!==Ot&&e!==Dt&&e!==Kt&&e!==Bt}function Wt(e){return!Ue(e)&&e!==Be}function ke(e,n){var r=e.charCodeAt(n),i;return r>=55296&&r<=56319&&n+1<e.length&&(i=e.charCodeAt(n+1),i>=56320&&i<=57343)?(r-55296)*1024+i-56320+65536:r}function Zr(e){var n=/^\n* /;return n.test(e)}function Xt(e,n,r,i,o,s,t,a){var l,c=0,u=null,p=!1,g=!1,f=i!==-1,x=-1,y=Qt(ke(e,0))&&Wt(ke(e,e.length-1));if(n||t)for(l=0;l<e.length;c>=65536?l+=2:l++){if(c=ke(e,l),!Ee(c))return ue;y=y&&cr(c,u,a),u=c}else{for(l=0;l<e.length;c>=65536?l+=2:l++){if(c=ke(e,l),c===Ce)p=!0,f&&(g=g||l-x-1>i&&e[x+1]!==" ",x=l);else if(!Ee(c))return ue;y=y&&cr(c,u,a),u=c}g=g||f&&l-x-1>i&&e[x+1]!==" "}return!p&&!g?y&&!t&&!o(e)?eo:s===Ae?ue:vn:r>9&&Zr(e)?ue:t?s===Ae?ue:vn:g?ro:no}function Zt(e,n,r,i,o){e.dump=(function(){if(n.length===0)return e.quotingType===Ae?'""':"''";if(!e.noCompatMode&&(qt.indexOf(n)!==-1||Yt.test(n)))return e.quotingType===Ae?'"'+n+'"':"'"+n+"'";var s=e.indent*Math.max(1,r),t=e.lineWidth===-1?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-s),a=i||e.flowLevel>-1&&r>=e.flowLevel;function l(c){return zt(e,c)}switch(Xt(n,a,e.indent,t,l,e.quotingType,e.forceQuotes&&!i,o)){case eo:return n;case vn:return"'"+n.replace(/'/g,"''")+"'";case no:return"|"+ur(n,e.indent)+pr(ar(n,s));case ro:return">"+ur(n,e.indent)+pr(ar(es(n,t),s));case ue:return'"'+ns(n)+'"';default:throw new D("impossible error: invalid scalar style")}})()}function ur(e,n){var r=Zr(e)?String(n):"",i=e[e.length-1]===`
21
+ `,o=i&&(e[e.length-2]===`
22
+ `||e===`
23
+ `),s=o?"+":i?"":"-";return r+s+`
24
+ `}function pr(e){return e[e.length-1]===`
25
+ `?e.slice(0,-1):e}function es(e,n){for(var r=/(\n+)([^\n]*)/g,i=(function(){var c=e.indexOf(`
26
+ `);return c=c!==-1?c:e.length,r.lastIndex=c,fr(e.slice(0,c),n)})(),o=e[0]===`
27
+ `||e[0]===" ",s,t;t=r.exec(e);){var a=t[1],l=t[2];s=l[0]===" ",i+=a+(!o&&!s&&l!==""?`
28
+ `:"")+fr(l,n),o=s}return i}function fr(e,n){if(e===""||e[0]===" ")return e;for(var r=/ [^ ]/g,i,o=0,s,t=0,a=0,l="";i=r.exec(e);)a=i.index,a-o>n&&(s=t>o?t:a,l+=`
29
+ `+e.slice(o,s),o=s+1),t=a;return l+=`
30
+ `,e.length-o>n&&t>o?l+=e.slice(o,t)+`
31
+ `+e.slice(t+1):l+=e.slice(o),l.slice(1)}function ns(e){for(var n="",r=0,i,o=0;o<e.length;r>=65536?o+=2:o++)r=ke(e,o),i=O[r],!i&&Ee(r)?(n+=e[o],r>=65536&&(n+=e[o+1])):n+=i||Gt(r);return n}function rs(e,n,r){var i="",o=e.tag,s,t,a;for(s=0,t=r.length;s<t;s+=1)a=r[s],e.replacer&&(a=e.replacer.call(r,String(s),a)),(H(e,n,a,!1,!1)||typeof a>"u"&&H(e,n,null,!1,!1))&&(i!==""&&(i+=","+(e.condenseFlow?"":" ")),i+=e.dump);e.tag=o,e.dump="["+i+"]"}function dr(e,n,r,i){var o="",s=e.tag,t,a,l;for(t=0,a=r.length;t<a;t+=1)l=r[t],e.replacer&&(l=e.replacer.call(r,String(t),l)),(H(e,n+1,l,!0,!0,!1,!0)||typeof l>"u"&&H(e,n+1,null,!0,!0,!1,!0))&&((!i||o!=="")&&(o+=xn(e,n)),e.dump&&Ce===e.dump.charCodeAt(0)?o+="-":o+="- ",o+=e.dump);e.tag=s,e.dump=o||"[]"}function os(e,n,r){var i="",o=e.tag,s=Object.keys(r),t,a,l,c,u;for(t=0,a=s.length;t<a;t+=1)u="",i!==""&&(u+=", "),e.condenseFlow&&(u+='"'),l=s[t],c=r[l],e.replacer&&(c=e.replacer.call(r,l,c)),H(e,n,l,!1,!1)&&(e.dump.length>1024&&(u+="? "),u+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),H(e,n,c,!1,!1)&&(u+=e.dump,i+=u));e.tag=o,e.dump="{"+i+"}"}function is(e,n,r,i){var o="",s=e.tag,t=Object.keys(r),a,l,c,u,p,g;if(e.sortKeys===!0)t.sort();else if(typeof e.sortKeys=="function")t.sort(e.sortKeys);else if(e.sortKeys)throw new D("sortKeys must be a boolean or a function");for(a=0,l=t.length;a<l;a+=1)g="",(!i||o!=="")&&(g+=xn(e,n)),c=t[a],u=r[c],e.replacer&&(u=e.replacer.call(r,c,u)),H(e,n+1,c,!0,!0,!0)&&(p=e.tag!==null&&e.tag!=="?"||e.dump&&e.dump.length>1024,p&&(e.dump&&Ce===e.dump.charCodeAt(0)?g+="?":g+="? "),g+=e.dump,p&&(g+=xn(e,n)),H(e,n+1,u,!0,p)&&(e.dump&&Ce===e.dump.charCodeAt(0)?g+=":":g+=": ",g+=e.dump,o+=g));e.tag=s,e.dump=o||"{}"}function gr(e,n,r){var i,o,s,t,a,l;for(o=r?e.explicitTypes:e.implicitTypes,s=0,t=o.length;s<t;s+=1)if(a=o[s],(a.instanceOf||a.predicate)&&(!a.instanceOf||typeof n=="object"&&n instanceof a.instanceOf)&&(!a.predicate||a.predicate(n))){if(r?a.multi&&a.representName?e.tag=a.representName(n):e.tag=a.tag:e.tag="?",a.represent){if(l=e.styleMap[a.tag]||a.defaultStyle,Gr.call(a.represent)==="[object Function]")i=a.represent(n,l);else if(Vr.call(a.represent,l))i=a.represent[l](n,l);else throw new D("!<"+a.tag+'> tag resolver accepts not "'+l+'" style');e.dump=i}return!0}return!1}function H(e,n,r,i,o,s,t){e.tag=null,e.dump=r,gr(e,r,!1)||gr(e,r,!0);var a=Gr.call(e.dump),l=i,c;i&&(i=e.flowLevel<0||e.flowLevel>n);var u=a==="[object Object]"||a==="[object Array]",p,g;if(u&&(p=e.duplicates.indexOf(r),g=p!==-1),(e.tag!==null&&e.tag!=="?"||g||e.indent!==2&&n>0)&&(o=!1),g&&e.usedDuplicates[p])e.dump="*ref_"+p;else{if(u&&g&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),a==="[object Object]")i&&Object.keys(e.dump).length!==0?(is(e,n,e.dump,o),g&&(e.dump="&ref_"+p+e.dump)):(os(e,n,e.dump),g&&(e.dump="&ref_"+p+" "+e.dump));else if(a==="[object Array]")i&&e.dump.length!==0?(e.noArrayIndent&&!t&&n>0?dr(e,n-1,e.dump,o):dr(e,n,e.dump,o),g&&(e.dump="&ref_"+p+e.dump)):(rs(e,n,e.dump),g&&(e.dump="&ref_"+p+" "+e.dump));else if(a==="[object String]")e.tag!=="?"&&Zt(e,e.dump,n,s,l);else{if(a==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new D("unacceptable kind of an object to dump "+a)}e.tag!==null&&e.tag!=="?"&&(c=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?c="!"+c:c.slice(0,18)==="tag:yaml.org,2002:"?c="!!"+c.slice(18):c="!<"+c+">",e.dump=c+" "+e.dump)}return!0}function ts(e,n){var r=[],i=[],o,s;for(bn(e,r,i),o=0,s=i.length;o<s;o+=1)n.duplicates.push(r[i[o]]);n.usedDuplicates=new Array(s)}function bn(e,n,r){var i,o,s;if(e!==null&&typeof e=="object")if(o=n.indexOf(e),o!==-1)r.indexOf(o)===-1&&r.push(o);else if(n.push(e),Array.isArray(e))for(o=0,s=e.length;o<s;o+=1)bn(e[o],n,r);else for(i=Object.keys(e),o=0,s=i.length;o<s;o+=1)bn(e[i[o]],n,r)}function ss(e,n){n=n||{};var r=new Jt(n);r.noRefs||ts(e,r);var i=e;return r.replacer&&(i=r.replacer.call({"":i},"",i)),H(r,0,i,!0,!0)?r.dump+`
32
+ `:""}function En(e,n){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+n+" instead, which is now safe by default.")}}var ci,ui,pi,fi,di,gi,I,D,hi,yi,xi,R,yr,xr,vr,br,wr,kr,Sr,Cr,Li,ji,Ar,Er,Pr,_r,Ir,Rr,Or,wn,Dr,Ji,zi,Tr,Xi,Lr,nt,$r,kn,J,Ne,Fr,jr,Me,mn,it,nr,tt,st,at,Nr,Mr,Br,Ur,re,ir,At,Et,Hr,Gr,Vr,An,Pt,Ce,_t,It,Rt,Ot,yn,Dt,Tt,Lt,$t,Jr,Ft,Be,jt,Nt,Mt,Kt,zr,Qr,Bt,Wr,Ut,Xr,O,qt,Yt,Vt,Ae,eo,vn,no,ro,ue,as,ls,oo,io,to,so,ao,lo,co,uo,po,fo,go,mo,ho,yo,cs,vo=ie(()=>{"use strict";h();ci=mr,ui=ii,pi=ti,fi=ai,di=li,gi=si,I={isNothing:ci,isObject:ui,toArray:pi,repeat:fi,isNegativeZero:di,extend:gi};Se.prototype=Object.create(Error.prototype);Se.prototype.constructor=Se;Se.prototype.toString=function(n){return this.name+": "+hr(this,n)};D=Se;hi=mi,yi=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],xi=["scalar","sequence","mapping"];R=bi;hn.prototype.extend=function(n){var r=[],i=[];if(n instanceof R)i.push(n);else if(Array.isArray(n))i=i.concat(n);else if(n&&(Array.isArray(n.implicit)||Array.isArray(n.explicit)))n.implicit&&(r=r.concat(n.implicit)),n.explicit&&(i=i.concat(n.explicit));else throw new D("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(s){if(!(s instanceof R))throw new D("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(s.loadKind&&s.loadKind!=="scalar")throw new D("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(s.multi)throw new D("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),i.forEach(function(s){if(!(s instanceof R))throw new D("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var o=Object.create(hn.prototype);return o.implicit=(this.implicit||[]).concat(r),o.explicit=(this.explicit||[]).concat(i),o.compiledImplicit=er(o,"implicit"),o.compiledExplicit=er(o,"explicit"),o.compiledTypeMap=wi(o.compiledImplicit,o.compiledExplicit),o};yr=hn,xr=new R("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return e!==null?e:""}}),vr=new R("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return e!==null?e:[]}}),br=new R("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return e!==null?e:{}}}),wr=new yr({explicit:[xr,vr,br]});kr=new R("tag:yaml.org,2002:null",{kind:"scalar",resolve:ki,construct:Si,predicate:Ci,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});Sr=new R("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Ai,construct:Ei,predicate:Pi,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"});Cr=new R("tag:yaml.org,2002:int",{kind:"scalar",resolve:Oi,construct:Di,predicate:Ti,represent:{binary:function(e){return e>=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),Li=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");ji=/^[-+]?[0-9]+e/;Ar=new R("tag:yaml.org,2002:float",{kind:"scalar",resolve:$i,construct:Fi,predicate:Mi,represent:Ni,defaultStyle:"lowercase"}),Er=wr.extend({implicit:[kr,Sr,Cr,Ar]}),Pr=Er,_r=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Ir=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");Rr=new R("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:Ki,construct:Bi,instanceOf:Date,represent:Ui});Or=new R("tag:yaml.org,2002:merge",{kind:"scalar",resolve:qi}),wn=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
33
+ \r`;Dr=new R("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Yi,construct:Hi,predicate:Vi,represent:Gi}),Ji=Object.prototype.hasOwnProperty,zi=Object.prototype.toString;Tr=new R("tag:yaml.org,2002:omap",{kind:"sequence",resolve:Qi,construct:Wi}),Xi=Object.prototype.toString;Lr=new R("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:Zi,construct:et}),nt=Object.prototype.hasOwnProperty;$r=new R("tag:yaml.org,2002:set",{kind:"mapping",resolve:rt,construct:ot}),kn=Pr.extend({implicit:[Rr,Or],explicit:[Dr,Tr,Lr,$r]}),J=Object.prototype.hasOwnProperty,Ne=1,Fr=2,jr=3,Me=4,mn=1,it=2,nr=3,tt=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,st=/[\x85\u2028\u2029]/,at=/[,\[\]\{\}]/,Nr=/^(?:!|!!|![a-z\-]+!)$/i,Mr=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;Br=new Array(256),Ur=new Array(256);for(re=0;re<256;re++)Br[re]=or(re)?1:0,Ur[re]=or(re);ir={YAML:function(n,r,i){var o,s,t;n.version!==null&&m(n,"duplication of %YAML directive"),i.length!==1&&m(n,"YAML directive accepts exactly one argument"),o=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),o===null&&m(n,"ill-formed argument of the YAML directive"),s=parseInt(o[1],10),t=parseInt(o[2],10),s!==1&&m(n,"unacceptable YAML version of the document"),n.version=i[0],n.checkLineBreaks=t<2,t!==1&&t!==2&&Ke(n,"unsupported YAML version of the document")},TAG:function(n,r,i){var o,s;i.length!==2&&m(n,"TAG directive accepts exactly two arguments"),o=i[0],s=i[1],Nr.test(o)||m(n,"ill-formed tag handle (first argument) of the TAG directive"),J.call(n.tagMap,o)&&m(n,'there is a previously declared suffix for "'+o+'" tag handle'),Mr.test(s)||m(n,"ill-formed tag prefix (second argument) of the TAG directive");try{s=decodeURIComponent(s)}catch{m(n,"tag prefix is malformed: "+s)}n.tagMap[o]=s}};At=St,Et=Ct,Hr={loadAll:At,load:Et},Gr=Object.prototype.toString,Vr=Object.prototype.hasOwnProperty,An=65279,Pt=9,Ce=10,_t=13,It=32,Rt=33,Ot=34,yn=35,Dt=37,Tt=38,Lt=39,$t=42,Jr=44,Ft=45,Be=58,jt=61,Nt=62,Mt=63,Kt=64,zr=91,Qr=93,Bt=96,Wr=123,Ut=124,Xr=125,O={};O[0]="\\0";O[7]="\\a";O[8]="\\b";O[9]="\\t";O[10]="\\n";O[11]="\\v";O[12]="\\f";O[13]="\\r";O[27]="\\e";O[34]='\\"';O[92]="\\\\";O[133]="\\N";O[160]="\\_";O[8232]="\\L";O[8233]="\\P";qt=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],Yt=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;Vt=1,Ae=2;eo=1,vn=2,no=3,ro=4,ue=5;as=ss,ls={dump:as};oo=R,io=yr,to=wr,so=Er,ao=Pr,lo=kn,co=Hr.load,uo=Hr.loadAll,po=ls.dump,fo=D,go={binary:Dr,float:Ar,map:br,null:kr,pairs:Lr,set:$r,timestamp:Rr,bool:Sr,int:Cr,merge:Or,omap:Tr,seq:vr,str:xr},mo=En("safeLoad","load"),ho=En("safeLoadAll","loadAll"),yo=En("safeDump","dump"),cs={Type:oo,Schema:io,FAILSAFE_SCHEMA:to,JSON_SCHEMA:so,CORE_SCHEMA:ao,DEFAULT_SCHEMA:lo,load:co,loadAll:uo,dump:po,YAMLException:fo,types:go,safeLoad:mo,safeLoadAll:ho,safeDump:yo}});var He={};ge(He,{confirm:()=>vs,createSpinner:()=>U,error:()=>A,formatDuration:()=>In,formatSize:()=>bs,getBanner:()=>ws,header:()=>E,info:()=>d,printCapabilities:()=>_n,printList:()=>Q,success:()=>k,warning:()=>z});import $ from"chalk";import ys from"cli-table3";import xs from"ora";function d(e){console.log($.blue("\u2139"),e)}function k(e){console.log($.green("\u2713"),e)}function z(e){console.log($.yellow("\u26A0"),e)}function A(e){console.error($.red("\u2717"),e)}function E(e){console.log(),console.log($.bold.white(e)),console.log($.gray("\u2500".repeat(e.length)))}function _n(e){if(Object.keys(e).length===0){d("No capabilities available");return}let n=new ys({head:[$.cyan("Capability"),$.cyan("Limits")],colWidths:[20,60]});for(let[r,i]of Object.entries(e)){let o=Object.entries(i).filter(([s,t])=>t!==void 0).map(([s,t])=>typeof t=="boolean"?t?$.green(s):$.red(s):`${s}: ${$.yellow(String(t))}`).join(", ");n.push([$.white(r),o||"No limits configured"])}console.log(n.toString())}function Q(e){e.forEach(n=>console.log(` ${$.gray("\u2022")} ${n}`))}function U(e){return xs({text:e,color:"blue"})}async function vs(e){let{default:n}=await import("prompts");return(await n({type:"confirm",name:"value",message:e,initial:!1})).value}function bs(e){let n=["B","KB","MB","GB"],r=e,i=0;for(;r>=1024&&i<n.length-1;)r/=1024,i++;return`${r.toFixed(2)} ${n[i]}`}function In(e){let n=Math.floor(e/1e3),r=Math.floor(n/60),i=Math.floor(r/60);return i>0?`${i}h ${r%60}m`:r>0?`${r}m ${n%60}s`:`${n}s`}function ws(){return`
34
+ ${$.gray("OxLayer CLI")}
35
+ `}var F=ie(()=>{"use strict";h()});h();h();h();h();h();B();async function Mn(){let{loadConfig:e}=await Promise.resolve().then(()=>(B(),ye)),n=await e();return n?{apiKey:n.token,environment:n.environment,vendorDir:n.vendorDir,apiEndpoint:n.apiEndpoint}:null}async function Kn(){let{removeConfig:e}=await Promise.resolve().then(()=>(B(),ye));await e()}async function Gs(){let{getAccessToken:e}=await Promise.resolve().then(()=>(B(),ye));return e()}function Vs(e){let{validateToken:n}=(B(),$o(ye));return n(e)}function Go(){let{join:e}=Z("path"),{homedir:n}=Z("os");return e(n(),".oxlayer")}function Bn(){return Z("path").join(Go(),"config.json")}B();Le();h();import{createHash as qn}from"crypto";import{promises as te}from"fs";import{join as Yn}from"path";async function ra(e){let n=await te.readFile(e);return qn("sha256").update(n).digest("hex")}async function zo(e){let n=qn("sha256"),{glob:r}=await import("glob"),i=await r("**/*",{cwd:e,nodir:!0,absolute:!1});i.sort();for(let o of i){let s=Yn(e,o),t=await te.readFile(s),a=o.replace(/\\/g,"/");n.update(a+"\0"),n.update(t)}return n.digest("hex")}async function Hn(e,n,r){let i=await fetch(e);if(!i.ok)throw new Error(`Failed to download: ${i.statusText}`);let o=parseInt(i.headers.get("content-length")||"0",10),s=0;await te.mkdir(Yn(n,".."),{recursive:!0});let t=await te.open(n,"w");try{let a=i.body?.getReader();if(!a)throw new Error("No response body");for(;;){let{done:l,value:c}=await a.read();if(l)break;await t.write(c),s+=c.length,r&&o>0&&r(s,o)}}finally{await t.close()}}async function Gn(e,n){let r=await te.readFile(e,"utf-8"),i=JSON.parse(r);if(n&&i.sha256!==n)throw new Error(`Manifest SHA256 mismatch. Expected ${n}, got ${i.sha256}`);return i}async function Vn(e,n){let r=(await import("adm-zip")).default,i=new r(e);await te.mkdir(n,{recursive:!0}),i.extractAllTo(n,!0)}async function oa(e,n){return await zo(e)===n.sha256}we();h();import{promises as le}from"fs";import{join as ce}from"path";import{existsSync as cn}from"fs";async function fa(e){let n=[],r=ce(e.vendorDir,"hooks");if(!cn(r))return n;let i=await le.readdir(r).filter(o=>o.endsWith(".js")||o.endsWith(".mjs"));for(let o of i){let s=ce(r,o),t=o.replace(/\.(js|mjs)$/,"");try{delete Z.cache[Z.resolve(s)];let a=(await import(s)).default||(await import(s)).postInstall;typeof a=="function"?(await a(e),n.push({hookName:t,status:"success",message:"Hook executed successfully"})):n.push({hookName:t,status:"warning",message:"No default export or postInstall function found"})}catch(a){n.push({hookName:t,status:"error",message:a instanceof Error?a.message:"Unknown error"})}}return n}async function da(e,n){let r=ce(n,"hooks");await le.mkdir(r,{recursive:!0});let i=ce(r,`${e}.js`),o=`/**
36
+ * ${e} Post-Install Hook
37
+ *
38
+ * This hook runs after SDK installation.
39
+ * Use it to set up configuration, generate files, or validate environment.
40
+ */
41
+
42
+ export default async function postInstall(context) {
43
+ const { version, projectRoot, capabilities } = context;
44
+
45
+ console.log(\`Running post-install for SDK \${version}...\`);
46
+
47
+ // Example: Add environment variables to .env
48
+ // const { appendFileSync } = await import('fs');
49
+ // const envPath = require('path').join(projectRoot, '.env');
50
+ // appendFileSync(envPath, \`
51
+ // # OxLayer SDK
52
+ // OXLAYER_SDK_VERSION=\${version}
53
+ // \`);
54
+
55
+ // Example: Generate config file
56
+ // const { writeFileSync } = await import('fs');
57
+ // const { join } = await import('path');
58
+ // const configPath = join(projectRoot, 'oxlayer.config.json');
59
+ // writeFileSync(configPath, JSON.stringify({
60
+ // version,
61
+ // capabilities: Object.keys(capabilities),
62
+ // }, null, 2));
63
+
64
+ console.log('Post-install complete!');
65
+ }
66
+
67
+ export const hookName = '${e}';
68
+ export const hookVersion = '1.0.0';
69
+ `;await le.writeFile(i,o)}async function Wo(e){let n=ce(e.projectRoot,".env");if(!cn(n)){let r=`
70
+ # OxLayer SDK Configuration
71
+ # Generated by SDK installer
72
+ OXLAYER_SDK_VERSION=${e.version}
73
+ OXLAYER_VENDOR_DIR=.ox/${e.version}
74
+ `;await le.writeFile(n,r.trim())}}async function Xo(e){let n=ce(e.projectRoot,"tsconfig.json");if(!cn(n))return;let r=JSON.parse(await le.readFile(n,"utf-8"));r.compilerOptions||(r.compilerOptions={}),r.compilerOptions.paths||(r.compilerOptions.paths={});let i=`.ox/${e.version}`;r.compilerOptions.paths["@oxlayer/*"]=[`${i}/*`],await le.writeFile(n,JSON.stringify(r,null,2))}async function Zo(e){let{capabilities:n}=e;for(let[r,i]of Object.entries(n))typeof i=="object"&&i!==null&&("maxRealms"in i&&i.maxRealms===1&&console.warn(`\u26A0\uFE0F Warning: Limited to 1 realm for ${r}`),"maxStorageGb"in i&&i.maxStorageGb<100&&console.warn(`\u26A0\uFE0F Warning: Limited to ${i.maxStorageGb}GB storage for ${r}`))}async function ga(e){await Wo(e),await Xo(e),await Zo(e)}h();import{promises as un}from"fs";import{join as Xn}from"path";import{existsSync as ei}from"fs";var pn=Xn(process.env.HOME||process.env.USERPROFILE||"",".oxlayer","telemetry.json"),ni=process.env.OXLAYER_TELEMETRY!=="0";async function je(){try{if(ei(pn)){let n=await un.readFile(pn,"utf-8");return JSON.parse(n)}}catch{}let e={enabled:ni,userId:ri()};return await fn(e),e}async function fn(e){let n=Xn(process.env.HOME||process.env.USERPROFILE||"",".oxlayer");await un.mkdir(n,{recursive:!0}),await un.writeFile(pn,JSON.stringify(e,null,2))}function ri(){let e=new Uint8Array(8);return crypto.getRandomValues(e),Array.from(e,n=>n.toString(16).padStart(2,"0")).join("")}async function Zn(e){let n=await je();if(!n.enabled)return;let r={...e,userId:n.userId,timestamp:new Date().toISOString()};oi(r).catch(()=>{})}async function oi(e){let n=process.env.OXLAYER_TELEMETRY_ENDPOINT||"https://telemetry.oxlayer.dev/v1/event";try{await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),keepalive:!0}).catch(()=>{})}catch{}}function wa(e,n={}){Zn({event:e,command:e,...n,cliVersion:"0.0.1",nodeVersion:process.version,platform:process.platform})}function ka(e,n,r={}){Zn({event:"error",command:e,errorCode:n,...r,cliVersion:"0.0.1",nodeVersion:process.version,platform:process.platform})}async function Sa(){let e=await je();e.enabled=!0,await fn(e)}async function Ca(){let e=await je();e.enabled=!1,await fn(e)}async function Aa(){let e=await je();return{enabled:e.enabled,userId:e.userId||""}}h();import{exec as us}from"child_process";import{promisify as ps}from"util";import{readFileSync as G,writeFileSync as N,existsSync as P,mkdirSync as Pe,renameSync as fs,chmodSync as ds,unlinkSync as gs}from"fs";import{randomBytes as ms}from"crypto";import{pid as bo}from"process";var w=ps(us),Ye=[{id:"postgres",name:"PostgreSQL",description:"Primary database (multi-tenant via databases)",category:"core",ports:["5432"]},{id:"redis",name:"Redis",description:"Cache and session store (multi-tenant via DB numbers)",category:"core",ports:["6379"]},{id:"rabbitmq",name:"RabbitMQ",description:"Message queue (multi-tenant via vhosts)",category:"core",ports:["5672","15672"]},{id:"keycloak",name:"Keycloak",description:"Identity and access management",category:"core",ports:["8080"],dependsOn:["keycloak-postgres"]},{id:"keycloak-postgres",name:"Keycloak PostgreSQL",description:"Database for Keycloak",category:"core",ports:[]},{id:"prometheus",name:"Prometheus",description:"Metrics collection and storage",category:"monitoring",ports:["9090"]},{id:"grafana",name:"Grafana",description:"Metrics visualization dashboard",category:"monitoring",ports:["3000"],dependsOn:["prometheus"]},{id:"traefik",name:"Traefik",description:"Reverse proxy and load balancer",category:"proxy",ports:["80","443","8081"]}],Pn=["postgres","redis","rabbitmq","keycloak","keycloak-postgres"],hs=Ye.map(e=>e.id),wo=class{OXLAYER_DIR=process.env.HOME+"/.oxlayer";INFRA_DIR=this.OXLAYER_DIR+"/infra";PROJECTS_FILE=this.OXLAYER_DIR+"/projects.json";PROJECTS_FILE_TMP=this.OXLAYER_DIR+"/projects.json.tmp";LOCK_FILE=this.OXLAYER_DIR+"/.lock";COMPOSE_FILE=this.INFRA_DIR+"/docker-compose.yml";acquireLock(){if(P(this.LOCK_FILE)){let n=parseInt(G(this.LOCK_FILE,"utf-8").trim());try{throw process.kill(n,0),new Error(`Registry is locked by process ${n}. If this is stale, remove: ${this.LOCK_FILE}`)}catch{console.warn(`\u26A0 Found stale lock from process ${n}, removing...`),this.releaseLock()}}N(this.LOCK_FILE,bo.toString(),{mode:384})}releaseLock(){if(P(this.LOCK_FILE))try{G(this.LOCK_FILE,"utf-8").trim()===bo.toString()&&gs(this.LOCK_FILE)}catch{}}async withLock(n){this.acquireLock();try{return await n()}finally{this.releaseLock()}}isInitialized(){return P(this.INFRA_DIR)&&P(this.COMPOSE_FILE)}async initialize(n){if(this.isInitialized())throw new Error("Global infrastructure already initialized");if(P(this.INFRA_DIR)||Pe(this.INFRA_DIR,{recursive:!0}),P(this.OXLAYER_DIR+"/projects")||Pe(this.OXLAYER_DIR+"/projects",{recursive:!0}),!P(this.PROJECTS_FILE)){let o={version:1,projects:{},redisDbAllocation:{nextDb:1,used:[0]}};N(this.PROJECTS_FILE,JSON.stringify(o,null,2))}let r;n&&n.length>0?r=n:r=await this.promptServiceSelection(),r=this.ensureDependencies(r);let i=this.generateDockerCompose(r);N(this.COMPOSE_FILE,i),console.log(),console.log("\u2713 Global infrastructure initialized at",this.INFRA_DIR),console.log(" Services:",r.map(o=>Ye.find(t=>t.id===o)?.name||o).join(", "))}async start(){if(!this.isInitialized())throw new Error("Global infrastructure not initialized. Run: ox global init");if(await this.isRunning()){console.log("\u2139 Global infrastructure is already running");return}console.log("\u{1F680} Starting global OxLayer infrastructure..."),await w(`docker-compose -f ${this.COMPOSE_FILE} -p oxlayer up -d`,{cwd:this.INFRA_DIR}),console.log("\u2713 Global infrastructure started"),console.log(" Services: PostgreSQL, Redis, RabbitMQ, Keycloak")}async stop(){if(!this.isInitialized())throw new Error("Global infrastructure not initialized");if(!await this.isRunning()){console.log("\u2139 Global infrastructure is not running");return}console.log("\u{1F6D1} Stopping global OxLayer infrastructure..."),await w(`docker-compose -f ${this.COMPOSE_FILE} -p oxlayer stop`,{cwd:this.INFRA_DIR}),console.log("\u2713 Global infrastructure stopped")}async isRunning(){try{let{stdout:n}=await w(`docker-compose -f ${this.COMPOSE_FILE} -p oxlayer ps -q`,{cwd:this.INFRA_DIR});return n.trim().length>0}catch{return!1}}async getStatus(){if(!this.isInitialized())return"Not initialized";if(!await this.isRunning())return"Not running";try{let{stdout:r}=await w(`docker-compose -f ${this.COMPOSE_FILE} -p oxlayer ps --services`,{cwd:this.INFRA_DIR});return`Running: ${r.trim().split(`
75
+ `).join(", ")}`}catch{return"Error fetching status"}}async registerProject(n,r){return this.withLock(async()=>{let i=this.loadRegistry();if(i.projects[n])return console.log(`\u2139 Project '${n}' is already registered`),i.projects[n];console.log(`\u{1F4DD} Registering project '${n}'...`);let o=this.sanitizeName(n)+"_user",s=this.generatePassword(),t=this.sanitizeName(n),a=this.generatePassword(),l=this.generatePassword(),c=await this.provisionPostgres(n,o,s),u=this.provisionRedis(i),p=await this.provisionRabbitMQ(n,t,a),g=await this.provisionKeycloak(n,l),f={name:n,path:r,createdAt:new Date().toISOString(),resources:{postgres:c,redis:u,rabbitmq:p,keycloak:g}};return i.projects[n]=f,this.saveRegistry(i),this.createProjectLocalConfig(r,n,f),console.log(`\u2713 Project '${n}' registered successfully`),f})}async provisionPostgres(n,r,i){let o=this.sanitizeName(n);try{let{stdout:s}=await w(`docker exec ox-postgres psql -U postgres -tAc "SELECT 1 FROM pg_database WHERE datname='${o}'"`,{timeout:5e3});return s.trim()==="1"?console.log(` \u2139 PostgreSQL database '${o}' already exists`):(await w(`docker exec ox-postgres psql -U postgres -c "CREATE DATABASE ${o};"`,{timeout:5e3}),console.log(` \u2713 Created PostgreSQL database: ${o}`)),(await w(`docker exec ox-postgres psql -U postgres -tAc "SELECT 1 FROM pg_user WHERE usename='${r}'"`,{timeout:5e3})).stdout.trim()==="1"?console.log(` \u2139 PostgreSQL user '${r}' already exists`):(await w(`docker exec ox-postgres psql -U postgres -c "CREATE USER ${r} WITH PASSWORD '${i}';"`,{timeout:5e3}),await w(`docker exec ox-postgres psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE ${o} TO ${r};"`,{timeout:5e3}),console.log(` \u2713 Created PostgreSQL user: ${r}`)),{database:o,user:r,password:i}}catch(s){throw new Error(`Failed to provision PostgreSQL: ${s.message}`)}}provisionRedis(n){let{nextDb:r}=n.redisDbAllocation;if(r>15)throw new Error("No more Redis databases available (max 15). Consider adding a second Redis instance.");return n.redisDbAllocation.used.push(r),n.redisDbAllocation.nextDb=r+1,console.log(` \u2713 Redis database: DB ${r}`),{host:"localhost",port:6379,db:r}}async provisionRabbitMQ(n,r,i){let o=this.sanitizeName(n);try{let{stdout:s}=await w(`docker exec ox-rabbitmq rabbitmqctl list_vhosts | grep "^${o}$" || true`,{timeout:5e3});return s.trim()?console.log(` \u2139 RabbitMQ vhost '${o}' already exists`):(await w(`docker exec ox-rabbitmq rabbitmqctl add_vhost ${o}`,{timeout:5e3}),console.log(` \u2713 Created RabbitMQ vhost: ${o}`)),(await w(`docker exec ox-rabbitmq rabbitmqctl list_users | grep "^${r}" || true`,{timeout:5e3})).stdout.trim()?console.log(` \u2139 RabbitMQ user '${r}' already exists`):(await w(`docker exec ox-rabbitmq rabbitmqctl add_user ${r} ${i}`,{timeout:5e3}),console.log(` \u2713 Created RabbitMQ user: ${r}`)),await w(`docker exec ox-rabbitmq rabbitmqctl set_permissions -p ${o} ${r} ".*" ".*" ".*"`,{timeout:5e3}),console.log(` \u2713 Set RabbitMQ permissions for ${r} on ${o}`),{vhost:o,user:r,password:i}}catch(s){throw new Error(`Failed to provision RabbitMQ: ${s.message}`)}}async provisionKeycloak(n,r){let i=this.sanitizeName(n),o=n+"-client";return console.log(` \u26A0 Keycloak realm '${i}' should be created manually via Admin API`),console.log(` Client ID: ${o}`),console.log(` Client Secret: ${r}`),{realm:i,clientId:o,clientSecret:r}}loadRegistry(){if(!P(this.PROJECTS_FILE))return{version:1,projects:{},redisDbAllocation:{nextDb:1,used:[0]}};let n=G(this.PROJECTS_FILE,"utf-8");return JSON.parse(n)}saveRegistry(n){let r=JSON.stringify(n,null,2);N(this.PROJECTS_FILE_TMP,r,{mode:384}),fs(this.PROJECTS_FILE_TMP,this.PROJECTS_FILE),ds(this.PROJECTS_FILE,384)}getProject(n){return this.loadRegistry().projects[n]||null}listProjects(){let n=this.loadRegistry();return Object.values(n.projects)}async unregisterProject(n){return this.withLock(async()=>{let r=this.loadRegistry();if(!r.projects[n])throw new Error(`Project '${n}' is not registered`);let o=r.projects[n].resources.redis.db;r.redisDbAllocation.used=r.redisDbAllocation.used.filter(s=>s!==o),delete r.projects[n],this.saveRegistry(r),console.log(`\u2713 Project '${n}' unregistered`),console.log(` \u2192 Freed Redis DB ${o}`),console.log("\u2139 Resources (databases, vhosts) have been preserved")})}getConnectionStrings(n){let r=this.getProject(n);if(!r)throw new Error(`Project '${n}' not found`);let{postgres:i,redis:o,rabbitmq:s,keycloak:t}=r.resources;return{DATABASE_URL:`postgresql://${i.user}:${i.password}@localhost:5432/${i.database}`,POSTGRES_DB:i.database,POSTGRES_USER:i.user,POSTGRES_PASSWORD:i.password,REDIS_URL:`redis://${o.host}:${o.port}/${o.db}`,REDIS_HOST:o.host,REDIS_PORT:o.port.toString(),REDIS_DB:o.db.toString(),RABBITMQ_URL:`amqp://${s.user}:${s.password}@localhost:5672/${s.vhost}`,RABBITMQ_VHOST:s.vhost,RABBITMQ_USER:s.user,RABBITMQ_PASSWORD:s.password,KEYCLOAK_URL:`http://localhost:8080/realms/${t.realm}`,KEYCLOAK_REALM:t.realm,KEYCLOAK_CLIENT_ID:t.clientId,KEYCLOAK_CLIENT_SECRET:t.clientSecret}}async generateEnvFile(n,r){let i=this.getConnectionStrings(n);if(!this.getProject(n))throw new Error(`Project '${n}' not found`);let s=["# OxLayer Global Infrastructure",`# Project: ${n}`,`# Generated: ${new Date().toISOString()}`,""];for(let[t,a]of Object.entries(i))s.push(`${t}="${a}"`);N(r,s.join(`
76
+ `)+`
77
+ `),console.log(`\u2713 Generated environment file: ${r}`)}async runDoctor(){console.log("\u{1FA7A} OxLayer Global Infrastructure Doctor"),console.log("\u2550".repeat(50)),console.log();let n=[];this.isInitialized()?console.log("\u2705 Global Infrastructure: Initialized"):(n.push("\u274C Global infrastructure not initialized"),console.log("\u274C Global Infrastructure: Not initialized"),console.log(" Fix: Run `ox global init`"));try{let{stdout:t}=await w("docker network inspect ox_net",{timeout:5e3});t.trim()&&console.log("\u2705 Docker Network (ox_net): Exists")}catch{n.push("Docker network ox_net missing"),console.log("\u274C Docker Network (ox_net): Missing"),console.log(" Fix: Run `ox global start`")}let r=["ox-postgres","ox-redis","ox-rabbitmq","ox-keycloak","ox-prometheus","ox-grafana","ox-traefik"],i=[],o=[],s=[];for(let t of r)try{let{stdout:a}=await w(`docker inspect -f '{{.State.Status}}' ${t} 2>/dev/null || echo "missing"`,{timeout:3e3}),l=a.trim();l==="running"?i.push(t):l==="missing"?s.push(t):o.push(t)}catch{s.push(t)}console.log(`
78
+ \u{1F4CA} Container Status:`),console.log(` \u2705 Running: ${i.length}/${r.length}`),i.length>0&&i.forEach(t=>console.log(` \u2022 ${t}`)),o.length>0&&(console.log(` \u26A0\uFE0F Stopped: ${o.length}`),o.forEach(t=>console.log(` \u2022 ${t}`)),n.push(`${o.length} containers stopped`)),s.length>0&&(console.log(` \u274C Missing: ${s.length}`),s.forEach(t=>console.log(` \u2022 ${t}`)),n.push(`${s.length} containers missing`)),console.log(`
79
+ \u{1F4CB} Registry Integrity:`);try{let t=this.loadRegistry();console.log(" \u2705 Registry file exists and is valid"),console.log(` \u{1F4CA} Registered projects: ${Object.keys(t.projects).length}`);let{used:a,nextDb:l}=t.redisDbAllocation,c=Math.max(...a,0);l!==c+1?(n.push(`Redis DB allocation inconsistent (nextDb=${l}, but max used=${c})`),console.log(" \u26A0\uFE0F Redis DB allocation may be inconsistent")):console.log(` \u2705 Redis DB allocation consistent (DB 0-${c} used, next is ${l})`),console.log(`
80
+ \u{1F50D} Resource Orphan Check:`);let u=Object.values(t.projects).map(g=>g.resources.postgres.database),p=Object.values(t.projects).map(g=>g.resources.rabbitmq.vhost);try{let{stdout:g}=await w('docker exec ox-postgres psql -U postgres -tAc "SELECT datname FROM pg_database WHERE datistemplate = false;"',{timeout:5e3}),x=g.trim().split(`
81
+ `).filter(y=>!["postgres","template0","template1"].includes(y)&&!u.includes(y));x.length>0?(console.log(` \u26A0\uFE0F Orphaned PostgreSQL databases: ${x.length}`),x.forEach(y=>console.log(` \u2022 ${y}`))):console.log(" \u2705 No orphaned PostgreSQL databases")}catch{console.log(" \u26A0\uFE0F Could not check PostgreSQL databases")}try{let{stdout:g}=await w("docker exec ox-rabbitmq rabbitmqctl list_vhosts",{timeout:5e3}),x=g.trim().split(`
82
+ `).map(y=>y.replace(/\s.*$/,"")).filter(y=>y&&y!=="/").filter(y=>!p.includes(y));x.length>0?(console.log(` \u26A0\uFE0F Orphaned RabbitMQ vhosts: ${x.length}`),x.forEach(y=>console.log(` \u2022 ${y}`))):console.log(" \u2705 No orphaned RabbitMQ vhosts")}catch{console.log(" \u26A0\uFE0F Could not check RabbitMQ vhosts")}}catch(t){n.push(`Registry corrupted or invalid: ${t.message}`),console.log(" \u274C Registry file corrupted or invalid")}if(console.log(`
83
+ \u{1F512} Lock File Status:`),P(this.LOCK_FILE)){let t=G(this.LOCK_FILE,"utf-8").trim();try{process.kill(parseInt(t),0),console.log(` \u26A0\uFE0F Lock file held by PID ${t} (active)`),console.log(` If stale, remove: ${this.LOCK_FILE}`)}catch{console.log(` \u26A0\uFE0F Stale lock file from PID ${t} (process dead)`),console.log(" Fix: Remove stale lock file"),n.push("Stale lock file detected")}}else console.log(" \u2705 No lock file (not in operation)");console.log(),console.log("\u2550".repeat(50)),n.length===0?console.log("\u2705 All checks passed! System is healthy."):(console.log(`\u26A0\uFE0F Found ${n.length} issue(s):`),n.forEach((t,a)=>console.log(` ${a+1}. ${t}`)),console.log(),console.log("\u{1F4A1} Run suggested fixes to resolve issues.")),console.log()}async resetProject(n,r){console.log("\u{1F504} Reset Project Resources"),console.log("\u2550".repeat(50)),console.log(),console.log(`\u26A0\uFE0F WARNING: This will DELETE all resources for project '${n}'`),console.log(),console.log("This will:"),console.log(" \u2022 Drop PostgreSQL database"),console.log(" \u2022 Delete PostgreSQL user"),console.log(" \u2022 Delete RabbitMQ vhost"),console.log(" \u2022 Delete RabbitMQ user"),console.log(" \u2022 Remove from registry"),console.log(" \u2022 Free Redis DB number"),console.log();let i=this.getProject(n);if(!i)throw new Error(`Project '${n}' not found`);if(console.log("Resources to be deleted:"),console.log(` PostgreSQL DB: ${i.resources.postgres.database}`),console.log(` PostgreSQL User: ${i.resources.postgres.user}`),console.log(` RabbitMQ VHost: ${i.resources.rabbitmq.vhost}`),console.log(` RabbitMQ User: ${i.resources.rabbitmq.user}`),console.log(` Redis DB: ${i.resources.redis.db}`),console.log(),!r){console.log("\u274C Aborted. Use --confirm to proceed."),console.log(" Example: ox infra reset "+n+" --confirm");return}console.log("\u{1F5D1}\uFE0F Deleting resources...");try{console.log(` \u2022 Dropping PostgreSQL database ${i.resources.postgres.database}...`),await w(`docker exec ox-postgres psql -U postgres -c "DROP DATABASE IF EXISTS ${i.resources.postgres.database};"`,{timeout:5e3})}catch(o){console.warn(` \u26A0 Failed to drop database: ${o.message}`)}try{console.log(` \u2022 Dropping PostgreSQL user ${i.resources.postgres.user}...`),await w(`docker exec ox-postgres psql -U postgres -c "DROP USER IF EXISTS ${i.resources.postgres.user};"`,{timeout:5e3})}catch(o){console.warn(` \u26A0 Failed to drop user: ${o.message}`)}try{console.log(` \u2022 Deleting RabbitMQ vhost ${i.resources.rabbitmq.vhost}...`),await w(`docker exec ox-rabbitmq rabbitmqctl delete_vhost ${i.resources.rabbitmq.vhost}`,{timeout:5e3})}catch(o){console.warn(` \u26A0 Failed to delete vhost: ${o.message}`)}try{console.log(` \u2022 Deleting RabbitMQ user ${i.resources.rabbitmq.user}...`),await w(`docker exec ox-rabbitmq rabbitmqctl delete_user ${i.resources.rabbitmq.user}`,{timeout:5e3})}catch(o){console.warn(` \u26A0 Failed to delete user: ${o.message}`)}await this.unregisterProject(n),console.log(),console.log("\u2705 Project resources deleted successfully!"),console.log(),console.log("\u{1F4A1} Note: Keycloak realm should be deleted manually via Admin UI")}generatePassword(n=32){return ms(Math.ceil(n/2)).toString("hex").slice(0,n)}sanitizeName(n){return n.toLowerCase().replace(/[^a-z0-9_]/g,"_").substring(0,63)}async promptServiceSelection(){let{default:n}=await import("prompts");console.log(),console.log("Select services for global OxLayer infrastructure:"),console.log();let{choice:r}=await n({type:"select",name:"choice",message:"Which services would you like to run?",choices:[{title:"Core services only (PostgreSQL, Redis, RabbitMQ, Keycloak)",value:"core"},{title:"All services (Core + Monitoring + Proxy)",value:"all"},{title:"Custom (select individual services)",value:"custom"}],initial:0});if(r==="core")return[...Pn];if(r==="all")return[...hs];let{services:i}=await n({type:"multiselect",name:"services",message:"Select services to include:",choices:Ye.filter(s=>s.id!=="keycloak-postgres").map(s=>({title:`${s.name} - ${s.description}`,value:s.id,selected:Pn.includes(s.id)}))}),o=i||Pn;return o.includes("keycloak")&&!o.includes("keycloak-postgres")&&o.push("keycloak-postgres"),o}ensureDependencies(n){let r=new Set(n),i=!0;for(;i;){i=!1;for(let o of r){let s=Ye.find(t=>t.id===o);if(s?.dependsOn)for(let t of s.dependsOn)r.has(t)||(r.add(t),i=!0)}}return Array.from(r)}generateDockerCompose(n){let r=this.getServiceConfigs(),i=[],o=[];for(let s of n){let t=r[s];if(t){i.push(t);let a=t.match(/- ox_\w+_data:/g);a&&a.forEach(l=>{let c=l.replace(/- |:/g,"");o.includes(c)||o.push(c)})}}return`services:
84
+ ${i.join(`
85
+ `)}
86
+
87
+ volumes:
88
+ ${o.map(s=>` ${s}:
89
+ driver: local`).join(`
90
+ `)}
91
+
92
+ networks:
93
+ ox_net:
94
+ driver: bridge
95
+ `}getServiceConfigs(){return{postgres:` # PostgreSQL Database (multi-tenant)
96
+ postgres:
97
+ image: postgres:16-alpine
98
+ container_name: ox-postgres
99
+ environment:
100
+ POSTGRES_USER: postgres
101
+ POSTGRES_PASSWORD: postgres
102
+ ports:
103
+ - "5432:5432"
104
+ volumes:
105
+ - ox_postgres_data:/var/lib/postgresql/data
106
+ healthcheck:
107
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
108
+ interval: 10s
109
+ timeout: 5s
110
+ retries: 5
111
+ networks:
112
+ - ox_net
113
+ restart: unless-stopped`,redis:` # Redis Cache (multi-tenant via DB number)
114
+ redis:
115
+ image: redis:7-alpine
116
+ container_name: ox-redis
117
+ ports:
118
+ - "6379:6379"
119
+ volumes:
120
+ - ox_redis_data:/data
121
+ healthcheck:
122
+ test: ["CMD", "redis-cli", "ping"]
123
+ interval: 10s
124
+ timeout: 5s
125
+ retries: 5
126
+ networks:
127
+ - ox_net
128
+ restart: unless-stopped`,rabbitmq:` # RabbitMQ Message Broker (multi-tenant via vhosts)
129
+ rabbitmq:
130
+ image: rabbitmq:3-management-alpine
131
+ container_name: ox-rabbitmq
132
+ environment:
133
+ RABBITMQ_DEFAULT_USER: guest
134
+ RABBITMQ_DEFAULT_PASS: guest
135
+ ports:
136
+ - "5672:5672"
137
+ - "15672:15672"
138
+ volumes:
139
+ - ox_rabbitmq_data:/var/lib/rabbitmq
140
+ healthcheck:
141
+ test: ["CMD", "rabbitmq-diagnostics", "ping"]
142
+ interval: 10s
143
+ timeout: 5s
144
+ retries: 5
145
+ networks:
146
+ - ox_net
147
+ restart: unless-stopped`,keycloak:` # Keycloak Authentication Server
148
+ keycloak:
149
+ image: quay.io/keycloak/keycloak:26.5
150
+ container_name: ox-keycloak
151
+ command: start-dev
152
+ environment:
153
+ KEYCLOAK_ADMIN: admin
154
+ KEYCLOAK_ADMIN_PASSWORD: admin
155
+ KC_DB: postgres
156
+ KC_DB_URL: jdbc:postgresql://ox-keycloak-postgres:5432/keycloak
157
+ KC_DB_USERNAME: keycloak
158
+ KC_DB_PASSWORD: keycloak
159
+ KC_HOSTNAME: localhost
160
+ KC_HOSTNAME_PORT: 8080
161
+ KC_HOSTNAME_STRICT: false
162
+ KC_HOSTNAME_STRICT_HTTPS: false
163
+ KC_HTTP_ENABLED: true
164
+ KC_SPI_OPTIONS_COOKIE_DEFAULT_SECURE: "false"
165
+ KC_SPI_OPTIONS_COOKIE_DEFAULT_SAME_SITE: "lax"
166
+ ports:
167
+ - "8080:8080"
168
+ depends_on:
169
+ ox-keycloak-postgres:
170
+ condition: service_healthy
171
+ volumes:
172
+ - ox_keycloak_data:/opt/keycloak/data
173
+ healthcheck:
174
+ test: ["CMD-SHELL", "exec 3<>/dev/tcp/localhost:8080 && echo -e 'GET /health/ready HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n' >&3 && cat <3 | grep -q '200 OK'"]
175
+ interval: 10s
176
+ timeout: 5s
177
+ retries: 20
178
+ start_period: 30s
179
+ networks:
180
+ - ox_net
181
+ restart: unless-stopped`,"keycloak-postgres":` # Keycloak Database
182
+ ox-keycloak-postgres:
183
+ image: postgres:16-alpine
184
+ container_name: ox-keycloak-postgres
185
+ environment:
186
+ POSTGRES_USER: keycloak
187
+ POSTGRES_PASSWORD: keycloak
188
+ POSTGRES_DB: keycloak
189
+ volumes:
190
+ - ox_keycloak_postgres_data:/var/lib/postgresql/data
191
+ healthcheck:
192
+ test: ["CMD-SHELL", "pg_isready -U keycloak"]
193
+ interval: 10s
194
+ timeout: 5s
195
+ retries: 5
196
+ networks:
197
+ - ox_net
198
+ restart: unless-stopped`,prometheus:` # Prometheus (metrics collection)
199
+ prometheus:
200
+ image: prom/prometheus:v2.48.0
201
+ container_name: ox-prometheus
202
+ command:
203
+ - "--config.file=/etc/prometheus/prometheus.yml"
204
+ - "--storage.tsdb.path=/prometheus"
205
+ - "--storage.tsdb.retention.time=15d"
206
+ - "--web.enable-lifecycle"
207
+ ports:
208
+ - "9090:9090"
209
+ volumes:
210
+ - ox_prometheus_data:/prometheus
211
+ networks:
212
+ - ox_net
213
+ restart: unless-stopped`,grafana:` # Grafana (visualization)
214
+ grafana:
215
+ image: grafana/grafana:12.3.1
216
+ container_name: ox-grafana
217
+ environment:
218
+ - GF_SECURITY_ADMIN_USER=admin
219
+ - GF_SECURITY_ADMIN_PASSWORD=admin
220
+ - GF_USERS_ALLOW_SIGN_UP=false
221
+ ports:
222
+ - "3000:3000"
223
+ volumes:
224
+ - ox_grafana_data:/var/lib/grafana
225
+ depends_on:
226
+ - prometheus
227
+ networks:
228
+ - ox_net
229
+ restart: unless-stopped`,traefik:` # Traefik Reverse Proxy
230
+ traefik:
231
+ image: traefik:v3.0
232
+ container_name: ox-traefik
233
+ command:
234
+ - "--api.insecure=true"
235
+ - "--providers.docker=true"
236
+ - "--entryPoints.web.address=:80"
237
+ - "--entryPoints.websecure.address=:443"
238
+ ports:
239
+ - "80:80"
240
+ - "443:443"
241
+ - "8081:8080"
242
+ volumes:
243
+ - /var/run/docker.sock:/var/run/docker.sock:ro
244
+ networks:
245
+ - ox_net
246
+ restart: unless-stopped`}}createProjectLocalConfig(n,r,i){let o=n+"/.oxlayer";try{P(o)||Pe(o,{recursive:!0});let s=o+"/.gitkeep";P(s)||N(s,`# This directory stores OxLayer project-specific configuration
247
+ `);let t=o+"/config.json",a={name:r,registeredAt:i.createdAt,oxlayerVersion:"0.0.28",globalRegistry:`${this.OXLAYER_DIR}/projects.json`};N(t,JSON.stringify(a,null,2));let l=o+"/.env.example",c=`# OxLayer Environment Variables for ${r}
248
+ # Generated: ${new Date().toISOString()}
249
+ # Copy this file to .env.local or use: ox infra env
250
+
251
+ # PostgreSQL
252
+ DATABASE_URL=postgresql://USER:PASSWORD@localhost:5432/${i.resources.postgres.database}
253
+ POSTGRES_DB=${i.resources.postgres.database}
254
+ POSTGRES_USER=${i.resources.postgres.user}
255
+
256
+ # Redis
257
+ REDIS_URL=redis://localhost:6379/${i.resources.redis.db}
258
+ REDIS_HOST=localhost
259
+ REDIS_PORT=6379
260
+ REDIS_DB=${i.resources.redis.db}
261
+
262
+ # RabbitMQ
263
+ RABBITMQ_URL=amqp://USER:PASSWORD@localhost:5672/${i.resources.rabbitmq.vhost}
264
+ RABBITMQ_VHOST=${i.resources.rabbitmq.vhost}
265
+ RABBITMQ_USER=${i.resources.rabbitmq.user}
266
+
267
+ # Keycloak
268
+ KEYCLOAK_URL=http://localhost:8080/realms/${i.resources.keycloak.realm}
269
+ KEYCLOAK_REALM=${i.resources.keycloak.realm}
270
+ KEYCLOAK_CLIENT_ID=${i.resources.keycloak.clientId}
271
+ `;N(l,c);let u=o+"/README.md",p=`# OxLayer Configuration for ${r}
272
+
273
+ This directory stores project-specific OxLayer configuration and settings.
274
+
275
+ ## Files
276
+
277
+ - \`config.json\` - Project metadata and registration info
278
+ - \`.env.example\` - Environment variable template
279
+ - \`.env.local\` - Generated environment file with credentials (run \`ox infra env\` to generate)
280
+
281
+ ## Commands
282
+
283
+ \`\`\`bash
284
+ # View connection URLs
285
+ ox infra connections
286
+
287
+ # Generate .env.local file
288
+ ox infra env
289
+
290
+ # View project status
291
+ oxlayer global status
292
+
293
+ # View logs
294
+ oxlayer global logs [service]
295
+
296
+ # Reset project (deletes all resources)
297
+ ox infra reset ${r} --confirm
298
+ \`\`\`
299
+
300
+ ## Resources
301
+
302
+ - **PostgreSQL Database**: \`${i.resources.postgres.database}\`
303
+ - **PostgreSQL User**: \`${i.resources.postgres.user}\`
304
+ - **Redis DB**: \`${i.resources.redis.db}\`
305
+ - **RabbitMQ VHost**: \`${i.resources.rabbitmq.vhost}\`
306
+ - **Keycloak Realm**: \`${i.resources.keycloak.realm}\`
307
+
308
+ ## Global Infrastructure
309
+
310
+ All projects share the global OxLayer infrastructure running at:
311
+ \`~/.oxlayer/infra/\`
312
+
313
+ To manage global infrastructure:
314
+ \`\`\`bash
315
+ # Start global infra
316
+ oxlayer global start
317
+
318
+ # Stop global infra
319
+ oxlayer global stop
320
+
321
+ # View status
322
+ oxlayer global status
323
+
324
+ # Run diagnostics
325
+ oxlayer global doctor
326
+ \`\`\`
327
+ `;N(u,p),console.log(" \u2713 Created .oxlayer folder in project")}catch(s){console.warn(` \u26A0 Could not create .oxlayer folder: ${s}`)}}async syncMonitoringConfig(n,r){if(console.log(`\u{1F504} Syncing monitoring configuration for '${n}'...`),!this.getProject(n))throw new Error(`Project '${n}' not found`);let o={prometheus:r+"/prometheus/prometheus.yml",grafanaDatasources:r+"/grafana/provisioning/datasources/datasources.yml",grafanaDashboards:r+"/grafana/provisioning/dashboards/dashboards.yml",grafanaDashboardDir:r+"/grafana/provisioning/dashboards/",collectorObservability:r+"/collector-observability.yaml",collectorDomain:r+"/collector-domain.yaml"},s={prometheusScrapeDir:this.INFRA_DIR+"/prometheus/scrape.d/",prometheusMain:this.INFRA_DIR+"/prometheus/prometheus.yml",collectorDir:this.INFRA_DIR+"/collectors/"};if(P(o.prometheus))try{console.log(" \u{1F4CA} Syncing Prometheus configuration (file-based)..."),await this.syncPrometheusFileBased(o.prometheus,s.prometheusScrapeDir,n)}catch(t){console.warn(" \u26A0 Could not sync Prometheus:",t.message)}else console.log(" \u2139 No Prometheus configuration found");if(P(o.collectorObservability))try{console.log(" \u{1F50D} Syncing OTEL observability collector (file-based)..."),await this.syncCollectorFileBased(o.collectorObservability,s.collectorDir,`${n}-observability.yaml`)}catch(t){console.warn(" \u26A0 Could not sync OTEL collector:",t.message)}if(P(o.collectorDomain))try{console.log(" \u{1F50D} Syncing OTEL domain collector (file-based)..."),await this.syncCollectorFileBased(o.collectorDomain,s.collectorDir,`${n}-domain.yaml`)}catch(t){console.warn(" \u26A0 Could not sync OTEL collector:",t.message)}if(P(o.grafanaDatasources)||P(o.grafanaDashboards))try{console.log(" \u{1F4C8} Syncing Grafana configuration (API-based)..."),await this.syncGrafanaApiBased(n,r,o)}catch(t){console.warn(" \u26A0 Could not sync Grafana:",t.message)}try{console.log(" \u{1F504} Reloading Prometheus..."),await w("docker exec ox-prometheus kill -HUP 1",{timeout:5e3}),console.log(" \u2713 Prometheus reloaded")}catch(t){console.warn(" \u26A0 Could not reload Prometheus:",t.message)}console.log(`\u2713 Monitoring configuration synced for '${n}'`)}async syncPrometheusFileBased(n,r,i){P(r)||Pe(r,{recursive:!0});let o=r+`${i}.yml`,s=G(n,"utf-8");if(!s.includes("scrape_configs")&&!s.includes("scrape_config_files"))throw new Error("Invalid Prometheus config: missing scrape_configs or scrape_config_files");N(o,s),console.log(` + Created ${o}`);let t=this.INFRA_DIR+"/prometheus/prometheus.yml",a="";P(t)?a=G(t,"utf-8"):a=`global:
328
+ scrape_interval: 15s
329
+ evaluation_interval: 15s
330
+
331
+ scrape_configs:
332
+ - job_name: 'prometheus'
333
+ static_configs:
334
+ - targets: ['localhost:9090']
335
+
336
+ scrape_config_files:
337
+ - /etc/prometheus/scrape.d/*.yml
338
+ `,a.includes("scrape_config_files")||(a+=`
339
+ scrape_config_files:
340
+ - /etc/prometheus/scrape.d/*.yml
341
+ `,N(t,a),console.log(" \u2713 Added scrape_config_files to main prometheus.yml"))}async syncCollectorFileBased(n,r,i){P(r)||Pe(r,{recursive:!0});let o=r+i,s=G(n,"utf-8");N(o,s),console.log(` + Created ${o}`)}async syncGrafanaApiBased(n,r,i){let o="http://localhost:3000",s="admin",t="admin",a=await this.createGrafanaOrganization(o,s,t,n);console.log(` \u2713 Created Grafana organization: ${n} (ID: ${a})`);let l=await this.createGrafanaApiKey(o,s,t,a);console.log(" \u2713 Created API key for organization"),P(i.grafanaDatasources)&&(await this.createGrafanaDatasources(o,l,i.grafanaDatasources),console.log(" \u2713 Created datasources")),P(i.grafanaDashboards)&&(await this.createGrafanaDashboards(o,l,n,i.grafanaDashboardDir),console.log(" \u2713 Created dashboards"))}async createGrafanaOrganization(n,r,i,o){let s=await w(`curl -s -X POST "${n}/api/orgs" -u "${r}:${i}" -H "Content-Type: application/json" -d '{"name":"${o}"}'`),t=JSON.parse(s.stdout);return t.orgId||t.id}async createGrafanaApiKey(n,r,i,o){let s=await w(`curl -s -X POST "${n}/api/auth/keys" -u "${r}:${i}" -H "Content-Type: application/json" -H "X-Grafana-Org-Id: ${o}" -d '{"name":"oxlayer-auto","role":"Admin","secondsToLive":0}'`);return JSON.parse(s.stdout).key}async createGrafanaDatasources(n,r,i){let o=await Promise.resolve().then(()=>(vo(),xo)),s=G(i,"utf-8"),t=o.load(s);if(t.datasources)for(let a of t.datasources){let l=await w(`curl -s -X POST "${n}/api/datasources" -H "Authorization: Bearer ${r}" -H "Content-Type: application/json" -d '${JSON.stringify(a)}'`),c=JSON.parse(l.stdout);c.message==="Datasource added"?console.log(` + Added datasource: ${a.name}`):c.message&&c.message.includes("already exists")&&console.log(` \u2139 Datasource exists: ${a.name}`)}}async createGrafanaDashboards(n,r,i,o){if(!P(o))return;let s=Z("fs").readdirSync(o).filter(t=>t.endsWith(".json"));for(let t of s){let a=o+t,l=G(a,"utf-8"),c=JSON.parse(l),u={dashboard:c,overwrite:!0,message:`Synced from ${i}`},p=await w(`curl -s -X POST "${n}/api/dashboards/db" -H "Authorization: Bearer ${r}" -H "Content-Type: application/json" -d '${JSON.stringify(u)}'`);JSON.parse(p.stdout).status==="success"&&console.log(` + Added dashboard: ${c.title||t}`)}}};h();F();h();we();import{existsSync as M,readFileSync as ks}from"fs";import{join as j}from"path";function Ss(e=process.cwd()){return M(j(e,"pnpm-lock.yaml"))?"pnpm":M(j(e,"bun.lockb"))?"bun":M(j(e,"yarn.lock"))?"yarn":M(j(e,"package-lock.json"))?"npm":"unknown"}function Rn(e=process.cwd()){let n=e;for(;n!=="/"&&n!==".";){if(M(j(n,"package.json"))){if(M(j(n,"pnpm-workspace.yaml"))||M(j(n,"turbo.json"))||M(j(n,"lerna.json"))||M(j(n,"nx.json")))return n;try{let i=j(n,"package.json"),o=ks(i,"utf-8");if(JSON.parse(o).workspaces)return n}catch{}if(n===e)return n}let r=j(n,"..");if(r===n)break;n=r}return e}async function W(e=process.cwd()){let n=Rn(e),r=M(j(n,"package.json")),i=M(j(n,"tsconfig.json"))||M(j(n,"tsconfig.json")),o=Ss(n),s="unknown";if(r)try{let t=await se(n),a={...t.dependencies,...t.devDependencies},l="react"in a||"react-dom"in a||"@types/react"in a||"next"in a,c="hono"in a||"@hono/hono"in a,u=l,p=c;u&&p?s="unknown":u?s="frontend":p&&(s="backend")}catch{}return{type:s,hasPackageJson:r,hasTsConfig:i,packageManager:o,rootDir:n}}function On(e){switch(e){case"pnpm":return"pnpm install";case"bun":return"bun install";case"yarn":return"yarn install";case"npm":return"npm install";default:return"pnpm install"}}function ko(e){switch(e){case"backend":return["backend-sdk"];case"frontend":return["frontend-sdk"];default:return["backend-sdk","frontend-sdk","cli-tools"]}}h();h();B();F();async function al(e={}){E("OxLayer Authentication");let n=await me();d(`Device: ${n}`),d(`Environment: ${e.environment||"development"}`),d(`API Endpoint: ${e.apiEndpoint||"http://localhost:3001"}`),console.log();let r=U("Initiating device authorization...");r.start();let i;try{let a=e.apiEndpoint||"http://localhost:3001";d(`API Endpoint: ${a}`),i=await en(e.environment||"development",a),r.succeed("Device authorization initiated")}catch(a){r.fail("Failed to initiate device authorization"),A(a instanceof Error?a.message:"Unknown error"),process.exit(1)}console.log(),d("To complete authentication, follow these steps:"),console.log();let o=i.verificationUrl,s=i.userCode;if(console.log(" 1. Visit this URL in your browser:"),console.log(` ${o}`),console.log(),console.log(" 2. Enter this code when prompted:"),console.log(` ${s}`),console.log(),e["no-browser"])d("Browser auto-open disabled (--no-browser flag set)");else try{let a=new URL(o);a.searchParams.set("device_code",i.deviceCode);let l=U("Opening browser...");l.start(),await an(a.toString()),l.succeed("Browser opened")}catch{d("Could not open browser automatically. Please visit the URL manually.")}console.log(),d("Waiting for authentication to complete...");let t=U("Waiting for approval");try{t.start();let a=await nn(i.pollEndpoint,i.deviceCode,{interval:e["poll-interval"]||i.interval,maxAttempts:120,onProgress:(u,p)=>{u%8===0&&(t.text=`Waiting for approval (${Math.floor(u/p*100)}%)`)}});t.succeed("Authentication successful");let l=e.apiEndpoint||"http://localhost:3001",c={token:a.accessToken,tokenInfo:a.tokenInfo,organizationId:a.organizationId,environment:e.environment||"development",vendorDir:".ox",apiEndpoint:l,updatedAt:new Date().toISOString()};await Ie(c),t.stop(),console.log(),k("Logged in successfully"),d(`Organization: ${a.organizationId}`),d(`Device ID: ${a.tokenInfo.deviceId}`),d(`Scopes: ${a.tokenInfo.scopes.join(", ")}`),d(`Expires: ${new Date(a.tokenInfo.expiresAt).toLocaleString()}`),process.exit(0)}catch(a){t.fail("Authentication failed"),A(a instanceof Error?a.message:"Unknown error"),process.exit(1)}}h();B();we();F();async function gl(e={}){E("OxLayer SDK Status");let n=await sn();if(n.authenticated){if(k("Authenticated"),d(`Organization: ${n.organizationId||"Unknown"}`),d(`Device: ${n.deviceId||"Unknown"}`),e.verbose&&n.scopes&&d(`Scopes: ${n.scopes.join(", ")}`),e.verbose&&n.expiresAt){let s=new Date(n.expiresAt),t=new Date,a=Math.ceil((s.getTime()-t.getTime())/(1e3*60*60*24));d(`Expires: ${s.toLocaleString()} (${a>0?`in ${a} days`:"expired"})`)}}else A("Not authenticated"),d('Run "ox login" to authenticate');if(console.log(),n.authenticated){E("Capabilities");let s=await tn();if(s)if(k("Capability manifest loaded"),d(`Schema Version: ${s.schemaVersion}`),d(`License: ${s.licenseId}`),d(`Environment: ${s.environment}`),s.capabilities){let t=Object.keys(s.capabilities).length;if(d(`Available Capabilities: ${t}`),e.verbose){let a=Object.keys(s.capabilities);a.length>0&&(d("Capabilities:"),Q(a));let l=new Date(s.expiresAt),c=new Date,u=Math.ceil((l.getTime()-c.getTime())/(1e3*60*60*24));d(`Manifest Expires: ${l.toLocaleString()} (${u>0?`in ${u} days`:"expired"})`)}}else d("No capabilities available in manifest");else d("No capability manifest available"),d('Run "ox install" to fetch the latest capabilities');console.log()}E("Project");let r=await W(),i=ko(r.type);r.hasPackageJson?(k("package.json found"),d(`Project type: ${r.type}`),d(`Package manager: ${r.packageManager}`),d(`TypeScript: ${r.hasTsConfig?"Yes":"No"}`)):A("No package.json found in current directory"),console.log(),E("Installation");let o=await ae();if(o){if(k(`SDK version ${o} installed`),d(`Location: .ox/${o}/`),e.verbose){let{existsSync:s}=await import("fs"),{join:t}=await import("path"),a=t(process.cwd(),".ox",o);if(s(a)){let{readdir:l}=await import("fs/promises"),u=(await l(a,{withFileTypes:!0})).filter(p=>p.isDirectory()).map(p=>p.name);u.length>0&&(d("Installed packages:"),Q(u))}}}else d("No SDK installed"),d('Run "ox install" to install the SDK');console.log(),i.length>0&&!o&&(E("Recommended"),d("For this project, OxLayer recommends installing:"),Q(i))}h();import{promises as Y}from"fs";import{join as K}from"path";import{execSync as Cs}from"child_process";F();B();var So=".ox";function As(e,n){if(n.packages&&n.packages.length>0)return n.packages;switch(e){case"backend":return["backend-sdk"];case"frontend":return["frontend-sdk"];default:return["backend-sdk","frontend-sdk","cli-tools"]}}function Es(e){let n=e.split("_");if(n.length===4){let[r,i,o,s]=n;return`${r}.${parseInt(i,10)}.${parseInt(o,10)}-${parseInt(s,10)}`}return e}async function Ps(e,n){let r=Es(n.version);for(let[i,o]of Object.entries(n.packages)){let s=K(e,o.path),t=K(s,"package.json"),a={};try{let c=await Y.readFile(t,"utf-8");a=JSON.parse(c).dependencies||{}}catch{}let l={name:i,version:r,private:!0,type:"module",main:o.main||"./dist/index.js",dependencies:a,exports:{".":{types:o.main?.replace(".js",".d.ts")||"./dist/index.d.ts",default:o.main||"./dist/index.js"},"./package.json":"./package.json"}};await Y.writeFile(t,JSON.stringify(l,null,2)+`
342
+ `,"utf-8")}}async function _s(e){let n=K(e,"pnpm-workspace.yaml"),r=".ox/**",i="!.ox/**/node_modules/**",o;try{let l=(await Y.readFile(n,"utf-8")).match(/packages:\s*\n((?:\s*-\s*[^\n]+\n*)+)/);l?o={packages:l[1].split(`
343
+ `).map(u=>u.replace(/^\s*-\s*/,"").trim()).filter(u=>u.length>0)}:o={packages:[]}}catch{o={packages:[]}}let s=[r,i];for(let a of s)(!o.packages||!o.packages.includes(a))&&(o.packages=[...o.packages||[],a]);let t=`packages:
344
+ ${o.packages.map(a=>` - '${a}'`).join(`
345
+ `)}
346
+ `;await Y.writeFile(n,t,"utf-8")}async function El(e,n={}){let r=Date.now(),i=process.cwd();E("OxLayer SDK Installer");let o=Rn(i);await Fe()||(A("No package.json found in current directory"),d("Navigate to your project directory before installing."),process.exit(1));let s=await W(i);d(`Project root: ${o===i?".":o}`),d(`Package manager: ${s.packageManager}`),d(`Project type: ${s.type}`);let t=As(s.type,n);d(`Packages: ${t.join(", ")}`);let a=U("Validating authentication...");a.start();try{let f=await ne();(!f||!f.token)&&(a.fail("Authentication required"),A("Please run: ox login"),process.exit(1)),he(f)&&(a.fail("Token expired"),A("Your authentication token has expired. Please run: ox login"),process.exit(1)),a.succeed("Authenticated"),d(`Organization: ${f.organizationId}`),d(`Device: ${f.tokenInfo?.deviceId||"Unknown"}`);let x=new Date(f.tokenInfo.expiresAt),y=new Date,b=Math.ceil((x.getTime()-y.getTime())/(1e3*60*60*24));d(`Token expires: ${x.toLocaleString()} (${b>0?`in ${b} days`:"expired"})`)}catch(f){a.fail("Authentication failed"),A(f instanceof Error?f.message:"Unknown error"),process.exit(1)}console.log();let l=U("Downloading SDK...");l.start();let c=e,u;try{let{downloadUrl:f,version:x}=await De(t[0],e);c=x;let y=K(o,".oxlayer-temp");await Y.mkdir(y,{recursive:!0});let b=K(y,`oxlayer-sdk-${c}.zip`),T=0;await Hn(f,b,(Io,Ro)=>{let Je=Math.floor(Io/Ro*100);Je-T>=10&&(l.text=`Downloading SDK... ${Je}%`,T=Je)}),l.succeed(`Downloaded SDK (${c})`);let v=U("Extracting SDK...");v.start();let Po=K(o,So),Ve=K(Po,c);await Y.mkdir(Ve,{recursive:!0}),await Vn(b,K(y,"extracted"));let Dn=K(y,"extracted",c),_o=K(Dn,"manifest.json");u=await Gn(_o),await Co(Dn,Ve),await Ps(Ve,u),v.succeed("Extracted SDK");let Tn=U("Configuring workspace...");Tn.start(),await _s(o),Tn.succeed("Workspace configured"),await Y.rm(y,{recursive:!0,force:!0})}catch(f){l.fail("Failed to install SDK"),A(f instanceof Error?f.message:"Unknown error"),process.exit(1)}console.log();let p=Date.now()-r;E("Installation Complete"),k(`SDK version ${c} installed successfully`),d(`Duration: ${In(p)}`),d(`Workspace: ${So}/${c}/`);let g=U("Running package manager install...");g.start();try{let f=On(s.packageManager);Cs(f,{cwd:o,stdio:"pipe"}),g.succeed(`Dependencies installed via ${s.packageManager}`)}catch{g.warn(`Package manager install failed. Please run '${On(s.packageManager)}' manually.`)}console.log(),d("Next steps:"),console.log(" Add to your package.json:"),console.log(' "dependencies": {'),console.log(' "@oxlayer/capabilities-auth": "workspace:*"'),console.log(" }"),console.log(),console.log(" Then import in your code:"),console.log(" import { SomeCapability } from '@oxlayer/capabilities-auth';")}async function Co(e,n){await Y.mkdir(n,{recursive:!0});let r=await Y.readdir(e,{withFileTypes:!0});for(let i of r){let o=K(e,i.name),s=K(n,i.name);i.isDirectory()?await Co(o,s):await Y.copyFile(o,s)}}h();F();import X from"chalk";async function Tl(e={}){E("OxLayer Capability Resolution");let n=await W(),r=e.environment||"development";d(`Project type: ${n.type}`),d(`Environment: ${r}`);let i=[];switch(n.type){case"backend":i.push("auth","storage","cache","events","queues","metrics","telemetry");break;case"frontend":i.push("auth","storage");break;default:i.push("auth","storage","search","vector","cache","events","queues","metrics","telemetry")}let o=await Promise.resolve().then(()=>(F(),He)).then(s=>s.createSpinner("Resolving capabilities..."));o.start();try{let s=await Oe(i,r);o.succeed("Capabilities resolved"),console.log(),d(`Organization: ${s.organizationId}`),d(`License: ${s.licenseId}`),d(`Resolved at: ${new Date(s.resolvedAt).toLocaleString()}`),console.log(),E("Available Capabilities"),_n(s.capabilities),e.verbose&&(console.log(),E("Usage Example"),console.log(),console.log("Import and use capabilities in your code:"),console.log(),console.log(X.gray("```typescript")),console.log(X.gray("import { resolveCapabilities } from '@oxlayer/capabilities-internal';")),console.log(),console.log(X.gray("const capabilities = await resolveCapabilities({")),console.log(X.gray(" projectId: 'your-project-id',")),console.log(X.gray(` environment: '${r}',`)),console.log(X.gray(` requested: ['${i.join("', '")}']`)),console.log(X.gray("});")),console.log(X.gray("```")),console.log()),k(`Your project has access to ${Object.keys(s.capabilities).length} capabilities`)}catch(s){o.fail("Failed to resolve capabilities"),A(s instanceof Error?s.message:"Unknown error"),s instanceof Error&&s.message.includes("API key")&&(console.log(),d("Make sure you're authenticated:"),console.log(" ox login")),process.exit(1)}}h();F();async function Nl(){try{await Kn(),k("Logged out successfully"),d(`Configuration removed from ${Bn()}`),d("Your API key is no longer stored locally.")}catch(e){z("Could not remove configuration"),d(e instanceof Error?e.message:"Unknown error")}}h();F();import{existsSync as Ao}from"fs";import{join as Eo}from"path";async function Is(e){let n=[],r=await Mn();r?n.push({name:"Authentication",status:"pass",message:"API key configured"}):n.push({name:"Authentication",status:"fail",message:"Not authenticated",fix:"Run: ox login"});try{await Te()?n.push({name:"API Connectivity",status:"pass",message:"Control Panel API is reachable"}):n.push({name:"API Connectivity",status:"fail",message:"API health check failed",fix:"Check your network connection"})}catch{n.push({name:"API Connectivity",status:"fail",message:"Cannot reach Control Panel API",fix:"Check your network connection or API endpoint"})}let i=await W();i.hasPackageJson?n.push({name:"Project Structure",status:"pass",message:`Found ${i.type} project with ${i.packageManager}`}):n.push({name:"Project Structure",status:"warn",message:"No package.json found",fix:"Navigate to your project directory"}),i.hasTsConfig?n.push({name:"TypeScript",status:"pass",message:"TypeScript configuration found"}):n.push({name:"TypeScript",status:"warn",message:"No TypeScript configuration found",fix:"Run: npx tsc --init"});let o=await ae();if(o){let l=be(o),c=Eo(l,"manifest.json");Ao(c)?n.push({name:"SDK Installation",status:"pass",message:`SDK version ${o} installed`}):n.push({name:"SDK Installation",status:"warn",message:`SDK version ${o} incomplete (missing manifest)`,fix:"Run: ox install --force"})}else n.push({name:"SDK Installation",status:"warn",message:"No SDK installed",fix:"Run: ox install"});let s=Eo(process.cwd(),".gitignore");Ao(s)?(await import("fs/promises").then(u=>u.readFile(s,"utf-8"))).includes(".ox")?n.push({name:".gitignore",status:"pass",message:"Vendor directory is ignored"}):n.push({name:".gitignore",status:"warn",message:"Vendor directory not in .gitignore",fix:'Add ".ox/" to .gitignore'}):n.push({name:".gitignore",status:"warn",message:"No .gitignore found",fix:'Create .gitignore and add ".ox/"'}),process.env.OXLAYER_API_KEY?n.push({name:"Environment Variables",status:"pass",message:"OXLAYER_API_KEY is set"}):r||n.push({name:"Environment Variables",status:"warn",message:"No API key in environment or config",fix:"Set OXLAYER_API_KEY or run: ox login"});let t=process.version;if(parseInt(t.slice(1).split(".")[0],10)>=18?n.push({name:"Node Version",status:"pass",message:`Node ${t} (supported)`}):n.push({name:"Node Version",status:"fail",message:`Node ${t} is not supported (requires >= 18)`,fix:"Upgrade to Node.js 18 or later"}),e.verbose&&r)try{let{resolveCapabilities:l}=await Promise.resolve().then(()=>(Le(),ln)),c=await l(["auth","storage"],"development");Object.keys(c.capabilities).length>0?n.push({name:"Capabilities",status:"pass",message:`${Object.keys(c.capabilities).length} capabilities available`}):n.push({name:"Capabilities",status:"warn",message:"No capabilities available",fix:"Check your license configuration"})}catch{n.push({name:"Capabilities",status:"fail",message:"Could not resolve capabilities",fix:"Check your API key and license"})}return n}function Rs(e){let n=0,r=0,i=0;for(let o of e)switch(o.status){case"pass":k(`${o.name}: ${o.message}`),n++;break;case"warn":z(`${o.name}: ${o.message}`),o.fix&&d(` \u2192 ${o.fix}`),r++;break;case"fail":A(`${o.name}: ${o.message}`),o.fix&&d(` \u2192 ${o.fix}`),i++;break}console.log(),i===0&&r===0?k("All checks passed! Your system is properly configured."):i===0?z(`${r} warning(s) found. Consider fixing them for optimal performance.`):A(`${i} error(s) and ${r} warning(s) found. Please fix the errors.`)}async function zl(e={}){E("OxLayer SDK Diagnostics");let n=await Is(e);console.log(),Rs(n),n.some(r=>r.status==="fail")&&process.exit(1)}h();F();function Ge(e,n){return typeof n=="boolean"?n?"\u2713 enabled":"\u2717 disabled":Array.isArray(n)?n.join(", "):typeof n=="object"&&n!==null?JSON.stringify(n):String(n)}function Os(e,n){let r=[],i=new Set([...Object.keys(e),...Object.keys(n)]);for(let o of i){let s=e[o],t=n[o];JSON.stringify(s)!==JSON.stringify(t)&&r.push(` ${o}: ${Ge(o,s)} \u2192 ${Ge(o,t)}`)}return r}async function Zl(e,n,r={}){E(`Capability Diff: ${e} \u2192 ${n}`);let i=await Promise.resolve().then(()=>(F(),He)).then(o=>o.createSpinner("Fetching manifests..."));i.start();try{i.succeed("Manifests fetched");let o={auth:{maxRealms:1,sso:!1,rbac:!0},storage:{encryption:!1,maxStorageGb:100},vector:{maxVectorCollections:10,maxVectorDimensions:1536}},s={auth:{maxRealms:5,sso:!0,rbac:!0},storage:{encryption:!0,maxStorageGb:1e3},search:{maxResults:1e4},vector:{maxVectorCollections:50,hybridSearch:!0}},t=[];for(let[u,p]of Object.entries(s))u in o||t.push({name:u,change:"added",after:p});for(let[u,p]of Object.entries(o))u in s||t.push({name:u,change:"removed",before:p});for(let u of Object.keys(o))if(u in s){let p=o[u],g=s[u],f=Os(p,g);f.length>0&&t.push({name:u,change:"modified",before:p,after:g,changes:f})}console.log();let a=t.filter(u=>u.change==="added").length,l=t.filter(u=>u.change==="removed").length,c=t.filter(u=>u.change==="modified").length;if(a>0&&k(`${a} capability(ies) added`),c>0&&d(`${c} capability(ies) modified`),l>0&&A(`${l} capability(ies) removed`),console.log(),r.verbose||t.length>0){E("Detailed Changes");for(let u of t){switch(u.change){case"added":if(k(`+ ${u.name} (new)`),r.verbose&&u.after){let p=Object.entries(u.after).map(([g,f])=>` ${g}: ${Ge(g,f)}`).join(`
347
+ `);console.log(p)}break;case"removed":if(A(`- ${u.name} (removed)`),r.verbose&&u.before){let p=Object.entries(u.before).map(([g,f])=>` ${g}: ${Ge(g,f)}`).join(`
348
+ `);console.log(p)}break;case"modified":d(`~ ${u.name} (modified)`),u.changes&&u.changes.length>0&&console.log(u.changes.join(`
349
+ `));break}console.log()}}if(E("Upgrade Recommendations"),c>0){let u=t.filter(p=>p.change==="modified");for(let p of u){let g=p.changes?.filter(f=>f.includes("\u2192")&&!f.includes("0 \u2192"));g&&g.length>0&&(warning(`${p.name}: Review breaking changes`),Q(g))}}if(l>0){warning("Some capabilities were removed. Check your code for usage.");let u=t.filter(p=>p.change==="removed").map(p=>p.name);Q(u)}}catch(o){i.fail("Failed to compare versions"),A(o instanceof Error?o.message:"Unknown error"),process.exit(1)}}async function ec(){let e=await Promise.resolve().then(()=>(F(),He)).then(n=>n.createSpinner("Checking for updates..."));e.start();try{let{getInstalledVersion:n}=await Promise.resolve().then(()=>(we(),Wn)),{getLatestVersion:r}=await Promise.resolve().then(()=>(Le(),ln)),i=await n(),o=await r();e.succeed("Version check complete"),E("Version Information"),d(`Installed: ${i||"None"}`),d(`Latest: ${o}`),i!==o?(console.log(),k("New version available!"),d(`Run: ox install ${o}`)):i&&(console.log(),k("You're up to date!"))}catch(n){e.fail("Failed to check version"),A(n instanceof Error?n.message:"Unknown error")}}h();F();async function ic(){k("Telemetry enabled"),d("Anonymous usage data will be collected to improve the SDK")}async function tc(){z("Telemetry disabled"),d("No usage data will be collected")}async function sc(){d("Checking telemetry status..."),d("Telemetry status: unknown (not implemented yet)")}h();F();async function pc(e={}){if(e.dryRun){d("Dry run mode: Would update SDK to latest version");return}d("Checking for SDK updates..."),k("SDK is up to date")}async function fc(){d("Checking for SDK updates..."),k("No updates available")}export{wo as GlobalInfraService,Jn as addSdkDependencies,Yo as buildVerificationUrl,zo as calculateDirSHA256,ra as calculateSHA256,fc as check,vs as confirm,da as createHookTemplate,U as createSpinner,Ss as detectPackageManager,W as detectProjectType,Zl as diff,Ca as disableTelemetry,zl as doctor,Hn as downloadFile,Sa as enableTelemetry,A as error,ga as executeBuiltinHooks,fa as executeHooks,Vn as extractZip,Rn as findProjectRoot,In as formatDuration,bs as formatSize,zn as freezeWorkspaceVersions,Wo as generateEnvHook,rn as getAccessToken,Gs as getApiKey,sn as getAuthInfo,ws as getBanner,Go as getConfigDir,Bn as getConfigFile,Ze as getDeviceId,me as getDeviceName,On as getInstallCommand,ae as getInstalledVersion,Un as getLatestVersion,tn as getManifest,ko as getRecommendedPackages,Aa as getTelemetryStatus,be as getVendorDir,Fe as hasPackageJson,E as header,Te as healthCheck,d as info,en as initiateDeviceAuth,El as install,qo as isAuthenticated,he as isTokenExpired,Qn as isVersionInstalled,al as login,Nl as logout,Ho as migrateFromApiKey,an as openBrowser,nn as pollForToken,_n as printCapabilities,Zo as printCapabilityWarningsHook,Q as printList,se as readPackageJson,Nn as refreshManifest,De as requestPackageDownload,Tl as resolve,Oe as resolveCapabilities,ec as showLatest,gl as status,k as success,tc as telemetryDisable,ic as telemetryEnable,sc as telemetryStatus,wa as trackCommand,ka as trackError,Zn as trackEvent,pc as update,Xo as updateTsconfigPathsHook,Vs as validateApiKey,on as validateToken,oa as verifyExtractedIntegrity,Gn as verifyManifest,z as warning,$e as writePackageJson};
350
+ /*! Bundled license information:
351
+
352
+ js-yaml/dist/js-yaml.mjs:
353
+ (*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT *)
354
+ */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxlayer/cli",
3
- "version": "0.0.24",
3
+ "version": "0.0.28",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -10,6 +10,14 @@
10
10
  "bin": {
11
11
  "ox": "./dist/cli.js"
12
12
  },
13
+ "main": "./dist/index.js",
14
+ "module": "./dist/index.js",
15
+ "exports": {
16
+ ".": {
17
+ "import": "./dist/index.js",
18
+ "require": "./dist/index.js"
19
+ }
20
+ },
13
21
  "files": [
14
22
  "dist",
15
23
  "README.md"
@@ -37,6 +45,7 @@
37
45
  },
38
46
  "scripts": {
39
47
  "dev": "bun src/cli.ts",
48
+ "ox": "bun src/cli.ts",
40
49
  "build": "tsup",
41
50
  "build:obfuscated": "tsup && bun scripts/obfuscate.ts",
42
51
  "start": "node dist/cli.js",