@membranehq/cli 1.4.0 → 1.4.1-beta.0
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 +41 -179
- package/package.json +5 -3
package/dist/index.js
CHANGED
|
@@ -1,164 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`});return n.writeLine("// Generated TypeScript definitions for Membrane actions"),n.newLine(),n.writeLine("import type {"),n.writeLine(" ActionAccessor,"),n.writeLine(" ConnectionLevelActionAccessor,"),n.writeLine('} from "@membranehq/sdk";'),n.newLine(),
|
|
4
|
-
`),"createExperimentalWarning$2");function
|
|
5
|
-
`)).action(async t=>{try{console.warn(
|
|
6
|
-
`);return
|
|
7
|
-
Membrane API Error:`),a&&console.error(a),console.error(JSON.stringify(
|
|
8
|
-
HTTP Error:`),a&&console.error(a),console.error(JSON.stringify({message:
|
|
9
|
-
Unexpected Error:`),a&&console.error(a),console.error(o)),o}return}},"executeRequest");return t?i():pr.withSkipErrorLog(i)}async generateAccessToken(e,t){return Kn.sign({name:"Membrane Agent",isAdmin:!0,exp:Math.floor(Date.now()/1e3)+3600,iss:e},t,{algorithm:"HS512"})}isTokenValid(){return Date.now()<this.tokenExpiry}getCurrentConfig(e){const t=Kt(e);return!t?.workspaceKey||!t?.workspaceSecret?null:{workspaceKey:t.workspaceKey,workspaceSecret:t.workspaceSecret,apiUri:t.apiUri}}async createClient(e){const t=await this.generateAccessToken(e.workspaceKey,e.workspaceSecret);return this.tokenExpiry=Date.now()+36e5,this.currentConfig=e,new Hs({token:t,apiUri:e.apiUri})}async getClient(e=process.cwd()){const t=this.getCurrentConfig(e);if(!t)throw new Error("Unable to create MembraneClient: No workspace configuration found.");const n=!this.currentConfig||this.currentConfig.workspaceKey!==t.workspaceKey||this.currentConfig.workspaceSecret!==t.workspaceSecret||this.currentConfig.apiUri!==t.apiUri,r=!this.isTokenValid()||this.tokenExpiry-Date.now()<3e5;return(!this.client||n||r)&&(this.client=await this.createClient(t)),this.client}clearClient(){this.client=null,this.currentConfig=null,this.tokenExpiry=0,this.requestTimes=[],this.semaphore=0,this.semaphoreQueue=[],this.rateLimitMutex=Promise.resolve()}getCurrentConfigInfo(){return this.currentConfig}async waitIfNeeded(){this.rateLimitMutex=this.rateLimitMutex.then(async()=>{for(this.cleanOldRequests();this.requestTimes.length>=this.maxRequestsPerSecond;){const t=this.requestTimes[0]+this.windowSizeMs-Date.now()+10;if(t>0)await new Promise(n=>setTimeout(n,t)),this.cleanOldRequests();else break}}),await this.rateLimitMutex}recordRequest(){this.requestTimes.push(Date.now())}cleanOldRequests(){const e=Date.now()-this.windowSizeMs;this.requestTimes=this.requestTimes.filter(t=>t>e)}getRequestCount(){return this.cleanOldRequests(),this.requestTimes.length}async acquireSemaphore(){if(this.semaphore<this.maxConcurrentRequests){this.semaphore++;return}return new Promise(e=>{this.semaphoreQueue.push(e)})}releaseSemaphore(){if(this.semaphore--,this.semaphoreQueue.length>0){const e=this.semaphoreQueue.shift();this.semaphore++,e()}}async withRetry(e,t="operation"){let n;for(let r=0;r<=this.maxRetries;r++)try{return await e()}catch(i){if(n=i,!this.isRetryableError(i)||r===this.maxRetries)throw i;const o=new Date().toISOString(),a=r+2;b.debug(`[${o}] Retrying ${t} (attempt ${a}/${this.maxRetries+1})`);let l=this.retryDelay*Math.pow(2,r);if(this.enableJitter){const u=l*.25*(Math.random()*2-1);l=Math.max(0,l+u)}await new Promise(u=>setTimeout(u,l))}throw n||new Error("Unknown error occurred during retry attempts")}isRetryableError(e){if(!e)return!1;const t=(e.message||e.toString()||"").toLowerCase(),n=e.code;return n&&["econnrefused","enotfound","econnreset","etimedout","ehostunreach","enetunreach"].includes(n.toLowerCase())?!0:["econnrefused","connection refused","network error","timeout","socket hang up","request timeout","dns lookup failed"].some(o=>t.includes(o))}async withTimeout(e,t){let n;const r=new Promise((i,o)=>{n=setTimeout(()=>o(new Error(`Request timeout after ${t}ms`)),t)});try{const i=await Promise.race([e,r]);return n&&clearTimeout(n),i}catch(i){throw n&&clearTimeout(n),i}}}const D=new Ta;async function mr(s){const e=await D.withClient(t=>t.get("org-workspace-id"),!0,s);if(!e)throw new Error("Failed to get workspace ID");return e.id}c(mr,"getWorkspaceId");var K={},Bt={},gr;function yr(){if(gr)return Bt;gr=1,Object.defineProperty(Bt,"__esModule",{value:!0});function s(e){return e===void 0&&(e=""),e?String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"").replace(/[^A-Za-z0-9]+/g,"$").replace(/([a-z])([A-Z])/g,function(t,n,r){return n+"$"+r}).toLowerCase().replace(/(\$)(\w)/g,function(t,n,r){return r.toUpperCase()}):""}return c(s,"toCamelCase"),Bt.default=s,Bt}c(yr,"requireJsCamelcase");var qt={},wr;function br(){if(wr)return qt;wr=1,Object.defineProperty(qt,"__esModule",{value:!0});function s(e){return e===void 0&&(e=""),e?String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"").replace(/([a-z])([A-Z])/g,function(t,n,r){return n+"_"+r.toLowerCase()}).replace(/[^A-Za-z0-9]+|_+/g,"_").toLowerCase():""}return c(s,"toSnakeCase"),qt.default=s,qt}c(br,"requireJsSnakecase");var Ut={},Sr;function Cr(){if(Sr)return Ut;Sr=1,Object.defineProperty(Ut,"__esModule",{value:!0});function s(e){return e===void 0&&(e=""),e?String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"$").replace(/[^A-Za-z0-9]+/g,"$").replace(/([a-z])([A-Z])/g,function(t,n,r){return n+"$"+r}).toLowerCase().replace(/(\$)(\w?)/g,function(t,n,r){return r.toUpperCase()}):""}return c(s,"toPascalCase"),Ut.default=s,Ut}c(Cr,"requireJsPascalcase");var Jt={},vr;function Ia(){if(vr)return Jt;vr=1,Object.defineProperty(Jt,"__esModule",{value:!0});function s(e){return e===void 0&&(e=""),e?String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"").replace(/([a-z])([A-Z])/g,function(t,n,r){return n+"_"+r.toLowerCase()}).replace(/[^A-Za-z0-9]+|_+/g,".").toLowerCase():""}return c(s,"toDotCase"),Jt.default=s,Jt}c(Ia,"requireJsDotcase");var Wt={},kr;function Oa(){if(kr)return Wt;kr=1,Object.defineProperty(Wt,"__esModule",{value:!0});function s(e){return e===void 0&&(e=""),e?String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"").replace(/([a-z])([A-Z])/g,function(t,n,r){return n+"_"+r.toLowerCase()}).replace(/[^A-Za-z0-9]+|_+/g,"/").toLowerCase():""}return c(s,"toPathCase"),Wt.default=s,Wt}c(Oa,"requireJsPathcase");var Vt={},Er;function Aa(){if(Er)return Vt;Er=1,Object.defineProperty(Vt,"__esModule",{value:!0});function s(e){return e===void 0&&(e=""),e?String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"").replace(/([a-z])([A-Z])/g,function(t,n,r){return n+"_"+r.toLowerCase()}).replace(/[^A-Za-z0-9]+|_+/g," ").toLowerCase():""}return c(s,"toTextCase"),Vt.default=s,Vt}c(Aa,"requireJsTextcase");var Gt={},Tr;function $a(){if(Tr)return Gt;Tr=1,Object.defineProperty(Gt,"__esModule",{value:!0});function s(e){if(e===void 0&&(e=""),!e)return"";var t=String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"").replace(/([a-z])([A-Z])/g,function(n,r,i){return r+"_"+i.toLowerCase()}).replace(/[^A-Za-z0-9]+|_+/g," ").toLowerCase();return t.charAt(0).toUpperCase()+t.slice(1)}return c(s,"toSentenceCase"),Gt.default=s,Gt}c($a,"requireJsSentencecase");var zt={},Ir;function Na(){if(Ir)return zt;Ir=1,Object.defineProperty(zt,"__esModule",{value:!0});function s(e){return e===void 0&&(e=""),e?String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"").replace(/([a-z])([A-Z])/g,function(t,n,r){return n+"_"+r.toLowerCase()}).replace(/[^A-Za-z0-9]+|_+/g," ").toLowerCase().replace(/( ?)(\w+)( ?)/g,function(t,n,r,i){return n+r.charAt(0).toUpperCase()+r.slice(1)+i}):""}return c(s,"toHeaderCase"),zt.default=s,zt}c(Na,"requireJsHeadercase");var Ht={},Or;function Ar(){if(Or)return Ht;Or=1,Object.defineProperty(Ht,"__esModule",{value:!0});function s(e){return e===void 0&&(e=""),e?String(e).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g,"").replace(/([a-z])([A-Z])/g,function(t,n,r){return n+"_"+r.toLowerCase()}).replace(/[^A-Za-z0-9]+|_+/g,"-").toLowerCase():""}return c(s,"toKebabCase"),Ht.default=s,Ht}c(Ar,"requireJsKebabcase");var He={},Hn={},$r;function Ye(){return $r||($r=1,function(s){Object.defineProperty(s,"__esModule",{value:!0}),s.belongToTypes=s.isValidObject=s.isArrayObject=s.validateOptions=s.DefaultOption=void 0,s.DefaultOption={recursive:!1,recursiveInArray:!1,keepTypesOnRecursion:[]},s.validateOptions=function(e){return e===void 0&&(e=s.DefaultOption),e.recursive==null?e=s.DefaultOption:e.recursiveInArray==null&&(e.recursiveInArray=!1),e},s.isArrayObject=function(e){return e!=null&&Array.isArray(e)},s.isValidObject=function(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)},s.belongToTypes=function(e,t){return(t||[]).some(function(n){return e instanceof n})}}(Hn)),Hn}c(Ye,"requireUtils");var Nr;function xa(){if(Nr)return He;Nr=1;var s=He&&He.__spreadArrays||function(){for(var n=0,r=0,i=arguments.length;r<i;r++)n+=arguments[r].length;for(var o=Array(n),a=0,r=0;r<i;r++)for(var l=arguments[r],u=0,f=l.length;u<f;u++,a++)o[a]=l[u];return o};Object.defineProperty(He,"__esModule",{value:!0});var e=Ye();function t(n,r){if(r===void 0&&(r=e.DefaultOption),!e.isValidObject(n))return null;r=e.validateOptions(r);var i={};return Object.keys(n).forEach(function(o){var a=n[o],l=o.toLowerCase();r.recursive&&(e.isValidObject(a)?e.belongToTypes(a,r.keepTypesOnRecursion)||(a=t(a,r)):r.recursiveInArray&&e.isArrayObject(a)&&(a=s(a).map(function(u){var f=u;if(e.isValidObject(u))e.belongToTypes(f,r.keepTypesOnRecursion)||(f=t(u,r));else if(e.isArrayObject(u)){var d=t({key:u},r);f=d.key}return f}))),i[l]=a}),i}return c(t,"lowerKeys"),He.default=t,He}c(xa,"requireLowercaseKeysObject");var Ze={},xr;function Pa(){if(xr)return Ze;xr=1;var s=Ze&&Ze.__spreadArrays||function(){for(var n=0,r=0,i=arguments.length;r<i;r++)n+=arguments[r].length;for(var o=Array(n),a=0,r=0;r<i;r++)for(var l=arguments[r],u=0,f=l.length;u<f;u++,a++)o[a]=l[u];return o};Object.defineProperty(Ze,"__esModule",{value:!0});var e=Ye();function t(n,r){if(r===void 0&&(r=e.DefaultOption),!e.isValidObject(n))return null;r=e.validateOptions(r);var i={};return Object.keys(n).forEach(function(o){var a=n[o],l=o.toUpperCase();r.recursive&&(e.isValidObject(a)?e.belongToTypes(a,r.keepTypesOnRecursion)||(a=t(a,r)):r.recursiveInArray&&e.isArrayObject(a)&&(a=s(a).map(function(u){var f=u;if(e.isValidObject(u))e.belongToTypes(f,r.keepTypesOnRecursion)||(f=t(u,r));else if(e.isArrayObject(u)){var d=t({key:u},r);f=d.key}return f}))),i[l]=a}),i}return c(t,"upperKeys"),Ze.default=t,Ze}c(Pa,"requireUppercaseKeysObject");var Qe={},Pr;function La(){if(Pr)return Qe;Pr=1;var s=Qe&&Qe.__spreadArrays||function(){for(var r=0,i=0,o=arguments.length;i<o;i++)r+=arguments[i].length;for(var a=Array(r),l=0,i=0;i<o;i++)for(var u=arguments[i],f=0,d=u.length;f<d;f++,l++)a[l]=u[f];return a};Object.defineProperty(Qe,"__esModule",{value:!0});var e=Ye(),t=yr();function n(r,i){if(i===void 0&&(i=e.DefaultOption),!e.isValidObject(r))return null;i=e.validateOptions(i);var o={};return Object.keys(r).forEach(function(a){var l=r[a],u=t.default(a);i.recursive&&(e.isValidObject(l)?e.belongToTypes(l,i.keepTypesOnRecursion)||(l=n(l,i)):i.recursiveInArray&&e.isArrayObject(l)&&(l=s(l).map(function(f){var d=f;if(e.isValidObject(f))e.belongToTypes(d,i.keepTypesOnRecursion)||(d=n(f,i));else if(e.isArrayObject(f)){var h=n({key:f},i);d=h.key}return d}))),o[u]=l}),o}return c(n,"camelKeys"),Qe.default=n,Qe}c(La,"requireCamelcaseKeysObject");var Xe={},Lr;function Ra(){if(Lr)return Xe;Lr=1;var s=Xe&&Xe.__spreadArrays||function(){for(var r=0,i=0,o=arguments.length;i<o;i++)r+=arguments[i].length;for(var a=Array(r),l=0,i=0;i<o;i++)for(var u=arguments[i],f=0,d=u.length;f<d;f++,l++)a[l]=u[f];return a};Object.defineProperty(Xe,"__esModule",{value:!0});var e=Ye(),t=br();function n(r,i){if(i===void 0&&(i=e.DefaultOption),!e.isValidObject(r))return null;i=e.validateOptions(i);var o={};return Object.keys(r).forEach(function(a){var l=r[a],u=t.default(a);i.recursive&&(e.isValidObject(l)?e.belongToTypes(l,i.keepTypesOnRecursion)||(l=n(l,i)):i.recursiveInArray&&e.isArrayObject(l)&&(l=s(l).map(function(f){var d=f;if(e.isValidObject(f))e.belongToTypes(d,i.keepTypesOnRecursion)||(d=n(f,i));else if(e.isArrayObject(f)){var h=n({key:f},i);d=h.key}return d}))),o[u]=l}),o}return c(n,"snakeKeys"),Xe.default=n,Xe}c(Ra,"requireSnakecaseKeysObject");var et={},Rr;function Da(){if(Rr)return et;Rr=1;var s=et&&et.__spreadArrays||function(){for(var r=0,i=0,o=arguments.length;i<o;i++)r+=arguments[i].length;for(var a=Array(r),l=0,i=0;i<o;i++)for(var u=arguments[i],f=0,d=u.length;f<d;f++,l++)a[l]=u[f];return a};Object.defineProperty(et,"__esModule",{value:!0});var e=Ye(),t=Cr();function n(r,i){if(i===void 0&&(i=e.DefaultOption),!e.isValidObject(r))return null;i=e.validateOptions(i);var o={};return Object.keys(r).forEach(function(a){var l=r[a],u=t.default(a);i.recursive&&(e.isValidObject(l)?e.belongToTypes(l,i.keepTypesOnRecursion)||(l=n(l,i)):i.recursiveInArray&&e.isArrayObject(l)&&(l=s(l).map(function(f){var d=f;if(e.isValidObject(f))e.belongToTypes(d,i.keepTypesOnRecursion)||(d=n(f,i));else if(e.isArrayObject(f)){var h=n({key:f},i);d=h.key}return d}))),o[u]=l}),o}return c(n,"pascalKeys"),et.default=n,et}c(Da,"requirePascalcaseKeysObject");var tt={},Dr;function Ma(){if(Dr)return tt;Dr=1;var s=tt&&tt.__spreadArrays||function(){for(var r=0,i=0,o=arguments.length;i<o;i++)r+=arguments[i].length;for(var a=Array(r),l=0,i=0;i<o;i++)for(var u=arguments[i],f=0,d=u.length;f<d;f++,l++)a[l]=u[f];return a};Object.defineProperty(tt,"__esModule",{value:!0});var e=Ye(),t=Ar();function n(r,i){if(i===void 0&&(i=e.DefaultOption),!e.isValidObject(r))return null;i=e.validateOptions(i);var o={};return Object.keys(r).forEach(function(a){var l=r[a],u=t.default(a);i.recursive&&(e.isValidObject(l)?e.belongToTypes(l,i.keepTypesOnRecursion)||(l=n(l,i)):i.recursiveInArray&&e.isArrayObject(l)&&(l=s(l).map(function(f){var d=f;if(e.isValidObject(f))e.belongToTypes(d,i.keepTypesOnRecursion)||(d=n(f,i));else if(e.isArrayObject(f)){var h=n({key:f},i);d=h.key}return d}))),o[u]=l}),o}return c(n,"kebabKeys"),tt.default=n,tt}c(Ma,"requireKebabcaseKeysObject");var Mr;function ja(){if(Mr)return K;Mr=1,Object.defineProperty(K,"__esModule",{value:!0}),K.kebabKeys=K.pascalKeys=K.snakeKeys=K.camelKeys=K.upperKeys=K.lowerKeys=K.toLowerCase=K.toUpperCase=K.toKebabCase=K.toHeaderCase=K.toSentenceCase=K.toTextCase=K.toPathCase=K.toDotCase=K.toPascalCase=K.toSnakeCase=K.toCamelCase=void 0;var s=yr();K.toCamelCase=s.default;var e=br();K.toSnakeCase=e.default;var t=Cr();K.toPascalCase=t.default;var n=Ia();K.toDotCase=n.default;var r=Oa();K.toPathCase=r.default;var i=Aa();K.toTextCase=i.default;var o=$a();K.toSentenceCase=o.default;var a=Na();K.toHeaderCase=a.default;var l=Ar();K.toKebabCase=l.default;var u=xa();K.lowerKeys=u.default;var f=Pa();K.upperKeys=f.default;var d=La();K.camelKeys=d.default;var h=Ra();K.snakeKeys=h.default;var g=Da();K.pascalKeys=g.default;var y=Ma();K.kebabKeys=y.default;var p=c(function(E){return String(E||"").toLowerCase()},"toLowerCase");K.toLowerCase=p;var w=c(function(E){return String(E||"").toUpperCase()},"toUpperCase");K.toUpperCase=w;var k={toCamelCase:s.default,toSnakeCase:e.default,toPascalCase:t.default,toDotCase:n.default,toPathCase:r.default,toTextCase:i.default,toSentenceCase:o.default,toHeaderCase:a.default,toKebabCase:l.default,toUpperCase:w,toLowerCase:p,lowerKeys:u.default,upperKeys:f.default,camelKeys:d.default,snakeKeys:h.default,pascalKeys:g.default,kebabKeys:y.default};return K.default=k,K}c(ja,"requireLib");var Yn,jr;function _a(){return jr||(jr=1,Yn=ja()),Yn}c(_a,"requireJsConvertCase");var Fa=_a();const be={UPDATE:"update",DELETE:"delete",CREATE:"create"},te={INCOMING:"incoming",OUTGOING:"outgoing"},pe={[N.Integration]:{element:"integration",elements:"integrations",exportable:!1,exportCleanup:c(s=>({id:s.id,key:s.key,name:s.name,connectorId:s.connectorId,baseUri:s.baseUri,connectorVersion:s.connectorVersion}),"exportCleanup")},[N.Connector]:{element:"connector",elements:"connectors",exportable:!1},[N.Action]:{element:"action",elements:"actions",integrationSpecific:!0,exportCleanup:c(s=>(delete s.integration,s),"exportCleanup")},[N.AppDataSchema]:{element:"appDataSchema",elements:"appDataSchemas"},[N.AppEventType]:{element:"appEventType",elements:"appEventTypes"},[N.DataLinkTable]:{element:"dataLinkTable",elements:"dataLinkTables"},[N.DataSource]:{element:"dataSource",elements:"dataSources",parentKey:"universalDataSourceId",integrationSpecific:!0},[N.FieldMapping]:{element:"fieldMapping",elements:"fieldMappings",integrationSpecific:!0,parentKey:"universalFieldMappingId",exportCleanup:c(s=>(delete s.dataSourceId,s),"exportCleanup")},[N.Flow]:{element:"flow",elements:"flows",integrationSpecific:!0,parentKey:"universalFlowId"},[N.Package]:{element:"package",elements:"packages",integrationSpecific:!0}},Ka=["id","workspaceId","integrationId","createdAt","updatedAt","revision","archivedAt","baseUri","state","appliedToIntegrations","dependencies"],_r=[N.Action,N.FieldMapping,N.Flow,N.DataSource,N.Package];class z{static{c(this,"Element")}type;key;integrationKey;data;constructor(e,t,n,r){if(!r)throw new Error("Element must always contain data");if(!t)throw new Error("Element must have a key");this.type=e,this.key=t,this.data=r,this.integrationKey=n||z.extractIntegrationKey(r)}get id(){return z.makeId(this.type,this.key,this.integrationKey)}get dirPath(){const e=ye[this.type].apiPath;if(this.integrationKey){const t=ye[N.Integration].apiPath;return x.join(t,this.integrationKey,e,this.key)}return x.join(e,this.key)}get path(){return x.join(this.dirPath,"spec.yaml")}get relativePath(){return x.relative(ie(process.cwd()),this.path)}get absolutePath(){return x.resolve(x.join(ie(process.cwd()),this.path))}isEqual(e){if(this.id!==e.id)return!1;const t=this.clean(),n=e.clean();return Jo(t,n)}hasParent(){if(this.data?.parentUuid)return!0;const e=this.getParentKey();return!!e&&!!this.data?.[e]}clean(){const e={...this.data};return Ka.forEach(t=>{delete e[t]}),Object.keys(e).forEach(t=>{t.match(/universal.*Revision/)&&delete e[t]}),e}getParentKey(){let e="parentId";return pe?.[this.type]?.parentKey&&(e=pe?.[this.type]?.parentKey),e}static new(e,t,n,r){return new z(e,t,n,r)}static fromData(e,t){if(!t?.key)throw new Error(`Element missing key: ${JSON.stringify(t)}`);const n=this.extractIntegrationKey(t);return new z(e,t.key,n,t)}static fromPathAndData(e,t){const n=z.parsePath(e);if(!t)return;const r=t?.key||n?.key;return n?z.new(n.type,r,n.integrationKey,t):void 0}static fromElement(e){return new z(e.type,e.key,e.integrationKey,{...e.data})}static idFromPath(e){const t=z.parsePath(e);if(t)return z.makeId(t.type,t.key,t.integrationKey)}static makeId(e,t,n){return e===N.Integration?`${e}:${t}`:z.isIntegrationSpecific(e)?`${n||"universal"}:${e}:${t}`:`${e}:${t}`}static parsePath(e){const t=this.getRelativePath(e);if(!this.isElementFile(t))return;const n=Object.values(ye).map(l=>l.apiPath).join("|"),r=new RegExp(`^(?<elementType>${n})/(?<elementKey>[^/]+)/spec\\.ya?ml$`),i=t.match(r);if(i?.groups){const{elementType:l,elementKey:u}=i.groups,f=this.getElementTypeFromPath(l);if(f)return{type:f,key:u}}const o=new RegExp(`^integrations/(?<integrationKey>[^/]+)/(?<elementType>${n})/(?<elementKey>[^/]+)/spec\\.ya?ml$`),a=t.match(o);if(a?.groups){const{integrationKey:l,elementType:u,elementKey:f}=a.groups,d=this.getElementTypeFromPath(u);if(d)return{type:d,key:f,integrationKey:l}}}static extractIntegrationKey(e){return e?.integrationKey||e?.integration?.key||e?.integration_key||void 0}static isElementFile(e){return e.endsWith(".yml")||e.endsWith(".yaml")}static getElementTypeFromPath(e){return Object.values(N).find(t=>ye[t].apiPath===e)}static getRelativePath(e){return x.relative(ie(process.cwd()),e)}static isIntegrationSpecific(e){return _r.includes(e)}static canBeIntegrationSpecific(e){return _r.includes(e)}}class Fr{static{c(this,"BaseWorkspaceElementsRepository")}constructor(e){this.cache=e}connectorsMapping;sourceCache;setConnectorsMapping(e){this.connectorsMapping=e}setSourceCache(e){this.sourceCache=e}async getElements(){const e=[];try{const t=await this.getIntegrations();e.push(...t);const n=[N.Integration,N.Connector],r=Object.keys(pe),i=await Promise.all(r.filter(o=>!n.includes(o)).map(async o=>this.getElementsByType(o,t)));for(const o of i)e.push(...o)}catch(t){throw b.error(`Failed to get elements: ${t}`),t}return e}async putElement(e){let t=this.cache.get(e.id);return t&&!e.data.id&&t.data.id&&(e.data.id=t.data.id),!t&&e.data.id&&(t=await this.getByInternalId(e.data.id,e.type,!1)),e.data.id&&t?t=await this.updateElement(e,t,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping,sourceElements:this.sourceCache?.getAll()}):t=await this.createElement(e,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping,sourceElements:this.sourceCache?.getAll()}),t}async getElementsByType(e,t){return[]}async createElement(e,t){return e}async updateElement(e,t,n){return t}async getElement(e){}async getIntegrations(){return[]}async getByInternalId(e,t,n=!0){}async deleteElement(e,t){}}function Zn(s,e=!0){if(O.existsSync(s))try{const t=O.readFileSync(s,"utf8");return ue.load(t)||void 0}catch(t){if(!e)return;if(t instanceof Error){const n=x.relative(process.cwd(),s);throw new Error(`Failed to parse YAML file "${n}": ${t.message}`)}throw t}}c(Zn,"readYaml$1");function Ba(s,e,t){try{const n=ue.dump(e,t);O.writeFileSync(s,n,"utf8")}catch(n){if(n instanceof Error){const r=x.relative(process.cwd(),s);throw new Error(`Failed to write YAML file "${r}": ${n.message}`)}throw n}}c(Ba,"writeYaml$1");class qa extends Fr{static{c(this,"LocalWorkspaceElementsRepository")}basePath;constructor(e){super(e),this.basePath=ie(process.cwd())}async getElementsByType(e,t){const n=[],r=x.join(this.basePath,ye[e].apiPath),i=await this.readElementsInDir(r);n.push(...i);for(const o of t){const a=x.join(this.basePath,ye[N.Integration].apiPath,o.key,ye[e].apiPath),l=await this.readElementsInDir(a);n.push(...l)}return n.length>0&&b.debug(`[local] Fetched ${n.length} ${e}${n.length!==1?"s":""}`),n}async getElement(e){return this.readElement(e.path)}async createElement(e){return this.updateElement(e,e)}async updateElement(e,t){if(!e.data)throw new Error("Element must have data to write");const n=x.join(this.basePath,t.dirPath),r=x.join(this.basePath,t.path);return O.existsSync(n)||O.mkdirSync(n,{recursive:!0}),Ba(r,e.data),b.debug(`[local] Written ${t.relativePath}`),t}async deleteElement(e){const t=x.join(this.basePath,e.path),n=x.join(this.basePath,e.dirPath);O.existsSync(t)&&O.rmSync(t,{force:!0}),this.pruneEmptyDir(n),b.debug(`[local] Deleted ${e.relativePath}`)}async getIntegrations(){const e=x.join(this.basePath,ye[N.Integration].apiPath);return this.readElementsInDir(e)}async readElement(e){const t=Zn(e);if(t)return z.fromPathAndData(e,t)}async readElementsInDir(e){const t=[];if(!O.existsSync(e))return t;const n=O.readdirSync(e);if(n.length===0)return t;const r=n.map(async o=>{const a=x.join(e,o,"spec.yaml");return this.readElement(a)});return(await Promise.all(r)).filter(o=>o!=null)}pruneEmptyDir(e){try{if(!e.startsWith(this.basePath)||e===this.basePath||!O.existsSync(e)||O.readdirSync(e).length>0)return;O.rmdirSync(e),this.pruneEmptyDir(x.dirname(e))}catch(t){console.warn(`Failed to prune empty directory ${e}:`,t)}}}class Ua extends Fr{static{c(this,"RemoteWorkspaceElementsRepository")}async getElementsByType(e,t){const n=z.canBeIntegrationSpecific(e),r=await this.findAll(e,n?{layer:"universal"}:{});if(!z.canBeIntegrationSpecific(e))return r;for(const i of t){const o=i.key,a=i.data.id,l=await this.findAll(e,a?{integrationId:a}:{integrationKey:o},o);r.push(...l)}return r.length>0&&b.debug(`[remote] Fetched ${r.length} ${e}${r.length!==1?"s":""}`),r}async getElement(e){const t=await D.withClient(n=>n[pe[e.type].element](e.data.id).get());return z.fromData(e.type,t)}async createElement(e,t){const n=e.clean();if(this.transformElementForCreate(e,n,t),e.hasParent()&&n.integrationId&&!n.isCustomized){const o=e.getParentKey(),a=new Set(["uuid","integrationId",o,"meta","integrationUuid","parentUuid"]);Object.keys(n).forEach(l=>{a.has(l)||delete n[l]})}const r=await D.withClient(o=>o[pe[e.type].elements].create(n)),i=z.fromData(e.type,r);return b.debug(`[remote] Created ${i.id}`),i}async updateElement(e,t,n){if(!e.data.id)throw new Error("Element must have an id to update");t.data.archivedAt&&await D.withClient(a=>a[pe[e.type].element](t.data.id).restore());const r=e.clean();if(this.transformElementForUpdate(e,r,n),e.hasParent()&&r.integrationId&&!r.isCustomized)return b.debug(`[remote] Skipped update for ${t.id} (non-customized)`),t;const i=await D.withClient(a=>a[pe[e.type].element](t.data.id).put(r)),o=z.fromData(t.type,i);return b.debug(`[remote] Updated ${t.id}`),o}async deleteElement(e){if(!e.data.id)throw new Error("Element must have an id to delete");await D.withClient(t=>t[pe[e.type].element](e.data.id).archive()),b.debug(`[remote] Deleted ${e.id}`)}async getIntegrations(){const e=await D.withClient(n=>n.integrations.findAll());if(!e)return[];const t=e.map(n=>z.fromData(N.Integration,n));return t.length>0&&b.debug(`[remote] Fetched ${t.length} integrations`),t}async getByInternalId(e,t){let n;if(n=await D.withClient(r=>r[pe[t].element](e).get(),!1),!!n)return z.fromData(t,n)}transformElementForCreate(e,t,n){if(e.integrationKey){const r=n.elements.find(i=>i.type===N.Integration&&i.key===e.integrationKey);if(r)t.integrationId=r.data.id;else throw new Error(`Dependency integration ${e.integrationKey} not found for ${e.id}`)}if(e.type===N.Integration){const r=n.connectorsMapping?.[t.connectorId];r&&(t.connectorId=r)}this.transformPackageDependencies(e,t,n),this.transformParentDependency(e,t,n)}transformElementForUpdate(e,t,n){if(e.type===N.Integration){const r=n.connectorsMapping?.[t.connectorId];r&&(t.connectorId=r)}if(e.integrationKey){t.integrationKey=e.integrationKey;const r=n.elements.find(i=>i.type===N.Integration&&i.key===e.integrationKey);if(r)t.integrationId=r.data.id;else throw new Error(`Dependency integration ${e.integrationKey} not found for ${e.id}`)}this.transformPackageDependencies(e,t,n),this.transformParentDependency(e,t,n)}transformPackageDependencies(e,t,n){if(e.type!==N.Package||!t.elements)return;const r=t.elements.map(i=>{const a=(n.sourceElements||n.elements).find(u=>u.data.id===i.id&&u.type===i.type);if(!a)throw new Error(`Package element ${i.type} with id ${i.id} not found in source workspace for package ${e.id}`);const l=n.elements.find(u=>u.type===i.type&&u.key===a.key&&u.integrationKey===a.integrationKey);if(!l)throw new Error(`Package element ${i.type} with key ${a.key} not found in target workspace for package ${e.id}`);return{id:l.data.id,type:i.type}});t.elements=r}transformParentDependency(e,t,n){if(!e.hasParent())return;const r=e.getParentKey();if(!r)return;const i=n.elements.find(o=>o.type===e.type&&o.key===e.key&&!o.hasParent());if(i)t[r]=i.data.id;else throw new Error(`Parent ${e.getParentKey()} not found for ${e.id}`)}async findAll(e,t={},n){const r=await D.withClient(i=>i[pe[e].elements].findAll(t));return r?r.filter(i=>i.key).map(i=>(n&&!i.integrationKey&&(i.integrationKey=n),z.fromData(e,i))):[]}}const Qn=Symbol.for("yaml.alias"),Xn=Symbol.for("yaml.document"),Te=Symbol.for("yaml.map"),Kr=Symbol.for("yaml.pair"),me=Symbol.for("yaml.scalar"),nt=Symbol.for("yaml.seq"),oe=Symbol.for("yaml.node.type"),Ie=c(s=>!!s&&typeof s=="object"&&s[oe]===Qn,"isAlias"),Fe=c(s=>!!s&&typeof s=="object"&&s[oe]===Xn,"isDocument"),st=c(s=>!!s&&typeof s=="object"&&s[oe]===Te,"isMap"),W=c(s=>!!s&&typeof s=="object"&&s[oe]===Kr,"isPair"),U=c(s=>!!s&&typeof s=="object"&&s[oe]===me,"isScalar$1"),rt=c(s=>!!s&&typeof s=="object"&&s[oe]===nt,"isSeq");function V(s){if(s&&typeof s=="object")switch(s[oe]){case Te:case nt:return!0}return!1}c(V,"isCollection$1");function G(s){if(s&&typeof s=="object")switch(s[oe]){case Qn:case Te:case me:case nt:return!0}return!1}c(G,"isNode");const Br=c(s=>(U(s)||V(s))&&!!s.anchor,"hasAnchor"),ne=Symbol("break visit"),qr=Symbol("skip children"),ge=Symbol("remove node");function Ke(s,e){const t=Ur(e);Fe(s)?it(null,s.contents,t,Object.freeze([s]))===ge&&(s.contents=null):it(null,s,t,Object.freeze([]))}c(Ke,"visit$1"),Ke.BREAK=ne,Ke.SKIP=qr,Ke.REMOVE=ge;function it(s,e,t,n){const r=Jr(s,e,t,n);if(G(r)||W(r))return Wr(s,n,r),it(s,r,t,n);if(typeof r!="symbol"){if(V(e)){n=Object.freeze(n.concat(e));for(let i=0;i<e.items.length;++i){const o=it(i,e.items[i],t,n);if(typeof o=="number")i=o-1;else{if(o===ne)return ne;o===ge&&(e.items.splice(i,1),i-=1)}}}else if(W(e)){n=Object.freeze(n.concat(e));const i=it("key",e.key,t,n);if(i===ne)return ne;i===ge&&(e.key=null);const o=it("value",e.value,t,n);if(o===ne)return ne;o===ge&&(e.value=null)}}return r}c(it,"visit_");async function Yt(s,e){const t=Ur(e);Fe(s)?await ot(null,s.contents,t,Object.freeze([s]))===ge&&(s.contents=null):await ot(null,s,t,Object.freeze([]))}c(Yt,"visitAsync"),Yt.BREAK=ne,Yt.SKIP=qr,Yt.REMOVE=ge;async function ot(s,e,t,n){const r=await Jr(s,e,t,n);if(G(r)||W(r))return Wr(s,n,r),ot(s,r,t,n);if(typeof r!="symbol"){if(V(e)){n=Object.freeze(n.concat(e));for(let i=0;i<e.items.length;++i){const o=await ot(i,e.items[i],t,n);if(typeof o=="number")i=o-1;else{if(o===ne)return ne;o===ge&&(e.items.splice(i,1),i-=1)}}}else if(W(e)){n=Object.freeze(n.concat(e));const i=await ot("key",e.key,t,n);if(i===ne)return ne;i===ge&&(e.key=null);const o=await ot("value",e.value,t,n);if(o===ne)return ne;o===ge&&(e.value=null)}}return r}c(ot,"visitAsync_");function Ur(s){return typeof s=="object"&&(s.Collection||s.Node||s.Value)?Object.assign({Alias:s.Node,Map:s.Node,Scalar:s.Node,Seq:s.Node},s.Value&&{Map:s.Value,Scalar:s.Value,Seq:s.Value},s.Collection&&{Map:s.Collection,Seq:s.Collection},s):s}c(Ur,"initVisitor");function Jr(s,e,t,n){if(typeof t=="function")return t(s,e,n);if(st(e))return t.Map?.(s,e,n);if(rt(e))return t.Seq?.(s,e,n);if(W(e))return t.Pair?.(s,e,n);if(U(e))return t.Scalar?.(s,e,n);if(Ie(e))return t.Alias?.(s,e,n)}c(Jr,"callVisitor");function Wr(s,e,t){const n=e[e.length-1];if(V(n))n.items[s]=t;else if(W(n))s==="key"?n.key=t:n.value=t;else if(Fe(n))n.contents=t;else{const r=Ie(n)?"alias":"scalar";throw new Error(`Cannot replace node with ${r} parent`)}}c(Wr,"replaceNode");const Ja={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},Wa=c(s=>s.replace(/[!,[\]{}]/g,e=>Ja[e]),"escapeTagName");class ee{static{c(this,"Directives")}constructor(e,t){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},ee.defaultYaml,e),this.tags=Object.assign({},ee.defaultTags,t)}clone(){const e=new ee(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){const e=new ee(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:ee.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},ee.defaultTags);break}return e}add(e,t){this.atNextDocument&&(this.yaml={explicit:ee.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},ee.defaultTags),this.atNextDocument=!1);const n=e.trim().split(/[ \t]+/),r=n.shift();switch(r){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;const[i,o]=n;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;const[i]=n;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{const o=/^\d+\.\d+$/.test(i);return t(6,`Unsupported YAML version ${i}`,o),!1}}default:return t(0,`Unknown directive ${r}`,!0),!1}}tagName(e,t){if(e==="!")return"!";if(e[0]!=="!")return t(`Not a valid tag: ${e}`),null;if(e[1]==="<"){const o=e.slice(2,-1);return o==="!"||o==="!!"?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==">"&&t("Verbatim tags must end with a >"),o)}const[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);const i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(o){return t(String(o)),null}return n==="!"?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(const[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+Wa(e.substring(n.length));return e[0]==="!"?e:`!<${e}>`}toString(e){const t=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags);let r;if(e&&n.length>0&&G(e.contents)){const i={};Ke(e.contents,(o,a)=>{G(a)&&a.tag&&(i[a.tag]=!0)}),r=Object.keys(i)}else r=[];for(const[i,o]of n)i==="!!"&&o==="tag:yaml.org,2002:"||(!e||r.some(a=>a.startsWith(o)))&&t.push(`%TAG ${i} ${o}`);return t.join(`
|
|
10
|
-
`)
|
|
11
|
-
`)?
|
|
12
|
-
`)
|
|
13
|
-
`+Se(t,e):(s.endsWith(" ")?"":" ")+t,"lineComment"),Zr="flow",ts="block",en="quoted";function tn(s,e,t="flow",{indentAtStart:n,lineWidth:r=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!r||r<0)return s;r<i&&(i=0);const l=Math.max(1+i,1+r-e.length);if(s.length<=l)return s;const u=[],f={};let d=r-e.length;typeof n=="number"&&(n>r-Math.max(2,i)?u.push(0):d=r-n);let h,g,y=!1,p=-1,w=-1,k=-1;t===ts&&(p=Qr(s,p,e.length),p!==-1&&(d=p+l));for(let A;A=s[p+=1];){if(t===en&&A==="\\"){switch(w=p,s[p+1]){case"x":p+=3;break;case"u":p+=5;break;case"U":p+=9;break;default:p+=1}k=p}if(A===`
|
|
14
|
-
`)t===ts&&(p=Qr(s,p,e.length)),d=p+e.length+l,h=void 0;else{if(A===" "&&g&&g!==" "&&g!==`
|
|
15
|
-
`&&g!==" "){const I=s[p+1];I&&I!==" "&&I!==`
|
|
16
|
-
`&&I!==" "&&(h=p)}if(p>=d)if(h)u.push(h),d=h+l,h=void 0;else if(t===en){for(;g===" "||g===" ";)g=A,A=s[p+=1],y=!0;const I=p>k+1?p-2:w-1;if(f[I])return s;u.push(I),f[I]=!0,d=I+l,h=void 0}else y=!0}g=A}if(y&&a&&a(),u.length===0)return s;o&&o();let E=s.slice(0,u[0]);for(let A=0;A<u.length;++A){const I=u[A],P=u[A+1]||s.length;I===0?E=`
|
|
17
|
-
${e}${s.slice(0,P)}`:(t===en&&f[I]&&(E+=`${s[I]}\\`),E+=`
|
|
18
|
-
${e}${s.slice(I+1,P)}`)}return E}c(tn,"foldFlowLines");function Qr(s,e,t){let n=e,r=e+1,i=s[r];for(;i===" "||i===" ";)if(e<r+t)i=s[++e];else{do i=s[++e];while(i&&i!==`
|
|
19
|
-
`);n=e,r=e+1,i=s[r]}return n}c(Qr,"consumeMoreIndentedLines");const nn=c((s,e)=>({indentAtStart:e?s.indent.length:s.indentAtStart,lineWidth:s.options.lineWidth,minContentWidth:s.options.minContentWidth}),"getFoldOptions"),sn=c(s=>/^(%|---|\.\.\.)/m.test(s),"containsDocumentMarker");function Ya(s,e,t){if(!e||e<0)return!1;const n=e-t,r=s.length;if(r<=n)return!1;for(let i=0,o=0;i<r;++i)if(s[i]===`
|
|
20
|
-
`){if(i-o>n)return!0;if(o=i+1,r-o<=n)return!1}return!0}c(Ya,"lineLengthOverLimit");function Tt(s,e){const t=JSON.stringify(s);if(e.options.doubleQuotedAsJSON)return t;const{implicitKey:n}=e,r=e.options.doubleQuotedMinMultiLineLength,i=e.indent||(sn(s)?" ":"");let o="",a=0;for(let l=0,u=t[l];u;u=t[++l])if(u===" "&&t[l+1]==="\\"&&t[l+2]==="n"&&(o+=t.slice(a,l)+"\\ ",l+=1,a=l,u="\\"),u==="\\")switch(t[l+1]){case"u":{o+=t.slice(a,l);const f=t.substr(l+2,4);switch(f){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:f.substr(0,2)==="00"?o+="\\x"+f.substr(2):o+=t.substr(l,6)}l+=5,a=l+1}break;case"n":if(n||t[l+2]==='"'||t.length<r)l+=1;else{for(o+=t.slice(a,l)+`
|
|
21
|
-
|
|
22
|
-
`;t[l+2]==="\\"&&t[l+3]==="n"&&t[l+4]!=='"';)o+=`
|
|
23
|
-
`,l+=2;o+=i,t[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+t.slice(a):t,n?o:tn(o,i,en,nn(e,!1))}c(Tt,"doubleQuotedString");function ns(s,e){if(e.options.singleQuote===!1||e.implicitKey&&s.includes(`
|
|
24
|
-
`)||/[ \t]\n|\n[ \t]/.test(s))return Tt(s,e);const t=e.indent||(sn(s)?" ":""),n="'"+s.replace(/'/g,"''").replace(/\n+/g,`$&
|
|
25
|
-
${t}`)+"'";return e.implicitKey?n:tn(n,t,Zr,nn(e,!1))}c(ns,"singleQuotedString");function ct(s,e){const{singleQuote:t}=e.options;let n;if(t===!1)n=Tt;else{const r=s.includes('"'),i=s.includes("'");r&&!i?n=ns:i&&!r?n=Tt:n=t?ns:Tt}return n(s,e)}c(ct,"quotedString");let ss;try{ss=new RegExp(`(^|(?<!
|
|
26
|
-
))
|
|
27
|
-
+(?!
|
|
28
|
-
|$)`,"g")}catch{ss=/\n+(?!\n|$)/g}function rn({comment:s,type:e,value:t},n,r,i){const{blockQuote:o,commentString:a,lineWidth:l}=n.options;if(!o||/\n[\t ]+$/.test(t)||/^\s*$/.test(t))return ct(t,n);const u=n.indent||(n.forceBlockIndent||sn(t)?" ":""),f=o==="literal"?!0:o==="folded"||e===L.BLOCK_FOLDED?!1:e===L.BLOCK_LITERAL?!0:!Ya(t,l,u.length);if(!t)return f?`|
|
|
29
|
-
`:`>
|
|
30
|
-
`;let d,h;for(h=t.length;h>0;--h){const P=t[h-1];if(P!==`
|
|
31
|
-
`&&P!==" "&&P!==" ")break}let g=t.substring(h);const y=g.indexOf(`
|
|
32
|
-
`);y===-1?d="-":t===g||y!==g.length-1?(d="+",i&&i()):d="",g&&(t=t.slice(0,-g.length),g[g.length-1]===`
|
|
33
|
-
`&&(g=g.slice(0,-1)),g=g.replace(ss,`$&${u}`));let p=!1,w,k=-1;for(w=0;w<t.length;++w){const P=t[w];if(P===" ")p=!0;else if(P===`
|
|
34
|
-
`)k=w;else break}let E=t.substring(0,k<w?k+1:w);E&&(t=t.substring(E.length),E=E.replace(/\n+/g,`$&${u}`));let I=(p?u?"2":"1":"")+d;if(s&&(I+=" "+a(s.replace(/ ?[\r\n]+/g," ")),r&&r()),!f){const P=t.replace(/\n+/g,`
|
|
35
|
-
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${u}`);let R=!1;const J=nn(n,!0);o!=="folded"&&e!==L.BLOCK_FOLDED&&(J.onOverflow=()=>{R=!0});const $=tn(`${E}${P}${g}`,u,ts,J);if(!R)return`>${I}
|
|
36
|
-
${u}${$}`}return t=t.replace(/\n+/g,`$&${u}`),`|${I}
|
|
37
|
-
${u}${E}${t}${g}`}c(rn,"blockString");function Za(s,e,t,n){const{type:r,value:i}=s,{actualString:o,implicitKey:a,indent:l,indentStep:u,inFlow:f}=e;if(a&&i.includes(`
|
|
38
|
-
`)||f&&/[[\]{},]/.test(i))return ct(i,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||f||!i.includes(`
|
|
39
|
-
`)?ct(i,e):rn(s,e,t,n);if(!a&&!f&&r!==L.PLAIN&&i.includes(`
|
|
40
|
-
`))return rn(s,e,t,n);if(sn(i)){if(l==="")return e.forceBlockIndent=!0,rn(s,e,t,n);if(a&&l===u)return ct(i,e)}const d=i.replace(/\n+/g,`$&
|
|
41
|
-
${l}`);if(o){const h=c(p=>p.default&&p.tag!=="tag:yaml.org,2002:str"&&p.test?.test(d),"test"),{compat:g,tags:y}=e.doc.schema;if(y.some(h)||g?.some(h))return ct(i,e)}return a?d:tn(d,l,Zr,nn(e,!1))}c(Za,"plainString");function It(s,e,t,n){const{implicitKey:r,inFlow:i}=e,o=typeof s.value=="string"?s:Object.assign({},s,{value:String(s.value)});let{type:a}=s;a!==L.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=L.QUOTE_DOUBLE);const l=c(f=>{switch(f){case L.BLOCK_FOLDED:case L.BLOCK_LITERAL:return r||i?ct(o.value,e):rn(o,e,t,n);case L.QUOTE_DOUBLE:return Tt(o.value,e);case L.QUOTE_SINGLE:return ns(o.value,e);case L.PLAIN:return Za(o,e,t,n);default:return null}},"_stringify");let u=l(a);if(u===null){const{defaultKeyType:f,defaultStringType:d}=e.options,h=r&&f||d;if(u=l(h),u===null)throw new Error(`Unsupported default string type ${h}`)}return u}c(It,"stringifyString");function Xr(s,e){const t=Object.assign({blockQuote:!0,commentString:Ha,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},s.schema.toStringOptions,e);let n;switch(t.collectionStyle){case"block":n=!1;break;case"flow":n=!0;break;default:n=null}return{anchors:new Set,doc:s,flowCollectionPadding:t.flowCollectionPadding?" ":"",indent:"",indentStep:typeof t.indent=="number"?" ".repeat(t.indent):" ",inFlow:n,options:t}}c(Xr,"createStringifyContext");function Qa(s,e){if(e.tag){const r=s.filter(i=>i.tag===e.tag);if(r.length>0)return r.find(i=>i.format===e.format)??r[0]}let t,n;if(U(e)){n=e.value;let r=s.filter(i=>i.identify?.(n));if(r.length>1){const i=r.filter(o=>o.test);i.length>0&&(r=i)}t=r.find(i=>i.format===e.format)??r.find(i=>!i.format)}else n=e,t=s.find(r=>r.nodeClass&&n instanceof r.nodeClass);if(!t){const r=n?.constructor?.name??(n===null?"null":typeof n);throw new Error(`Tag not resolved for ${r} value`)}return t}c(Qa,"getTagObject");function Xa(s,e,{anchors:t,doc:n}){if(!n.directives)return"";const r=[],i=(U(s)||V(s))&&s.anchor;i&&Vr(i)&&(t.add(i),r.push(`&${i}`));const o=s.tag??(e.default?null:e.tag);return o&&r.push(n.directives.tagString(o)),r.join(" ")}c(Xa,"stringifyProps");function lt(s,e,t,n){if(W(s))return s.toString(e,t,n);if(Ie(s)){if(e.doc.directives)return s.toString(e);if(e.resolvedAliases?.has(s))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(s):e.resolvedAliases=new Set([s]),s=s.resolve(e.doc)}let r;const i=G(s)?s:e.doc.createNode(s,{onTagObj:c(l=>r=l,"onTagObj")});r??(r=Qa(e.doc.schema.tags,i));const o=Xa(i,r,e);o.length>0&&(e.indentAtStart=(e.indentAtStart??0)+o.length+1);const a=typeof r.stringify=="function"?r.stringify(i,e,t,n):U(i)?It(i,e,t,n):i.toString(e,t,n);return o?U(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
|
|
42
|
-
${e.indent}${a}`:a}c(lt,"stringify$2");function ec({key:s,value:e},t,n,r){const{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:u,indentSeq:f,simpleKeys:d}}=t;let h=G(s)&&s.comment||null;if(d){if(h)throw new Error("With simple keys, key nodes cannot have comments");if(V(s)||!G(s)&&typeof s=="object"){const J="With simple keys, collection cannot be used as a key value";throw new Error(J)}}let g=!d&&(!s||h&&e==null&&!t.inFlow||V(s)||(U(s)?s.type===L.BLOCK_FOLDED||s.type===L.BLOCK_LITERAL:typeof s=="object"));t=Object.assign({},t,{allNullValues:!1,implicitKey:!g&&(d||!i),indent:a+l});let y=!1,p=!1,w=lt(s,t,()=>y=!0,()=>p=!0);if(!g&&!t.inFlow&&w.length>1024){if(d)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");g=!0}if(t.inFlow){if(i||e==null)return y&&n&&n(),w===""?"?":g?`? ${w}`:w}else if(i&&!d||e==null&&g)return w=`? ${w}`,h&&!y?w+=Be(w,t.indent,u(h)):p&&r&&r(),w;y&&(h=null),g?(h&&(w+=Be(w,t.indent,u(h))),w=`? ${w}
|
|
43
|
-
${a}:`):(w=`${w}:`,h&&(w+=Be(w,t.indent,u(h))));let k,E,A;G(e)?(k=!!e.spaceBefore,E=e.commentBefore,A=e.comment):(k=!1,E=null,A=null,e&&typeof e=="object"&&(e=o.createNode(e))),t.implicitKey=!1,!g&&!h&&U(e)&&(t.indentAtStart=w.length+1),p=!1,!f&&l.length>=2&&!t.inFlow&&!g&&rt(e)&&!e.flow&&!e.tag&&!e.anchor&&(t.indent=t.indent.substring(2));let I=!1;const P=lt(e,t,()=>I=!0,()=>p=!0);let R=" ";if(h||k||E){if(R=k?`
|
|
44
|
-
`:"",E){const J=u(E);R+=`
|
|
45
|
-
${Se(J,t.indent)}`}P===""&&!t.inFlow?R===`
|
|
46
|
-
`&&(R=`
|
|
47
|
-
|
|
48
|
-
`):R+=`
|
|
49
|
-
${t.indent}`}else if(!g&&V(e)){const J=P[0],$=P.indexOf(`
|
|
50
|
-
`),Y=$!==-1,Ee=t.inFlow??e.flow??e.items.length===0;if(Y||!Ee){let Ge=!1;if(Y&&(J==="&"||J==="!")){let Z=P.indexOf(" ");J==="&"&&Z!==-1&&Z<$&&P[Z+1]==="!"&&(Z=P.indexOf(" ",Z+1)),(Z===-1||$<Z)&&(Ge=!0)}Ge||(R=`
|
|
51
|
-
${t.indent}`)}}else(P===""||P[0]===`
|
|
52
|
-
`)&&(R="");return w+=R+P,t.inFlow?I&&n&&n():A&&!I?w+=Be(w,t.indent,u(A)):p&&r&&r(),w}c(ec,"stringifyPair");function ei(s,e){(s==="debug"||s==="warn")&&console.warn(e)}c(ei,"warn");const on="<<",Ce={identify:c(s=>s===on||typeof s=="symbol"&&s.description===on,"identify"),default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:c(()=>Object.assign(new L(Symbol(on)),{addToJSMap:ti}),"resolve"),stringify:c(()=>on,"stringify")},tc=c((s,e)=>(Ce.identify(e)||U(e)&&(!e.type||e.type===L.PLAIN)&&Ce.identify(e.value))&&s?.doc.schema.tags.some(t=>t.tag===Ce.tag&&t.default),"isMergeKey");function ti(s,e,t){if(t=s&&Ie(t)?t.resolve(s.doc):t,rt(t))for(const n of t.items)rs(s,e,n);else if(Array.isArray(t))for(const n of t)rs(s,e,n);else rs(s,e,t)}c(ti,"addMergeToJSMap");function rs(s,e,t){const n=s&&Ie(t)?t.resolve(s.doc):t;if(!st(n))throw new Error("Merge sources must be maps or map aliases");const r=n.toJSON(null,s,Map);for(const[i,o]of r)e instanceof Map?e.has(i)||e.set(i,o):e instanceof Set?e.add(i):Object.prototype.hasOwnProperty.call(e,i)||Object.defineProperty(e,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return e}c(rs,"mergeValue");function ni(s,e,{key:t,value:n}){if(G(t)&&t.addToJSMap)t.addToJSMap(s,e,n);else if(tc(s,t))ti(s,e,n);else{const r=ae(t,"",s);if(e instanceof Map)e.set(r,ae(n,r,s));else if(e instanceof Set)e.add(r);else{const i=nc(t,r,s),o=ae(n,i,s);i in e?Object.defineProperty(e,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):e[i]=o}}return e}c(ni,"addPairToJSMap");function nc(s,e,t){if(e===null)return"";if(typeof e!="object")return String(e);if(G(s)&&t?.doc){const n=Xr(t.doc,{});n.anchors=new Set;for(const i of t.anchors.keys())n.anchors.add(i.anchor);n.inFlow=!0,n.inStringifyKey=!0;const r=s.toString(n);if(!t.mapKeyWarned){let i=JSON.stringify(r);i.length>40&&(i=i.substring(0,36)+'..."'),ei(t.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${i}. Set mapAsMap: true to use object keys.`),t.mapKeyWarned=!0}return r}return JSON.stringify(e)}c(nc,"stringifyKey");function is(s,e,t){const n=kt(s,void 0,t),r=kt(e,void 0,t);return new X(n,r)}c(is,"createPair");class X{static{c(this,"Pair")}constructor(e,t=null){Object.defineProperty(this,oe,{value:Kr}),this.key=e,this.value=t}clone(e){let{key:t,value:n}=this;return G(t)&&(t=t.clone(e)),G(n)&&(n=n.clone(e)),new X(t,n)}toJSON(e,t){const n=t?.mapAsMap?new Map:{};return ni(t,n,this)}toString(e,t,n){return e?.doc?ec(this,e,t,n):JSON.stringify(this)}}function si(s,e,t){return(e.inFlow??s.flow?rc:sc)(s,e,t)}c(si,"stringifyCollection");function sc({comment:s,items:e},t,{blockItemPrefix:n,flowChars:r,itemIndent:i,onChompKeep:o,onComment:a}){const{indent:l,options:{commentString:u}}=t,f=Object.assign({},t,{indent:i,type:null});let d=!1;const h=[];for(let y=0;y<e.length;++y){const p=e[y];let w=null;if(G(p))!d&&p.spaceBefore&&h.push(""),an(t,h,p.commentBefore,d),p.comment&&(w=p.comment);else if(W(p)){const E=G(p.key)?p.key:null;E&&(!d&&E.spaceBefore&&h.push(""),an(t,h,E.commentBefore,d))}d=!1;let k=lt(p,f,()=>w=null,()=>d=!0);w&&(k+=Be(k,i,u(w))),d&&w&&(d=!1),h.push(n+k)}let g;if(h.length===0)g=r.start+r.end;else{g=h[0];for(let y=1;y<h.length;++y){const p=h[y];g+=p?`
|
|
53
|
-
${l}${p}`:`
|
|
54
|
-
`}}return s?(g+=`
|
|
55
|
-
`+Se(u(s),l),a&&a()):d&&o&&o(),g}c(sc,"stringifyBlockCollection");function rc({items:s},e,{flowChars:t,itemIndent:n}){const{indent:r,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=e;n+=i;const l=Object.assign({},e,{indent:n,inFlow:!0,type:null});let u=!1,f=0;const d=[];for(let y=0;y<s.length;++y){const p=s[y];let w=null;if(G(p))p.spaceBefore&&d.push(""),an(e,d,p.commentBefore,!1),p.comment&&(w=p.comment);else if(W(p)){const E=G(p.key)?p.key:null;E&&(E.spaceBefore&&d.push(""),an(e,d,E.commentBefore,!1),E.comment&&(u=!0));const A=G(p.value)?p.value:null;A?(A.comment&&(w=A.comment),A.commentBefore&&(u=!0)):p.value==null&&E?.comment&&(w=E.comment)}w&&(u=!0);let k=lt(p,l,()=>w=null);y<s.length-1&&(k+=","),w&&(k+=Be(k,n,a(w))),!u&&(d.length>f||k.includes(`
|
|
56
|
-
`))&&(u=!0),d.push(k),f=d.length}const{start:h,end:g}=t;if(d.length===0)return h+g;if(!u){const y=d.reduce((p,w)=>p+w.length+2,2);u=e.options.lineWidth>0&&y>e.options.lineWidth}if(u){let y=h;for(const p of d)y+=p?`
|
|
57
|
-
${i}${r}${p}`:`
|
|
58
|
-
`;return`${y}
|
|
59
|
-
${r}${g}`}else return`${h}${o}${d.join(" ")}${o}${g}`}c(rc,"stringifyFlowCollection");function an({indent:s,options:{commentString:e}},t,n,r){if(n&&r&&(n=n.replace(/^\n+/,"")),n){const i=Se(e(n),s);t.push(i.trimStart())}}c(an,"addCommentBefore");function qe(s,e){const t=U(e)?e.value:e;for(const n of s)if(W(n)&&(n.key===e||n.key===t||U(n.key)&&n.key.value===t))return n}c(qe,"findPair");class se extends Yr{static{c(this,"YAMLMap")}static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(Te,e),this.items=[]}static from(e,t,n){const{keepUndefined:r,replacer:i}=n,o=new this(e),a=c((l,u)=>{if(typeof i=="function")u=i.call(t,l,u);else if(Array.isArray(i)&&!i.includes(l))return;(u!==void 0||r)&&o.items.push(is(l,u,n))},"add");if(t instanceof Map)for(const[l,u]of t)a(l,u);else if(t&&typeof t=="object")for(const l of Object.keys(t))a(l,t[l]);return typeof e.sortMapEntries=="function"&&o.items.sort(e.sortMapEntries),o}add(e,t){let n;W(e)?n=e:!e||typeof e!="object"||!("key"in e)?n=new X(e,e?.value):n=new X(e.key,e.value);const r=qe(this.items,n.key),i=this.schema?.sortMapEntries;if(r){if(!t)throw new Error(`Key ${n.key} already set`);U(r.value)&&Hr(n.value)?r.value.value=n.value:r.value=n.value}else if(i){const o=this.items.findIndex(a=>i(n,a)<0);o===-1?this.items.push(n):this.items.splice(o,0,n)}else this.items.push(n)}delete(e){const t=qe(this.items,e);return t?this.items.splice(this.items.indexOf(t),1).length>0:!1}get(e,t){const r=qe(this.items,e)?.value;return(!t&&U(r)?r.value:r)??void 0}has(e){return!!qe(this.items,e)}set(e,t){this.add(new X(e,t),!0)}toJSON(e,t,n){const r=n?new n:t?.mapAsMap?new Map:{};t?.onCreate&&t.onCreate(r);for(const i of this.items)ni(t,r,i);return r}toString(e,t,n){if(!e)return JSON.stringify(this);for(const r of this.items)if(!W(r))throw new Error(`Map items must all be pairs; found ${JSON.stringify(r)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),si(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:n,onComment:t})}}const ut={collection:"map",default:!0,nodeClass:se,tag:"tag:yaml.org,2002:map",resolve(s,e){return st(s)||e("Expected a mapping for this tag"),s},createNode:c((s,e,t)=>se.from(s,e,t),"createNode")};class Oe extends Yr{static{c(this,"YAMLSeq")}static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(nt,e),this.items=[]}add(e){this.items.push(e)}delete(e){const t=cn(e);return typeof t!="number"?!1:this.items.splice(t,1).length>0}get(e,t){const n=cn(e);if(typeof n!="number")return;const r=this.items[n];return!t&&U(r)?r.value:r}has(e){const t=cn(e);return typeof t=="number"&&t<this.items.length}set(e,t){const n=cn(e);if(typeof n!="number")throw new Error(`Expected a valid index, not ${e}.`);const r=this.items[n];U(r)&&Hr(t)?r.value=t:this.items[n]=t}toJSON(e,t){const n=[];t?.onCreate&&t.onCreate(n);let r=0;for(const i of this.items)n.push(ae(i,String(r++),t));return n}toString(e,t,n){return e?si(this,e,{blockItemPrefix:"- ",flowChars:{start:"[",end:"]"},itemIndent:(e.indent||"")+" ",onChompKeep:n,onComment:t}):JSON.stringify(this)}static from(e,t,n){const{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t)){let o=0;for(let a of t){if(typeof r=="function"){const l=t instanceof Set?a:String(o++);a=r.call(t,l,a)}i.items.push(kt(a,void 0,n))}}return i}}function cn(s){let e=U(s)?s.value:s;return e&&typeof e=="string"&&(e=Number(e)),typeof e=="number"&&Number.isInteger(e)&&e>=0?e:null}c(cn,"asItemIndex");const ft={collection:"seq",default:!0,nodeClass:Oe,tag:"tag:yaml.org,2002:seq",resolve(s,e){return rt(s)||e("Expected a sequence for this tag"),s},createNode:c((s,e,t)=>Oe.from(s,e,t),"createNode")},ln={identify:c(s=>typeof s=="string","identify"),default:!0,tag:"tag:yaml.org,2002:str",resolve:c(s=>s,"resolve"),stringify(s,e,t,n){return e=Object.assign({actualString:!0},e),It(s,e,t,n)}},un={identify:c(s=>s==null,"identify"),createNode:c(()=>new L(null),"createNode"),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:c(()=>new L(null),"resolve"),stringify:c(({source:s},e)=>typeof s=="string"&&un.test.test(s)?s:e.options.nullStr,"stringify")},os={identify:c(s=>typeof s=="boolean","identify"),default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:c(s=>new L(s[0]==="t"||s[0]==="T"),"resolve"),stringify({source:s,value:e},t){if(s&&os.test.test(s)){const n=s[0]==="t"||s[0]==="T";if(e===n)return s}return e?t.options.trueStr:t.options.falseStr}};function fe({format:s,minFractionDigits:e,tag:t,value:n}){if(typeof n=="bigint")return String(n);const r=typeof n=="number"?n:Number(n);if(!isFinite(r))return isNaN(r)?".nan":r<0?"-.inf":".inf";let i=JSON.stringify(n);if(!s&&e&&(!t||t==="tag:yaml.org,2002:float")&&/^\d/.test(i)){let o=i.indexOf(".");o<0&&(o=i.length,i+=".");let a=e-(i.length-o-1);for(;a-- >0;)i+="0"}return i}c(fe,"stringifyNumber");const ri={identify:c(s=>typeof s=="number","identify"),default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:c(s=>s.slice(-3).toLowerCase()==="nan"?NaN:s[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,"resolve"),stringify:fe},ii={identify:c(s=>typeof s=="number","identify"),default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:c(s=>parseFloat(s),"resolve"),stringify(s){const e=Number(s.value);return isFinite(e)?e.toExponential():fe(s)}},oi={identify:c(s=>typeof s=="number","identify"),default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(s){const e=new L(parseFloat(s)),t=s.indexOf(".");return t!==-1&&s[s.length-1]==="0"&&(e.minFractionDigits=s.length-t-1),e},stringify:fe},fn=c(s=>typeof s=="bigint"||Number.isInteger(s),"intIdentify$2"),as=c((s,e,t,{intAsBigInt:n})=>n?BigInt(s):parseInt(s.substring(e),t),"intResolve$1");function ai(s,e,t){const{value:n}=s;return fn(n)&&n>=0?t+n.toString(e):fe(s)}c(ai,"intStringify$1");const ci={identify:c(s=>fn(s)&&s>=0,"identify"),default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:c((s,e,t)=>as(s,2,8,t),"resolve"),stringify:c(s=>ai(s,8,"0o"),"stringify")},li={identify:fn,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:c((s,e,t)=>as(s,0,10,t),"resolve"),stringify:fe},ui={identify:c(s=>fn(s)&&s>=0,"identify"),default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:c((s,e,t)=>as(s,2,16,t),"resolve"),stringify:c(s=>ai(s,16,"0x"),"stringify")},ic=[ut,ft,ln,un,os,ci,li,ui,ri,ii,oi];function fi(s){return typeof s=="bigint"||Number.isInteger(s)}c(fi,"intIdentify$1");const dn=c(({value:s})=>JSON.stringify(s),"stringifyJSON"),oc=[{identify:c(s=>typeof s=="string","identify"),default:!0,tag:"tag:yaml.org,2002:str",resolve:c(s=>s,"resolve"),stringify:dn},{identify:c(s=>s==null,"identify"),createNode:c(()=>new L(null),"createNode"),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:c(()=>null,"resolve"),stringify:dn},{identify:c(s=>typeof s=="boolean","identify"),default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:c(s=>s==="true","resolve"),stringify:dn},{identify:fi,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:c((s,e,{intAsBigInt:t})=>t?BigInt(s):parseInt(s,10),"resolve"),stringify:c(({value:s})=>fi(s)?s.toString():JSON.stringify(s),"stringify")},{identify:c(s=>typeof s=="number","identify"),default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:c(s=>parseFloat(s),"resolve"),stringify:dn}],ac={default:!0,tag:"",test:/^/,resolve(s,e){return e(`Unresolved plain scalar ${JSON.stringify(s)}`),s}},cc=[ut,ft].concat(oc,ac),cs={identify:c(s=>s instanceof Uint8Array,"identify"),default:!1,tag:"tag:yaml.org,2002:binary",resolve(s,e){if(typeof atob=="function"){const t=atob(s.replace(/[\n\r]/g,"")),n=new Uint8Array(t.length);for(let r=0;r<t.length;++r)n[r]=t.charCodeAt(r);return n}else return e("This environment does not support reading binary tags; either Buffer or atob is required"),s},stringify({comment:s,type:e,value:t},n,r,i){if(!t)return"";const o=t;let a;if(typeof btoa=="function"){let l="";for(let u=0;u<o.length;++u)l+=String.fromCharCode(o[u]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(e??(e=L.BLOCK_LITERAL),e!==L.QUOTE_DOUBLE){const l=Math.max(n.options.lineWidth-n.indent.length,n.options.minContentWidth),u=Math.ceil(a.length/l),f=new Array(u);for(let d=0,h=0;d<u;++d,h+=l)f[d]=a.substr(h,l);a=f.join(e===L.BLOCK_LITERAL?`
|
|
60
|
-
`:" ")}return It({comment:s,type:e,value:a},n,r,i)}};function di(s,e){if(rt(s))for(let t=0;t<s.items.length;++t){let n=s.items[t];if(!W(n)){if(st(n)){n.items.length>1&&e("Each pair must have its own sequence indicator");const r=n.items[0]||new X(new L(null));if(n.commentBefore&&(r.key.commentBefore=r.key.commentBefore?`${n.commentBefore}
|
|
61
|
-
${r.key.commentBefore}`:n.commentBefore),n.comment){const i=r.value??r.key;i.comment=i.comment?`${n.comment}
|
|
62
|
-
${i.comment}`:n.comment}n=r}s.items[t]=W(n)?n:new X(n)}}else e("Expected a sequence for this tag");return s}c(di,"resolvePairs");function hi(s,e,t){const{replacer:n}=t,r=new Oe(s);r.tag="tag:yaml.org,2002:pairs";let i=0;if(e&&Symbol.iterator in Object(e))for(let o of e){typeof n=="function"&&(o=n.call(e,String(i++),o));let a,l;if(Array.isArray(o))if(o.length===2)a=o[0],l=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){const u=Object.keys(o);if(u.length===1)a=u[0],l=o[a];else throw new TypeError(`Expected tuple with one key, not ${u.length} keys`)}else a=o;r.items.push(is(a,l,t))}return r}c(hi,"createPairs");const ls={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:di,createNode:hi};class wt extends Oe{static{c(this,"YAMLOMap")}constructor(){super(),this.add=se.prototype.add.bind(this),this.delete=se.prototype.delete.bind(this),this.get=se.prototype.get.bind(this),this.has=se.prototype.has.bind(this),this.set=se.prototype.set.bind(this),this.tag=wt.tag}toJSON(e,t){if(!t)return super.toJSON(e);const n=new Map;t?.onCreate&&t.onCreate(n);for(const r of this.items){let i,o;if(W(r)?(i=ae(r.key,"",t),o=ae(r.value,i,t)):i=ae(r,"",t),n.has(i))throw new Error("Ordered maps must not include duplicate keys");n.set(i,o)}return n}static from(e,t,n){const r=hi(e,t,n),i=new this;return i.items=r.items,i}}wt.tag="tag:yaml.org,2002:omap";const us={collection:"seq",identify:c(s=>s instanceof Map,"identify"),nodeClass:wt,default:!1,tag:"tag:yaml.org,2002:omap",resolve(s,e){const t=di(s,e),n=[];for(const{key:r}of t.items)U(r)&&(n.includes(r.value)?e(`Ordered maps must not include duplicate keys: ${r.value}`):n.push(r.value));return Object.assign(new wt,t)},createNode:c((s,e,t)=>wt.from(s,e,t),"createNode")};function pi({value:s,source:e},t){return e&&(s?mi:gi).test.test(e)?e:s?t.options.trueStr:t.options.falseStr}c(pi,"boolStringify");const mi={identify:c(s=>s===!0,"identify"),default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:c(()=>new L(!0),"resolve"),stringify:pi},gi={identify:c(s=>s===!1,"identify"),default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:c(()=>new L(!1),"resolve"),stringify:pi},lc={identify:c(s=>typeof s=="number","identify"),default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:c(s=>s.slice(-3).toLowerCase()==="nan"?NaN:s[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,"resolve"),stringify:fe},uc={identify:c(s=>typeof s=="number","identify"),default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:c(s=>parseFloat(s.replace(/_/g,"")),"resolve"),stringify(s){const e=Number(s.value);return isFinite(e)?e.toExponential():fe(s)}},fc={identify:c(s=>typeof s=="number","identify"),default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(s){const e=new L(parseFloat(s.replace(/_/g,""))),t=s.indexOf(".");if(t!==-1){const n=s.substring(t+1).replace(/_/g,"");n[n.length-1]==="0"&&(e.minFractionDigits=n.length)}return e},stringify:fe},Ot=c(s=>typeof s=="bigint"||Number.isInteger(s),"intIdentify");function hn(s,e,t,{intAsBigInt:n}){const r=s[0];if((r==="-"||r==="+")&&(e+=1),s=s.substring(e).replace(/_/g,""),n){switch(t){case 2:s=`0b${s}`;break;case 8:s=`0o${s}`;break;case 16:s=`0x${s}`;break}const o=BigInt(s);return r==="-"?BigInt(-1)*o:o}const i=parseInt(s,t);return r==="-"?-1*i:i}c(hn,"intResolve");function fs(s,e,t){const{value:n}=s;if(Ot(n)){const r=n.toString(e);return n<0?"-"+t+r.substr(1):t+r}return fe(s)}c(fs,"intStringify");const dc={identify:Ot,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:c((s,e,t)=>hn(s,2,2,t),"resolve"),stringify:c(s=>fs(s,2,"0b"),"stringify")},hc={identify:Ot,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:c((s,e,t)=>hn(s,1,8,t),"resolve"),stringify:c(s=>fs(s,8,"0"),"stringify")},pc={identify:Ot,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:c((s,e,t)=>hn(s,0,10,t),"resolve"),stringify:fe},mc={identify:Ot,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:c((s,e,t)=>hn(s,2,16,t),"resolve"),stringify:c(s=>fs(s,16,"0x"),"stringify")};class bt extends se{static{c(this,"YAMLSet")}constructor(e){super(e),this.tag=bt.tag}add(e){let t;W(e)?t=e:e&&typeof e=="object"&&"key"in e&&"value"in e&&e.value===null?t=new X(e.key,null):t=new X(e,null),qe(this.items,t.key)||this.items.push(t)}get(e,t){const n=qe(this.items,e);return!t&&W(n)?U(n.key)?n.key.value:n.key:n}set(e,t){if(typeof t!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);const n=qe(this.items,e);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new X(e))}toJSON(e,t){return super.toJSON(e,t,Set)}toString(e,t,n){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),t,n);throw new Error("Set items must all have null values")}static from(e,t,n){const{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t))for(let o of t)typeof r=="function"&&(o=r.call(t,o,o)),i.items.push(is(o,null,n));return i}}bt.tag="tag:yaml.org,2002:set";const ds={collection:"map",identify:c(s=>s instanceof Set,"identify"),nodeClass:bt,default:!1,tag:"tag:yaml.org,2002:set",createNode:c((s,e,t)=>bt.from(s,e,t),"createNode"),resolve(s,e){if(st(s)){if(s.hasAllNullValues(!0))return Object.assign(new bt,s);e("Set items must all have null values")}else e("Expected a mapping for this tag");return s}};function hs(s,e){const t=s[0],n=t==="-"||t==="+"?s.substring(1):s,r=c(o=>e?BigInt(o):Number(o),"num"),i=n.replace(/_/g,"").split(":").reduce((o,a)=>o*r(60)+r(a),r(0));return t==="-"?r(-1)*i:i}c(hs,"parseSexagesimal");function yi(s){let{value:e}=s,t=c(o=>o,"num");if(typeof e=="bigint")t=c(o=>BigInt(o),"num");else if(isNaN(e)||!isFinite(e))return fe(s);let n="";e<0&&(n="-",e*=t(-1));const r=t(60),i=[e%r];return e<60?i.unshift(0):(e=(e-i[0])/r,i.unshift(e%r),e>=60&&(e=(e-i[0])/r,i.unshift(e))),n+i.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}c(yi,"stringifySexagesimal");const wi={identify:c(s=>typeof s=="bigint"||Number.isInteger(s),"identify"),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:c((s,e,{intAsBigInt:t})=>hs(s,t),"resolve"),stringify:yi},bi={identify:c(s=>typeof s=="number","identify"),default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:c(s=>hs(s,!1),"resolve"),stringify:yi},pn={identify:c(s=>s instanceof Date,"identify"),default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(s){const e=s.match(pn.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");const[,t,n,r,i,o,a]=e.map(Number),l=e[7]?Number((e[7]+"00").substr(1,3)):0;let u=Date.UTC(t,n-1,r,i||0,o||0,a||0,l);const f=e[8];if(f&&f!=="Z"){let d=hs(f,!1);Math.abs(d)<30&&(d*=60),u-=6e4*d}return new Date(u)},stringify:c(({value:s})=>s?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??"","stringify")},Si=[ut,ft,ln,un,mi,gi,dc,hc,pc,mc,lc,uc,fc,cs,Ce,us,ls,ds,wi,bi,pn],Ci=new Map([["core",ic],["failsafe",[ut,ft,ln]],["json",cc],["yaml11",Si],["yaml-1.1",Si]]),vi={binary:cs,bool:os,float:oi,floatExp:ii,floatNaN:ri,floatTime:bi,int:li,intHex:ui,intOct:ci,intTime:wi,map:ut,merge:Ce,null:un,omap:us,pairs:ls,seq:ft,set:ds,timestamp:pn},gc={"tag:yaml.org,2002:binary":cs,"tag:yaml.org,2002:merge":Ce,"tag:yaml.org,2002:omap":us,"tag:yaml.org,2002:pairs":ls,"tag:yaml.org,2002:set":ds,"tag:yaml.org,2002:timestamp":pn};function ps(s,e,t){const n=Ci.get(e);if(n&&!s)return t&&!n.includes(Ce)?n.concat(Ce):n.slice();let r=n;if(!r)if(Array.isArray(s))r=[];else{const i=Array.from(Ci.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${i} or define customTags array`)}if(Array.isArray(s))for(const i of s)r=r.concat(i);else typeof s=="function"&&(r=s(r.slice()));return t&&(r=r.concat(Ce)),r.reduce((i,o)=>{const a=typeof o=="string"?vi[o]:o;if(!a){const l=JSON.stringify(o),u=Object.keys(vi).map(f=>JSON.stringify(f)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${u}`)}return i.includes(a)||i.push(a),i},[])}c(ps,"getTags");const yc=c((s,e)=>s.key<e.key?-1:s.key>e.key?1:0,"sortMapEntriesByKey");class An{static{c(this,"Schema")}constructor({compat:e,customTags:t,merge:n,resolveKnownTags:r,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(e)?ps(e,"compat"):e?ps(null,e):null,this.name=typeof i=="string"&&i||"core",this.knownTags=r?gc:{},this.tags=ps(t,this.name,n),this.toStringOptions=a??null,Object.defineProperty(this,Te,{value:ut}),Object.defineProperty(this,me,{value:ln}),Object.defineProperty(this,nt,{value:ft}),this.sortMapEntries=typeof o=="function"?o:o===!0?yc:null}clone(){const e=Object.create(An.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}}function wc(s,e){const t=[];let n=e.directives===!0;if(e.directives!==!1&&s.directives){const l=s.directives.toString(s);l?(t.push(l),n=!0):s.directives.docStart&&(n=!0)}n&&t.push("---");const r=Xr(s,e),{commentString:i}=r.options;if(s.commentBefore){t.length!==1&&t.unshift("");const l=i(s.commentBefore);t.unshift(Se(l,""))}let o=!1,a=null;if(s.contents){if(G(s.contents)){if(s.contents.spaceBefore&&n&&t.push(""),s.contents.commentBefore){const f=i(s.contents.commentBefore);t.push(Se(f,""))}r.forceBlockIndent=!!s.comment,a=s.contents.comment}const l=a?void 0:()=>o=!0;let u=lt(s.contents,r,()=>a=null,l);a&&(u+=Be(u,"",i(a))),(u[0]==="|"||u[0]===">")&&t[t.length-1]==="---"?t[t.length-1]=`--- ${u}`:t.push(u)}else t.push(lt(s.contents,r));if(s.directives?.docEnd)if(s.comment){const l=i(s.comment);l.includes(`
|
|
63
|
-
`)?(t.push("..."),t.push(Se(l,""))):t.push(`... ${l}`)}else t.push("...");else{let l=s.comment;l&&o&&(l=l.replace(/^\n+/,"")),l&&((!o||a)&&t[t.length-1]!==""&&t.push(""),t.push(Se(i(l),"")))}return t.join(`
|
|
64
|
-
`)+`
|
|
65
|
-
`}c(wc,"stringifyDocument");class St{static{c(this,"Document")}constructor(e,t,n){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,oe,{value:Xn});let r=null;typeof t=="function"||Array.isArray(t)?r=t:n===void 0&&t&&(n=t,t=void 0);const i=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},n);this.options=i;let{version:o}=i;n?._directives?(this.directives=n._directives.atDocument(),this.directives.yaml.explicit&&(o=this.directives.yaml.version)):this.directives=new ee({version:o}),this.setSchema(o,n),this.contents=e===void 0?null:this.createNode(e,r,n)}clone(){const e=Object.create(St.prototype,{[oe]:{value:Xn}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=G(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){dt(this.contents)&&this.contents.add(e)}addIn(e,t){dt(this.contents)&&this.contents.addIn(e,t)}createAlias(e,t){if(!e.anchor){const n=Gr(this);e.anchor=!t||n.has(t)?zr(t||"a",n):t}return new Zt(e.anchor)}createNode(e,t,n){let r;if(typeof t=="function")e=t.call({"":e},"",e),r=t;else if(Array.isArray(t)){const w=c(E=>typeof E=="number"||E instanceof String||E instanceof Number,"keyToStr"),k=t.filter(w).map(String);k.length>0&&(t=t.concat(k)),r=t}else n===void 0&&t&&(n=t,t=void 0);const{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:u,tag:f}=n??{},{onAnchor:d,setAnchors:h,sourceObjects:g}=Va(this,o||"a"),y={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:d,onTagObj:u,replacer:r,schema:this.schema,sourceObjects:g},p=kt(e,f,y);return a&&V(p)&&(p.flow=!0),h(),p}createPair(e,t,n={}){const r=this.createNode(e,null,n),i=this.createNode(t,null,n);return new X(r,i)}delete(e){return dt(this.contents)?this.contents.delete(e):!1}deleteIn(e){return Et(e)?this.contents==null?!1:(this.contents=null,!0):dt(this.contents)?this.contents.deleteIn(e):!1}get(e,t){return V(this.contents)?this.contents.get(e,t):void 0}getIn(e,t){return Et(e)?!t&&U(this.contents)?this.contents.value:this.contents:V(this.contents)?this.contents.getIn(e,t):void 0}has(e){return V(this.contents)?this.contents.has(e):!1}hasIn(e){return Et(e)?this.contents!==void 0:V(this.contents)?this.contents.hasIn(e):!1}set(e,t){this.contents==null?this.contents=Xt(this.schema,[e],t):dt(this.contents)&&this.contents.set(e,t)}setIn(e,t){Et(e)?this.contents=t:this.contents==null?this.contents=Xt(this.schema,Array.from(e),t):dt(this.contents)&&this.contents.setIn(e,t)}setSchema(e,t={}){typeof e=="number"&&(e=String(e));let n;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new ee({version:"1.1"}),n={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new ee({version:e}),n={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,n=null;break;default:{const r=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${r}`)}}if(t.schema instanceof Object)this.schema=t.schema;else if(n)this.schema=new An(Object.assign(n,t));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:t,mapAsMap:n,maxAliasCount:r,onAnchor:i,reviver:o}={}){const a={anchors:new Map,doc:this,keep:!e,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},l=ae(this.contents,t??"",a);if(typeof i=="function")for(const{count:u,res:f}of a.anchors.values())i(f,u);return typeof o=="function"?at(o,{"":l},"",l):l}toJSON(e,t){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:t})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){const t=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${t}`)}return wc(this,e)}}function dt(s){if(V(s))return!0;throw new Error("Expected a YAML collection as document contents")}c(dt,"assertCollection");class ms extends Error{static{c(this,"YAMLError")}constructor(e,t,n,r){super(),this.name=e,this.code=n,this.message=r,this.pos=t}}class Ue extends ms{static{c(this,"YAMLParseError")}constructor(e,t,n){super("YAMLParseError",e,t,n)}}class ki extends ms{static{c(this,"YAMLWarning")}constructor(e,t,n){super("YAMLWarning",e,t,n)}}const mn=c((s,e)=>t=>{if(t.pos[0]===-1)return;t.linePos=t.pos.map(a=>e.linePos(a));const{line:n,col:r}=t.linePos[0];t.message+=` at line ${n}, column ${r}`;let i=r-1,o=s.substring(e.lineStarts[n-1],e.lineStarts[n]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){const a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),n>1&&/^ *$/.test(o.substring(0,i))){let a=s.substring(e.lineStarts[n-2],e.lineStarts[n-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
|
|
66
|
-
`),o=a+o}if(/[^ ]/.test(o)){let a=1;const l=t.linePos[1];l&&l.line===n&&l.col>r&&(a=Math.max(1,Math.min(l.col-r,80-i)));const u=" ".repeat(i)+"^".repeat(a);t.message+=`:
|
|
67
|
-
|
|
68
|
-
${o}
|
|
69
|
-
${u}
|
|
70
|
-
`}},"prettifyError");function ht(s,{flow:e,indicator:t,next:n,offset:r,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,u=a,f=a,d="",h="",g=!1,y=!1,p=null,w=null,k=null,E=null,A=null,I=null,P=null;for(const $ of s)switch(y&&($.type!=="space"&&$.type!=="newline"&&$.type!=="comma"&&i($.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),y=!1),p&&(u&&$.type!=="comment"&&$.type!=="newline"&&i(p,"TAB_AS_INDENT","Tabs are not allowed as indentation"),p=null),$.type){case"space":!e&&(t!=="doc-start"||n?.type!=="flow-collection")&&$.source.includes(" ")&&(p=$),f=!0;break;case"comment":{f||i($,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");const Y=$.source.substring(1)||" ";d?d+=h+Y:d=Y,h="",u=!1;break}case"newline":u?d?d+=$.source:(!I||t!=="seq-item-ind")&&(l=!0):h+=$.source,u=!0,g=!0,(w||k)&&(E=$),f=!0;break;case"anchor":w&&i($,"MULTIPLE_ANCHORS","A node can have at most one anchor"),$.source.endsWith(":")&&i($.offset+$.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),w=$,P??(P=$.offset),u=!1,f=!1,y=!0;break;case"tag":{k&&i($,"MULTIPLE_TAGS","A node can have at most one tag"),k=$,P??(P=$.offset),u=!1,f=!1,y=!0;break}case t:(w||k)&&i($,"BAD_PROP_ORDER",`Anchors and tags must be after the ${$.source} indicator`),I&&i($,"UNEXPECTED_TOKEN",`Unexpected ${$.source} in ${e??"collection"}`),I=$,u=t==="seq-item-ind"||t==="explicit-key-ind",f=!1;break;case"comma":if(e){A&&i($,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),A=$,u=!1,f=!1;break}default:i($,"UNEXPECTED_TOKEN",`Unexpected ${$.type} token`),u=!1,f=!1}const R=s[s.length-1],J=R?R.offset+R.source.length:r;return y&&n&&n.type!=="space"&&n.type!=="newline"&&n.type!=="comma"&&(n.type!=="scalar"||n.source!=="")&&i(n.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),p&&(u&&p.indent<=o||n?.type==="block-map"||n?.type==="block-seq")&&i(p,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:A,found:I,spaceBefore:l,comment:d,hasNewline:g,anchor:w,tag:k,newlineAfterProp:E,end:J,start:P??J}}c(ht,"resolveProps");function At(s){if(!s)return null;switch(s.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(s.source.includes(`
|
|
71
|
-
`))return!0;if(s.end){for(const e of s.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(const e of s.items){for(const t of e.start)if(t.type==="newline")return!0;if(e.sep){for(const t of e.sep)if(t.type==="newline")return!0}if(At(e.key)||At(e.value))return!0}return!1;default:return!0}}c(At,"containsNewline");function gs(s,e,t){if(e?.type==="flow-collection"){const n=e.end[0];n.indent===s&&(n.source==="]"||n.source==="}")&&At(e)&&t(n,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}c(gs,"flowIndentCheck");function Ei(s,e,t){const{uniqueKeys:n}=s.options;if(n===!1)return!1;const r=typeof n=="function"?n:(i,o)=>i===o||U(i)&&U(o)&&i.value===o.value;return e.some(i=>r(i.key,t))}c(Ei,"mapIncludes");const Ti="All mapping items must start at the same column";function bc({composeNode:s,composeEmptyNode:e},t,n,r,i){const o=i?.nodeClass??se,a=new o(t.schema);t.atRoot&&(t.atRoot=!1);let l=n.offset,u=null;for(const f of n.items){const{start:d,key:h,sep:g,value:y}=f,p=ht(d,{indicator:"explicit-key-ind",next:h??g?.[0],offset:l,onError:r,parentIndent:n.indent,startOnNewline:!0}),w=!p.found;if(w){if(h&&(h.type==="block-seq"?r(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in h&&h.indent!==n.indent&&r(l,"BAD_INDENT",Ti)),!p.anchor&&!p.tag&&!g){u=p.end,p.comment&&(a.comment?a.comment+=`
|
|
72
|
-
`+p.comment:a.comment=p.comment);continue}(p.newlineAfterProp||At(h))&&r(h??d[d.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else p.found?.indent!==n.indent&&r(l,"BAD_INDENT",Ti);t.atKey=!0;const k=p.end,E=h?s(t,h,p,r):e(t,k,d,null,p,r);t.schema.compat&&gs(n.indent,h,r),t.atKey=!1,Ei(t,a.items,E)&&r(k,"DUPLICATE_KEY","Map keys must be unique");const A=ht(g??[],{indicator:"map-value-ind",next:y,offset:E.range[2],onError:r,parentIndent:n.indent,startOnNewline:!h||h.type==="block-scalar"});if(l=A.end,A.found){w&&(y?.type==="block-map"&&!A.hasNewline&&r(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),t.options.strict&&p.start<A.found.offset-1024&&r(E.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));const I=y?s(t,y,A,r):e(t,l,g,null,A,r);t.schema.compat&&gs(n.indent,y,r),l=I.range[2];const P=new X(E,I);t.options.keepSourceTokens&&(P.srcToken=f),a.items.push(P)}else{w&&r(E.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),A.comment&&(E.comment?E.comment+=`
|
|
73
|
-
`+A.comment:E.comment=A.comment);const I=new X(E);t.options.keepSourceTokens&&(I.srcToken=f),a.items.push(I)}}return u&&u<l&&r(u,"IMPOSSIBLE","Map comment with trailing content"),a.range=[n.offset,l,u??l],a}c(bc,"resolveBlockMap");function Sc({composeNode:s,composeEmptyNode:e},t,n,r,i){const o=i?.nodeClass??Oe,a=new o(t.schema);t.atRoot&&(t.atRoot=!1),t.atKey&&(t.atKey=!1);let l=n.offset,u=null;for(const{start:f,value:d}of n.items){const h=ht(f,{indicator:"seq-item-ind",next:d,offset:l,onError:r,parentIndent:n.indent,startOnNewline:!0});if(!h.found)if(h.anchor||h.tag||d)d&&d.type==="block-seq"?r(h.end,"BAD_INDENT","All sequence items must start at the same column"):r(l,"MISSING_CHAR","Sequence item without - indicator");else{u=h.end,h.comment&&(a.comment=h.comment);continue}const g=d?s(t,d,h,r):e(t,h.end,f,null,h,r);t.schema.compat&&gs(n.indent,d,r),l=g.range[2],a.items.push(g)}return a.range=[n.offset,l,u??l],a}c(Sc,"resolveBlockSeq");function $t(s,e,t,n){let r="";if(s){let i=!1,o="";for(const a of s){const{source:l,type:u}=a;switch(u){case"space":i=!0;break;case"comment":{t&&!i&&n(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");const f=l.substring(1)||" ";r?r+=o+f:r=f,o="";break}case"newline":r&&(o+=l),i=!0;break;default:n(a,"UNEXPECTED_TOKEN",`Unexpected ${u} at node end`)}e+=l.length}}return{comment:r,offset:e}}c($t,"resolveEnd");const ys="Block collections are not allowed within flow collections",ws=c(s=>s&&(s.type==="block-map"||s.type==="block-seq"),"isBlock");function Cc({composeNode:s,composeEmptyNode:e},t,n,r,i){const o=n.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?se:Oe),u=new l(t.schema);u.flow=!0;const f=t.atRoot;f&&(t.atRoot=!1),t.atKey&&(t.atKey=!1);let d=n.offset+n.start.source.length;for(let w=0;w<n.items.length;++w){const k=n.items[w],{start:E,key:A,sep:I,value:P}=k,R=ht(E,{flow:a,indicator:"explicit-key-ind",next:A??I?.[0],offset:d,onError:r,parentIndent:n.indent,startOnNewline:!1});if(!R.found){if(!R.anchor&&!R.tag&&!I&&!P){w===0&&R.comma?r(R.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):w<n.items.length-1&&r(R.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),R.comment&&(u.comment?u.comment+=`
|
|
74
|
-
`+R.comment:u.comment=R.comment),d=R.end;continue}!o&&t.options.strict&&At(A)&&r(A,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(w===0)R.comma&&r(R.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(R.comma||r(R.start,"MISSING_CHAR",`Missing , between ${a} items`),R.comment){let J="";e:for(const $ of E)switch($.type){case"comma":case"space":break;case"comment":J=$.source.substring(1);break e;default:break e}if(J){let $=u.items[u.items.length-1];W($)&&($=$.value??$.key),$.comment?$.comment+=`
|
|
75
|
-
`+J:$.comment=J,R.comment=R.comment.substring(J.length+1)}}if(!o&&!I&&!R.found){const J=P?s(t,P,R,r):e(t,R.end,I,null,R,r);u.items.push(J),d=J.range[2],ws(P)&&r(J.range,"BLOCK_IN_FLOW",ys)}else{t.atKey=!0;const J=R.end,$=A?s(t,A,R,r):e(t,J,E,null,R,r);ws(A)&&r($.range,"BLOCK_IN_FLOW",ys),t.atKey=!1;const Y=ht(I??[],{flow:a,indicator:"map-value-ind",next:P,offset:$.range[2],onError:r,parentIndent:n.indent,startOnNewline:!1});if(Y.found){if(!o&&!R.found&&t.options.strict){if(I)for(const Z of I){if(Z===Y.found)break;if(Z.type==="newline"){r(Z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}R.start<Y.found.offset-1024&&r(Y.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else P&&("source"in P&&P.source&&P.source[0]===":"?r(P,"MISSING_CHAR",`Missing space after : in ${a}`):r(Y.start,"MISSING_CHAR",`Missing , or : between ${a} items`));const Ee=P?s(t,P,Y,r):Y.found?e(t,Y.end,I,null,Y,r):null;Ee?ws(P)&&r(Ee.range,"BLOCK_IN_FLOW",ys):Y.comment&&($.comment?$.comment+=`
|
|
76
|
-
`+Y.comment:$.comment=Y.comment);const Ge=new X($,Ee);if(t.options.keepSourceTokens&&(Ge.srcToken=k),o){const Z=u;Ei(t,Z.items,$)&&r(J,"DUPLICATE_KEY","Map keys must be unique"),Z.items.push(Ge)}else{const Z=new se(t.schema);Z.flow=!0,Z.items.push(Ge);const zs=(Ee??$).range;Z.range=[$.range[0],zs[1],zs[2]],u.items.push(Z)}d=Ee?Ee.range[2]:Y.end}}const h=o?"}":"]",[g,...y]=n.end;let p=d;if(g&&g.source===h)p=g.offset+g.source.length;else{const w=a[0].toUpperCase()+a.substring(1),k=f?`${w} must end with a ${h}`:`${w} in block collection must be sufficiently indented and end with a ${h}`;r(d,f?"MISSING_CHAR":"BAD_INDENT",k),g&&g.source.length!==1&&y.unshift(g)}if(y.length>0){const w=$t(y,p,t.options.strict,r);w.comment&&(u.comment?u.comment+=`
|
|
77
|
-
`+w.comment:u.comment=w.comment),u.range=[n.offset,p,w.offset]}else u.range=[n.offset,p,p];return u}c(Cc,"resolveFlowCollection");function bs(s,e,t,n,r,i){const o=t.type==="block-map"?bc(s,e,t,n,i):t.type==="block-seq"?Sc(s,e,t,n,i):Cc(s,e,t,n,i),a=o.constructor;return r==="!"||r===a.tagName?(o.tag=a.tagName,o):(r&&(o.tag=r),o)}c(bs,"resolveCollection");function vc(s,e,t,n,r){const i=n.tag,o=i?e.directives.tagName(i.source,h=>r(i,"TAG_RESOLVE_FAILED",h)):null;if(t.type==="block-seq"){const{anchor:h,newlineAfterProp:g}=n,y=h&&i?h.offset>i.offset?h:i:h??i;y&&(!g||g.offset<y.offset)&&r(y,"MISSING_CHAR","Missing newline after block sequence props")}const a=t.type==="block-map"?"map":t.type==="block-seq"?"seq":t.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===se.tagName&&a==="map"||o===Oe.tagName&&a==="seq")return bs(s,e,t,r,o);let l=e.schema.tags.find(h=>h.tag===o&&h.collection===a);if(!l){const h=e.schema.knownTags[o];if(h&&h.collection===a)e.schema.tags.push(Object.assign({},h,{default:!1})),l=h;else return h?r(i,"BAD_COLLECTION_TYPE",`${h.tag} used for ${a} collection, but expects ${h.collection??"scalar"}`,!0):r(i,"TAG_RESOLVE_FAILED",`Unresolved tag: ${o}`,!0),bs(s,e,t,r,o)}const u=bs(s,e,t,r,o,l),f=l.resolve?.(u,h=>r(i,"TAG_RESOLVE_FAILED",h),e.options)??u,d=G(f)?f:new L(f);return d.range=u.range,d.tag=o,l?.format&&(d.format=l.format),d}c(vc,"composeCollection");function Ii(s,e,t){const n=e.offset,r=kc(e,s.options.strict,t);if(!r)return{value:"",type:null,comment:"",range:[n,n,n]};const i=r.mode===">"?L.BLOCK_FOLDED:L.BLOCK_LITERAL,o=e.source?Ec(e.source):[];let a=o.length;for(let p=o.length-1;p>=0;--p){const w=o[p][1];if(w===""||w==="\r")a=p;else break}if(a===0){const p=r.chomp==="+"&&o.length>0?`
|
|
78
|
-
`.repeat(Math.max(1,o.length-1)):"";let w=n+r.length;return e.source&&(w+=e.source.length),{value:p,type:i,comment:r.comment,range:[n,w,w]}}let l=e.indent+r.indent,u=e.offset+r.length,f=0;for(let p=0;p<a;++p){const[w,k]=o[p];if(k===""||k==="\r")r.indent===0&&w.length>l&&(l=w.length);else{w.length<l&&t(u+w.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),r.indent===0&&(l=w.length),f=p,l===0&&!s.atRoot&&t(u,"BAD_INDENT","Block scalar values in collections must be indented");break}u+=w.length+k.length+1}for(let p=o.length-1;p>=a;--p)o[p][0].length>l&&(a=p+1);let d="",h="",g=!1;for(let p=0;p<f;++p)d+=o[p][0].slice(l)+`
|
|
79
|
-
`;for(let p=f;p<a;++p){let[w,k]=o[p];u+=w.length+k.length+1;const E=k[k.length-1]==="\r";if(E&&(k=k.slice(0,-1)),k&&w.length<l){const I=`Block scalar lines must not be less indented than their ${r.indent?"explicit indentation indicator":"first line"}`;t(u-k.length-(E?2:1),"BAD_INDENT",I),w=""}i===L.BLOCK_LITERAL?(d+=h+w.slice(l)+k,h=`
|
|
80
|
-
`):w.length>l||k[0]===" "?(h===" "?h=`
|
|
81
|
-
`:!g&&h===`
|
|
82
|
-
`&&(h=`
|
|
83
|
-
|
|
84
|
-
`),d+=h+w.slice(l)+k,h=`
|
|
85
|
-
`,g=!0):k===""?h===`
|
|
86
|
-
`?d+=`
|
|
87
|
-
`:h=`
|
|
88
|
-
`:(d+=h+k,h=" ",g=!1)}switch(r.chomp){case"-":break;case"+":for(let p=a;p<o.length;++p)d+=`
|
|
89
|
-
`+o[p][0].slice(l);d[d.length-1]!==`
|
|
90
|
-
`&&(d+=`
|
|
91
|
-
`);break;default:d+=`
|
|
92
|
-
`}const y=n+r.length+e.source.length;return{value:d,type:i,comment:r.comment,range:[n,y,y]}}c(Ii,"resolveBlockScalar");function kc({offset:s,props:e},t,n){if(e[0].type!=="block-scalar-header")return n(e[0],"IMPOSSIBLE","Block scalar header not found"),null;const{source:r}=e[0],i=r[0];let o=0,a="",l=-1;for(let h=1;h<r.length;++h){const g=r[h];if(!a&&(g==="-"||g==="+"))a=g;else{const y=Number(g);!o&&y?o=y:l===-1&&(l=s+h)}}l!==-1&&n(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${r}`);let u=!1,f="",d=r.length;for(let h=1;h<e.length;++h){const g=e[h];switch(g.type){case"space":u=!0;case"newline":d+=g.source.length;break;case"comment":t&&!u&&n(g,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),d+=g.source.length,f=g.source.substring(1);break;case"error":n(g,"UNEXPECTED_TOKEN",g.message),d+=g.source.length;break;default:{const y=`Unexpected token in block scalar header: ${g.type}`;n(g,"UNEXPECTED_TOKEN",y);const p=g.source;p&&typeof p=="string"&&(d+=p.length)}}}return{mode:i,indent:o,chomp:a,comment:f,length:d}}c(kc,"parseBlockScalarHeader");function Ec(s){const e=s.split(/\n( *)/),t=e[0],n=t.match(/^( *)/),i=[n?.[1]?[n[1],t.slice(n[1].length)]:["",t]];for(let o=1;o<e.length;o+=2)i.push([e[o],e[o+1]]);return i}c(Ec,"splitLines");function Oi(s,e,t){const{offset:n,type:r,source:i,end:o}=s;let a,l;const u=c((h,g,y)=>t(n+h,g,y),"_onError");switch(r){case"scalar":a=L.PLAIN,l=Tc(i,u);break;case"single-quoted-scalar":a=L.QUOTE_SINGLE,l=Ic(i,u);break;case"double-quoted-scalar":a=L.QUOTE_DOUBLE,l=Oc(i,u);break;default:return t(s,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${r}`),{value:"",type:null,comment:"",range:[n,n+i.length,n+i.length]}}const f=n+i.length,d=$t(o,f,e,t);return{value:l,type:a,comment:d.comment,range:[n,f,d.offset]}}c(Oi,"resolveFlowScalar");function Tc(s,e){let t="";switch(s[0]){case" ":t="a tab character";break;case",":t="flow indicator character ,";break;case"%":t="directive indicator character %";break;case"|":case">":{t=`block scalar indicator ${s[0]}`;break}case"@":case"`":{t=`reserved character ${s[0]}`;break}}return t&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${t}`),Ai(s)}c(Tc,"plainValue");function Ic(s,e){return(s[s.length-1]!=="'"||s.length===1)&&e(s.length,"MISSING_CHAR","Missing closing 'quote"),Ai(s.slice(1,-1)).replace(/''/g,"'")}c(Ic,"singleQuotedValue");function Ai(s){let e,t;try{e=new RegExp(`(.*?)(?<![ ])[ ]*\r?
|
|
93
|
-
`,"sy"),t=new RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
|
|
94
|
-
`,"sy")}catch{e=/(.*?)[ \t]*\r?\n/sy,t=/[ \t]*(.*?)[ \t]*\r?\n/sy}let n=e.exec(s);if(!n)return s;let r=n[1],i=" ",o=e.lastIndex;for(t.lastIndex=o;n=t.exec(s);)n[1]===""?i===`
|
|
95
|
-
`?r+=i:i=`
|
|
96
|
-
`:(r+=i+n[1],i=" "),o=t.lastIndex;const a=/[ \t]*(.*)/sy;return a.lastIndex=o,n=a.exec(s),r+i+(n?.[1]??"")}c(Ai,"foldLines");function Oc(s,e){let t="";for(let n=1;n<s.length-1;++n){const r=s[n];if(!(r==="\r"&&s[n+1]===`
|
|
97
|
-
`))if(r===`
|
|
98
|
-
`){const{fold:i,offset:o}=Ac(s,n);t+=i,n=o}else if(r==="\\"){let i=s[++n];const o=$c[i];if(o)t+=o;else if(i===`
|
|
99
|
-
`)for(i=s[n+1];i===" "||i===" ";)i=s[++n+1];else if(i==="\r"&&s[n+1]===`
|
|
100
|
-
`)for(i=s[++n+1];i===" "||i===" ";)i=s[++n+1];else if(i==="x"||i==="u"||i==="U"){const a={x:2,u:4,U:8}[i];t+=Nc(s,n+1,a,e),n+=a}else{const a=s.substr(n-1,2);e(n-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),t+=a}}else if(r===" "||r===" "){const i=n;let o=s[n+1];for(;o===" "||o===" ";)o=s[++n+1];o!==`
|
|
101
|
-
`&&!(o==="\r"&&s[n+2]===`
|
|
102
|
-
`)&&(t+=n>i?s.slice(i,n+1):r)}else t+=r}return(s[s.length-1]!=='"'||s.length===1)&&e(s.length,"MISSING_CHAR",'Missing closing "quote'),t}c(Oc,"doubleQuotedValue");function Ac(s,e){let t="",n=s[e+1];for(;(n===" "||n===" "||n===`
|
|
103
|
-
`||n==="\r")&&!(n==="\r"&&s[e+2]!==`
|
|
104
|
-
`);)n===`
|
|
105
|
-
`&&(t+=`
|
|
106
|
-
`),e+=1,n=s[e+1];return t||(t=" "),{fold:t,offset:e}}c(Ac,"foldNewline");const $c={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
|
|
107
|
-
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function Nc(s,e,t,n){const r=s.substr(e,t),o=r.length===t&&/^[0-9a-fA-F]+$/.test(r)?parseInt(r,16):NaN;if(isNaN(o)){const a=s.substr(e-2,t+2);return n(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),a}return String.fromCodePoint(o)}c(Nc,"parseCharCode");function $i(s,e,t,n){const{value:r,type:i,comment:o,range:a}=e.type==="block-scalar"?Ii(s,e,n):Oi(e,s.options.strict,n),l=t?s.directives.tagName(t.source,d=>n(t,"TAG_RESOLVE_FAILED",d)):null;let u;s.options.stringKeys&&s.atKey?u=s.schema[me]:l?u=xc(s.schema,r,l,t,n):e.type==="scalar"?u=Pc(s,r,e,n):u=s.schema[me];let f;try{const d=u.resolve(r,h=>n(t??e,"TAG_RESOLVE_FAILED",h),s.options);f=U(d)?d:new L(d)}catch(d){const h=d instanceof Error?d.message:String(d);n(t??e,"TAG_RESOLVE_FAILED",h),f=new L(r)}return f.range=a,f.source=r,i&&(f.type=i),l&&(f.tag=l),u.format&&(f.format=u.format),o&&(f.comment=o),f}c($i,"composeScalar");function xc(s,e,t,n,r){if(t==="!")return s[me];const i=[];for(const a of s.tags)if(!a.collection&&a.tag===t)if(a.default&&a.test)i.push(a);else return a;for(const a of i)if(a.test?.test(e))return a;const o=s.knownTags[t];return o&&!o.collection?(s.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(r(n,"TAG_RESOLVE_FAILED",`Unresolved tag: ${t}`,t!=="tag:yaml.org,2002:str"),s[me])}c(xc,"findScalarTagByName");function Pc({atKey:s,directives:e,schema:t},n,r,i){const o=t.tags.find(a=>(a.default===!0||s&&a.default==="key")&&a.test?.test(n))||t[me];if(t.compat){const a=t.compat.find(l=>l.default&&l.test?.test(n))??t[me];if(o.tag!==a.tag){const l=e.tagString(o.tag),u=e.tagString(a.tag),f=`Value may be parsed as either ${l} or ${u}`;i(r,"TAG_RESOLVE_FAILED",f,!0)}}return o}c(Pc,"findScalarTagByTest");function Lc(s,e,t){if(e){t??(t=e.length);for(let n=t-1;n>=0;--n){let r=e[n];switch(r.type){case"space":case"comment":case"newline":s-=r.source.length;continue}for(r=e[++n];r?.type==="space";)s+=r.source.length,r=e[++n];break}}return s}c(Lc,"emptyScalarPosition");const Rc={composeNode:Ni,composeEmptyNode:Ss};function Ni(s,e,t,n){const r=s.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=t;let u,f=!0;switch(e.type){case"alias":u=Dc(s,e,n),(a||l)&&n(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":u=$i(s,e,l,n),a&&(u.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":u=vc(Rc,s,e,t,n),a&&(u.anchor=a.source.substring(1));break;default:{const d=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;n(e,"UNEXPECTED_TOKEN",d),u=Ss(s,e.offset,void 0,null,t,n),f=!1}}return a&&u.anchor===""&&n(a,"BAD_ALIAS","Anchor cannot be an empty string"),r&&s.options.stringKeys&&(!U(u)||typeof u.value!="string"||u.tag&&u.tag!=="tag:yaml.org,2002:str")&&n(l??e,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(u.spaceBefore=!0),o&&(e.type==="scalar"&&e.source===""?u.comment=o:u.commentBefore=o),s.options.keepSourceTokens&&f&&(u.srcToken=e),u}c(Ni,"composeNode");function Ss(s,e,t,n,{spaceBefore:r,comment:i,anchor:o,tag:a,end:l},u){const f={type:"scalar",offset:Lc(e,t,n),indent:-1,source:""},d=$i(s,f,a,u);return o&&(d.anchor=o.source.substring(1),d.anchor===""&&u(o,"BAD_ALIAS","Anchor cannot be an empty string")),r&&(d.spaceBefore=!0),i&&(d.comment=i,d.range[2]=l),d}c(Ss,"composeEmptyNode");function Dc({options:s},{offset:e,source:t,end:n},r){const i=new Zt(t.substring(1));i.source===""&&r(e,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&r(e+t.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);const o=e+t.length,a=$t(n,o,s.strict,r);return i.range=[e,o,a.offset],a.comment&&(i.comment=a.comment),i}c(Dc,"composeAlias");function Mc(s,e,{offset:t,start:n,value:r,end:i},o){const a=Object.assign({_directives:e},s),l=new St(void 0,a),u={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},f=ht(n,{indicator:"doc-start",next:r??i?.[0],offset:t,onError:o,parentIndent:0,startOnNewline:!0});f.found&&(l.directives.docStart=!0,r&&(r.type==="block-map"||r.type==="block-seq")&&!f.hasNewline&&o(f.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=r?Ni(u,r,f,o):Ss(u,f.end,n,null,f,o);const d=l.contents.range[2],h=$t(i,d,!1,o);return h.comment&&(l.comment=h.comment),l.range=[t,d,h.offset],l}c(Mc,"composeDoc");function Nt(s){if(typeof s=="number")return[s,s+1];if(Array.isArray(s))return s.length===2?s:[s[0],s[1]];const{offset:e,source:t}=s;return[e,e+(typeof t=="string"?t.length:1)]}c(Nt,"getErrorPos");function xi(s){let e="",t=!1,n=!1;for(let r=0;r<s.length;++r){const i=s[r];switch(i[0]){case"#":e+=(e===""?"":n?`
|
|
108
|
-
|
|
109
|
-
`:`
|
|
110
|
-
`)+(i.substring(1)||" "),t=!0,n=!1;break;case"%":s[r+1]?.[0]!=="#"&&(r+=1),t=!1;break;default:t||(n=!0),t=!1}}return{comment:e,afterEmptyLine:n}}c(xi,"parsePrelude");class Cs{static{c(this,"Composer")}constructor(e={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(t,n,r,i)=>{const o=Nt(t);i?this.warnings.push(new ki(o,n,r)):this.errors.push(new Ue(o,n,r))},this.directives=new ee({version:e.version||"1.2"}),this.options=e}decorate(e,t){const{comment:n,afterEmptyLine:r}=xi(this.prelude);if(n){const i=e.contents;if(t)e.comment=e.comment?`${e.comment}
|
|
111
|
-
${n}`:n;else if(r||e.directives.docStart||!i)e.commentBefore=n;else if(V(i)&&!i.flow&&i.items.length>0){let o=i.items[0];W(o)&&(o=o.key);const a=o.commentBefore;o.commentBefore=a?`${n}
|
|
112
|
-
${a}`:n}else{const o=i.commentBefore;i.commentBefore=o?`${n}
|
|
113
|
-
${o}`:n}}t?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:xi(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,t=!1,n=-1){for(const r of e)yield*this.next(r);yield*this.end(t,n)}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(t,n,r)=>{const i=Nt(e);i[0]+=t,this.onError(i,"BAD_DIRECTIVE",n,r)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{const t=Mc(this.options,this.directives,e,this.onError);this.atDirectives&&!t.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(t,!1),this.doc&&(yield this.doc),this.doc=t,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{const t=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,n=new Ue(Nt(e),"UNEXPECTED_TOKEN",t);this.atDirectives||!this.doc?this.errors.push(n):this.doc.errors.push(n);break}case"doc-end":{if(!this.doc){const n="Unexpected doc-end without preceding document";this.errors.push(new Ue(Nt(e),"UNEXPECTED_TOKEN",n));break}this.doc.directives.docEnd=!0;const t=$t(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),t.comment){const n=this.doc.comment;this.doc.comment=n?`${n}
|
|
114
|
-
${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.push(new Ue(Nt(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,t=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){const n=Object.assign({_directives:this.directives},this.options),r=new St(void 0,n);this.atDirectives&&this.onError(t,"MISSING_CHAR","Missing directives-end indicator line"),r.range=[0,t,t],this.decorate(r,!1),yield r}}}function jc(s,e=!0,t){if(s){const n=c((r,i,o)=>{const a=typeof r=="number"?r:Array.isArray(r)?r[0]:r.offset;if(t)t(a,i,o);else throw new Ue([a,a+1],i,o)},"_onError");switch(s.type){case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return Oi(s,e,n);case"block-scalar":return Ii({options:{strict:e}},s,n)}}return null}c(jc,"resolveAsScalar");function _c(s,e){const{implicitKey:t=!1,indent:n,inFlow:r=!1,offset:i=-1,type:o="PLAIN"}=e,a=It({type:o,value:s},{implicitKey:t,indent:n>0?" ".repeat(n):"",inFlow:r,options:{blockQuote:!0,lineWidth:-1}}),l=e.end??[{type:"newline",offset:-1,indent:n,source:`
|
|
115
|
-
`}];switch(a[0]){case"|":case">":{const u=a.indexOf(`
|
|
116
|
-
`),f=a.substring(0,u),d=a.substring(u+1)+`
|
|
117
|
-
`,h=[{type:"block-scalar-header",offset:i,indent:n,source:f}];return Pi(h,l)||h.push({type:"newline",offset:-1,indent:n,source:`
|
|
118
|
-
`}),{type:"block-scalar",offset:i,indent:n,props:h,source:d}}case'"':return{type:"double-quoted-scalar",offset:i,indent:n,source:a,end:l};case"'":return{type:"single-quoted-scalar",offset:i,indent:n,source:a,end:l};default:return{type:"scalar",offset:i,indent:n,source:a,end:l}}}c(_c,"createScalarToken");function Fc(s,e,t={}){let{afterKey:n=!1,implicitKey:r=!1,inFlow:i=!1,type:o}=t,a="indent"in s?s.indent:null;if(n&&typeof a=="number"&&(a+=2),!o)switch(s.type){case"single-quoted-scalar":o="QUOTE_SINGLE";break;case"double-quoted-scalar":o="QUOTE_DOUBLE";break;case"block-scalar":{const u=s.props[0];if(u.type!=="block-scalar-header")throw new Error("Invalid block scalar header");o=u.source[0]===">"?"BLOCK_FOLDED":"BLOCK_LITERAL";break}default:o="PLAIN"}const l=It({type:o,value:e},{implicitKey:r||a===null,indent:a!==null&&a>0?" ".repeat(a):"",inFlow:i,options:{blockQuote:!0,lineWidth:-1}});switch(l[0]){case"|":case">":Kc(s,l);break;case'"':vs(s,l,"double-quoted-scalar");break;case"'":vs(s,l,"single-quoted-scalar");break;default:vs(s,l,"scalar")}}c(Fc,"setScalarValue");function Kc(s,e){const t=e.indexOf(`
|
|
119
|
-
`),n=e.substring(0,t),r=e.substring(t+1)+`
|
|
120
|
-
`;if(s.type==="block-scalar"){const i=s.props[0];if(i.type!=="block-scalar-header")throw new Error("Invalid block scalar header");i.source=n,s.source=r}else{const{offset:i}=s,o="indent"in s?s.indent:-1,a=[{type:"block-scalar-header",offset:i,indent:o,source:n}];Pi(a,"end"in s?s.end:void 0)||a.push({type:"newline",offset:-1,indent:o,source:`
|
|
121
|
-
`});for(const l of Object.keys(s))l!=="type"&&l!=="offset"&&delete s[l];Object.assign(s,{type:"block-scalar",indent:o,props:a,source:r})}}c(Kc,"setBlockScalarValue");function Pi(s,e){if(e)for(const t of e)switch(t.type){case"space":case"comment":s.push(t);break;case"newline":return s.push(t),!0}return!1}c(Pi,"addEndtoBlockProps");function vs(s,e,t){switch(s.type){case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":s.type=t,s.source=e;break;case"block-scalar":{const n=s.props.slice(1);let r=e.length;s.props[0].type==="block-scalar-header"&&(r-=s.props[0].source.length);for(const i of n)i.offset+=r;delete s.props,Object.assign(s,{type:t,source:e,end:n});break}case"block-map":case"block-seq":{const r={type:"newline",offset:s.offset+e.length,indent:s.indent,source:`
|
|
122
|
-
`};delete s.items,Object.assign(s,{type:t,source:e,end:[r]});break}default:{const n="indent"in s?s.indent:-1,r="end"in s&&Array.isArray(s.end)?s.end.filter(i=>i.type==="space"||i.type==="comment"||i.type==="newline"):[];for(const i of Object.keys(s))i!=="type"&&i!=="offset"&&delete s[i];Object.assign(s,{type:t,indent:n,source:e,end:r})}}}c(vs,"setFlowScalarValue");const Bc=c(s=>"type"in s?gn(s):yn(s),"stringify$1");function gn(s){switch(s.type){case"block-scalar":{let e="";for(const t of s.props)e+=gn(t);return e+s.source}case"block-map":case"block-seq":{let e="";for(const t of s.items)e+=yn(t);return e}case"flow-collection":{let e=s.start.source;for(const t of s.items)e+=yn(t);for(const t of s.end)e+=t.source;return e}case"document":{let e=yn(s);if(s.end)for(const t of s.end)e+=t.source;return e}default:{let e=s.source;if("end"in s&&s.end)for(const t of s.end)e+=t.source;return e}}}c(gn,"stringifyToken");function yn({start:s,key:e,sep:t,value:n}){let r="";for(const i of s)r+=i.source;if(e&&(r+=gn(e)),t)for(const i of t)r+=i.source;return n&&(r+=gn(n)),r}c(yn,"stringifyItem");const ks=Symbol("break visit"),qc=Symbol("skip children"),Li=Symbol("remove item");function Je(s,e){"type"in s&&s.type==="document"&&(s={start:s.start,value:s.value}),Ri(Object.freeze([]),s,e)}c(Je,"visit"),Je.BREAK=ks,Je.SKIP=qc,Je.REMOVE=Li,Je.itemAtPath=(s,e)=>{let t=s;for(const[n,r]of e){const i=t?.[n];if(i&&"items"in i)t=i.items[r];else return}return t},Je.parentCollection=(s,e)=>{const t=Je.itemAtPath(s,e.slice(0,-1)),n=e[e.length-1][0],r=t?.[n];if(r&&"items"in r)return r;throw new Error("Parent collection not found")};function Ri(s,e,t){let n=t(e,s);if(typeof n=="symbol")return n;for(const r of["key","value"]){const i=e[r];if(i&&"items"in i){for(let o=0;o<i.items.length;++o){const a=Ri(Object.freeze(s.concat([[r,o]])),i.items[o],t);if(typeof a=="number")o=a-1;else{if(a===ks)return ks;a===Li&&(i.items.splice(o,1),o-=1)}}typeof n=="function"&&r==="key"&&(n=n(e,s))}}return typeof n=="function"?n(e,s):n}c(Ri,"_visit");const wn="\uFEFF",bn="",Sn="",xt="",Uc=c(s=>!!s&&"items"in s,"isCollection"),Jc=c(s=>!!s&&(s.type==="scalar"||s.type==="single-quoted-scalar"||s.type==="double-quoted-scalar"||s.type==="block-scalar"),"isScalar");function Wc(s){switch(s){case wn:return"<BOM>";case bn:return"<DOC>";case Sn:return"<FLOW_END>";case xt:return"<SCALAR>";default:return JSON.stringify(s)}}c(Wc,"prettyToken");function Di(s){switch(s){case wn:return"byte-order-mark";case bn:return"doc-mode";case Sn:return"flow-error-end";case xt:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
|
|
123
|
-
`:case`\r
|
|
124
|
-
`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(s[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}c(Di,"tokenType");var Vc=Object.freeze({__proto__:null,BOM:wn,DOCUMENT:bn,FLOW_END:Sn,SCALAR:xt,createScalarToken:_c,isCollection:Uc,isScalar:Jc,prettyToken:Wc,resolveAsScalar:jc,setScalarValue:Fc,stringify:Bc,tokenType:Di,visit:Je});function de(s){switch(s){case void 0:case" ":case`
|
|
125
|
-
`:case"\r":case" ":return!0;default:return!1}}c(de,"isEmpty");const Mi=new Set("0123456789ABCDEFabcdef"),Gc=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Cn=new Set(",[]{}"),zc=new Set(` ,[]{}
|
|
126
|
-
\r `),Es=c(s=>!s||zc.has(s),"isNotAnchorChar");class ji{static{c(this,"Lexer")}constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,t=!1){if(e){if(typeof e!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!t;let n=this.next??"stream";for(;n&&(t||this.hasChars(1));)n=yield*this.parseNext(n)}atLineEnd(){let e=this.pos,t=this.buffer[e];for(;t===" "||t===" ";)t=this.buffer[++e];return!t||t==="#"||t===`
|
|
127
|
-
`?!0:t==="\r"?this.buffer[e+1]===`
|
|
128
|
-
`:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let t=this.buffer[e];if(this.indentNext>0){let n=0;for(;t===" ";)t=this.buffer[++n+e];if(t==="\r"){const r=this.buffer[n+e+1];if(r===`
|
|
129
|
-
`||!r&&!this.atEnd)return e+n+1}return t===`
|
|
130
|
-
`||n>=this.indentNext||!t&&!this.atEnd?e+n:-1}if(t==="-"||t==="."){const n=this.buffer.substr(e,3);if((n==="---"||n==="...")&&de(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&e<this.pos)&&(e=this.buffer.indexOf(`
|
|
131
|
-
`,this.pos),this.lineEndPos=e),e===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[e-1]==="\r"&&(e-=1),this.buffer.substring(this.pos,e))}hasChars(e){return this.pos+e<=this.buffer.length}setNext(e){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=e,null}peek(e){return this.buffer.substr(this.pos,e)}*parseNext(e){switch(e){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let e=this.getLine();if(e===null)return this.setNext("stream");if(e[0]===wn&&(yield*this.pushCount(1),e=e.substring(1)),e[0]==="%"){let t=e.length,n=e.indexOf("#");for(;n!==-1;){const i=e[n-1];if(i===" "||i===" "){t=n-1;break}else n=e.indexOf("#",n+1)}for(;;){const i=e[t-1];if(i===" "||i===" ")t-=1;else break}const r=(yield*this.pushCount(t))+(yield*this.pushSpaces(!0));return yield*this.pushCount(e.length-r),this.pushNewline(),"stream"}if(this.atLineEnd()){const t=yield*this.pushSpaces(!0);return yield*this.pushCount(e.length-t),yield*this.pushNewline(),"stream"}return yield bn,yield*this.parseLineStart()}*parseLineStart(){const e=this.charAt(0);if(!e&&!this.atEnd)return this.setNext("line-start");if(e==="-"||e==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");const t=this.peek(3);if((t==="---"||t==="...")&&de(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,t==="---"?"doc":"stream"}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!de(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){const[e,t]=this.peek(2);if(!t&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&de(t)){const n=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=n,yield*this.parseBlockStart()}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);const e=this.getLine();if(e===null)return this.setNext("doc");let t=yield*this.pushIndicators();switch(e[t]){case"#":yield*this.pushCount(e.length-t);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(Es),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return t+=yield*this.parseBlockScalarHeader(),t+=yield*this.pushSpaces(!0),yield*this.pushCount(e.length-t),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let e,t,n=-1;do e=yield*this.pushNewline(),e>0?(t=yield*this.pushSpaces(!1),this.indentValue=n=t):t=0,t+=yield*this.pushSpaces(!0);while(e+t>0);const r=this.getLine();if(r===null)return this.setNext("flow");if((n!==-1&&n<this.indentNext&&r[0]!=="#"||n===0&&(r.startsWith("---")||r.startsWith("..."))&&de(r[3]))&&!(n===this.indentNext-1&&this.flowLevel===1&&(r[0]==="]"||r[0]==="}")))return this.flowLevel=0,yield Sn,yield*this.parseLineStart();let i=0;for(;r[i]===",";)i+=yield*this.pushCount(1),i+=yield*this.pushSpaces(!0),this.flowKey=!1;switch(i+=yield*this.pushIndicators(),r[i]){case void 0:return"flow";case"#":return yield*this.pushCount(r.length-i),"flow";case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel+=1,"flow";case"}":case"]":return yield*this.pushCount(1),this.flowKey=!0,this.flowLevel-=1,this.flowLevel?"flow":"doc";case"*":return yield*this.pushUntil(Es),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{const o=this.charAt(1);if(this.flowKey||de(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){const e=this.charAt(0);let t=this.buffer.indexOf(e,this.pos+1);if(e==="'")for(;t!==-1&&this.buffer[t+1]==="'";)t=this.buffer.indexOf("'",t+2);else for(;t!==-1;){let i=0;for(;this.buffer[t-1-i]==="\\";)i+=1;if(i%2===0)break;t=this.buffer.indexOf('"',t+1)}const n=this.buffer.substring(0,t);let r=n.indexOf(`
|
|
132
|
-
`,this.pos);if(r!==-1){for(;r!==-1;){const i=this.continueScalar(r+1);if(i===-1)break;r=n.indexOf(`
|
|
133
|
-
`,i)}r!==-1&&(t=r-(n[r-1]==="\r"?2:1))}if(t===-1){if(!this.atEnd)return this.setNext("quoted-scalar");t=this.buffer.length}return yield*this.pushToIndex(t+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let e=this.pos;for(;;){const t=this.buffer[++e];if(t==="+")this.blockScalarKeep=!0;else if(t>"0"&&t<="9")this.blockScalarIndent=Number(t)-1;else if(t!=="-")break}return yield*this.pushUntil(t=>de(t)||t==="#")}*parseBlockScalar(){let e=this.pos-1,t=0,n;e:for(let i=this.pos;n=this.buffer[i];++i)switch(n){case" ":t+=1;break;case`
|
|
134
|
-
`:e=i,t=0;break;case"\r":{const o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
|
|
135
|
-
`)break}default:break e}if(!n&&!this.atEnd)return this.setNext("block-scalar");if(t>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=t:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{const i=this.continueScalar(e+1);if(i===-1)break;e=this.buffer.indexOf(`
|
|
136
|
-
`,i)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}let r=e+1;for(n=this.buffer[r];n===" ";)n=this.buffer[++r];if(n===" "){for(;n===" "||n===" "||n==="\r"||n===`
|
|
137
|
-
`;)n=this.buffer[++r];e=r-1}else if(!this.blockScalarKeep)do{let i=e-1,o=this.buffer[i];o==="\r"&&(o=this.buffer[--i]);const a=i;for(;o===" ";)o=this.buffer[--i];if(o===`
|
|
138
|
-
`&&i>=this.pos&&i+1+t>a)e=i;else break}while(!0);return yield xt,yield*this.pushToIndex(e+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){const e=this.flowLevel>0;let t=this.pos-1,n=this.pos-1,r;for(;r=this.buffer[++n];)if(r===":"){const i=this.buffer[n+1];if(de(i)||e&&Cn.has(i))break;t=n}else if(de(r)){let i=this.buffer[n+1];if(r==="\r"&&(i===`
|
|
139
|
-
`?(n+=1,r=`
|
|
140
|
-
`,i=this.buffer[n+1]):t=n),i==="#"||e&&Cn.has(i))break;if(r===`
|
|
141
|
-
`){const o=this.continueScalar(n+1);if(o===-1)break;n=Math.max(n,o-2)}}else{if(e&&Cn.has(r))break;t=n}return!r&&!this.atEnd?this.setNext("plain-scalar"):(yield xt,yield*this.pushToIndex(t+1,!0),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,t){const n=this.buffer.slice(this.pos,e);return n?(yield n,this.pos+=n.length,n.length):(t&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*this.pushTag())+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators());case"&":return(yield*this.pushUntil(Es))+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators());case"-":case"?":case":":{const e=this.flowLevel>0,t=this.charAt(1);if(de(t)||e&&Cn.has(t))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*this.pushCount(1))+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators())}}return 0}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,t=this.buffer[e];for(;!de(t)&&t!==">";)t=this.buffer[++e];return yield*this.pushToIndex(t===">"?e+1:e,!1)}else{let e=this.pos+1,t=this.buffer[e];for(;t;)if(Gc.has(t))t=this.buffer[++e];else if(t==="%"&&Mi.has(this.buffer[e+1])&&Mi.has(this.buffer[e+2]))t=this.buffer[e+=3];else break;return yield*this.pushToIndex(e,!1)}}*pushNewline(){const e=this.buffer[this.pos];return e===`
|
|
142
|
-
`?yield*this.pushCount(1):e==="\r"&&this.charAt(1)===`
|
|
143
|
-
`?yield*this.pushCount(2):0}*pushSpaces(e){let t=this.pos-1,n;do n=this.buffer[++t];while(n===" "||e&&n===" ");const r=t-this.pos;return r>0&&(yield this.buffer.substr(this.pos,r),this.pos=t),r}*pushUntil(e){let t=this.pos,n=this.buffer[t];for(;!e(n);)n=this.buffer[++t];return yield*this.pushToIndex(t,!1)}}class _i{static{c(this,"LineCounter")}constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let t=0,n=this.lineStarts.length;for(;t<n;){const i=t+n>>1;this.lineStarts[i]<e?t=i+1:n=i}if(this.lineStarts[t]===e)return{line:t+1,col:1};if(t===0)return{line:0,col:e};const r=this.lineStarts[t-1];return{line:t,col:e-r+1}}}}function Ae(s,e){for(let t=0;t<s.length;++t)if(s[t].type===e)return!0;return!1}c(Ae,"includesToken");function Fi(s){for(let e=0;e<s.length;++e)switch(s[e].type){case"space":case"comment":case"newline":break;default:return e}return-1}c(Fi,"findNonEmptyIndex");function Ki(s){switch(s?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return!0;default:return!1}}c(Ki,"isFlowToken");function vn(s){switch(s.type){case"document":return s.start;case"block-map":{const e=s.items[s.items.length-1];return e.sep??e.start}case"block-seq":return s.items[s.items.length-1].start;default:return[]}}c(vn,"getPrevProps");function pt(s){if(s.length===0)return[];let e=s.length;e:for(;--e>=0;)switch(s[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;s[++e]?.type==="space";);return s.splice(e,s.length)}c(pt,"getFirstKeyStartProps");function Bi(s){if(s.start.type==="flow-seq-start")for(const e of s.items)e.sep&&!e.value&&!Ae(e.start,"explicit-key-ind")&&!Ae(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,Ki(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}c(Bi,"fixFlowSeqItems");class Ts{static{c(this,"Parser")}constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new ji,this.onNewLine=e}*parse(e,t=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(const n of this.lexer.lex(e,t))yield*this.next(n);t||(yield*this.end())}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=e.length;return}const t=Di(e);if(t)if(t==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=t,yield*this.step(),t){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case"space":this.atNewLine&&e[0]===" "&&(this.indent+=e.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=e.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=e.length}else{const n=`Not a YAML token: ${e}`;yield*this.pop({type:"error",offset:this.offset,message:n,source:e}),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){const e=this.peek(1);if(this.type==="doc-end"&&(!e||e.type!=="doc-end")){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*this.stream();switch(e.type){case"document":return yield*this.document(e);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(e);case"block-scalar":return yield*this.blockScalar(e);case"block-map":return yield*this.blockMap(e);case"block-seq":return yield*this.blockSequence(e);case"flow-collection":return yield*this.flowCollection(e);case"doc-end":return yield*this.documentEnd(e)}yield*this.pop()}peek(e){return this.stack[this.stack.length-e]}*pop(e){const t=e??this.stack.pop();if(!t)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield t;else{const n=this.peek(1);switch(t.type==="block-scalar"?t.indent="indent"in n?n.indent:0:t.type==="flow-collection"&&n.type==="document"&&(t.indent=0),t.type==="flow-collection"&&Bi(t),n.type){case"document":n.value=t;break;case"block-scalar":n.props.push(t);break;case"block-map":{const r=n.items[n.items.length-1];if(r.value){n.items.push({start:[],key:t,sep:[]}),this.onKeyLine=!0;return}else if(r.sep)r.value=t;else{Object.assign(r,{key:t,sep:[]}),this.onKeyLine=!r.explicitKey;return}break}case"block-seq":{const r=n.items[n.items.length-1];r.value?n.items.push({start:[],value:t}):r.value=t;break}case"flow-collection":{const r=n.items[n.items.length-1];!r||r.value?n.items.push({start:[],key:t,sep:[]}):r.sep?r.value=t:Object.assign(r,{key:t,sep:[]});return}default:yield*this.pop(),yield*this.pop(t)}if((n.type==="document"||n.type==="block-map"||n.type==="block-seq")&&(t.type==="block-map"||t.type==="block-seq")){const r=t.items[t.items.length-1];r&&!r.sep&&!r.value&&r.start.length>0&&Fi(r.start)===-1&&(t.indent===0||r.start.every(i=>i.type!=="comment"||i.indent<t.indent))&&(n.type==="document"?n.end=r.start:n.items.push({start:r.start}),t.items.splice(-1,1))}}}*stream(){switch(this.type){case"directive-line":yield{type:"directive",offset:this.offset,source:this.source};return;case"byte-order-mark":case"space":case"comment":case"newline":yield this.sourceToken;return;case"doc-mode":case"doc-start":{const e={type:"document",offset:this.offset,start:[]};this.type==="doc-start"&&e.start.push(this.sourceToken),this.stack.push(e);return}}yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(e){if(e.value)return yield*this.lineEnd(e);switch(this.type){case"doc-start":{Fi(e.start)!==-1?(yield*this.pop(),yield*this.step()):e.start.push(this.sourceToken);return}case"anchor":case"tag":case"space":case"comment":case"newline":e.start.push(this.sourceToken);return}const t=this.startBlockValue(e);t?this.stack.push(t):yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}*scalar(e){if(this.type==="map-value-ind"){const t=vn(this.peek(2)),n=pt(t);let r;e.end?(r=e.end,r.push(this.sourceToken),delete e.end):r=[this.sourceToken];const i={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:n,key:e,sep:r}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(e)}*blockScalar(e){switch(this.type){case"space":case"comment":case"newline":e.props.push(this.sourceToken);return;case"scalar":if(e.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let t=this.source.indexOf(`
|
|
144
|
-
`)+1;for(;t!==0;)this.onNewLine(this.offset+t),t=this.source.indexOf(`
|
|
145
|
-
`,t)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){const t=e.items[e.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,t.value){const n="end"in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment"?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case"space":case"comment":if(t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else{if(this.atIndentedComment(t.start,e.indent)){const r=e.items[e.items.length-2]?.value?.end;if(Array.isArray(r)){Array.prototype.push.apply(r,t.start),r.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return}if(this.indent>=e.indent){const n=!this.onKeyLine&&this.indent===e.indent,r=n&&(t.sep||t.explicitKey)&&this.type!=="seq-item-ind";let i=[];if(r&&t.sep&&!t.value){const o=[];for(let a=0;a<t.sep.length;++a){const l=t.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>e.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=t.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":r||t.value?(i.push(this.sourceToken),e.items.push({start:i}),this.onKeyLine=!0):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case"explicit-key-ind":!t.sep&&!t.explicitKey?(t.start.push(this.sourceToken),t.explicitKey=!0):r||t.value?(i.push(this.sourceToken),e.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(t.explicitKey)if(t.sep)if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(Ae(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(Ki(t.key)&&!Ae(t.sep,"newline")){const o=pt(t.start),a=t.key,l=t.sep;l.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?t.sep=t.sep.concat(i,this.sourceToken):t.sep.push(this.sourceToken);else if(Ae(t.start,"newline"))Object.assign(t,{key:null,sep:[this.sourceToken]});else{const o=pt(t.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else t.sep?t.value||r?e.items.push({start:i,key:null,sep:[this.sourceToken]}):Ae(t.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const o=this.flowScalar(this.type);r||t.value?(e.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):t.sep?this.stack.push(o):(Object.assign(t,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{const o=this.startBlockValue(e);if(o){if(o.type==="block-seq"){if(!t.explicitKey&&t.sep&&!Ae(t.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else n&&e.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){const t=e.items[e.items.length-1];switch(this.type){case"newline":if(t.value){const n="end"in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment"?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case"space":case"comment":if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){const r=e.items[e.items.length-2]?.value?.end;if(Array.isArray(r)){Array.prototype.push.apply(r,t.start),r.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case"anchor":case"tag":if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;t.value||Ae(t.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return}if(this.indent>e.indent){const n=this.startBlockValue(e);if(n){this.stack.push(n);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){const t=e.items[e.items.length-1];if(this.type==="flow-error-end"){let n;do yield*this.pop(),n=this.peek(1);while(n&&n.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!t||t.sep?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return;case"map-value-ind":!t||t.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!t||t.value?e.items.push({start:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const r=this.flowScalar(this.type);!t||t.value?e.items.push({start:[],key:r,sep:[]}):t.sep?this.stack.push(r):Object.assign(t,{key:r,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}const n=this.startBlockValue(e);n?this.stack.push(n):(yield*this.pop(),yield*this.step())}else{const n=this.peek(2);if(n.type==="block-map"&&(this.type==="map-value-ind"&&n.indent===e.indent||this.type==="newline"&&!n.items[n.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&n.type!=="flow-collection"){const r=vn(n),i=pt(r);Bi(e);const o=e.end.splice(1,e.end.length);o.push(this.sourceToken);const a={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:i,key:e,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let t=this.source.indexOf(`
|
|
146
|
-
`)+1;for(;t!==0;)this.onNewLine(this.offset+t),t=this.source.indexOf(`
|
|
147
|
-
`,t)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;const t=vn(e),n=pt(t);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;const t=vn(e),n=pt(t);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){return this.type!=="comment"||this.indent<=t?!1:e.every(n=>n.type==="newline"||n.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}}function qi(s){const e=s.prettyErrors!==!1;return{lineCounter:s.lineCounter||e&&new _i||null,prettyErrors:e}}c(qi,"parseOptions");function Hc(s,e={}){const{lineCounter:t,prettyErrors:n}=qi(e),r=new Ts(t?.addNewLine),i=new Cs(e),o=Array.from(i.compose(r.parse(s)));if(n&&t)for(const a of o)a.errors.forEach(mn(s,t)),a.warnings.forEach(mn(s,t));return o.length>0?o:Object.assign([],{empty:!0},i.streamInfo())}c(Hc,"parseAllDocuments");function Ui(s,e={}){const{lineCounter:t,prettyErrors:n}=qi(e),r=new Ts(t?.addNewLine),i=new Cs(e);let o=null;for(const a of i.compose(r.parse(s),!0,s.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new Ue(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return n&&t&&(o.errors.forEach(mn(s,t)),o.warnings.forEach(mn(s,t))),o}c(Ui,"parseDocument");function Yc(s,e,t){let n;typeof e=="function"?n=e:t===void 0&&e&&typeof e=="object"&&(t=e);const r=Ui(s,t);if(!r)return null;if(r.warnings.forEach(i=>ei(r.options.logLevel,i)),r.errors.length>0){if(r.options.logLevel!=="silent")throw r.errors[0];r.errors=[]}return r.toJS(Object.assign({reviver:n},t))}c(Yc,"parse");function Zc(s,e,t){let n=null;if(typeof e=="function"||Array.isArray(e)?n=e:t===void 0&&e&&(t=e),typeof t=="string"&&(t=t.length),typeof t=="number"){const r=Math.round(t);t=r<1?void 0:r>8?{indent:8}:{indent:r}}if(s===void 0){const{keepUndefined:r}=t??e??{};if(!r)return}return Fe(s)&&!n?s.toString(t):new St(s,n,t).toString(t)}c(Zc,"stringify");var Qc=Object.freeze({__proto__:null,Alias:Zt,CST:Vc,Composer:Cs,Document:St,Lexer:ji,LineCounter:_i,Pair:X,Parser:Ts,Scalar:L,Schema:An,YAMLError:ms,YAMLMap:se,YAMLParseError:Ue,YAMLSeq:Oe,YAMLWarning:ki,isAlias:Ie,isCollection:V,isDocument:Fe,isMap:st,isNode:G,isPair:W,isScalar:U,isSeq:rt,parse:Yc,parseAllDocuments:Hc,parseDocument:Ui,stringify:Zc,visit:Ke,visitAsync:Yt});class Is extends zo{static{c(this,"TypedEventEmitter")}on(e,t){return super.on(e,t)}emit(e,...t){return super.emit(e,...t)}off(e,t){return super.off(e,t)}once(e,t){return super.once(e,t)}}const re={Updated:"updated",Deleted:"deleted",Stopped:"stopped"},Xc={ignored:va,persistent:!0,ignoreInitial:!0,followSymlinks:!1,depth:20,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100},ignorePermissionErrors:!0,atomic:!0,usePolling:!1,alwaysStat:!1,interval:1e3,binaryInterval:300};class el extends Is{static{c(this,"LocalElementWatcher")}constructor(e){super(),this.options=e,this.membraneDir=ie(this.options.cwd),this.lockTimeoutMs=this.options.lockTimeoutMs??1e3}isWatching=!1;watcher;membraneDir;contentCache={};ignoredPaths=new Set;lockTimeoutMs;async start(){this.isWatching||(O.existsSync(this.membraneDir)||O.mkdirSync(this.membraneDir,{recursive:!0}),this.initializeContentCache(),this.watcher=Go.watch(this.membraneDir,Xc),this.watcher.on("add",e=>this.handleFileSystemEvent(re.Updated,e)).on("change",e=>this.handleFileSystemEvent(re.Updated,e)).on("unlink",e=>this.handleFileSystemEvent(re.Deleted,e)).on("ready",()=>this.isWatching=!0))}async stop(){!this.isWatching||!this.watcher||(await this.watcher.close(),this.isWatching=!1,this.watcher=void 0,this.clearCache(),this.clearAllLocks(),this.emit(re.Stopped))}getCwd(){return this.options.cwd}async executeWithPathLock(e,t){const n=x.resolve(e);this.ignoredPaths.add(n);try{await t()}finally{setTimeout(()=>{this.ignoredPaths.delete(n)},this.lockTimeoutMs)}}isPathLocked(e){const t=x.resolve(e);if(this.ignoredPaths.has(t))return!0;for(const n of this.ignoredPaths)if(t.startsWith(n+x.sep))return!0;return!1}clearAllLocks(){this.ignoredPaths.clear()}handleFileSystemEvent(e,t){const n=x.relative(this.membraneDir,t);if(this.isPathLocked(t))return;if(e===re.Deleted){this.removeFromCache(n);const a={filePath:t,relativePath:n,data:void 0};b.info(`[local] ${e}: ${a.relativePath}`),this.emit(e,a);return}const r=this.readFileContent(t);if(!this.hasContentChanged(n,r))return;const o=this.processFileEvent(t,r);this.updateCache(n,r),o&&(b.info(`[local] ${e}: ${o.relativePath}`),this.emit(e,o))}readFileContent(e){return O.readFileSync(e,"utf8")}processFileEvent(e,t){const n=x.relative(this.membraneDir,e);let r;try{r=t?Qc.parse(t):void 0}catch{r=void 0}return{filePath:e,relativePath:n,data:r}}hasContentChanged(e,t){if(!t)return this.contentCache[e]!==void 0;const n=this.getContentHash(t);return this.contentCache[e]!==n}getContentHash(e){return Wo.createHash("sha256").update(e).digest("hex")}updateCache(e,t){if(!t){delete this.contentCache[e];return}this.contentCache[e]=this.getContentHash(t)}removeFromCache(e){delete this.contentCache[e]}clearCache(){Object.keys(this.contentCache).forEach(e=>{delete this.contentCache[e]})}initializeContentCache(){O.existsSync(this.membraneDir)&&this.scanDirectoryForCache(this.membraneDir)}scanDirectoryForCache(e){const t=O.readdirSync(e,{withFileTypes:!0});for(const n of t){const r=x.join(e,n.name);if(n.isDirectory())this.scanDirectoryForCache(r);else if(n.isFile())try{const i=O.readFileSync(r,"utf8"),o=x.relative(this.membraneDir,r);this.updateCache(o,i)}catch{}}}}var Os=(s=>(s.Updated="updated",s.ConnectorFileUpdated="connector-file-updated",s.Connected="connected",s.Disconnected="disconnected",s.Error="error",s))(Os||{});const tl={debounceMs:2e3,reconnectIntervalMs:5e3,maxReconnectAttempts:1/0,maxBackoffMs:6e4,connectionTimeoutMs:3e5};class nl extends Is{static{c(this,"RemoteElementWatcher")}constructor(e=tl){super(),this.config=e}eventSource;debounceTimeouts=new Map;reconnectAttempts=0;reconnectTimeout;connectionTimeout;isStarted=!1;isConnected=!1;async start(){this.isStarted||(this.isStarted=!0,await this.connect())}async stop(){this.isStarted&&(this.isStarted=!1,this.isConnected=!1,this.clearReconnectTimeout(),this.clearConnectionTimeout(),this.clearAllDebounceTimeouts(),this.eventSource&&(this.eventSource.close(),this.eventSource=void 0))}async connect(){try{b.debug("[remote-events] Connecting to server"),this.eventSource&&(this.eventSource.close(),this.eventSource=void 0);const e=await D.getClient(process.cwd()),t=await e.getToken();if(!t)throw new Error("No auth token available");const n=`${e.apiUri}/sse/workspace?token=${encodeURIComponent(t)}`;b.debug("[remote-events] Subscribing to workspace events"),this.eventSource=new Ho(n),this.setupEventSourceHandlers()}catch(e){b.debug(`[remote-events] Failed to connect: ${e}`),this.emit("error",{error:e}),this.scheduleReconnect()}}setupEventSourceHandlers(){this.eventSource&&(this.eventSource.onopen=()=>{b.debug("[remote-events] Connected to server"),this.reconnectAttempts=0,this.isConnected=!0,this.resetConnectionTimeout(),this.emit("connected",{})},this.eventSource.onmessage=e=>{try{this.resetConnectionTimeout();const t=JSON.parse(e.data);this.handleElementUpdate(t)}catch(t){b.debug(`[remote-events] Failed to parse workspace event: ${t}`)}},this.eventSource.onerror=e=>{b.debug(`[remote-events] Connection error: ${JSON.stringify(e,null,2)}`),this.isConnected=!1,this.clearConnectionTimeout(),this.eventSource&&(this.eventSource.close(),this.eventSource=void 0),this.emit("disconnected",{}),this.isStarted&&this.scheduleReconnect()})}handleElementUpdate(e){if(e.type!==No.ElementUpdate)return;const{elementId:t,elementType:n,data:r={}}=e;if(!(!t||!n)){if(n===N.Connector){const{filePath:i,eventType:o,newPath:a}=r;return b.debug(`[remote-watcher] Received connector event - elementId: ${t}, filePath: ${i}, eventType: ${o}`),this.scheduleConnectorFileUpdate(t,i,o,a)}return this.scheduleElementUpdate(t,n)}}scheduleElementUpdate(e,t){const n=this.debounceTimeouts.get(e);n&&clearTimeout(n);const r=setTimeout(()=>{this.debounceTimeouts.delete(e),this.emit("updated",{elementId:e,elementType:t})},this.config.debounceMs);this.debounceTimeouts.set(e,r)}scheduleConnectorFileUpdate(e,t,n,r){const i=JSON.stringify({connectorId:e,filePath:t}),o=this.debounceTimeouts.get(i);o&&clearTimeout(o);const a=setTimeout(()=>{this.debounceTimeouts.delete(i),this.emit("connector-file-updated",{connectorId:e,filePath:t,eventType:n,newPath:r})},this.config.debounceMs);this.debounceTimeouts.set(i,a)}scheduleReconnect(){if(!this.isStarted||this.reconnectAttempts>=this.config.maxReconnectAttempts){this.reconnectAttempts>=this.config.maxReconnectAttempts&&(b.error("[remote-events] Max reconnection attempts reached. Connection will not be retried."),this.emit("error",{error:new Error("Max reconnection attempts reached")}));return}this.reconnectTimeout&&clearTimeout(this.reconnectTimeout),this.reconnectAttempts++;const e=this.config.reconnectIntervalMs*Math.pow(2,this.reconnectAttempts-1),t=Math.random()*.3*e,n=Math.min(e+t,this.config.maxBackoffMs);b.debug(`[remote-events] Reconnecting in ${Math.round(n)}ms (attempt ${this.reconnectAttempts})`),this.reconnectTimeout=setTimeout(()=>{this.connect()},n)}clearReconnectTimeout(){this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}resetConnectionTimeout(){this.clearConnectionTimeout(),this.connectionTimeout=setTimeout(()=>{this.isConnected&&this.isStarted&&(b.debug("[remote-events] Connection timeout detected, reconnecting..."),this.isConnected=!1,this.eventSource&&(this.eventSource.close(),this.eventSource=void 0),this.scheduleReconnect())},this.config.connectionTimeoutMs)}clearConnectionTimeout(){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=void 0)}clearAllDebounceTimeouts(){this.debounceTimeouts.forEach(e=>clearTimeout(e)),this.debounceTimeouts.clear()}}class Ji{static{c(this,"ElementsCache")}elements=new Map;typeIndex=new Map;internalIdIndex=new Map;constructor(e){e&&this.addAll(e)}add(e){const t=e.id;this.elements.set(t,e),this.typeIndex.has(e.type)||this.typeIndex.set(e.type,new Set),this.typeIndex.get(e.type).add(t),e.data?.id&&this.internalIdIndex.set(e.data.id,t)}remove(e){const t=e.id,n=this.elements.delete(t);if(n){const r=this.typeIndex.get(e.type);r&&(r.delete(t),r.size===0&&this.typeIndex.delete(e.type)),e.data?.id&&this.internalIdIndex.delete(e.data.id)}return n}put(e){this.elements.has(e.id)&&this.remove(e),this.add(e)}get(e){return this.elements.get(e)}getByInternalId(e){const t=this.internalIdIndex.get(e);if(t)return this.elements.get(t)}getElementsByType(e){const t=this.typeIndex.get(e);return t?Array.from(t).map(n=>this.elements.get(n)).filter(n=>n!==void 0):[]}getAll(){return Array.from(this.elements.values())??[]}getTypes(){return Array.from(this.typeIndex.keys())}addAll(e){for(const t of e)t&&this.add(t)}removeAll(e){for(const t of e)this.remove(t)}getElementIdsByType(e){return this.typeIndex.get(e)}clear(){this.elements.clear(),this.typeIndex.clear(),this.internalIdIndex.clear()}getAllIds(){return new Set(this.elements.keys())}}const mt="connectors",ve="development",As={};async function Wi(s={}){const{onProgress:e}=s,t=new Set,r=(await D.withClient(u=>u.get("org-workspace-id"))).id,i={};b.info("[connectors] Loading custom connectors"),await D.withClient(u=>u.get(`/connectors?workspaceId=${r}`)),b.info("[connectors] Loading public connectors");const o=$e(),l=(F.existsSync(o)?F.readdirSync(o):[]).filter(u=>{if(u.startsWith("."))return!1;const f=_.join(o,u);try{return F.statSync(f).isDirectory()}catch{return!1}});for(const u of l){b.info(`[connectors] Loading connector from: ${u}`);const f=F.readdirSync(_.join(o,u)),d=await $s(u);if(!d)continue;e?.("pushing",d.name),"baseUri"in d&&delete d.baseUri;let h;if(d.uuid&&(h=await D.withClient(y=>y.get(`/connectors/${d.uuid}`),!1)),h)i[d.id]=h.id,b.info(`[connectors] Matched ${d.name} uuid: ${d.uuid}`),h.isPublic||(h.archivedAt&&(b.info(`[connectors] Restoring archived connector ${d.name}`),await D.withClient(y=>y.post(`connectors/${h.id}/restore`))),b.info(`[connectors] Updating connector ${d.name}`),await D.withClient(y=>y.patch(`connectors/${h.id}`,{...d,workspaceId:r})));else if(!i[d.id]&&!h?.isPublic){let y=!1;try{const p=await Ns({connectorId:d.id});p&&p.isPublic&&(y=!0)}catch{}if(!y){b.info(`[connectors] Creating custom connector ${d.name} (${d.key})`);const p=await D.withClient(w=>w.post("connectors",{...d,workspaceId:r}));i[d.id]=p.id}}const g=f.filter(y=>F.statSync(_.join(o,u,y)).isDirectory());for(const y of g)await il({connector:d,version:y,connectorId:i[d.id]}),t.add(d.id);e?.("pushed",d.name)}return{connectorsMapping:i,pushedConnectors:Array.from(t)}}c(Wi,"pushConnectors");async function Vi({connectorId:s,connectorVersion:e,allConnectors:t,pulledConnectors:n,pulledConnectorVersions:r}){if(!s||r[s]?.has(e))return;const i=cr(),o=await Ns({connectorId:s});if(!o.isPublic||t){if(!o?.key){console.error(`[connectors] Connector ${s} has no key. Skipping..`),b.error(`[connectors] Connector ${s} has no key. Skipping..`);return}n.has(s)||(await ol({basePath:i,connector:o}),n.add(s)),r[s]||(r[s]=new Set),r[s].has(e)||(await al({connector:o,connectorVersion:e,basePath:i}),r[s].add(e))}}c(Vi,"pullRemoteConnector");function $e(){const s=zn();return _.join(s.membraneDirPath,mt)}c($e,"getConnectorsPath");async function $s(s){const e=_.join($e(),s,`${s}.yml`);return Zn(e,!1)}c($s,"readConnector");async function sl(s,e){return b.info(`[connectors] Zipping ${s} into ${e}`),new Promise((t,n)=>{const r=F.createWriteStream(e),i=nr("zip",{zlib:{level:9}});r.on("close",()=>{b.success(`[connectors] Successfully created ${e}`),t()}),r.on("end",()=>{b.info("[connectors] Data has been drained")}),i.on("warning",a=>{a.code==="ENOENT"?console.warn(a):n(a)}),i.on("error",a=>{n(a)}),i.pipe(r);const o=F.readdirSync(s);for(const a of o){const l=_.join(s,a),u=F.statSync(l);u.isFile()?i.file(l,{name:a}):u.isDirectory()&&i.directory(l,a)}i.finalize()})}c(sl,"createZipArchive");async function rl(s,e){return b.info(`[connectors] Unzipping into ${e}`),new Promise((t,n)=>{const r=rr.Parse();r.on("entry",i=>{const o=i.path;if(i.type==="Directory"){const l=_.join(e,o);F.mkdirSync(l,{recursive:!0}),i.autodrain()}else{const l=_.join(e,o),u=_.dirname(l);F.mkdirSync(u,{recursive:!0});const f=F.createWriteStream(l);i.pipe(f),f.on("finish",()=>{})}}),r.on("end",()=>{b.success(`[connectors] Successfully extracted to ${e}`),t()}),r.on("error",i=>{n(i)}),r.write(s),r.end()})}c(rl,"extractZipArchive");async function il({connector:s,version:e,connectorId:t}){const n=_.join($e(),ke(s),Gi(e)),r=_.join(n,"src"),i=_.join(n,"src.zip"),o=F.existsSync(i);if(F.existsSync(r)&&(b.info(`[connectors] Archiving source code for ${s.name} version ${e}`),await sl(r,i)),!F.existsSync(i)){b.warning(`[connectors] No source code found for ${s.name} version ${e}`);return}try{const a=new sr;if(a.append("file",F.createReadStream(i),"file.zip"),b.info(`[connectors] Pushing connector version ${e} for ${s.name}`),e==ve)b.info(`[connectors] Uploading connector ${t}`),await D.withClient(l=>l.post(`connectors/${t}/upload`,a,{headers:{...a.getHeaders()}}));else{if(a.append("version",e),a.append("changelog","Imported Version"),(await D.withClient(u=>u.get(`/connectors/${t}/versions`))).find(u=>u.version==e)){b.info(`[connectors] Version ${e} already published`);return}b.info(`[connectors] Publishing version ${e} of connector ${t}`),await D.withClient(u=>u.post(`connectors/${t}/publish-version`,a,{headers:{...a.getHeaders()}}))}b.success(`Successfully pushed connector version ${e} for ${s.name}`)}catch(a){b.error(`Error pushing connector version ${e} for ${s.name}: ${a}`),console.error(`[connectors] Error pushing connector version ${e} for ${s.name}: ${a}`)}finally{!o&&F.existsSync(i)&&(b.info(`[connectors] Cleaning up temporary zip file for ${s.name} version ${e}`),F.unlinkSync(i))}}c(il,"pushConnectorVersion");async function Ns({connectorId:s}){if(s){if(As[s])return As[s];try{const e=await D.withClient(t=>t.get(`connectors/${s}`),!1);return As[s]=e,e}catch(e){return b.error(`[connectors] Failed to get connector ${s}: ${e}`),console.error(`[connectors] Failed to get connector ${s}: ${e}`),null}}}c(Ns,"getConnector");async function ol({basePath:s,connector:e}){const t=ke(e),n=_.join(s,mt,t);F.mkdirSync(n,{recursive:!0});const r=_.join(n,`${ke(e)}.yml`);F.writeFileSync(r,ue.dump(e)),b.info(`[connectors] Pulled connector ${e.name}`)}c(ol,"pullConnector$1");async function al({connector:s,connectorVersion:e,basePath:t}){const n=ke(s),r=Gi(e),i=_.join(t,"connectors",n,r),o=await D.withClient(l=>l.get(`connectors/${s.id}/download`,{version:e},{responseType:"arraybuffer",headers:{Accept:"application/zip"},timeout:1e6}));F.mkdirSync(i,{recursive:!0});const a=_.join(i,"src.zip");if(F.writeFileSync(a,o),!e){const l=_.join(i,"src");F.mkdirSync(l,{recursive:!0}),await rl(o,l)}b.info(`[connectors] Pulled connector version: ${s.name} (${r})`)}c(al,"pullConnectorVersion");function ke(s){return s.key}c(ke,"getConnectorDirName");function Gi(s){return s??ve}c(Gi,"getConnectorVersionDirName");function cl(s){const e=cr(),t=ke(s);return _.join(e,mt,t)}c(cl,"getConnectorDirPath");function ll(s){return s.match(`${mt}/[^/]+/${ve}/src/.*`)!==null}c(ll,"isConnectorSourceFile");async function ul(s){const e=s.match(`${mt}/([^/]+)/${ve}/src/(.*)`);if(!e)return;const t=e[1],n=e[2],r=await $s(t);if(!r){b.warning(`[connectors] Connector ${t} not found. Ignoring file change`);return}const i=r.id,o=F.readFileSync(s,"utf-8");await D.withClient(a=>a.put(`connectors/${i}/files/${n}`,o,{headers:{"Content-Type":"text/plain"}})),b.info(`[connectors] Pushed file ${n} for connector ${r.name}`)}c(ul,"putConnectorFile");async function fl(s){const e=s.match(`${mt}/([^/]+)/${ve}/src/(.*)`);if(!e)return;const t=e[1],n=e[2],r=await $s(t);if(!r){b.warning(`[connectors] Connector ${t} not found. Ignoring file change`);return}const i=r.id;await D.withClient(o=>o.delete(`connectors/${i}/files/${n}`)),b.info(`[connectors] Deleted file ${n} for connector ${r.name}`)}c(fl,"deleteConnectorFile");async function dl(s,e){try{const t=await D.withClient(o=>o.get(`connectors/${s}`));if(!t){b.warning(`[connectors] Connector ${s} not found`);return}const n=await D.withClient(o=>o.get(`connectors/${s}/files/${e}`)),r=ke(t),i=_.join($e(),r,ve,"src",e);F.mkdirSync(_.dirname(i),{recursive:!0}),n!=null?(F.writeFileSync(i,n),b.info(`[connectors] Pulled file ${e} for connector ${t.name}`)):F.existsSync(i)&&(F.unlinkSync(i),b.info(`[connectors] Deleted file ${e} for connector ${t.name}`))}catch(t){b.error(`[connectors] Failed to pull connector file ${e} for connector ${s}: ${t}`),console.error(`[connectors] Failed to pull connector file ${e} for connector ${s}: ${t}`)}}c(dl,"pullConnectorFile");async function hl(s,e){const t=await D.withClient(i=>i.get(`connectors/${s}`),!1);if(!t){b.warning(`[connectors] Connector ${s} not found`);return}const n=ke(t),r=_.join($e(),n,ve,"src",e);F.existsSync(r)&&(F.unlinkSync(r),b.info(`[connectors] Deleted file ${e} for connector ${n}`))}c(hl,"deleteLocalConnectorFile");async function pl(s,e,t){if(t&&e!==t)try{const n=await D.withClient(l=>l.get(`connectors/${s}`),!1);if(!n){b.warning(`[connectors] Connector ${s} not found`);return}const r=ke(n),i=_.join($e(),r,ve,"src"),o=_.join(i,e),a=_.join(i,t);F.existsSync(o)&&(F.mkdirSync(_.dirname(a),{recursive:!0}),F.renameSync(o,a),b.info(`[connectors] Renamed directory from ${e} to ${t} for connector ${r}`))}catch(n){b.error(`[connectors] Failed to rename directory ${e} to ${t} for connector ${s}: ${n}`)}}c(pl,"renameLocalConnectorDirectory");async function ml(s,e){try{const t=await D.withClient(i=>i.get(`connectors/${s}`),!1);if(!t){b.warning(`[connectors] Connector ${s} not found`);return}const n=ke(t),r=_.join($e(),n,ve,"src",e);if(F.existsSync(r)){const i=_.resolve($e());if(!_.resolve(r).startsWith(i))return;F.rmSync(r,{recursive:!0,force:!0}),b.info(`[connectors] Deleted directory ${e} for connector ${n}`)}}catch(t){b.error(`[connectors] Failed to delete directory ${e} for connector ${s}: ${t}`)}}c(ml,"deleteLocalConnectorDirectory");const H={LogAdded:"logAdded",StateChanged:"stateChanged",StatsChanged:"statsChanged",ConflictsChanged:"conflictsChanged",McpStatusChanged:"mcpStatusChanged",McpServersChanged:"mcpServersChanged",ConfigChanged:"configChanged"};class gl extends Is{static{c(this,"WorkspaceNotifications")}constructor(e){super(),this.config=e,b.setNotificationHandler(this)}clientId;heartbeatInterval;isCleaningUp=!1;async connectToRemote(){await this.registerWithRemoteServer(),await this.startHeartbeatLoop()}async setState(e){this.emit(H.StateChanged,{state:e}),await this.emitRemote({status:e})}setConflicts(e){this.emit(H.ConflictsChanged,{conflicts:e})}setConfig(e){this.emit(H.ConfigChanged,{config:e})}setStats(e){this.emit(H.StatsChanged,{stats:e})}addLog(e){this.emit(H.LogAdded,{log:e})}setMcpStatus(e){this.emit(H.McpStatusChanged,{status:e})}async setMcpServers(e){this.emit(H.McpServersChanged,{servers:e}),await this.emitRemote({mcpServers:e.map(t=>({name:t.agentName,totalRequests:t.totalRequests}))})}async cleanup(){!this.clientId||this.isCleaningUp||(this.isCleaningUp=!0,this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=void 0),await this.withErrorHandling(async()=>{await D.withClient(e=>e.delete(`/local-clients/${this.clientId}`))}),this.clientId=void 0)}async registerWithRemoteServer(){if(this.clientId)return;const e=await this.withErrorHandling(async()=>await D.withClient(t=>t.post("/local-clients",{hostname:tr.hostname(),workingDirectory:process.cwd()})));e?.id?this.clientId=e.id:this.addLog({timestamp:new Date().toISOString(),message:"Failed to register with remote server",type:"error"})}async startHeartbeatLoop(){this.heartbeatInterval=setInterval(async()=>{this.clientId&&await this.sendHeartbeat()},this.config.heartbeatIntervalMs)}async sendHeartbeat(){this.clientId&&await this.withErrorHandling(async()=>{await D.withClient(e=>e.post(`/local-clients/${this.clientId}/keep-alive`,{}))})}async emitRemote(e){this.clientId&&await this.withErrorHandling(async()=>{await D.withClient(t=>t.patch(`/local-clients/${this.clientId}`,e))})}async withErrorHandling(e){try{return await e()}catch(t){const n=t instanceof Error?t.message:String(t);return this.addLog({timestamp:new Date().toISOString(),message:`Failed to connect to remote: ${n}`,type:"error"}),null}}}const Ne=new gl({heartbeatIntervalMs:15e3}),zi=[N.AppDataSchema,N.AppEventType,N.DataLinkTable,N.DataSource,N.FieldMapping,N.Action,N.Flow,N.Package];class Rt{static{c(this,"ElementSyncService")}localWatcher=void 0;remoteWatcher=void 0;notifier;changes=[];localCache;remoteCache;localRepo;remoteRepo;pulledConnectors=new Set;pulledConnectorVersions={};constructor(){this.notifier=Ne,this.localCache=new Ji,this.remoteCache=new Ji,this.localRepo=new qa(this.localCache),this.remoteRepo=new Ua(this.remoteCache)}clear(){this.changes=[]}needsForcedSync(){return this.changes.some(e=>e.isConflict)}needsSync(){return this.changes.length>0}async getStats(){const e=this.localCache.getAll(),t={};return e.forEach(n=>{t[n.type]=(t[n.type]||0)+1}),t}async fetchElements(){const e=await this.localRepo.getElements(),t=await this.remoteRepo.getElements();this.localCache.addAll(e),this.remoteCache.addAll(t)}async updateElement(e,t){const n=this.getHandler(t),r=this.getCache(t);try{const i=await n.putElement(e);r.put(i)}catch(i){throw b.error(`Failed to update element ${e.id}: ${i}`),i}}async deleteElement(e,t){const n=this.getHandler(t),r=this.getCache(t);try{await n.deleteElement(e,{elements:n.cache.getAll(),connectorsMapping:n.connectorsMapping}),r.remove(e)}catch(i){throw b.error(`Failed to delete element ${e.id}: ${i}`),i}}async pullConnectors(e=!1){const t=this.remoteCache.getElementsByType(N.Integration).map(n=>n.data);for(const n of t){const r=n.connectorId,i=n.connectorVersion;r&&await Vi({connectorId:r,connectorVersion:i,allConnectors:e,pulledConnectors:this.pulledConnectors,pulledConnectorVersions:this.pulledConnectorVersions})}}async pushConnectors(){const{connectorsMapping:e}=await Wi();this.remoteRepo.setConnectorsMapping(e)}getHandler(e){return e===te.INCOMING?this.localRepo:(this.remoteRepo.setSourceCache(this.localCache),this.remoteRepo)}getCache(e){return e===te.INCOMING?this.localCache:this.remoteCache}async startWatching(){this.localWatcher=new el({cwd:process.cwd(),lockTimeoutMs:1e3}),this.localWatcher.on(re.Updated,e=>this.handleLocalEvent(e,re.Updated)),this.localWatcher.on(re.Deleted,e=>this.handleLocalEvent(e,re.Deleted)),await this.localWatcher.start(),b.success("[local] Tracking changes.."),this.remoteWatcher=new nl,this.remoteWatcher.on(Os.Updated,({elementId:e,elementType:t})=>this.handleRemoteElementEvent(e,t)),this.remoteWatcher.on(Os.ConnectorFileUpdated,({connectorId:e,filePath:t,eventType:n,newPath:r})=>this.handleRemoteConnectorFileEvent(e,t,n,r)),await this.remoteWatcher.start(),b.success("[remote] Tracking changes..")}async stopWatching(){this.localWatcher&&(await this.localWatcher.stop(),this.localWatcher=void 0),this.remoteWatcher&&(await this.remoteWatcher.stop(),this.remoteWatcher=void 0)}async handleRemoteElementEvent(e,t){try{const n=await this.remoteRepo.getByInternalId(e,t),r=!!n?.data.archivedAt||!!n?.data.isDeactivated;if(!n||r){const o=n||this.remoteCache.getByInternalId(e);return o?(b.info(`[${this.getDirectionLabel(te.INCOMING)}] Deleted: ${o.id}`),this.localWatcher?.executeWithPathLock(o.absolutePath,()=>this.deleteElement(o,te.INCOMING))):void 0}if(b.info(`[${this.getDirectionLabel(te.INCOMING)}] Updated: ${n.id}`),await this.localWatcher?.executeWithPathLock(n.absolutePath,async()=>this.updateElement(n,te.INCOMING)),t===N.Integration){const o=n.data.connectorId,a=n.data.connectorVersion,l=await Ns({connectorId:o});if(!l?.key)return;const u=cl(l);await this.localWatcher?.executeWithPathLock(u,async()=>Vi({connectorId:o,connectorVersion:a,allConnectors:!1,pulledConnectors:this.pulledConnectors,pulledConnectorVersions:this.pulledConnectorVersions}))}}catch(n){b.error(`[sync] Error handling remote event: ${n}`)}}async handleRemoteConnectorFileEvent(e,t,n,r){try{switch(n){case Nn.ConnectorFileDeleted:await hl(e,t);break;case Nn.ConnectorDirectoryRenamed:await pl(e,t,r);break;case Nn.ConnectorDirectoryDeleted:await ml(e,t);break;default:await dl(e,t);break}}catch(i){b.error(`[sync] Error handling remote connector file event: ${i}`)}}async handleLocalEvent(e,t){try{if(ll(e.filePath))switch(t){case re.Updated:await ul(e.filePath);break;case re.Deleted:await fl(e.filePath);break}else{let n=z.fromPathAndData(e.filePath,e.data);if(!n){const r=z.idFromPath(e.filePath);if(!r||(n=this.remoteCache.get(r),!n))return}switch(b.info(`[${this.getDirectionLabel(te.OUTGOING)}] ${Fa.toSentenceCase(t)}: ${n.id}`),t){case re.Updated:await this.updateElement(n,te.OUTGOING);break;case re.Deleted:await this.deleteElement(n,te.OUTGOING);break}}}catch(n){b.error(`[sync] Error handling local event: ${n}`)}}detectIncomingChanges(){this.clearChanges();const e=Rt.getChanges(te.INCOMING,this.remoteCache,this.localCache);return this.updateChanges(e),e}detectOutgoingChanges(){this.clearChanges();const e=Rt.getChanges(te.OUTGOING,this.localCache,this.remoteCache);return this.updateChanges(e),e}async resolveChanges(){if(!this.needsSync())return;b.info("[resolver] Resolving changes.."),b.info("[resolver] Resolving integration elements");const e=this.changes.filter(r=>r.element.type===N.Integration);await Promise.all(e.map(async r=>this.resolveChange(r))),e.length>0&&(await this.fetchElements(),this.changes=this.changes.length>0&&this.changes[0]?.direction===te.INCOMING?this.detectIncomingChanges():this.detectOutgoingChanges(),this.changes=this.changes.filter(r=>r.element.type!==N.Integration)),b.info("[resolver] Resolving universal elements");const t=this.changes.filter(r=>!r.element.hasParent());for(const r of zi){const i=t.filter(o=>o.element.type===r);b.info(`[resolver] Resolving ${r} elements`),await Promise.all(i.map(async o=>this.resolveChange(o)))}b.info("[resolver] Resolving integration level elements");const n=this.changes.filter(r=>r.element.hasParent());for(const r of zi){const i=n.filter(o=>o.element.type===r);b.info(`[resolver] Resolving ${r} elements`),await Promise.all(i.map(async o=>this.resolveChange(o)))}b.success("[resolver] Resolved changes")}async resolveChange(e){switch(e.type){case be.DELETE:return this.deleteElement(e.element,e.direction);case be.CREATE:return this.updateElement(e.element,e.direction);case be.UPDATE:return this.updateElement(e.element,e.direction)}}static getChanges(e,t,n){const r=t.getAllIds(),i=n.getAllIds(),o=new Set([...r,...i]),a=[];for(const l of o){const u=t.get(l),f=n.get(l),d=Rt.detectChangeForElement(u,f,e);d&&a.push(d)}return a}updateChanges(e){if(this.changes=e,this.needsForcedSync()){const t=e.filter(n=>n.isConflict);b.warning("[resolver] Conflicts detected"),this.notifier.setConflicts(t)}}clearChanges(){this.changes=[]}getDirectionLabel(e){switch(e){case te.INCOMING:return"local\u2190remote";case te.OUTGOING:return"local\u2192remote"}}static detectChangeForElement(e,t,n){return e&&!t?{type:be.CREATE,element:e,direction:n,isConflict:!1}:!e&&t?{type:be.DELETE,element:t,direction:n,isConflict:!0}:e&&t&&!e.isEqual(t)?{type:be.UPDATE,element:e,direction:n,isConflict:!1}:null}}const xe=x.join(Yo.tmpdir(),"membrane-mcp-status"),Hi=3e4;class yl{static{c(this,"McpStatusService")}constructor(e=2e3){this.pollIntervalMs=e}isRunning=!1;pollInterval;async start(){this.isRunning||(this.isRunning=!0,this.pollInterval=setInterval(async()=>await this.checkStatus(),this.pollIntervalMs),await this.checkStatus())}async stop(){this.pollInterval&&(clearInterval(this.pollInterval),this.pollInterval=void 0,this.isRunning=!1)}async checkStatus(){try{const e=process.cwd(),t=kn(void 0,e),n=Yi(e);t&&Ne.setMcpStatus(t),await Ne.setMcpServers(n)}catch{b.error("Failed to check MCP status")}}}function kn(s,e){try{const t=e||process.cwd();if(!s){const r=Yi(t);return r.length===0?null:r[0]}const n=Ls(s,t);if(O.existsSync(n)){const r=O.statSync(n),i=new Date;if(i.getTime()-r.mtime.getTime()>Hi)return Pt(s,t),null;const a=O.readFileSync(n,"utf8"),l=JSON.parse(a);if(l.isRunning){const u=new Date(l.lastActivity).getTime();if(i.getTime()-u>Hi)return Pt(s,t),null}return l}}catch{s&&e&&Pt(s,e)}return null}c(kn,"getMcpStatus");function Yi(s){try{const e=s||process.cwd(),t=Ps(e);if(!O.existsSync(xe))return[];const n=O.readdirSync(xe),r=[];for(const i of n){const o=i.match(new RegExp(`^mcp-${t}-(\\d+)\\.json$`));if(o){const a=parseInt(o[1],10),l=kn(a,e);l&&r.push(l)}}return r.sort((i,o)=>new Date(o.startTime).getTime()-new Date(i.startTime).getTime())}catch{return[]}}c(Yi,"getAllMcpStatusFiles");function xs(s){try{const t={...kn(s.processId,s.cwd)||{isRunning:!1,startTime:new Date().toISOString(),lastActivity:new Date().toISOString(),toolsCount:0,totalRequests:0,processId:s.processId,cwd:s.cwd,agentName:process.env.AGENT_NAME||"Unnamed Agent"},...s};O.existsSync(xe)||O.mkdirSync(xe,{recursive:!0});const n=Ls(s.processId,s.cwd);O.writeFileSync(n,JSON.stringify(t,null,2))}catch{}}c(xs,"updateMcpStatus");function Pt(s,e){try{const t=e||process.cwd();if(s){const n=Ls(s,t);O.existsSync(n)&&O.unlinkSync(n)}else{const n=Ps(t);if(O.existsSync(xe)){const r=O.readdirSync(xe);for(const i of r)i.match(new RegExp(`^mcp-${n}-\\d+\\.json$`))&&O.unlinkSync(x.join(xe,i))}}}catch{}}c(Pt,"clearMcpStatus");function wl(s,e){const t=kn(s,e);t&&xs({processId:s,cwd:e,totalRequests:t.totalRequests+1,lastRequestTime:new Date().toISOString(),lastActivity:new Date().toISOString()})}c(wl,"trackToolExecution");function Ps(s){return Vo("md5").update(s).digest("hex").slice(0,8)}c(Ps,"getCwdHash");function Ls(s,e){const t=Ps(e);return x.join(xe,`mcp-${t}-${s}.json`)}c(Ls,"getStatusFilePath");const En={Agent:"agent",Cli:"cli"},M={NOT_INITIALIZED:"not_initialized",SETTING_UP:"setting_up",INITIALIZED:"initialized",NOT_SYNCED:"not_synced",PULLING:"pulling",PUSHING:"pushing",RESOLVING:"resolving",CONFLICTS:"conflicts",SYNCED:"synced",WATCHING:"watching",ERROR:"error"};class bl{static{c(this,"MembraneCLIService")}constructor(e,t,n=()=>process.exit(0)){this.mode=e,this.cwd=t,this.onShutdown=n,this.notifier=Ne,this.mcpStatusService=new yl,this.syncService=new Rt,this.setupProcessCleanup()}initialized=!1;notifier;mcpStatusService;syncService;isShuttingDown=!1;currentConfig=null;get config(){return this.currentConfig}getSyncedElements(){return this.syncService.localCache.getAll()}getSyncedElementsByType(e){return this.syncService.localCache.getElementsByType(e)}async fetchElements(){await this.syncService.fetchElements()}async pullWorkspace(e={}){let t=!1;try{if(b.setVerboseMode(!!e.verbose),e.rps!==void 0&&D.init({maxRequestsPerSecond:e.rps}),await this.notifier.setState(M.PULLING),await this.syncService.fetchElements(),this.syncService.detectIncomingChanges(),this.syncService.needsForcedSync()&&!e.force){await this.notifier.setState(M.CONFLICTS),e.watch||(t=!0);return}await this.syncService.pullConnectors(e.allConnectors),await this.syncWorkspaces(e)}catch(n){t=!0,b.error(`Failed to pull workspace: ${n}`),await this.notifier.setState(M.ERROR),b.saveLogsToFile("error")}finally{if(e.saveLogs&&b.saveLogsToFile(),t)process.exit(1);else return e?.onComplete?.()}}async pushWorkspace(e={}){let t=!1;try{if(b.setVerboseMode(!!e.verbose),e.rps!==void 0&&D.init({maxRequestsPerSecond:e.rps}),await this.notifier.setState(M.PUSHING),await this.syncService.fetchElements(),this.syncService.detectOutgoingChanges(),this.syncService.needsForcedSync()&&!e.force){await this.notifier.setState(M.CONFLICTS),e.watch||(t=!0);return}await this.syncService.pushConnectors(),await this.syncWorkspaces(e)}catch(n){t=!0,b.error(`Failed to push workspace: ${n}`),await this.notifier.setState(M.ERROR),b.saveLogsToFile("error")}finally{if(e.saveLogs&&b.saveLogsToFile(),t)process.exit(1);else return e?.onComplete?.()}}async syncWorkspaces(e={}){try{e.verbose!==void 0&&b.setVerboseMode(!!e.verbose),await this.notifier.setState(M.RESOLVING),this.syncService.needsSync()&&await this.syncService.resolveChanges();const t=await this.syncService.getStats();this.notifier.setStats(t),await this.notifier.setState(M.SYNCED),e.watch&&(await this.notifier.setState(M.WATCHING),await this.syncService.startWatching())}catch(t){b.error(`Failed to sync local and remote workspaces: ${t}`),await this.notifier.setState(M.ERROR),b.saveLogsToFile("error")}}async init({force:e=!1}={}){if(!(this.initialized&&!e)){await this.notifier.setState(M.NOT_INITIALIZED);try{await this.loadConfig(),_e.isCacheDefined()?(await this.initServices(),this.initialized=!0,await this.notifier.setState(M.INITIALIZED)):(this.initialized=!1,await this.notifier.setState(M.SETTING_UP))}catch(t){b.error(`Failed to initialize services: ${t}`),await this.notifier.setState(M.ERROR),b.saveLogsToFile("error"),this.onShutdown()}}}async loadConfig(){this.currentConfig=_e.loadConfig(this.cwd),this.notifier.setConfig(this.currentConfig)}async updateConfig(e){const t={...this.currentConfig,...e};if(!(JSON.stringify(t)!==JSON.stringify(this.currentConfig)))return;await this.stopServices();const r=_e.updateConfig(t);this.currentConfig=r,await this.init({force:!0})}async shutdown(){!this.initialized||this.isShuttingDown||(this.isShuttingDown=!0,this.mode===En.Agent&&(await this.notifier.cleanup(),await this.mcpStatusService.stop()),this.initialized=!1,this.onShutdown())}async initServices(){this.mode===En.Agent&&(await this.notifier.connectToRemote(),await this.mcpStatusService.start()),this.syncService.clear()}async stopServices(){this.mode===En.Agent&&(await this.notifier.cleanup(),await this.mcpStatusService.stop())}setupProcessCleanup(){["SIGINT","SIGTERM","uncaughtException","unhandledRejection"].forEach(t=>process.on(t,()=>this.shutdown())),process.on("beforeExit",t=>{t===0&&this.shutdown()})}}const Zi=Mn(null);function Sl({children:s,membraneCLIService:e}){const{data:t}=er("/account"),[n,r]=q(M.NOT_INITIALIZED),[i,o]=q([]),[a,l]=q({}),[u,f]=q([]),[d,h]=q(null),y=t?.workspaces?.find(p=>p.workspaceKey===d?.workspaceKey)||null;return ze(()=>{const p=c(({state:I})=>r(I),"handleStateChanged"),w=c(({stats:I})=>l(I),"handleStatsChanged"),k=c(({log:I})=>f(P=>[...P,I]),"handleLogAdded"),E=c(({conflicts:I})=>o(I),"handleConflictsUpdated"),A=c(({config:I})=>h(I),"handleConfigChanged");return e.notifier.on(H.StateChanged,p),e.notifier.on(H.StatsChanged,w),e.notifier.on(H.LogAdded,k),e.notifier.on(H.ConflictsChanged,E),e.notifier.on(H.ConfigChanged,A),e.init(),()=>{e.notifier.off(H.StateChanged,p),e.notifier.off(H.StatsChanged,w),e.notifier.off(H.LogAdded,k),e.notifier.off(H.ConflictsChanged,E),e.notifier.off(H.ConfigChanged,A)}},[]),m(Zi.Provider,{value:{state:n,stats:a,logs:u,currentWorkspace:y,conflicts:i,config:d,updateConfig:c(p=>e.updateConfig(p),"updateConfig"),resolveConflicts:c(p=>e.syncWorkspaces(p),"resolveConflicts"),pull:c(p=>e.pullWorkspace(p),"pull"),push:c(p=>e.pushWorkspace(p),"push"),exit:c(()=>e.shutdown(),"exit"),fetchElements:c(()=>e.fetchElements(),"fetchElements"),getSyncedElementsByType:c(p=>e.getSyncedElementsByType(p),"getSyncedElementsByType")},children:s})}c(Sl,"MembraneCLIServiceProvider");function he(){const s=jn(Zi);if(!s)throw new Error("useMembraneCLIService must be used within MembraneCLIServiceProvider");return s}c(he,"useMembraneCLIService");const Rs=Mn(null),Qi=c(()=>{const s=jn(Rs);if(!s)throw new Error("useTree must be used within TreeView");return s},"useTree"),Cl=c(s=>De.Children.count(s)>0,"hasChildren");function vl(s){const e=Qi(),{label:t,value:n,isInitiallyExpanded:r}=s,i=_o(),o=_n(e.registerChildItem(t)).current,a=e.isActiveByRef(o),[l,u]=q(r??!1),f={props:s,ref:o,id:i,active:a,expanded:l,setExpanded:u,label:t,value:n,isInitiallyExpanded:r,isParent:!1},{children:d}=s,h=typeof d=="function"?d(f):d;return{...f,props:{...s,children:h},isParent:Cl(h)}}c(vl,"useTreeItem");function gt(s){const e=Qi(),t=vl(s),{expanded:n,isParent:r,props:{children:i},setExpanded:o}=t,{renderValue:a=El}=s,l=t.ref;Mt(()=>{function h(g){return s.onInput?.(g)?!0:g.active&&g.key.rightArrow&&!n?(o(!0),!0):g.active&&g.key.leftArrow&&n?(o(!1),!0):!1}c(h,"onInput"),l.onInput=h},[l,s.onInput,n,o]),l.firstChild??={parent:l,index:0};let u=l.firstChild;function f(h){const g=u;return g.nextSibling||(g.nextSibling={parent:l,prevSibling:g,index:g.index+1}),u=g.nextSibling,g.label=h,g}c(f,"registerChildItem");function d(){l.lastRenderedChild=u.prevSibling}return c(d,"commitChildren"),Mt(()=>{d()}),T(jt,{children:[T(S,{marginLeft:e.depth*2,children:[m(S,{width:2,children:r&&m(C,{children:n?"\u25BC":"\u25B6"})}),kl(t),a(t)]}),n&&m(Rs.Provider,{value:{...e,depth:e.depth+1,registerChildItem:f},children:i})]})}c(gt,"TreeItem");function kl({active:s,label:e}){return m(S,{width:32,children:m(C,{inverse:s,children:e})})}c(kl,"defaultRenderLabel");function El(s){return m(C,{})}c(El,"defaultRenderValue");const We=c(({label:s,onPress:e,hotkey:t})=>m(gt,{label:s,onInput:c(({input:n,key:r,active:i})=>i&&r.return||t&&t in r&&r[t]||n===t?(e(),!0):!1,"onInput"),renderValue:c(()=>m(S,{children:m(C,{children:`${t?` (${t})`:""}`})}),"renderValue")}),"ActionTreeItem"),Xi=c(({label:s,value:e,onChange:t,disabled:n=!1,mask:r,...i})=>{const[o,a]=q(e),[l,u]=q(!1);return Mt(()=>{l||a(e)},[l,e]),m(gt,{label:s,value:e,onInput:c(({key:f,active:d})=>n?!1:l?(f.escape&&u(!1),f.return&&(t(o),u(!1)),!0):d&&f.return?(u(!0),a(e),!0):!1,"onInput"),renderValue:c(()=>{const f=o,d=r?r.repeat(f.length):f;return m(S,{children:n||!l?m(C,{dimColor:!0,children:d}):T(jt,{children:[m(S,{width:d.length+1,children:m(ir,{...i,focus:l,value:f,onChange:a})}),m(C,{dimColor:!0,children:" \u241B cancel"})]})})},"renderValue")})},"TreeTextField"),Tl=c(s=>m(Xi,{...s,mask:"*"}),"SecretField"),ce=c(({children:s,showHelp:e=!1})=>{const t=_n({parent:void 0,label:"<<ROOT>>",index:0}),[n,r]=q(t.current),i={depth:0,isActiveByRef:c(a=>n===a,"isActiveByRef"),registerChildItem:c(()=>t.current,"registerChildItem"),activeItemRef:n};Mt(()=>{r(a=>a.parent?a.parent.lastRenderedChild&&a.index>a.parent.lastRenderedChild.index?a.parent.lastRenderedChild:a:t.current.firstChild??t.current)});function*o(a){a&&(yield a,yield*o(a.firstChild),a.nextSibling&&a!==a.parent?.lastRenderedChild&&(yield*o(a.nextSibling)))}return c(o,"walkTree"),Me((a,l)=>{if(n.onInput?.({input:a,key:l,active:!0}))return;let u,f;for(const d of o(t.current))if(d.label!=null){if(u===n&&(f=d),d&&d.onInput?.({input:a,key:l,active:d===n}))return;u=d}l.upArrow?r(d=>d.prevSibling?.lastRenderedChild??d.prevSibling??d.parent??t.current):l.downArrow?r(d=>f??d):l.pageUp?r(()=>t.current.firstChild??t.current):l.pageDown?r(()=>t.current.lastRenderedChild??t.current):l.tab?console.log({label:n.label,nextSibling:n.nextSibling?.label,prevSibling:n.prevSibling?.label,parent:n.parent?.label,firstChild:n.firstChild?.label,lastRenderedChild:n.lastRenderedChild?.label}):l.leftArrow?r(d=>d.parent??t.current):l.rightArrow&&r(d=>d.lastRenderedChild?d.firstChild:d)}),m(Rs.Provider,{value:i,children:T(S,{flexDirection:"column",children:[m(gt,{isInitiallyExpanded:!0,label:"rootItem",children:s}),e&&m(S,{marginTop:1,flexDirection:"column",children:m(C,{dimColor:!0,children:"\u2191/\u2193 move \u2022 \u2190 collapse \u2022 \u2192 expand \u2022 Enter/Space select/edit \u2022 Esc exit"})})]})})},"TreeView");ce.Item=gt,ce.TextField=Xi;function Ve({label:s,elementType:e,isActionExcluded:t,toggleAction:n,generateCode:r}){const[i,o]=q([]),{fetchElements:a,getSyncedElementsByType:l}=he();return ze(()=>{c(async()=>{try{await a();const f=l(e);o(f.map(d=>d.data))}catch(f){console.error(String(f))}},"loadElements")()},[e,a,l,o]),m(gt,{label:s,children:i.map(u=>m(gt,{label:u.name,children:e===N.Action&&T(jt,{children:[t&&n&&m(We,{label:`Toggle ${t(u)?"":"(excluded)"}`,onPress:c(()=>{n(u)},"onPress")}),r&&m(We,{label:"Generate code",onPress:c(()=>{r?.(u)},"onPress")})]})},u.id))})}c(Ve,"WorkspaceElementsTreeItem");function Il({onComplete:s}){const{config:e,updateConfig:t,fetchElements:n,getSyncedElementsByType:r}=he(),[i,o]=q(""),a=e,l=c(h=>{o(h),setTimeout(()=>o(""),2e3)},"setFlash"),u=c(async(h,g)=>{try{await t({[h]:g}),l("\u2705 Configuration updated!")}catch{l("\u274C Error updating configuration")}},"updateField"),f=c(async()=>{try{if(e){const h=_e.saveToFile(e);l(h?"\u2705 Configuration saved successfully!":"\u274C Failed to save configuration"),await n();const g=r(N.Action);await Wn({out:a?.outputDir??"",target:a?.projectType??"typescript",schemasOnly:!1,membraneInterfaces:{actions:g.filter(y=>!a?.excludedActionKeys?.includes(y.key)).map(y=>y.data)}}),l("\u2705 Code generated successfully!")}}catch{l("\u274C Error saving configuration")}},"handleSaveConfig"),d=c(async()=>{try{const h=_e.loadConfig();h?(await t(h),l("\u2705 Configuration reloaded successfully!")):l("\u274C No configuration found to reload")}catch{l("\u274C Error reloading configuration")}},"handleReloadConfig");return T(S,{flexDirection:"column",gap:1,children:[m(C,{bold:!0,color:"cyan",children:"\u2699\uFE0F Membrane Configuration Manager"}),m(S,{paddingX:2,children:T(ce,{showHelp:!0,children:[T(ce.Item,{label:"Configuration",isInitiallyExpanded:!0,children:[T(ce.Item,{label:"Project",children:[m(ce.TextField,{label:"Workspace Key",value:a?.workspaceKey??"",onChange:c(h=>u("workspaceKey",h),"onChange"),disabled:!0}),m(Tl,{label:"Workspace Secret",value:a?.workspaceSecret??"",onChange:c(h=>u("workspaceSecret",h),"onChange"),disabled:!0}),m(ce.TextField,{label:"API URI",value:a?.apiUri??"",onChange:c(h=>u("apiUri",h),"onChange")}),m(ce.TextField,{label:"Test Customer ID",value:a?.testCustomerId??"",onChange:c(h=>u("testCustomerId",h),"onChange")})]}),T(ce.Item,{label:"Code Generation",isInitiallyExpanded:!0,children:[T(ce.Item,{label:"Project Type",isInitiallyExpanded:!0,value:a?.projectType,renderValue:c(({value:h})=>m(C,{children:h==="typescript"?"TypeScript":h==="openapi"?"OpenAPI":"(Not set)"}),"renderValue"),children:[m(We,{label:"Update to TypeScript",onPress:c(()=>u("projectType","typescript"),"onPress")}),m(We,{label:"Update to OpenAPI",onPress:c(()=>u("projectType","openapi"),"onPress")})]}),m(ce.TextField,{label:"Project dir",value:a?.outputDir??"",onChange:c(h=>u("outputDir",h),"onChange")})]}),T(ce.Item,{label:"Workspace Elements",children:[m(Ve,{label:"Actions",elementType:N.Action,isActionExcluded:c(h=>a?.excludedActionKeys?.includes(h.key)??!1,"isActionExcluded"),toggleAction:c(h=>u("excludedActionKeys",[...a?.excludedActionKeys??[],h.key]),"toggleAction"),generateCode:c(h=>{(async()=>{try{await Wn({out:a?.outputDir??"",target:a?.projectType??"typescript",schemasOnly:!1,membraneInterfaces:{actions:[h]}}),l("\u2705 Code generated successfully!")}catch{l("\u274C Error generating code")}})()},"generateCode")}),m(Ve,{label:"Flows",elementType:N.Flow}),m(Ve,{label:"Data Sources",elementType:N.DataSource}),m(Ve,{label:"Field Mappings",elementType:N.FieldMapping}),m(Ve,{label:"Packages",elementType:N.Package}),m(Ve,{label:"App Data Schemas",elementType:N.AppDataSchema}),m(Ve,{label:"App Event Types",elementType:N.AppEventType})]})]}),m(We,{label:"Save Configuration",onPress:f,hotkey:"s"}),m(We,{label:"Reload Configuration",onPress:d,hotkey:"r"}),m(We,{label:"Exit",onPress:c(()=>s?.(),"onPress"),hotkey:"escape"})]})}),i&&m(S,{paddingX:2,children:m(C,{color:i.includes("\u2705")?"green":"red",children:i})})]})}c(Il,"ConfigManager");const eo=Mn(process.cwd());function Ol({cwd:s,children:e}){return m(eo.Provider,{value:s,children:e})}c(Ol,"CwdProvider");function Al(){return jn(eo)}c(Al,"useCwd");function Ds({cwd:s,children:e,membraneCLIService:t}){const n=s||process.cwd();return m(Ol,{cwd:n,children:m(Zo,{value:{fetcher:Sa()},children:m(Sl,{membraneCLIService:t,children:e})})})}c(Ds,"Layout");function $l(s,e){s.command("config").alias("install").description("\u26A0\uFE0F EXPERIMENTAL: Manage local membrane configuration with interactive UI").addHelpText("after",["","Examples:"," membrane config # Open interactive config manager",""].join(`
|
|
148
|
-
`)).action(()=>{Fn(De.createElement(Ds,{membraneCLIService:e,children:De.createElement(Il,{onComplete:c(()=>process.exit(0),"onComplete")})}))})}c($l,"setupConfigCommand");function Nl({currentPat:s,onSubmit:e}){const[t,n]=q(""),[r,i]=q(!1),[o,a]=q(null);return T(S,{flexDirection:"column",borderStyle:"round",borderTop:!0,width:70,paddingX:1,children:[m(S,{marginTop:-1,marginBottom:1,children:m(C,{bold:!0,children:"\u{1F511} Enter your Personal Access Token"})}),m(C,{children:"Please provide your Personal Access Token. You can find it here:"}),m(S,{marginTop:1,marginBottom:1,children:m(C,{color:"yellow",children:"https://console.integration.app/w/0/manage-account/api-token"})}),s&&m(C,{dimColor:!0,children:"Press Enter to keep your current token or type a new one."}),m(ir,{mask:"*",placeholder:`${s?"******":"Enter your token here..."}`,value:t,onChange:n,onSubmit:c(async u=>{a(null),i(!0);try{await e(u),n("")}catch{a("Invalid token. Please try again.")}finally{i(!1)}},"handleSubmit")}),r&&m(S,{marginTop:1,children:T(C,{children:[m(_t,{type:"dots"})," Validating token..."]})}),o&&m(C,{color:"red",children:o})]})}c(Nl,"PersonalAccessTokenInput");function to({onExit:s,showEscOption:e=!0}){const[t,n]=q(""),{data:r,error:i,isLoading:o}=er("/account"),{updateConfig:a}=he(),l=r?.workspaces,u=o;if(Me((p,w)=>{w.escape&&s?.()}),u)return T(S,{children:[m(_t,{}),m(C,{children:" Fetching workspaces..."})]});if(i)return T(S,{flexDirection:"column",children:[T(C,{color:"red",children:["Error: ",i.message]}),m(S,{marginTop:1,children:m(C,{color:"grey",children:"Press ESC to go back"})})]});const f=l?.filter(p=>p.name.toLowerCase().includes(t.toLowerCase()))??[],d=f.map(p=>({label:p.name,value:p.id})),h=d.length,g=l?.length??0;async function y(p){const w=f.find(A=>A.id===p);if(!w)return;const{key:k,secret:E}=w;!k||!E||(await a({workspaceKey:k,workspaceSecret:E}),s?.())}return c(y,"handleSelect"),T(S,{flexDirection:"column",borderStyle:"round",borderTop:!0,width:70,paddingX:1,children:[m(S,{marginTop:-1,children:m(C,{bold:!0,children:"\u{1F4C1} Select your workspace"})}),T(S,{marginTop:1,children:[m(C,{children:"Search: "}),m(Qo,{placeholder:"Enter a search query...",onChange:n})]}),g>5&&T(C,{children:["Showing ",h," of ",g," workspaces."]}),m(S,{marginTop:1,children:m(Xo,{options:d,onChange:c(p=>{p&&y(p)},"onChange")})}),e&&m(S,{marginTop:1,children:m(C,{color:"grey",children:"Press ESC to go back"})})]})}c(to,"SelectWorkspace");var Lt=(s=>(s[s.Authenticate=0]="Authenticate",s[s.ConnectWorkspace=1]="ConnectWorkspace",s))(Lt||{});const xl={0:"Authenticate in Membrane",1:"Connect a Membrane Workspace"},Ms=[Lt.Authenticate,Lt.ConnectWorkspace];function no({onComplete:s}){const{config:e}=he(),[t,n]=q(!1),[r,i]=q(0),o=!!(e?.workspaceKey&&e?.workspaceSecret),a=ur(),l=Ms[r],u=r+1,f=Ms.length,d=Ms.map((y,p)=>{let w="pending";return p<r?w="done":p===r&&(w="current"),{id:y,label:xl[y],status:w}});async function h(y){const p=a&&y===""?a:y,w=new fr;try{await w.request("/account",{headers:{Authorization:`Bearer ${p}`}}),ba(p),i(k=>k+1)}catch(k){console.error(k)}}c(h,"handlePatSubmit");function g(){n(!0),s&&s()}return c(g,"handleWorkspaceSelected"),Me((y,p)=>{o&&p.escape&&s&&s()}),t?m(S,{children:m(C,{children:"\u2705 Setup complete. You are ready to go!"})}):T(S,{flexDirection:"column",alignSelf:"flex-start",gap:1,children:[T(S,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:70,children:[m(S,{marginTop:-1,marginBottom:1,children:T(C,{bold:!0,children:["\u{1F6E0}\uFE0F Setup \u2014"," ",T(C,{color:"cyan",children:["Step ",u," of ",f]}),o&&m(C,{color:"grey",children:" [esc: go back]"})]})}),m(S,{flexDirection:"column",paddingLeft:2,children:d.map(y=>m(Pl,{status:y.status,label:y.label},y.id))})]}),l===Lt.Authenticate&&m(Nl,{currentPat:a,onSubmit:h}),l===Lt.ConnectWorkspace&&m(to,{onExit:g,showEscOption:!1})]})}c(no,"Setup");function Pl({status:s,label:e}){return T(S,{children:[T(S,{width:2,children:[s==="current"&&m(_t,{type:"dots"}),s==="done"&&m(C,{children:"\u2705"})]}),m(C,{dimColor:s!=="current",children:e})]})}c(Pl,"StepDisplay");function Ll(s,e){s.command("init").description("Run interactive setup for Membrane project").option("--key <key>","Workspace key for non-interactive setup").option("--secret <secret>","Workspace secret for non-interactive setup").addHelpText("after",["","Examples:"," membrane init # Run interactive setup"," membrane init --key KEY --secret SEC # Non-interactive setup with key and secret",""].join(`
|
|
149
|
-
`)).action(t=>{t.key&&t.secret?_e.saveToFile({workspaceKey:t.key,workspaceSecret:t.secret})?(console.error("\u2705 Configuration saved to membrane.config.yml"),process.exit(0)):(console.error("Error writing configuration file"),process.exit(1)):t.key||t.secret?(console.error("Error: Both --key and --secret must be provided for non-interactive mode"),process.exit(1)):Fn(De.createElement(Ds,{membraneCLIService:e,children:De.createElement(no,{onComplete:c(()=>process.exit(0),"onComplete")})}))})}c(Ll,"setupInitCommand");const Rl=86400;async function Dl(s,e,t,n){const r={iss:s,isAdmin:!0};return t&&(r.id=t),Kn.sign(r,e,{expiresIn:Rl})}c(Dl,"generateMcpAccessToken");async function Ml(s,e){return(await Ct.get(`${s}/docs-json`,{headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"}})).data}c(Ml,"fetchOpenApiSchema");function Pe(s,e=!0,t,n=new Set){if(!s)return e?B.string():B.string().optional();if(Object.keys(s).length===0)return e?B.any():B.any().optional();if(s.$ref){const i=s.$ref.replace("#/components/schemas/","");if(n.has(i))return B.any();if(n.add(i),t?.schemas?.[i]){const o=t.schemas[i];return Pe(o,e,t,n)}return B.any()}let r;if(s.type==="object"||s.properties){const i={};if(s.properties)for(const[o,a]of Object.entries(s.properties)){const l=s.required?.includes(o)??!1;i[o]=Pe(a,l,t,n)}if(Object.keys(i).length>0){if(r=B.object(i),s.additionalProperties)if(typeof s.additionalProperties=="object"){const o=Pe(s.additionalProperties,!1,t,n);r=r.catchall(o)}else s.additionalProperties===!0&&(r=r.passthrough())}else if(s.additionalProperties&&typeof s.additionalProperties=="object"){const o=Pe(s.additionalProperties,!1,t,n);r=B.record(B.string(),o)}else r=B.record(B.string(),B.any())}else if(s.type==="array"){const i=s.items?Pe(s.items,!0,t,n):B.any();r=B.array(i)}else if(s.anyOf)r=B.any();else{switch(s.type){case"integer":r=B.coerce.number().int();break;case"number":r=B.coerce.number();break;case"boolean":r=B.coerce.boolean();break;case"string":default:r=B.string();break}s.format==="uuid"?r=B.string().uuid():s.format==="email"?r=B.string().email():s.format==="date"?r=B.string().regex(/^\d{4}-\d{2}-\d{2}$/):s.format==="date-time"&&(r=B.string().datetime()),s.enum&&(r=B.enum(s.enum)),(s.type==="integer"||s.type==="number")&&(s.minimum!==void 0&&(r=r.min(s.minimum)),s.maximum!==void 0&&(r=r.max(s.maximum))),s.type==="string"&&(s.minLength!==void 0&&(r=r.min(s.minLength)),s.maxLength!==void 0&&(r=r.max(s.maxLength)))}return e?r:r.optional()}c(Pe,"convertOpenApiSchemaToZod");function so(s){const e=s.match(/\{([^}]+)\}/g);return e?e.map(t=>t.slice(1,-1)):[]}c(so,"extractPathParameters");function jl(s,e,t,n,r,i){const o=s.operationId||`${t}_${e.replace(/[^a-zA-Z0-9]/g,"_")}`,a=s.description||s.summary||`${t.toUpperCase()} ${e}`,l={},u={},f={};if(s.parameters){for(const h of s.parameters)if(h.in==="path")u[h.name]=Pe(h.schema,!0,r).describe(h.description||`Path parameter: ${h.name}`);else if(h.in==="query"){const g=h.required===!0;f[h.name]=Pe(h.schema,g,r).describe(h.description||`Query parameter: ${h.name}`)}}if(Object.keys(u).length>0&&(l.params=B.object(u).describe("Path parameters")),Object.keys(f).length>0&&(l.query=B.object(f).describe("Query parameters")),s.requestBody&&s.requestBody.content){const h=s.requestBody.required===!0;if(s.requestBody.content["application/json"]){const g=s.requestBody.content["application/json"].schema;g?l.body=Pe(g,h,r).describe("Request body (JSON)"):l.body=B.any().describe("Request body (JSON)")}else s.requestBody.content["application/octet-stream"]||s.requestBody.content["text/plain"]?l.body=h?B.string().describe("Request body (binary/text)"):B.string().optional().describe("Request body (binary/text)"):l.body=B.any().describe("Request body")}const d=Object.keys(l).length>0?B.object(l):B.object({});return{name:o,description:a,parameters:d,async execute(h){try{const g=so(e);if(g.length>0){if(!h.params)throw new Error(`Missing required path parameters: ${g.join(", ")}`);const A=g.filter(I=>!(I in h.params));if(A.length>0)throw new Error(`Missing required path parameters: ${A.join(", ")}`)}let y=`${n}${e}`;if(h.params)for(const[A,I]of Object.entries(h.params)){const P=`{${A}}`;y.includes(P)&&(y=y.replace(P,String(I)))}const p=so(y);if(p.length>0)throw new Error(`Unresolved path parameters: ${p.join(", ")}`);const w=new URLSearchParams;if(h.query)for(const[A,I]of Object.entries(h.query))I!=null&&w.append(A,String(I));w.toString()&&(y+=`?${w.toString()}`);const k={method:t.toUpperCase(),headers:{Authorization:`Bearer ${i}`}};h.body&&t.toLowerCase()!=="get"&&(s.requestBody?.content?.["application/json"]?(k.headers["Content-Type"]="application/json",k.data=h.body):s.requestBody?.content?.["application/octet-stream"]?(k.headers["Content-Type"]="application/octet-stream",k.data=h.body):s.requestBody?.content?.["text/plain"]?(k.headers["Content-Type"]="text/plain",k.data=h.body):(k.headers["Content-Type"]="application/json",k.data=h.body));const E=await Ct.request({url:y,...k});return{content:[{type:"text",text:E.data===""?"":JSON.stringify(E.data,null,2)}]}}catch(g){return Ct.isAxiosError(g)?{content:[{type:"text",text:`Error: ${g.response?.data?`HTTP ${g.response.status}: ${g.response.statusText} - ${JSON.stringify(g.response.data)}`:`HTTP ${g.response?.status||"unknown"}: ${g.message}`}`}],isError:!0}:g instanceof Error?{content:[{type:"text",text:`Error: API call failed: ${g.message}`}],isError:!0}:{content:[{type:"text",text:"Error: API call failed with unknown error"}],isError:!0}}}}}c(jl,"createApiTool");function _l(s,e,t){const n=[];if(!s.paths)return n;const r=s.components||{};for(const[i,o]of Object.entries(s.paths))if(typeof o=="object"&&o!==null){for(const[a,l]of Object.entries(o))if(["get","post","put","delete","patch"].includes(a)&&l&&typeof l=="object"){const u=jl(l,i,a,e,r,t);n.push(u)}}return n}c(_l,"convertOpenApiToTools");function Fl(s){s.command("mcp").description("Launch MCP server with OpenAPI endpoints as tools (API URI is read from environment variables or membrane.config.yml)").addHelpText("after",["","Examples:"," membrane mcp # Launch MCP server using API URI from env vars or membrane.config.yml",""].join(`
|
|
150
|
-
`)).action(async()=>{try{process.env.FASTMCP_SUPPRESS_WARNINGS="true";const e=Kt(),t=process.env.MEMBRANE_ACCESS_TOKEN||e?.accessToken,n=process.env.MEMBRANE_WORKSPACE_KEY||e?.workspaceKey,r=process.env.MEMBRANE_WORKSPACE_SECRET||e?.workspaceSecret,i=process.env.MEMBRANE_TEST_CUSTOMER_ID||e?.testCustomerId,o=process.env.MEMBRANE_API_URI||e?.apiUri||Gn;!t&&(!n||!r)&&(e||(console.error("No configuration found. Please set MEMBRANE_ACCESS_TOKEN, or MEMBRANE_WORKSPACE_KEY and MEMBRANE_WORKSPACE_SECRET environment variables, or run `membrane init` first to create a configuration file."),process.exit(1)),console.error("Missing credentials. Please provide MEMBRANE_ACCESS_TOKEN or workspace key/secret in the configuration file, command line, or environment variables."),process.exit(1));const a=t||await Dl(n,r,i),l=await Ml(o,a),u=_l(l,o,a),f=new ta({name:"Membrane API",instructions:`This MCP server lets you interact with Membrane to configure, run, and troubleshoot integrations.
|
|
2
|
+
var vn=Object.defineProperty;var c=(r,e)=>vn(r,"name",{value:e,configurable:!0});import*as v from"node:fs";import{mkdirSync as En,writeFileSync as Tn,readFileSync as xn}from"node:fs";import*as x from"node:path";import{join as Oe,dirname as In}from"node:path";import{fileURLToPath as $n}from"node:url";import w from"chalk";import{Command as kn}from"commander";import{WorkspaceElementType as T,MembraneConfigLoader as Rn,MembraneAxiosInstance as Pn,MembraneClient as vt,extractMembraneErrorData as J,WorkspaceElementSpecs as V,WorkspaceSyncEventType as An,ConnectorFileUpdateType as Ne,NotFoundError as Dn,getMembraneElementPath as On,parseMembraneElementPath as ie,CONNECTOR_VERSION_DEVELOPMENT as Et,compareWorkspaceExports as Nn,WorkspaceElementChangeType as Y,setValueAtLocator as Me,getDataCollectionCreateFields as Fe,excludeWriteOnlyFieldsFromSchema as Tt,valueToSchema as ve,getRequiredFieldsFromSchema as Mn,getValueAtLocator as Fn,walkSchema as xt,makeDataLocationPath as It,getDataCollectionUpdateFields as Le}from"@membranehq/sdk";import je from"lodash/camelCase.js";import Ue from"lodash/upperFirst.js";import Ln from"code-block-writer";import jn from"lodash/uniqBy.js";import se,{createContext as Ke,useState as D,useEffect as he,useContext as qe,useId as Un,useRef as Be,useLayoutEffect as Ee,useMemo as Kn}from"react";import{Box as g,Text as y,useInput as ae,render as _e,Newline as qn}from"ink";import{jsx as u,jsxs as b,Fragment as Te}from"react/jsx-runtime";import $t from"swr/immutable";import kt from"os";import R from"path";import Bn from"conf";import ge,{isAxiosError as _n}from"axios";import We from"jsonwebtoken";import{AsyncLocalStorage as Wn}from"async_hooks";import{toSentenceCase as Jn}from"js-convert-case";import Gn from"lodash/isEqual.js";import G from"js-yaml";import*as Hn from"node:crypto";import{createHash as zn}from"node:crypto";import Vn from"chokidar";import Yn from"yaml";import{EventEmitter as Zn}from"events";import{EventSource as Xn}from"eventsource";import P from"fs";import Rt from"archiver";import Pt from"form-data";import At from"unzipper";import*as Qn from"node:os";import"node:events";import Dt from"ink-text-input";import{SWRConfig as er}from"swr";import xe from"ink-spinner";import{TextInput as tr,Select as nr,Spinner as rr}from"@inkjs/ui";import{FastMCP as or}from"fastmcp";import{z as A}from"zod";import Ot from"ora";import Nt from"jszip";import{minimatch as ir}from"minimatch";import{exec as sr}from"node:child_process";import Je from"lodash/merge.js";import ar from"@anthropic-ai/sdk";import{faker as ye}from"@faker-js/faker";import cr from"lodash/template.js";import lr from"lodash/templateSettings.js";function ce(r){if(r.type){if(Array.isArray(r.type))return{anyOf:r.type.map(t=>ce({...r,type:t}))};if(r.type==="array"){const t={type:"array",items:r.items?ce(r.items):{type:"object"}};return r.title&&(t.title=r.title),r.description&&(t.description=r.description),r.minItems!==void 0&&(t.minItems=r.minItems),r.maxItems!==void 0&&(t.maxItems=r.maxItems),r.uniqueItems!==void 0&&(t.uniqueItems=r.uniqueItems),t}}const e={};if(r.type&&!Array.isArray(r.type)&&(e.type=r.type),r.title&&(e.title=r.title),r.description&&(e.description=r.description),r.format&&(e.format=r.format),r.enum&&(e.enum=r.enum),r.default!==void 0&&(e.default=r.default),r.minimum!==void 0&&(e.minimum=r.minimum),r.maximum!==void 0&&(e.maximum=r.maximum),r.minLength!==void 0&&(e.minLength=r.minLength),r.maxLength!==void 0&&(e.maxLength=r.maxLength),r.maxItems!==void 0&&(e.maxItems=r.maxItems),r.readOnly!==void 0&&(e.readOnly=r.readOnly),r.writeOnly!==void 0&&(e.writeOnly=r.writeOnly),r.examples&&r.examples.length>0&&(e.example=r.examples[0]),r.properties){e.properties={};for(const[t,n]of Object.entries(r.properties))e.properties[t]=ce(n)}return r.anyOf&&(e.anyOf=r.anyOf.map(ce)),r.additionalProperties!==void 0&&(typeof r.additionalProperties=="boolean"?e.additionalProperties=r.additionalProperties:e.additionalProperties=ce(r.additionalProperties)),r.required&&(e.required=r.required),e}c(ce,"convertDataSchemaToOpenAPI");function ur(r){const{membraneInterfaces:{actions:e}}=r,t=dr(e);return JSON.stringify({openapi:"3.0.0",info:{title:"Membrane Actions API",version:"1.0.0",description:"Generated OpenAPI specification for Membrane actions"},paths:{},components:{schemas:t}},null,2)}c(ur,"generateOpenAPIContent");function dr(r){const e={};return r.forEach(t=>{const n=Ue(je(t.key)),o={type:"object",properties:{id:{type:"string",description:"Request ID"},action:{type:"string",enum:[t.key]}},required:["id","action"]};if(t?.inputSchema){const a=ce(t.inputSchema);a.properties&&(o.properties={...o.properties,...a.properties}),a.required&&(o.required=[...o.required||[],...a.required])}e[`${n}Request`]=o;const i={type:"object",properties:{id:{type:"string",description:"Response ID"},success:{type:"boolean"},data:{type:"object"}},required:["id","success"]},s=t?.customOutputSchema||t?.outputSchema;if(s){const a=ce(s);i.properties={...i.properties,data:a}}e[`${n}Response`]=i}),e}c(dr,"generateOpenAPISchemas");function hr(r){const{membraneInterfaces:{actions:e}}=r,t=jn(e,"key"),n=new Ln({indentNumberOfSpaces:2,newLine:`
|
|
3
|
+
`});return n.writeLine("// Generated TypeScript definitions for Membrane actions"),n.newLine(),n.writeLine("import type {"),n.writeLine(" ActionAccessor,"),n.writeLine(" ConnectionLevelActionAccessor,"),n.writeLine('} from "@membranehq/sdk";'),n.newLine(),pr(n,t),n.toString()}c(hr,"generateTypeScriptContent");function pr(r,e){r.writeLine('declare module "@membranehq/sdk" {'),r.indent(()=>{e.forEach(t=>{const n=He(t),o=t?.inputSchema;Ie(r,{interfaceName:n,properties:o?.properties,required:o?.required||[]});const i=ze(t),s=t?.customOutputSchema||t?.outputSchema;Ie(r,{interfaceName:i,properties:s?.properties,required:s?.required||[],fallbackContent:"result: unknown"}),r.newLine()}),Ie(r,{interfaceName:"MembraneClient",methods:e.map(t=>{const n=He(t),o=ze(t);return{name:"action",parameters:`selector: "${t.key}"`,returnType:`ActionAccessor<${n}, ${o}>`}})}),r.newLine(),Ie(r,{interfaceName:"ConnectionAccessor",methods:e.map(t=>{const n=He(t),o=ze(t);return{name:"action",parameters:`selector: "${t.key}"`,returnType:`ConnectionLevelActionAccessor<${n}, ${o}>`}})})}),r.writeLine("}")}c(pr,"generateModuleAugmentation");function Ie(r,e){const{interfaceName:t,properties:n,required:o=[],methods:i,fallbackContent:s}=e;r.writeLine(`interface ${t} {`),r.indent(()=>{n&&Object.keys(n).length>0&&fr(r,n,o),i&&i.length>0&&(n&&Object.keys(n).length>0&&r.newLine(),i.forEach((a,l)=>{r.writeLine(`${a.name}(${a.parameters}): ${a.returnType};`),l<i.length-1&&r.newLine()})),s&&(!n||Object.keys(n).length===0)&&(!i||i.length===0)&&r.writeLine(s)}),r.writeLine("}")}c(Ie,"generateTypeScriptInterface");function fr(r,e,t){Object.entries(e).forEach(([n,o])=>{const s=t.includes(n)?"":"?",a=Ge(o);r.writeLine(`readonly ${n}${s}: ${a}`)})}c(fr,"generateTypeScriptProperties");function Ge(r){return r.type==="string"?r.enum?r.enum.map(e=>`'${e}'`).join(" | "):"string":r.type==="number"||r.type==="integer"?"number":r.type==="boolean"?"boolean":r.type==="array"?`${r.items?Ge(r.items):"unknown"}[]`:r.type==="object"?r.properties?`{ ${Object.entries(r.properties).map(([t,n])=>{const i=(r.required||[]).includes(t)?"":"?",s=Ge(n);return`readonly ${t}${i}: ${s}`}).join("; ")} }`:"Record<string, unknown>":"unknown"}c(Ge,"convertJsonSchemaToTypeScript");function He(r){return`${Ue(je(r.key))}Input`}c(He,"getInputTypeName");function ze(r){return`${Ue(je(r.key))}Output`}c(ze,"getOutputTypeName");async function Ve(r){const{out:e}=r;await v.promises.mkdir(e,{recursive:!0});const t=mr(r);for(const[n,o]of Object.entries(t)){const i=x.join(e,n);await v.promises.writeFile(i,o,"utf-8")}}c(Ve,"generateCode");function mr(r){switch(r.target){case"openapi":return{"openapi.json":ur(r)};case"typescript":return{"generated.d.ts":hr(r)};default:throw new Error(`Unsupported target: ${r.target}`)}}c(mr,"generateContent");const Ye=c(()=>[w.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"),w.yellow("\u2502 \u26A0\uFE0F EXPERIMENTAL FEATURE WARNING \u2502"),w.yellow("\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524"),w.yellow("\u2502 The codegen command is experimental and subject to rapid changes.\u2502"),w.yellow("\u2502 Features, APIs, and file structures may change without notice. \u2502"),w.yellow("\u2502 Use in production environments is not recommended. \u2502"),w.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"),""].join(`
|
|
4
|
+
`),"createExperimentalWarning$2");function gr(r,e){r.command("codegen").description("\u26A0\uFE0F EXPERIMENTAL: Generate code for easy integration within projects - This feature is experimental and will be changing rapidly. Use at your own risk.").requiredOption("--actions <actions>",'Comma-separated list of action names (e.g., "list-files,get-file-by-id")').requiredOption("--out <path>","Output directory for generated files").requiredOption("--target <type>","Target format: openapi or typescript").requiredOption("--schemasOnly","Generate only schemas without implementation").addHelpText("after",Ye()).addHelpText("after",["",w.bold("Examples:"),` ${w.gray("\u25B8")} ${w.cyan("membrane codegen --actions list-files,get-file-by-id --out src/generated --target openapi --schemasOnly")}`,` ${w.gray("\u25B8")} ${w.cyan("membrane install --actions delete-file --out src/generated --target typescript --schemasOnly")}`,"",Ye()].join(`
|
|
5
|
+
`)).action(async t=>{try{console.warn(Ye()),console.error(w.cyan("\u{1F527} Membrane Codegen")),console.error("Status: Loading membrane interfaces...");const n=await yr(e,t),o={out:t.out,target:t.target,schemasOnly:t.schemasOnly,membraneInterfaces:n};console.error(`Output: ${o.out}`),console.error(`Target: ${o.target}`),console.error(`Schemas Only: ${o.schemasOnly?"Yes":"No"}`),console.error(`Loaded ${n.actions.length} membrane interfaces`),console.error("Status: Generating code..."),await Ve(o),console.error(w.green("\u2705 Code generation completed successfully!")),process.exit(0)}catch(n){console.error(w.red("\u274C Code generation failed:")),console.error(n instanceof Error?n.message:"Unknown error occurred"),process.exit(1)}})}c(gr,"setupCodegenCommand");async function yr(r,e){return await r.fetchElements(),{actions:[...r.getSyncedElementsByType(T.Action).map(t=>t.data)].filter(t=>e.actions.includes(t.key||""))}}c(yr,"loadMembraneInterfaces");const wr="membrane",Cr="membrane.config.yml",Ze="https://api.integration.app",Sr="https://console.integration.app";function Xe(){const r=process.cwd(),e=x.join(r,wr),t=x.join(r,Cr),n=e,o=x.join(n,"workspace.yaml");return{membraneDirPath:e,configPath:t,payloadDirPath:n,workspaceDataFilePath:o}}c(Xe,"getPaths");function Mt(){return Xe().membraneDirPath}c(Mt,"getBasePath");const br={pat:{type:"string"},workspace:{type:"object"}},Ft=new Bn({schema:br,configName:"config",cwd:R.join(kt.homedir(),".membrane")}),vr=c(r=>{Ft.set("pat",r)},"setPat"),Lt=c(()=>Ft.get("pat"),"getPat");class jt{static{c(this,"AccountApiClient")}constructor(e=Ze){this.apiBaseUrl=e}async request(e,t={}){const n=t.headers?t.headers instanceof Headers?new Headers(t.headers):new Headers(t.headers):new Headers;if(!n.has("Authorization")){const s=Lt();if(!s)throw new Error("Personal Access Token not found.");n.set("Authorization",`Bearer ${s}`)}t.body&&!n.has("Content-Type")&&n.set("Content-Type","application/json");const o=await fetch(`${this.apiBaseUrl}${e}`,{...t,headers:n});if(!o.ok){const s=await o.text();throw new Error(`API request failed: ${o.status} ${o.statusText} - ${s}`)}if(o.status===204)return{};const i=await o.text();return JSON.parse(i)}get(e){return this.request(e,{method:"GET"})}post(e,t){return this.request(e,{method:"POST",body:JSON.stringify(t)})}put(e,t){return this.request(e,{method:"PUT",body:JSON.stringify(t)})}patch(e,t){return this.request(e,{method:"PATCH",body:JSON.stringify(t)})}delete(e){return this.request(e,{method:"DELETE"})}}const Er=c(r=>{const e=new jt(Ze);return t=>e.get(t)},"createAccountApiFetcher");class me{static{c(this,"ConfigLoader")}static instance=null;sdkLoader;constructor(){this.sdkLoader=new Rn}static getInstance(){return me.instance||(me.instance=new me),me.instance}loadConfig(e){e&&e!==this.sdkLoader.getCwd()&&this.sdkLoader.setCwd(e);try{return this.sdkLoader.loadConfig({validate:!0})}catch(t){if(t.message?.includes("Failed to parse"))throw t;return null}}clearCache(){this.sdkLoader.clearCache()}updateConfig(e){return this.sdkLoader.updateConfig(e)}saveToFile(e){return this.sdkLoader.saveToFile(e)}isCacheDefined(){return this.sdkLoader.hasValidConfig()}}const le=me.getInstance();function $e(r){return le.loadConfig(r)}c($e,"readProjectConfig");const Tr="membrane",xr=["**/node_modules/**","**/.git/**","**/.DS_Store","**/Thumbs.db","**/*.tmp","**/*.swp","**/*.swo","**/*.log","**/*.lock","**/.cache/**","**/.next/**","**/.vscode/**","**/.idea/**","**/.logs/**"];function _(r){return x.join(r,Tr)}c(_,"getMembraneDir");const Ut=Oe(_(process.cwd()),".logs");class Ir{static{c(this,"WorkspaceLogger")}_logs;verboseMode=!1;notificationHandler=null;constructor(){this._logs=[]}setNotificationHandler(e){this.notificationHandler=e}setVerboseMode(e){this.verboseMode=e}getVerboseMode(){return this.verboseMode}get logs(){return[...this._logs]}get latestLogs(){return this._logs.slice(this._logs.length-5)}log(e,t="info"){const n={timestamp:new Date().toISOString(),message:e,type:t};this._logs.push(n),this._logs=this._logs.slice(0,1e3),(t!=="debug"||this.verboseMode)&&this.notificationHandler&&this.notificationHandler.addLog(n)}info(e){this.log(e,"info")}success(e){this.log(e,"success")}warning(e){this.log(e,"warning")}error(e){this.log(e,"error")}debug(e){this.log(e,"debug")}clear(){this._logs=[]}saveLogsToFile(e){if(this._logs.length===0)return null;try{const t=new Date().toISOString().replace(/[:.]/g,"_"),n=e?`-${e}`:"",o=`${t}${n}.txt`;En(Ut,{recursive:!0});const i=Oe(Ut,o),s=this._logs.map(a=>`[${a.timestamp}] ${a.type?.toUpperCase()||"INFO"}: ${a.message}`).join(`
|
|
6
|
+
`);return Tn(i,s,"utf-8"),i}catch(t){return console.error("Failed to save logs:",t),null}}}const m=new Ir,Kt=new Wn;class qt{static{c(this,"RequestLogger")}constructor(e=Pn){this.axiosInstance=e}interceptorsConfigured=!1;setup(){if(this.interceptorsConfigured)return;const e=c(t=>(this.logError(t),Promise.reject(t)),"errorHandler");this.axiosInstance.interceptors.request.use(t=>{const n=Kt.getStore();t.metadata={startTime:Date.now(),skipErrorLog:n};const{method:o,url:i}=this.getRequestDetails(t);return m.debug(`[Request]: ${o} ${i}`),t},e),this.axiosInstance.interceptors.response.use(t=>{const{method:n,url:o}=this.getRequestDetails(t.config),i=this.getDuration(t.config),{status:s,statusText:a}=t;return m.debug(`[Response]: ${n} ${o} - ${s} ${a} (${i}ms)`),t},e),this.interceptorsConfigured=!0}static withSkipErrorLog(e){return Kt.run(!0,e)}getRequestDetails(e){const t=e?.method?.toUpperCase()??"UNKNOWN";if(!e?.url)return{method:t,url:"unknown"};if(e.url.startsWith("http"))return{method:t,url:e.url};const o=`${e.baseURL??""}/${e.url}`.replace(/\/+/g,"/").replace(/:\//,"://");return{method:t,url:o}}getDuration(e){return Date.now()-(e?.metadata?.startTime??Date.now())}logError(e){if(e.config?.metadata?.skipErrorLog)return;const{method:t,url:n}=this.getRequestDetails(e.config),o=this.getDuration(e.config);if(e.response){const{status:i,statusText:s}=e.response;m.error(`[Response]: ${t} ${n} - ${i} ${s} (${o}ms)`),e.response.data&&m.error(`[Response Data]: ${JSON.stringify(e.response.data,null,2)}`)}}}function $r(r,e){return new Proxy(r,{get(t,n){const o=t[n];return typeof o=="function"?(...i)=>(e.lastCall={method:String(n),args:i},o.apply(t,i)):o}})}c($r,"createTrackedClient");class kr{static{c(this,"MembraneAPIManager")}client=null;currentConfig=null;tokenExpiry=0;requestTimes=[];maxRequestsPerSecond=80;windowSizeMs=1e3;semaphore=0;maxConcurrentRequests;maxRetries;retryDelay;requestTimeout;enableJitter;semaphoreQueue=[];rateLimitMutex=Promise.resolve();requestLogger=null;constructor(e={}){this.init(e)}init(e={}){this.windowSizeMs=e.windowSizeMs??1e3,this.maxRequestsPerSecond=e.maxRequestsPerSecond??80,this.maxConcurrentRequests=e.maxConcurrentRequests??Math.max(1,Math.min(Math.floor(this.maxRequestsPerSecond/4),20)),this.maxRetries=e.maxRetries??3,this.retryDelay=e.retryDelay??1e3,this.requestTimeout=e.requestTimeout??12e4,this.enableJitter=e.enableJitter!==!1,this.requestLogger=new qt,this.requestLogger.setup()}async withClient(e,t=!0,n=process.cwd()){const o={lastCall:null},i=c(async()=>{try{return await this.withRetry(async()=>{const s=await this.getClient(n),a=$r(s,o);await this.acquireSemaphore();try{return await this.waitIfNeeded(),this.recordRequest(),await this.withTimeout(e(a),this.requestTimeout)}finally{this.releaseSemaphore()}},"API request")}catch(s){if(t){const a=o.lastCall?`Request: client.${o.lastCall.method}(${o.lastCall.args.map(l=>JSON.stringify(l)).join(", ")})`:null;throw s?.isMembraneError?(console.error(`
|
|
7
|
+
Membrane API Error:`),a&&console.error(a),console.error(JSON.stringify(J(s),null,2))):_n(s)?(console.error(`
|
|
8
|
+
HTTP Error:`),a&&console.error(a),console.error(JSON.stringify({message:s.message,status:s.response?.status,statusText:s.response?.statusText,responseData:s.response?.data},null,2))):(console.error(`
|
|
9
|
+
Unexpected Error:`),a&&console.error(a),console.error(s)),s}return}},"executeRequest");return t?i():qt.withSkipErrorLog(i)}async generateAccessToken(e,t){return We.sign({name:"Membrane Agent",isAdmin:!0,exp:Math.floor(Date.now()/1e3)+3600,iss:e},t,{algorithm:"HS512"})}isTokenValid(){return Date.now()<this.tokenExpiry}getCurrentConfig(e){const t=$e(e);return!t?.workspaceKey||!t?.workspaceSecret?null:{workspaceKey:t.workspaceKey,workspaceSecret:t.workspaceSecret,apiUri:t.apiUri}}async createClient(e){const t=await this.generateAccessToken(e.workspaceKey,e.workspaceSecret);return this.tokenExpiry=Date.now()+36e5,this.currentConfig=e,new vt({token:t,apiUri:e.apiUri})}async getClient(e=process.cwd()){const t=this.getCurrentConfig(e);if(!t)throw new Error("Unable to create MembraneClient: No workspace configuration found.");const n=!this.currentConfig||this.currentConfig.workspaceKey!==t.workspaceKey||this.currentConfig.workspaceSecret!==t.workspaceSecret||this.currentConfig.apiUri!==t.apiUri,o=!this.isTokenValid()||this.tokenExpiry-Date.now()<3e5;return(!this.client||n||o)&&(this.client=await this.createClient(t)),this.client}clearClient(){this.client=null,this.currentConfig=null,this.tokenExpiry=0,this.requestTimes=[],this.semaphore=0,this.semaphoreQueue=[],this.rateLimitMutex=Promise.resolve()}getCurrentConfigInfo(){return this.currentConfig}async waitIfNeeded(){this.rateLimitMutex=this.rateLimitMutex.then(async()=>{for(this.cleanOldRequests();this.requestTimes.length>=this.maxRequestsPerSecond;){const t=this.requestTimes[0]+this.windowSizeMs-Date.now()+10;if(t>0)await new Promise(n=>setTimeout(n,t)),this.cleanOldRequests();else break}}),await this.rateLimitMutex}recordRequest(){this.requestTimes.push(Date.now())}cleanOldRequests(){const e=Date.now()-this.windowSizeMs;this.requestTimes=this.requestTimes.filter(t=>t>e)}getRequestCount(){return this.cleanOldRequests(),this.requestTimes.length}async acquireSemaphore(){if(this.semaphore<this.maxConcurrentRequests){this.semaphore++;return}return new Promise(e=>{this.semaphoreQueue.push(e)})}releaseSemaphore(){if(this.semaphore--,this.semaphoreQueue.length>0){const e=this.semaphoreQueue.shift();this.semaphore++,e()}}async withRetry(e,t="operation"){let n;for(let o=0;o<=this.maxRetries;o++)try{return await e()}catch(i){if(n=i,!this.isRetryableError(i)||o===this.maxRetries)throw i;const s=new Date().toISOString(),a=o+2;m.debug(`[${s}] Retrying ${t} (attempt ${a}/${this.maxRetries+1})`);let l=this.retryDelay*Math.pow(2,o);if(this.enableJitter){const d=l*.25*(Math.random()*2-1);l=Math.max(0,l+d)}await new Promise(d=>setTimeout(d,l))}throw n||new Error("Unknown error occurred during retry attempts")}isRetryableError(e){if(!e)return!1;const t=(e.message||e.toString()||"").toLowerCase(),n=e.code;return n&&["econnrefused","enotfound","econnreset","etimedout","ehostunreach","enetunreach"].includes(n.toLowerCase())?!0:["econnrefused","connection refused","network error","timeout","socket hang up","request timeout","dns lookup failed"].some(s=>t.includes(s))}async withTimeout(e,t){let n;const o=new Promise((i,s)=>{n=setTimeout(()=>s(new Error(`Request timeout after ${t}ms`)),t)});try{const i=await Promise.race([e,o]);return n&&clearTimeout(n),i}catch(i){throw n&&clearTimeout(n),i}}}const I=new kr;async function Bt(r){const e=await I.withClient(t=>t.get("org-workspace-id"),!0,r);if(!e)throw new Error("Failed to get workspace ID");return e.id}c(Bt,"getWorkspaceId");const Z={UPDATE:"update",DELETE:"delete",CREATE:"create"},q={INCOMING:"incoming",OUTGOING:"outgoing"},z={[T.Integration]:{element:"integration",elements:"integrations",exportable:!1,exportCleanup:c(r=>({id:r.id,key:r.key,name:r.name,connectorId:r.connectorId,baseUri:r.baseUri,connectorVersion:r.connectorVersion}),"exportCleanup")},[T.Connector]:{element:"connector",elements:"connectors",exportable:!1},[T.Action]:{element:"action",elements:"actions",integrationSpecific:!0,exportCleanup:c(r=>(delete r.integration,r),"exportCleanup")},[T.AppDataSchema]:{element:"appDataSchema",elements:"appDataSchemas"},[T.AppEventType]:{element:"appEventType",elements:"appEventTypes"},[T.DataLinkTable]:{element:"dataLinkTable",elements:"dataLinkTables"},[T.DataSource]:{element:"dataSource",elements:"dataSources",parentKey:"universalDataSourceId",integrationSpecific:!0},[T.FieldMapping]:{element:"fieldMapping",elements:"fieldMappings",integrationSpecific:!0,parentKey:"universalFieldMappingId",exportCleanup:c(r=>(delete r.dataSourceId,r),"exportCleanup")},[T.Flow]:{element:"flow",elements:"flows",integrationSpecific:!0,parentKey:"universalFlowId"},[T.Package]:{element:"package",elements:"packages",integrationSpecific:!0}},Rr=["id","workspaceId","integrationId","createdAt","updatedAt","revision","archivedAt","baseUri","state","appliedToIntegrations","dependencies"],_t=[T.Action,T.FieldMapping,T.Flow,T.DataSource,T.Package];class M{static{c(this,"Element")}type;key;integrationKey;data;constructor(e,t,n,o){if(!o)throw new Error("Element must always contain data");if(!t)throw new Error("Element must have a key");this.type=e,this.key=t,this.data=o,this.integrationKey=n||M.extractIntegrationKey(o)}get id(){return M.makeId(this.type,this.key,this.integrationKey)}get dirPath(){const e=V[this.type].apiPath;if(this.integrationKey){const t=V[T.Integration].apiPath;return x.join(t,this.integrationKey,e,this.key)}return x.join(e,this.key)}get path(){return x.join(this.dirPath,"spec.yaml")}get relativePath(){return x.relative(_(process.cwd()),this.path)}get absolutePath(){return x.resolve(x.join(_(process.cwd()),this.path))}isEqual(e){if(this.id!==e.id)return!1;const t=this.clean(),n=e.clean();return Gn(t,n)}hasParent(){if(this.data?.parentUuid)return!0;const e=this.getParentKey();return!!e&&!!this.data?.[e]}clean(){const e={...this.data};return Rr.forEach(t=>{delete e[t]}),Object.keys(e).forEach(t=>{t.match(/universal.*Revision/)&&delete e[t]}),e}getParentKey(){let e="parentId";return z?.[this.type]?.parentKey&&(e=z?.[this.type]?.parentKey),e}static new(e,t,n,o){return new M(e,t,n,o)}static fromData(e,t){if(!t?.key)throw new Error(`Element missing key: ${JSON.stringify(t)}`);const n=this.extractIntegrationKey(t);return new M(e,t.key,n,t)}static fromPathAndData(e,t){const n=M.parsePath(e);if(!t)return;const o=t?.key||n?.key;return n?M.new(n.type,o,n.integrationKey,t):void 0}static fromElement(e){return new M(e.type,e.key,e.integrationKey,{...e.data})}static idFromPath(e){const t=M.parsePath(e);if(t)return M.makeId(t.type,t.key,t.integrationKey)}static makeId(e,t,n){return e===T.Integration?`${e}:${t}`:M.isIntegrationSpecific(e)?`${n||"universal"}:${e}:${t}`:`${e}:${t}`}static parsePath(e){const t=this.getRelativePath(e);if(!this.isElementFile(t))return;const n=Object.values(V).map(l=>l.apiPath).join("|"),o=new RegExp(`^(?<elementType>${n})/(?<elementKey>[^/]+)/spec\\.ya?ml$`),i=t.match(o);if(i?.groups){const{elementType:l,elementKey:d}=i.groups,h=this.getElementTypeFromPath(l);if(h)return{type:h,key:d}}const s=new RegExp(`^integrations/(?<integrationKey>[^/]+)/(?<elementType>${n})/(?<elementKey>[^/]+)/spec\\.ya?ml$`),a=t.match(s);if(a?.groups){const{integrationKey:l,elementType:d,elementKey:h}=a.groups,p=this.getElementTypeFromPath(d);if(p)return{type:p,key:h,integrationKey:l}}}static extractIntegrationKey(e){return e?.integrationKey||e?.integration?.key||e?.integration_key||void 0}static isElementFile(e){return e.endsWith(".yml")||e.endsWith(".yaml")}static getElementTypeFromPath(e){return Object.values(T).find(t=>V[t].apiPath===e)}static getRelativePath(e){return x.relative(_(process.cwd()),e)}static isIntegrationSpecific(e){return _t.includes(e)}static canBeIntegrationSpecific(e){return _t.includes(e)}}class Wt{static{c(this,"BaseWorkspaceElementsRepository")}constructor(e){this.cache=e}connectorsMapping;sourceCache;setConnectorsMapping(e){this.connectorsMapping=e}setSourceCache(e){this.sourceCache=e}async getElements(){const e=[];try{const t=await this.getIntegrations();e.push(...t);const n=[T.Integration,T.Connector],o=Object.keys(z),i=await Promise.all(o.filter(s=>!n.includes(s)).map(async s=>this.getElementsByType(s,t)));for(const s of i)e.push(...s)}catch(t){throw m.error(`Failed to get elements: ${t}`),t}return e}async putElement(e){let t=this.cache.get(e.id);return t&&!e.data.id&&t.data.id&&(e.data.id=t.data.id),!t&&e.data.id&&(t=await this.getByInternalId(e.data.id,e.type,!1)),e.data.id&&t?t=await this.updateElement(e,t,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping,sourceElements:this.sourceCache?.getAll()}):t=await this.createElement(e,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping,sourceElements:this.sourceCache?.getAll()}),t}async getElementsByType(e,t){return[]}async createElement(e,t){return e}async updateElement(e,t,n){return t}async getElement(e){}async getIntegrations(){return[]}async getByInternalId(e,t,n=!0){}async deleteElement(e,t){}}function Qe(r,e=!0){if(v.existsSync(r))try{const t=v.readFileSync(r,"utf8");return G.load(t)||void 0}catch(t){if(!e)return;if(t instanceof Error){const n=x.relative(process.cwd(),r);throw new Error(`Failed to parse YAML file "${n}": ${t.message}`)}throw t}}c(Qe,"readYaml$1");function Pr(r,e,t){try{const n=G.dump(e,t);v.writeFileSync(r,n,"utf8")}catch(n){if(n instanceof Error){const o=x.relative(process.cwd(),r);throw new Error(`Failed to write YAML file "${o}": ${n.message}`)}throw n}}c(Pr,"writeYaml$1");class Ar extends Wt{static{c(this,"LocalWorkspaceElementsRepository")}basePath;constructor(e){super(e),this.basePath=_(process.cwd())}async getElementsByType(e,t){const n=[],o=x.join(this.basePath,V[e].apiPath),i=await this.readElementsInDir(o);n.push(...i);for(const s of t){const a=x.join(this.basePath,V[T.Integration].apiPath,s.key,V[e].apiPath),l=await this.readElementsInDir(a);n.push(...l)}return n.length>0&&m.debug(`[local] Fetched ${n.length} ${e}${n.length!==1?"s":""}`),n}async getElement(e){return this.readElement(e.path)}async createElement(e){return this.updateElement(e,e)}async updateElement(e,t){if(!e.data)throw new Error("Element must have data to write");const n=x.join(this.basePath,t.dirPath),o=x.join(this.basePath,t.path);return v.existsSync(n)||v.mkdirSync(n,{recursive:!0}),Pr(o,e.data),m.debug(`[local] Written ${t.relativePath}`),t}async deleteElement(e){const t=x.join(this.basePath,e.path),n=x.join(this.basePath,e.dirPath);v.existsSync(t)&&v.rmSync(t,{force:!0}),this.pruneEmptyDir(n),m.debug(`[local] Deleted ${e.relativePath}`)}async getIntegrations(){const e=x.join(this.basePath,V[T.Integration].apiPath);return this.readElementsInDir(e)}async readElement(e){const t=Qe(e);if(t)return M.fromPathAndData(e,t)}async readElementsInDir(e){const t=[];if(!v.existsSync(e))return t;const n=v.readdirSync(e);if(n.length===0)return t;const o=n.map(async s=>{const a=x.join(e,s,"spec.yaml");return this.readElement(a)});return(await Promise.all(o)).filter(s=>s!=null)}pruneEmptyDir(e){try{if(!e.startsWith(this.basePath)||e===this.basePath||!v.existsSync(e)||v.readdirSync(e).length>0)return;v.rmdirSync(e),this.pruneEmptyDir(x.dirname(e))}catch(t){console.warn(`Failed to prune empty directory ${e}:`,t)}}}class Dr extends Wt{static{c(this,"RemoteWorkspaceElementsRepository")}async getElementsByType(e,t){const n=M.canBeIntegrationSpecific(e),o=await this.findAll(e,n?{layer:"universal"}:{});if(!M.canBeIntegrationSpecific(e))return o;for(const i of t){const s=i.key,a=i.data.id,l=await this.findAll(e,a?{integrationId:a}:{integrationKey:s},s);o.push(...l)}return o.length>0&&m.debug(`[remote] Fetched ${o.length} ${e}${o.length!==1?"s":""}`),o}async getElement(e){const t=await I.withClient(n=>n[z[e.type].element](e.data.id).get());return M.fromData(e.type,t)}async createElement(e,t){const n=e.clean();if(this.transformElementForCreate(e,n,t),e.hasParent()&&n.integrationId&&!n.isCustomized){const s=e.getParentKey(),a=new Set(["uuid","integrationId",s,"meta","integrationUuid","parentUuid"]);Object.keys(n).forEach(l=>{a.has(l)||delete n[l]})}const o=await I.withClient(s=>s[z[e.type].elements].create(n)),i=M.fromData(e.type,o);return m.debug(`[remote] Created ${i.id}`),i}async updateElement(e,t,n){if(!e.data.id)throw new Error("Element must have an id to update");t.data.archivedAt&&await I.withClient(a=>a[z[e.type].element](t.data.id).restore());const o=e.clean();if(this.transformElementForUpdate(e,o,n),e.hasParent()&&o.integrationId&&!o.isCustomized)return m.debug(`[remote] Skipped update for ${t.id} (non-customized)`),t;const i=await I.withClient(a=>a[z[e.type].element](t.data.id).put(o)),s=M.fromData(t.type,i);return m.debug(`[remote] Updated ${t.id}`),s}async deleteElement(e){if(!e.data.id)throw new Error("Element must have an id to delete");await I.withClient(t=>t[z[e.type].element](e.data.id).archive()),m.debug(`[remote] Deleted ${e.id}`)}async getIntegrations(){const e=await I.withClient(n=>n.integrations.findAll());if(!e)return[];const t=e.map(n=>M.fromData(T.Integration,n));return t.length>0&&m.debug(`[remote] Fetched ${t.length} integrations`),t}async getByInternalId(e,t){let n;if(n=await I.withClient(o=>o[z[t].element](e).get(),!1),!!n)return M.fromData(t,n)}transformElementForCreate(e,t,n){if(e.integrationKey){const o=n.elements.find(i=>i.type===T.Integration&&i.key===e.integrationKey);if(o)t.integrationId=o.data.id;else throw new Error(`Dependency integration ${e.integrationKey} not found for ${e.id}`)}if(e.type===T.Integration){const o=n.connectorsMapping?.[t.connectorId];o&&(t.connectorId=o)}this.transformPackageDependencies(e,t,n),this.transformParentDependency(e,t,n)}transformElementForUpdate(e,t,n){if(e.type===T.Integration){const o=n.connectorsMapping?.[t.connectorId];o&&(t.connectorId=o)}if(e.integrationKey){t.integrationKey=e.integrationKey;const o=n.elements.find(i=>i.type===T.Integration&&i.key===e.integrationKey);if(o)t.integrationId=o.data.id;else throw new Error(`Dependency integration ${e.integrationKey} not found for ${e.id}`)}this.transformPackageDependencies(e,t,n),this.transformParentDependency(e,t,n)}transformPackageDependencies(e,t,n){if(e.type!==T.Package||!t.elements)return;const o=t.elements.map(i=>{const a=(n.sourceElements||n.elements).find(d=>d.data.id===i.id&&d.type===i.type);if(!a)throw new Error(`Package element ${i.type} with id ${i.id} not found in source workspace for package ${e.id}`);const l=n.elements.find(d=>d.type===i.type&&d.key===a.key&&d.integrationKey===a.integrationKey);if(!l)throw new Error(`Package element ${i.type} with key ${a.key} not found in target workspace for package ${e.id}`);return{id:l.data.id,type:i.type}});t.elements=o}transformParentDependency(e,t,n){if(!e.hasParent())return;const o=e.getParentKey();if(!o)return;const i=n.elements.find(s=>s.type===e.type&&s.key===e.key&&!s.hasParent());if(i)t[o]=i.data.id;else throw new Error(`Parent ${e.getParentKey()} not found for ${e.id}`)}async findAll(e,t={},n){const o=await I.withClient(i=>i[z[e].elements].findAll(t));return o?o.filter(i=>i.key).map(i=>(n&&!i.integrationKey&&(i.integrationKey=n),M.fromData(e,i))):[]}}class et extends Zn{static{c(this,"TypedEventEmitter")}on(e,t){return super.on(e,t)}emit(e,...t){return super.emit(e,...t)}off(e,t){return super.off(e,t)}once(e,t){return super.once(e,t)}}const B={Updated:"updated",Deleted:"deleted",Stopped:"stopped"},Or={ignored:xr,persistent:!0,ignoreInitial:!0,followSymlinks:!1,depth:20,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100},ignorePermissionErrors:!0,atomic:!0,usePolling:!1,alwaysStat:!1,interval:1e3,binaryInterval:300};class Nr extends et{static{c(this,"LocalElementWatcher")}constructor(e){super(),this.options=e,this.membraneDir=_(this.options.cwd),this.lockTimeoutMs=this.options.lockTimeoutMs??1e3}isWatching=!1;watcher;membraneDir;contentCache={};ignoredPaths=new Set;lockTimeoutMs;async start(){this.isWatching||(v.existsSync(this.membraneDir)||v.mkdirSync(this.membraneDir,{recursive:!0}),this.initializeContentCache(),this.watcher=Vn.watch(this.membraneDir,Or),this.watcher.on("add",e=>this.handleFileSystemEvent(B.Updated,e)).on("change",e=>this.handleFileSystemEvent(B.Updated,e)).on("unlink",e=>this.handleFileSystemEvent(B.Deleted,e)).on("ready",()=>this.isWatching=!0))}async stop(){!this.isWatching||!this.watcher||(await this.watcher.close(),this.isWatching=!1,this.watcher=void 0,this.clearCache(),this.clearAllLocks(),this.emit(B.Stopped))}getCwd(){return this.options.cwd}async executeWithPathLock(e,t){const n=x.resolve(e);this.ignoredPaths.add(n);try{await t()}finally{setTimeout(()=>{this.ignoredPaths.delete(n)},this.lockTimeoutMs)}}isPathLocked(e){const t=x.resolve(e);if(this.ignoredPaths.has(t))return!0;for(const n of this.ignoredPaths)if(t.startsWith(n+x.sep))return!0;return!1}clearAllLocks(){this.ignoredPaths.clear()}handleFileSystemEvent(e,t){const n=x.relative(this.membraneDir,t);if(this.isPathLocked(t))return;if(e===B.Deleted){this.removeFromCache(n);const a={filePath:t,relativePath:n,data:void 0};m.info(`[local] ${e}: ${a.relativePath}`),this.emit(e,a);return}const o=this.readFileContent(t);if(!this.hasContentChanged(n,o))return;const s=this.processFileEvent(t,o);this.updateCache(n,o),s&&(m.info(`[local] ${e}: ${s.relativePath}`),this.emit(e,s))}readFileContent(e){return v.readFileSync(e,"utf8")}processFileEvent(e,t){const n=x.relative(this.membraneDir,e);let o;try{o=t?Yn.parse(t):void 0}catch{o=void 0}return{filePath:e,relativePath:n,data:o}}hasContentChanged(e,t){if(!t)return this.contentCache[e]!==void 0;const n=this.getContentHash(t);return this.contentCache[e]!==n}getContentHash(e){return Hn.createHash("sha256").update(e).digest("hex")}updateCache(e,t){if(!t){delete this.contentCache[e];return}this.contentCache[e]=this.getContentHash(t)}removeFromCache(e){delete this.contentCache[e]}clearCache(){Object.keys(this.contentCache).forEach(e=>{delete this.contentCache[e]})}initializeContentCache(){v.existsSync(this.membraneDir)&&this.scanDirectoryForCache(this.membraneDir)}scanDirectoryForCache(e){const t=v.readdirSync(e,{withFileTypes:!0});for(const n of t){const o=x.join(e,n.name);if(n.isDirectory())this.scanDirectoryForCache(o);else if(n.isFile())try{const i=v.readFileSync(o,"utf8"),s=x.relative(this.membraneDir,o);this.updateCache(s,i)}catch{}}}}var tt=(r=>(r.Updated="updated",r.ConnectorFileUpdated="connector-file-updated",r.Connected="connected",r.Disconnected="disconnected",r.Error="error",r))(tt||{});const Mr={debounceMs:2e3,reconnectIntervalMs:5e3,maxReconnectAttempts:1/0,maxBackoffMs:6e4,connectionTimeoutMs:3e5};class Fr extends et{static{c(this,"RemoteElementWatcher")}constructor(e=Mr){super(),this.config=e}eventSource;debounceTimeouts=new Map;reconnectAttempts=0;reconnectTimeout;connectionTimeout;isStarted=!1;isConnected=!1;async start(){this.isStarted||(this.isStarted=!0,await this.connect())}async stop(){this.isStarted&&(this.isStarted=!1,this.isConnected=!1,this.clearReconnectTimeout(),this.clearConnectionTimeout(),this.clearAllDebounceTimeouts(),this.eventSource&&(this.eventSource.close(),this.eventSource=void 0))}async connect(){try{m.debug("[remote-events] Connecting to server"),this.eventSource&&(this.eventSource.close(),this.eventSource=void 0);const e=await I.getClient(process.cwd()),t=await e.getToken();if(!t)throw new Error("No auth token available");const n=`${e.apiUri}/sse/workspace?token=${encodeURIComponent(t)}`;m.debug("[remote-events] Subscribing to workspace events"),this.eventSource=new Xn(n),this.setupEventSourceHandlers()}catch(e){m.debug(`[remote-events] Failed to connect: ${e}`),this.emit("error",{error:e}),this.scheduleReconnect()}}setupEventSourceHandlers(){this.eventSource&&(this.eventSource.onopen=()=>{m.debug("[remote-events] Connected to server"),this.reconnectAttempts=0,this.isConnected=!0,this.resetConnectionTimeout(),this.emit("connected",{})},this.eventSource.onmessage=e=>{try{this.resetConnectionTimeout();const t=JSON.parse(e.data);this.handleElementUpdate(t)}catch(t){m.debug(`[remote-events] Failed to parse workspace event: ${t}`)}},this.eventSource.onerror=e=>{m.debug(`[remote-events] Connection error: ${JSON.stringify(e,null,2)}`),this.isConnected=!1,this.clearConnectionTimeout(),this.eventSource&&(this.eventSource.close(),this.eventSource=void 0),this.emit("disconnected",{}),this.isStarted&&this.scheduleReconnect()})}handleElementUpdate(e){if(e.type!==An.ElementUpdate)return;const{elementId:t,elementType:n,data:o={}}=e;if(!(!t||!n)){if(n===T.Connector){const{filePath:i,eventType:s,newPath:a}=o;return m.debug(`[remote-watcher] Received connector event - elementId: ${t}, filePath: ${i}, eventType: ${s}`),this.scheduleConnectorFileUpdate(t,i,s,a)}return this.scheduleElementUpdate(t,n)}}scheduleElementUpdate(e,t){const n=this.debounceTimeouts.get(e);n&&clearTimeout(n);const o=setTimeout(()=>{this.debounceTimeouts.delete(e),this.emit("updated",{elementId:e,elementType:t})},this.config.debounceMs);this.debounceTimeouts.set(e,o)}scheduleConnectorFileUpdate(e,t,n,o){const i=JSON.stringify({connectorId:e,filePath:t}),s=this.debounceTimeouts.get(i);s&&clearTimeout(s);const a=setTimeout(()=>{this.debounceTimeouts.delete(i),this.emit("connector-file-updated",{connectorId:e,filePath:t,eventType:n,newPath:o})},this.config.debounceMs);this.debounceTimeouts.set(i,a)}scheduleReconnect(){if(!this.isStarted||this.reconnectAttempts>=this.config.maxReconnectAttempts){this.reconnectAttempts>=this.config.maxReconnectAttempts&&(m.error("[remote-events] Max reconnection attempts reached. Connection will not be retried."),this.emit("error",{error:new Error("Max reconnection attempts reached")}));return}this.reconnectTimeout&&clearTimeout(this.reconnectTimeout),this.reconnectAttempts++;const e=this.config.reconnectIntervalMs*Math.pow(2,this.reconnectAttempts-1),t=Math.random()*.3*e,n=Math.min(e+t,this.config.maxBackoffMs);m.debug(`[remote-events] Reconnecting in ${Math.round(n)}ms (attempt ${this.reconnectAttempts})`),this.reconnectTimeout=setTimeout(()=>{this.connect()},n)}clearReconnectTimeout(){this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}resetConnectionTimeout(){this.clearConnectionTimeout(),this.connectionTimeout=setTimeout(()=>{this.isConnected&&this.isStarted&&(m.debug("[remote-events] Connection timeout detected, reconnecting..."),this.isConnected=!1,this.eventSource&&(this.eventSource.close(),this.eventSource=void 0),this.scheduleReconnect())},this.config.connectionTimeoutMs)}clearConnectionTimeout(){this.connectionTimeout&&(clearTimeout(this.connectionTimeout),this.connectionTimeout=void 0)}clearAllDebounceTimeouts(){this.debounceTimeouts.forEach(e=>clearTimeout(e)),this.debounceTimeouts.clear()}}class Jt{static{c(this,"ElementsCache")}elements=new Map;typeIndex=new Map;internalIdIndex=new Map;constructor(e){e&&this.addAll(e)}add(e){const t=e.id;this.elements.set(t,e),this.typeIndex.has(e.type)||this.typeIndex.set(e.type,new Set),this.typeIndex.get(e.type).add(t),e.data?.id&&this.internalIdIndex.set(e.data.id,t)}remove(e){const t=e.id,n=this.elements.delete(t);if(n){const o=this.typeIndex.get(e.type);o&&(o.delete(t),o.size===0&&this.typeIndex.delete(e.type)),e.data?.id&&this.internalIdIndex.delete(e.data.id)}return n}put(e){this.elements.has(e.id)&&this.remove(e),this.add(e)}get(e){return this.elements.get(e)}getByInternalId(e){const t=this.internalIdIndex.get(e);if(t)return this.elements.get(t)}getElementsByType(e){const t=this.typeIndex.get(e);return t?Array.from(t).map(n=>this.elements.get(n)).filter(n=>n!==void 0):[]}getAll(){return Array.from(this.elements.values())??[]}getTypes(){return Array.from(this.typeIndex.keys())}addAll(e){for(const t of e)t&&this.add(t)}removeAll(e){for(const t of e)this.remove(t)}getElementIdsByType(e){return this.typeIndex.get(e)}clear(){this.elements.clear(),this.typeIndex.clear(),this.internalIdIndex.clear()}getAllIds(){return new Set(this.elements.keys())}}const pe="connectors",X="development",nt={};async function Gt(r={}){const{onProgress:e}=r,t=new Set,o=(await I.withClient(d=>d.get("org-workspace-id"))).id,i={};m.info("[connectors] Loading custom connectors"),await I.withClient(d=>d.get(`/connectors?workspaceId=${o}`)),m.info("[connectors] Loading public connectors");const s=ee(),l=(P.existsSync(s)?P.readdirSync(s):[]).filter(d=>{if(d.startsWith("."))return!1;const h=R.join(s,d);try{return P.statSync(h).isDirectory()}catch{return!1}});for(const d of l){m.info(`[connectors] Loading connector from: ${d}`);const h=P.readdirSync(R.join(s,d)),p=await rt(d);if(!p)continue;e?.("pushing",p.name),"baseUri"in p&&delete p.baseUri;let f;if(p.uuid&&(f=await I.withClient(E=>E.get(`/connectors/${p.uuid}`),!1)),f)i[p.id]=f.id,m.info(`[connectors] Matched ${p.name} uuid: ${p.uuid}`),f.isPublic||(f.archivedAt&&(m.info(`[connectors] Restoring archived connector ${p.name}`),await I.withClient(E=>E.post(`connectors/${f.id}/restore`))),m.info(`[connectors] Updating connector ${p.name}`),await I.withClient(E=>E.patch(`connectors/${f.id}`,{...p,workspaceId:o})));else if(!i[p.id]&&!f?.isPublic){let E=!1;try{const S=await ot({connectorId:p.id});S&&S.isPublic&&(E=!0)}catch{}if(!E){m.info(`[connectors] Creating custom connector ${p.name} (${p.key})`);const S=await I.withClient(N=>N.post("connectors",{...p,workspaceId:o}));i[p.id]=S.id}}const C=h.filter(E=>P.statSync(R.join(s,d,E)).isDirectory());for(const E of C)await Ur({connector:p,version:E,connectorId:i[p.id]}),t.add(p.id);e?.("pushed",p.name)}return{connectorsMapping:i,pushedConnectors:Array.from(t)}}c(Gt,"pushConnectors");async function Ht({connectorId:r,connectorVersion:e,allConnectors:t,pulledConnectors:n,pulledConnectorVersions:o}){if(!r||o[r]?.has(e))return;const i=Mt(),s=await ot({connectorId:r});if(!s.isPublic||t){if(!s?.key){console.error(`[connectors] Connector ${r} has no key. Skipping..`),m.error(`[connectors] Connector ${r} has no key. Skipping..`);return}n.has(r)||(await Kr({basePath:i,connector:s}),n.add(r)),o[r]||(o[r]=new Set),o[r].has(e)||(await qr({connector:s,connectorVersion:e,basePath:i}),o[r].add(e))}}c(Ht,"pullRemoteConnector");function ee(){const r=Xe();return R.join(r.membraneDirPath,pe)}c(ee,"getConnectorsPath");async function rt(r){const e=R.join(ee(),r,`${r}.yml`);return Qe(e,!1)}c(rt,"readConnector");async function Lr(r,e){return m.info(`[connectors] Zipping ${r} into ${e}`),new Promise((t,n)=>{const o=P.createWriteStream(e),i=Rt("zip",{zlib:{level:9}});o.on("close",()=>{m.success(`[connectors] Successfully created ${e}`),t()}),o.on("end",()=>{m.info("[connectors] Data has been drained")}),i.on("warning",a=>{a.code==="ENOENT"?console.warn(a):n(a)}),i.on("error",a=>{n(a)}),i.pipe(o);const s=P.readdirSync(r);for(const a of s){const l=R.join(r,a),d=P.statSync(l);d.isFile()?i.file(l,{name:a}):d.isDirectory()&&i.directory(l,a)}i.finalize()})}c(Lr,"createZipArchive");async function jr(r,e){return m.info(`[connectors] Unzipping into ${e}`),new Promise((t,n)=>{const o=At.Parse();o.on("entry",i=>{const s=i.path;if(i.type==="Directory"){const l=R.join(e,s);P.mkdirSync(l,{recursive:!0}),i.autodrain()}else{const l=R.join(e,s),d=R.dirname(l);P.mkdirSync(d,{recursive:!0});const h=P.createWriteStream(l);i.pipe(h),h.on("finish",()=>{})}}),o.on("end",()=>{m.success(`[connectors] Successfully extracted to ${e}`),t()}),o.on("error",i=>{n(i)}),o.write(r),o.end()})}c(jr,"extractZipArchive");async function Ur({connector:r,version:e,connectorId:t}){const n=R.join(ee(),Q(r),zt(e)),o=R.join(n,"src"),i=R.join(n,"src.zip"),s=P.existsSync(i);if(P.existsSync(o)&&(m.info(`[connectors] Archiving source code for ${r.name} version ${e}`),await Lr(o,i)),!P.existsSync(i)){m.warning(`[connectors] No source code found for ${r.name} version ${e}`);return}try{const a=new Pt;if(a.append("file",P.createReadStream(i),"file.zip"),m.info(`[connectors] Pushing connector version ${e} for ${r.name}`),e==X)m.info(`[connectors] Uploading connector ${t}`),await I.withClient(l=>l.post(`connectors/${t}/upload`,a,{headers:{...a.getHeaders()}}));else{if(a.append("version",e),a.append("changelog","Imported Version"),(await I.withClient(d=>d.get(`/connectors/${t}/versions`))).find(d=>d.version==e)){m.info(`[connectors] Version ${e} already published`);return}m.info(`[connectors] Publishing version ${e} of connector ${t}`),await I.withClient(d=>d.post(`connectors/${t}/publish-version`,a,{headers:{...a.getHeaders()}}))}m.success(`Successfully pushed connector version ${e} for ${r.name}`)}catch(a){m.error(`Error pushing connector version ${e} for ${r.name}: ${a}`),console.error(`[connectors] Error pushing connector version ${e} for ${r.name}: ${a}`)}finally{!s&&P.existsSync(i)&&(m.info(`[connectors] Cleaning up temporary zip file for ${r.name} version ${e}`),P.unlinkSync(i))}}c(Ur,"pushConnectorVersion");async function ot({connectorId:r}){if(r){if(nt[r])return nt[r];try{const e=await I.withClient(t=>t.get(`connectors/${r}`),!1);return nt[r]=e,e}catch(e){return m.error(`[connectors] Failed to get connector ${r}: ${e}`),console.error(`[connectors] Failed to get connector ${r}: ${e}`),null}}}c(ot,"getConnector");async function Kr({basePath:r,connector:e}){const t=Q(e),n=R.join(r,pe,t);P.mkdirSync(n,{recursive:!0});const o=R.join(n,`${Q(e)}.yml`);P.writeFileSync(o,G.dump(e)),m.info(`[connectors] Pulled connector ${e.name}`)}c(Kr,"pullConnector$1");async function qr({connector:r,connectorVersion:e,basePath:t}){const n=Q(r),o=zt(e),i=R.join(t,"connectors",n,o),s=await I.withClient(l=>l.get(`connectors/${r.id}/download`,{version:e},{responseType:"arraybuffer",headers:{Accept:"application/zip"},timeout:1e6}));P.mkdirSync(i,{recursive:!0});const a=R.join(i,"src.zip");if(P.writeFileSync(a,s),!e){const l=R.join(i,"src");P.mkdirSync(l,{recursive:!0}),await jr(s,l)}m.info(`[connectors] Pulled connector version: ${r.name} (${o})`)}c(qr,"pullConnectorVersion");function Q(r){return r.key}c(Q,"getConnectorDirName");function zt(r){return r??X}c(zt,"getConnectorVersionDirName");function Br(r){const e=Mt(),t=Q(r);return R.join(e,pe,t)}c(Br,"getConnectorDirPath");function _r(r){return r.match(`${pe}/[^/]+/${X}/src/.*`)!==null}c(_r,"isConnectorSourceFile");async function Wr(r){const e=r.match(`${pe}/([^/]+)/${X}/src/(.*)`);if(!e)return;const t=e[1],n=e[2],o=await rt(t);if(!o){m.warning(`[connectors] Connector ${t} not found. Ignoring file change`);return}const i=o.id,s=P.readFileSync(r,"utf-8");await I.withClient(a=>a.put(`connectors/${i}/files/${n}`,s,{headers:{"Content-Type":"text/plain"}})),m.info(`[connectors] Pushed file ${n} for connector ${o.name}`)}c(Wr,"putConnectorFile");async function Jr(r){const e=r.match(`${pe}/([^/]+)/${X}/src/(.*)`);if(!e)return;const t=e[1],n=e[2],o=await rt(t);if(!o){m.warning(`[connectors] Connector ${t} not found. Ignoring file change`);return}const i=o.id;await I.withClient(s=>s.delete(`connectors/${i}/files/${n}`)),m.info(`[connectors] Deleted file ${n} for connector ${o.name}`)}c(Jr,"deleteConnectorFile");async function Gr(r,e){try{const t=await I.withClient(s=>s.get(`connectors/${r}`));if(!t){m.warning(`[connectors] Connector ${r} not found`);return}const n=await I.withClient(s=>s.get(`connectors/${r}/files/${e}`)),o=Q(t),i=R.join(ee(),o,X,"src",e);P.mkdirSync(R.dirname(i),{recursive:!0}),n!=null?(P.writeFileSync(i,n),m.info(`[connectors] Pulled file ${e} for connector ${t.name}`)):P.existsSync(i)&&(P.unlinkSync(i),m.info(`[connectors] Deleted file ${e} for connector ${t.name}`))}catch(t){m.error(`[connectors] Failed to pull connector file ${e} for connector ${r}: ${t}`),console.error(`[connectors] Failed to pull connector file ${e} for connector ${r}: ${t}`)}}c(Gr,"pullConnectorFile");async function Hr(r,e){const t=await I.withClient(i=>i.get(`connectors/${r}`),!1);if(!t){m.warning(`[connectors] Connector ${r} not found`);return}const n=Q(t),o=R.join(ee(),n,X,"src",e);P.existsSync(o)&&(P.unlinkSync(o),m.info(`[connectors] Deleted file ${e} for connector ${n}`))}c(Hr,"deleteLocalConnectorFile");async function zr(r,e,t){if(t&&e!==t)try{const n=await I.withClient(l=>l.get(`connectors/${r}`),!1);if(!n){m.warning(`[connectors] Connector ${r} not found`);return}const o=Q(n),i=R.join(ee(),o,X,"src"),s=R.join(i,e),a=R.join(i,t);P.existsSync(s)&&(P.mkdirSync(R.dirname(a),{recursive:!0}),P.renameSync(s,a),m.info(`[connectors] Renamed directory from ${e} to ${t} for connector ${o}`))}catch(n){m.error(`[connectors] Failed to rename directory ${e} to ${t} for connector ${r}: ${n}`)}}c(zr,"renameLocalConnectorDirectory");async function Vr(r,e){try{const t=await I.withClient(i=>i.get(`connectors/${r}`),!1);if(!t){m.warning(`[connectors] Connector ${r} not found`);return}const n=Q(t),o=R.join(ee(),n,X,"src",e);if(P.existsSync(o)){const i=R.resolve(ee());if(!R.resolve(o).startsWith(i))return;P.rmSync(o,{recursive:!0,force:!0}),m.info(`[connectors] Deleted directory ${e} for connector ${n}`)}}catch(t){m.error(`[connectors] Failed to delete directory ${e} for connector ${r}: ${t}`)}}c(Vr,"deleteLocalConnectorDirectory");const F={LogAdded:"logAdded",StateChanged:"stateChanged",StatsChanged:"statsChanged",ConflictsChanged:"conflictsChanged",McpStatusChanged:"mcpStatusChanged",McpServersChanged:"mcpServersChanged",ConfigChanged:"configChanged"};class Yr extends et{static{c(this,"WorkspaceNotifications")}constructor(e){super(),this.config=e,m.setNotificationHandler(this)}clientId;heartbeatInterval;isCleaningUp=!1;async connectToRemote(){await this.registerWithRemoteServer(),await this.startHeartbeatLoop()}async setState(e){this.emit(F.StateChanged,{state:e}),await this.emitRemote({status:e})}setConflicts(e){this.emit(F.ConflictsChanged,{conflicts:e})}setConfig(e){this.emit(F.ConfigChanged,{config:e})}setStats(e){this.emit(F.StatsChanged,{stats:e})}addLog(e){this.emit(F.LogAdded,{log:e})}setMcpStatus(e){this.emit(F.McpStatusChanged,{status:e})}async setMcpServers(e){this.emit(F.McpServersChanged,{servers:e}),await this.emitRemote({mcpServers:e.map(t=>({name:t.agentName,totalRequests:t.totalRequests}))})}async cleanup(){!this.clientId||this.isCleaningUp||(this.isCleaningUp=!0,this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=void 0),await this.withErrorHandling(async()=>{await I.withClient(e=>e.delete(`/local-clients/${this.clientId}`))}),this.clientId=void 0)}async registerWithRemoteServer(){if(this.clientId)return;const e=await this.withErrorHandling(async()=>await I.withClient(t=>t.post("/local-clients",{hostname:kt.hostname(),workingDirectory:process.cwd()})));e?.id?this.clientId=e.id:this.addLog({timestamp:new Date().toISOString(),message:"Failed to register with remote server",type:"error"})}async startHeartbeatLoop(){this.heartbeatInterval=setInterval(async()=>{this.clientId&&await this.sendHeartbeat()},this.config.heartbeatIntervalMs)}async sendHeartbeat(){this.clientId&&await this.withErrorHandling(async()=>{await I.withClient(e=>e.post(`/local-clients/${this.clientId}/keep-alive`,{}))})}async emitRemote(e){this.clientId&&await this.withErrorHandling(async()=>{await I.withClient(t=>t.patch(`/local-clients/${this.clientId}`,e))})}async withErrorHandling(e){try{return await e()}catch(t){const n=t instanceof Error?t.message:String(t);return this.addLog({timestamp:new Date().toISOString(),message:`Failed to connect to remote: ${n}`,type:"error"}),null}}}const te=new Yr({heartbeatIntervalMs:15e3}),Vt=[T.AppDataSchema,T.AppEventType,T.DataLinkTable,T.DataSource,T.FieldMapping,T.Action,T.Flow,T.Package];class Se{static{c(this,"ElementSyncService")}localWatcher=void 0;remoteWatcher=void 0;notifier;changes=[];localCache;remoteCache;localRepo;remoteRepo;pulledConnectors=new Set;pulledConnectorVersions={};constructor(){this.notifier=te,this.localCache=new Jt,this.remoteCache=new Jt,this.localRepo=new Ar(this.localCache),this.remoteRepo=new Dr(this.remoteCache)}clear(){this.changes=[]}needsForcedSync(){return this.changes.some(e=>e.isConflict)}needsSync(){return this.changes.length>0}async getStats(){const e=this.localCache.getAll(),t={};return e.forEach(n=>{t[n.type]=(t[n.type]||0)+1}),t}async fetchElements(){const e=await this.localRepo.getElements(),t=await this.remoteRepo.getElements();this.localCache.addAll(e),this.remoteCache.addAll(t)}async updateElement(e,t){const n=this.getHandler(t),o=this.getCache(t);try{const i=await n.putElement(e);o.put(i)}catch(i){throw m.error(`Failed to update element ${e.id}: ${i}`),i}}async deleteElement(e,t){const n=this.getHandler(t),o=this.getCache(t);try{await n.deleteElement(e,{elements:n.cache.getAll(),connectorsMapping:n.connectorsMapping}),o.remove(e)}catch(i){throw m.error(`Failed to delete element ${e.id}: ${i}`),i}}async pullConnectors(e=!1){const t=this.remoteCache.getElementsByType(T.Integration).map(n=>n.data);for(const n of t){const o=n.connectorId,i=n.connectorVersion;o&&await Ht({connectorId:o,connectorVersion:i,allConnectors:e,pulledConnectors:this.pulledConnectors,pulledConnectorVersions:this.pulledConnectorVersions})}}async pushConnectors(){const{connectorsMapping:e}=await Gt();this.remoteRepo.setConnectorsMapping(e)}getHandler(e){return e===q.INCOMING?this.localRepo:(this.remoteRepo.setSourceCache(this.localCache),this.remoteRepo)}getCache(e){return e===q.INCOMING?this.localCache:this.remoteCache}async startWatching(){this.localWatcher=new Nr({cwd:process.cwd(),lockTimeoutMs:1e3}),this.localWatcher.on(B.Updated,e=>this.handleLocalEvent(e,B.Updated)),this.localWatcher.on(B.Deleted,e=>this.handleLocalEvent(e,B.Deleted)),await this.localWatcher.start(),m.success("[local] Tracking changes.."),this.remoteWatcher=new Fr,this.remoteWatcher.on(tt.Updated,({elementId:e,elementType:t})=>this.handleRemoteElementEvent(e,t)),this.remoteWatcher.on(tt.ConnectorFileUpdated,({connectorId:e,filePath:t,eventType:n,newPath:o})=>this.handleRemoteConnectorFileEvent(e,t,n,o)),await this.remoteWatcher.start(),m.success("[remote] Tracking changes..")}async stopWatching(){this.localWatcher&&(await this.localWatcher.stop(),this.localWatcher=void 0),this.remoteWatcher&&(await this.remoteWatcher.stop(),this.remoteWatcher=void 0)}async handleRemoteElementEvent(e,t){try{const n=await this.remoteRepo.getByInternalId(e,t),o=!!n?.data.archivedAt||!!n?.data.isDeactivated;if(!n||o){const s=n||this.remoteCache.getByInternalId(e);return s?(m.info(`[${this.getDirectionLabel(q.INCOMING)}] Deleted: ${s.id}`),this.localWatcher?.executeWithPathLock(s.absolutePath,()=>this.deleteElement(s,q.INCOMING))):void 0}if(m.info(`[${this.getDirectionLabel(q.INCOMING)}] Updated: ${n.id}`),await this.localWatcher?.executeWithPathLock(n.absolutePath,async()=>this.updateElement(n,q.INCOMING)),t===T.Integration){const s=n.data.connectorId,a=n.data.connectorVersion,l=await ot({connectorId:s});if(!l?.key)return;const d=Br(l);await this.localWatcher?.executeWithPathLock(d,async()=>Ht({connectorId:s,connectorVersion:a,allConnectors:!1,pulledConnectors:this.pulledConnectors,pulledConnectorVersions:this.pulledConnectorVersions}))}}catch(n){m.error(`[sync] Error handling remote event: ${n}`)}}async handleRemoteConnectorFileEvent(e,t,n,o){try{switch(n){case Ne.ConnectorFileDeleted:await Hr(e,t);break;case Ne.ConnectorDirectoryRenamed:await zr(e,t,o);break;case Ne.ConnectorDirectoryDeleted:await Vr(e,t);break;default:await Gr(e,t);break}}catch(i){m.error(`[sync] Error handling remote connector file event: ${i}`)}}async handleLocalEvent(e,t){try{if(_r(e.filePath))switch(t){case B.Updated:await Wr(e.filePath);break;case B.Deleted:await Jr(e.filePath);break}else{let n=M.fromPathAndData(e.filePath,e.data);if(!n){const o=M.idFromPath(e.filePath);if(!o||(n=this.remoteCache.get(o),!n))return}switch(m.info(`[${this.getDirectionLabel(q.OUTGOING)}] ${Jn(t)}: ${n.id}`),t){case B.Updated:await this.updateElement(n,q.OUTGOING);break;case B.Deleted:await this.deleteElement(n,q.OUTGOING);break}}}catch(n){m.error(`[sync] Error handling local event: ${n}`)}}detectIncomingChanges(){this.clearChanges();const e=Se.getChanges(q.INCOMING,this.remoteCache,this.localCache);return this.updateChanges(e),e}detectOutgoingChanges(){this.clearChanges();const e=Se.getChanges(q.OUTGOING,this.localCache,this.remoteCache);return this.updateChanges(e),e}async resolveChanges(){if(!this.needsSync())return;m.info("[resolver] Resolving changes.."),m.info("[resolver] Resolving integration elements");const e=this.changes.filter(o=>o.element.type===T.Integration);await Promise.all(e.map(async o=>this.resolveChange(o))),e.length>0&&(await this.fetchElements(),this.changes=this.changes.length>0&&this.changes[0]?.direction===q.INCOMING?this.detectIncomingChanges():this.detectOutgoingChanges(),this.changes=this.changes.filter(o=>o.element.type!==T.Integration)),m.info("[resolver] Resolving universal elements");const t=this.changes.filter(o=>!o.element.hasParent());for(const o of Vt){const i=t.filter(s=>s.element.type===o);m.info(`[resolver] Resolving ${o} elements`),await Promise.all(i.map(async s=>this.resolveChange(s)))}m.info("[resolver] Resolving integration level elements");const n=this.changes.filter(o=>o.element.hasParent());for(const o of Vt){const i=n.filter(s=>s.element.type===o);m.info(`[resolver] Resolving ${o} elements`),await Promise.all(i.map(async s=>this.resolveChange(s)))}m.success("[resolver] Resolved changes")}async resolveChange(e){switch(e.type){case Z.DELETE:return this.deleteElement(e.element,e.direction);case Z.CREATE:return this.updateElement(e.element,e.direction);case Z.UPDATE:return this.updateElement(e.element,e.direction)}}static getChanges(e,t,n){const o=t.getAllIds(),i=n.getAllIds(),s=new Set([...o,...i]),a=[];for(const l of s){const d=t.get(l),h=n.get(l),p=Se.detectChangeForElement(d,h,e);p&&a.push(p)}return a}updateChanges(e){if(this.changes=e,this.needsForcedSync()){const t=e.filter(n=>n.isConflict);m.warning("[resolver] Conflicts detected"),this.notifier.setConflicts(t)}}clearChanges(){this.changes=[]}getDirectionLabel(e){switch(e){case q.INCOMING:return"local\u2190remote";case q.OUTGOING:return"local\u2192remote"}}static detectChangeForElement(e,t,n){return e&&!t?{type:Z.CREATE,element:e,direction:n,isConflict:!1}:!e&&t?{type:Z.DELETE,element:t,direction:n,isConflict:!0}:e&&t&&!e.isEqual(t)?{type:Z.UPDATE,element:e,direction:n,isConflict:!1}:null}}const ne=x.join(Qn.tmpdir(),"membrane-mcp-status"),Yt=3e4;class Zr{static{c(this,"McpStatusService")}constructor(e=2e3){this.pollIntervalMs=e}isRunning=!1;pollInterval;async start(){this.isRunning||(this.isRunning=!0,this.pollInterval=setInterval(async()=>await this.checkStatus(),this.pollIntervalMs),await this.checkStatus())}async stop(){this.pollInterval&&(clearInterval(this.pollInterval),this.pollInterval=void 0,this.isRunning=!1)}async checkStatus(){try{const e=process.cwd(),t=ke(void 0,e),n=Zt(e);t&&te.setMcpStatus(t),await te.setMcpServers(n)}catch{m.error("Failed to check MCP status")}}}function ke(r,e){try{const t=e||process.cwd();if(!r){const o=Zt(t);return o.length===0?null:o[0]}const n=at(r,t);if(v.existsSync(n)){const o=v.statSync(n),i=new Date;if(i.getTime()-o.mtime.getTime()>Yt)return we(r,t),null;const a=v.readFileSync(n,"utf8"),l=JSON.parse(a);if(l.isRunning){const d=new Date(l.lastActivity).getTime();if(i.getTime()-d>Yt)return we(r,t),null}return l}}catch{r&&e&&we(r,e)}return null}c(ke,"getMcpStatus");function Zt(r){try{const e=r||process.cwd(),t=st(e);if(!v.existsSync(ne))return[];const n=v.readdirSync(ne),o=[];for(const i of n){const s=i.match(new RegExp(`^mcp-${t}-(\\d+)\\.json$`));if(s){const a=parseInt(s[1],10),l=ke(a,e);l&&o.push(l)}}return o.sort((i,s)=>new Date(s.startTime).getTime()-new Date(i.startTime).getTime())}catch{return[]}}c(Zt,"getAllMcpStatusFiles");function it(r){try{const t={...ke(r.processId,r.cwd)||{isRunning:!1,startTime:new Date().toISOString(),lastActivity:new Date().toISOString(),toolsCount:0,totalRequests:0,processId:r.processId,cwd:r.cwd,agentName:process.env.AGENT_NAME||"Unnamed Agent"},...r};v.existsSync(ne)||v.mkdirSync(ne,{recursive:!0});const n=at(r.processId,r.cwd);v.writeFileSync(n,JSON.stringify(t,null,2))}catch{}}c(it,"updateMcpStatus");function we(r,e){try{const t=e||process.cwd();if(r){const n=at(r,t);v.existsSync(n)&&v.unlinkSync(n)}else{const n=st(t);if(v.existsSync(ne)){const o=v.readdirSync(ne);for(const i of o)i.match(new RegExp(`^mcp-${n}-\\d+\\.json$`))&&v.unlinkSync(x.join(ne,i))}}}catch{}}c(we,"clearMcpStatus");function Xr(r,e){const t=ke(r,e);t&&it({processId:r,cwd:e,totalRequests:t.totalRequests+1,lastRequestTime:new Date().toISOString(),lastActivity:new Date().toISOString()})}c(Xr,"trackToolExecution");function st(r){return zn("md5").update(r).digest("hex").slice(0,8)}c(st,"getCwdHash");function at(r,e){const t=st(e);return x.join(ne,`mcp-${t}-${r}.json`)}c(at,"getStatusFilePath");const Re={Agent:"agent",Cli:"cli"},$={NOT_INITIALIZED:"not_initialized",SETTING_UP:"setting_up",INITIALIZED:"initialized",NOT_SYNCED:"not_synced",PULLING:"pulling",PUSHING:"pushing",RESOLVING:"resolving",CONFLICTS:"conflicts",SYNCED:"synced",WATCHING:"watching",ERROR:"error"};class Qr{static{c(this,"MembraneCLIService")}constructor(e,t,n=()=>process.exit(0)){this.mode=e,this.cwd=t,this.onShutdown=n,this.notifier=te,this.mcpStatusService=new Zr,this.syncService=new Se,this.setupProcessCleanup()}initialized=!1;notifier;mcpStatusService;syncService;isShuttingDown=!1;currentConfig=null;get config(){return this.currentConfig}getSyncedElements(){return this.syncService.localCache.getAll()}getSyncedElementsByType(e){return this.syncService.localCache.getElementsByType(e)}async fetchElements(){await this.syncService.fetchElements()}async pullWorkspace(e={}){let t=!1;try{if(m.setVerboseMode(!!e.verbose),e.rps!==void 0&&I.init({maxRequestsPerSecond:e.rps}),await this.notifier.setState($.PULLING),await this.syncService.fetchElements(),this.syncService.detectIncomingChanges(),this.syncService.needsForcedSync()&&!e.force){await this.notifier.setState($.CONFLICTS),e.watch||(t=!0);return}await this.syncService.pullConnectors(e.allConnectors),await this.syncWorkspaces(e)}catch(n){t=!0,m.error(`Failed to pull workspace: ${n}`),await this.notifier.setState($.ERROR),m.saveLogsToFile("error")}finally{if(e.saveLogs&&m.saveLogsToFile(),t)process.exit(1);else return e?.onComplete?.()}}async pushWorkspace(e={}){let t=!1;try{if(m.setVerboseMode(!!e.verbose),e.rps!==void 0&&I.init({maxRequestsPerSecond:e.rps}),await this.notifier.setState($.PUSHING),await this.syncService.fetchElements(),this.syncService.detectOutgoingChanges(),this.syncService.needsForcedSync()&&!e.force){await this.notifier.setState($.CONFLICTS),e.watch||(t=!0);return}await this.syncService.pushConnectors(),await this.syncWorkspaces(e)}catch(n){t=!0,m.error(`Failed to push workspace: ${n}`),await this.notifier.setState($.ERROR),m.saveLogsToFile("error")}finally{if(e.saveLogs&&m.saveLogsToFile(),t)process.exit(1);else return e?.onComplete?.()}}async syncWorkspaces(e={}){try{e.verbose!==void 0&&m.setVerboseMode(!!e.verbose),await this.notifier.setState($.RESOLVING),this.syncService.needsSync()&&await this.syncService.resolveChanges();const t=await this.syncService.getStats();this.notifier.setStats(t),await this.notifier.setState($.SYNCED),e.watch&&(await this.notifier.setState($.WATCHING),await this.syncService.startWatching())}catch(t){m.error(`Failed to sync local and remote workspaces: ${t}`),await this.notifier.setState($.ERROR),m.saveLogsToFile("error")}}async init({force:e=!1}={}){if(!(this.initialized&&!e)){await this.notifier.setState($.NOT_INITIALIZED);try{await this.loadConfig(),le.isCacheDefined()?(await this.initServices(),this.initialized=!0,await this.notifier.setState($.INITIALIZED)):(this.initialized=!1,await this.notifier.setState($.SETTING_UP))}catch(t){m.error(`Failed to initialize services: ${t}`),await this.notifier.setState($.ERROR),m.saveLogsToFile("error"),this.onShutdown()}}}async loadConfig(){this.currentConfig=le.loadConfig(this.cwd),this.notifier.setConfig(this.currentConfig)}async updateConfig(e){const t={...this.currentConfig,...e};if(!(JSON.stringify(t)!==JSON.stringify(this.currentConfig)))return;await this.stopServices();const o=le.updateConfig(t);this.currentConfig=o,await this.init({force:!0})}async shutdown(){!this.initialized||this.isShuttingDown||(this.isShuttingDown=!0,this.mode===Re.Agent&&(await this.notifier.cleanup(),await this.mcpStatusService.stop()),this.initialized=!1,this.onShutdown())}async initServices(){this.mode===Re.Agent&&(await this.notifier.connectToRemote(),await this.mcpStatusService.start()),this.syncService.clear()}async stopServices(){this.mode===Re.Agent&&(await this.notifier.cleanup(),await this.mcpStatusService.stop())}setupProcessCleanup(){["SIGINT","SIGTERM","uncaughtException","unhandledRejection"].forEach(t=>process.on(t,()=>this.shutdown())),process.on("beforeExit",t=>{t===0&&this.shutdown()})}}const Xt=Ke(null);function eo({children:r,membraneCLIService:e}){const{data:t}=$t("/account"),[n,o]=D($.NOT_INITIALIZED),[i,s]=D([]),[a,l]=D({}),[d,h]=D([]),[p,f]=D(null),E=t?.workspaces?.find(S=>S.workspaceKey===p?.workspaceKey)||null;return he(()=>{const S=c(({state:L})=>o(L),"handleStateChanged"),N=c(({stats:L})=>l(L),"handleStatsChanged"),O=c(({log:L})=>h(be=>[...be,L]),"handleLogAdded"),U=c(({conflicts:L})=>s(L),"handleConflictsUpdated"),K=c(({config:L})=>f(L),"handleConfigChanged");return e.notifier.on(F.StateChanged,S),e.notifier.on(F.StatsChanged,N),e.notifier.on(F.LogAdded,O),e.notifier.on(F.ConflictsChanged,U),e.notifier.on(F.ConfigChanged,K),e.init(),()=>{e.notifier.off(F.StateChanged,S),e.notifier.off(F.StatsChanged,N),e.notifier.off(F.LogAdded,O),e.notifier.off(F.ConflictsChanged,U),e.notifier.off(F.ConfigChanged,K)}},[]),u(Xt.Provider,{value:{state:n,stats:a,logs:d,currentWorkspace:E,conflicts:i,config:p,updateConfig:c(S=>e.updateConfig(S),"updateConfig"),resolveConflicts:c(S=>e.syncWorkspaces(S),"resolveConflicts"),pull:c(S=>e.pullWorkspace(S),"pull"),push:c(S=>e.pushWorkspace(S),"push"),exit:c(()=>e.shutdown(),"exit"),fetchElements:c(()=>e.fetchElements(),"fetchElements"),getSyncedElementsByType:c(S=>e.getSyncedElementsByType(S),"getSyncedElementsByType")},children:r})}c(eo,"MembraneCLIServiceProvider");function H(){const r=qe(Xt);if(!r)throw new Error("useMembraneCLIService must be used within MembraneCLIServiceProvider");return r}c(H,"useMembraneCLIService");const ct=Ke(null),Qt=c(()=>{const r=qe(ct);if(!r)throw new Error("useTree must be used within TreeView");return r},"useTree"),to=c(r=>se.Children.count(r)>0,"hasChildren");function no(r){const e=Qt(),{label:t,value:n,isInitiallyExpanded:o}=r,i=Un(),s=Be(e.registerChildItem(t)).current,a=e.isActiveByRef(s),[l,d]=D(o??!1),h={props:r,ref:s,id:i,active:a,expanded:l,setExpanded:d,label:t,value:n,isInitiallyExpanded:o,isParent:!1},{children:p}=r,f=typeof p=="function"?p(h):p;return{...h,props:{...r,children:f},isParent:to(f)}}c(no,"useTreeItem");function fe(r){const e=Qt(),t=no(r),{expanded:n,isParent:o,props:{children:i},setExpanded:s}=t,{renderValue:a=oo}=r,l=t.ref;Ee(()=>{function f(C){return r.onInput?.(C)?!0:C.active&&C.key.rightArrow&&!n?(s(!0),!0):C.active&&C.key.leftArrow&&n?(s(!1),!0):!1}c(f,"onInput"),l.onInput=f},[l,r.onInput,n,s]),l.firstChild??={parent:l,index:0};let d=l.firstChild;function h(f){const C=d;return C.nextSibling||(C.nextSibling={parent:l,prevSibling:C,index:C.index+1}),d=C.nextSibling,C.label=f,C}c(h,"registerChildItem");function p(){l.lastRenderedChild=d.prevSibling}return c(p,"commitChildren"),Ee(()=>{p()}),b(Te,{children:[b(g,{marginLeft:e.depth*2,children:[u(g,{width:2,children:o&&u(y,{children:n?"\u25BC":"\u25B6"})}),ro(t),a(t)]}),n&&u(ct.Provider,{value:{...e,depth:e.depth+1,registerChildItem:h},children:i})]})}c(fe,"TreeItem");function ro({active:r,label:e}){return u(g,{width:32,children:u(y,{inverse:r,children:e})})}c(ro,"defaultRenderLabel");function oo(r){return u(y,{})}c(oo,"defaultRenderValue");const ue=c(({label:r,onPress:e,hotkey:t})=>u(fe,{label:r,onInput:c(({input:n,key:o,active:i})=>i&&o.return||t&&t in o&&o[t]||n===t?(e(),!0):!1,"onInput"),renderValue:c(()=>u(g,{children:u(y,{children:`${t?` (${t})`:""}`})}),"renderValue")}),"ActionTreeItem"),en=c(({label:r,value:e,onChange:t,disabled:n=!1,mask:o,...i})=>{const[s,a]=D(e),[l,d]=D(!1);return Ee(()=>{l||a(e)},[l,e]),u(fe,{label:r,value:e,onInput:c(({key:h,active:p})=>n?!1:l?(h.escape&&d(!1),h.return&&(t(s),d(!1)),!0):p&&h.return?(d(!0),a(e),!0):!1,"onInput"),renderValue:c(()=>{const h=s,p=o?o.repeat(h.length):h;return u(g,{children:n||!l?u(y,{dimColor:!0,children:p}):b(Te,{children:[u(g,{width:p.length+1,children:u(Dt,{...i,focus:l,value:h,onChange:a})}),u(y,{dimColor:!0,children:" \u241B cancel"})]})})},"renderValue")})},"TreeTextField"),io=c(r=>u(en,{...r,mask:"*"}),"SecretField"),W=c(({children:r,showHelp:e=!1})=>{const t=Be({parent:void 0,label:"<<ROOT>>",index:0}),[n,o]=D(t.current),i={depth:0,isActiveByRef:c(a=>n===a,"isActiveByRef"),registerChildItem:c(()=>t.current,"registerChildItem"),activeItemRef:n};Ee(()=>{o(a=>a.parent?a.parent.lastRenderedChild&&a.index>a.parent.lastRenderedChild.index?a.parent.lastRenderedChild:a:t.current.firstChild??t.current)});function*s(a){a&&(yield a,yield*s(a.firstChild),a.nextSibling&&a!==a.parent?.lastRenderedChild&&(yield*s(a.nextSibling)))}return c(s,"walkTree"),ae((a,l)=>{if(n.onInput?.({input:a,key:l,active:!0}))return;let d,h;for(const p of s(t.current))if(p.label!=null){if(d===n&&(h=p),p&&p.onInput?.({input:a,key:l,active:p===n}))return;d=p}l.upArrow?o(p=>p.prevSibling?.lastRenderedChild??p.prevSibling??p.parent??t.current):l.downArrow?o(p=>h??p):l.pageUp?o(()=>t.current.firstChild??t.current):l.pageDown?o(()=>t.current.lastRenderedChild??t.current):l.tab?console.log({label:n.label,nextSibling:n.nextSibling?.label,prevSibling:n.prevSibling?.label,parent:n.parent?.label,firstChild:n.firstChild?.label,lastRenderedChild:n.lastRenderedChild?.label}):l.leftArrow?o(p=>p.parent??t.current):l.rightArrow&&o(p=>p.lastRenderedChild?p.firstChild:p)}),u(ct.Provider,{value:i,children:b(g,{flexDirection:"column",children:[u(fe,{isInitiallyExpanded:!0,label:"rootItem",children:r}),e&&u(g,{marginTop:1,flexDirection:"column",children:u(y,{dimColor:!0,children:"\u2191/\u2193 move \u2022 \u2190 collapse \u2022 \u2192 expand \u2022 Enter/Space select/edit \u2022 Esc exit"})})]})})},"TreeView");W.Item=fe,W.TextField=en;function de({label:r,elementType:e,isActionExcluded:t,toggleAction:n,generateCode:o}){const[i,s]=D([]),{fetchElements:a,getSyncedElementsByType:l}=H();return he(()=>{c(async()=>{try{await a();const h=l(e);s(h.map(p=>p.data))}catch(h){console.error(String(h))}},"loadElements")()},[e,a,l,s]),u(fe,{label:r,children:i.map(d=>u(fe,{label:d.name,children:e===T.Action&&b(Te,{children:[t&&n&&u(ue,{label:`Toggle ${t(d)?"":"(excluded)"}`,onPress:c(()=>{n(d)},"onPress")}),o&&u(ue,{label:"Generate code",onPress:c(()=>{o?.(d)},"onPress")})]})},d.id))})}c(de,"WorkspaceElementsTreeItem");function so({onComplete:r}){const{config:e,updateConfig:t,fetchElements:n,getSyncedElementsByType:o}=H(),[i,s]=D(""),a=e,l=c(f=>{s(f),setTimeout(()=>s(""),2e3)},"setFlash"),d=c(async(f,C)=>{try{await t({[f]:C}),l("\u2705 Configuration updated!")}catch{l("\u274C Error updating configuration")}},"updateField"),h=c(async()=>{try{if(e){const f=le.saveToFile(e);l(f?"\u2705 Configuration saved successfully!":"\u274C Failed to save configuration"),await n();const C=o(T.Action);await Ve({out:a?.outputDir??"",target:a?.projectType??"typescript",schemasOnly:!1,membraneInterfaces:{actions:C.filter(E=>!a?.excludedActionKeys?.includes(E.key)).map(E=>E.data)}}),l("\u2705 Code generated successfully!")}}catch{l("\u274C Error saving configuration")}},"handleSaveConfig"),p=c(async()=>{try{const f=le.loadConfig();f?(await t(f),l("\u2705 Configuration reloaded successfully!")):l("\u274C No configuration found to reload")}catch{l("\u274C Error reloading configuration")}},"handleReloadConfig");return b(g,{flexDirection:"column",gap:1,children:[u(y,{bold:!0,color:"cyan",children:"\u2699\uFE0F Membrane Configuration Manager"}),u(g,{paddingX:2,children:b(W,{showHelp:!0,children:[b(W.Item,{label:"Configuration",isInitiallyExpanded:!0,children:[b(W.Item,{label:"Project",children:[u(W.TextField,{label:"Workspace Key",value:a?.workspaceKey??"",onChange:c(f=>d("workspaceKey",f),"onChange"),disabled:!0}),u(io,{label:"Workspace Secret",value:a?.workspaceSecret??"",onChange:c(f=>d("workspaceSecret",f),"onChange"),disabled:!0}),u(W.TextField,{label:"API URI",value:a?.apiUri??"",onChange:c(f=>d("apiUri",f),"onChange")}),u(W.TextField,{label:"Test Customer ID",value:a?.testCustomerId??"",onChange:c(f=>d("testCustomerId",f),"onChange")})]}),b(W.Item,{label:"Code Generation",isInitiallyExpanded:!0,children:[b(W.Item,{label:"Project Type",isInitiallyExpanded:!0,value:a?.projectType,renderValue:c(({value:f})=>u(y,{children:f==="typescript"?"TypeScript":f==="openapi"?"OpenAPI":"(Not set)"}),"renderValue"),children:[u(ue,{label:"Update to TypeScript",onPress:c(()=>d("projectType","typescript"),"onPress")}),u(ue,{label:"Update to OpenAPI",onPress:c(()=>d("projectType","openapi"),"onPress")})]}),u(W.TextField,{label:"Project dir",value:a?.outputDir??"",onChange:c(f=>d("outputDir",f),"onChange")})]}),b(W.Item,{label:"Workspace Elements",children:[u(de,{label:"Actions",elementType:T.Action,isActionExcluded:c(f=>a?.excludedActionKeys?.includes(f.key)??!1,"isActionExcluded"),toggleAction:c(f=>d("excludedActionKeys",[...a?.excludedActionKeys??[],f.key]),"toggleAction"),generateCode:c(f=>{(async()=>{try{await Ve({out:a?.outputDir??"",target:a?.projectType??"typescript",schemasOnly:!1,membraneInterfaces:{actions:[f]}}),l("\u2705 Code generated successfully!")}catch{l("\u274C Error generating code")}})()},"generateCode")}),u(de,{label:"Flows",elementType:T.Flow}),u(de,{label:"Data Sources",elementType:T.DataSource}),u(de,{label:"Field Mappings",elementType:T.FieldMapping}),u(de,{label:"Packages",elementType:T.Package}),u(de,{label:"App Data Schemas",elementType:T.AppDataSchema}),u(de,{label:"App Event Types",elementType:T.AppEventType})]})]}),u(ue,{label:"Save Configuration",onPress:h,hotkey:"s"}),u(ue,{label:"Reload Configuration",onPress:p,hotkey:"r"}),u(ue,{label:"Exit",onPress:c(()=>r?.(),"onPress"),hotkey:"escape"})]})}),i&&u(g,{paddingX:2,children:u(y,{color:i.includes("\u2705")?"green":"red",children:i})})]})}c(so,"ConfigManager");const tn=Ke(process.cwd());function ao({cwd:r,children:e}){return u(tn.Provider,{value:r,children:e})}c(ao,"CwdProvider");function co(){return qe(tn)}c(co,"useCwd");function lt({cwd:r,children:e,membraneCLIService:t}){const n=r||process.cwd();return u(ao,{cwd:n,children:u(er,{value:{fetcher:Er()},children:u(eo,{membraneCLIService:t,children:e})})})}c(lt,"Layout");function lo(r,e){r.command("config").alias("install").description("\u26A0\uFE0F EXPERIMENTAL: Manage local membrane configuration with interactive UI").addHelpText("after",["","Examples:"," membrane config # Open interactive config manager",""].join(`
|
|
10
|
+
`)).action(()=>{_e(se.createElement(lt,{membraneCLIService:e,children:se.createElement(so,{onComplete:c(()=>process.exit(0),"onComplete")})}))})}c(lo,"setupConfigCommand");function uo({currentPat:r,onSubmit:e}){const[t,n]=D(""),[o,i]=D(!1),[s,a]=D(null);return b(g,{flexDirection:"column",borderStyle:"round",borderTop:!0,width:70,paddingX:1,children:[u(g,{marginTop:-1,marginBottom:1,children:u(y,{bold:!0,children:"\u{1F511} Enter your Personal Access Token"})}),u(y,{children:"Please provide your Personal Access Token. You can find it here:"}),u(g,{marginTop:1,marginBottom:1,children:u(y,{color:"yellow",children:"https://console.integration.app/w/0/manage-account/api-token"})}),r&&u(y,{dimColor:!0,children:"Press Enter to keep your current token or type a new one."}),u(Dt,{mask:"*",placeholder:`${r?"******":"Enter your token here..."}`,value:t,onChange:n,onSubmit:c(async d=>{a(null),i(!0);try{await e(d),n("")}catch{a("Invalid token. Please try again.")}finally{i(!1)}},"handleSubmit")}),o&&u(g,{marginTop:1,children:b(y,{children:[u(xe,{type:"dots"})," Validating token..."]})}),s&&u(y,{color:"red",children:s})]})}c(uo,"PersonalAccessTokenInput");function nn({onExit:r,showEscOption:e=!0}){const[t,n]=D(""),{data:o,error:i,isLoading:s}=$t("/account"),{updateConfig:a}=H(),l=o?.workspaces,d=s;if(ae((S,N)=>{N.escape&&r?.()}),d)return b(g,{children:[u(xe,{}),u(y,{children:" Fetching workspaces..."})]});if(i)return b(g,{flexDirection:"column",children:[b(y,{color:"red",children:["Error: ",i.message]}),u(g,{marginTop:1,children:u(y,{color:"grey",children:"Press ESC to go back"})})]});const h=l?.filter(S=>S.name.toLowerCase().includes(t.toLowerCase()))??[],p=h.map(S=>({label:S.name,value:S.id})),f=p.length,C=l?.length??0;async function E(S){const N=h.find(K=>K.id===S);if(!N)return;const{key:O,secret:U}=N;!O||!U||(await a({workspaceKey:O,workspaceSecret:U}),r?.())}return c(E,"handleSelect"),b(g,{flexDirection:"column",borderStyle:"round",borderTop:!0,width:70,paddingX:1,children:[u(g,{marginTop:-1,children:u(y,{bold:!0,children:"\u{1F4C1} Select your workspace"})}),b(g,{marginTop:1,children:[u(y,{children:"Search: "}),u(tr,{placeholder:"Enter a search query...",onChange:n})]}),C>5&&b(y,{children:["Showing ",f," of ",C," workspaces."]}),u(g,{marginTop:1,children:u(nr,{options:p,onChange:c(S=>{S&&E(S)},"onChange")})}),e&&u(g,{marginTop:1,children:u(y,{color:"grey",children:"Press ESC to go back"})})]})}c(nn,"SelectWorkspace");var Ce=(r=>(r[r.Authenticate=0]="Authenticate",r[r.ConnectWorkspace=1]="ConnectWorkspace",r))(Ce||{});const ho={0:"Authenticate in Membrane",1:"Connect a Membrane Workspace"},ut=[Ce.Authenticate,Ce.ConnectWorkspace];function rn({onComplete:r}){const{config:e}=H(),[t,n]=D(!1),[o,i]=D(0),s=!!(e?.workspaceKey&&e?.workspaceSecret),a=Lt(),l=ut[o],d=o+1,h=ut.length,p=ut.map((E,S)=>{let N="pending";return S<o?N="done":S===o&&(N="current"),{id:E,label:ho[E],status:N}});async function f(E){const S=a&&E===""?a:E,N=new jt;try{await N.request("/account",{headers:{Authorization:`Bearer ${S}`}}),vr(S),i(O=>O+1)}catch(O){console.error(O)}}c(f,"handlePatSubmit");function C(){n(!0),r&&r()}return c(C,"handleWorkspaceSelected"),ae((E,S)=>{s&&S.escape&&r&&r()}),t?u(g,{children:u(y,{children:"\u2705 Setup complete. You are ready to go!"})}):b(g,{flexDirection:"column",alignSelf:"flex-start",gap:1,children:[b(g,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:70,children:[u(g,{marginTop:-1,marginBottom:1,children:b(y,{bold:!0,children:["\u{1F6E0}\uFE0F Setup \u2014"," ",b(y,{color:"cyan",children:["Step ",d," of ",h]}),s&&u(y,{color:"grey",children:" [esc: go back]"})]})}),u(g,{flexDirection:"column",paddingLeft:2,children:p.map(E=>u(po,{status:E.status,label:E.label},E.id))})]}),l===Ce.Authenticate&&u(uo,{currentPat:a,onSubmit:f}),l===Ce.ConnectWorkspace&&u(nn,{onExit:C,showEscOption:!1})]})}c(rn,"Setup");function po({status:r,label:e}){return b(g,{children:[b(g,{width:2,children:[r==="current"&&u(xe,{type:"dots"}),r==="done"&&u(y,{children:"\u2705"})]}),u(y,{dimColor:r!=="current",children:e})]})}c(po,"StepDisplay");function fo(r,e){r.command("init").description("Run interactive setup for Membrane project").option("--key <key>","Workspace key for non-interactive setup").option("--secret <secret>","Workspace secret for non-interactive setup").addHelpText("after",["","Examples:"," membrane init # Run interactive setup"," membrane init --key KEY --secret SEC # Non-interactive setup with key and secret",""].join(`
|
|
11
|
+
`)).action(t=>{t.key&&t.secret?le.saveToFile({workspaceKey:t.key,workspaceSecret:t.secret})?(console.error("\u2705 Configuration saved to membrane.config.yml"),process.exit(0)):(console.error("Error writing configuration file"),process.exit(1)):t.key||t.secret?(console.error("Error: Both --key and --secret must be provided for non-interactive mode"),process.exit(1)):_e(se.createElement(lt,{membraneCLIService:e,children:se.createElement(rn,{onComplete:c(()=>process.exit(0),"onComplete")})}))})}c(fo,"setupInitCommand");const mo=86400;async function go(r,e,t,n){const o={iss:r,isAdmin:!0};return t&&(o.id=t),We.sign(o,e,{expiresIn:mo})}c(go,"generateMcpAccessToken");async function yo(r,e){return(await ge.get(`${r}/docs-json`,{headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"}})).data}c(yo,"fetchOpenApiSchema");function re(r,e=!0,t,n=new Set){if(!r)return e?A.string():A.string().optional();if(Object.keys(r).length===0)return e?A.any():A.any().optional();if(r.$ref){const i=r.$ref.replace("#/components/schemas/","");if(n.has(i))return A.any();if(n.add(i),t?.schemas?.[i]){const s=t.schemas[i];return re(s,e,t,n)}return A.any()}let o;if(r.type==="object"||r.properties){const i={};if(r.properties)for(const[s,a]of Object.entries(r.properties)){const l=r.required?.includes(s)??!1;i[s]=re(a,l,t,n)}if(Object.keys(i).length>0){if(o=A.object(i),r.additionalProperties)if(typeof r.additionalProperties=="object"){const s=re(r.additionalProperties,!1,t,n);o=o.catchall(s)}else r.additionalProperties===!0&&(o=o.passthrough())}else if(r.additionalProperties&&typeof r.additionalProperties=="object"){const s=re(r.additionalProperties,!1,t,n);o=A.record(A.string(),s)}else o=A.record(A.string(),A.any())}else if(r.type==="array"){const i=r.items?re(r.items,!0,t,n):A.any();o=A.array(i)}else if(r.anyOf)o=A.any();else{switch(r.type){case"integer":o=A.coerce.number().int();break;case"number":o=A.coerce.number();break;case"boolean":o=A.coerce.boolean();break;case"string":default:o=A.string();break}r.format==="uuid"?o=A.string().uuid():r.format==="email"?o=A.string().email():r.format==="date"?o=A.string().regex(/^\d{4}-\d{2}-\d{2}$/):r.format==="date-time"&&(o=A.string().datetime()),r.enum&&(o=A.enum(r.enum)),(r.type==="integer"||r.type==="number")&&(r.minimum!==void 0&&(o=o.min(r.minimum)),r.maximum!==void 0&&(o=o.max(r.maximum))),r.type==="string"&&(r.minLength!==void 0&&(o=o.min(r.minLength)),r.maxLength!==void 0&&(o=o.max(r.maxLength)))}return e?o:o.optional()}c(re,"convertOpenApiSchemaToZod");function on(r){const e=r.match(/\{([^}]+)\}/g);return e?e.map(t=>t.slice(1,-1)):[]}c(on,"extractPathParameters");function wo(r,e,t,n,o,i){const s=r.operationId||`${t}_${e.replace(/[^a-zA-Z0-9]/g,"_")}`,a=r.description||r.summary||`${t.toUpperCase()} ${e}`,l={},d={},h={};if(r.parameters){for(const f of r.parameters)if(f.in==="path")d[f.name]=re(f.schema,!0,o).describe(f.description||`Path parameter: ${f.name}`);else if(f.in==="query"){const C=f.required===!0;h[f.name]=re(f.schema,C,o).describe(f.description||`Query parameter: ${f.name}`)}}if(Object.keys(d).length>0&&(l.params=A.object(d).describe("Path parameters")),Object.keys(h).length>0&&(l.query=A.object(h).describe("Query parameters")),r.requestBody&&r.requestBody.content){const f=r.requestBody.required===!0;if(r.requestBody.content["application/json"]){const C=r.requestBody.content["application/json"].schema;C?l.body=re(C,f,o).describe("Request body (JSON)"):l.body=A.any().describe("Request body (JSON)")}else r.requestBody.content["application/octet-stream"]||r.requestBody.content["text/plain"]?l.body=f?A.string().describe("Request body (binary/text)"):A.string().optional().describe("Request body (binary/text)"):l.body=A.any().describe("Request body")}const p=Object.keys(l).length>0?A.object(l):A.object({});return{name:s,description:a,parameters:p,async execute(f){try{const C=on(e);if(C.length>0){if(!f.params)throw new Error(`Missing required path parameters: ${C.join(", ")}`);const K=C.filter(L=>!(L in f.params));if(K.length>0)throw new Error(`Missing required path parameters: ${K.join(", ")}`)}let E=`${n}${e}`;if(f.params)for(const[K,L]of Object.entries(f.params)){const be=`{${K}}`;E.includes(be)&&(E=E.replace(be,String(L)))}const S=on(E);if(S.length>0)throw new Error(`Unresolved path parameters: ${S.join(", ")}`);const N=new URLSearchParams;if(f.query)for(const[K,L]of Object.entries(f.query))L!=null&&N.append(K,String(L));N.toString()&&(E+=`?${N.toString()}`);const O={method:t.toUpperCase(),headers:{Authorization:`Bearer ${i}`}};f.body&&t.toLowerCase()!=="get"&&(r.requestBody?.content?.["application/json"]?(O.headers["Content-Type"]="application/json",O.data=f.body):r.requestBody?.content?.["application/octet-stream"]?(O.headers["Content-Type"]="application/octet-stream",O.data=f.body):r.requestBody?.content?.["text/plain"]?(O.headers["Content-Type"]="text/plain",O.data=f.body):(O.headers["Content-Type"]="application/json",O.data=f.body));const U=await ge.request({url:E,...O});return{content:[{type:"text",text:U.data===""?"":JSON.stringify(U.data,null,2)}]}}catch(C){return ge.isAxiosError(C)?{content:[{type:"text",text:`Error: ${C.response?.data?`HTTP ${C.response.status}: ${C.response.statusText} - ${JSON.stringify(C.response.data)}`:`HTTP ${C.response?.status||"unknown"}: ${C.message}`}`}],isError:!0}:C instanceof Error?{content:[{type:"text",text:`Error: API call failed: ${C.message}`}],isError:!0}:{content:[{type:"text",text:"Error: API call failed with unknown error"}],isError:!0}}}}}c(wo,"createApiTool");function Co(r,e,t){const n=[];if(!r.paths)return n;const o=r.components||{};for(const[i,s]of Object.entries(r.paths))if(typeof s=="object"&&s!==null){for(const[a,l]of Object.entries(s))if(["get","post","put","delete","patch"].includes(a)&&l&&typeof l=="object"){const d=wo(l,i,a,e,o,t);n.push(d)}}return n}c(Co,"convertOpenApiToTools");function So(r){r.command("mcp").description("Launch MCP server with OpenAPI endpoints as tools (API URI is read from environment variables or membrane.config.yml)").addHelpText("after",["","Examples:"," membrane mcp # Launch MCP server using API URI from env vars or membrane.config.yml",""].join(`
|
|
12
|
+
`)).action(async()=>{try{process.env.FASTMCP_SUPPRESS_WARNINGS="true";const e=$e(),t=process.env.MEMBRANE_ACCESS_TOKEN||e?.accessToken,n=process.env.MEMBRANE_WORKSPACE_KEY||e?.workspaceKey,o=process.env.MEMBRANE_WORKSPACE_SECRET||e?.workspaceSecret,i=process.env.MEMBRANE_TEST_CUSTOMER_ID||e?.testCustomerId,s=process.env.MEMBRANE_API_URI||e?.apiUri||Ze;!t&&(!n||!o)&&(e||(console.error("No configuration found. Please set MEMBRANE_ACCESS_TOKEN, or MEMBRANE_WORKSPACE_KEY and MEMBRANE_WORKSPACE_SECRET environment variables, or run `membrane init` first to create a configuration file."),process.exit(1)),console.error("Missing credentials. Please provide MEMBRANE_ACCESS_TOKEN or workspace key/secret in the configuration file, command line, or environment variables."),process.exit(1));const a=t||await go(n,o,i),l=await yo(s,a),d=Co(l,s,a),h=new or({name:"Membrane API",instructions:`This MCP server lets you interact with Membrane to configure, run, and troubleshoot integrations.
|
|
151
13
|
Use it for anything related to Membrane or integrations.
|
|
152
|
-
`,version:"1.0.0"});for(const
|
|
153
|
-
${
|
|
154
|
-
${
|
|
155
|
-
`)).action(async()=>{try{
|
|
156
|
-
`)).action(async e=>{const t=
|
|
157
|
-
`)).action(async(e,t)=>{const n=or({text:"Pushing workspace",color:"white"}).start();try{await lu(e,t,n)}catch(r){n.stop(),mu(r),process.exit(1)}})}c(cu,"setupPushCommand");async function lu(s,e,t){const n=s.length>0,r=await co(),i=fo(),o=uu(r,i),a=await ao(o,n?s:void 0);t.text="Comparing workspace";const l=await mo(a,{dryRun:!0,partial:n});l[we.DELETE].size>0&&!e.force&&(t.stop(),await pu(l,a),j.error("Use --force to delete remote elements"),process.exit(1));const{pushedConnectors:f=[]}=await Wi({onProgress:c((d,h)=>{d==="pushing"?t.start(`Pushing connector ${h}...`):t.succeed(`Pushed connector ${h}`)},"onProgress")});t.start("Pushing workspace..."),await mo(a,{partial:n}),t.stop(),hu(o,f),process.exit(0)}c(lu,"pushWorkspace");function uu(s,e){const t=fu(s),n=du(t,e),r={};for(const[i,o]of Object.entries(t)){const a=i,l=ye[a]?.parentFieldKey||"parentId";r[a]=(o||[]).map(u=>{const f={...u};if(f.integrationId&&!f.integrationUuid&&(f.integrationUuid=n.get(f.integrationId.toString())||f.integrationId,delete f.integrationId),f.connectorId){if(!f.connectorUuid){const d=n.get(f.connectorId.toString());d&&(f.connectorUuid=d)}delete f.connectorId}if(f[l]){const d=f[l].toString();f.parentUuid=n.get(d)||d}return a===N.Package&&f.elements&&(f.elements=f.elements.map(d=>{if(d.id&&!d.uuid){const h=n.get(d.id.toString());if(h)return{uuid:h,type:d.type}}return d})),delete f.id,f})}return r}c(uu,"resolveLegacyIdReferences");function fu(s){const e={};for(const[t,n]of Object.entries(s))e[t]=(n||[]).map(r=>r.uuid?r:{...r,uuid:au()});return e}c(fu,"generateMissingUuids");function du(s,e){const t=new Map;for(const n of Object.values(s))for(const r of n||[])r.id&&r.uuid&&t.set(r.id.toString(),r.uuid);for(const[n,r]of Object.entries(e))r.id&&t.set(r.id.toString(),n);return t}c(du,"buildIdToUuidLookup");function hu(s,e=[]){const t=Object.values(s).reduce((n,r)=>n+(r?.length??0),0)+e.length;j.info(`\u25CF Pushed workspace elements \xB7 ${t}`);for(const n of Object.keys(s).sort()){const r=s[n];j.info(`\u2514\u2500\u2500 ${n}s \xB7 ${r?.length??0}`)}e.length>0&&j.info(`\u2514\u2500\u2500 connectors \xB7 ${e.length}`)}c(hu,"showStats");async function pu(s,e){const t=s[we.DELETE].size;j.info(`\u2299 Push: conflicts detected \xB7 ${t}`),await Fs(e,(n,r)=>{Re(n)&&s[we.DELETE].has(r.uuid)&&j.info(`\u2514\u2500\u2500 ./membrane/${n} (deleted locally)`)})}c(pu,"showConflicts");async function mu(s){j.error("\u25A0 Error"),j.error(`\u2514\u2500\u2500 ${s.message}`),j.error(` ${s.stack}`)}c(mu,"showError");const Bs=[{id:"claude-code",name:"Claude Code",description:"Anthropic Claude Code agent",actionDescription:"Adding membrane MCP to .mcp.json in the current directory",addConfig:c(()=>{const s=x.join(process.cwd(),".mcp.json"),e={mcpServers:{membrane:{command:"membrane",args:["mcp"],env:{AGENT_NAME:"Claude Code"}}}};let t={};if(O.existsSync(s))try{t=JSON.parse(O.readFileSync(s,"utf8"))}catch{t={}}const n={...t,mcpServers:{...t.mcpServers,...e.mcpServers}};return O.writeFileSync(s,JSON.stringify(n,null,2)),`MCP server configuration added to ${s}`},"addConfig")},{id:"cursor",name:"Cursor",description:"Cursor AI editor",actionDescription:"Adding membrane MCP to .cursor/mcp.json in the current directory",addConfig:c(()=>{const s=x.join(process.cwd(),".cursor"),e=x.join(s,"mcp.json");O.existsSync(s)||O.mkdirSync(s);const t={mcpServers:{membrane:{command:"membrane",args:["mcp"],env:{AGENT_NAME:"Cursor"}}}};let n={};if(O.existsSync(e))try{n=JSON.parse(O.readFileSync(e,"utf8"))}catch{n={}}const r={...n,mcpServers:{...n.mcpServers,...t.mcpServers}};return O.writeFileSync(e,JSON.stringify(r,null,2)),`MCP server configuration added to ${e}`},"addConfig")}];function gu({onExit:s,onComplete:e}){const[t,n]=q(0),[r,i]=q(!1),[o,a]=q(null),[l,u]=q(""),[f,d]=q("");Me((y,p)=>{if(l||f){(p.escape||y==="q"||p.return)&&e();return}if(r)p.return||y===" "?h(o):p.escape&&(i(!1),a(null));else if(p.escape)s();else if(p.upArrow||y==="k")n(Math.max(0,t-1));else if(p.downArrow||y==="j")n(Math.min(Bs.length-1,t+1));else if(p.return||y===" "){const w=Bs[t];a(w),i(!0)}});const h=c(y=>{try{const p=y.addConfig();u(p)}catch(p){d(`Failed to write configuration: ${p.message||p}`)}},"addMcpConfiguration"),g=Math.min(80,process.stdout.columns||80);return l?T(S,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(S,{marginTop:-1,marginBottom:1,children:T(C,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(C,{color:"green",children:"Success"})]})}),T(S,{flexDirection:"column",paddingLeft:2,children:[m(C,{color:"green",children:l}),m(S,{marginTop:1,children:m(C,{color:"grey",children:"The agent will now be able to use Membrane's integration capabilities."})})]}),m(S,{marginTop:1,paddingLeft:2,children:m(C,{color:"white",children:"[esc/q/enter: exit]"})})]}):f?T(S,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(S,{marginTop:-1,marginBottom:1,children:T(C,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(C,{color:"red",children:"Error"})]})}),m(S,{flexDirection:"column",paddingLeft:2,children:m(C,{color:"red",children:f})}),m(S,{marginTop:1,children:m(C,{color:"grey",children:"[esc/q/enter: exit]"})})]}):r&&o?T(S,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(S,{marginTop:-1,marginBottom:1,children:T(C,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(C,{color:"cyan",children:"Confirmation"})]})}),T(S,{flexDirection:"column",paddingLeft:2,children:[T(C,{children:["Connect ",m(C,{bold:!0,children:o.name})," to Membrane via MCP?"]}),m(S,{marginTop:1,children:m(C,{color:"grey",children:"This will add an MCP server configuration that allows the agent to use Membrane's integration capabilities."})}),m(S,{marginTop:1,children:m(C,{color:"yellow",bold:!0,children:o.actionDescription})}),m(S,{marginTop:2,marginBottom:1,children:T(C,{children:[m(C,{color:"white",bold:!0,children:"[Enter] Confirm"})," ",m(C,{color:"gray",children:"[Esc] Cancel"})]})})]})]}):T(S,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(S,{marginTop:-1,marginBottom:1,children:T(C,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(C,{color:"cyan",children:"Select Agent"})]})}),T(S,{flexDirection:"column",paddingLeft:2,children:[m(C,{color:"grey",children:"Choose an agent to connect to Membrane via MCP:"}),m(S,{marginTop:1,children:m(C,{color:"grey",children:"This will add an MCP server configuration that allows the agent to use Membrane's integration capabilities."})}),m(S,{marginTop:1,flexDirection:"column",children:Bs.map((y,p)=>T(S,{children:[T(C,{color:t===p?"cyan":"white",children:[t===p?"\u25B6 ":" ",y.name]}),T(C,{color:"grey",children:[" \u2014 ",y.description]})]},y.id))})]}),m(S,{marginTop:1,children:m(C,{color:"grey",children:"[\u2191\u2193: select] [enter: choose] [esc: exit]"})})]})}c(gu,"AddMcpServerScreen");function yu(){const[s,e]=q(null),[t,n]=q([]),[r,i]=q(null);return ze(()=>{const o=c(({status:l})=>{e(l),i(null)},"handleMcpStatusChanged"),a=c(({servers:l})=>{n(l),i(null)},"handleMcpServersChanged");return Ne.on(H.McpStatusChanged,o),Ne.on(H.McpServersChanged,a),()=>{Ne.off(H.McpStatusChanged,o),Ne.off(H.McpServersChanged,a)}},[]),{mcpStatus:s,allMcpServers:t,error:r,isRunning:s?.isRunning||!1,toolsCount:s?.toolsCount||0,totalRequests:s?.totalRequests||0,lastActivity:s?.lastActivity,processId:s?.processId,serverCount:t.length}}c(yu,"useMcpStatus");function wu(){const{error:s,serverCount:e,allMcpServers:t}=yu(),n=Math.min(100,process.stdout.columns||100);return T(S,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:n,children:[m(S,{marginTop:-1,marginBottom:0,flexDirection:"column",children:T(C,{bold:!0,children:["\u{1F916} Connected AI Agents:"," ",s?m(C,{color:"red",children:"error reading status"}):e===0?m(C,{color:"yellow",children:"none"}):m(C,{color:"green",children:e})]})}),!s&&e===0&&m(S,{marginTop:1,children:T(C,{color:"grey",children:["Connect your AI agents to Membrane.",m(Ko,{}),"It will give them tools and context to build integrations."]})}),t.length>0&&m(S,{flexDirection:"column",paddingLeft:2,marginTop:1,children:t.map((r,i)=>m(S,{children:T(C,{color:"grey",children:["#",i+1," ",r.agentName,": ",r.totalRequests," calls"]})},r.processId))}),m(S,{marginTop:1,children:m(C,{color:"grey",children:"[a: connect an agent]"})})]})}c(wu,"Agent");const wo=c(s=>{switch(s){case"error":return"red";case"success":return"green";case"warning":return"yellow";default:return}},"getLogColor");function bo(s,e){return e<3?s.slice(0,Math.max(0,e)):s.length<=e?s:`${s.slice(0,e-3)}...`}c(bo,"truncateText");function bu({children:s}){const{state:e,logs:t}=he();return!e||e===M.NOT_INITIALIZED?T(S,{gap:1,flexDirection:"row",children:[m(ea,{type:"dots"}),m(C,{children:"Initializing..."})]}):e===M.SETTING_UP?m(S,{gap:1,flexDirection:"row",children:m(C,{children:"No workspace selected. Please run `membrane init` to select a workspace."})}):e===M.ERROR?m(S,{flexDirection:"column",children:t.slice().map((n,r)=>m(C,{color:wo(n.type),children:n.message},n.timestamp+r))}):s}c(bu,"EnsureInitialized");function Su(){const{stats:s}=he(),e=Object.entries(s).filter(([t,n])=>n>0);return e.length===0?null:T(S,{flexDirection:"column",children:[m(S,{children:m(S,{width:12,children:m(C,{color:"grey",children:"Elements:"})})}),m(S,{flexDirection:"column",marginLeft:1,children:e.map(([t,n])=>T(S,{children:[m(S,{width:20,children:T(C,{children:[t,":"]})}),m(C,{color:"green",children:n})]},t))})]})}c(Su,"ElementStats");const qs=5,Cu=6;function vu(){const{logs:s}=he(),[e,t]=q(0),n=Math.min(100,process.stdout.columns||100),r=qs,i=Math.max(0,s.length-r-e),o=s.length-e,a=s.slice(i,o),l=n-Cu,u=e<s.length-r,f=e>0;return Me((d,h)=>{if(s.length!==0)if(h.upArrow){const g=Math.max(0,s.length-r);t(y=>Math.min(g,y+1))}else h.downArrow?t(g=>Math.max(0,g-1)):(d==="G"||d==="g")&&t(0)}),T(S,{flexDirection:"column",paddingTop:1,children:[T(C,{color:"grey",children:["Recent Activity (",i+1,"-",o," of ",s.length,"):",s.length>qs&&m(C,{color:"grey",children:" [arrows: scroll] [g: end]"})]}),a.map((d,h)=>m(S,{marginLeft:1,children:m(C,{color:wo(d.type),children:bo(d.message,l)})},d.timestamp+h)),s.length>qs&&T(S,{marginLeft:1,flexDirection:"row",children:[u&&m(C,{color:"grey",children:"\u2191 "}),f&&m(C,{color:"grey",children:"\u2193 "})]})]})}c(vu,"Logs");const In=[{value:"sync",label:"Continue (overwrite/delete)",key:""},{value:"exit",label:"Cancel",key:""}];function ku(){const{state:s,resolveConflicts:e,exit:t}=he(),[n,r]=q(0),[i,o]=q(!1),[a,l]=q(!1);return Me((u,f)=>{if(!i){if(f.ctrl&&u.toLowerCase()==="r"){l(!a);return}f.upArrow?r(d=>d>0?d-1:In.length-1):f.downArrow?r(d=>d<In.length-1?d+1:0):u.toLowerCase()==="y"?r(0):u.toLowerCase()==="n"?r(1):(f.return||u===" ")&&(o(!0),In[n].value==="sync"?e({watch:!0}):t())}}),ze(()=>{s!==M.CONFLICTS&&i&&o(!1)},[s,i]),T(S,{flexDirection:"column",paddingTop:1,children:[m(S,{children:m(S,{flexDirection:"row",gap:2,children:m(C,{bold:!0,color:"white",children:"Conflicts with remote"})})}),m(S,{children:m(C,{color:"grey",children:"The remote workspace has changes that aren't in your local workspace:"})}),m(S,{marginTop:1,marginLeft:2,children:m(Tu,{isExpanded:a})}),T(S,{marginTop:2,flexDirection:"row",gap:1,children:[m(C,{color:"white",bold:!0,children:"What would you like to do?"}),m(C,{color:"grey",children:"[up/down, enter]"})]}),m(S,{children:i?T(S,{flexDirection:"row",gap:1,children:[m(_t,{type:"dots"}),m(C,{color:"blue",bold:!0,children:"Syncing with remote..."})]}):m(S,{flexDirection:"column",children:In.map((u,f)=>m(S,{flexDirection:"column",children:T(S,{flexDirection:"row",gap:1,children:[m(C,{color:n===f?"cyan":"grey",children:n===f?"\u25B6":" "}),m(C,{color:n===f?"cyan":"grey",bold:n===f,children:u.label})]})},u.value))})})]})}c(ku,"ResolveChangesUI");const Eu={[be.UPDATE]:{incoming:{label:"Elements updated in remote",description:"(to be overwritten from remote)"},outgoing:{label:"Elements updated locally",description:"(to be pushed to remote)"}},[be.DELETE]:{incoming:{label:"Elements not existing in remote",description:"(to be deleted locally)"},outgoing:{label:"Elements deleted locally",description:"(to be deleted from remote)"}},[be.CREATE]:{incoming:{label:"Elements created in remote",description:"(to be created locally)"},outgoing:{label:"Elements created locally",description:"(to be created in remote)"}}};function Tu({isExpanded:s,showControls:e=!0}){const{conflicts:t}=he(),n=5,r=Fo(()=>{const i={};return t.forEach(o=>{const a=`${o.type}-${o.direction}`;i[a]||(i[a]=[]),i[a].push(o)}),i},[t]);return m(S,{flexDirection:"column",children:Object.entries(r).map(([i,o])=>{if(o.length===0)return null;const[a,l]=i.split("-"),u=Eu[a][l];return T(S,{flexDirection:"column",children:[T(S,{flexDirection:"row",gap:1,children:[T(C,{color:"yellow",children:[u.label," (",o.length,")"]}),m(C,{color:"white",children:u.description})]}),(s?o:o.slice(0,n)).map(f=>m(S,{marginLeft:2,children:T(C,{color:"grey",children:["\u2022 ",f.element.id," (",f.element.relativePath,")"]})},f.element.id)),!s&&o.length>n&&m(S,{marginLeft:2,children:T(C,{color:"cyan",children:["... and ",o.length-n," more",e?" (press Ctrl+R to show all)":""]})}),s&&o.length>n&&e&&m(S,{marginLeft:2,children:m(C,{color:"cyan",children:"(press Ctrl+R to collapse)"})})]},i)})})}c(Tu,"Conflicts");function Iu(){const{config:s,state:e,logs:t,currentWorkspace:n,pull:r}=he(),i=n?.name,o=i?bo(i,30):s?.workspaceKey,a=Math.min(100,process.stdout.columns||100);return ze(()=>{r({watch:!0})},[]),T(S,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:a,children:[m(S,{marginTop:-1,marginBottom:1,children:T(S,{flexDirection:"row",gap:1,children:[m(C,{bold:!0,children:"\u{1F504} Workspace"}),T(C,{color:Au(e),children:[" [",Ou(e),"] "]})]})}),T(S,{children:[m(S,{width:12,children:m(C,{color:"grey",children:"Local:"})}),m(C,{color:"grey",children:process.cwd()})]}),T(S,{children:[m(S,{width:12,children:m(C,{color:"grey",children:"Remote:"})}),s?.workspaceKey?T(C,{color:"grey",children:[o," [o: open in console] [w: change]"]}):T(C,{children:[m(C,{color:"yellow",children:"not selected"})," [w: select]"]})]}),e===M.CONFLICTS?m(ku,{}):T(jt,{children:[m(S,{paddingTop:1,children:m(Su,{})}),t.length>0&&m(vu,{})]})]})}c(Iu,"Workspace");function Ou(s){switch(s){case M.PULLING:return"pulling";case M.PUSHING:return"pushing";case M.CONFLICTS:return"conflicts";case M.SYNCED:return"synced";case M.ERROR:return"error";case M.WATCHING:return"tracking changes";case M.RESOLVING:return"resolving";case M.NOT_SYNCED:return"not synced";case M.INITIALIZED:return"initialized";case M.SETTING_UP:return"setup required";default:return"unknown"}}c(Ou,"getStatusDisplay");function Au(s){switch(s){case M.PULLING:return"yellow";case M.PUSHING:return"yellow";case M.CONFLICTS:return"red";case M.SYNCED:return"green";case M.ERROR:return"red";case M.WATCHING:return"green";case M.RESOLVING:return"yellow";case M.NOT_SYNCED:return"grey";case M.SETTING_UP:return"yellow";default:return"grey"}}c(Au,"getStatusColor");const $u="https://console.integration.app/w";function Nu(){const s=Al(),e=_n(!0),{exit:t,state:n}=he(),[r,i]=q(null),o=r??(n===M.SETTING_UP?"setup":"main");Me(l=>{o==="main"&&(l==="w"&&i("workspace-selection"),l==="a"&&i("add-mcp-server"),l==="o"&&n===M.INITIALIZED&&a(),l==="s"&&i("setup"))});async function a(){try{const l=await mr(s),u=`${$u}/${l}`,f=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";sa(`${f} "${u}"`)}catch(l){console.error("Failed to open workspace:",l),t()}}return c(a,"handleOpenWorkspace"),ze(()=>(e.current=!0,()=>{e.current=!1}),[]),o==="workspace-selection"?m(to,{onExit:c(()=>i(null),"onExit")}):o==="add-mcp-server"?m(gu,{onExit:c(()=>i(null),"onExit"),onComplete:c(()=>i(null),"onComplete")}):o==="setup"?m(no,{onComplete:c(()=>i(null),"onComplete")},Date.now()):m(bu,{children:T(S,{flexDirection:"column",children:[m(S,{flexGrow:1,children:m(wu,{})}),m(Iu,{}),m(S,{paddingLeft:2,children:m(C,{color:"grey",children:"[s: (re-)setup]"})})]})})}c(Nu,"Main");const xu=c(()=>[v.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"),v.yellow("\u2502 \u26A0\uFE0F EXPERIMENTAL FEATURE WARNING \u2502"),v.yellow("\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524"),v.yellow("\u2502 Real-time agent mode is experimental and subject to changes. \u2502"),v.yellow("\u2502 Use in production environments is not recommended. \u2502"),v.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"),""].join(`
|
|
158
|
-
`),"createExperimentalWarning$1");function
|
|
159
|
-
`)).action(async t=>{if(t.watch||(console.error("Error: The sync command requires the --watch flag"),console.error("Usage: membrane sync --watch"),process.exit(1)),t.rps!==void 0){const n=t.rps;!isNaN(n)&&n>0&&n<=1e3?
|
|
14
|
+
`,version:"1.0.0"});for(const C of d){const E=C.execute;C.execute=async S=>(Xr(process.pid,process.cwd()),E(S)),h.addTool(C)}it({isRunning:!0,startTime:new Date().toISOString(),toolsCount:d.length,lastActivity:new Date().toISOString(),processId:process.pid,cwd:process.cwd(),agentName:process.env.AGENT_NAME||"Unnamed Agent"});const p=setInterval(()=>{it({processId:process.pid,cwd:process.cwd(),lastActivity:new Date().toISOString()})},5e3),f=c(async()=>{clearInterval(p),we(process.pid,process.cwd());try{await h.stop()}catch{}},"cleanup");await h.start({transportType:"stdio"}),process.on("SIGINT",async()=>{await f(),process.exit(0)}),process.on("SIGTERM",async()=>{await f(),process.exit(0)}),process.on("exit",()=>{we(process.pid,process.cwd())}),process.on("uncaughtException",async C=>{console.error("Uncaught exception:",C.message),await f(),process.exit(1)}),process.on("unhandledRejection",async C=>{console.error("Unhandled rejection:",C),await f(),process.exit(1)})}catch(e){e instanceof Error&&(console.error(e.message),process.exit(1)),console.error("An unknown error occurred"),process.exit(1)}})}c(So,"setupMcpCommand");const bo={info:"\u{1F4DD}",success:"\u2728",warning:"\u26A0\uFE0F",error:"\u274C",debug:"\u{1F50D}"},vo={info:w.white,success:w.green,warning:w.yellow,error:w.red,debug:w.gray};class k{static{c(this,"Logger")}static formatMessage(e,t,n={icon:!1}){const o=n.timestamp?`${w.gray(new Date().toISOString())} `:"",i=n.prefix?`${w.gray(n.prefix)} `:"",s=n.suffix?` ${w.gray(n.suffix)}`:"",a=bo[t],l=vo[t];return`${o}${n.icon?a:""} ${i}${l(e)}${s}`}static info(e,t){let n=w.white;if(t?.color&&(n=w[t.color.toLowerCase()]||w.white),t?.timestamp){const o=new Date().toLocaleTimeString();console.debug(`${w.gray(`[${o}]`)} ${n(e)}`)}else console.debug(n(e))}static group(e,t){}static groupEnd(){}static newLine(){}static success(e,t){console.debug(this.formatMessage(e,"success",t))}static warning(e,t){console.debug(this.formatMessage(e,"warning",t))}static error(e,t){console.error(this.formatMessage(e,"error",t))}static debug(e,t){t?.prefix?console.debug(w.gray(`[${t.prefix}] ${e}`),t.error?`
|
|
15
|
+
${w.red(t.error)}`:""):console.debug(w.gray(e),t?.error?`
|
|
16
|
+
${w.red(t.error)}`:"")}static step(e,t){}static header(e){console.debug(),console.debug(w.bold.cyan(`\u25B6 ${e}`)),console.debug()}static table(e,t){if(e.length===0)return;const n=t||Object.keys(e[0]),o=e.map(i=>{const s={};return n.forEach(a=>{s[a]=i[a]}),s});console.table(o,n)}static divider(){}}function Eo(r){r.command("open").description("Open the workspace in the browser").addHelpText("after",["","Examples:"," membrane open # Open workspace in browser",""].join(`
|
|
17
|
+
`)).action(async()=>{try{k.header("Opening Workspace in Browser"),k.info("Loading configuration...");const e=$e();if(!e)throw new Error("No configuration found. Please set MEMBRANE_WORKSPACE_KEY and MEMBRANE_WORKSPACE_SECRET environment variables, or run `membrane init` first.");if(!e.workspaceKey||!e.workspaceSecret)throw new Error("Missing workspace credentials");k.info("Retrieving workspace ID...");const t=await Bt(process.cwd()),n=`${e.consoleUri||Sr}/w/${t}`;k.info(`Opening ${n}...`);const{default:o}=await import("open");await o(n),k.success("Browser opened successfully")}catch(e){e instanceof Error&&(k.error(e.message),process.exit(1)),k.error("An unknown error occurred"),process.exit(1)}})}c(Eo,"setupOpenCommand");async function dt(r,e,t={}){const{jobId:n,accessKey:o}=await e(),i=`${n}:${o}`;m.debug(`[background-job] Started job ${n}`);const s=Date.now(),{pollIntervalMs:a=1e3,timeoutMs:l=3e5,maxRetries:d=3}=t;let h=0;for(;;){if(Date.now()-s>l)throw new Error(`Background job ${n} timed out after ${l}ms`);await new Promise(C=>setTimeout(C,a));let f;try{f=await r.get(`background-jobs/${i}`),h=0}catch(C){if(C instanceof Dn&&h<d){h++,m.debug(`[background-job] Job ${n} not found, retrying (${h}/${d})`);continue}throw C}if(f.status==="completed"){if(m.debug(`[background-job] Completed job ${n}`),!f.result)throw new Error(`Background job ${n} completed but returned no result`);return f.result}if(f.status==="failed"){const C=f.error?.message||"Unknown error";throw m.error(`[background-job] Failed job ${n}: ${C}`),f.error?.stack&&m.error(`Stacktrace: ${f.error.stack}`),new Error(`Background job ${n} failed: ${C}`)}m.debug(`[background-job] Polling job ${n} (status: ${f.status})`)}}c(dt,"pollBackgroundJob");function To(r,e){ht(x.dirname(r)),v.writeFileSync(r,e)}c(To,"writeFile");function xo(r){v.existsSync(r)&&v.rmSync(r)}c(xo,"deleteFile");function sn(r){v.existsSync(r)&&v.rmSync(r,{recursive:!0,force:!0})}c(sn,"deleteDir");function Io(r,e=!0){if(v.existsSync(r))try{const t=v.readFileSync(r,"utf8");return G.load(t)||void 0}catch(t){if(!e)return;if(t instanceof Error){const n=x.relative(process.cwd(),r);throw new Error(`Failed to parse YAML file "${n}": ${t.message}`)}throw t}}c(Io,"readYaml");function an(r,e,t){try{ht(x.dirname(r));const n=G.dump(e,t);v.writeFileSync(r,n,"utf8")}catch(n){if(n instanceof Error){const o=x.relative(process.cwd(),r);throw new Error(`Failed to write YAML file "${o}": ${n.message}`)}throw n}return e}c(an,"writeYaml");function ht(r){v.existsSync(r)||v.mkdirSync(r,{recursive:!0})}c(ht,"ensureDirExists");function cn(r,e=!0){if(!v.existsSync(r)||!v.statSync(r).isDirectory())return;let t=v.readdirSync(r);t.length>0&&(t.forEach(n=>cn(x.join(r,n),!1)),t=v.readdirSync(r)),t.length===0&&!e&&v.rmdirSync(r)}c(cn,"cleanupEmptyFolders");function $o(r){const e=r.split(/[\\/]/).join("/");return e.endsWith("/")?e+"**":e}c($o,"normalizePattern");async function ln(r,e=[]){return new Promise(async(t,n)=>{const o=e.map($o),i=Rt("zip",{zlib:{level:9}}),s=[];i.on("data",l=>s.push(l)),i.on("end",()=>t(Buffer.concat(s))),i.on("error",l=>n(l));const a=new Map;for(const l of r[T.Integration]||[])a.set(l.uuid,l.key);for(const[l,d]of Object.entries(r))for(const h of d){const p=h.key,f=a.get(h.integrationUuid),C=On(l,p,f);if(o.length>0&&!o.some(S=>ir(C,S)))continue;const E=G.dump(h);i.append(E,{name:C})}i.finalize()})}c(ln,"createMembraneZip");async function pt(r,e){const t=await Nt.loadAsync(r),n=[];for(const[o,i]of Object.entries(t.files)){if(i.dir)continue;const s=ie(o);if(!s)continue;const a=await i.async("string"),l=G.load(a);if(!l)continue;const d=await e(o,l,s);d!==void 0&&n.push(d)}return n}c(pt,"iterateZipItems");async function ko(r){const e=await Nt.loadAsync(r),t={};for(const[n,o]of Object.entries(e.files)){if(o.dir)continue;const i=ie(n);if(!i)continue;const s=await o.async("string"),a=G.load(s);t[i.type]||(t[i.type]=[]),t[i.type].push(a)}return t}c(ko,"readMembraneZip");async function un(r=process.cwd()){const e=await dn(_(r)),t={};for(const{data:n,type:o}of e)t[o]||(t[o]=[]),t[o].push(n);return t}c(un,"readMembraneDir");async function dn(r){const e=hn(r),t=[];for(const n of e){if(n.isDirectory())continue;const o=ie(n.path);if(!o)continue;const i=await n.readContent(),s=G.load(i),a=x.join(r,n.path);t.push({filePath:a,data:s,type:o.type})}return t}c(dn,"iterateMembraneFiles");function hn(r,e){const t=[];if(e||(e=r),!v.existsSync(e)||e.startsWith(x.join(r,"connectors")))return t;const n=v.readdirSync(e,{withFileTypes:!0});for(const o of n){const i=x.join(e,o.name),s=x.relative(r,i);o.isDirectory()?t.push(...hn(r,i)):o.isFile()&&ie(s)&&t.push({path:s,isDirectory:c(()=>!1,"isDirectory"),readContent:c(async()=>v.readFileSync(i,"utf8"),"readContent")})}return t}c(hn,"getMembraneFiles");function pn(){const r={},e=x.join(_(process.cwd()),"connectors");if(!v.existsSync(e))return r;const t=v.readdirSync(e);for(const n of t){const o=x.join(e,n);if(!v.statSync(o).isDirectory())continue;const i=x.join(o,`${n}.yml`),s=Io(i,!1);if(!s?.uuid)continue;const a=new Set,l=v.readdirSync(o);for(const d of l){if(d.endsWith(".yml"))continue;const h=x.join(o,d);v.statSync(h).isDirectory()&&a.add(d=="development"?"":d)}r[s.uuid]={key:n,id:s.id,versions:Array.from(a)}}return r}c(pn,"readConnectorsDir");function Pe(r,e){const t=x.join(_(process.cwd()),"connectors",r);return e==""||e===Et?x.join(t,"development"):e?x.join(t,e):t}c(Pe,"getConnectorPath");const fn=300,mn=6e4;async function Ro(){const r=await I.withClient(async t=>dt(t,()=>t.get("export"),{pollIntervalMs:fn,timeoutMs:mn}));if(!r)throw new Error("Failed to export workspace");const e=await ge.get(r.downloadUrl,{responseType:"arraybuffer"});return Buffer.from(e.data)}c(Ro,"downloadWorkspaceExport");async function gn(r,e={}){const t=new Pt;t.append("file",r,{filename:"membrane.zip",contentType:"application/zip"});const n=await I.withClient(async i=>{const s=`import?dryRun=${e.dryRun??!1}&partial=${e.partial??!1}`,{jobId:a,accessKey:l}=await i.post(s,t,{headers:t.getHeaders()});return dt(i,()=>Promise.resolve({jobId:a,accessKey:l}),{pollIntervalMs:1e3,timeoutMs:3e5})});if(!n)throw new Error("Failed to import workspace");const o={};for(const[i,s]of Object.entries(n))o[i]=new Set(s||[]);return o}c(gn,"importWorkspace");async function Po(r,e){const t=await I.withClient(async o=>dt(o,()=>o.get(`connectors/${r}/export-files`,{version:e}),{pollIntervalMs:fn,timeoutMs:mn}));if(!t)throw new Error("Failed to export connector version");const n=await ge.get(t.downloadUrl,{responseType:"arraybuffer"});return Buffer.from(n.data)}c(Po,"exportConnector");const yn=5;function Ao(r){r.command("pull").description("Pull workspace data from specified workspace").option("--force","Overwrite conflicts with remote data",!1).addHelpText("after",["","Examples:"," membrane pull # Pull from default workspace"," membrane pull --force # Overwrite conflicts with remote data",""].join(`
|
|
18
|
+
`)).action(async e=>{const t=Ot({text:"Pulling workspace",color:"white"}).start();try{const n=await Do(e,t);t.stop(),Mo(n.workspaceExport,n.connectors)}catch(n){t.stop(),Lo(n),process.exit(1)}})}c(Ao,"setupPullCommand");async function Do(r,e){const t=await un(),n=await ln(t),o=await Ro(),i=await ko(o),{comparison:s}=Nn(t,i);s[Y.DELETE].size>0&&!r.force&&(await Fo(s,n),k.error("Use --force to delete local elements"),process.exit(1));const l=await dn(_(process.cwd()));for(const{filePath:h,data:p}of l)s[Y.DELETE].has(p.uuid)&&xo(h);return cn(_(process.cwd())),await pt(o,(h,p)=>{if(ie(h)&&(s[Y.CREATE].has(p.uuid)||s[Y.UPDATE].has(p.uuid))){const C=R.join(_(process.cwd()),h);an(C,p)}}),{connectors:await Oo(i[T.Integration],e),workspaceExport:i}}c(Do,"pullWorkspace");async function Oo(r,e){e.text="Pulling connectors";const t=new Map,{id:n}=await I.withClient(d=>d.get("org-workspace-id")),{items:o=[]}=await I.withClient(d=>d.get(`/connectors?workspaceId=${n}`));for(const d of o){const h=d.uuid??d.id;!d.isPublic&&h&&t.set(h,new Set([""]))}for(const d of r??[]){const{connectorUuid:h,connectorVersion:p}=d;h&&(t.has(h)||t.set(h,new Set),t.get(h).add(p??""))}const i=pn();for(const[d,{key:h,versions:p}]of Object.entries(i)){if(!t.has(d)){const C=Pe(h);sn(C);continue}const f=t.get(d);for(const C of p)if(!f.has(C)){const E=Pe(h,C);sn(E)}}const s=Array.from(t.entries()),a=s.length,l=c((d,h)=>{d==="pulling"?e.start(`Pulling connector ${h}...`):e.succeed(`Pulled connector ${h}`)},"onProgress");for(let d=0;d<a;d+=yn){const h=s.slice(d,d+yn);await Promise.all(h.map(([p,f])=>No(p,Array.from(f),l)))}return Array.from(t.keys())}c(Oo,"pullConnectors");async function No(r,e,t){const n=await I.withClient(d=>d.get(`connectors/${r}/export-json`),!1),o=await I.withClient(d=>d.get(`connectors/${r}`),!1);if(!n||!o||!n.key||!o.key)return;const i=o.name||n.key;t?.("pulling",i);const s={...n,id:o.id,uuid:o.uuid},a=Pe(n.key),l=R.join(a,`${n.key}.yml`);an(l,s);for(const d of e){const h=await Po(r,d),p=Pe(n.key,d);if(To(R.join(p,"src.zip"),h),!d||d===Et){const f=R.join(p,"src");ht(f),await(await At.Open.buffer(h)).extract({path:f})}}t?.("pulled",i)}c(No,"pullConnector");function Mo(r,e=[]){const t=Object.values(r).reduce((n,o)=>n+(o?.length??0),0)+e.length;k.info(`\u25CF Pulled workspace elements \xB7 ${t}`);for(const n of Object.keys(r).sort()){const o=r[n];k.info(`\u2514\u2500\u2500 ${n}s \xB7 ${o?.length??0}`)}e.length>0&&k.info(`\u2514\u2500\u2500 connectors \xB7 ${e.length}`)}c(Mo,"showStats$1");async function Fo(r,e){const t=r[Y.DELETE].size;k.info(`\u2299 Pull: conflicts detected \xB7 ${t}`),await pt(e,(n,o)=>{ie(n)&&r[Y.DELETE].has(o.uuid)&&k.info(`\u2514\u2500\u2500 ./membrane/${n} (deleted in remote)`)})}c(Fo,"showConflicts$1");async function Lo(r){k.error("\u25A0 Error"),k.error(`\u2514\u2500\u2500 ${r.message}`),k.error(` ${r.stack}`)}c(Lo,"showError$1");const j=[];for(let r=0;r<256;++r)j.push((r+256).toString(16).slice(1));function jo(r,e=0){return(j[r[e+0]]+j[r[e+1]]+j[r[e+2]]+j[r[e+3]]+"-"+j[r[e+4]]+j[r[e+5]]+"-"+j[r[e+6]]+j[r[e+7]]+"-"+j[r[e+8]]+j[r[e+9]]+"-"+j[r[e+10]]+j[r[e+11]]+j[r[e+12]]+j[r[e+13]]+j[r[e+14]]+j[r[e+15]]).toLowerCase()}c(jo,"unsafeStringify");let ft;const Uo=new Uint8Array(16);function Ko(){if(!ft){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");ft=crypto.getRandomValues.bind(crypto)}return ft(Uo)}c(Ko,"rng");const qo=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);var wn={randomUUID:qo};function Bo(r,e,t){if(wn.randomUUID&&!r)return wn.randomUUID();r=r||{};const n=r.random??r.rng?.()??Ko();if(n.length<16)throw new Error("Random bytes length must be >= 16");return n[6]=n[6]&15|64,n[8]=n[8]&63|128,jo(n)}c(Bo,"v4");function _o(r){r.command("push").description("Push workspace data to specified workspace").argument("[files...]","Files, directories, or glob patterns to push").option("--force","Overwrite conflicts with local data",!1).addHelpText("after",["","Examples:"," membrane push # Push all workspace elements"," membrane push data-sources/ # Push all data-sources"," membrane push actions/my-action/spec.yaml # Push specific action"," membrane push flows/*-test/spec.yaml # Push flows matching pattern"," membrane push --force # Overwrite conflicts with local data",""].join(`
|
|
19
|
+
`)).action(async(e,t)=>{const n=Ot({text:"Pushing workspace",color:"white"}).start();try{await Wo(e,t,n)}catch(o){n.stop(),Yo(o),process.exit(1)}})}c(_o,"setupPushCommand");async function Wo(r,e,t){const n=r.length>0,o=await un(),i=pn(),s=Jo(o,i),a=await ln(s,n?r:void 0);t.text="Comparing workspace";const l=await gn(a,{dryRun:!0,partial:n});l[Y.DELETE].size>0&&!e.force&&(t.stop(),await Vo(l,a),k.error("Use --force to delete remote elements"),process.exit(1));const{pushedConnectors:h=[]}=await Gt({onProgress:c((p,f)=>{p==="pushing"?t.start(`Pushing connector ${f}...`):t.succeed(`Pushed connector ${f}`)},"onProgress")});t.start("Pushing workspace..."),await gn(a,{partial:n}),t.stop(),zo(s,h),process.exit(0)}c(Wo,"pushWorkspace");function Jo(r,e){const t=Go(r),n=Ho(t,e),o={};for(const[i,s]of Object.entries(t)){const a=i,l=V[a]?.parentFieldKey||"parentId";o[a]=(s||[]).map(d=>{const h={...d};if(h.integrationId&&!h.integrationUuid&&(h.integrationUuid=n.get(h.integrationId.toString())||h.integrationId,delete h.integrationId),h.connectorId){if(!h.connectorUuid){const p=n.get(h.connectorId.toString());p&&(h.connectorUuid=p)}delete h.connectorId}if(h[l]){const p=h[l].toString();h.parentUuid=n.get(p)||p}return a===T.Package&&h.elements&&(h.elements=h.elements.map(p=>{if(p.id&&!p.uuid){const f=n.get(p.id.toString());if(f)return{uuid:f,type:p.type}}return p})),delete h.id,h})}return o}c(Jo,"resolveLegacyIdReferences");function Go(r){const e={};for(const[t,n]of Object.entries(r))e[t]=(n||[]).map(o=>o.uuid?o:{...o,uuid:Bo()});return e}c(Go,"generateMissingUuids");function Ho(r,e){const t=new Map;for(const n of Object.values(r))for(const o of n||[])o.id&&o.uuid&&t.set(o.id.toString(),o.uuid);for(const[n,o]of Object.entries(e))o.id&&t.set(o.id.toString(),n);return t}c(Ho,"buildIdToUuidLookup");function zo(r,e=[]){const t=Object.values(r).reduce((n,o)=>n+(o?.length??0),0)+e.length;k.info(`\u25CF Pushed workspace elements \xB7 ${t}`);for(const n of Object.keys(r).sort()){const o=r[n];k.info(`\u2514\u2500\u2500 ${n}s \xB7 ${o?.length??0}`)}e.length>0&&k.info(`\u2514\u2500\u2500 connectors \xB7 ${e.length}`)}c(zo,"showStats");async function Vo(r,e){const t=r[Y.DELETE].size;k.info(`\u2299 Push: conflicts detected \xB7 ${t}`),await pt(e,(n,o)=>{ie(n)&&r[Y.DELETE].has(o.uuid)&&k.info(`\u2514\u2500\u2500 ./membrane/${n} (deleted locally)`)})}c(Vo,"showConflicts");async function Yo(r){k.error("\u25A0 Error"),k.error(`\u2514\u2500\u2500 ${r.message}`),k.error(` ${r.stack}`)}c(Yo,"showError");const mt=[{id:"claude-code",name:"Claude Code",description:"Anthropic Claude Code agent",actionDescription:"Adding membrane MCP to .mcp.json in the current directory",addConfig:c(()=>{const r=x.join(process.cwd(),".mcp.json"),e={mcpServers:{membrane:{command:"membrane",args:["mcp"],env:{AGENT_NAME:"Claude Code"}}}};let t={};if(v.existsSync(r))try{t=JSON.parse(v.readFileSync(r,"utf8"))}catch{t={}}const n={...t,mcpServers:{...t.mcpServers,...e.mcpServers}};return v.writeFileSync(r,JSON.stringify(n,null,2)),`MCP server configuration added to ${r}`},"addConfig")},{id:"cursor",name:"Cursor",description:"Cursor AI editor",actionDescription:"Adding membrane MCP to .cursor/mcp.json in the current directory",addConfig:c(()=>{const r=x.join(process.cwd(),".cursor"),e=x.join(r,"mcp.json");v.existsSync(r)||v.mkdirSync(r);const t={mcpServers:{membrane:{command:"membrane",args:["mcp"],env:{AGENT_NAME:"Cursor"}}}};let n={};if(v.existsSync(e))try{n=JSON.parse(v.readFileSync(e,"utf8"))}catch{n={}}const o={...n,mcpServers:{...n.mcpServers,...t.mcpServers}};return v.writeFileSync(e,JSON.stringify(o,null,2)),`MCP server configuration added to ${e}`},"addConfig")}];function Zo({onExit:r,onComplete:e}){const[t,n]=D(0),[o,i]=D(!1),[s,a]=D(null),[l,d]=D(""),[h,p]=D("");ae((E,S)=>{if(l||h){(S.escape||E==="q"||S.return)&&e();return}if(o)S.return||E===" "?f(s):S.escape&&(i(!1),a(null));else if(S.escape)r();else if(S.upArrow||E==="k")n(Math.max(0,t-1));else if(S.downArrow||E==="j")n(Math.min(mt.length-1,t+1));else if(S.return||E===" "){const N=mt[t];a(N),i(!0)}});const f=c(E=>{try{const S=E.addConfig();d(S)}catch(S){p(`Failed to write configuration: ${S.message||S}`)}},"addMcpConfiguration"),C=Math.min(80,process.stdout.columns||80);return l?b(g,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:C,children:[u(g,{marginTop:-1,marginBottom:1,children:b(y,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",u(y,{color:"green",children:"Success"})]})}),b(g,{flexDirection:"column",paddingLeft:2,children:[u(y,{color:"green",children:l}),u(g,{marginTop:1,children:u(y,{color:"grey",children:"The agent will now be able to use Membrane's integration capabilities."})})]}),u(g,{marginTop:1,paddingLeft:2,children:u(y,{color:"white",children:"[esc/q/enter: exit]"})})]}):h?b(g,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:C,children:[u(g,{marginTop:-1,marginBottom:1,children:b(y,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",u(y,{color:"red",children:"Error"})]})}),u(g,{flexDirection:"column",paddingLeft:2,children:u(y,{color:"red",children:h})}),u(g,{marginTop:1,children:u(y,{color:"grey",children:"[esc/q/enter: exit]"})})]}):o&&s?b(g,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:C,children:[u(g,{marginTop:-1,marginBottom:1,children:b(y,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",u(y,{color:"cyan",children:"Confirmation"})]})}),b(g,{flexDirection:"column",paddingLeft:2,children:[b(y,{children:["Connect ",u(y,{bold:!0,children:s.name})," to Membrane via MCP?"]}),u(g,{marginTop:1,children:u(y,{color:"grey",children:"This will add an MCP server configuration that allows the agent to use Membrane's integration capabilities."})}),u(g,{marginTop:1,children:u(y,{color:"yellow",bold:!0,children:s.actionDescription})}),u(g,{marginTop:2,marginBottom:1,children:b(y,{children:[u(y,{color:"white",bold:!0,children:"[Enter] Confirm"})," ",u(y,{color:"gray",children:"[Esc] Cancel"})]})})]})]}):b(g,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:C,children:[u(g,{marginTop:-1,marginBottom:1,children:b(y,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",u(y,{color:"cyan",children:"Select Agent"})]})}),b(g,{flexDirection:"column",paddingLeft:2,children:[u(y,{color:"grey",children:"Choose an agent to connect to Membrane via MCP:"}),u(g,{marginTop:1,children:u(y,{color:"grey",children:"This will add an MCP server configuration that allows the agent to use Membrane's integration capabilities."})}),u(g,{marginTop:1,flexDirection:"column",children:mt.map((E,S)=>b(g,{children:[b(y,{color:t===S?"cyan":"white",children:[t===S?"\u25B6 ":" ",E.name]}),b(y,{color:"grey",children:[" \u2014 ",E.description]})]},E.id))})]}),u(g,{marginTop:1,children:u(y,{color:"grey",children:"[\u2191\u2193: select] [enter: choose] [esc: exit]"})})]})}c(Zo,"AddMcpServerScreen");function Xo(){const[r,e]=D(null),[t,n]=D([]),[o,i]=D(null);return he(()=>{const s=c(({status:l})=>{e(l),i(null)},"handleMcpStatusChanged"),a=c(({servers:l})=>{n(l),i(null)},"handleMcpServersChanged");return te.on(F.McpStatusChanged,s),te.on(F.McpServersChanged,a),()=>{te.off(F.McpStatusChanged,s),te.off(F.McpServersChanged,a)}},[]),{mcpStatus:r,allMcpServers:t,error:o,isRunning:r?.isRunning||!1,toolsCount:r?.toolsCount||0,totalRequests:r?.totalRequests||0,lastActivity:r?.lastActivity,processId:r?.processId,serverCount:t.length}}c(Xo,"useMcpStatus");function Qo(){const{error:r,serverCount:e,allMcpServers:t}=Xo(),n=Math.min(100,process.stdout.columns||100);return b(g,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:n,children:[u(g,{marginTop:-1,marginBottom:0,flexDirection:"column",children:b(y,{bold:!0,children:["\u{1F916} Connected AI Agents:"," ",r?u(y,{color:"red",children:"error reading status"}):e===0?u(y,{color:"yellow",children:"none"}):u(y,{color:"green",children:e})]})}),!r&&e===0&&u(g,{marginTop:1,children:b(y,{color:"grey",children:["Connect your AI agents to Membrane.",u(qn,{}),"It will give them tools and context to build integrations."]})}),t.length>0&&u(g,{flexDirection:"column",paddingLeft:2,marginTop:1,children:t.map((o,i)=>u(g,{children:b(y,{color:"grey",children:["#",i+1," ",o.agentName,": ",o.totalRequests," calls"]})},o.processId))}),u(g,{marginTop:1,children:u(y,{color:"grey",children:"[a: connect an agent]"})})]})}c(Qo,"Agent");const Cn=c(r=>{switch(r){case"error":return"red";case"success":return"green";case"warning":return"yellow";default:return}},"getLogColor");function Sn(r,e){return e<3?r.slice(0,Math.max(0,e)):r.length<=e?r:`${r.slice(0,e-3)}...`}c(Sn,"truncateText");function ei({children:r}){const{state:e,logs:t}=H();return!e||e===$.NOT_INITIALIZED?b(g,{gap:1,flexDirection:"row",children:[u(rr,{type:"dots"}),u(y,{children:"Initializing..."})]}):e===$.SETTING_UP?u(g,{gap:1,flexDirection:"row",children:u(y,{children:"No workspace selected. Please run `membrane init` to select a workspace."})}):e===$.ERROR?u(g,{flexDirection:"column",children:t.slice().map((n,o)=>u(y,{color:Cn(n.type),children:n.message},n.timestamp+o))}):r}c(ei,"EnsureInitialized");function ti(){const{stats:r}=H(),e=Object.entries(r).filter(([t,n])=>n>0);return e.length===0?null:b(g,{flexDirection:"column",children:[u(g,{children:u(g,{width:12,children:u(y,{color:"grey",children:"Elements:"})})}),u(g,{flexDirection:"column",marginLeft:1,children:e.map(([t,n])=>b(g,{children:[u(g,{width:20,children:b(y,{children:[t,":"]})}),u(y,{color:"green",children:n})]},t))})]})}c(ti,"ElementStats");const gt=5,ni=6;function ri(){const{logs:r}=H(),[e,t]=D(0),n=Math.min(100,process.stdout.columns||100),o=gt,i=Math.max(0,r.length-o-e),s=r.length-e,a=r.slice(i,s),l=n-ni,d=e<r.length-o,h=e>0;return ae((p,f)=>{if(r.length!==0)if(f.upArrow){const C=Math.max(0,r.length-o);t(E=>Math.min(C,E+1))}else f.downArrow?t(C=>Math.max(0,C-1)):(p==="G"||p==="g")&&t(0)}),b(g,{flexDirection:"column",paddingTop:1,children:[b(y,{color:"grey",children:["Recent Activity (",i+1,"-",s," of ",r.length,"):",r.length>gt&&u(y,{color:"grey",children:" [arrows: scroll] [g: end]"})]}),a.map((p,f)=>u(g,{marginLeft:1,children:u(y,{color:Cn(p.type),children:Sn(p.message,l)})},p.timestamp+f)),r.length>gt&&b(g,{marginLeft:1,flexDirection:"row",children:[d&&u(y,{color:"grey",children:"\u2191 "}),h&&u(y,{color:"grey",children:"\u2193 "})]})]})}c(ri,"Logs");const Ae=[{value:"sync",label:"Continue (overwrite/delete)",key:""},{value:"exit",label:"Cancel",key:""}];function oi(){const{state:r,resolveConflicts:e,exit:t}=H(),[n,o]=D(0),[i,s]=D(!1),[a,l]=D(!1);return ae((d,h)=>{if(!i){if(h.ctrl&&d.toLowerCase()==="r"){l(!a);return}h.upArrow?o(p=>p>0?p-1:Ae.length-1):h.downArrow?o(p=>p<Ae.length-1?p+1:0):d.toLowerCase()==="y"?o(0):d.toLowerCase()==="n"?o(1):(h.return||d===" ")&&(s(!0),Ae[n].value==="sync"?e({watch:!0}):t())}}),he(()=>{r!==$.CONFLICTS&&i&&s(!1)},[r,i]),b(g,{flexDirection:"column",paddingTop:1,children:[u(g,{children:u(g,{flexDirection:"row",gap:2,children:u(y,{bold:!0,color:"white",children:"Conflicts with remote"})})}),u(g,{children:u(y,{color:"grey",children:"The remote workspace has changes that aren't in your local workspace:"})}),u(g,{marginTop:1,marginLeft:2,children:u(si,{isExpanded:a})}),b(g,{marginTop:2,flexDirection:"row",gap:1,children:[u(y,{color:"white",bold:!0,children:"What would you like to do?"}),u(y,{color:"grey",children:"[up/down, enter]"})]}),u(g,{children:i?b(g,{flexDirection:"row",gap:1,children:[u(xe,{type:"dots"}),u(y,{color:"blue",bold:!0,children:"Syncing with remote..."})]}):u(g,{flexDirection:"column",children:Ae.map((d,h)=>u(g,{flexDirection:"column",children:b(g,{flexDirection:"row",gap:1,children:[u(y,{color:n===h?"cyan":"grey",children:n===h?"\u25B6":" "}),u(y,{color:n===h?"cyan":"grey",bold:n===h,children:d.label})]})},d.value))})})]})}c(oi,"ResolveChangesUI");const ii={[Z.UPDATE]:{incoming:{label:"Elements updated in remote",description:"(to be overwritten from remote)"},outgoing:{label:"Elements updated locally",description:"(to be pushed to remote)"}},[Z.DELETE]:{incoming:{label:"Elements not existing in remote",description:"(to be deleted locally)"},outgoing:{label:"Elements deleted locally",description:"(to be deleted from remote)"}},[Z.CREATE]:{incoming:{label:"Elements created in remote",description:"(to be created locally)"},outgoing:{label:"Elements created locally",description:"(to be created in remote)"}}};function si({isExpanded:r,showControls:e=!0}){const{conflicts:t}=H(),n=5,o=Kn(()=>{const i={};return t.forEach(s=>{const a=`${s.type}-${s.direction}`;i[a]||(i[a]=[]),i[a].push(s)}),i},[t]);return u(g,{flexDirection:"column",children:Object.entries(o).map(([i,s])=>{if(s.length===0)return null;const[a,l]=i.split("-"),d=ii[a][l];return b(g,{flexDirection:"column",children:[b(g,{flexDirection:"row",gap:1,children:[b(y,{color:"yellow",children:[d.label," (",s.length,")"]}),u(y,{color:"white",children:d.description})]}),(r?s:s.slice(0,n)).map(h=>u(g,{marginLeft:2,children:b(y,{color:"grey",children:["\u2022 ",h.element.id," (",h.element.relativePath,")"]})},h.element.id)),!r&&s.length>n&&u(g,{marginLeft:2,children:b(y,{color:"cyan",children:["... and ",s.length-n," more",e?" (press Ctrl+R to show all)":""]})}),r&&s.length>n&&e&&u(g,{marginLeft:2,children:u(y,{color:"cyan",children:"(press Ctrl+R to collapse)"})})]},i)})})}c(si,"Conflicts");function ai(){const{config:r,state:e,logs:t,currentWorkspace:n,pull:o}=H(),i=n?.name,s=i?Sn(i,30):r?.workspaceKey,a=Math.min(100,process.stdout.columns||100);return he(()=>{o({watch:!0})},[]),b(g,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:a,children:[u(g,{marginTop:-1,marginBottom:1,children:b(g,{flexDirection:"row",gap:1,children:[u(y,{bold:!0,children:"\u{1F504} Workspace"}),b(y,{color:li(e),children:[" [",ci(e),"] "]})]})}),b(g,{children:[u(g,{width:12,children:u(y,{color:"grey",children:"Local:"})}),u(y,{color:"grey",children:process.cwd()})]}),b(g,{children:[u(g,{width:12,children:u(y,{color:"grey",children:"Remote:"})}),r?.workspaceKey?b(y,{color:"grey",children:[s," [o: open in console] [w: change]"]}):b(y,{children:[u(y,{color:"yellow",children:"not selected"})," [w: select]"]})]}),e===$.CONFLICTS?u(oi,{}):b(Te,{children:[u(g,{paddingTop:1,children:u(ti,{})}),t.length>0&&u(ri,{})]})]})}c(ai,"Workspace");function ci(r){switch(r){case $.PULLING:return"pulling";case $.PUSHING:return"pushing";case $.CONFLICTS:return"conflicts";case $.SYNCED:return"synced";case $.ERROR:return"error";case $.WATCHING:return"tracking changes";case $.RESOLVING:return"resolving";case $.NOT_SYNCED:return"not synced";case $.INITIALIZED:return"initialized";case $.SETTING_UP:return"setup required";default:return"unknown"}}c(ci,"getStatusDisplay");function li(r){switch(r){case $.PULLING:return"yellow";case $.PUSHING:return"yellow";case $.CONFLICTS:return"red";case $.SYNCED:return"green";case $.ERROR:return"red";case $.WATCHING:return"green";case $.RESOLVING:return"yellow";case $.NOT_SYNCED:return"grey";case $.SETTING_UP:return"yellow";default:return"grey"}}c(li,"getStatusColor");const ui="https://console.integration.app/w";function di(){const r=co(),e=Be(!0),{exit:t,state:n}=H(),[o,i]=D(null),s=o??(n===$.SETTING_UP?"setup":"main");ae(l=>{s==="main"&&(l==="w"&&i("workspace-selection"),l==="a"&&i("add-mcp-server"),l==="o"&&n===$.INITIALIZED&&a(),l==="s"&&i("setup"))});async function a(){try{const l=await Bt(r),d=`${ui}/${l}`,h=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";sr(`${h} "${d}"`)}catch(l){console.error("Failed to open workspace:",l),t()}}return c(a,"handleOpenWorkspace"),he(()=>(e.current=!0,()=>{e.current=!1}),[]),s==="workspace-selection"?u(nn,{onExit:c(()=>i(null),"onExit")}):s==="add-mcp-server"?u(Zo,{onExit:c(()=>i(null),"onExit"),onComplete:c(()=>i(null),"onComplete")}):s==="setup"?u(rn,{onComplete:c(()=>i(null),"onComplete")},Date.now()):u(ei,{children:b(g,{flexDirection:"column",children:[u(g,{flexGrow:1,children:u(Qo,{})}),u(ai,{}),u(g,{paddingLeft:2,children:u(y,{color:"grey",children:"[s: (re-)setup]"})})]})})}c(di,"Main");const hi=c(()=>[w.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"),w.yellow("\u2502 \u26A0\uFE0F EXPERIMENTAL FEATURE WARNING \u2502"),w.yellow("\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524"),w.yellow("\u2502 Real-time agent mode is experimental and subject to changes. \u2502"),w.yellow("\u2502 Use in production environments is not recommended. \u2502"),w.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"),""].join(`
|
|
20
|
+
`),"createExperimentalWarning$1");function pi(r,e){r.command("sync").description("\u26A0\uFE0F EXPERIMENTAL: Sync workspace data in real-time - This feature is experimental and subject to changes. Use in production environments is not recommended.").option("--watch","Watch for changes and sync automatically",!1).option("--rps <number>","Maximum requests per second (default: 80)",t=>parseInt(t,10)).addHelpText("after",["","Examples:"," membrane sync --watch # Start real-time sync with watch mode"," membrane sync --watch --rps 5 # Limit to 5 requests per second",""].join(`
|
|
21
|
+
`)).action(async t=>{if(t.watch||(console.error("Error: The sync command requires the --watch flag"),console.error("Usage: membrane sync --watch"),process.exit(1)),t.rps!==void 0){const n=t.rps;!isNaN(n)&&n>0&&n<=1e3?I.init({maxRequestsPerSecond:n}):(m.error(`Invalid RPS value: ${n}. Must be between 1 and 1000.`),process.exit(1))}console.warn(hi()),_e(se.createElement(lt,{cwd:process.cwd(),membraneCLIService:e,children:se.createElement(di)}))})}c(pi,"setupSyncCommand");class fi{static{c(this,"BaseRunner")}constructor(e={}){if(this.options=e,this.fsPaths=Xe(),e&&typeof e=="object"){const t=e;"client"in t&&t.client&&(this.client=t.client),"workspace"in t&&(this.workspace=t.workspace)}}client;workspace;fsPaths}const mi="claude-sonnet-4-20250514";class bt{static{c(this,"TestEnvironment")}client;connectionId;testsDir;testBasePath;options;llm;state={};constructor({connectionId:e,testsDir:t,testBasePath:n,client:o,options:i,llm:s}){this.client=o,this.connectionId=e,this.testsDir=t,this.testBasePath=n,this.llm=s,this.options=i}static async create({connectionId:e,testBasePath:t,options:n}){const o=$e();if(!o)throw new Error("No configuration found. Please set MEMBRANE_WORKSPACE_KEY and MEMBRANE_WORKSPACE_SECRET environment variables, or run `membrane init` first.");if(!o.workspaceKey||!o.workspaceSecret)throw new Error("Missing workspace credentials");if(!o.anthropicApiKey)throw new Error("Anthropic API key not configured. Run `membrane init` to set up testing.");const i=new vt({token:await this.createMembraneToken(o),apiUri:o.apiUri}),s=new ar({apiKey:o.anthropicApiKey}),a={complete:c(async({prompt:l,maxTokens:d})=>{const h=await s.messages.create({model:mi,max_tokens:d,messages:[{role:"user",content:l}]});return h.content[0].type==="text"?h.content[0].text:""},"complete")};return new bt({client:i,options:n,connectionId:e,testsDir:"src/testing/tests",testBasePath:t,llm:a})}async run(e){this.state={};const t={};for(const n of e)await n.run(),Je(t,n.getResult());this.writeResults(t)}async readYaml(e){const t=R.join(this.testsDir,this.testBasePath,this.connectionId,e);return Qe(t)}async writeYaml(e,t){const n=R.join(this.testsDir,this.testBasePath,this.connectionId,e);P.mkdirSync(R.dirname(n),{recursive:!0}),P.writeFileSync(n,G.dump(t,{noRefs:!0}))}writeResults(e){const t=R.join(this.testsDir,this.testBasePath,this.connectionId);P.mkdirSync(t,{recursive:!0});const n=R.join(t,"test-results.yaml");P.writeFileSync(n,G.dump(e,{noRefs:!0})),console.debug(`[TestRunner] Results written to: ${n}`)}static async createMembraneToken(e){const t=e.testCustomerId||"test-customer",n={id:t,name:t},o={issuer:e.workspaceKey,expiresIn:7200,algorithm:"HS512"};return We.sign(n,e.workspaceSecret,o)}}lr.interpolate=/{{([\s\S]+?)}}/g;function yt(r,e){if(typeof r=="string"){const t=cr(r),n={state:e,random:{number:c(()=>ye.number.int(),"number"),alphaNumeric:c(i=>ye.string.alphanumeric(i),"alphaNumeric")},faker:{company:{name:c(()=>ye.company.name(),"name"),catchPhrase:c(()=>ye.company.catchPhrase(),"catchPhrase")},internet:{email:c(()=>ye.internet.email(),"email")}},entries:e["journal-entries"],orders:e["purchase-orders"]||e["sales-orders"],bills:e["vendor-bills"]},o=t(n);return r.includes("{{")&&r.includes("}}")&&(console.debug(`[TEMPLATE] Input: ${r}`),console.debug(`[TEMPLATE] Output: ${o}`)),o}return Array.isArray(r)?r.map(t=>yt(t,e)):typeof r=="object"&&r!==null?Object.fromEntries(Object.entries(r).map(([t,n])=>[t,yt(n,e)])):r}c(yt,"processNode");function gi(r,e){return yt(r,e)}c(gi,"handleTemplate");class yi{static{c(this,"BaseTestSuite")}result;environment;constructor({environment:e}){this.environment=e,this.result={}}async run(){}getResult(){return this.result}async runTest(e){console.debug(`${w.bold.cyan("[start]")} ${w.yellow(e.path)}`);let t=!1,n=!1,o={},i={},s;for(;!t;)try{i=await e.readTestCase(),i||(i=await e.generateConfig(),await this.environment.writeYaml(e.getTestCasePath(),i),console.debug(`${w.bold.yellow("[initialized]")} ${w.yellow(e.path)}`)),s=gi(i,this.environment.state),await e.run(s),console.debug(`${w.bold.green("[success]")} ${w.yellow(e.path)}`),t=!0,o=e.getResult(),Me(this.result,e.path,o)}catch(l){if(console.error(`${w.bold.red("[error]")} ${w.yellow(e.path)}: ${l}`),this.environment.options.fix&&!n){n=!0;try{await e.fix(l);continue}catch(d){console.error(`${w.bold.red("[fix fail]")} ${w.yellow(e.path)}: ${d}`)}}Me(this.result,e.path,{error:J(l)}),t=!0,o={error:J(l)}}const a={...s,result:o};await this.environment.writeYaml(e.getTestCasePath(),a)}async runTestSuite(e){await e.run(),Je(this.result,e.getResult())}}class oe{static{c(this,"BaseTester")}environment;level;logs;assertions;resultsLocator;path;constructor({environment:e,path:t}){this.environment=e,this.logs=[],this.assertions=[],this.path=t,this.level=0,this.resultsLocator=""}async fix(e){const t=await this.readTestCase();if(!t)throw new Error(`No config found for test ${this.path}`);const n=await this.fixTestCase({config:t,error:e});console.debug(w.bold.yellow("[auto-fix]"),this.path),await this.environment.writeYaml(this.getTestCasePath(),n)}async readTestCase(){const e=this.getTestCasePath();return this.environment.readYaml(e)}async generateConfig(){return{}}async fixTestCase(e){throw new Error(`Auto-fix is not implemented for test ${this.path}`)}getResult(){return{logs:this.logs,assertions:this.assertions}}async assert(e,t,n){try{const o=await e();o?(this.logMsg(`\u2705 ${t}`),this.assertions.push({message:t,result:o})):(this.logMsg(`\u274C ${t}`),this.assertions.push({message:t,result:!1,details:n}))}catch(o){this.assertions.push({message:t,result:!1,details:J(o)}),this.logMsg(`\u274C ${t}: ${o.message}`)}}logMsg(e){console.debug(`${" ".repeat(this.level*2)}${e}`)}getTestCasePath(){return`${this.path}.test.yml`}}function wt(r,e){const t={};for(const n in e){if(!(n in r)){t[n]=e[n];continue}const o=r[n],i=e[n];if(o&&i&&typeof o=="object"&&typeof i=="object"){if(Array.isArray(o)&&Array.isArray(i)){const s=i.filter(a=>!o.some(l=>{if(typeof l=="object"&&typeof a=="object"&&l!==null&&a!==null&&!Array.isArray(l)&&!Array.isArray(a)){for(const d in a)if(!(d in l)||!Ct(l[d],a[d]))return!1;return!0}else return JSON.stringify(l)===JSON.stringify(a)}));s.length>0&&(t[n]=s)}else if(!Array.isArray(o)&&!Array.isArray(i)){const s=wt(o,i);s!==null&&(t[n]=s)}else t[n]=i;continue}Ct(o,i)||(t[n]=i)}return Object.keys(t).length===0?null:t}c(wt,"getNotMatchingSubFields");function Ct(r,e){if(r==e||r?.toString?.()===e?.toString?.())return!0;const t=new Date(r),n=new Date(e);return!isNaN(t.getTime())&&!isNaN(n.getTime())?t.getTime()===n.getTime():!1}c(Ct,"softCompare");class wi extends oe{static{c(this,"DataCollectionCreateTester")}dataCollectionKey;dataCollection;constructor({environment:e,dataCollectionKey:t,dataCollection:n}){super({environment:e,path:`data/${t}/create`}),this.dataCollectionKey=t,this.dataCollection=n}async run(e){const t=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).create(e.input);await this.assert(()=>!!t.id,"Returned ID of a created record"),t.id&&(this.environment.state[this.dataCollectionKey]={createdRecordId:t.id});const n=Fe(this.dataCollection);if(this.dataCollection.findById){const i=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).findById({id:t.id});await this.assert(()=>!!i.record,"Record is returned from findById"),i.record&&(this.environment.state[this.dataCollectionKey]={createdRecordId:t.id,createdRecord:i.record.fields});const s=Tt(n),a=ve(e.input.fields,s,{skipUnknownFields:!0}),l=ve(i.record.fields,s),d=wt(l,a);await this.assert(()=>!d,"Returned fields match created fields",{difference:d,sentFields:a,receivedFields:l})}const o=Mn(n??{});if(o.length>0){const i={};o.forEach(a=>{const l=Fn(e.input.fields,a);typeof l<"u"&&Me(i,a,l)});const s=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).create({fields:i});await this.assert(()=>!!s.id,"Record can be created with schema-defined required fields only")}}async generateConfig(){const e=Fe(this.dataCollection);if(!e?.properties)throw new Error("No fields schema found for data collection");return{input:{fields:await this.generateFieldsWithLLM(e)}}}async fixTestCase({config:e,error:t}){const n=J(t),o=Fe(this.dataCollection),i=await this.getExampleRecordsForSchema(o),s=`I'm trying to create a data record in a data collection with the following fields schema:
|
|
160
22
|
|
|
161
|
-
${JSON.stringify(
|
|
23
|
+
${JSON.stringify(o,null,2)}
|
|
162
24
|
|
|
163
25
|
I tried to create a record with these fields:
|
|
164
26
|
|
|
@@ -180,7 +42,7 @@ Format your response as a JSON object with two fields:
|
|
|
180
42
|
"fields": { ... fixed fields ... }
|
|
181
43
|
}.
|
|
182
44
|
|
|
183
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,a=await this.environment.llm.complete({prompt:
|
|
45
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,a=await this.environment.llm.complete({prompt:s,maxTokens:1e4}),l=JSON.parse(a.trim());return console.warn(w.bold.yellow("[auto-fix]"),`${this.path}:`,l.explanation),{input:{fields:l.fields}}}async generateFieldsWithLLM(e){const t=await this.getExampleRecordsForSchema(e),n=`Generate a valid JSON object that matches this JSONSchema. Return only the JSON object, no other text.
|
|
184
46
|
|
|
185
47
|
${this.getExampleRecordsPrompt(t)}
|
|
186
48
|
|
|
@@ -189,14 +51,14 @@ ${JSON.stringify(e,null,2)}.
|
|
|
189
51
|
|
|
190
52
|
Do not populate fields with null or empty strings, unless the schema explicitly requires it.
|
|
191
53
|
|
|
192
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,
|
|
54
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,o=await this.environment.llm.complete({prompt:n,maxTokens:1e4});return JSON.parse(o.trim())}getExampleRecordsPrompt(e){return`When a field has a "referenceCollection" property, its value should be an ID of a record from that collection. Here are some example records you can use as references:
|
|
193
55
|
|
|
194
|
-
${Object.entries(e).map(([n,
|
|
195
|
-
${JSON.stringify(
|
|
56
|
+
${Object.entries(e).map(([n,o])=>`Example records from collection "${n}":
|
|
57
|
+
${JSON.stringify(o,null,2)}`).join(`
|
|
196
58
|
|
|
197
59
|
`)}.
|
|
198
60
|
|
|
199
|
-
If you don't have an example for a given collection, leave the field empty instead of coming up with a fake record id.`}async findReferenceCollections(e){const t=new Set,n=[];return
|
|
61
|
+
If you don't have an example for a given collection, leave the field empty instead of coming up with a fake record id.`}async findReferenceCollections(e){const t=new Set,n=[];return xt(e,o=>{if(o.referenceCollection){const i=o.referenceCollection.key,s=o.referenceCollection.parameters,a=`${i}:${JSON.stringify(s||{})}`;t.has(a)||(t.add(a),n.push({key:i,parameters:s}))}return o}),n}async fetchExampleRecords(e){return(await this.environment.client.connection(this.environment.connectionId).dataCollection(e.key).list({parameters:e.parameters})).records.map(n=>({id:n.id,fields:n.fields??{}}))}async getExampleRecordsForSchema(e){const t=await this.findReferenceCollections(e),n={};for(const o of t){const i=It(o);n[i]=await this.fetchExampleRecords(o)}return n}}class Ci extends oe{static{c(this,"DataCollectionDeleteTester")}dataCollectionKey;dataCollection;constructor({environment:e,dataCollectionKey:t,dataCollection:n}){super({environment:e,path:`data/${t}/delete`}),this.dataCollectionKey=t,this.dataCollection=n}async run(e){const t=this.environment.state[this.dataCollectionKey]?.createdRecordId||e?.input?.id;if(!t)throw new Error(`No ID found in state or config for ${this.dataCollectionKey} delete`);try{await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).delete({id:t})}catch(n){throw n}if(this.dataCollection.findById)try{await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).findById({id:t})}catch(n){if(n?.data?.data?.response?.status===404){await this.assert(()=>!0,"Record is not found after deletion");return}throw n}else await this.assert(()=>!0,"No findById capability, skipping verification")}async generateConfig(){let e=this.environment.state[this.dataCollectionKey]?.createdRecordId;if(!e){if(!this.dataCollection.list)throw new Error(`Can't find a record to test delete operation for ${this.dataCollectionKey}. List operation is not implemented for this data collection`);const t=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).list({});if(!t?.records?.length)throw new Error(`No records found to test delete for ${this.dataCollectionKey}`);e=t.records[0].id}return{input:{id:e}}}async fixTestCase({config:e,error:t}){const n=J(t),o=`I'm trying to delete a record from a data collection.
|
|
200
62
|
|
|
201
63
|
I tried to delete a record with this ID:
|
|
202
64
|
|
|
@@ -216,7 +78,7 @@ Format your response as a JSON object with two fields:
|
|
|
216
78
|
"id": "fixed id"
|
|
217
79
|
}.
|
|
218
80
|
|
|
219
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:
|
|
81
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:o,maxTokens:1e3}),s=JSON.parse(i.trim());return console.warn(w.bold.yellow("[auto-fix]"),`${this.path}:`,s.explanation),{input:{id:s.id}}}}class Si extends oe{static{c(this,"DataCollectionFindByIdTester")}dataCollectionKey;dataCollection;constructor({environment:e,dataCollectionKey:t,dataCollection:n}){super({environment:e,path:`data/${t}/find-by-id`}),this.dataCollectionKey=t,this.dataCollection=n}async run(e){const t=this.environment.state[this.dataCollectionKey]?.createdRecordId||e?.input?.id;if(!t)throw new Error(`No ID found in state or config for ${this.dataCollectionKey} find-by-id`);const n=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).findById({id:t});await this.assert(()=>!!n.record,"Record is returned from findById"),await this.assert(()=>n.record.id===t,"Returned record ID matches requested ID")}async generateConfig(){let e=this.environment.state[this.dataCollectionKey]?.createdRecordId;if(!e){if(!this.dataCollection.list)throw new Error(`Can't find a record to test findById operation for ${this.dataCollectionKey}. List operation is not implemented for this data collection`);const t=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).list({});if(!t?.records?.length)throw new Error(`No records found to test findById for ${this.dataCollectionKey}`);e=t.records[0].id}return{input:{id:e}}}async fixTestCase({config:e,error:t}){const n=J(t),o=`I'm trying to find a record by ID in a data collection.
|
|
220
82
|
|
|
221
83
|
I tried to find a record with this ID:
|
|
222
84
|
|
|
@@ -236,7 +98,7 @@ Format your response as a JSON object with two fields:
|
|
|
236
98
|
"id": "fixed id"
|
|
237
99
|
}.
|
|
238
100
|
|
|
239
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:
|
|
101
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:o,maxTokens:1e3}),s=JSON.parse(i.trim());return console.warn(w.bold.yellow("[auto-fix]"),`${this.path}:`,s.explanation),{input:{id:s.id}}}}class bi extends oe{static{c(this,"DataCollectionListTester")}dataCollectionKey;constructor({environment:e,dataCollectionKey:t}){super({environment:e,path:`data/${t}/list`}),this.dataCollectionKey=t}async run(e){const t=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).list(e.input);if(await this.assert(()=>Array.isArray(t.records),"Response has records field as array"),e.input.sort){const{field:n,direction:o}=e.input.sort,i=t.records;if(i.length>1)for(let s=1;s<i.length;s++){const a=i[s-1].fields?.[n],l=i[s].fields?.[n];a==null||l==null||(o==="asc"?await this.assert(()=>a<=l,`Records are sorted by ${n} in ascending order`):await this.assert(()=>a>=l,`Records are sorted by ${n} in descending order`))}}}async generateConfig(){return{input:{}}}async fixTestCase({config:e,error:t}){const n=J(t),o=`I'm trying to list records from a data collection.
|
|
240
102
|
|
|
241
103
|
I tried to list records with these parameters:
|
|
242
104
|
|
|
@@ -256,7 +118,7 @@ Format your response as a JSON object with two fields:
|
|
|
256
118
|
"input": { ... fixed parameters ... }
|
|
257
119
|
}.
|
|
258
120
|
|
|
259
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:
|
|
121
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:o,maxTokens:1e3}),s=JSON.parse(i.trim());return console.warn(w.bold.yellow("[auto-fix]"),`${this.path}:`,s.explanation),{input:s.input}}}class vi extends oe{static{c(this,"DataCollectionMatchTester")}dataCollectionKey;dataCollection;constructor({environment:e,dataCollectionKey:t,dataCollection:n}){super({environment:e,path:`data/${t}/match`}),this.dataCollectionKey=t,this.dataCollection=n}async run(e){const t=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).match(e.input);await this.assert(()=>!!t.record,"Response contains a record");const n=t.record,i=(await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).findById({id:n.id})).record;for(const[s,a]of Object.entries(e.input.query)){const l=i.fields?.[s];await this.assert(()=>Ct(l,a),`Record field ${s} matches input value - expected ${JSON.stringify(a)} got ${JSON.stringify(l)}`)}}async generateConfig(){if(!this.dataCollection.list)throw new Error(`Can't find a record to test match operation for ${this.dataCollectionKey}. List operation is not implemented for this data collection`);const e=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).list({});if(!e?.records?.length)throw new Error("No records found to test match");const t=e.records[0];if(!t?.fields)throw new Error("First record has no fields to match against");const n={},o=t.fields||{},i=Object.entries(o).filter(([s,a])=>s!=="links"&&a!=null&&a!=="").slice(0,1);if(i.length===0)throw new Error("No usable fields found in record for matching");for(const[s,a]of i)n[s]=a;return{input:{query:n}}}async fixTestCase({config:e,error:t}){const n=J(t),o=`I'm trying to match a record in a data collection.
|
|
260
122
|
|
|
261
123
|
I tried to match a record with this query:
|
|
262
124
|
|
|
@@ -276,12 +138,12 @@ Format your response as a JSON object with two fields:
|
|
|
276
138
|
"query": { ... fixed query ... }
|
|
277
139
|
}.
|
|
278
140
|
|
|
279
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:
|
|
141
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:o,maxTokens:1e3}),s=JSON.parse(i.trim());return console.warn(w.bold.yellow("[auto-fix]"),`${this.path}:`,s.explanation),{input:{query:s.query}}}}class Ei extends oe{static{c(this,"DataCollectionSearchTester")}dataCollectionKey;dataCollection;constructor({environment:e,dataCollectionKey:t,dataCollection:n}){super({environment:e,path:`data/${t}/search`}),this.dataCollectionKey=t,this.dataCollection=n}async run(e){const t=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).search(e.input);await this.assert(()=>Array.isArray(t.records),"Response has records field as array");const n=t.records.some(o=>o.id===e.expectedRecordId);n||console.debug(w.yellow(`Search query "${e.input.query}" did not return expected record`)),await this.assert(()=>n,"Search returns expected record")}async generateConfig(){if(!this.dataCollection.list)throw new Error(`Can't find a record to test search operation for ${this.dataCollectionKey}. List operation is not implemented for this data collection`);const e=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).list({});if(!e.records.length)throw new Error("No records found to test search");const t=e.records[0],n=await this.getSearchQueryWithLLM(t.fields||{});if(!n)throw new Error("Unable to generate search query. LLM could not identify a suitable field value from the record to use as the search query.");return{input:{query:n},expectedRecordId:t.id}}async getSearchQueryWithLLM(e){const t=`You are given the fields of a record from a data collection. Identify the BEST single field value that a user is MOST likely to type when searching for this record (e.g. name, title, email, external id). Ignore null, empty strings, technical IDs, HTML, and timestamps unless they are obviously human-searchable. Make sure the field value is as unique as possible for this record. RETURN ONLY the field value as a plain string. No additional text, no JSON, no quotes.
|
|
280
142
|
|
|
281
143
|
Record fields:
|
|
282
144
|
${JSON.stringify(e,null,2)}
|
|
283
145
|
|
|
284
|
-
Field value:`;try{return(await this.environment.llm.complete({prompt:t,maxTokens:1e3})).trim()||null}catch{return null}}async fixTestCase({config:e,error:t}){const n=
|
|
146
|
+
Field value:`;try{return(await this.environment.llm.complete({prompt:t,maxTokens:1e3})).trim()||null}catch{return null}}async fixTestCase({config:e,error:t}){const n=J(t),o=`I'm trying to search records in a data collection.
|
|
285
147
|
|
|
286
148
|
I tried to search records with these parameters:
|
|
287
149
|
|
|
@@ -301,9 +163,9 @@ Format your response as a JSON object with two fields:
|
|
|
301
163
|
"input": { ... fixed parameters ... }
|
|
302
164
|
}.
|
|
303
165
|
|
|
304
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:
|
|
166
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,i=await this.environment.llm.complete({prompt:o,maxTokens:1e3}),s=JSON.parse(i.trim());return console.warn(w.bold.yellow("[auto-fix]"),`${this.path}:`,s.explanation),{input:s.input,expectedRecordId:e.expectedRecordId}}}class Ti extends oe{static{c(this,"DataCollectionSpecTester")}dataCollection;constructor({environment:e,dataCollectionKey:t,dataCollection:n}){super({environment:e,path:`data/${t}/spec`}),this.dataCollection=n}async run(){const e=Object.keys(this.dataCollection.fieldsSchema||{}).length;await this.assert(()=>e>0,"Fields schema has field definitions")}}class xi extends oe{static{c(this,"DataCollectionUpdateTester")}dataCollectionKey;dataCollection;constructor({environment:e,dataCollectionKey:t,dataCollection:n}){super({environment:e,path:`data/${t}/update`}),this.dataCollectionKey=t,this.dataCollection=n}async run(e){const t=this.environment.state[this.dataCollectionKey]?.createdRecordId||e?.input?.id;if(!t)throw new Error(`No ID found in state or config for ${this.dataCollectionKey} update`);const n=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).update({...e.input,id:t});if(await this.assert(()=>!!n.id,"Returned ID of updated record"),this.environment.state[this.dataCollectionKey]||(this.environment.state[this.dataCollectionKey]={}),this.environment.state[this.dataCollectionKey].createdRecordId=n.id,this.dataCollection.findById){const o=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).findById({id:n.id});await this.assert(()=>!!o.record,"Record is returned from findById");const i=Le(this.dataCollection),s=Tt(i),a=ve(e.input.fields,s,{skipUnknownFields:!0}),l=ve(o.record.fields,s),d=wt(l,a);await this.assert(()=>!d,"Returned fields match updated fields",{difference:d,sentFields:a,receivedFields:l})}}async generateConfig(){let e=this.environment.state[this.dataCollectionKey]?.createdRecordId;if(!e){if(!this.dataCollection.list)throw new Error(`Can't find a record to test update operation for ${this.dataCollectionKey}. List operation is not implemented for this data collection`);const o=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).list({});if(!o?.records?.length)throw new Error(`No records found to test update for ${this.dataCollectionKey}`);e=o.records[0].id}const t=Le(this.dataCollection);if(!t?.properties)throw new Error("No fields schema found for data collection");const n=await this.generateFieldsWithLLM(t);return{input:{id:e,fields:n}}}async fixTestCase({config:e,error:t}){const n=J(t),o=Le(this.dataCollection),i=await this.getExampleRecordsForSchema(o),s=`I'm trying to update a data record in a data collection with the following fields schema:
|
|
305
167
|
|
|
306
|
-
${JSON.stringify(
|
|
168
|
+
${JSON.stringify(o,null,2)}
|
|
307
169
|
|
|
308
170
|
I tried to update a record with ID "${e.input?.id}" and these fields:
|
|
309
171
|
|
|
@@ -325,7 +187,7 @@ Format your response as a JSON object with two fields:
|
|
|
325
187
|
"fields": { ... fixed fields ... }
|
|
326
188
|
}.
|
|
327
189
|
|
|
328
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,a=await this.environment.llm.complete({prompt:
|
|
190
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,a=await this.environment.llm.complete({prompt:s,maxTokens:1e4}),l=JSON.parse(a.trim());return console.warn(w.bold.yellow("[auto-fix]"),`${this.path}:`,l.explanation),{input:{id:e.input.id,fields:l.fields}}}async generateFieldsWithLLM(e){const t=await this.getExampleRecordsForSchema(e),n=`Generate a valid JSON object that matches this JSONSchema. Return only the JSON object, no other text.
|
|
329
191
|
|
|
330
192
|
${this.getExampleRecordsPrompt(t)}
|
|
331
193
|
|
|
@@ -334,16 +196,16 @@ ${JSON.stringify(e,null,2)}.
|
|
|
334
196
|
|
|
335
197
|
Do not populate fields with null or empty strings, unless the schema explicitly requires it.
|
|
336
198
|
|
|
337
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,
|
|
199
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,o=await this.environment.llm.complete({prompt:n,maxTokens:1e4});return JSON.parse(o.trim())}getExampleRecordsPrompt(e){return`When a field has a "referenceCollection" property, its value should be an ID of a record from that collection. Here are some example records you can use as references:
|
|
338
200
|
|
|
339
|
-
${Object.entries(e).map(([n,
|
|
340
|
-
${JSON.stringify(
|
|
201
|
+
${Object.entries(e).map(([n,o])=>`Example records from collection "${n}":
|
|
202
|
+
${JSON.stringify(o,null,2)}`).join(`
|
|
341
203
|
|
|
342
204
|
`)}.
|
|
343
205
|
|
|
344
|
-
If you don't have an example for a given collection, leave the field empty instead of coming up with a fake record id.`}async findReferenceCollections(e){const t=new Set,n=[];return
|
|
345
|
-
`),"createExperimentalWarning");function
|
|
346
|
-
`)).action(async(t,n)=>{try{console.warn(
|
|
347
|
-
${
|
|
206
|
+
If you don't have an example for a given collection, leave the field empty instead of coming up with a fake record id.`}async findReferenceCollections(e){const t=new Set,n=[];return xt(e,o=>{if(o.referenceCollection){const i=o.referenceCollection.key,s=o.referenceCollection.parameters,a=`${i}:${JSON.stringify(s||{})}`;t.has(a)||(t.add(a),n.push({key:i,parameters:s}))}return o}),n}async fetchExampleRecords(e){return(await this.environment.client.connection(this.environment.connectionId).dataCollection(e.key).list({parameters:e.parameters})).records.map(n=>({id:n.id,fields:n.fields||{}}))}async getExampleRecordsForSchema(e){const t=await this.findReferenceCollections(e),n={};for(const o of t){const i=It(o);n[i]=await this.fetchExampleRecords(o)}return n}}const St={spec:{testerClass:Ti},create:{testerClass:wi,operationKey:"create"},"find-by-id":{testerClass:Si,operationKey:"findById"},list:{testerClass:bi,operationKey:"list"},match:{testerClass:vi,operationKey:"match"},search:{testerClass:Ei,operationKey:"search"},update:{testerClass:xi,operationKey:"update"},delete:{testerClass:Ci,operationKey:"delete"}};class Ii extends yi{static{c(this,"DataCollectionTestSuite")}dataCollectionKey;testMethod;constructor({environment:e,dataCollectionKey:t,testMethod:n}){super({environment:e}),this.dataCollectionKey=t,this.testMethod=n}async run(){const e=await this.fetchDataCollection(),t=this.testMethod?[this.createTester(this.testMethod,e)]:this.createAllAvailableTesters(e);k.info("\u{1F680} Running tests...");for(const n of t)await this.runTest(n);this.displayTestSummary(t.length)}async fetchDataCollection(){return this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).get()}isOperationAvailable(e,t){return t?!!e[t]:!0}createTester(e,t){const n=St[e];if(!n)throw new Error(`Unknown test method "${e}". Available: ${this.getAvailableTestMethods(t).join(", ")}`);const o="operationKey"in n?n.operationKey:void 0;if(!this.isOperationAvailable(t,o))throw new Error(`${o} operation not available for data collection "${this.dataCollectionKey}"`);return this.instantiateTester(n,t)}createAllAvailableTesters(e){return Object.entries(St).filter(([,t])=>{const n="operationKey"in t?t.operationKey:void 0;return this.isOperationAvailable(e,n)}).map(([,t])=>this.instantiateTester(t,e))}instantiateTester(e,t){const n={environment:this.environment,dataCollectionKey:this.dataCollectionKey,dataCollection:t};return new e.testerClass(n)}getAvailableTestMethods(e){return Object.entries(St).filter(([,t])=>{const n="operationKey"in t?t.operationKey:void 0;return this.isOperationAvailable(e,n)}).map(([t])=>t)}displayTestSummary(e){k.info(`\u{1F4CA} ${e} test${e===1?"":"s"} executed`)}}class $i extends fi{static{c(this,"TestRunner")}constructor(e){super(e)}async initialize(){k.debug("Initializing test runner",{prefix:"TestRunner"})}async run(){try{const{testPath:e,path:t,fix:n}=this.options,o=e.split("/");o.length<2&&(k.error("Invalid test path. Expected format: <type>/<name>[/additional/path][/method]"),process.exit(1));const[i,s,...a]=o;i!=="connectors"&&(k.error(`Test type "${i}" is not yet fully implemented. Currently only "connectors" is fully supported.`),k.error("Supported test types: connectors"),process.exit(1));const l=s,d=i,h=[...a,...t?t.split("/"):[]].join("/"),p=await bt.create({connectionId:l,testBasePath:d,options:{fix:n}}),C=await p.client.get(`connections/${l}/data`),E=[],S=h?h.split("/"):[];if(S.length===0||S[0]==="data"){S[0]==="data"&&S.shift();let O,U;S.length>=1&&(U=S[0],S.length>=2&&S[1].trim()!==""&&(O=S[1]));for(const K of C){if(U&&U!==K.key)continue;const L=new Ii({environment:p,dataCollectionKey:K.key,testMethod:O});E.push(L)}}E.length===0&&(k.error(`No test suites found for path: ${e}${h?"/"+h:""}`),process.exit(1));const N={};for(const O of E){await O.run();const U=O.getResult();k.debug(`Suite ${O.constructor.name} result:`,{prefix:"TestRunner"}),Je(N,U)}console.debug("[TestRunner] All results collected:",Object.keys(N)),p.writeResults(N)}catch(e){throw console.error("Error in TestRunner.run():",e),e}}}const De=c(()=>[w.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"),w.yellow("\u2502 \u26A0\uFE0F EXPERIMENTAL FEATURE WARNING \u2502"),w.yellow("\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524"),w.yellow("\u2502 The test command is experimental and subject to rapid changes. \u2502"),w.yellow("\u2502 Features, APIs, and file structures may change without notice. \u2502"),w.yellow("\u2502 Use in production environments is not recommended. \u2502"),w.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"),""].join(`
|
|
207
|
+
`),"createExperimentalWarning");function ki(r){r.command("test").description("\u26A0\uFE0F EXPERIMENTAL: Test management commands - This feature is experimental and will be changing rapidly. Use at your own risk.").addHelpText("after",De()).action(async()=>{console.warn(De()),k.error("Please specify a subcommand. Use --help for available options."),process.exit(1)}).command("run").description("Run integration tests for various membrane components").argument("<testPath>",'Test path (e.g., "connectors/netsuite", "actions/create-contact", "connectors/hubspot/data/contacts", "connectors/netsuite/data/contacts/create")').option("-p, --path <path>","Additional path filter within the test scope").option("--fix","Enable auto-fix for test issues").addHelpText("after",["",w.bold("Examples:"),` ${w.gray("\u25B8")} ${w.cyan("membrane test run connectors/netsuite")} # Test all data collections for netsuite connector`,` ${w.gray("\u25B8")} ${w.cyan("membrane test run connectors/netsuite/data/contacts")} # Test specific data collection`,` ${w.gray("\u25B8")} ${w.cyan("membrane test run connectors/netsuite/data/contacts/create")} # Test specific method for data collection`,` ${w.gray("\u25B8")} ${w.cyan("membrane test run connectors/netsuite/data/contacts/delete")} # Test delete method for data collection`,` ${w.gray("\u25B8")} ${w.cyan("membrane test run actions/create-contact")} # Test specific action`,` ${w.gray("\u25B8")} ${w.cyan("membrane test run connectors/hubspot/events")} # Test events for hubspot`,` ${w.gray("\u25B8")} ${w.cyan("membrane test run connectors/salesforce --fix")} # Run tests with auto-fix enabled`,"",w.gray("For more information, visit:"),w.blue(" https://docs.integration.app/cli"),"",De()].join(`
|
|
208
|
+
`)).action(async(t,n)=>{try{console.warn(De()),t||(k.error("Test path is required"),process.exit(1)),k.header(`Testing: ${t}`);const o=new $i({testPath:t,path:n.path,fix:n.fix});await o.initialize(),await o.run(),k.success("Tests completed")}catch(o){o instanceof Error&&(k.error(o.message),process.exit(1)),k.error("An unknown error occurred"),process.exit(1)}})}c(ki,"setupTestCommand");const Ri=c(()=>{try{const r=$n(import.meta.url),e=In(r),t=Oe(e,"..","package.json");return JSON.parse(xn(t,"utf-8")).version}catch{return"1.0.0"}},"getPackageVersion"),bn=Ri();function Pi(){process.on("SIGINT",()=>process.exit(130));const r=new kn().name("membrane").description("Command-line interface for Membrane Agent").version(bn,"-v, --version","Output the version number").option("--verbose","Enable verbose logging (shows debug messages)");r.configureHelp({sortSubcommands:!0,subcommandTerm:c(n=>w.cyan(n.name()),"subcommandTerm"),commandUsage:c(n=>n.name()==="membrane"?`${w.cyan(n.name())} ${w.gray("[options]")} ${w.cyan("[command]")}`:n.usage(),"commandUsage"),optionTerm:c(n=>{const o=n.flags;return`${w.gray("\u25B8")} ${w.cyan(o)}`},"optionTerm"),subcommandDescription:c(n=>w.gray(n.description()),"subcommandDescription"),optionDescription:c(n=>w.gray(n.description),"optionDescription"),commandDescription:c(n=>w.gray(n.description()),"commandDescription")}),r.addHelpText("beforeAll",`
|
|
209
|
+
${w.bold.cyan("Membrane Agent CLI")} ${w.gray(`v${bn}`)}
|
|
348
210
|
|
|
349
|
-
`);const e=new
|
|
211
|
+
`);const e=new Qr(Re.Cli,process.cwd());Ao(r),_o(r),Eo(r),ki(r),So(r),pi(r,e),fo(r,e),gr(r,e),lo(r,e),process.argv.length===2&&(r.outputHelp(),process.exit(0)),r.parse(),r.opts().verbose&&m.setVerboseMode(!0)}c(Pi,"runCLI"),Pi();
|