@membranehq/cli 0.6.3 → 0.7.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 +88 -88
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,73 +1,73 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var Ui=Object.defineProperty;var c=(s,e)=>Ui(s,"name",{value:e,configurable:!0});import{jsx as m,jsxs as E,Fragment as Yt}from"react/jsx-runtime";import*as P from"node:path";import{resolve as qi,dirname as Ji,join as Wi}from"node:path";import{useInput as De,Box as b,Text as S,Newline as Gi,render as ht}from"ink";import Vi from"minimist";import Pe,{createContext as zt,useContext as Qt,useState as _,useEffect as pe,useCallback as ts,useMemo as Hi,useRef as Yi}from"react";import{SWRConfig as zi}from"swr";import ns from"os";import B from"path";import Qi from"conf";import*as L from"node:fs";import{readFileSync as Xi}from"node:fs";import ae from"js-yaml";import{z as U}from"zod";import*as Zi from"node:crypto";import{createHash as er}from"node:crypto";import*as tr from"node:os";import{EventEmitter as nr}from"events";import{IntegrationAppClient as ss,WorkspaceElementType as j,WorkspaceElementSpecs as me,setValueAtLocator as Xt,extractIntegrationAppErrorData as ue,getDataCollectionCreateFields as Zt,excludeWriteOnlyFieldsFromSchema as is,valueToSchema as dt,getRequiredFieldsFromSchema as sr,getValueAtLocator as ir,walkSchema as rs,makeDataLocationPath as os,getDataCollectionUpdateFields as en}from"@membranehq/sdk";import tn from"jsonwebtoken";import{exec as rr}from"node:child_process";import{TextInput as or,Select as ar}from"@inkjs/ui";import pt from"ink-spinner";import as from"swr/immutable";import cr from"ink-text-input";import R from"fs";import lr from"archiver";import ur from"form-data";import fr from"unzipper";import hr from"lodash/isEqual.js";import dr from"chokidar";import{fileURLToPath as pr}from"node:url";import k from"chalk";import{Command as mr}from"commander";import nn from"axios";import{FastMCP as gr}from"fastmcp";import sn from"lodash/merge.js";import yr from"@anthropic-ai/sdk";import{faker as Xe}from"@faker-js/faker";import wr from"lodash/template.js";import br from"lodash/templateSettings.js";const Sr="membrane",Cr="membrane.config.yml",rn="https://api.integration.app";function on(){const s=process.cwd(),e=P.join(s,Sr),t=P.join(s,Cr),n=e,i=P.join(n,"workspace.yaml");return{membraneDirPath:e,configPath:t,payloadDirPath:n,workspaceDataFilePath:i}}c(on,"getPaths");function kr(){return on().membraneDirPath}c(kr,"getBasePath");const vr={pat:{type:"string"},workspace:{type:"object"}},cs=new Qi({schema:vr,configName:"config",cwd:B.join(ns.homedir(),".membrane")}),Er=c(s=>{cs.set("pat",s)},"setPat"),ls=c(()=>cs.get("pat"),"getPat");class us{static{c(this,"AccountApiClient")}constructor(e=rn){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 o=ls();if(!o)throw new Error("Personal Access Token not found.");n.set("Authorization",`Bearer ${o}`)}t.body&&!n.has("Content-Type")&&n.set("Content-Type","application/json");const i=await fetch(`${this.apiBaseUrl}${e}`,{...t,headers:n});if(!i.ok){const o=await i.text();throw new Error(`API request failed: ${i.status} ${i.statusText} - ${o}`)}if(i.status===204)return{};const r=await i.text();return JSON.parse(r)}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 Ir=c(s=>{const e=new us(rn);return t=>e.get(t)},"createAccountApiFetcher"),fs=zt(process.cwd());function Tr({cwd:s,children:e}){return m(fs.Provider,{value:s,children:e})}c(Tr,"CwdProvider");function hs(){return Qt(fs)}c(hs,"useCwd");const Nr="membrane.config.yml";function Me(s){const e=P.join(s??process.cwd(),Nr);try{const t=L.readFileSync(e,"utf8"),n=ae.load(t),i=an.safeParse(n);return i.success?i.data:null}catch{return null}}c(Me,"readProjectConfig");const Ar="membrane.config.yml",an=U.object({workspaceKey:U.string().optional(),workspaceSecret:U.string().optional(),apiUri:U.string().optional(),testCustomerId:U.string().optional(),anthropicApiKey:U.string().optional()});U.enum(["pull"]);const ds=zt(void 0);function Or({children:s}){const e=hs(),[t,n]=_(null),[i,r]=_(!0);pe(()=>{const u=Me(e);n(u),r(!1)},[e]);const o=ts(u=>{const p=P.join(e,Ar),f={...Me(e)??{},...u},g=an.safeParse(f);return g.success?(L.writeFileSync(p,ae.dump(g.data)),n(g.data),!0):!1},[e]),a=ts(()=>!!(t?.workspaceKey&&t?.workspaceSecret),[t]),l={config:t,isLoading:i,updateConfig:o,validateConfig:a};return m(ds.Provider,{value:l,children:s})}c(Or,"ProjectConfigProvider");function Ze(){const s=Qt(ds);if(s===void 0)throw new Error("useProjectConfig must be used within a ProjectConfigProvider");return s}c(Ze,"useProjectConfig");const Y={LogAdded:"logAdded",StateChanged:"stateChanged",StatsChanged:"statsChanged",ConflictsChanged:"conflictsChanged",McpStatusChanged:"mcpStatusChanged",McpServersChanged:"mcpServersChanged"};class ps extends nr{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)}}class $r{static{c(this,"MembraneClient")}client=null;currentConfig=null;tokenExpiry=0;async generateAccessToken(e,t){return tn.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=Me(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 ss({token:t,apiUri:e.apiUri})}async getClient(e){const t=this.getCurrentConfig(e);if(!t)throw new Error("Unable to create IntegrationAppClient: No workspace configuration found.");const n=!this.currentConfig||this.currentConfig.workspaceKey!==t.workspaceKey||this.currentConfig.workspaceSecret!==t.workspaceSecret||this.currentConfig.apiUri!==t.apiUri,i=!this.isTokenValid()||this.tokenExpiry-Date.now()<3e5;return(!this.client||n||i)&&(this.client=await this.createClient(t)),this.client}clearClient(){this.client=null,this.currentConfig=null,this.tokenExpiry=0}getCurrentConfigInfo(){return this.currentConfig}}const be=new $r;async function ms(s){const e=await be.getClient(s);if(!e)throw new Error("No workspace configuration found");return(await e.get("org-workspace-id")).id}c(ms,"getWorkspaceId");class Lr extends ps{static{c(this,"WorkspaceNotifications")}constructor(e){super(),this.config=e,this.setupProcessCleanup()}connectedToRemote=!1;clientId;heartbeatInterval;get isInitialized(){return this.connectedToRemote}async connectToRemote(){if(!this.connectedToRemote)try{await this.registerWithRemoteServer(),await this.startHeartbeatLoop(),this.connectedToRemote=!0}catch{}}async setState(e){this.emit(Y.StateChanged,{state:e}),await this.emitRemote({status:e})}setConflicts(e){this.emit(Y.ConflictsChanged,{conflicts:e})}setStats(e){this.emit(Y.StatsChanged,{stats:e})}addLog(e){this.emit(Y.LogAdded,{log:e})}setMcpStatus(e){this.emit(Y.McpStatusChanged,{status:e})}async setMcpServers(e){this.emit(Y.McpServersChanged,{servers:e}),await this.emitRemote({mcpServers:e.map(t=>({name:t.agentName,totalRequests:t.totalRequests}))})}async shutdown(){this.connectedToRemote&&await this.cleanup()}async cleanup(){if(this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=void 0),this.clientId)try{await(await be.getClient(process.cwd())).delete(`/local-clients/${this.clientId}`)}catch{}this.connectedToRemote=!1,this.clientId=void 0}async registerWithRemoteServer(){const t=await(await be.getClient(process.cwd())).post("/local-clients",{hostname:ns.hostname(),workingDirectory:process.cwd()});this.clientId=t.id}async startHeartbeatLoop(){this.heartbeatInterval=setInterval(async()=>{if(this.connectedToRemote&&this.clientId)try{await this.sendHeartbeat()}catch{}},this.config.heartbeatIntervalMs)}async sendHeartbeat(){if(!this.clientId)return;await(await be.getClient(process.cwd())).post(`/local-clients/${this.clientId}/keep-alive`,{})}async emitRemote(e){if(this.clientId&&this.connectedToRemote)try{await(await be.getClient(process.cwd())).patch(`/local-clients/${this.clientId}`,e)}catch{}}setupProcessCleanup(){const e=c(async()=>{await this.shutdown()},"cleanup");process.on("SIGINT",async()=>{await e(),process.exit(0)}),process.on("SIGTERM",async()=>{await e(),process.exit(0)}),process.on("beforeExit",()=>e()),process.on("uncaughtException",async()=>{await e(),process.exit(1)}),process.on("unhandledRejection",async()=>{await e(),process.exit(1)})}}const z=new Lr({heartbeatIntervalMs:15e3});class xr{static{c(this,"WorkspaceLogger")}_logs;workspaceNotifications;constructor(){this._logs=[],this.workspaceNotifications=z}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),this.workspaceNotifications.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")}clear(){this._logs=[]}}const $=new xr,Se=P.join(tr.tmpdir(),"membrane-mcp-status"),gs=3e4;class Dr{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=mt(void 0,e),n=ws(e);t&&z.setMcpStatus(t),await z.setMcpServers(n)}catch{$.error("Failed to check MCP status")}}}const ys=new Dr;function mt(s,e){try{const t=e||process.cwd();if(!s){const i=ws(t);return i.length===0?null:i[0]}const n=un(s,t);if(L.existsSync(n)){const i=L.statSync(n),r=new Date;if(r.getTime()-i.mtime.getTime()>gs)return et(s,t),null;const a=L.readFileSync(n,"utf8"),l=JSON.parse(a);if(l.isRunning){const u=new Date(l.lastActivity).getTime();if(r.getTime()-u>gs)return et(s,t),null}return l}}catch{s&&e&&et(s,e)}return null}c(mt,"getMcpStatus");function ws(s){try{const e=s||process.cwd(),t=ln(e);if(!L.existsSync(Se))return[];const n=L.readdirSync(Se),i=[];for(const r of n){const o=r.match(new RegExp(`^mcp-${t}-(\\d+)\\.json$`));if(o){const a=parseInt(o[1],10),l=mt(a,e);l&&i.push(l)}}return i.sort((r,o)=>new Date(o.startTime).getTime()-new Date(r.startTime).getTime())}catch{return[]}}c(ws,"getAllMcpStatusFiles");function cn(s){try{const t={...mt(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};L.existsSync(Se)||L.mkdirSync(Se,{recursive:!0});const n=un(s.processId,s.cwd);L.writeFileSync(n,JSON.stringify(t,null,2))}catch{}}c(cn,"updateMcpStatus");function et(s,e){try{const t=e||process.cwd();if(s){const n=un(s,t);L.existsSync(n)&&L.unlinkSync(n)}else{const n=ln(t);if(L.existsSync(Se)){const i=L.readdirSync(Se);for(const r of i)r.match(new RegExp(`^mcp-${n}-\\d+\\.json$`))&&L.unlinkSync(P.join(Se,r))}}}catch{}}c(et,"clearMcpStatus");function Pr(s,e){const t=mt(s,e);t&&cn({processId:s,cwd:e,totalRequests:t.totalRequests+1,lastRequestTime:new Date().toISOString(),lastActivity:new Date().toISOString()})}c(Pr,"trackToolExecution");function ln(s){return er("md5").update(s).digest("hex").slice(0,8)}c(ln,"getCwdHash");function un(s,e){const t=ln(e);return P.join(Se,`mcp-${t}-${s}.json`)}c(un,"getStatusFilePath");function gt({cwd:s,children:e}){const t=s||process.cwd();return pe(()=>(ys.start(),()=>{ys.stop()}),[]),m(Tr,{cwd:t,children:m(Or,{children:m(zi,{value:{fetcher:Ir()},children:e})})})}c(gt,"Layout");const fn=[{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=P.join(process.cwd(),".mcp.json"),e={mcpServers:{membrane:{command:"membrane",args:["mcp"],env:{AGENT_NAME:"Claude Code"}}}};let t={};if(L.existsSync(s))try{t=JSON.parse(L.readFileSync(s,"utf8"))}catch{t={}}const n={...t,mcpServers:{...t.mcpServers,...e.mcpServers}};return L.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=P.join(process.cwd(),".cursor"),e=P.join(s,"mcp.json");L.existsSync(s)||L.mkdirSync(s);const t={mcpServers:{membrane:{command:"membrane",args:["mcp"],env:{AGENT_NAME:"Cursor"}}}};let n={};if(L.existsSync(e))try{n=JSON.parse(L.readFileSync(e,"utf8"))}catch{n={}}const i={...n,mcpServers:{...n.mcpServers,...t.mcpServers}};return L.writeFileSync(e,JSON.stringify(i,null,2)),`MCP server configuration added to ${e}`},"addConfig")}];function Mr({onExit:s,onComplete:e}){const[t,n]=_(0),[i,r]=_(!1),[o,a]=_(null),[l,u]=_(""),[p,h]=_("");De((w,d)=>{if(l||p){(d.escape||w==="q"||d.return)&&e();return}if(i)d.return||w===" "?f(o):d.escape&&(r(!1),a(null));else if(d.escape)s();else if(d.upArrow||w==="k")n(Math.max(0,t-1));else if(d.downArrow||w==="j")n(Math.min(fn.length-1,t+1));else if(d.return||w===" "){const y=fn[t];a(y),r(!0)}});const f=c(w=>{try{const d=w.addConfig();u(d)}catch(d){h(`Failed to write configuration: ${d.message||d}`)}},"addMcpConfiguration"),g=Math.min(80,process.stdout.columns||80);return l?E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(S,{color:"green",children:"Success"})]})}),E(b,{flexDirection:"column",paddingLeft:2,children:[m(S,{color:"green",children:l}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"The agent will now be able to use Membrane's integration capabilities."})})]}),m(b,{marginTop:1,paddingLeft:2,children:m(S,{color:"white",children:"[esc/q/enter: exit]"})})]}):p?E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(S,{color:"red",children:"Error"})]})}),m(b,{flexDirection:"column",paddingLeft:2,children:m(S,{color:"red",children:p})}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"[esc/q/enter: exit]"})})]}):i&&o?E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(S,{color:"cyan",children:"Confirmation"})]})}),E(b,{flexDirection:"column",paddingLeft:2,children:[E(S,{children:["Connect ",m(S,{bold:!0,children:o.name})," to Membrane via MCP?"]}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"This will add an MCP server configuration that allows the agent to use Membrane's integration capabilities."})}),m(b,{marginTop:1,children:m(S,{color:"yellow",bold:!0,children:o.actionDescription})}),m(b,{marginTop:2,marginBottom:1,children:E(S,{children:[m(S,{color:"white",bold:!0,children:"[Enter] Confirm"})," ",m(S,{color:"gray",children:"[Esc] Cancel"})]})})]})]}):E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(S,{color:"cyan",children:"Select Agent"})]})}),E(b,{flexDirection:"column",paddingLeft:2,children:[m(S,{color:"grey",children:"Choose an agent to connect to Membrane via MCP:"}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"This will add an MCP server configuration that allows the agent to use Membrane's integration capabilities."})}),m(b,{marginTop:1,flexDirection:"column",children:fn.map((w,d)=>E(b,{children:[E(S,{color:t===d?"cyan":"white",children:[t===d?"\u25B6 ":" ",w.name]}),E(S,{color:"grey",children:[" \u2014 ",w.description]})]},w.id))})]}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"[\u2191\u2193: select] [enter: choose] [esc: exit]"})})]})}c(Mr,"AddMcpServerScreen");function Rr(){const[s,e]=_(null),[t,n]=_([]),[i,r]=_(null);return pe(()=>{const o=c(({status:l})=>{e(l),r(null)},"handleMcpStatusChanged"),a=c(({servers:l})=>{n(l),r(null)},"handleMcpServersChanged");return z.on(Y.McpStatusChanged,o),z.on(Y.McpServersChanged,a),()=>{z.off(Y.McpStatusChanged,o),z.off(Y.McpServersChanged,a)}},[]),{mcpStatus:s,allMcpServers:t,error:i,isRunning:s?.isRunning||!1,toolsCount:s?.toolsCount||0,totalRequests:s?.totalRequests||0,lastActivity:s?.lastActivity,processId:s?.processId,serverCount:t.length}}c(Rr,"useMcpStatus");function jr(){const{error:s,serverCount:e,allMcpServers:t}=Rr(),n=Math.min(100,process.stdout.columns||100);return E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:n,children:[m(b,{marginTop:-1,marginBottom:0,flexDirection:"column",children:E(S,{bold:!0,children:["\u{1F916} Connected AI Agents:"," ",s?m(S,{color:"red",children:"error reading status"}):e===0?m(S,{color:"yellow",children:"none"}):m(S,{color:"green",children:e})]})}),!s&&e===0&&m(b,{marginTop:1,children:E(S,{color:"grey",children:["Connect your AI agents to Membrane.",m(Gi,{}),"It will give them tools and context to build integrations."]})}),t.length>0&&m(b,{flexDirection:"column",paddingLeft:2,marginTop:1,children:t.map((i,r)=>m(b,{children:E(S,{color:"grey",children:["#",r+1," ",i.agentName,": ",i.totalRequests," calls"]})},i.processId))}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"[a: connect an agent]"})})]})}c(jr,"Agent");function bs({onExit:s,showEscOption:e=!0}){const[t,n]=_(""),{data:i,error:r,isLoading:o}=as("/account"),{updateConfig:a,isLoading:l}=Ze(),u=i?.workspaces,p=o||l;if(De((y,C)=>{C.escape&&s?.()}),p)return E(b,{children:[m(pt,{}),m(S,{children:" Fetching workspaces..."})]});if(r)return E(b,{flexDirection:"column",children:[E(S,{color:"red",children:["Error: ",r.message]}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"Press ESC to go back"})})]});const h=u?.filter(y=>y.name.toLowerCase().includes(t.toLowerCase()))??[],f=h.map(y=>({label:y.name,value:y.id})),g=f.length,w=u?.length??0;async function d(y){const C=h.find(T=>T.id===y);if(!C)return;const{key:v,secret:O}=C;!v||!O||(await a({workspaceKey:v,workspaceSecret:O}),s?.())}return c(d,"handleSelect"),E(b,{flexDirection:"column",borderStyle:"round",borderTop:!0,width:70,paddingX:1,children:[m(b,{marginTop:-1,children:m(S,{bold:!0,children:"\u{1F4C1} Select your workspace"})}),E(b,{marginTop:1,children:[m(S,{children:"Search: "}),m(or,{placeholder:"Enter a search query...",onChange:n})]}),w>5&&E(S,{children:["Showing ",g," of ",w," workspaces."]}),m(b,{marginTop:1,children:m(ar,{options:f,onChange:c(y=>{y&&d(y)},"onChange")})}),e&&m(b,{marginTop:1,children:m(S,{color:"grey",children:"Press ESC to go back"})})]})}c(bs,"SelectWorkspace");function Kr({currentPat:s,onSubmit:e}){const[t,n]=_(""),[i,r]=_(!1),[o,a]=_(null);return E(b,{flexDirection:"column",borderStyle:"round",borderTop:!0,width:70,paddingX:1,children:[m(b,{marginTop:-1,marginBottom:1,children:m(S,{bold:!0,children:"\u{1F511} Enter your Personal Access Token"})}),m(S,{children:"Please provide your Personal Access Token. You can find it here:"}),m(b,{marginTop:1,marginBottom:1,children:m(S,{color:"yellow",children:"https://console.integration.app/w/0/manage-account/api-token"})}),s&&m(S,{dimColor:!0,children:"Press Enter to keep your current token or type a new one."}),m(cr,{mask:"*",placeholder:`${s?"******":"Enter your token here..."}`,value:t,onChange:n,onSubmit:c(async u=>{a(null),r(!0);try{await e(u),n("")}catch{a("Invalid token. Please try again.")}finally{r(!1)}},"handleSubmit")}),i&&m(b,{marginTop:1,children:E(S,{children:[m(pt,{type:"dots"})," Validating token..."]})}),o&&m(S,{color:"red",children:o})]})}c(Kr,"PersonalAccessTokenInput");var tt=(s=>(s[s.Authenticate=0]="Authenticate",s[s.ConnectWorkspace=1]="ConnectWorkspace",s))(tt||{});const _r={0:"Authenticate in Membrane",1:"Connect a Membrane Workspace"},Ss=c(()=>{const{config:s}=Ze(),e=!!(s?.workspaceKey&&s?.workspaceSecret);return{workspaceIsConfigured:e,isSetupComplete:e}},"useSetup"),hn=[tt.Authenticate,tt.ConnectWorkspace];function Cs({onComplete:s}){const[e,t]=_(!1),[n,i]=_(0),{isSetupComplete:r}=Ss(),o=ls(),a=hn[n],l=n+1,u=hn.length,p=hn.map((g,w)=>{let d="pending";return w<n?d="done":w===n&&(d="current"),{id:g,label:_r[g],status:d}});async function h(g){const w=o&&g===""?o:g,d=new us;try{await d.request("/account",{headers:{Authorization:`Bearer ${w}`}}),Er(w),i(y=>y+1)}catch(y){console.error(y)}}c(h,"handlePatSubmit");function f(){t(!0),s&&s()}return c(f,"handleWorkspaceSelected"),De((g,w)=>{r&&w.escape&&s&&s()}),e?m(b,{children:m(S,{children:"\u2705 Setup complete. You are ready to go!"})}):E(b,{flexDirection:"column",alignSelf:"flex-start",gap:1,children:[E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:70,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F6E0}\uFE0F Setup \u2014"," ",E(S,{color:"cyan",children:["Step ",l," of ",u]}),r&&m(S,{color:"grey",children:" [esc: go back]"})]})}),m(b,{flexDirection:"column",paddingLeft:2,children:p.map(g=>m(Fr,{status:g.status,label:g.label},g.id))})]}),a===tt.Authenticate&&m(Kr,{currentPat:o,onSubmit:h}),a===tt.ConnectWorkspace&&m(bs,{onExit:f,showEscOption:!1})]})}c(Cs,"Setup");function Fr({status:s,label:e}){return E(b,{children:[E(b,{width:2,children:[s==="current"&&m(pt,{type:"dots"}),s==="done"&&m(S,{children:"\u2705"})]}),m(S,{dimColor:s!=="current",children:e})]})}c(Fr,"StepDisplay");const ie={[j.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")},[j.Connector]:{element:"connector",elements:"connectors",exportable:!1},[j.Action]:{element:"action",elements:"actions",integrationSpecific:!0,exportCleanup:c(s=>(delete s.integration,s),"exportCleanup")},[j.AppDataSchema]:{element:"appDataSchema",elements:"appDataSchemas"},[j.AppEventType]:{element:"appEventType",elements:"appEventTypes"},[j.DataLinkTable]:{element:"dataLinkTable",elements:"dataLinkTables"},[j.DataSource]:{element:"dataSource",elements:"dataSources",parentKey:"universalDataSourceId",integrationSpecific:!0},[j.FieldMapping]:{element:"fieldMapping",elements:"fieldMappings",integrationSpecific:!0,parentKey:"universalFieldMappingId",exportCleanup:c(s=>(delete s.dataSourceId,s),"exportCleanup")},[j.Flow]:{element:"flow",elements:"flows",integrationSpecific:!0,parentKey:"universalFlowId"}};function Br(s){return delete s.workspaceId,delete s.createdAt,delete s.updatedAt,delete s.revision,delete s.parentRevision,Object.keys(s).map(e=>{e.match(/universal.*Revision/g)&&delete s[e]}),s}c(Br,"baseExportCleanup");class ks{static{c(this,"ElementsCache")}elements=new Map;typeIndex=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)}remove(e){const t=e.id,n=this.elements.delete(t);if(n){const i=this.typeIndex.get(e.type);i&&(i.delete(t),i.size===0&&this.typeIndex.delete(e.type))}return n}put(e){this.elements.has(e.id)&&this.remove(e),this.add(e)}get(e){return this.elements.get(e)}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()}getAllIds(){return new Set(this.elements.keys())}}class vs{static{c(this,"ElementsManager")}cache;handler;connectorsMapping;constructor(e){this.cache=new ks,this.handler=e}async refresh(){try{const e=new ks,t=await this.handler.getIntegrations();e.addAll(t);const n=[j.Integration,j.Connector],i=Object.keys(ie),r=await Promise.all(i.filter(o=>!n.includes(o)).map(async o=>this.handler.getElementsByType(o,t)));for(const o of r)e.addAll(o);this.cache.clear(),this.cache.addAll(e.getAll())}catch(e){throw $.error(`Failed to refresh elements: ${e instanceof Error?e.message:"Unknown error"}`),e}}async putElement(e){let t,n=this.cache.get(e.id);try{e.data.id&&n?(t="update",n=await this.handler.updateElement(e,n,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping})):(t="create",n=await this.handler.createElement(e,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping})),this.cache.put(n)}catch(i){$.error(`Failed to ${t} element ${e.type}/${e.key} ${e.integrationKey?`for integration ${e.integrationKey}`:""} (${e.id}): ${i instanceof Error?i.message:"Unknown error"}`)}}async deleteElement(e){try{await this.handler.deleteElement(e,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping}),this.cache.remove(e)}catch(t){$.error(`Failed to delete element: ${t instanceof Error?t.message:"Unknown error"}`)}}setConnectorsMapping(e){this.connectorsMapping=e}}async function Ur(s,e="full"){const t={};$.info("[connectors] Getting remote workspace data");const n=await s.integrations.findAll();t.integration=n.map(i=>dn("integration",i));for(const i of Object.keys(ie)){const r=ie[i];if(r.exportable===!1)continue;const o=[];$.info(`[connectors] Reading ${r.elements} from remote workspace`);const a=await s[r.elements].findAll();if(o.push(...a.map(l=>dn(i,l))),r.integrationSpecific)for(const l of n){const u=await s[r.elements].findAll({integrationId:l.id});o.push(...u.map(p=>(p.integrationKey=l.key,dn(i,p))))}o.length>0&&e=="full"&&(console.table(o.map(l=>({key:l.key,integrationKey:l.integrationKey,universal:!l.integrationKey})).reduce((l,u)=>(l||(l={}),l[u.key]||(l[u.key]={}),u.universal&&(l[u.key].universal=!0),u.integrationKey&&(l[u.key].integration?l[u.key].integration+=` ${u.integrationKey}`:l[u.key].integration=u.integrationKey),l),{})),console.groupEnd()),t[i]=o}return $.success("[connectors] Remote workspace data retrieved successfully"),t}c(Ur,"getWorkspaceData");function dn(s,e){return e=Br(e),ie[s].exportCleanup?ie[s].exportCleanup(e):e}c(dn,"cleanUpForExport");const Es="connectors",Is="development",pn={};async function qr({integrations:s,allConnectors:e=!1}){const t=kr(),n=await be.getClient(process.cwd()),i=new Set,r={};for(const o of s){const a=o.connectorId,l=o.connectorVersion;if(!r[a]?.has(o.connectorVersion)){const u=await Ts({client:n,connectorId:a}),h=!!u.workspaceId||e;if(!u?.key){$.error(`[connectors] Connector ${a} has no key. Skipping..`);continue}h&&(i.has(a)||(await Yr({basePath:t,connector:u}),i.add(a)),r[a]||(r[a]=new Set),r[a].has(l)||(await zr({client:n,connector:u,connectorVersion:l,basePath:t}),r[a].add(l)))}}}c(qr,"pullConnectors");async function Jr(){const s=await be.getClient(process.cwd()),e=await Ur(s,"minified"),n=(await s.get("org-workspace-id")).id,i={};$.info("[connectors] Loading custom connectors");const r=s,o=await r.get(`/connectors?workspaceId=${n}`);$.info("[connectors] Loading public connectors"),e.connector=o;const a=mn(),u=(R.existsSync(a)?R.readdirSync(a):[]).filter(p=>{if(p.startsWith("."))return!1;const h=B.join(a,p);try{return R.statSync(h).isDirectory()}catch{return!1}});for(const p of u){$.info(`[connectors] Loading connector from: ${p}`);const h=R.readdirSync(B.join(a,p)),f=await Wr(p);if("baseUri"in f&&delete f.baseUri,f.uuid&&e.connector?.find(w=>w.uuid==f.uuid))i[f.id]=e.connector.find(w=>w.uuid==f.uuid).id,$.info(`[connectors] Matched ${f.name} uuid: ${f.uuid}`);else if(!i[f.id]){let w=!1;try{const d=await Ts({client:s,connectorId:f.id});d&&!d.workspaceId&&(w=!0)}catch{}if(!w){$.info(`[connectors] Creating custom connector ${f.name} (${f.key})`);const d=await r.post("connectors",{...f,workspaceId:n});i[f.id]=d.id}}const g=h.filter(w=>R.statSync(B.join(a,p,w)).isDirectory());for(const w of g)await Hr({client:s,connector:f,version:w,connectorId:i[f.id]})}return i}c(Jr,"pushConnectors");function mn(){const s=on();return B.join(s.membraneDirPath,Es)}c(mn,"getConnectorsPath");async function Wr(s){return ae.load(R.readFileSync(B.join(mn(),s,`${s}.yml`),"utf8"))}c(Wr,"readConnector");async function Gr(s,e){return $.info(`[connectors] Zipping ${s} into ${e}`),new Promise((t,n)=>{const i=R.createWriteStream(e),r=lr("zip",{zlib:{level:9}});i.on("close",()=>{$.success(`[connectors] Successfully created ${e}`),t()}),i.on("end",()=>{$.info("[connectors] Data has been drained")}),r.on("warning",a=>{a.code==="ENOENT"?console.warn(a):n(a)}),r.on("error",a=>{n(a)}),r.pipe(i);const o=R.readdirSync(s);for(const a of o){const l=B.join(s,a),u=R.statSync(l);u.isFile()?r.file(l,{name:a}):u.isDirectory()&&r.directory(l,a)}r.finalize()})}c(Gr,"createZipArchive");async function Vr(s,e){return $.info(`[connectors] Unzipping into ${e}`),new Promise((t,n)=>{const i=fr.Parse();i.on("entry",r=>{const o=r.path;if(r.type==="Directory"){const l=B.join(e,o);R.mkdirSync(l,{recursive:!0}),r.autodrain()}else{const l=B.join(e,o),u=B.dirname(l);R.mkdirSync(u,{recursive:!0});const p=R.createWriteStream(l);r.pipe(p),p.on("finish",()=>{console.debug(`Extracted: ${o}`)})}}),i.on("end",()=>{$.success(`[connectors] Successfully extracted to ${e}`),t()}),i.on("error",r=>{n(r)}),i.write(s),i.end()})}c(Vr,"extractZipArchive");async function Hr({client:s,connector:e,version:t,connectorId:n}){const i=B.join(mn(),yt(e),Ns(t)),r=B.join(i,"src"),o=B.join(i,"src.zip"),a=R.existsSync(o);if(R.existsSync(r)&&($.info(`[connectors] Archiving source code for ${e.name} version ${t}`),await Gr(r,o)),!R.existsSync(o)){$.warning(`[connectors] No source code found for ${e.name} version ${t}`);return}try{const l=new ur;if(l.append("file",R.createReadStream(o),"file.zip"),$.info(`[connectors] Pushing connector version ${t} for ${e.name}`),t==Is)$.info(`[connectors] Uploading connector ${n}`),await s.post(`connectors/${n}/upload`,l,{headers:{...l.getHeaders()}});else{if(l.append("version",t),l.append("changelog","Imported Version"),(await s.get(`/connectors/${n}/versions`)).find(p=>p.version==t)){$.info(`[connectors] Version ${t} already published`);return}$.info(`[connectors] Publishing version ${t} of connector ${n}`),await s.post(`connectors/${n}/publish-version`,l,{headers:{...l.getHeaders()}})}$.success(`Successfully pushed connector version ${t} for ${e.name}`)}catch(l){$.error(`Error pushing connector version ${t} for ${e.name}: ${l}`)}finally{!a&&R.existsSync(o)&&($.info(`[connectors] Cleaning up temporary zip file for ${e.name} version ${t}`),R.unlinkSync(o))}}c(Hr,"pushConnectorVersion");async function Ts({client:s,connectorId:e}){if(pn[e])return pn[e];const t=await s.get(`connectors/${e}`);return pn[e]=t,t}c(Ts,"getConnector");async function Yr({basePath:s,connector:e}){const t=yt(e),n=B.join(s,Es,t);R.mkdirSync(n,{recursive:!0});const i=B.join(n,`${yt(e)}.yml`);R.writeFileSync(i,ae.dump(e)),$.info(`[connectors] Pulled connector ${e.name}`)}c(Yr,"pullConnector");async function zr({client:s,connector:e,connectorVersion:t,basePath:n}){const i=yt(e),r=Ns(t),o=B.join(n,"connectors",i,r),a=await s.get(`connectors/${e.id}/download`,{version:t},{responseType:"arraybuffer",headers:{Accept:"application/zip"},timeout:1e6});R.mkdirSync(o,{recursive:!0});const l=B.join(o,"src.zip");R.writeFileSync(l,a);const u=B.join(o,"src");R.existsSync(u)&&await Vr(a,u),$.info(`[connectors] Pulled connector version: ${e.name} (${r})`)}c(zr,"pullConnectorVersion");function yt(s){return s.key}c(yt,"getConnectorDirName");function Ns(s){return s??Is}c(Ns,"getConnectorVersionDirName");const M={NOT_SYNCED:"not_synced",PULLING:"pulling",PUSHING:"pushing",RESOLVING:"resolving",CONFLICTS:"conflicts",SYNCED:"synced",WATCHING:"watching",ERROR:"error"},Qr="membrane",Xr=["**/node_modules/**","**/.git/**","**/.DS_Store","**/Thumbs.db","**/*.tmp","**/*.swp","**/*.swo","**/*.log","**/*.lock","**/dist/**","**/build/**","**/.cache/**","**/.next/**","**/.vscode/**","**/.idea/**"];function wt(s){return P.join(s,Qr)}c(wt,"getMembraneDir");const Zr=["id","workspaceId","integrationId","createdAt","updatedAt","revision","parentRevision","archivedAt","baseUri","state"],As=[j.Action,j.FieldMapping,j.Flow,j.DataSource];class V{static{c(this,"Element")}type;key;integrationKey;data;constructor(e,t,n,i){if(!i)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=i,this.integrationKey=n||V.extractIntegrationKey(i)}get id(){return V.makeId(this.type,this.key,this.integrationKey)}get dirPath(){const e=me[this.type].apiPath;if(this.integrationKey){const t=me[j.Integration].apiPath;return P.join(t,this.integrationKey,e,this.key)}return P.join(e,this.key)}get path(){return P.join(this.dirPath,"spec.yaml")}get relativePath(){return P.relative(wt(process.cwd()),this.path)}isEqual(e){if(this.id!==e.id)return!1;const t=this.clean(),n=e.clean();return hr(t,n)}hasParent(){const e=this.getParentKey();return!!e&&!!this.data?.[e]}clean(){const e={...this.data};return Zr.forEach(t=>{delete e[t]}),Object.keys(e).forEach(t=>{t.match(/universal.*Revision/)&&delete e[t]}),e}getParentKey(){let e="parentId";return ie?.[this.type]?.parentKey&&(e=ie?.[this.type]?.parentKey),e}static new(e,t,n,i){return new V(e,t,n,i)}static fromData(e,t){if(!t?.key)throw new Error(`Element missing key: ${JSON.stringify(t)}`);const n=this.extractIntegrationKey(t);return new V(e,t.key,n,t)}static fromPathAndData(e,t){const n=V.parsePath(e);if(!t)return;const i=t?.key||n?.key;return n?V.new(n.type,i,n.integrationKey,t):void 0}static fromElement(e){return new V(e.type,e.key,e.integrationKey,{...e.data})}static idFromPath(e){const t=V.parsePath(e);if(t)return V.makeId(t.type,t.key,t.integrationKey)}static makeId(e,t,n){return e===j.Integration?`${e}:${t}`:V.isIntegrationSpecific(e)?`${n||"universal"}:${e}:${t}`:`${e}:${t}`}static parsePath(e){const t=this.getRelativePath(e);if(this.isConnectorFile(t)||!this.isElementFile(t))return;const n=Object.values(me).map(l=>l.apiPath).join("|"),i=new RegExp(`^(?<elementType>${n})/(?<elementKey>[^/]+)/spec\\.ya?ml$`),r=t.match(i);if(r?.groups){const{elementType:l,elementKey:u}=r.groups,p=this.getElementTypeFromPath(l);if(p)return{type:p,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:p}=a.groups,h=this.getElementTypeFromPath(u);if(h)return{type:h,key:p,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 isConnectorFile(e){const[t]=e.split(P.sep);return t===me[j.Connector].apiPath}static getElementTypeFromPath(e){return Object.values(j).find(t=>me[t].apiPath===e)}static getRelativePath(e){return P.relative(wt(process.cwd()),e)}static isIntegrationSpecific(e){return As.includes(e)}static canBeIntegrationSpecific(e){return As.includes(e)}}class eo{static{c(this,"LocalElementsHandler")}basePath;constructor(){this.basePath=wt(process.cwd())}async getElementsByType(e,t){const n=[],i=P.join(this.basePath,me[e].apiPath),r=await this.readElementsInDir(i);n.push(...r);for(const o of t){const a=P.join(this.basePath,me[j.Integration].apiPath,o.key,me[e].apiPath),l=await this.readElementsInDir(a);n.push(...l)}return n.length>0&&$.success(`[local] Fetched ${n.length} ${e}${n.length!==1?"s":""}`),n}async fetchElement(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=P.join(this.basePath,t.dirPath),i=P.join(this.basePath,t.path);return L.existsSync(n)||L.mkdirSync(n,{recursive:!0}),L.writeFileSync(i,ae.dump(e.data)),$.info(`[local] Written ${t.relativePath}`),t}async deleteElement(e){const t=P.join(this.basePath,e.path),n=P.join(this.basePath,e.dirPath);L.existsSync(t)&&L.rmSync(t,{force:!0}),this.pruneEmptyDir(n),$.info(`[local] Deleted ${e.relativePath}`)}async getIntegrations(){const e=P.join(this.basePath,me[j.Integration].apiPath);return this.readElementsInDir(e)}async readElement(e){if(!L.existsSync(e))return;const t=L.readFileSync(e,"utf8"),n=ae.load(t);if(n)return V.fromPathAndData(e,n)}async readElementsInDir(e){const t=[];if(!L.existsSync(e))return t;const n=L.readdirSync(e);if(n.length===0)return t;const i=n.map(async o=>{const a=P.join(e,o,"spec.yaml");return this.readElement(a)});return(await Promise.all(i)).filter(o=>o!=null)}pruneEmptyDir(e){try{if(!e.startsWith(this.basePath)||e===this.basePath||!L.existsSync(e)||L.readdirSync(e).length>0)return;L.rmdirSync(e),this.pruneEmptyDir(P.dirname(e))}catch(t){console.warn(`Failed to prune empty directory ${e}:`,t)}}}class to{static{c(this,"RemoteElementsHandler")}client;async getElementsByType(e,t){const n=await this.findAll(e);if(!V.canBeIntegrationSpecific(e))return n;for(const i of t){const r=i.key,o=i.data.id,a=await this.findAll(e,{integrationKey:r,integrationId:o});n.push(...a)}return n.length>0&&$.success(`[remote] Fetched ${n.length} ${e}${n.length!==1?"s":""}`),n}async fetchElement(e){const n=await(await this.getClient())[ie[e.type].element](e.data.id).get();return V.fromData(e.type,n)}async createElement(e,t){const n=e.clean(),i=await this.getClient();this.transformElementForCreate(e,n,t),e.key==="download-document-by-id"&&$.info(`CREATE ${e.id}:`+JSON.stringify(n));const r=await i[ie[e.type].elements].create(n),o=V.fromData(e.type,r);return $.info(`[remote] Created ${o.id}`),o}async updateElement(e,t,n){if(!e.data.id)throw new Error("Element must have an id to update");const i=e.clean(),r=await this.getClient();this.transformElementForUpdate(e,i,n);const o=await r[ie[e.type].element](t.data.id).put(i),a=V.fromData(t.type,o);return $.info(`[remote] Updated ${t.id}`),a}async deleteElement(e){if(!e.data.id)throw new Error("Element must have an id to delete");await(await this.getClient())[ie[e.type].element](e.data.id).archive(),$.info(`[remote] Deleted ${e.id}`)}async getIntegrations(){const n=(await(await this.getClient()).integrations.findAll()).map(i=>V.fromData(j.Integration,i));return n.length>0&&$.success(`[remote] Fetched ${n.length} integrations`),n}transformElementForCreate(e,t,n){if(e.integrationKey){const i=n.elements.find(r=>r.type===j.Integration&&r.key===e.integrationKey);if(i)t.integrationId=i.data.id;else throw new Error(`Integration ${e.integrationKey} not found. Integrations: ${n.elements.filter(r=>r.type===j.Integration).map(r=>r.key).join(", ")}`)}if(e.type===j.Integration){const i=n.connectorsMapping?.[t.connectorId];i&&(t.connectorId=i)}}transformElementForUpdate(e,t,n){if(e.type===j.Integration){const i=n.connectorsMapping?.[t.connectorId];i&&(t.connectorId=i)}}async findAll(e,t={}){return(await(await this.getClient())[ie[e].elements].findAll(t)).filter(r=>r.key).map(r=>V.fromData(e,r))}async getClient(){return this.client||(this.client=await be.getClient(process.cwd())),this.client}}const gn=Symbol.for("yaml.alias"),yn=Symbol.for("yaml.document"),Ce=Symbol.for("yaml.map"),Os=Symbol.for("yaml.pair"),fe=Symbol.for("yaml.scalar"),Re=Symbol.for("yaml.seq"),re=Symbol.for("yaml.node.type"),ke=c(s=>!!s&&typeof s=="object"&&s[re]===gn,"isAlias"),Te=c(s=>!!s&&typeof s=="object"&&s[re]===yn,"isDocument"),je=c(s=>!!s&&typeof s=="object"&&s[re]===Ce,"isMap"),F=c(s=>!!s&&typeof s=="object"&&s[re]===Os,"isPair"),K=c(s=>!!s&&typeof s=="object"&&s[re]===fe,"isScalar$1"),Ke=c(s=>!!s&&typeof s=="object"&&s[re]===Re,"isSeq");function q(s){if(s&&typeof s=="object")switch(s[re]){case Ce:case Re:return!0}return!1}c(q,"isCollection$1");function J(s){if(s&&typeof s=="object")switch(s[re]){case gn:case Ce:case fe:case Re:return!0}return!1}c(J,"isNode");const $s=c(s=>(K(s)||q(s))&&!!s.anchor,"hasAnchor"),te=Symbol("break visit"),Ls=Symbol("skip children"),he=Symbol("remove node");function Ne(s,e){const t=xs(e);Te(s)?_e(null,s.contents,t,Object.freeze([s]))===he&&(s.contents=null):_e(null,s,t,Object.freeze([]))}c(Ne,"visit$1"),Ne.BREAK=te,Ne.SKIP=Ls,Ne.REMOVE=he;function _e(s,e,t,n){const i=Ds(s,e,t,n);if(J(i)||F(i))return Ps(s,n,i),_e(s,i,t,n);if(typeof i!="symbol"){if(q(e)){n=Object.freeze(n.concat(e));for(let r=0;r<e.items.length;++r){const o=_e(r,e.items[r],t,n);if(typeof o=="number")r=o-1;else{if(o===te)return te;o===he&&(e.items.splice(r,1),r-=1)}}}else if(F(e)){n=Object.freeze(n.concat(e));const r=_e("key",e.key,t,n);if(r===te)return te;r===he&&(e.key=null);const o=_e("value",e.value,t,n);if(o===te)return te;o===he&&(e.value=null)}}return i}c(_e,"visit_");async function bt(s,e){const t=xs(e);Te(s)?await Fe(null,s.contents,t,Object.freeze([s]))===he&&(s.contents=null):await Fe(null,s,t,Object.freeze([]))}c(bt,"visitAsync"),bt.BREAK=te,bt.SKIP=Ls,bt.REMOVE=he;async function Fe(s,e,t,n){const i=await Ds(s,e,t,n);if(J(i)||F(i))return Ps(s,n,i),Fe(s,i,t,n);if(typeof i!="symbol"){if(q(e)){n=Object.freeze(n.concat(e));for(let r=0;r<e.items.length;++r){const o=await Fe(r,e.items[r],t,n);if(typeof o=="number")r=o-1;else{if(o===te)return te;o===he&&(e.items.splice(r,1),r-=1)}}}else if(F(e)){n=Object.freeze(n.concat(e));const r=await Fe("key",e.key,t,n);if(r===te)return te;r===he&&(e.key=null);const o=await Fe("value",e.value,t,n);if(o===te)return te;o===he&&(e.value=null)}}return i}c(Fe,"visitAsync_");function xs(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(xs,"initVisitor");function Ds(s,e,t,n){if(typeof t=="function")return t(s,e,n);if(je(e))return t.Map?.(s,e,n);if(Ke(e))return t.Seq?.(s,e,n);if(F(e))return t.Pair?.(s,e,n);if(K(e))return t.Scalar?.(s,e,n);if(ke(e))return t.Alias?.(s,e,n)}c(Ds,"callVisitor");function Ps(s,e,t){const n=e[e.length-1];if(q(n))n.items[s]=t;else if(F(n))s==="key"?n.key=t:n.value=t;else if(Te(n))n.contents=t;else{const i=ke(n)?"alias":"scalar";throw new Error(`Cannot replace node with ${i} parent`)}}c(Ps,"replaceNode");const no={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},so=c(s=>s.replace(/[!,[\]{}]/g,e=>no[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]+/),i=n.shift();switch(i){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;const[r,o]=n;return this.tags[r]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;const[r]=n;if(r==="1.1"||r==="1.2")return this.yaml.version=r,!0;{const o=/^\d+\.\d+$/.test(r);return t(6,`Unsupported YAML version ${r}`,o),!1}}default:return t(0,`Unknown directive ${i}`,!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,i]=e.match(/^(.*!)([^!]*)$/s);i||t(`The ${e} tag has no suffix`);const r=this.tags[n];if(r)try{return r+decodeURIComponent(i)}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+so(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 i;if(e&&n.length>0&&J(e.contents)){const r={};Ne(e.contents,(o,a)=>{J(a)&&a.tag&&(r[a.tag]=!0)}),i=Object.keys(r)}else i=[];for(const[r,o]of n)r==="!!"&&o==="tag:yaml.org,2002:"||(!e||i.some(a=>a.startsWith(o)))&&t.push(`%TAG ${r} ${o}`);return t.join(`
|
|
3
|
-
`)}}
|
|
4
|
-
`)?
|
|
2
|
+
var qi=Object.defineProperty;var c=(s,e)=>qi(s,"name",{value:e,configurable:!0});import{jsx as m,jsxs as E,Fragment as Qt}from"react/jsx-runtime";import*as D from"node:path";import{resolve as Ji,dirname as Wi,join as Gi}from"node:path";import{useInput as Pe,Box as b,Text as S,Newline as Vi,render as pt}from"ink";import Hi from"minimist";import De,{createContext as Xt,useContext as Zt,useState as K,useEffect as me,useCallback as is,useMemo as Yi,useRef as zi}from"react";import{SWRConfig as Qi}from"swr";import rs from"os";import B from"path";import Xi from"conf";import*as L from"node:fs";import{readFileSync as Zi}from"node:fs";import ce from"js-yaml";import{z as U}from"zod";import*as er from"node:crypto";import{createHash as tr}from"node:crypto";import*as nr from"node:os";import{EventEmitter as sr}from"events";import{IntegrationAppClient as os,WorkspaceElementType as j,extractIntegrationAppErrorData as se,WorkspaceElementSpecs as ge,setValueAtLocator as en,getDataCollectionCreateFields as tn,excludeWriteOnlyFieldsFromSchema as as,valueToSchema as mt,getRequiredFieldsFromSchema as ir,getValueAtLocator as rr,walkSchema as cs,makeDataLocationPath as ls,getDataCollectionUpdateFields as nn}from"@membranehq/sdk";import sn from"jsonwebtoken";import{exec as or}from"node:child_process";import{TextInput as ar,Select as cr}from"@inkjs/ui";import gt from"ink-spinner";import us from"swr/immutable";import lr from"ink-text-input";import M from"fs";import ur from"archiver";import fr from"form-data";import hr from"unzipper";import dr from"lodash/isEqual.js";import pr from"chokidar";import{fileURLToPath as mr}from"node:url";import k from"chalk";import{Command as gr}from"commander";import rn from"axios";import{FastMCP as yr}from"fastmcp";import on from"lodash/merge.js";import wr from"@anthropic-ai/sdk";import{faker as Xe}from"@faker-js/faker";import br from"lodash/template.js";import Sr from"lodash/templateSettings.js";const Cr="membrane",kr="membrane.config.yml",an="https://api.integration.app";function cn(){const s=process.cwd(),e=D.join(s,Cr),t=D.join(s,kr),n=e,i=D.join(n,"workspace.yaml");return{membraneDirPath:e,configPath:t,payloadDirPath:n,workspaceDataFilePath:i}}c(cn,"getPaths");function vr(){return cn().membraneDirPath}c(vr,"getBasePath");const Er={pat:{type:"string"},workspace:{type:"object"}},fs=new Xi({schema:Er,configName:"config",cwd:B.join(rs.homedir(),".membrane")}),Ir=c(s=>{fs.set("pat",s)},"setPat"),hs=c(()=>fs.get("pat"),"getPat");class ds{static{c(this,"AccountApiClient")}constructor(e=an){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 o=hs();if(!o)throw new Error("Personal Access Token not found.");n.set("Authorization",`Bearer ${o}`)}t.body&&!n.has("Content-Type")&&n.set("Content-Type","application/json");const i=await fetch(`${this.apiBaseUrl}${e}`,{...t,headers:n});if(!i.ok){const o=await i.text();throw new Error(`API request failed: ${i.status} ${i.statusText} - ${o}`)}if(i.status===204)return{};const r=await i.text();return JSON.parse(r)}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 Tr=c(s=>{const e=new ds(an);return t=>e.get(t)},"createAccountApiFetcher"),ps=Xt(process.cwd());function Nr({cwd:s,children:e}){return m(ps.Provider,{value:s,children:e})}c(Nr,"CwdProvider");function ms(){return Zt(ps)}c(ms,"useCwd");const Ar="membrane.config.yml";function Me(s){const e=D.join(s??process.cwd(),Ar);try{const t=L.readFileSync(e,"utf8"),n=ce.load(t),i=ln.safeParse(n);return i.success?i.data:null}catch{return null}}c(Me,"readProjectConfig");const Or="membrane.config.yml",ln=U.object({workspaceKey:U.string().optional(),workspaceSecret:U.string().optional(),apiUri:U.string().optional(),testCustomerId:U.string().optional(),anthropicApiKey:U.string().optional()});U.enum(["pull"]);const gs=Xt(void 0);function $r({children:s}){const e=ms(),[t,n]=K(null),[i,r]=K(!0);me(()=>{const u=Me(e);n(u),r(!1)},[e]);const o=is(u=>{const p=D.join(e,Or),f={...Me(e)??{},...u},g=ln.safeParse(f);return g.success?(L.writeFileSync(p,ce.dump(g.data)),n(g.data),!0):!1},[e]),a=is(()=>!!(t?.workspaceKey&&t?.workspaceSecret),[t]),l={config:t,isLoading:i,updateConfig:o,validateConfig:a};return m(gs.Provider,{value:l,children:s})}c($r,"ProjectConfigProvider");function Ze(){const s=Zt(gs);if(s===void 0)throw new Error("useProjectConfig must be used within a ProjectConfigProvider");return s}c(Ze,"useProjectConfig");const Y={LogAdded:"logAdded",StateChanged:"stateChanged",StatsChanged:"statsChanged",ConflictsChanged:"conflictsChanged",McpStatusChanged:"mcpStatusChanged",McpServersChanged:"mcpServersChanged"};class ys extends sr{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)}}class Lr{static{c(this,"MembraneClient")}client=null;currentConfig=null;tokenExpiry=0;async generateAccessToken(e,t){return sn.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=Me(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 os({token:t,apiUri:e.apiUri})}async getClient(e=process.cwd()){const t=this.getCurrentConfig(e);if(!t)throw new Error("Unable to create IntegrationAppClient: No workspace configuration found.");const n=!this.currentConfig||this.currentConfig.workspaceKey!==t.workspaceKey||this.currentConfig.workspaceSecret!==t.workspaceSecret||this.currentConfig.apiUri!==t.apiUri,i=!this.isTokenValid()||this.tokenExpiry-Date.now()<3e5;return(!this.client||n||i)&&(this.client=await this.createClient(t)),this.client}clearClient(){this.client=null,this.currentConfig=null,this.tokenExpiry=0}getCurrentConfigInfo(){return this.currentConfig}}const fe=new Lr;async function ws(s){const e=await fe.getClient(s);if(!e)throw new Error("No workspace configuration found");return(await e.get("org-workspace-id")).id}c(ws,"getWorkspaceId");class xr extends ys{static{c(this,"WorkspaceNotifications")}constructor(e){super(),this.config=e,this.setupProcessCleanup()}connectedToRemote=!1;clientId;heartbeatInterval;get isInitialized(){return this.connectedToRemote}async connectToRemote(){if(!this.connectedToRemote)try{await this.registerWithRemoteServer(),await this.startHeartbeatLoop(),this.connectedToRemote=!0}catch{}}async setState(e){this.emit(Y.StateChanged,{state:e}),await this.emitRemote({status:e})}setConflicts(e){this.emit(Y.ConflictsChanged,{conflicts:e})}setStats(e){this.emit(Y.StatsChanged,{stats:e})}addLog(e){this.emit(Y.LogAdded,{log:e})}setMcpStatus(e){this.emit(Y.McpStatusChanged,{status:e})}async setMcpServers(e){this.emit(Y.McpServersChanged,{servers:e}),await this.emitRemote({mcpServers:e.map(t=>({name:t.agentName,totalRequests:t.totalRequests}))})}async shutdown(){this.connectedToRemote&&await this.cleanup()}async cleanup(){if(this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=void 0),this.clientId)try{await(await fe.getClient(process.cwd())).delete(`/local-clients/${this.clientId}`)}catch{}this.connectedToRemote=!1,this.clientId=void 0}async registerWithRemoteServer(){const t=await(await fe.getClient(process.cwd())).post("/local-clients",{hostname:rs.hostname(),workingDirectory:process.cwd()});this.clientId=t.id}async startHeartbeatLoop(){this.heartbeatInterval=setInterval(async()=>{if(this.connectedToRemote&&this.clientId)try{await this.sendHeartbeat()}catch{}},this.config.heartbeatIntervalMs)}async sendHeartbeat(){if(!this.clientId)return;await(await fe.getClient(process.cwd())).post(`/local-clients/${this.clientId}/keep-alive`,{})}async emitRemote(e){if(this.clientId&&this.connectedToRemote)try{await(await fe.getClient(process.cwd())).patch(`/local-clients/${this.clientId}`,e)}catch{}}setupProcessCleanup(){const e=c(async()=>{await this.shutdown()},"cleanup");process.on("SIGINT",async()=>{await e(),process.exit(0)}),process.on("SIGTERM",async()=>{await e(),process.exit(0)}),process.on("beforeExit",()=>e()),process.on("uncaughtException",async()=>{await e(),process.exit(1)}),process.on("unhandledRejection",async()=>{await e(),process.exit(1)})}}const z=new xr({heartbeatIntervalMs:15e3});class Pr{static{c(this,"WorkspaceLogger")}_logs;workspaceNotifications;constructor(){this._logs=[],this.workspaceNotifications=z}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),this.workspaceNotifications.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")}clear(){this._logs=[]}}const O=new Pr,Se=D.join(nr.tmpdir(),"membrane-mcp-status"),bs=3e4;class Dr{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=yt(void 0,e),n=Cs(e);t&&z.setMcpStatus(t),await z.setMcpServers(n)}catch{O.error("Failed to check MCP status")}}}const Ss=new Dr;function yt(s,e){try{const t=e||process.cwd();if(!s){const i=Cs(t);return i.length===0?null:i[0]}const n=hn(s,t);if(L.existsSync(n)){const i=L.statSync(n),r=new Date;if(r.getTime()-i.mtime.getTime()>bs)return et(s,t),null;const a=L.readFileSync(n,"utf8"),l=JSON.parse(a);if(l.isRunning){const u=new Date(l.lastActivity).getTime();if(r.getTime()-u>bs)return et(s,t),null}return l}}catch{s&&e&&et(s,e)}return null}c(yt,"getMcpStatus");function Cs(s){try{const e=s||process.cwd(),t=fn(e);if(!L.existsSync(Se))return[];const n=L.readdirSync(Se),i=[];for(const r of n){const o=r.match(new RegExp(`^mcp-${t}-(\\d+)\\.json$`));if(o){const a=parseInt(o[1],10),l=yt(a,e);l&&i.push(l)}}return i.sort((r,o)=>new Date(o.startTime).getTime()-new Date(r.startTime).getTime())}catch{return[]}}c(Cs,"getAllMcpStatusFiles");function un(s){try{const t={...yt(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};L.existsSync(Se)||L.mkdirSync(Se,{recursive:!0});const n=hn(s.processId,s.cwd);L.writeFileSync(n,JSON.stringify(t,null,2))}catch{}}c(un,"updateMcpStatus");function et(s,e){try{const t=e||process.cwd();if(s){const n=hn(s,t);L.existsSync(n)&&L.unlinkSync(n)}else{const n=fn(t);if(L.existsSync(Se)){const i=L.readdirSync(Se);for(const r of i)r.match(new RegExp(`^mcp-${n}-\\d+\\.json$`))&&L.unlinkSync(D.join(Se,r))}}}catch{}}c(et,"clearMcpStatus");function Mr(s,e){const t=yt(s,e);t&&un({processId:s,cwd:e,totalRequests:t.totalRequests+1,lastRequestTime:new Date().toISOString(),lastActivity:new Date().toISOString()})}c(Mr,"trackToolExecution");function fn(s){return tr("md5").update(s).digest("hex").slice(0,8)}c(fn,"getCwdHash");function hn(s,e){const t=fn(e);return D.join(Se,`mcp-${t}-${s}.json`)}c(hn,"getStatusFilePath");function wt({cwd:s,children:e}){const t=s||process.cwd();return me(()=>(Ss.start(),()=>{Ss.stop()}),[]),m(Nr,{cwd:t,children:m($r,{children:m(Qi,{value:{fetcher:Tr()},children:e})})})}c(wt,"Layout");const dn=[{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=D.join(process.cwd(),".mcp.json"),e={mcpServers:{membrane:{command:"membrane",args:["mcp"],env:{AGENT_NAME:"Claude Code"}}}};let t={};if(L.existsSync(s))try{t=JSON.parse(L.readFileSync(s,"utf8"))}catch{t={}}const n={...t,mcpServers:{...t.mcpServers,...e.mcpServers}};return L.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=D.join(process.cwd(),".cursor"),e=D.join(s,"mcp.json");L.existsSync(s)||L.mkdirSync(s);const t={mcpServers:{membrane:{command:"membrane",args:["mcp"],env:{AGENT_NAME:"Cursor"}}}};let n={};if(L.existsSync(e))try{n=JSON.parse(L.readFileSync(e,"utf8"))}catch{n={}}const i={...n,mcpServers:{...n.mcpServers,...t.mcpServers}};return L.writeFileSync(e,JSON.stringify(i,null,2)),`MCP server configuration added to ${e}`},"addConfig")}];function Rr({onExit:s,onComplete:e}){const[t,n]=K(0),[i,r]=K(!1),[o,a]=K(null),[l,u]=K(""),[p,h]=K("");Pe((w,d)=>{if(l||p){(d.escape||w==="q"||d.return)&&e();return}if(i)d.return||w===" "?f(o):d.escape&&(r(!1),a(null));else if(d.escape)s();else if(d.upArrow||w==="k")n(Math.max(0,t-1));else if(d.downArrow||w==="j")n(Math.min(dn.length-1,t+1));else if(d.return||w===" "){const y=dn[t];a(y),r(!0)}});const f=c(w=>{try{const d=w.addConfig();u(d)}catch(d){h(`Failed to write configuration: ${d.message||d}`)}},"addMcpConfiguration"),g=Math.min(80,process.stdout.columns||80);return l?E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(S,{color:"green",children:"Success"})]})}),E(b,{flexDirection:"column",paddingLeft:2,children:[m(S,{color:"green",children:l}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"The agent will now be able to use Membrane's integration capabilities."})})]}),m(b,{marginTop:1,paddingLeft:2,children:m(S,{color:"white",children:"[esc/q/enter: exit]"})})]}):p?E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(S,{color:"red",children:"Error"})]})}),m(b,{flexDirection:"column",paddingLeft:2,children:m(S,{color:"red",children:p})}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"[esc/q/enter: exit]"})})]}):i&&o?E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(S,{color:"cyan",children:"Confirmation"})]})}),E(b,{flexDirection:"column",paddingLeft:2,children:[E(S,{children:["Connect ",m(S,{bold:!0,children:o.name})," to Membrane via MCP?"]}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"This will add an MCP server configuration that allows the agent to use Membrane's integration capabilities."})}),m(b,{marginTop:1,children:m(S,{color:"yellow",bold:!0,children:o.actionDescription})}),m(b,{marginTop:2,marginBottom:1,children:E(S,{children:[m(S,{color:"white",bold:!0,children:"[Enter] Confirm"})," ",m(S,{color:"gray",children:"[Esc] Cancel"})]})})]})]}):E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:g,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F517} Connect Agent \u2014 ",m(S,{color:"cyan",children:"Select Agent"})]})}),E(b,{flexDirection:"column",paddingLeft:2,children:[m(S,{color:"grey",children:"Choose an agent to connect to Membrane via MCP:"}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"This will add an MCP server configuration that allows the agent to use Membrane's integration capabilities."})}),m(b,{marginTop:1,flexDirection:"column",children:dn.map((w,d)=>E(b,{children:[E(S,{color:t===d?"cyan":"white",children:[t===d?"\u25B6 ":" ",w.name]}),E(S,{color:"grey",children:[" \u2014 ",w.description]})]},w.id))})]}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"[\u2191\u2193: select] [enter: choose] [esc: exit]"})})]})}c(Rr,"AddMcpServerScreen");function jr(){const[s,e]=K(null),[t,n]=K([]),[i,r]=K(null);return me(()=>{const o=c(({status:l})=>{e(l),r(null)},"handleMcpStatusChanged"),a=c(({servers:l})=>{n(l),r(null)},"handleMcpServersChanged");return z.on(Y.McpStatusChanged,o),z.on(Y.McpServersChanged,a),()=>{z.off(Y.McpStatusChanged,o),z.off(Y.McpServersChanged,a)}},[]),{mcpStatus:s,allMcpServers:t,error:i,isRunning:s?.isRunning||!1,toolsCount:s?.toolsCount||0,totalRequests:s?.totalRequests||0,lastActivity:s?.lastActivity,processId:s?.processId,serverCount:t.length}}c(jr,"useMcpStatus");function Fr(){const{error:s,serverCount:e,allMcpServers:t}=jr(),n=Math.min(100,process.stdout.columns||100);return E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:n,children:[m(b,{marginTop:-1,marginBottom:0,flexDirection:"column",children:E(S,{bold:!0,children:["\u{1F916} Connected AI Agents:"," ",s?m(S,{color:"red",children:"error reading status"}):e===0?m(S,{color:"yellow",children:"none"}):m(S,{color:"green",children:e})]})}),!s&&e===0&&m(b,{marginTop:1,children:E(S,{color:"grey",children:["Connect your AI agents to Membrane.",m(Vi,{}),"It will give them tools and context to build integrations."]})}),t.length>0&&m(b,{flexDirection:"column",paddingLeft:2,marginTop:1,children:t.map((i,r)=>m(b,{children:E(S,{color:"grey",children:["#",r+1," ",i.agentName,": ",i.totalRequests," calls"]})},i.processId))}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"[a: connect an agent]"})})]})}c(Fr,"Agent");function ks({onExit:s,showEscOption:e=!0}){const[t,n]=K(""),{data:i,error:r,isLoading:o}=us("/account"),{updateConfig:a,isLoading:l}=Ze(),u=i?.workspaces,p=o||l;if(Pe((y,C)=>{C.escape&&s?.()}),p)return E(b,{children:[m(gt,{}),m(S,{children:" Fetching workspaces..."})]});if(r)return E(b,{flexDirection:"column",children:[E(S,{color:"red",children:["Error: ",r.message]}),m(b,{marginTop:1,children:m(S,{color:"grey",children:"Press ESC to go back"})})]});const h=u?.filter(y=>y.name.toLowerCase().includes(t.toLowerCase()))??[],f=h.map(y=>({label:y.name,value:y.id})),g=f.length,w=u?.length??0;async function d(y){const C=h.find(T=>T.id===y);if(!C)return;const{key:v,secret:$}=C;!v||!$||(await a({workspaceKey:v,workspaceSecret:$}),s?.())}return c(d,"handleSelect"),E(b,{flexDirection:"column",borderStyle:"round",borderTop:!0,width:70,paddingX:1,children:[m(b,{marginTop:-1,children:m(S,{bold:!0,children:"\u{1F4C1} Select your workspace"})}),E(b,{marginTop:1,children:[m(S,{children:"Search: "}),m(ar,{placeholder:"Enter a search query...",onChange:n})]}),w>5&&E(S,{children:["Showing ",g," of ",w," workspaces."]}),m(b,{marginTop:1,children:m(cr,{options:f,onChange:c(y=>{y&&d(y)},"onChange")})}),e&&m(b,{marginTop:1,children:m(S,{color:"grey",children:"Press ESC to go back"})})]})}c(ks,"SelectWorkspace");function Kr({currentPat:s,onSubmit:e}){const[t,n]=K(""),[i,r]=K(!1),[o,a]=K(null);return E(b,{flexDirection:"column",borderStyle:"round",borderTop:!0,width:70,paddingX:1,children:[m(b,{marginTop:-1,marginBottom:1,children:m(S,{bold:!0,children:"\u{1F511} Enter your Personal Access Token"})}),m(S,{children:"Please provide your Personal Access Token. You can find it here:"}),m(b,{marginTop:1,marginBottom:1,children:m(S,{color:"yellow",children:"https://console.integration.app/w/0/manage-account/api-token"})}),s&&m(S,{dimColor:!0,children:"Press Enter to keep your current token or type a new one."}),m(lr,{mask:"*",placeholder:`${s?"******":"Enter your token here..."}`,value:t,onChange:n,onSubmit:c(async u=>{a(null),r(!0);try{await e(u),n("")}catch{a("Invalid token. Please try again.")}finally{r(!1)}},"handleSubmit")}),i&&m(b,{marginTop:1,children:E(S,{children:[m(gt,{type:"dots"})," Validating token..."]})}),o&&m(S,{color:"red",children:o})]})}c(Kr,"PersonalAccessTokenInput");var tt=(s=>(s[s.Authenticate=0]="Authenticate",s[s.ConnectWorkspace=1]="ConnectWorkspace",s))(tt||{});const _r={0:"Authenticate in Membrane",1:"Connect a Membrane Workspace"},vs=c(()=>{const{config:s}=Ze(),e=!!(s?.workspaceKey&&s?.workspaceSecret);return{workspaceIsConfigured:e,isSetupComplete:e}},"useSetup"),pn=[tt.Authenticate,tt.ConnectWorkspace];function Es({onComplete:s}){const[e,t]=K(!1),[n,i]=K(0),{isSetupComplete:r}=vs(),o=hs(),a=pn[n],l=n+1,u=pn.length,p=pn.map((g,w)=>{let d="pending";return w<n?d="done":w===n&&(d="current"),{id:g,label:_r[g],status:d}});async function h(g){const w=o&&g===""?o:g,d=new ds;try{await d.request("/account",{headers:{Authorization:`Bearer ${w}`}}),Ir(w),i(y=>y+1)}catch(y){console.error(y)}}c(h,"handlePatSubmit");function f(){t(!0),s&&s()}return c(f,"handleWorkspaceSelected"),Pe((g,w)=>{r&&w.escape&&s&&s()}),e?m(b,{children:m(S,{children:"\u2705 Setup complete. You are ready to go!"})}):E(b,{flexDirection:"column",alignSelf:"flex-start",gap:1,children:[E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:70,children:[m(b,{marginTop:-1,marginBottom:1,children:E(S,{bold:!0,children:["\u{1F6E0}\uFE0F Setup \u2014"," ",E(S,{color:"cyan",children:["Step ",l," of ",u]}),r&&m(S,{color:"grey",children:" [esc: go back]"})]})}),m(b,{flexDirection:"column",paddingLeft:2,children:p.map(g=>m(Br,{status:g.status,label:g.label},g.id))})]}),a===tt.Authenticate&&m(Kr,{currentPat:o,onSubmit:h}),a===tt.ConnectWorkspace&&m(ks,{onExit:f,showEscOption:!1})]})}c(Es,"Setup");function Br({status:s,label:e}){return E(b,{children:[E(b,{width:2,children:[s==="current"&&m(gt,{type:"dots"}),s==="done"&&m(S,{children:"\u2705"})]}),m(S,{dimColor:s!=="current",children:e})]})}c(Br,"StepDisplay");const re={[j.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")},[j.Connector]:{element:"connector",elements:"connectors",exportable:!1},[j.Action]:{element:"action",elements:"actions",integrationSpecific:!0,exportCleanup:c(s=>(delete s.integration,s),"exportCleanup")},[j.AppDataSchema]:{element:"appDataSchema",elements:"appDataSchemas"},[j.AppEventType]:{element:"appEventType",elements:"appEventTypes"},[j.DataLinkTable]:{element:"dataLinkTable",elements:"dataLinkTables"},[j.DataSource]:{element:"dataSource",elements:"dataSources",parentKey:"universalDataSourceId",integrationSpecific:!0},[j.FieldMapping]:{element:"fieldMapping",elements:"fieldMappings",integrationSpecific:!0,parentKey:"universalFieldMappingId",exportCleanup:c(s=>(delete s.dataSourceId,s),"exportCleanup")},[j.Flow]:{element:"flow",elements:"flows",integrationSpecific:!0,parentKey:"universalFlowId"}};function Ur(s){return delete s.workspaceId,delete s.createdAt,delete s.updatedAt,delete s.revision,delete s.parentRevision,Object.keys(s).map(e=>{e.match(/universal.*Revision/g)&&delete s[e]}),s}c(Ur,"baseExportCleanup");class Is{static{c(this,"ElementsCache")}elements=new Map;typeIndex=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)}remove(e){const t=e.id,n=this.elements.delete(t);if(n){const i=this.typeIndex.get(e.type);i&&(i.delete(t),i.size===0&&this.typeIndex.delete(e.type))}return n}put(e){this.elements.has(e.id)&&this.remove(e),this.add(e)}get(e){return this.elements.get(e)}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()}getAllIds(){return new Set(this.elements.keys())}}class Ts{static{c(this,"ElementsManager")}cache;handler;connectorsMapping;constructor(e){this.cache=new Is,this.handler=e}async refresh(){try{const e=new Is,t=await this.handler.getIntegrations();e.addAll(t);const n=[j.Integration,j.Connector],i=Object.keys(re),r=await Promise.all(i.filter(o=>!n.includes(o)).map(async o=>this.handler.getElementsByType(o,t)));for(const o of r)e.addAll(o);this.cache.clear(),this.cache.addAll(e.getAll())}catch(e){throw O.error(`Failed to refresh elements: ${se(e)?.message??"Unknown error"}`),e}}async putElement(e){let t,n=this.cache.get(e.id);try{e.data.id&&n?(t="update",n=await this.handler.updateElement(e,n,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping})):(t="create",n=await this.handler.createElement(e,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping})),this.cache.put(n)}catch(i){O.error(`Failed to ${t} element ${e.type}/${e.key} ${e.integrationKey?`for integration ${e.integrationKey}`:""} (${e.id}): ${i instanceof Error?i.message:"Unknown error"}`)}}async deleteElement(e){try{await this.handler.deleteElement(e,{elements:this.cache.getAll(),connectorsMapping:this.connectorsMapping}),this.cache.remove(e)}catch(t){O.error(`Failed to delete element: ${t instanceof Error?t.message:"Unknown error"}`)}}setConnectorsMapping(e){this.connectorsMapping=e}}async function qr(s,e="full"){const t={};O.info("[connectors] Getting remote workspace data");const n=await s.integrations.findAll();t.integration=n.map(i=>mn("integration",i));for(const i of Object.keys(re)){const r=re[i];if(r.exportable===!1)continue;const o=[];O.info(`[connectors] Reading ${r.elements} from remote workspace`);const a=await s[r.elements].findAll();if(o.push(...a.map(l=>mn(i,l))),r.integrationSpecific)for(const l of n){const u=await s[r.elements].findAll({integrationId:l.id});o.push(...u.map(p=>(p.integrationKey=l.key,mn(i,p))))}o.length>0&&e=="full"&&(console.table(o.map(l=>({key:l.key,integrationKey:l.integrationKey,universal:!l.integrationKey})).reduce((l,u)=>(l||(l={}),l[u.key]||(l[u.key]={}),u.universal&&(l[u.key].universal=!0),u.integrationKey&&(l[u.key].integration?l[u.key].integration+=` ${u.integrationKey}`:l[u.key].integration=u.integrationKey),l),{})),console.groupEnd()),t[i]=o}return O.success("[connectors] Remote workspace data retrieved successfully"),t}c(qr,"getWorkspaceData");function mn(s,e){return e=Ur(e),re[s].exportCleanup?re[s].exportCleanup(e):e}c(mn,"cleanUpForExport");const nt="connectors",st="development",gn={};async function Jr({integrations:s,allConnectors:e=!1}){const t=vr(),n=await fe.getClient(process.cwd()),i=new Set,r={};for(const o of s){const a=o.connectorId,l=o.connectorVersion;if(!r[a]?.has(o.connectorVersion)){const u=await Ns({client:n,connectorId:a}),h=!!u.workspaceId||e;if(!u?.key){O.error(`[connectors] Connector ${a} has no key. Skipping..`);continue}h&&(i.has(a)||(await Yr({basePath:t,connector:u}),i.add(a)),r[a]||(r[a]=new Set),r[a].has(l)||(await zr({client:n,connector:u,connectorVersion:l,basePath:t}),r[a].add(l)))}}}c(Jr,"pullConnectors");async function Wr(){const s=await fe.getClient(process.cwd()),e=await qr(s,"minified"),n=(await s.get("org-workspace-id")).id,i={};O.info("[connectors] Loading custom connectors");const r=s,o=await r.get(`/connectors?workspaceId=${n}`);O.info("[connectors] Loading public connectors"),e.connector=o;const a=yn(),u=(M.existsSync(a)?M.readdirSync(a):[]).filter(p=>{if(p.startsWith("."))return!1;const h=B.join(a,p);try{return M.statSync(h).isDirectory()}catch{return!1}});for(const p of u){O.info(`[connectors] Loading connector from: ${p}`);const h=M.readdirSync(B.join(a,p)),f=await wn(p);if("baseUri"in f&&delete f.baseUri,f.uuid&&e.connector?.find(w=>w.uuid==f.uuid))i[f.id]=e.connector.find(w=>w.uuid==f.uuid).id,O.info(`[connectors] Matched ${f.name} uuid: ${f.uuid}`);else if(!i[f.id]){let w=!1;try{const d=await Ns({client:s,connectorId:f.id});d&&!d.workspaceId&&(w=!0)}catch{}if(!w){O.info(`[connectors] Creating custom connector ${f.name} (${f.key})`);const d=await r.post("connectors",{...f,workspaceId:n});i[f.id]=d.id}}const g=h.filter(w=>M.statSync(B.join(a,p,w)).isDirectory());for(const w of g)await Hr({client:s,connector:f,version:w,connectorId:i[f.id]})}return i}c(Wr,"pushConnectors");function yn(){const s=cn();return B.join(s.membraneDirPath,nt)}c(yn,"getConnectorsPath");async function wn(s){return ce.load(M.readFileSync(B.join(yn(),s,`${s}.yml`),"utf8"))}c(wn,"readConnector");async function Gr(s,e){return O.info(`[connectors] Zipping ${s} into ${e}`),new Promise((t,n)=>{const i=M.createWriteStream(e),r=ur("zip",{zlib:{level:9}});i.on("close",()=>{O.success(`[connectors] Successfully created ${e}`),t()}),i.on("end",()=>{O.info("[connectors] Data has been drained")}),r.on("warning",a=>{a.code==="ENOENT"?console.warn(a):n(a)}),r.on("error",a=>{n(a)}),r.pipe(i);const o=M.readdirSync(s);for(const a of o){const l=B.join(s,a),u=M.statSync(l);u.isFile()?r.file(l,{name:a}):u.isDirectory()&&r.directory(l,a)}r.finalize()})}c(Gr,"createZipArchive");async function Vr(s,e){return O.info(`[connectors] Unzipping into ${e}`),new Promise((t,n)=>{const i=hr.Parse();i.on("entry",r=>{const o=r.path;if(r.type==="Directory"){const l=B.join(e,o);M.mkdirSync(l,{recursive:!0}),r.autodrain()}else{const l=B.join(e,o),u=B.dirname(l);M.mkdirSync(u,{recursive:!0});const p=M.createWriteStream(l);r.pipe(p),p.on("finish",()=>{console.debug(`Extracted: ${o}`)})}}),i.on("end",()=>{O.success(`[connectors] Successfully extracted to ${e}`),t()}),i.on("error",r=>{n(r)}),i.write(s),i.end()})}c(Vr,"extractZipArchive");async function Hr({client:s,connector:e,version:t,connectorId:n}){const i=B.join(yn(),bt(e),As(t)),r=B.join(i,"src"),o=B.join(i,"src.zip"),a=M.existsSync(o);if(M.existsSync(r)&&(O.info(`[connectors] Archiving source code for ${e.name} version ${t}`),await Gr(r,o)),!M.existsSync(o)){O.warning(`[connectors] No source code found for ${e.name} version ${t}`);return}try{const l=new fr;if(l.append("file",M.createReadStream(o),"file.zip"),O.info(`[connectors] Pushing connector version ${t} for ${e.name}`),t==st)O.info(`[connectors] Uploading connector ${n}`),await s.post(`connectors/${n}/upload`,l,{headers:{...l.getHeaders()}});else{if(l.append("version",t),l.append("changelog","Imported Version"),(await s.get(`/connectors/${n}/versions`)).find(p=>p.version==t)){O.info(`[connectors] Version ${t} already published`);return}O.info(`[connectors] Publishing version ${t} of connector ${n}`),await s.post(`connectors/${n}/publish-version`,l,{headers:{...l.getHeaders()}})}O.success(`Successfully pushed connector version ${t} for ${e.name}`)}catch(l){O.error(`Error pushing connector version ${t} for ${e.name}: ${l}`)}finally{!a&&M.existsSync(o)&&(O.info(`[connectors] Cleaning up temporary zip file for ${e.name} version ${t}`),M.unlinkSync(o))}}c(Hr,"pushConnectorVersion");async function Ns({client:s,connectorId:e}){if(gn[e])return gn[e];const t=await s.get(`connectors/${e}`);return gn[e]=t,t}c(Ns,"getConnector");async function Yr({basePath:s,connector:e}){const t=bt(e),n=B.join(s,nt,t);M.mkdirSync(n,{recursive:!0});const i=B.join(n,`${bt(e)}.yml`);M.writeFileSync(i,ce.dump(e)),O.info(`[connectors] Pulled connector ${e.name}`)}c(Yr,"pullConnector");async function zr({client:s,connector:e,connectorVersion:t,basePath:n}){const i=bt(e),r=As(t),o=B.join(n,"connectors",i,r),a=await s.get(`connectors/${e.id}/download`,{version:t},{responseType:"arraybuffer",headers:{Accept:"application/zip"},timeout:1e6});M.mkdirSync(o,{recursive:!0});const l=B.join(o,"src.zip");if(M.writeFileSync(l,a),!t){const u=B.join(o,"src");M.mkdirSync(u,{recursive:!0}),await Vr(a,u)}O.info(`[connectors] Pulled connector version: ${e.name} (${r})`)}c(zr,"pullConnectorVersion");function bt(s){return s.key}c(bt,"getConnectorDirName");function As(s){return s??st}c(As,"getConnectorVersionDirName");function Qr(s){return s.match(`${nt}/[^/]+/${st}/src/.*`)!==null}c(Qr,"isConnectorSourceFile");async function Xr(s){const e=s.match(`${nt}/([^/]+)/${st}/src/(.*)`);if(!e)return;const t=e[1],n=e[2],i=await wn(t);if(!i){O.warning(`[connectors] Connector ${t} not found. Ignoring file change`);return}const r=i.id,o=M.readFileSync(s,"utf-8");await(await fe.getClient()).put(`connectors/${r}/files/${n}`,o,{headers:{"Content-Type":"text/plain"}}),O.info(`[connectors] Pushed file ${n} for connector ${i.name}`)}c(Xr,"putConnectorFile");async function Zr(s){const e=s.match(`${nt}/([^/]+)/${st}/src/(.*)`);if(!e)return;const t=e[1],n=e[2],i=await wn(t);if(!i){O.warning(`[connectors] Connector ${t} not found. Ignoring file change`);return}const r=i.id;await(await fe.getClient()).delete(`connectors/${r}/files/${n}`),O.info(`[connectors] Deleted file ${n} for connector ${i.name}`)}c(Zr,"deleteConnectorFile");const R={NOT_SYNCED:"not_synced",PULLING:"pulling",PUSHING:"pushing",RESOLVING:"resolving",CONFLICTS:"conflicts",SYNCED:"synced",WATCHING:"watching",ERROR:"error"},eo="membrane",to=["**/node_modules/**","**/.git/**","**/.DS_Store","**/Thumbs.db","**/*.tmp","**/*.swp","**/*.swo","**/*.log","**/*.lock","**/.cache/**","**/.next/**","**/.vscode/**","**/.idea/**"];function St(s){return D.join(s,eo)}c(St,"getMembraneDir");const no=["id","workspaceId","integrationId","createdAt","updatedAt","revision","parentRevision","archivedAt","baseUri","state"],Os=[j.Action,j.FieldMapping,j.Flow,j.DataSource];class V{static{c(this,"Element")}type;key;integrationKey;data;constructor(e,t,n,i){if(!i)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=i,this.integrationKey=n||V.extractIntegrationKey(i)}get id(){return V.makeId(this.type,this.key,this.integrationKey)}get dirPath(){const e=ge[this.type].apiPath;if(this.integrationKey){const t=ge[j.Integration].apiPath;return D.join(t,this.integrationKey,e,this.key)}return D.join(e,this.key)}get path(){return D.join(this.dirPath,"spec.yaml")}get relativePath(){return D.relative(St(process.cwd()),this.path)}isEqual(e){if(this.id!==e.id)return!1;const t=this.clean(),n=e.clean();return dr(t,n)}hasParent(){const e=this.getParentKey();return!!e&&!!this.data?.[e]}clean(){const e={...this.data};return no.forEach(t=>{delete e[t]}),Object.keys(e).forEach(t=>{t.match(/universal.*Revision/)&&delete e[t]}),e}getParentKey(){let e="parentId";return re?.[this.type]?.parentKey&&(e=re?.[this.type]?.parentKey),e}static new(e,t,n,i){return new V(e,t,n,i)}static fromData(e,t){if(!t?.key)throw new Error(`Element missing key: ${JSON.stringify(t)}`);const n=this.extractIntegrationKey(t);return new V(e,t.key,n,t)}static fromPathAndData(e,t){const n=V.parsePath(e);if(!t)return;const i=t?.key||n?.key;return n?V.new(n.type,i,n.integrationKey,t):void 0}static fromElement(e){return new V(e.type,e.key,e.integrationKey,{...e.data})}static idFromPath(e){const t=V.parsePath(e);if(t)return V.makeId(t.type,t.key,t.integrationKey)}static makeId(e,t,n){return e===j.Integration?`${e}:${t}`:V.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(ge).map(l=>l.apiPath).join("|"),i=new RegExp(`^(?<elementType>${n})/(?<elementKey>[^/]+)/spec\\.ya?ml$`),r=t.match(i);if(r?.groups){const{elementType:l,elementKey:u}=r.groups,p=this.getElementTypeFromPath(l);if(p)return{type:p,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:p}=a.groups,h=this.getElementTypeFromPath(u);if(h)return{type:h,key:p,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 isConnectorFile(e){const[t]=e.split(D.sep);return t===ge[j.Connector].apiPath}static getElementTypeFromPath(e){return Object.values(j).find(t=>ge[t].apiPath===e)}static getRelativePath(e){return D.relative(St(process.cwd()),e)}static isIntegrationSpecific(e){return Os.includes(e)}static canBeIntegrationSpecific(e){return Os.includes(e)}}class so{static{c(this,"LocalElementsHandler")}basePath;constructor(){this.basePath=St(process.cwd())}async getElementsByType(e,t){const n=[],i=D.join(this.basePath,ge[e].apiPath),r=await this.readElementsInDir(i);n.push(...r);for(const o of t){const a=D.join(this.basePath,ge[j.Integration].apiPath,o.key,ge[e].apiPath),l=await this.readElementsInDir(a);n.push(...l)}return n.length>0&&O.success(`[local] Fetched ${n.length} ${e}${n.length!==1?"s":""}`),n}async fetchElement(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=D.join(this.basePath,t.dirPath),i=D.join(this.basePath,t.path);return L.existsSync(n)||L.mkdirSync(n,{recursive:!0}),L.writeFileSync(i,ce.dump(e.data)),O.info(`[local] Written ${t.relativePath}`),t}async deleteElement(e){const t=D.join(this.basePath,e.path),n=D.join(this.basePath,e.dirPath);L.existsSync(t)&&L.rmSync(t,{force:!0}),this.pruneEmptyDir(n),O.info(`[local] Deleted ${e.relativePath}`)}async getIntegrations(){const e=D.join(this.basePath,ge[j.Integration].apiPath);return this.readElementsInDir(e)}async readElement(e){if(!L.existsSync(e))return;const t=L.readFileSync(e,"utf8"),n=ce.load(t);if(n)return V.fromPathAndData(e,n)}async readElementsInDir(e){const t=[];if(!L.existsSync(e))return t;const n=L.readdirSync(e);if(n.length===0)return t;const i=n.map(async o=>{const a=D.join(e,o,"spec.yaml");return this.readElement(a)});return(await Promise.all(i)).filter(o=>o!=null)}pruneEmptyDir(e){try{if(!e.startsWith(this.basePath)||e===this.basePath||!L.existsSync(e)||L.readdirSync(e).length>0)return;L.rmdirSync(e),this.pruneEmptyDir(D.dirname(e))}catch(t){console.warn(`Failed to prune empty directory ${e}:`,t)}}}class io{static{c(this,"RemoteElementsHandler")}client;async getElementsByType(e,t){const n=await this.findAll(e);if(!V.canBeIntegrationSpecific(e))return n;for(const i of t){const r=i.key,o=i.data.id,a=await this.findAll(e,{integrationKey:r,integrationId:o});n.push(...a)}return n.length>0&&O.success(`[remote] Fetched ${n.length} ${e}${n.length!==1?"s":""}`),n}async fetchElement(e){const n=await(await this.getClient())[re[e.type].element](e.data.id).get();return V.fromData(e.type,n)}async createElement(e,t){const n=e.clean(),i=await this.getClient();this.transformElementForCreate(e,n,t),e.key==="download-document-by-id"&&O.info(`CREATE ${e.id}:`+JSON.stringify(n));const r=await i[re[e.type].elements].create(n),o=V.fromData(e.type,r);return O.info(`[remote] Created ${o.id}`),o}async updateElement(e,t,n){if(!e.data.id)throw new Error("Element must have an id to update");const i=e.clean(),r=await this.getClient();this.transformElementForUpdate(e,i,n);const o=await r[re[e.type].element](t.data.id).put(i),a=V.fromData(t.type,o);return O.info(`[remote] Updated ${t.id}`),a}async deleteElement(e){if(!e.data.id)throw new Error("Element must have an id to delete");await(await this.getClient())[re[e.type].element](e.data.id).archive(),O.info(`[remote] Deleted ${e.id}`)}async getIntegrations(){const n=(await(await this.getClient()).integrations.findAll()).map(i=>V.fromData(j.Integration,i));return n.length>0&&O.success(`[remote] Fetched ${n.length} integrations`),n}transformElementForCreate(e,t,n){if(e.integrationKey){const i=n.elements.find(r=>r.type===j.Integration&&r.key===e.integrationKey);if(i)t.integrationId=i.data.id;else throw new Error(`Integration ${e.integrationKey} not found. Integrations: ${n.elements.filter(r=>r.type===j.Integration).map(r=>r.key).join(", ")}`)}if(e.type===j.Integration){const i=n.connectorsMapping?.[t.connectorId];i&&(t.connectorId=i)}}transformElementForUpdate(e,t,n){if(e.type===j.Integration){const i=n.connectorsMapping?.[t.connectorId];i&&(t.connectorId=i)}}async findAll(e,t={}){return(await(await this.getClient())[re[e].elements].findAll(t)).filter(r=>r.key).map(r=>V.fromData(e,r))}async getClient(){return this.client||(this.client=await fe.getClient(process.cwd())),this.client}}const bn=Symbol.for("yaml.alias"),Sn=Symbol.for("yaml.document"),Ce=Symbol.for("yaml.map"),$s=Symbol.for("yaml.pair"),he=Symbol.for("yaml.scalar"),Re=Symbol.for("yaml.seq"),oe=Symbol.for("yaml.node.type"),ke=c(s=>!!s&&typeof s=="object"&&s[oe]===bn,"isAlias"),Te=c(s=>!!s&&typeof s=="object"&&s[oe]===Sn,"isDocument"),je=c(s=>!!s&&typeof s=="object"&&s[oe]===Ce,"isMap"),_=c(s=>!!s&&typeof s=="object"&&s[oe]===$s,"isPair"),F=c(s=>!!s&&typeof s=="object"&&s[oe]===he,"isScalar$1"),Fe=c(s=>!!s&&typeof s=="object"&&s[oe]===Re,"isSeq");function q(s){if(s&&typeof s=="object")switch(s[oe]){case Ce:case Re:return!0}return!1}c(q,"isCollection$1");function J(s){if(s&&typeof s=="object")switch(s[oe]){case bn:case Ce:case he:case Re:return!0}return!1}c(J,"isNode");const Ls=c(s=>(F(s)||q(s))&&!!s.anchor,"hasAnchor"),ne=Symbol("break visit"),xs=Symbol("skip children"),de=Symbol("remove node");function Ne(s,e){const t=Ps(e);Te(s)?Ke(null,s.contents,t,Object.freeze([s]))===de&&(s.contents=null):Ke(null,s,t,Object.freeze([]))}c(Ne,"visit$1"),Ne.BREAK=ne,Ne.SKIP=xs,Ne.REMOVE=de;function Ke(s,e,t,n){const i=Ds(s,e,t,n);if(J(i)||_(i))return Ms(s,n,i),Ke(s,i,t,n);if(typeof i!="symbol"){if(q(e)){n=Object.freeze(n.concat(e));for(let r=0;r<e.items.length;++r){const o=Ke(r,e.items[r],t,n);if(typeof o=="number")r=o-1;else{if(o===ne)return ne;o===de&&(e.items.splice(r,1),r-=1)}}}else if(_(e)){n=Object.freeze(n.concat(e));const r=Ke("key",e.key,t,n);if(r===ne)return ne;r===de&&(e.key=null);const o=Ke("value",e.value,t,n);if(o===ne)return ne;o===de&&(e.value=null)}}return i}c(Ke,"visit_");async function Ct(s,e){const t=Ps(e);Te(s)?await _e(null,s.contents,t,Object.freeze([s]))===de&&(s.contents=null):await _e(null,s,t,Object.freeze([]))}c(Ct,"visitAsync"),Ct.BREAK=ne,Ct.SKIP=xs,Ct.REMOVE=de;async function _e(s,e,t,n){const i=await Ds(s,e,t,n);if(J(i)||_(i))return Ms(s,n,i),_e(s,i,t,n);if(typeof i!="symbol"){if(q(e)){n=Object.freeze(n.concat(e));for(let r=0;r<e.items.length;++r){const o=await _e(r,e.items[r],t,n);if(typeof o=="number")r=o-1;else{if(o===ne)return ne;o===de&&(e.items.splice(r,1),r-=1)}}}else if(_(e)){n=Object.freeze(n.concat(e));const r=await _e("key",e.key,t,n);if(r===ne)return ne;r===de&&(e.key=null);const o=await _e("value",e.value,t,n);if(o===ne)return ne;o===de&&(e.value=null)}}return i}c(_e,"visitAsync_");function Ps(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(Ps,"initVisitor");function Ds(s,e,t,n){if(typeof t=="function")return t(s,e,n);if(je(e))return t.Map?.(s,e,n);if(Fe(e))return t.Seq?.(s,e,n);if(_(e))return t.Pair?.(s,e,n);if(F(e))return t.Scalar?.(s,e,n);if(ke(e))return t.Alias?.(s,e,n)}c(Ds,"callVisitor");function Ms(s,e,t){const n=e[e.length-1];if(q(n))n.items[s]=t;else if(_(n))s==="key"?n.key=t:n.value=t;else if(Te(n))n.contents=t;else{const i=ke(n)?"alias":"scalar";throw new Error(`Cannot replace node with ${i} parent`)}}c(Ms,"replaceNode");const ro={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},oo=c(s=>s.replace(/[!,[\]{}]/g,e=>ro[e]),"escapeTagName");class te{static{c(this,"Directives")}constructor(e,t){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},te.defaultYaml,e),this.tags=Object.assign({},te.defaultTags,t)}clone(){const e=new te(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){const e=new te(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:te.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},te.defaultTags);break}return e}add(e,t){this.atNextDocument&&(this.yaml={explicit:te.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},te.defaultTags),this.atNextDocument=!1);const n=e.trim().split(/[ \t]+/),i=n.shift();switch(i){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;const[r,o]=n;return this.tags[r]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;const[r]=n;if(r==="1.1"||r==="1.2")return this.yaml.version=r,!0;{const o=/^\d+\.\d+$/.test(r);return t(6,`Unsupported YAML version ${r}`,o),!1}}default:return t(0,`Unknown directive ${i}`,!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,i]=e.match(/^(.*!)([^!]*)$/s);i||t(`The ${e} tag has no suffix`);const r=this.tags[n];if(r)try{return r+decodeURIComponent(i)}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+oo(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 i;if(e&&n.length>0&&J(e.contents)){const r={};Ne(e.contents,(o,a)=>{J(a)&&a.tag&&(r[a.tag]=!0)}),i=Object.keys(r)}else i=[];for(const[r,o]of n)r==="!!"&&o==="tag:yaml.org,2002:"||(!e||i.some(a=>a.startsWith(o)))&&t.push(`%TAG ${r} ${o}`);return t.join(`
|
|
3
|
+
`)}}te.defaultYaml={explicit:!1,version:"1.2"},te.defaultTags={"!!":"tag:yaml.org,2002:"};function Rs(s){if(/[\x00-\x19\s,[\]{}]/.test(s)){const t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(s)}`;throw new Error(t)}return!0}c(Rs,"anchorIsValid");function js(s){const e=new Set;return Ne(s,{Value(t,n){n.anchor&&e.add(n.anchor)}}),e}c(js,"anchorNames");function Fs(s,e){for(let t=1;;++t){const n=`${s}${t}`;if(!e.has(n))return n}}c(Fs,"findNewAnchor");function ao(s,e){const t=[],n=new Map;let i=null;return{onAnchor:c(r=>{t.push(r),i??(i=js(s));const o=Fs(e,i);return i.add(o),o},"onAnchor"),setAnchors:c(()=>{for(const r of t){const o=n.get(r);if(typeof o=="object"&&o.anchor&&(F(o.node)||q(o.node)))o.node.anchor=o.anchor;else{const a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=r,a}}},"setAnchors"),sourceObjects:n}}c(ao,"createNodeAnchors");function Be(s,e,t,n){if(n&&typeof n=="object")if(Array.isArray(n))for(let i=0,r=n.length;i<r;++i){const o=n[i],a=Be(s,n,String(i),o);a===void 0?delete n[i]:a!==o&&(n[i]=a)}else if(n instanceof Map)for(const i of Array.from(n.keys())){const r=n.get(i),o=Be(s,n,i,r);o===void 0?n.delete(i):o!==r&&n.set(i,o)}else if(n instanceof Set)for(const i of Array.from(n)){const r=Be(s,n,i,i);r===void 0?n.delete(i):r!==i&&(n.delete(i),n.add(r))}else for(const[i,r]of Object.entries(n)){const o=Be(s,n,i,r);o===void 0?delete n[i]:o!==r&&(n[i]=o)}return s.call(e,t,n)}c(Be,"applyReviver");function ae(s,e,t){if(Array.isArray(s))return s.map((n,i)=>ae(n,String(i),t));if(s&&typeof s.toJSON=="function"){if(!t||!Ls(s))return s.toJSON(e,t);const n={aliasCount:0,count:1,res:void 0};t.anchors.set(s,n),t.onCreate=r=>{n.res=r,delete t.onCreate};const i=s.toJSON(e,t);return t.onCreate&&t.onCreate(i),i}return typeof s=="bigint"&&!t?.keep?Number(s):s}c(ae,"toJS");class Cn{static{c(this,"NodeBase")}constructor(e){Object.defineProperty(this,oe,{value:e})}clone(){const e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:i,reviver:r}={}){if(!Te(e))throw new TypeError("A document argument is required");const o={anchors:new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},a=ae(this,"",o);if(typeof i=="function")for(const{count:l,res:u}of o.anchors.values())i(u,l);return typeof r=="function"?Be(r,{"":a},"",a):a}}class kt extends Cn{static{c(this,"Alias")}constructor(e){super(bn),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,t){let n;t?.aliasResolveCache?n=t.aliasResolveCache:(n=[],Ne(e,{Node:c((r,o)=>{(ke(o)||Ls(o))&&n.push(o)},"Node")}),t&&(t.aliasResolveCache=n));let i;for(const r of n){if(r===this)break;r.anchor===this.source&&(i=r)}return i}toJSON(e,t){if(!t)return{source:this.source};const{anchors:n,doc:i,maxAliasCount:r}=t,o=this.resolve(i,t);if(!o){const l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=n.get(o);if(a||(ae(o,null,t),a=n.get(o)),!a||a.res===void 0){const l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(r>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=vt(i,o,n)),a.count*a.aliasCount>r)){const l="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(l)}return a.res}toString(e,t,n){const i=`*${this.source}`;if(e){if(Rs(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){const r=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(r)}if(e.implicitKey)return`${i} `}return i}}function vt(s,e,t){if(ke(e)){const n=e.resolve(s),i=t&&n&&t.get(n);return i?i.count*i.aliasCount:0}else if(q(e)){let n=0;for(const i of e.items){const r=vt(s,i,t);r>n&&(n=r)}return n}else if(_(e)){const n=vt(s,e.key,t),i=vt(s,e.value,t);return Math.max(n,i)}return 1}c(vt,"getAliasCount");const Ks=c(s=>!s||typeof s!="function"&&typeof s!="object","isScalarValue");class x extends Cn{static{c(this,"Scalar")}constructor(e){super(he),this.value=e}toJSON(e,t){return t?.keep?this.value:ae(this.value,e,t)}toString(){return String(this.value)}}x.BLOCK_FOLDED="BLOCK_FOLDED",x.BLOCK_LITERAL="BLOCK_LITERAL",x.PLAIN="PLAIN",x.QUOTE_DOUBLE="QUOTE_DOUBLE",x.QUOTE_SINGLE="QUOTE_SINGLE";const co="tag:yaml.org,2002:";function lo(s,e,t){if(e){const n=t.filter(r=>r.tag===e),i=n.find(r=>!r.format)??n[0];if(!i)throw new Error(`Tag ${e} not found`);return i}return t.find(n=>n.identify?.(s)&&!n.format)}c(lo,"findTagObject");function it(s,e,t){if(Te(s)&&(s=s.contents),J(s))return s;if(_(s)){const h=t.schema[Ce].createNode?.(t.schema,null,t);return h.items.push(s),h}(s instanceof String||s instanceof Number||s instanceof Boolean||typeof BigInt<"u"&&s instanceof BigInt)&&(s=s.valueOf());const{aliasDuplicateObjects:n,onAnchor:i,onTagObj:r,schema:o,sourceObjects:a}=t;let l;if(n&&s&&typeof s=="object"){if(l=a.get(s),l)return l.anchor??(l.anchor=i(s)),new kt(l.anchor);l={anchor:null,node:null},a.set(s,l)}e?.startsWith("!!")&&(e=co+e.slice(2));let u=lo(s,e,o.tags);if(!u){if(s&&typeof s.toJSON=="function"&&(s=s.toJSON()),!s||typeof s!="object"){const h=new x(s);return l&&(l.node=h),h}u=s instanceof Map?o[Ce]:Symbol.iterator in Object(s)?o[Re]:o[Ce]}r&&(r(u),delete t.onTagObj);const p=u?.createNode?u.createNode(t.schema,s,t):typeof u?.nodeClass?.from=="function"?u.nodeClass.from(t.schema,s,t):new x(s);return e?p.tag=e:u.default||(p.tag=u.tag),l&&(l.node=p),p}c(it,"createNode");function Et(s,e,t){let n=t;for(let i=e.length-1;i>=0;--i){const r=e[i];if(typeof r=="number"&&Number.isInteger(r)&&r>=0){const o=[];o[r]=n,n=o}else n=new Map([[r,n]])}return it(n,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:c(()=>{throw new Error("This should not happen, please report a bug.")},"onAnchor"),schema:s,sourceObjects:new Map})}c(Et,"collectionFromPath");const rt=c(s=>s==null||typeof s=="object"&&!!s[Symbol.iterator]().next().done,"isEmptyPath");class _s extends Cn{static{c(this,"Collection")}constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){const t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(n=>J(n)||_(n)?n.clone(e):n),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(rt(e))this.add(t);else{const[n,...i]=e,r=this.get(n,!0);if(q(r))r.addIn(i,t);else if(r===void 0&&this.schema)this.set(n,Et(this.schema,i,t));else throw new Error(`Expected YAML collection at ${n}. Remaining path: ${i}`)}}deleteIn(e){const[t,...n]=e;if(n.length===0)return this.delete(t);const i=this.get(t,!0);if(q(i))return i.deleteIn(n);throw new Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){const[n,...i]=e,r=this.get(n,!0);return i.length===0?!t&&F(r)?r.value:r:q(r)?r.getIn(i,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!_(t))return!1;const n=t.value;return n==null||e&&F(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){const[t,...n]=e;if(n.length===0)return this.has(t);const i=this.get(t,!0);return q(i)?i.hasIn(n):!1}setIn(e,t){const[n,...i]=e;if(i.length===0)this.set(n,t);else{const r=this.get(n,!0);if(q(r))r.setIn(i,t);else if(r===void 0&&this.schema)this.set(n,Et(this.schema,i,t));else throw new Error(`Expected YAML collection at ${n}. Remaining path: ${i}`)}}}const uo=c(s=>s.replace(/^(?!$)(?: $)?/gm,"#"),"stringifyComment");function ye(s,e){return/^\n+$/.test(s)?s.substring(1):e?s.replace(/^(?! *$)/gm,e):s}c(ye,"indentComment");const Ae=c((s,e,t)=>s.endsWith(`
|
|
4
|
+
`)?ye(t,e):t.includes(`
|
|
5
5
|
`)?`
|
|
6
|
-
`+
|
|
7
|
-
`)t===
|
|
6
|
+
`+ye(t,e):(s.endsWith(" ")?"":" ")+t,"lineComment"),Bs="flow",kn="block",It="quoted";function Tt(s,e,t="flow",{indentAtStart:n,lineWidth:i=80,minContentWidth:r=20,onFold:o,onOverflow:a}={}){if(!i||i<0)return s;i<r&&(r=0);const l=Math.max(1+r,1+i-e.length);if(s.length<=l)return s;const u=[],p={};let h=i-e.length;typeof n=="number"&&(n>i-Math.max(2,r)?u.push(0):h=i-n);let f,g,w=!1,d=-1,y=-1,C=-1;t===kn&&(d=Us(s,d,e.length),d!==-1&&(h=d+l));for(let $;$=s[d+=1];){if(t===It&&$==="\\"){switch(y=d,s[d+1]){case"x":d+=3;break;case"u":d+=5;break;case"U":d+=9;break;default:d+=1}C=d}if($===`
|
|
7
|
+
`)t===kn&&(d=Us(s,d,e.length)),h=d+e.length+l,f=void 0;else{if($===" "&&g&&g!==" "&&g!==`
|
|
8
8
|
`&&g!==" "){const T=s[d+1];T&&T!==" "&&T!==`
|
|
9
|
-
`&&T!==" "&&(f=d)}if(d>=h)if(f)u.push(f),h=f+l,f=void 0;else if(t===
|
|
10
|
-
${e}${s.slice(0,N)}`:(t===
|
|
11
|
-
${e}${s.slice(T+1,N)}`)}return v}c(
|
|
12
|
-
`);n=e,i=e+1,r=s[i]}return n}c(
|
|
13
|
-
`){if(r-o>n)return!0;if(o=r+1,i-o<=n)return!1}return!0}c(
|
|
9
|
+
`&&T!==" "&&(f=d)}if(d>=h)if(f)u.push(f),h=f+l,f=void 0;else if(t===It){for(;g===" "||g===" ";)g=$,$=s[d+=1],w=!0;const T=d>C+1?d-2:y-1;if(p[T])return s;u.push(T),p[T]=!0,h=T+l,f=void 0}else w=!0}g=$}if(w&&a&&a(),u.length===0)return s;o&&o();let v=s.slice(0,u[0]);for(let $=0;$<u.length;++$){const T=u[$],N=u[$+1]||s.length;T===0?v=`
|
|
10
|
+
${e}${s.slice(0,N)}`:(t===It&&p[T]&&(v+=`${s[T]}\\`),v+=`
|
|
11
|
+
${e}${s.slice(T+1,N)}`)}return v}c(Tt,"foldFlowLines");function Us(s,e,t){let n=e,i=e+1,r=s[i];for(;r===" "||r===" ";)if(e<i+t)r=s[++e];else{do r=s[++e];while(r&&r!==`
|
|
12
|
+
`);n=e,i=e+1,r=s[i]}return n}c(Us,"consumeMoreIndentedLines");const Nt=c((s,e)=>({indentAtStart:e?s.indent.length:s.indentAtStart,lineWidth:s.options.lineWidth,minContentWidth:s.options.minContentWidth}),"getFoldOptions"),At=c(s=>/^(%|---|\.\.\.)/m.test(s),"containsDocumentMarker");function fo(s,e,t){if(!e||e<0)return!1;const n=e-t,i=s.length;if(i<=n)return!1;for(let r=0,o=0;r<i;++r)if(s[r]===`
|
|
13
|
+
`){if(r-o>n)return!0;if(o=r+1,i-o<=n)return!1}return!0}c(fo,"lineLengthOverLimit");function ot(s,e){const t=JSON.stringify(s);if(e.options.doubleQuotedAsJSON)return t;const{implicitKey:n}=e,i=e.options.doubleQuotedMinMultiLineLength,r=e.indent||(At(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 p=t.substr(l+2,4);switch(p){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:p.substr(0,2)==="00"?o+="\\x"+p.substr(2):o+=t.substr(l,6)}l+=5,a=l+1}break;case"n":if(n||t[l+2]==='"'||t.length<i)l+=1;else{for(o+=t.slice(a,l)+`
|
|
14
14
|
|
|
15
15
|
`;t[l+2]==="\\"&&t[l+3]==="n"&&t[l+4]!=='"';)o+=`
|
|
16
|
-
`,l+=2;o+=r,t[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+t.slice(a):t,n?o:
|
|
17
|
-
`)||/[ \t]\n|\n[ \t]/.test(s))return
|
|
18
|
-
${t}`)+"'";return e.implicitKey?n:
|
|
16
|
+
`,l+=2;o+=r,t[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+t.slice(a):t,n?o:Tt(o,r,It,Nt(e,!1))}c(ot,"doubleQuotedString");function vn(s,e){if(e.options.singleQuote===!1||e.implicitKey&&s.includes(`
|
|
17
|
+
`)||/[ \t]\n|\n[ \t]/.test(s))return ot(s,e);const t=e.indent||(At(s)?" ":""),n="'"+s.replace(/'/g,"''").replace(/\n+/g,`$&
|
|
18
|
+
${t}`)+"'";return e.implicitKey?n:Tt(n,t,Bs,Nt(e,!1))}c(vn,"singleQuotedString");function Ue(s,e){const{singleQuote:t}=e.options;let n;if(t===!1)n=ot;else{const i=s.includes('"'),r=s.includes("'");i&&!r?n=vn:r&&!i?n=ot:n=t?vn:ot}return n(s,e)}c(Ue,"quotedString");let En;try{En=new RegExp(`(^|(?<!
|
|
19
19
|
))
|
|
20
20
|
+(?!
|
|
21
|
-
|$)`,"g")}catch{
|
|
21
|
+
|$)`,"g")}catch{En=/\n+(?!\n|$)/g}function Ot({comment:s,type:e,value:t},n,i,r){const{blockQuote:o,commentString:a,lineWidth:l}=n.options;if(!o||/\n[\t ]+$/.test(t)||/^\s*$/.test(t))return Ue(t,n);const u=n.indent||(n.forceBlockIndent||At(t)?" ":""),p=o==="literal"?!0:o==="folded"||e===x.BLOCK_FOLDED?!1:e===x.BLOCK_LITERAL?!0:!fo(t,l,u.length);if(!t)return p?`|
|
|
22
22
|
`:`>
|
|
23
23
|
`;let h,f;for(f=t.length;f>0;--f){const N=t[f-1];if(N!==`
|
|
24
24
|
`&&N!==" "&&N!==" ")break}let g=t.substring(f);const w=g.indexOf(`
|
|
25
25
|
`);w===-1?h="-":t===g||w!==g.length-1?(h="+",r&&r()):h="",g&&(t=t.slice(0,-g.length),g[g.length-1]===`
|
|
26
|
-
`&&(g=g.slice(0,-1)),g=g.replace(
|
|
26
|
+
`&&(g=g.slice(0,-1)),g=g.replace(En,`$&${u}`));let d=!1,y,C=-1;for(y=0;y<t.length;++y){const N=t[y];if(N===" ")d=!0;else if(N===`
|
|
27
27
|
`)C=y;else break}let v=t.substring(0,C<y?C+1:y);v&&(t=t.substring(v.length),v=v.replace(/\n+/g,`$&${u}`));let T=(d?u?"2":"1":"")+h;if(s&&(T+=" "+a(s.replace(/ ?[\r\n]+/g," ")),i&&i()),!p){const N=t.replace(/\n+/g,`
|
|
28
|
-
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${u}`);let A=!1;const
|
|
28
|
+
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${u}`);let A=!1;const P=Nt(n,!0);o!=="folded"&&e!==x.BLOCK_FOLDED&&(P.onOverflow=()=>{A=!0});const I=Tt(`${v}${N}${g}`,u,kn,P);if(!A)return`>${T}
|
|
29
29
|
${u}${I}`}return t=t.replace(/\n+/g,`$&${u}`),`|${T}
|
|
30
|
-
${u}${v}${t}${g}`}c(
|
|
30
|
+
${u}${v}${t}${g}`}c(Ot,"blockString");function ho(s,e,t,n){const{type:i,value:r}=s,{actualString:o,implicitKey:a,indent:l,indentStep:u,inFlow:p}=e;if(a&&r.includes(`
|
|
31
31
|
`)||p&&/[[\]{},]/.test(r))return Ue(r,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(r))return a||p||!r.includes(`
|
|
32
|
-
`)?Ue(r,e):
|
|
33
|
-
`))return
|
|
34
|
-
${l}`);if(o){const f=c(d=>d.default&&d.tag!=="tag:yaml.org,2002:str"&&d.test?.test(h),"test"),{compat:g,tags:w}=e.doc.schema;if(w.some(f)||g?.some(f))return Ue(r,e)}return a?h:
|
|
35
|
-
${e.indent}${a}`:a}c(qe,"stringify$2");function
|
|
36
|
-
${a}:`):(y=`${y}:`,f&&(y+=Ae(y,t.indent,u(f))));let C,v
|
|
37
|
-
`:"",v){const
|
|
38
|
-
${
|
|
32
|
+
`)?Ue(r,e):Ot(s,e,t,n);if(!a&&!p&&i!==x.PLAIN&&r.includes(`
|
|
33
|
+
`))return Ot(s,e,t,n);if(At(r)){if(l==="")return e.forceBlockIndent=!0,Ot(s,e,t,n);if(a&&l===u)return Ue(r,e)}const h=r.replace(/\n+/g,`$&
|
|
34
|
+
${l}`);if(o){const f=c(d=>d.default&&d.tag!=="tag:yaml.org,2002:str"&&d.test?.test(h),"test"),{compat:g,tags:w}=e.doc.schema;if(w.some(f)||g?.some(f))return Ue(r,e)}return a?h:Tt(h,l,Bs,Nt(e,!1))}c(ho,"plainString");function at(s,e,t,n){const{implicitKey:i,inFlow:r}=e,o=typeof s.value=="string"?s:Object.assign({},s,{value:String(s.value)});let{type:a}=s;a!==x.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=x.QUOTE_DOUBLE);const l=c(p=>{switch(p){case x.BLOCK_FOLDED:case x.BLOCK_LITERAL:return i||r?Ue(o.value,e):Ot(o,e,t,n);case x.QUOTE_DOUBLE:return ot(o.value,e);case x.QUOTE_SINGLE:return vn(o.value,e);case x.PLAIN:return ho(o,e,t,n);default:return null}},"_stringify");let u=l(a);if(u===null){const{defaultKeyType:p,defaultStringType:h}=e.options,f=i&&p||h;if(u=l(f),u===null)throw new Error(`Unsupported default string type ${f}`)}return u}c(at,"stringifyString");function qs(s,e){const t=Object.assign({blockQuote:!0,commentString:uo,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(qs,"createStringifyContext");function po(s,e){if(e.tag){const i=s.filter(r=>r.tag===e.tag);if(i.length>0)return i.find(r=>r.format===e.format)??i[0]}let t,n;if(F(e)){n=e.value;let i=s.filter(r=>r.identify?.(n));if(i.length>1){const r=i.filter(o=>o.test);r.length>0&&(i=r)}t=i.find(r=>r.format===e.format)??i.find(r=>!r.format)}else n=e,t=s.find(i=>i.nodeClass&&n instanceof i.nodeClass);if(!t){const i=n?.constructor?.name??(n===null?"null":typeof n);throw new Error(`Tag not resolved for ${i} value`)}return t}c(po,"getTagObject");function mo(s,e,{anchors:t,doc:n}){if(!n.directives)return"";const i=[],r=(F(s)||q(s))&&s.anchor;r&&Rs(r)&&(t.add(r),i.push(`&${r}`));const o=s.tag??(e.default?null:e.tag);return o&&i.push(n.directives.tagString(o)),i.join(" ")}c(mo,"stringifyProps");function qe(s,e,t,n){if(_(s))return s.toString(e,t,n);if(ke(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 i;const r=J(s)?s:e.doc.createNode(s,{onTagObj:c(l=>i=l,"onTagObj")});i??(i=po(e.doc.schema.tags,r));const o=mo(r,i,e);o.length>0&&(e.indentAtStart=(e.indentAtStart??0)+o.length+1);const a=typeof i.stringify=="function"?i.stringify(r,e,t,n):F(r)?at(r,e,t,n):r.toString(e,t,n);return o?F(r)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
|
|
35
|
+
${e.indent}${a}`:a}c(qe,"stringify$2");function go({key:s,value:e},t,n,i){const{allNullValues:r,doc:o,indent:a,indentStep:l,options:{commentString:u,indentSeq:p,simpleKeys:h}}=t;let f=J(s)&&s.comment||null;if(h){if(f)throw new Error("With simple keys, key nodes cannot have comments");if(q(s)||!J(s)&&typeof s=="object"){const P="With simple keys, collection cannot be used as a key value";throw new Error(P)}}let g=!h&&(!s||f&&e==null&&!t.inFlow||q(s)||(F(s)?s.type===x.BLOCK_FOLDED||s.type===x.BLOCK_LITERAL:typeof s=="object"));t=Object.assign({},t,{allNullValues:!1,implicitKey:!g&&(h||!r),indent:a+l});let w=!1,d=!1,y=qe(s,t,()=>w=!0,()=>d=!0);if(!g&&!t.inFlow&&y.length>1024){if(h)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");g=!0}if(t.inFlow){if(r||e==null)return w&&n&&n(),y===""?"?":g?`? ${y}`:y}else if(r&&!h||e==null&&g)return y=`? ${y}`,f&&!w?y+=Ae(y,t.indent,u(f)):d&&i&&i(),y;w&&(f=null),g?(f&&(y+=Ae(y,t.indent,u(f))),y=`? ${y}
|
|
36
|
+
${a}:`):(y=`${y}:`,f&&(y+=Ae(y,t.indent,u(f))));let C,v,$;J(e)?(C=!!e.spaceBefore,v=e.commentBefore,$=e.comment):(C=!1,v=null,$=null,e&&typeof e=="object"&&(e=o.createNode(e))),t.implicitKey=!1,!g&&!f&&F(e)&&(t.indentAtStart=y.length+1),d=!1,!p&&l.length>=2&&!t.inFlow&&!g&&Fe(e)&&!e.flow&&!e.tag&&!e.anchor&&(t.indent=t.indent.substring(2));let T=!1;const N=qe(e,t,()=>T=!0,()=>d=!0);let A=" ";if(f||C||v){if(A=C?`
|
|
37
|
+
`:"",v){const P=u(v);A+=`
|
|
38
|
+
${ye(P,t.indent)}`}N===""&&!t.inFlow?A===`
|
|
39
39
|
`&&(A=`
|
|
40
40
|
|
|
41
41
|
`):A+=`
|
|
42
|
-
${t.indent}`}else if(!g&&q(e)){const
|
|
43
|
-
`),W=I!==-1,
|
|
42
|
+
${t.indent}`}else if(!g&&q(e)){const P=N[0],I=N.indexOf(`
|
|
43
|
+
`),W=I!==-1,X=t.inFlow??e.flow??e.items.length===0;if(W||!X){let be=!1;if(W&&(P==="&"||P==="!")){let H=N.indexOf(" ");P==="&"&&H!==-1&&H<I&&N[H+1]==="!"&&(H=N.indexOf(" ",H+1)),(H===-1||I<H)&&(be=!0)}be||(A=`
|
|
44
44
|
${t.indent}`)}}else(N===""||N[0]===`
|
|
45
|
-
`)&&(A="");return y+=A+N,t.inFlow?T&&n&&n()
|
|
45
|
+
`)&&(A="");return y+=A+N,t.inFlow?T&&n&&n():$&&!T?y+=Ae(y,t.indent,u($)):d&&i&&i(),y}c(go,"stringifyPair");function Js(s,e){(s==="debug"||s==="warn")&&console.warn(e)}c(Js,"warn");const $t="<<",we={identify:c(s=>s===$t||typeof s=="symbol"&&s.description===$t,"identify"),default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:c(()=>Object.assign(new x(Symbol($t)),{addToJSMap:Ws}),"resolve"),stringify:c(()=>$t,"stringify")},yo=c((s,e)=>(we.identify(e)||F(e)&&(!e.type||e.type===x.PLAIN)&&we.identify(e.value))&&s?.doc.schema.tags.some(t=>t.tag===we.tag&&t.default),"isMergeKey");function Ws(s,e,t){if(t=s&&ke(t)?t.resolve(s.doc):t,Fe(t))for(const n of t.items)In(s,e,n);else if(Array.isArray(t))for(const n of t)In(s,e,n);else In(s,e,t)}c(Ws,"addMergeToJSMap");function In(s,e,t){const n=s&&ke(t)?t.resolve(s.doc):t;if(!je(n))throw new Error("Merge sources must be maps or map aliases");const i=n.toJSON(null,s,Map);for(const[r,o]of i)e instanceof Map?e.has(r)||e.set(r,o):e instanceof Set?e.add(r):Object.prototype.hasOwnProperty.call(e,r)||Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0});return e}c(In,"mergeValue");function Gs(s,e,{key:t,value:n}){if(J(t)&&t.addToJSMap)t.addToJSMap(s,e,n);else if(yo(s,t))Ws(s,e,n);else{const i=ae(t,"",s);if(e instanceof Map)e.set(i,ae(n,i,s));else if(e instanceof Set)e.add(i);else{const r=wo(t,i,s),o=ae(n,r,s);r in e?Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0}):e[r]=o}}return e}c(Gs,"addPairToJSMap");function wo(s,e,t){if(e===null)return"";if(typeof e!="object")return String(e);if(J(s)&&t?.doc){const n=qs(t.doc,{});n.anchors=new Set;for(const r of t.anchors.keys())n.anchors.add(r.anchor);n.inFlow=!0,n.inStringifyKey=!0;const i=s.toString(n);if(!t.mapKeyWarned){let r=JSON.stringify(i);r.length>40&&(r=r.substring(0,36)+'..."'),Js(t.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${r}. Set mapAsMap: true to use object keys.`),t.mapKeyWarned=!0}return i}return JSON.stringify(e)}c(wo,"stringifyKey");function Tn(s,e,t){const n=it(s,void 0,t),i=it(e,void 0,t);return new Z(n,i)}c(Tn,"createPair");class Z{static{c(this,"Pair")}constructor(e,t=null){Object.defineProperty(this,oe,{value:$s}),this.key=e,this.value=t}clone(e){let{key:t,value:n}=this;return J(t)&&(t=t.clone(e)),J(n)&&(n=n.clone(e)),new Z(t,n)}toJSON(e,t){const n=t?.mapAsMap?new Map:{};return Gs(t,n,this)}toString(e,t,n){return e?.doc?go(this,e,t,n):JSON.stringify(this)}}function Vs(s,e,t){return(e.inFlow??s.flow?So:bo)(s,e,t)}c(Vs,"stringifyCollection");function bo({comment:s,items:e},t,{blockItemPrefix:n,flowChars:i,itemIndent:r,onChompKeep:o,onComment:a}){const{indent:l,options:{commentString:u}}=t,p=Object.assign({},t,{indent:r,type:null});let h=!1;const f=[];for(let w=0;w<e.length;++w){const d=e[w];let y=null;if(J(d))!h&&d.spaceBefore&&f.push(""),Lt(t,f,d.commentBefore,h),d.comment&&(y=d.comment);else if(_(d)){const v=J(d.key)?d.key:null;v&&(!h&&v.spaceBefore&&f.push(""),Lt(t,f,v.commentBefore,h))}h=!1;let C=qe(d,p,()=>y=null,()=>h=!0);y&&(C+=Ae(C,r,u(y))),h&&y&&(h=!1),f.push(n+C)}let g;if(f.length===0)g=i.start+i.end;else{g=f[0];for(let w=1;w<f.length;++w){const d=f[w];g+=d?`
|
|
46
46
|
${l}${d}`:`
|
|
47
47
|
`}}return s?(g+=`
|
|
48
|
-
`+
|
|
48
|
+
`+ye(u(s),l),a&&a()):h&&o&&o(),g}c(bo,"stringifyBlockCollection");function So({items:s},e,{flowChars:t,itemIndent:n}){const{indent:i,indentStep:r,flowCollectionPadding:o,options:{commentString:a}}=e;n+=r;const l=Object.assign({},e,{indent:n,inFlow:!0,type:null});let u=!1,p=0;const h=[];for(let w=0;w<s.length;++w){const d=s[w];let y=null;if(J(d))d.spaceBefore&&h.push(""),Lt(e,h,d.commentBefore,!1),d.comment&&(y=d.comment);else if(_(d)){const v=J(d.key)?d.key:null;v&&(v.spaceBefore&&h.push(""),Lt(e,h,v.commentBefore,!1),v.comment&&(u=!0));const $=J(d.value)?d.value:null;$?($.comment&&(y=$.comment),$.commentBefore&&(u=!0)):d.value==null&&v?.comment&&(y=v.comment)}y&&(u=!0);let C=qe(d,l,()=>y=null);w<s.length-1&&(C+=","),y&&(C+=Ae(C,n,a(y))),!u&&(h.length>p||C.includes(`
|
|
49
49
|
`))&&(u=!0),h.push(C),p=h.length}const{start:f,end:g}=t;if(h.length===0)return f+g;if(!u){const w=h.reduce((d,y)=>d+y.length+2,2);u=e.options.lineWidth>0&&w>e.options.lineWidth}if(u){let w=f;for(const d of h)w+=d?`
|
|
50
50
|
${r}${i}${d}`:`
|
|
51
51
|
`;return`${w}
|
|
52
|
-
${i}${g}`}else return`${f}${o}${h.join(" ")}${o}${g}`}c(
|
|
53
|
-
`:" ")}return
|
|
52
|
+
${i}${g}`}else return`${f}${o}${h.join(" ")}${o}${g}`}c(So,"stringifyFlowCollection");function Lt({indent:s,options:{commentString:e}},t,n,i){if(n&&i&&(n=n.replace(/^\n+/,"")),n){const r=ye(e(n),s);t.push(r.trimStart())}}c(Lt,"addCommentBefore");function Oe(s,e){const t=F(e)?e.value:e;for(const n of s)if(_(n)&&(n.key===e||n.key===t||F(n.key)&&n.key.value===t))return n}c(Oe,"findPair");class ie extends _s{static{c(this,"YAMLMap")}static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(Ce,e),this.items=[]}static from(e,t,n){const{keepUndefined:i,replacer:r}=n,o=new this(e),a=c((l,u)=>{if(typeof r=="function")u=r.call(t,l,u);else if(Array.isArray(r)&&!r.includes(l))return;(u!==void 0||i)&&o.items.push(Tn(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;_(e)?n=e:!e||typeof e!="object"||!("key"in e)?n=new Z(e,e?.value):n=new Z(e.key,e.value);const i=Oe(this.items,n.key),r=this.schema?.sortMapEntries;if(i){if(!t)throw new Error(`Key ${n.key} already set`);F(i.value)&&Ks(n.value)?i.value.value=n.value:i.value=n.value}else if(r){const o=this.items.findIndex(a=>r(n,a)<0);o===-1?this.items.push(n):this.items.splice(o,0,n)}else this.items.push(n)}delete(e){const t=Oe(this.items,e);return t?this.items.splice(this.items.indexOf(t),1).length>0:!1}get(e,t){const i=Oe(this.items,e)?.value;return(!t&&F(i)?i.value:i)??void 0}has(e){return!!Oe(this.items,e)}set(e,t){this.add(new Z(e,t),!0)}toJSON(e,t,n){const i=n?new n:t?.mapAsMap?new Map:{};t?.onCreate&&t.onCreate(i);for(const r of this.items)Gs(t,i,r);return i}toString(e,t,n){if(!e)return JSON.stringify(this);for(const i of this.items)if(!_(i))throw new Error(`Map items must all be pairs; found ${JSON.stringify(i)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),Vs(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:n,onComment:t})}}const Je={collection:"map",default:!0,nodeClass:ie,tag:"tag:yaml.org,2002:map",resolve(s,e){return je(s)||e("Expected a mapping for this tag"),s},createNode:c((s,e,t)=>ie.from(s,e,t),"createNode")};class ve extends _s{static{c(this,"YAMLSeq")}static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(Re,e),this.items=[]}add(e){this.items.push(e)}delete(e){const t=xt(e);return typeof t!="number"?!1:this.items.splice(t,1).length>0}get(e,t){const n=xt(e);if(typeof n!="number")return;const i=this.items[n];return!t&&F(i)?i.value:i}has(e){const t=xt(e);return typeof t=="number"&&t<this.items.length}set(e,t){const n=xt(e);if(typeof n!="number")throw new Error(`Expected a valid index, not ${e}.`);const i=this.items[n];F(i)&&Ks(t)?i.value=t:this.items[n]=t}toJSON(e,t){const n=[];t?.onCreate&&t.onCreate(n);let i=0;for(const r of this.items)n.push(ae(r,String(i++),t));return n}toString(e,t,n){return e?Vs(this,e,{blockItemPrefix:"- ",flowChars:{start:"[",end:"]"},itemIndent:(e.indent||"")+" ",onChompKeep:n,onComment:t}):JSON.stringify(this)}static from(e,t,n){const{replacer:i}=n,r=new this(e);if(t&&Symbol.iterator in Object(t)){let o=0;for(let a of t){if(typeof i=="function"){const l=t instanceof Set?a:String(o++);a=i.call(t,l,a)}r.items.push(it(a,void 0,n))}}return r}}function xt(s){let e=F(s)?s.value:s;return e&&typeof e=="string"&&(e=Number(e)),typeof e=="number"&&Number.isInteger(e)&&e>=0?e:null}c(xt,"asItemIndex");const We={collection:"seq",default:!0,nodeClass:ve,tag:"tag:yaml.org,2002:seq",resolve(s,e){return Fe(s)||e("Expected a sequence for this tag"),s},createNode:c((s,e,t)=>ve.from(s,e,t),"createNode")},Pt={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),at(s,e,t,n)}},Dt={identify:c(s=>s==null,"identify"),createNode:c(()=>new x(null),"createNode"),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:c(()=>new x(null),"resolve"),stringify:c(({source:s},e)=>typeof s=="string"&&Dt.test.test(s)?s:e.options.nullStr,"stringify")},Nn={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 x(s[0]==="t"||s[0]==="T"),"resolve"),stringify({source:s,value:e},t){if(s&&Nn.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 le({format:s,minFractionDigits:e,tag:t,value:n}){if(typeof n=="bigint")return String(n);const i=typeof n=="number"?n:Number(n);if(!isFinite(i))return isNaN(i)?".nan":i<0?"-.inf":".inf";let r=JSON.stringify(n);if(!s&&e&&(!t||t==="tag:yaml.org,2002:float")&&/^\d/.test(r)){let o=r.indexOf(".");o<0&&(o=r.length,r+=".");let a=e-(r.length-o-1);for(;a-- >0;)r+="0"}return r}c(le,"stringifyNumber");const Hs={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:le},Ys={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():le(s)}},zs={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 x(parseFloat(s)),t=s.indexOf(".");return t!==-1&&s[s.length-1]==="0"&&(e.minFractionDigits=s.length-t-1),e},stringify:le},Mt=c(s=>typeof s=="bigint"||Number.isInteger(s),"intIdentify$2"),An=c((s,e,t,{intAsBigInt:n})=>n?BigInt(s):parseInt(s.substring(e),t),"intResolve$1");function Qs(s,e,t){const{value:n}=s;return Mt(n)&&n>=0?t+n.toString(e):le(s)}c(Qs,"intStringify$1");const Xs={identify:c(s=>Mt(s)&&s>=0,"identify"),default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:c((s,e,t)=>An(s,2,8,t),"resolve"),stringify:c(s=>Qs(s,8,"0o"),"stringify")},Zs={identify:Mt,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:c((s,e,t)=>An(s,0,10,t),"resolve"),stringify:le},ei={identify:c(s=>Mt(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)=>An(s,2,16,t),"resolve"),stringify:c(s=>Qs(s,16,"0x"),"stringify")},Co=[Je,We,Pt,Dt,Nn,Xs,Zs,ei,Hs,Ys,zs];function ti(s){return typeof s=="bigint"||Number.isInteger(s)}c(ti,"intIdentify$1");const Rt=c(({value:s})=>JSON.stringify(s),"stringifyJSON"),ko=[{identify:c(s=>typeof s=="string","identify"),default:!0,tag:"tag:yaml.org,2002:str",resolve:c(s=>s,"resolve"),stringify:Rt},{identify:c(s=>s==null,"identify"),createNode:c(()=>new x(null),"createNode"),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:c(()=>null,"resolve"),stringify:Rt},{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:Rt},{identify:ti,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})=>ti(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:Rt}],vo={default:!0,tag:"",test:/^/,resolve(s,e){return e(`Unresolved plain scalar ${JSON.stringify(s)}`),s}},Eo=[Je,We].concat(ko,vo),On={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 i=0;i<t.length;++i)n[i]=t.charCodeAt(i);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,i,r){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=x.BLOCK_LITERAL),e!==x.QUOTE_DOUBLE){const l=Math.max(n.options.lineWidth-n.indent.length,n.options.minContentWidth),u=Math.ceil(a.length/l),p=new Array(u);for(let h=0,f=0;h<u;++h,f+=l)p[h]=a.substr(f,l);a=p.join(e===x.BLOCK_LITERAL?`
|
|
53
|
+
`:" ")}return at({comment:s,type:e,value:a},n,i,r)}};function ni(s,e){if(Fe(s))for(let t=0;t<s.items.length;++t){let n=s.items[t];if(!_(n)){if(je(n)){n.items.length>1&&e("Each pair must have its own sequence indicator");const i=n.items[0]||new Z(new x(null));if(n.commentBefore&&(i.key.commentBefore=i.key.commentBefore?`${n.commentBefore}
|
|
54
54
|
${i.key.commentBefore}`:n.commentBefore),n.comment){const r=i.value??i.key;r.comment=r.comment?`${n.comment}
|
|
55
|
-
${r.comment}`:n.comment}n=i}s.items[t]=F(n)?n:new X(n)}}else e("Expected a sequence for this tag");return s}c(ti,"resolvePairs");function ni(s,e,t){const{replacer:n}=t,i=new ve(s);i.tag="tag:yaml.org,2002:pairs";let r=0;if(e&&Symbol.iterator in Object(e))for(let o of e){typeof n=="function"&&(o=n.call(e,String(r++),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;i.items.push(vn(a,l,t))}return i}c(ni,"createPairs");const Nn={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:ti,createNode:ni};class Ye extends ve{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=Ye.tag}toJSON(e,t){if(!t)return super.toJSON(e);const n=new Map;t?.onCreate&&t.onCreate(n);for(const i of this.items){let r,o;if(F(i)?(r=oe(i.key,"",t),o=oe(i.value,r,t)):r=oe(i,"",t),n.has(r))throw new Error("Ordered maps must not include duplicate keys");n.set(r,o)}return n}static from(e,t,n){const i=ni(e,t,n),r=new this;return r.items=i.items,r}}Ye.tag="tag:yaml.org,2002:omap";const An={collection:"seq",identify:c(s=>s instanceof Map,"identify"),nodeClass:Ye,default:!1,tag:"tag:yaml.org,2002:omap",resolve(s,e){const t=ti(s,e),n=[];for(const{key:i}of t.items)K(i)&&(n.includes(i.value)?e(`Ordered maps must not include duplicate keys: ${i.value}`):n.push(i.value));return Object.assign(new Ye,t)},createNode:c((s,e,t)=>Ye.from(s,e,t),"createNode")};function si({value:s,source:e},t){return e&&(s?ii:ri).test.test(e)?e:s?t.options.trueStr:t.options.falseStr}c(si,"boolStringify");const ii={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 x(!0),"resolve"),stringify:si},ri={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 x(!1),"resolve"),stringify:si},ko={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:ce},vo={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():ce(s)}},Eo={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 x(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:ce},ot=c(s=>typeof s=="bigint"||Number.isInteger(s),"intIdentify");function Mt(s,e,t,{intAsBigInt:n}){const i=s[0];if((i==="-"||i==="+")&&(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 i==="-"?BigInt(-1)*o:o}const r=parseInt(s,t);return i==="-"?-1*r:r}c(Mt,"intResolve");function On(s,e,t){const{value:n}=s;if(ot(n)){const i=n.toString(e);return n<0?"-"+t+i.substr(1):t+i}return ce(s)}c(On,"intStringify");const Io={identify:ot,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:c((s,e,t)=>Mt(s,2,2,t),"resolve"),stringify:c(s=>On(s,2,"0b"),"stringify")},To={identify:ot,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:c((s,e,t)=>Mt(s,1,8,t),"resolve"),stringify:c(s=>On(s,8,"0"),"stringify")},No={identify:ot,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:c((s,e,t)=>Mt(s,0,10,t),"resolve"),stringify:ce},Ao={identify:ot,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:c((s,e,t)=>Mt(s,2,16,t),"resolve"),stringify:c(s=>On(s,16,"0x"),"stringify")};class ze extends se{static{c(this,"YAMLSet")}constructor(e){super(e),this.tag=ze.tag}add(e){let t;F(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),Oe(this.items,t.key)||this.items.push(t)}get(e,t){const n=Oe(this.items,e);return!t&&F(n)?K(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=Oe(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:i}=n,r=new this(e);if(t&&Symbol.iterator in Object(t))for(let o of t)typeof i=="function"&&(o=i.call(t,o,o)),r.items.push(vn(o,null,n));return r}}ze.tag="tag:yaml.org,2002:set";const $n={collection:"map",identify:c(s=>s instanceof Set,"identify"),nodeClass:ze,default:!1,tag:"tag:yaml.org,2002:set",createNode:c((s,e,t)=>ze.from(s,e,t),"createNode"),resolve(s,e){if(je(s)){if(s.hasAllNullValues(!0))return Object.assign(new ze,s);e("Set items must all have null values")}else e("Expected a mapping for this tag");return s}};function Ln(s,e){const t=s[0],n=t==="-"||t==="+"?s.substring(1):s,i=c(o=>e?BigInt(o):Number(o),"num"),r=n.replace(/_/g,"").split(":").reduce((o,a)=>o*i(60)+i(a),i(0));return t==="-"?i(-1)*r:r}c(Ln,"parseSexagesimal");function oi(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 ce(s);let n="";e<0&&(n="-",e*=t(-1));const i=t(60),r=[e%i];return e<60?r.unshift(0):(e=(e-r[0])/i,r.unshift(e%i),e>=60&&(e=(e-r[0])/i,r.unshift(e))),n+r.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}c(oi,"stringifySexagesimal");const ai={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})=>Ln(s,t),"resolve"),stringify:oi},ci={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=>Ln(s,!1),"resolve"),stringify:oi},Rt={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(Rt.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");const[,t,n,i,r,o,a]=e.map(Number),l=e[7]?Number((e[7]+"00").substr(1,3)):0;let u=Date.UTC(t,n-1,i,r||0,o||0,a||0,l);const p=e[8];if(p&&p!=="Z"){let h=Ln(p,!1);Math.abs(h)<30&&(h*=60),u-=6e4*h}return new Date(u)},stringify:c(({value:s})=>s?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??"","stringify")},li=[Je,We,Lt,xt,ii,ri,Io,To,No,Ao,ko,vo,Eo,Tn,ye,An,Nn,$n,ai,ci,Rt],ui=new Map([["core",wo],["failsafe",[Je,We,Lt]],["json",Co],["yaml11",li],["yaml-1.1",li]]),fi={binary:Tn,bool:En,float:Ys,floatExp:Hs,floatNaN:Vs,floatTime:ci,int:Xs,intHex:Zs,intOct:Qs,intTime:ai,map:Je,merge:ye,null:xt,omap:An,pairs:Nn,seq:We,set:$n,timestamp:Rt},Oo={"tag:yaml.org,2002:binary":Tn,"tag:yaml.org,2002:merge":ye,"tag:yaml.org,2002:omap":An,"tag:yaml.org,2002:pairs":Nn,"tag:yaml.org,2002:set":$n,"tag:yaml.org,2002:timestamp":Rt};function xn(s,e,t){const n=ui.get(e);if(n&&!s)return t&&!n.includes(ye)?n.concat(ye):n.slice();let i=n;if(!i)if(Array.isArray(s))i=[];else{const r=Array.from(ui.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${r} or define customTags array`)}if(Array.isArray(s))for(const r of s)i=i.concat(r);else typeof s=="function"&&(i=s(i.slice()));return t&&(i=i.concat(ye)),i.reduce((r,o)=>{const a=typeof o=="string"?fi[o]:o;if(!a){const l=JSON.stringify(o),u=Object.keys(fi).map(p=>JSON.stringify(p)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${u}`)}return r.includes(a)||r.push(a),r},[])}c(xn,"getTags");const $o=c((s,e)=>s.key<e.key?-1:s.key>e.key?1:0,"sortMapEntriesByKey");class Ht{static{c(this,"Schema")}constructor({compat:e,customTags:t,merge:n,resolveKnownTags:i,schema:r,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(e)?xn(e,"compat"):e?xn(null,e):null,this.name=typeof r=="string"&&r||"core",this.knownTags=i?Oo:{},this.tags=xn(t,this.name,n),this.toStringOptions=a??null,Object.defineProperty(this,Ce,{value:Je}),Object.defineProperty(this,fe,{value:Lt}),Object.defineProperty(this,Re,{value:We}),this.sortMapEntries=typeof o=="function"?o:o===!0?$o:null}clone(){const e=Object.create(Ht.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}}function Lo(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 i=Us(s,e),{commentString:r}=i.options;if(s.commentBefore){t.length!==1&&t.unshift("");const l=r(s.commentBefore);t.unshift(ge(l,""))}let o=!1,a=null;if(s.contents){if(J(s.contents)){if(s.contents.spaceBefore&&n&&t.push(""),s.contents.commentBefore){const p=r(s.contents.commentBefore);t.push(ge(p,""))}i.forceBlockIndent=!!s.comment,a=s.contents.comment}const l=a?void 0:()=>o=!0;let u=qe(s.contents,i,()=>a=null,l);a&&(u+=Ae(u,"",r(a))),(u[0]==="|"||u[0]===">")&&t[t.length-1]==="---"?t[t.length-1]=`--- ${u}`:t.push(u)}else t.push(qe(s.contents,i));if(s.directives?.docEnd)if(s.comment){const l=r(s.comment);l.includes(`
|
|
56
|
-
`)?(t.push("..."),t.push(
|
|
55
|
+
${r.comment}`:n.comment}n=i}s.items[t]=_(n)?n:new Z(n)}}else e("Expected a sequence for this tag");return s}c(ni,"resolvePairs");function si(s,e,t){const{replacer:n}=t,i=new ve(s);i.tag="tag:yaml.org,2002:pairs";let r=0;if(e&&Symbol.iterator in Object(e))for(let o of e){typeof n=="function"&&(o=n.call(e,String(r++),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;i.items.push(Tn(a,l,t))}return i}c(si,"createPairs");const $n={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:ni,createNode:si};class Ye extends ve{static{c(this,"YAMLOMap")}constructor(){super(),this.add=ie.prototype.add.bind(this),this.delete=ie.prototype.delete.bind(this),this.get=ie.prototype.get.bind(this),this.has=ie.prototype.has.bind(this),this.set=ie.prototype.set.bind(this),this.tag=Ye.tag}toJSON(e,t){if(!t)return super.toJSON(e);const n=new Map;t?.onCreate&&t.onCreate(n);for(const i of this.items){let r,o;if(_(i)?(r=ae(i.key,"",t),o=ae(i.value,r,t)):r=ae(i,"",t),n.has(r))throw new Error("Ordered maps must not include duplicate keys");n.set(r,o)}return n}static from(e,t,n){const i=si(e,t,n),r=new this;return r.items=i.items,r}}Ye.tag="tag:yaml.org,2002:omap";const Ln={collection:"seq",identify:c(s=>s instanceof Map,"identify"),nodeClass:Ye,default:!1,tag:"tag:yaml.org,2002:omap",resolve(s,e){const t=ni(s,e),n=[];for(const{key:i}of t.items)F(i)&&(n.includes(i.value)?e(`Ordered maps must not include duplicate keys: ${i.value}`):n.push(i.value));return Object.assign(new Ye,t)},createNode:c((s,e,t)=>Ye.from(s,e,t),"createNode")};function ii({value:s,source:e},t){return e&&(s?ri:oi).test.test(e)?e:s?t.options.trueStr:t.options.falseStr}c(ii,"boolStringify");const ri={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 x(!0),"resolve"),stringify:ii},oi={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 x(!1),"resolve"),stringify:ii},Io={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:le},To={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():le(s)}},No={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 x(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:le},ct=c(s=>typeof s=="bigint"||Number.isInteger(s),"intIdentify");function jt(s,e,t,{intAsBigInt:n}){const i=s[0];if((i==="-"||i==="+")&&(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 i==="-"?BigInt(-1)*o:o}const r=parseInt(s,t);return i==="-"?-1*r:r}c(jt,"intResolve");function xn(s,e,t){const{value:n}=s;if(ct(n)){const i=n.toString(e);return n<0?"-"+t+i.substr(1):t+i}return le(s)}c(xn,"intStringify");const Ao={identify:ct,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:c((s,e,t)=>jt(s,2,2,t),"resolve"),stringify:c(s=>xn(s,2,"0b"),"stringify")},Oo={identify:ct,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:c((s,e,t)=>jt(s,1,8,t),"resolve"),stringify:c(s=>xn(s,8,"0"),"stringify")},$o={identify:ct,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:c((s,e,t)=>jt(s,0,10,t),"resolve"),stringify:le},Lo={identify:ct,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:c((s,e,t)=>jt(s,2,16,t),"resolve"),stringify:c(s=>xn(s,16,"0x"),"stringify")};class ze extends ie{static{c(this,"YAMLSet")}constructor(e){super(e),this.tag=ze.tag}add(e){let t;_(e)?t=e:e&&typeof e=="object"&&"key"in e&&"value"in e&&e.value===null?t=new Z(e.key,null):t=new Z(e,null),Oe(this.items,t.key)||this.items.push(t)}get(e,t){const n=Oe(this.items,e);return!t&&_(n)?F(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=Oe(this.items,e);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new Z(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:i}=n,r=new this(e);if(t&&Symbol.iterator in Object(t))for(let o of t)typeof i=="function"&&(o=i.call(t,o,o)),r.items.push(Tn(o,null,n));return r}}ze.tag="tag:yaml.org,2002:set";const Pn={collection:"map",identify:c(s=>s instanceof Set,"identify"),nodeClass:ze,default:!1,tag:"tag:yaml.org,2002:set",createNode:c((s,e,t)=>ze.from(s,e,t),"createNode"),resolve(s,e){if(je(s)){if(s.hasAllNullValues(!0))return Object.assign(new ze,s);e("Set items must all have null values")}else e("Expected a mapping for this tag");return s}};function Dn(s,e){const t=s[0],n=t==="-"||t==="+"?s.substring(1):s,i=c(o=>e?BigInt(o):Number(o),"num"),r=n.replace(/_/g,"").split(":").reduce((o,a)=>o*i(60)+i(a),i(0));return t==="-"?i(-1)*r:r}c(Dn,"parseSexagesimal");function ai(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 le(s);let n="";e<0&&(n="-",e*=t(-1));const i=t(60),r=[e%i];return e<60?r.unshift(0):(e=(e-r[0])/i,r.unshift(e%i),e>=60&&(e=(e-r[0])/i,r.unshift(e))),n+r.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}c(ai,"stringifySexagesimal");const ci={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})=>Dn(s,t),"resolve"),stringify:ai},li={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=>Dn(s,!1),"resolve"),stringify:ai},Ft={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(Ft.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");const[,t,n,i,r,o,a]=e.map(Number),l=e[7]?Number((e[7]+"00").substr(1,3)):0;let u=Date.UTC(t,n-1,i,r||0,o||0,a||0,l);const p=e[8];if(p&&p!=="Z"){let h=Dn(p,!1);Math.abs(h)<30&&(h*=60),u-=6e4*h}return new Date(u)},stringify:c(({value:s})=>s?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??"","stringify")},ui=[Je,We,Pt,Dt,ri,oi,Ao,Oo,$o,Lo,Io,To,No,On,we,Ln,$n,Pn,ci,li,Ft],fi=new Map([["core",Co],["failsafe",[Je,We,Pt]],["json",Eo],["yaml11",ui],["yaml-1.1",ui]]),hi={binary:On,bool:Nn,float:zs,floatExp:Ys,floatNaN:Hs,floatTime:li,int:Zs,intHex:ei,intOct:Xs,intTime:ci,map:Je,merge:we,null:Dt,omap:Ln,pairs:$n,seq:We,set:Pn,timestamp:Ft},xo={"tag:yaml.org,2002:binary":On,"tag:yaml.org,2002:merge":we,"tag:yaml.org,2002:omap":Ln,"tag:yaml.org,2002:pairs":$n,"tag:yaml.org,2002:set":Pn,"tag:yaml.org,2002:timestamp":Ft};function Mn(s,e,t){const n=fi.get(e);if(n&&!s)return t&&!n.includes(we)?n.concat(we):n.slice();let i=n;if(!i)if(Array.isArray(s))i=[];else{const r=Array.from(fi.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${r} or define customTags array`)}if(Array.isArray(s))for(const r of s)i=i.concat(r);else typeof s=="function"&&(i=s(i.slice()));return t&&(i=i.concat(we)),i.reduce((r,o)=>{const a=typeof o=="string"?hi[o]:o;if(!a){const l=JSON.stringify(o),u=Object.keys(hi).map(p=>JSON.stringify(p)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${u}`)}return r.includes(a)||r.push(a),r},[])}c(Mn,"getTags");const Po=c((s,e)=>s.key<e.key?-1:s.key>e.key?1:0,"sortMapEntriesByKey");class zt{static{c(this,"Schema")}constructor({compat:e,customTags:t,merge:n,resolveKnownTags:i,schema:r,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(e)?Mn(e,"compat"):e?Mn(null,e):null,this.name=typeof r=="string"&&r||"core",this.knownTags=i?xo:{},this.tags=Mn(t,this.name,n),this.toStringOptions=a??null,Object.defineProperty(this,Ce,{value:Je}),Object.defineProperty(this,he,{value:Pt}),Object.defineProperty(this,Re,{value:We}),this.sortMapEntries=typeof o=="function"?o:o===!0?Po:null}clone(){const e=Object.create(zt.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}}function Do(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 i=qs(s,e),{commentString:r}=i.options;if(s.commentBefore){t.length!==1&&t.unshift("");const l=r(s.commentBefore);t.unshift(ye(l,""))}let o=!1,a=null;if(s.contents){if(J(s.contents)){if(s.contents.spaceBefore&&n&&t.push(""),s.contents.commentBefore){const p=r(s.contents.commentBefore);t.push(ye(p,""))}i.forceBlockIndent=!!s.comment,a=s.contents.comment}const l=a?void 0:()=>o=!0;let u=qe(s.contents,i,()=>a=null,l);a&&(u+=Ae(u,"",r(a))),(u[0]==="|"||u[0]===">")&&t[t.length-1]==="---"?t[t.length-1]=`--- ${u}`:t.push(u)}else t.push(qe(s.contents,i));if(s.directives?.docEnd)if(s.comment){const l=r(s.comment);l.includes(`
|
|
56
|
+
`)?(t.push("..."),t.push(ye(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(ye(r(l),"")))}return t.join(`
|
|
57
57
|
`)+`
|
|
58
|
-
`}c(
|
|
58
|
+
`}c(Do,"stringifyDocument");class Qe{static{c(this,"Document")}constructor(e,t,n){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,oe,{value:Sn});let i=null;typeof t=="function"||Array.isArray(t)?i=t:n===void 0&&t&&(n=t,t=void 0);const r=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},n);this.options=r;let{version:o}=r;n?._directives?(this.directives=n._directives.atDocument(),this.directives.yaml.explicit&&(o=this.directives.yaml.version)):this.directives=new te({version:o}),this.setSchema(o,n),this.contents=e===void 0?null:this.createNode(e,i,n)}clone(){const e=Object.create(Qe.prototype,{[oe]:{value:Sn}});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=J(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){Ge(this.contents)&&this.contents.add(e)}addIn(e,t){Ge(this.contents)&&this.contents.addIn(e,t)}createAlias(e,t){if(!e.anchor){const n=js(this);e.anchor=!t||n.has(t)?Fs(t||"a",n):t}return new kt(e.anchor)}createNode(e,t,n){let i;if(typeof t=="function")e=t.call({"":e},"",e),i=t;else if(Array.isArray(t)){const y=c(v=>typeof v=="number"||v instanceof String||v instanceof Number,"keyToStr"),C=t.filter(y).map(String);C.length>0&&(t=t.concat(C)),i=t}else n===void 0&&t&&(n=t,t=void 0);const{aliasDuplicateObjects:r,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:u,tag:p}=n??{},{onAnchor:h,setAnchors:f,sourceObjects:g}=ao(this,o||"a"),w={aliasDuplicateObjects:r??!0,keepUndefined:l??!1,onAnchor:h,onTagObj:u,replacer:i,schema:this.schema,sourceObjects:g},d=it(e,p,w);return a&&q(d)&&(d.flow=!0),f(),d}createPair(e,t,n={}){const i=this.createNode(e,null,n),r=this.createNode(t,null,n);return new Z(i,r)}delete(e){return Ge(this.contents)?this.contents.delete(e):!1}deleteIn(e){return rt(e)?this.contents==null?!1:(this.contents=null,!0):Ge(this.contents)?this.contents.deleteIn(e):!1}get(e,t){return q(this.contents)?this.contents.get(e,t):void 0}getIn(e,t){return rt(e)?!t&&F(this.contents)?this.contents.value:this.contents:q(this.contents)?this.contents.getIn(e,t):void 0}has(e){return q(this.contents)?this.contents.has(e):!1}hasIn(e){return rt(e)?this.contents!==void 0:q(this.contents)?this.contents.hasIn(e):!1}set(e,t){this.contents==null?this.contents=Et(this.schema,[e],t):Ge(this.contents)&&this.contents.set(e,t)}setIn(e,t){rt(e)?this.contents=t:this.contents==null?this.contents=Et(this.schema,Array.from(e),t):Ge(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 te({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 te({version:e}),n={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,n=null;break;default:{const i=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${i}`)}}if(t.schema instanceof Object)this.schema=t.schema;else if(n)this.schema=new zt(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:i,onAnchor:r,reviver:o}={}){const a={anchors:new Map,doc:this,keep:!e,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof i=="number"?i:100},l=ae(this.contents,t??"",a);if(typeof r=="function")for(const{count:u,res:p}of a.anchors.values())r(p,u);return typeof o=="function"?Be(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 Do(this,e)}}function Ge(s){if(q(s))return!0;throw new Error("Expected a YAML collection as document contents")}c(Ge,"assertCollection");class Rn extends Error{static{c(this,"YAMLError")}constructor(e,t,n,i){super(),this.name=e,this.code=n,this.message=i,this.pos=t}}class $e extends Rn{static{c(this,"YAMLParseError")}constructor(e,t,n){super("YAMLParseError",e,t,n)}}class di extends Rn{static{c(this,"YAMLWarning")}constructor(e,t,n){super("YAMLWarning",e,t,n)}}const Kt=c((s,e)=>t=>{if(t.pos[0]===-1)return;t.linePos=t.pos.map(a=>e.linePos(a));const{line:n,col:i}=t.linePos[0];t.message+=` at line ${n}, column ${i}`;let r=i-1,o=s.substring(e.lineStarts[n-1],e.lineStarts[n]).replace(/[\n\r]+$/,"");if(r>=60&&o.length>80){const a=Math.min(r-39,o.length-79);o="\u2026"+o.substring(a),r-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),n>1&&/^ *$/.test(o.substring(0,r))){let a=s.substring(e.lineStarts[n-2],e.lineStarts[n-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
|
|
59
59
|
`),o=a+o}if(/[^ ]/.test(o)){let a=1;const l=t.linePos[1];l&&l.line===n&&l.col>i&&(a=Math.max(1,Math.min(l.col-i,80-r)));const u=" ".repeat(r)+"^".repeat(a);t.message+=`:
|
|
60
60
|
|
|
61
61
|
${o}
|
|
62
62
|
${u}
|
|
63
|
-
`}},"prettifyError");function Ve(s,{flow:e,indicator:t,next:n,offset:i,onError:r,parentIndent:o,startOnNewline:a}){let l=!1,u=a,p=a,h="",f="",g=!1,w=!1,d=null,y=null,C=null,v=null
|
|
64
|
-
`))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(
|
|
65
|
-
`+d.comment:a.comment=d.comment);continue}(d.newlineAfterProp||
|
|
66
|
-
|
|
67
|
-
`+A.comment:u.comment=A.comment),h=A.end;continue}!o&&t.options.strict&&
|
|
68
|
-
`+
|
|
69
|
-
`+W.comment:I.comment=W.comment);const
|
|
70
|
-
`+y.comment:u.comment=y.comment),u.range=[n.offset,d,y.offset]}else u.range=[n.offset,d,d];return u}c(
|
|
63
|
+
`}},"prettifyError");function Ve(s,{flow:e,indicator:t,next:n,offset:i,onError:r,parentIndent:o,startOnNewline:a}){let l=!1,u=a,p=a,h="",f="",g=!1,w=!1,d=null,y=null,C=null,v=null,$=null,T=null,N=null;for(const I of s)switch(w&&(I.type!=="space"&&I.type!=="newline"&&I.type!=="comma"&&r(I.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),w=!1),d&&(u&&I.type!=="comment"&&I.type!=="newline"&&r(d,"TAB_AS_INDENT","Tabs are not allowed as indentation"),d=null),I.type){case"space":!e&&(t!=="doc-start"||n?.type!=="flow-collection")&&I.source.includes(" ")&&(d=I),p=!0;break;case"comment":{p||r(I,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");const W=I.source.substring(1)||" ";h?h+=f+W:h=W,f="",u=!1;break}case"newline":u?h?h+=I.source:(!T||t!=="seq-item-ind")&&(l=!0):f+=I.source,u=!0,g=!0,(y||C)&&(v=I),p=!0;break;case"anchor":y&&r(I,"MULTIPLE_ANCHORS","A node can have at most one anchor"),I.source.endsWith(":")&&r(I.offset+I.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=I,N??(N=I.offset),u=!1,p=!1,w=!0;break;case"tag":{C&&r(I,"MULTIPLE_TAGS","A node can have at most one tag"),C=I,N??(N=I.offset),u=!1,p=!1,w=!0;break}case t:(y||C)&&r(I,"BAD_PROP_ORDER",`Anchors and tags must be after the ${I.source} indicator`),T&&r(I,"UNEXPECTED_TOKEN",`Unexpected ${I.source} in ${e??"collection"}`),T=I,u=t==="seq-item-ind"||t==="explicit-key-ind",p=!1;break;case"comma":if(e){$&&r(I,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),$=I,u=!1,p=!1;break}default:r(I,"UNEXPECTED_TOKEN",`Unexpected ${I.type} token`),u=!1,p=!1}const A=s[s.length-1],P=A?A.offset+A.source.length:i;return w&&n&&n.type!=="space"&&n.type!=="newline"&&n.type!=="comma"&&(n.type!=="scalar"||n.source!=="")&&r(n.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),d&&(u&&d.indent<=o||n?.type==="block-map"||n?.type==="block-seq")&&r(d,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:$,found:T,spaceBefore:l,comment:h,hasNewline:g,anchor:y,tag:C,newlineAfterProp:v,end:P,start:N??P}}c(Ve,"resolveProps");function lt(s){if(!s)return null;switch(s.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(s.source.includes(`
|
|
64
|
+
`))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(lt(e.key)||lt(e.value))return!0}return!1;default:return!0}}c(lt,"containsNewline");function jn(s,e,t){if(e?.type==="flow-collection"){const n=e.end[0];n.indent===s&&(n.source==="]"||n.source==="}")&<(e)&&t(n,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}c(jn,"flowIndentCheck");function pi(s,e,t){const{uniqueKeys:n}=s.options;if(n===!1)return!1;const i=typeof n=="function"?n:(r,o)=>r===o||F(r)&&F(o)&&r.value===o.value;return e.some(r=>i(r.key,t))}c(pi,"mapIncludes");const mi="All mapping items must start at the same column";function Mo({composeNode:s,composeEmptyNode:e},t,n,i,r){const o=r?.nodeClass??ie,a=new o(t.schema);t.atRoot&&(t.atRoot=!1);let l=n.offset,u=null;for(const p of n.items){const{start:h,key:f,sep:g,value:w}=p,d=Ve(h,{indicator:"explicit-key-ind",next:f??g?.[0],offset:l,onError:i,parentIndent:n.indent,startOnNewline:!0}),y=!d.found;if(y){if(f&&(f.type==="block-seq"?i(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in f&&f.indent!==n.indent&&i(l,"BAD_INDENT",mi)),!d.anchor&&!d.tag&&!g){u=d.end,d.comment&&(a.comment?a.comment+=`
|
|
65
|
+
`+d.comment:a.comment=d.comment);continue}(d.newlineAfterProp||lt(f))&&i(f??h[h.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else d.found?.indent!==n.indent&&i(l,"BAD_INDENT",mi);t.atKey=!0;const C=d.end,v=f?s(t,f,d,i):e(t,C,h,null,d,i);t.schema.compat&&jn(n.indent,f,i),t.atKey=!1,pi(t,a.items,v)&&i(C,"DUPLICATE_KEY","Map keys must be unique");const $=Ve(g??[],{indicator:"map-value-ind",next:w,offset:v.range[2],onError:i,parentIndent:n.indent,startOnNewline:!f||f.type==="block-scalar"});if(l=$.end,$.found){y&&(w?.type==="block-map"&&!$.hasNewline&&i(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),t.options.strict&&d.start<$.found.offset-1024&&i(v.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));const T=w?s(t,w,$,i):e(t,l,g,null,$,i);t.schema.compat&&jn(n.indent,w,i),l=T.range[2];const N=new Z(v,T);t.options.keepSourceTokens&&(N.srcToken=p),a.items.push(N)}else{y&&i(v.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),$.comment&&(v.comment?v.comment+=`
|
|
66
|
+
`+$.comment:v.comment=$.comment);const T=new Z(v);t.options.keepSourceTokens&&(T.srcToken=p),a.items.push(T)}}return u&&u<l&&i(u,"IMPOSSIBLE","Map comment with trailing content"),a.range=[n.offset,l,u??l],a}c(Mo,"resolveBlockMap");function Ro({composeNode:s,composeEmptyNode:e},t,n,i,r){const o=r?.nodeClass??ve,a=new o(t.schema);t.atRoot&&(t.atRoot=!1),t.atKey&&(t.atKey=!1);let l=n.offset,u=null;for(const{start:p,value:h}of n.items){const f=Ve(p,{indicator:"seq-item-ind",next:h,offset:l,onError:i,parentIndent:n.indent,startOnNewline:!0});if(!f.found)if(f.anchor||f.tag||h)h&&h.type==="block-seq"?i(f.end,"BAD_INDENT","All sequence items must start at the same column"):i(l,"MISSING_CHAR","Sequence item without - indicator");else{u=f.end,f.comment&&(a.comment=f.comment);continue}const g=h?s(t,h,f,i):e(t,f.end,p,null,f,i);t.schema.compat&&jn(n.indent,h,i),l=g.range[2],a.items.push(g)}return a.range=[n.offset,l,u??l],a}c(Ro,"resolveBlockSeq");function ut(s,e,t,n){let i="";if(s){let r=!1,o="";for(const a of s){const{source:l,type:u}=a;switch(u){case"space":r=!0;break;case"comment":{t&&!r&&n(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");const p=l.substring(1)||" ";i?i+=o+p:i=p,o="";break}case"newline":i&&(o+=l),r=!0;break;default:n(a,"UNEXPECTED_TOKEN",`Unexpected ${u} at node end`)}e+=l.length}}return{comment:i,offset:e}}c(ut,"resolveEnd");const Fn="Block collections are not allowed within flow collections",Kn=c(s=>s&&(s.type==="block-map"||s.type==="block-seq"),"isBlock");function jo({composeNode:s,composeEmptyNode:e},t,n,i,r){const o=n.start.source==="{",a=o?"flow map":"flow sequence",l=r?.nodeClass??(o?ie:ve),u=new l(t.schema);u.flow=!0;const p=t.atRoot;p&&(t.atRoot=!1),t.atKey&&(t.atKey=!1);let h=n.offset+n.start.source.length;for(let y=0;y<n.items.length;++y){const C=n.items[y],{start:v,key:$,sep:T,value:N}=C,A=Ve(v,{flow:a,indicator:"explicit-key-ind",next:$??T?.[0],offset:h,onError:i,parentIndent:n.indent,startOnNewline:!1});if(!A.found){if(!A.anchor&&!A.tag&&!T&&!N){y===0&&A.comma?i(A.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<n.items.length-1&&i(A.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),A.comment&&(u.comment?u.comment+=`
|
|
67
|
+
`+A.comment:u.comment=A.comment),h=A.end;continue}!o&&t.options.strict&<($)&&i($,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)A.comma&&i(A.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(A.comma||i(A.start,"MISSING_CHAR",`Missing , between ${a} items`),A.comment){let P="";e:for(const I of v)switch(I.type){case"comma":case"space":break;case"comment":P=I.source.substring(1);break e;default:break e}if(P){let I=u.items[u.items.length-1];_(I)&&(I=I.value??I.key),I.comment?I.comment+=`
|
|
68
|
+
`+P:I.comment=P,A.comment=A.comment.substring(P.length+1)}}if(!o&&!T&&!A.found){const P=N?s(t,N,A,i):e(t,A.end,T,null,A,i);u.items.push(P),h=P.range[2],Kn(N)&&i(P.range,"BLOCK_IN_FLOW",Fn)}else{t.atKey=!0;const P=A.end,I=$?s(t,$,A,i):e(t,P,v,null,A,i);Kn($)&&i(I.range,"BLOCK_IN_FLOW",Fn),t.atKey=!1;const W=Ve(T??[],{flow:a,indicator:"map-value-ind",next:N,offset:I.range[2],onError:i,parentIndent:n.indent,startOnNewline:!1});if(W.found){if(!o&&!A.found&&t.options.strict){if(T)for(const H of T){if(H===W.found)break;if(H.type==="newline"){i(H,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}A.start<W.found.offset-1024&&i(W.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source&&N.source[0]===":"?i(N,"MISSING_CHAR",`Missing space after : in ${a}`):i(W.start,"MISSING_CHAR",`Missing , or : between ${a} items`));const X=N?s(t,N,W,i):W.found?e(t,W.end,T,null,W,i):null;X?Kn(N)&&i(X.range,"BLOCK_IN_FLOW",Fn):W.comment&&(I.comment?I.comment+=`
|
|
69
|
+
`+W.comment:I.comment=W.comment);const be=new Z(I,X);if(t.options.keepSourceTokens&&(be.srcToken=C),o){const H=u;pi(t,H.items,I)&&i(P,"DUPLICATE_KEY","Map keys must be unique"),H.items.push(be)}else{const H=new ie(t.schema);H.flow=!0,H.items.push(be);const ss=(X??I).range;H.range=[I.range[0],ss[1],ss[2]],u.items.push(H)}h=X?X.range[2]:W.end}}const f=o?"}":"]",[g,...w]=n.end;let d=h;if(g&&g.source===f)d=g.offset+g.source.length;else{const y=a[0].toUpperCase()+a.substring(1),C=p?`${y} must end with a ${f}`:`${y} in block collection must be sufficiently indented and end with a ${f}`;i(h,p?"MISSING_CHAR":"BAD_INDENT",C),g&&g.source.length!==1&&w.unshift(g)}if(w.length>0){const y=ut(w,d,t.options.strict,i);y.comment&&(u.comment?u.comment+=`
|
|
70
|
+
`+y.comment:u.comment=y.comment),u.range=[n.offset,d,y.offset]}else u.range=[n.offset,d,d];return u}c(jo,"resolveFlowCollection");function _n(s,e,t,n,i,r){const o=t.type==="block-map"?Mo(s,e,t,n,r):t.type==="block-seq"?Ro(s,e,t,n,r):jo(s,e,t,n,r),a=o.constructor;return i==="!"||i===a.tagName?(o.tag=a.tagName,o):(i&&(o.tag=i),o)}c(_n,"resolveCollection");function Fo(s,e,t,n,i){const r=n.tag,o=r?e.directives.tagName(r.source,f=>i(r,"TAG_RESOLVE_FAILED",f)):null;if(t.type==="block-seq"){const{anchor:f,newlineAfterProp:g}=n,w=f&&r?f.offset>r.offset?f:r:f??r;w&&(!g||g.offset<w.offset)&&i(w,"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(!r||!o||o==="!"||o===ie.tagName&&a==="map"||o===ve.tagName&&a==="seq")return _n(s,e,t,i,o);let l=e.schema.tags.find(f=>f.tag===o&&f.collection===a);if(!l){const f=e.schema.knownTags[o];if(f&&f.collection===a)e.schema.tags.push(Object.assign({},f,{default:!1})),l=f;else return f?i(r,"BAD_COLLECTION_TYPE",`${f.tag} used for ${a} collection, but expects ${f.collection??"scalar"}`,!0):i(r,"TAG_RESOLVE_FAILED",`Unresolved tag: ${o}`,!0),_n(s,e,t,i,o)}const u=_n(s,e,t,i,o,l),p=l.resolve?.(u,f=>i(r,"TAG_RESOLVE_FAILED",f),e.options)??u,h=J(p)?p:new x(p);return h.range=u.range,h.tag=o,l?.format&&(h.format=l.format),h}c(Fo,"composeCollection");function gi(s,e,t){const n=e.offset,i=Ko(e,s.options.strict,t);if(!i)return{value:"",type:null,comment:"",range:[n,n,n]};const r=i.mode===">"?x.BLOCK_FOLDED:x.BLOCK_LITERAL,o=e.source?_o(e.source):[];let a=o.length;for(let d=o.length-1;d>=0;--d){const y=o[d][1];if(y===""||y==="\r")a=d;else break}if(a===0){const d=i.chomp==="+"&&o.length>0?`
|
|
71
71
|
`.repeat(Math.max(1,o.length-1)):"";let y=n+i.length;return e.source&&(y+=e.source.length),{value:d,type:r,comment:i.comment,range:[n,y,y]}}let l=e.indent+i.indent,u=e.offset+i.length,p=0;for(let d=0;d<a;++d){const[y,C]=o[d];if(C===""||C==="\r")i.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&t(u+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),i.indent===0&&(l=y.length),p=d,l===0&&!s.atRoot&&t(u,"BAD_INDENT","Block scalar values in collections must be indented");break}u+=y.length+C.length+1}for(let d=o.length-1;d>=a;--d)o[d][0].length>l&&(a=d+1);let h="",f="",g=!1;for(let d=0;d<p;++d)h+=o[d][0].slice(l)+`
|
|
72
72
|
`;for(let d=p;d<a;++d){let[y,C]=o[d];u+=y.length+C.length+1;const v=C[C.length-1]==="\r";if(v&&(C=C.slice(0,-1)),C&&y.length<l){const T=`Block scalar lines must not be less indented than their ${i.indent?"explicit indentation indicator":"first line"}`;t(u-C.length-(v?2:1),"BAD_INDENT",T),y=""}r===x.BLOCK_LITERAL?(h+=f+y.slice(l)+C,f=`
|
|
73
73
|
`):y.length>l||C[0]===" "?(f===" "?f=`
|
|
@@ -82,71 +82,71 @@ ${u}
|
|
|
82
82
|
`+o[d][0].slice(l);h[h.length-1]!==`
|
|
83
83
|
`&&(h+=`
|
|
84
84
|
`);break;default:h+=`
|
|
85
|
-
`}const w=n+i.length+e.source.length;return{value:h,type:r,comment:i.comment,range:[n,w,w]}}c(
|
|
85
|
+
`}const w=n+i.length+e.source.length;return{value:h,type:r,comment:i.comment,range:[n,w,w]}}c(gi,"resolveBlockScalar");function Ko({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:i}=e[0],r=i[0];let o=0,a="",l=-1;for(let f=1;f<i.length;++f){const g=i[f];if(!a&&(g==="-"||g==="+"))a=g;else{const w=Number(g);!o&&w?o=w:l===-1&&(l=s+f)}}l!==-1&&n(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${i}`);let u=!1,p="",h=i.length;for(let f=1;f<e.length;++f){const g=e[f];switch(g.type){case"space":u=!0;case"newline":h+=g.source.length;break;case"comment":t&&!u&&n(g,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),h+=g.source.length,p=g.source.substring(1);break;case"error":n(g,"UNEXPECTED_TOKEN",g.message),h+=g.source.length;break;default:{const w=`Unexpected token in block scalar header: ${g.type}`;n(g,"UNEXPECTED_TOKEN",w);const d=g.source;d&&typeof d=="string"&&(h+=d.length)}}}return{mode:r,indent:o,chomp:a,comment:p,length:h}}c(Ko,"parseBlockScalarHeader");function _o(s){const e=s.split(/\n( *)/),t=e[0],n=t.match(/^( *)/),r=[n?.[1]?[n[1],t.slice(n[1].length)]:["",t]];for(let o=1;o<e.length;o+=2)r.push([e[o],e[o+1]]);return r}c(_o,"splitLines");function yi(s,e,t){const{offset:n,type:i,source:r,end:o}=s;let a,l;const u=c((f,g,w)=>t(n+f,g,w),"_onError");switch(i){case"scalar":a=x.PLAIN,l=Bo(r,u);break;case"single-quoted-scalar":a=x.QUOTE_SINGLE,l=Uo(r,u);break;case"double-quoted-scalar":a=x.QUOTE_DOUBLE,l=qo(r,u);break;default:return t(s,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${i}`),{value:"",type:null,comment:"",range:[n,n+r.length,n+r.length]}}const p=n+r.length,h=ut(o,p,e,t);return{value:l,type:a,comment:h.comment,range:[n,p,h.offset]}}c(yi,"resolveFlowScalar");function Bo(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}`),wi(s)}c(Bo,"plainValue");function Uo(s,e){return(s[s.length-1]!=="'"||s.length===1)&&e(s.length,"MISSING_CHAR","Missing closing 'quote"),wi(s.slice(1,-1)).replace(/''/g,"'")}c(Uo,"singleQuotedValue");function wi(s){let e,t;try{e=new RegExp(`(.*?)(?<![ ])[ ]*\r?
|
|
86
86
|
`,"sy"),t=new RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
|
|
87
87
|
`,"sy")}catch{e=/(.*?)[ \t]*\r?\n/sy,t=/[ \t]*(.*?)[ \t]*\r?\n/sy}let n=e.exec(s);if(!n)return s;let i=n[1],r=" ",o=e.lastIndex;for(t.lastIndex=o;n=t.exec(s);)n[1]===""?r===`
|
|
88
88
|
`?i+=r:r=`
|
|
89
|
-
`:(i+=r+n[1],r=" "),o=t.lastIndex;const a=/[ \t]*(.*)/sy;return a.lastIndex=o,n=a.exec(s),i+r+(n?.[1]??"")}c(
|
|
89
|
+
`:(i+=r+n[1],r=" "),o=t.lastIndex;const a=/[ \t]*(.*)/sy;return a.lastIndex=o,n=a.exec(s),i+r+(n?.[1]??"")}c(wi,"foldLines");function qo(s,e){let t="";for(let n=1;n<s.length-1;++n){const i=s[n];if(!(i==="\r"&&s[n+1]===`
|
|
90
90
|
`))if(i===`
|
|
91
|
-
`){const{fold:r,offset:o}=
|
|
91
|
+
`){const{fold:r,offset:o}=Jo(s,n);t+=r,n=o}else if(i==="\\"){let r=s[++n];const o=Wo[r];if(o)t+=o;else if(r===`
|
|
92
92
|
`)for(r=s[n+1];r===" "||r===" ";)r=s[++n+1];else if(r==="\r"&&s[n+1]===`
|
|
93
|
-
`)for(r=s[++n+1];r===" "||r===" ";)r=s[++n+1];else if(r==="x"||r==="u"||r==="U"){const a={x:2,u:4,U:8}[r];t+=
|
|
93
|
+
`)for(r=s[++n+1];r===" "||r===" ";)r=s[++n+1];else if(r==="x"||r==="u"||r==="U"){const a={x:2,u:4,U:8}[r];t+=Go(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(i===" "||i===" "){const r=n;let o=s[n+1];for(;o===" "||o===" ";)o=s[++n+1];o!==`
|
|
94
94
|
`&&!(o==="\r"&&s[n+2]===`
|
|
95
|
-
`)&&(t+=n>r?s.slice(r,n+1):i)}else t+=i}return(s[s.length-1]!=='"'||s.length===1)&&e(s.length,"MISSING_CHAR",'Missing closing "quote'),t}c(
|
|
95
|
+
`)&&(t+=n>r?s.slice(r,n+1):i)}else t+=i}return(s[s.length-1]!=='"'||s.length===1)&&e(s.length,"MISSING_CHAR",'Missing closing "quote'),t}c(qo,"doubleQuotedValue");function Jo(s,e){let t="",n=s[e+1];for(;(n===" "||n===" "||n===`
|
|
96
96
|
`||n==="\r")&&!(n==="\r"&&s[e+2]!==`
|
|
97
97
|
`);)n===`
|
|
98
98
|
`&&(t+=`
|
|
99
|
-
`),e+=1,n=s[e+1];return t||(t=" "),{fold:t,offset:e}}c(
|
|
100
|
-
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function
|
|
99
|
+
`),e+=1,n=s[e+1];return t||(t=" "),{fold:t,offset:e}}c(Jo,"foldNewline");const Wo={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
|
|
100
|
+
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function Go(s,e,t,n){const i=s.substr(e,t),o=i.length===t&&/^[0-9a-fA-F]+$/.test(i)?parseInt(i,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(Go,"parseCharCode");function bi(s,e,t,n){const{value:i,type:r,comment:o,range:a}=e.type==="block-scalar"?gi(s,e,n):yi(e,s.options.strict,n),l=t?s.directives.tagName(t.source,h=>n(t,"TAG_RESOLVE_FAILED",h)):null;let u;s.options.stringKeys&&s.atKey?u=s.schema[he]:l?u=Vo(s.schema,i,l,t,n):e.type==="scalar"?u=Ho(s,i,e,n):u=s.schema[he];let p;try{const h=u.resolve(i,f=>n(t??e,"TAG_RESOLVE_FAILED",f),s.options);p=F(h)?h:new x(h)}catch(h){const f=h instanceof Error?h.message:String(h);n(t??e,"TAG_RESOLVE_FAILED",f),p=new x(i)}return p.range=a,p.source=i,r&&(p.type=r),l&&(p.tag=l),u.format&&(p.format=u.format),o&&(p.comment=o),p}c(bi,"composeScalar");function Vo(s,e,t,n,i){if(t==="!")return s[he];const r=[];for(const a of s.tags)if(!a.collection&&a.tag===t)if(a.default&&a.test)r.push(a);else return a;for(const a of r)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):(i(n,"TAG_RESOLVE_FAILED",`Unresolved tag: ${t}`,t!=="tag:yaml.org,2002:str"),s[he])}c(Vo,"findScalarTagByName");function Ho({atKey:s,directives:e,schema:t},n,i,r){const o=t.tags.find(a=>(a.default===!0||s&&a.default==="key")&&a.test?.test(n))||t[he];if(t.compat){const a=t.compat.find(l=>l.default&&l.test?.test(n))??t[he];if(o.tag!==a.tag){const l=e.tagString(o.tag),u=e.tagString(a.tag),p=`Value may be parsed as either ${l} or ${u}`;r(i,"TAG_RESOLVE_FAILED",p,!0)}}return o}c(Ho,"findScalarTagByTest");function Yo(s,e,t){if(e){t??(t=e.length);for(let n=t-1;n>=0;--n){let i=e[n];switch(i.type){case"space":case"comment":case"newline":s-=i.source.length;continue}for(i=e[++n];i?.type==="space";)s+=i.source.length,i=e[++n];break}}return s}c(Yo,"emptyScalarPosition");const zo={composeNode:Si,composeEmptyNode:Bn};function Si(s,e,t,n){const i=s.atKey,{spaceBefore:r,comment:o,anchor:a,tag:l}=t;let u,p=!0;switch(e.type){case"alias":u=Qo(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=bi(s,e,l,n),a&&(u.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":u=Fo(zo,s,e,t,n),a&&(u.anchor=a.source.substring(1));break;default:{const h=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;n(e,"UNEXPECTED_TOKEN",h),u=Bn(s,e.offset,void 0,null,t,n),p=!1}}return a&&u.anchor===""&&n(a,"BAD_ALIAS","Anchor cannot be an empty string"),i&&s.options.stringKeys&&(!F(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"),r&&(u.spaceBefore=!0),o&&(e.type==="scalar"&&e.source===""?u.comment=o:u.commentBefore=o),s.options.keepSourceTokens&&p&&(u.srcToken=e),u}c(Si,"composeNode");function Bn(s,e,t,n,{spaceBefore:i,comment:r,anchor:o,tag:a,end:l},u){const p={type:"scalar",offset:Yo(e,t,n),indent:-1,source:""},h=bi(s,p,a,u);return o&&(h.anchor=o.source.substring(1),h.anchor===""&&u(o,"BAD_ALIAS","Anchor cannot be an empty string")),i&&(h.spaceBefore=!0),r&&(h.comment=r,h.range[2]=l),h}c(Bn,"composeEmptyNode");function Qo({options:s},{offset:e,source:t,end:n},i){const r=new kt(t.substring(1));r.source===""&&i(e,"BAD_ALIAS","Alias cannot be an empty string"),r.source.endsWith(":")&&i(e+t.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);const o=e+t.length,a=ut(n,o,s.strict,i);return r.range=[e,o,a.offset],a.comment&&(r.comment=a.comment),r}c(Qo,"composeAlias");function Xo(s,e,{offset:t,start:n,value:i,end:r},o){const a=Object.assign({_directives:e},s),l=new Qe(void 0,a),u={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},p=Ve(n,{indicator:"doc-start",next:i??r?.[0],offset:t,onError:o,parentIndent:0,startOnNewline:!0});p.found&&(l.directives.docStart=!0,i&&(i.type==="block-map"||i.type==="block-seq")&&!p.hasNewline&&o(p.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=i?Si(u,i,p,o):Bn(u,p.end,n,null,p,o);const h=l.contents.range[2],f=ut(r,h,!1,o);return f.comment&&(l.comment=f.comment),l.range=[t,h,f.offset],l}c(Xo,"composeDoc");function ft(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(ft,"getErrorPos");function Ci(s){let e="",t=!1,n=!1;for(let i=0;i<s.length;++i){const r=s[i];switch(r[0]){case"#":e+=(e===""?"":n?`
|
|
101
101
|
|
|
102
102
|
`:`
|
|
103
|
-
`)+(r.substring(1)||" "),t=!0,n=!1;break;case"%":s[i+1]?.[0]!=="#"&&(i+=1),t=!1;break;default:t||(n=!0),t=!1}}return{comment:e,afterEmptyLine:n}}c(
|
|
104
|
-
${n}`:n;else if(i||e.directives.docStart||!r)e.commentBefore=n;else if(q(r)&&!r.flow&&r.items.length>0){let o=r.items[0];
|
|
103
|
+
`)+(r.substring(1)||" "),t=!0,n=!1;break;case"%":s[i+1]?.[0]!=="#"&&(i+=1),t=!1;break;default:t||(n=!0),t=!1}}return{comment:e,afterEmptyLine:n}}c(Ci,"parsePrelude");class Un{static{c(this,"Composer")}constructor(e={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(t,n,i,r)=>{const o=ft(t);r?this.warnings.push(new di(o,n,i)):this.errors.push(new $e(o,n,i))},this.directives=new te({version:e.version||"1.2"}),this.options=e}decorate(e,t){const{comment:n,afterEmptyLine:i}=Ci(this.prelude);if(n){const r=e.contents;if(t)e.comment=e.comment?`${e.comment}
|
|
104
|
+
${n}`:n;else if(i||e.directives.docStart||!r)e.commentBefore=n;else if(q(r)&&!r.flow&&r.items.length>0){let o=r.items[0];_(o)&&(o=o.key);const a=o.commentBefore;o.commentBefore=a?`${n}
|
|
105
105
|
${a}`:n}else{const o=r.commentBefore;r.commentBefore=o?`${n}
|
|
106
|
-
${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:
|
|
107
|
-
${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.push(new $e(
|
|
106
|
+
${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:Ci(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,t=!1,n=-1){for(const i of e)yield*this.next(i);yield*this.end(t,n)}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(t,n,i)=>{const r=ft(e);r[0]+=t,this.onError(r,"BAD_DIRECTIVE",n,i)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{const t=Xo(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 $e(ft(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 $e(ft(e),"UNEXPECTED_TOKEN",n));break}this.doc.directives.docEnd=!0;const t=ut(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}
|
|
107
|
+
${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.push(new $e(ft(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),i=new Qe(void 0,n);this.atDirectives&&this.onError(t,"MISSING_CHAR","Missing directives-end indicator line"),i.range=[0,t,t],this.decorate(i,!1),yield i}}}function Zo(s,e=!0,t){if(s){const n=c((i,r,o)=>{const a=typeof i=="number"?i:Array.isArray(i)?i[0]:i.offset;if(t)t(a,r,o);else throw new $e([a,a+1],r,o)},"_onError");switch(s.type){case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yi(s,e,n);case"block-scalar":return gi({options:{strict:e}},s,n)}}return null}c(Zo,"resolveAsScalar");function ea(s,e){const{implicitKey:t=!1,indent:n,inFlow:i=!1,offset:r=-1,type:o="PLAIN"}=e,a=at({type:o,value:s},{implicitKey:t,indent:n>0?" ".repeat(n):"",inFlow:i,options:{blockQuote:!0,lineWidth:-1}}),l=e.end??[{type:"newline",offset:-1,indent:n,source:`
|
|
108
108
|
`}];switch(a[0]){case"|":case">":{const u=a.indexOf(`
|
|
109
109
|
`),p=a.substring(0,u),h=a.substring(u+1)+`
|
|
110
|
-
`,f=[{type:"block-scalar-header",offset:r,indent:n,source:p}];return
|
|
111
|
-
`}),{type:"block-scalar",offset:r,indent:n,props:f,source:h}}case'"':return{type:"double-quoted-scalar",offset:r,indent:n,source:a,end:l};case"'":return{type:"single-quoted-scalar",offset:r,indent:n,source:a,end:l};default:return{type:"scalar",offset:r,indent:n,source:a,end:l}}}c(
|
|
110
|
+
`,f=[{type:"block-scalar-header",offset:r,indent:n,source:p}];return ki(f,l)||f.push({type:"newline",offset:-1,indent:n,source:`
|
|
111
|
+
`}),{type:"block-scalar",offset:r,indent:n,props:f,source:h}}case'"':return{type:"double-quoted-scalar",offset:r,indent:n,source:a,end:l};case"'":return{type:"single-quoted-scalar",offset:r,indent:n,source:a,end:l};default:return{type:"scalar",offset:r,indent:n,source:a,end:l}}}c(ea,"createScalarToken");function ta(s,e,t={}){let{afterKey:n=!1,implicitKey:i=!1,inFlow:r=!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=at({type:o,value:e},{implicitKey:i||a===null,indent:a!==null&&a>0?" ".repeat(a):"",inFlow:r,options:{blockQuote:!0,lineWidth:-1}});switch(l[0]){case"|":case">":na(s,l);break;case'"':qn(s,l,"double-quoted-scalar");break;case"'":qn(s,l,"single-quoted-scalar");break;default:qn(s,l,"scalar")}}c(ta,"setScalarValue");function na(s,e){const t=e.indexOf(`
|
|
112
112
|
`),n=e.substring(0,t),i=e.substring(t+1)+`
|
|
113
|
-
`;if(s.type==="block-scalar"){const r=s.props[0];if(r.type!=="block-scalar-header")throw new Error("Invalid block scalar header");r.source=n,s.source=i}else{const{offset:r}=s,o="indent"in s?s.indent:-1,a=[{type:"block-scalar-header",offset:r,indent:o,source:n}];
|
|
114
|
-
`});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:i})}}c(
|
|
115
|
-
`};delete s.items,Object.assign(s,{type:t,source:e,end:[i]});break}default:{const n="indent"in s?s.indent:-1,i="end"in s&&Array.isArray(s.end)?s.end.filter(r=>r.type==="space"||r.type==="comment"||r.type==="newline"):[];for(const r of Object.keys(s))r!=="type"&&r!=="offset"&&delete s[r];Object.assign(s,{type:t,indent:n,source:e,end:i})}}}c(
|
|
113
|
+
`;if(s.type==="block-scalar"){const r=s.props[0];if(r.type!=="block-scalar-header")throw new Error("Invalid block scalar header");r.source=n,s.source=i}else{const{offset:r}=s,o="indent"in s?s.indent:-1,a=[{type:"block-scalar-header",offset:r,indent:o,source:n}];ki(a,"end"in s?s.end:void 0)||a.push({type:"newline",offset:-1,indent:o,source:`
|
|
114
|
+
`});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:i})}}c(na,"setBlockScalarValue");function ki(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(ki,"addEndtoBlockProps");function qn(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 i=e.length;s.props[0].type==="block-scalar-header"&&(i-=s.props[0].source.length);for(const r of n)r.offset+=i;delete s.props,Object.assign(s,{type:t,source:e,end:n});break}case"block-map":case"block-seq":{const i={type:"newline",offset:s.offset+e.length,indent:s.indent,source:`
|
|
115
|
+
`};delete s.items,Object.assign(s,{type:t,source:e,end:[i]});break}default:{const n="indent"in s?s.indent:-1,i="end"in s&&Array.isArray(s.end)?s.end.filter(r=>r.type==="space"||r.type==="comment"||r.type==="newline"):[];for(const r of Object.keys(s))r!=="type"&&r!=="offset"&&delete s[r];Object.assign(s,{type:t,indent:n,source:e,end:i})}}}c(qn,"setFlowScalarValue");const sa=c(s=>"type"in s?_t(s):Bt(s),"stringify$1");function _t(s){switch(s.type){case"block-scalar":{let e="";for(const t of s.props)e+=_t(t);return e+s.source}case"block-map":case"block-seq":{let e="";for(const t of s.items)e+=Bt(t);return e}case"flow-collection":{let e=s.start.source;for(const t of s.items)e+=Bt(t);for(const t of s.end)e+=t.source;return e}case"document":{let e=Bt(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(_t,"stringifyToken");function Bt({start:s,key:e,sep:t,value:n}){let i="";for(const r of s)i+=r.source;if(e&&(i+=_t(e)),t)for(const r of t)i+=r.source;return n&&(i+=_t(n)),i}c(Bt,"stringifyItem");const Jn=Symbol("break visit"),ia=Symbol("skip children"),vi=Symbol("remove item");function Le(s,e){"type"in s&&s.type==="document"&&(s={start:s.start,value:s.value}),Ei(Object.freeze([]),s,e)}c(Le,"visit"),Le.BREAK=Jn,Le.SKIP=ia,Le.REMOVE=vi,Le.itemAtPath=(s,e)=>{let t=s;for(const[n,i]of e){const r=t?.[n];if(r&&"items"in r)t=r.items[i];else return}return t},Le.parentCollection=(s,e)=>{const t=Le.itemAtPath(s,e.slice(0,-1)),n=e[e.length-1][0],i=t?.[n];if(i&&"items"in i)return i;throw new Error("Parent collection not found")};function Ei(s,e,t){let n=t(e,s);if(typeof n=="symbol")return n;for(const i of["key","value"]){const r=e[i];if(r&&"items"in r){for(let o=0;o<r.items.length;++o){const a=Ei(Object.freeze(s.concat([[i,o]])),r.items[o],t);if(typeof a=="number")o=a-1;else{if(a===Jn)return Jn;a===vi&&(r.items.splice(o,1),o-=1)}}typeof n=="function"&&i==="key"&&(n=n(e,s))}}return typeof n=="function"?n(e,s):n}c(Ei,"_visit");const Ut="\uFEFF",qt="",Jt="",ht="",ra=c(s=>!!s&&"items"in s,"isCollection"),oa=c(s=>!!s&&(s.type==="scalar"||s.type==="single-quoted-scalar"||s.type==="double-quoted-scalar"||s.type==="block-scalar"),"isScalar");function aa(s){switch(s){case Ut:return"<BOM>";case qt:return"<DOC>";case Jt:return"<FLOW_END>";case ht:return"<SCALAR>";default:return JSON.stringify(s)}}c(aa,"prettyToken");function Ii(s){switch(s){case Ut:return"byte-order-mark";case qt:return"doc-mode";case Jt:return"flow-error-end";case ht:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
|
|
116
116
|
`:case`\r
|
|
117
|
-
`: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(
|
|
118
|
-
`:case"\r":case" ":return!0;default:return!1}}c(
|
|
119
|
-
\r `),
|
|
117
|
+
`: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(Ii,"tokenType");var ca=Object.freeze({__proto__:null,BOM:Ut,DOCUMENT:qt,FLOW_END:Jt,SCALAR:ht,createScalarToken:ea,isCollection:ra,isScalar:oa,prettyToken:aa,resolveAsScalar:Zo,setScalarValue:ta,stringify:sa,tokenType:Ii,visit:Le});function ue(s){switch(s){case void 0:case" ":case`
|
|
118
|
+
`:case"\r":case" ":return!0;default:return!1}}c(ue,"isEmpty");const Ti=new Set("0123456789ABCDEFabcdef"),la=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Wt=new Set(",[]{}"),ua=new Set(` ,[]{}
|
|
119
|
+
\r `),Wn=c(s=>!s||ua.has(s),"isNotAnchorChar");class Ni{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===`
|
|
120
120
|
`?!0:t==="\r"?this.buffer[e+1]===`
|
|
121
121
|
`:!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 i=this.buffer[n+e+1];if(i===`
|
|
122
122
|
`||!i&&!this.atEnd)return e+n+1}return t===`
|
|
123
|
-
`||n>=this.indentNext||!t&&!this.atEnd?e+n:-1}if(t==="-"||t==="."){const n=this.buffer.substr(e,3);if((n==="---"||n==="...")&&
|
|
124
|
-
`,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]===
|
|
123
|
+
`||n>=this.indentNext||!t&&!this.atEnd?e+n:-1}if(t==="-"||t==="."){const n=this.buffer.substr(e,3);if((n==="---"||n==="...")&&ue(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(`
|
|
124
|
+
`,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]===Ut&&(yield*this.pushCount(1),e=e.substring(1)),e[0]==="%"){let t=e.length,n=e.indexOf("#");for(;n!==-1;){const r=e[n-1];if(r===" "||r===" "){t=n-1;break}else n=e.indexOf("#",n+1)}for(;;){const r=e[t-1];if(r===" "||r===" ")t-=1;else break}const i=(yield*this.pushCount(t))+(yield*this.pushSpaces(!0));return yield*this.pushCount(e.length-i),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 qt,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==="...")&&ue(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&&!ue(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===":")&&ue(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(Wn),"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 i=this.getLine();if(i===null)return this.setNext("flow");if((n!==-1&&n<this.indentNext&&i[0]!=="#"||n===0&&(i.startsWith("---")||i.startsWith("..."))&&ue(i[3]))&&!(n===this.indentNext-1&&this.flowLevel===1&&(i[0]==="]"||i[0]==="}")))return this.flowLevel=0,yield Jt,yield*this.parseLineStart();let r=0;for(;i[r]===",";)r+=yield*this.pushCount(1),r+=yield*this.pushSpaces(!0),this.flowKey=!1;switch(r+=yield*this.pushIndicators(),i[r]){case void 0:return"flow";case"#":return yield*this.pushCount(i.length-r),"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(Wn),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{const o=this.charAt(1);if(this.flowKey||ue(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 r=0;for(;this.buffer[t-1-r]==="\\";)r+=1;if(r%2===0)break;t=this.buffer.indexOf('"',t+1)}const n=this.buffer.substring(0,t);let i=n.indexOf(`
|
|
125
125
|
`,this.pos);if(i!==-1){for(;i!==-1;){const r=this.continueScalar(i+1);if(r===-1)break;i=n.indexOf(`
|
|
126
|
-
`,r)}i!==-1&&(t=i-(n[i-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=>
|
|
126
|
+
`,r)}i!==-1&&(t=i-(n[i-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=>ue(t)||t==="#")}*parseBlockScalar(){let e=this.pos-1,t=0,n;e:for(let r=this.pos;n=this.buffer[r];++r)switch(n){case" ":t+=1;break;case`
|
|
127
127
|
`:e=r,t=0;break;case"\r":{const o=this.buffer[r+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
|
|
128
128
|
`)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 r=this.continueScalar(e+1);if(r===-1)break;e=this.buffer.indexOf(`
|
|
129
129
|
`,r)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}let i=e+1;for(n=this.buffer[i];n===" ";)n=this.buffer[++i];if(n===" "){for(;n===" "||n===" "||n==="\r"||n===`
|
|
130
130
|
`;)n=this.buffer[++i];e=i-1}else if(!this.blockScalarKeep)do{let r=e-1,o=this.buffer[r];o==="\r"&&(o=this.buffer[--r]);const a=r;for(;o===" ";)o=this.buffer[--r];if(o===`
|
|
131
|
-
`&&r>=this.pos&&r+1+t>a)e=r;else break}while(!0);return yield
|
|
131
|
+
`&&r>=this.pos&&r+1+t>a)e=r;else break}while(!0);return yield ht,yield*this.pushToIndex(e+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){const e=this.flowLevel>0;let t=this.pos-1,n=this.pos-1,i;for(;i=this.buffer[++n];)if(i===":"){const r=this.buffer[n+1];if(ue(r)||e&&Wt.has(r))break;t=n}else if(ue(i)){let r=this.buffer[n+1];if(i==="\r"&&(r===`
|
|
132
132
|
`?(n+=1,i=`
|
|
133
|
-
`,r=this.buffer[n+1]):t=n),r==="#"||e&&
|
|
134
|
-
`){const o=this.continueScalar(n+1);if(o===-1)break;n=Math.max(n,o-2)}}else{if(e&&
|
|
133
|
+
`,r=this.buffer[n+1]):t=n),r==="#"||e&&Wt.has(r))break;if(i===`
|
|
134
|
+
`){const o=this.continueScalar(n+1);if(o===-1)break;n=Math.max(n,o-2)}}else{if(e&&Wt.has(i))break;t=n}return!i&&!this.atEnd?this.setNext("plain-scalar"):(yield ht,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(Wn))+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators());case"-":case"?":case":":{const e=this.flowLevel>0,t=this.charAt(1);if(ue(t)||e&&Wt.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(;!ue(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(la.has(t))t=this.buffer[++e];else if(t==="%"&&Ti.has(this.buffer[e+1])&&Ti.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===`
|
|
135
135
|
`?yield*this.pushCount(1):e==="\r"&&this.charAt(1)===`
|
|
136
|
-
`?yield*this.pushCount(2):0}*pushSpaces(e){let t=this.pos-1,n;do n=this.buffer[++t];while(n===" "||e&&n===" ");const i=t-this.pos;return i>0&&(yield this.buffer.substr(this.pos,i),this.pos=t),i}*pushUntil(e){let t=this.pos,n=this.buffer[t];for(;!e(n);)n=this.buffer[++t];return yield*this.pushToIndex(t,!1)}}class
|
|
136
|
+
`?yield*this.pushCount(2):0}*pushSpaces(e){let t=this.pos-1,n;do n=this.buffer[++t];while(n===" "||e&&n===" ");const i=t-this.pos;return i>0&&(yield this.buffer.substr(this.pos,i),this.pos=t),i}*pushUntil(e){let t=this.pos,n=this.buffer[t];for(;!e(n);)n=this.buffer[++t];return yield*this.pushToIndex(t,!1)}}class Ai{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 r=t+n>>1;this.lineStarts[r]<e?t=r+1:n=r}if(this.lineStarts[t]===e)return{line:t+1,col:1};if(t===0)return{line:0,col:e};const i=this.lineStarts[t-1];return{line:t,col:e-i+1}}}}function Ee(s,e){for(let t=0;t<s.length;++t)if(s[t].type===e)return!0;return!1}c(Ee,"includesToken");function Oi(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(Oi,"findNonEmptyIndex");function $i(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($i,"isFlowToken");function Gt(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(Gt,"getPrevProps");function He(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(He,"getFirstKeyStartProps");function Li(s){if(s.start.type==="flow-seq-start")for(const e of s.items)e.sep&&!e.value&&!Ee(e.start,"explicit-key-ind")&&!Ee(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,$i(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(Li,"fixFlowSeqItems");class Gn{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 Ni,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=Ii(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"&&Li(t),n.type){case"document":n.value=t;break;case"block-scalar":n.props.push(t);break;case"block-map":{const i=n.items[n.items.length-1];if(i.value){n.items.push({start:[],key:t,sep:[]}),this.onKeyLine=!0;return}else if(i.sep)i.value=t;else{Object.assign(i,{key:t,sep:[]}),this.onKeyLine=!i.explicitKey;return}break}case"block-seq":{const i=n.items[n.items.length-1];i.value?n.items.push({start:[],value:t}):i.value=t;break}case"flow-collection":{const i=n.items[n.items.length-1];!i||i.value?n.items.push({start:[],key:t,sep:[]}):i.sep?i.value=t:Object.assign(i,{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 i=t.items[t.items.length-1];i&&!i.sep&&!i.value&&i.start.length>0&&Oi(i.start)===-1&&(t.indent===0||i.start.every(r=>r.type!=="comment"||r.indent<t.indent))&&(n.type==="document"?n.end=i.start:n.items.push({start:i.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":{Oi(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=Gt(this.peek(2)),n=He(t);let i;e.end?(i=e.end,i.push(this.sourceToken),delete e.end):i=[this.sourceToken];const r={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:n,key:e,sep:i}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}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(`
|
|
137
137
|
`)+1;for(;t!==0;)this.onNewLine(this.offset+t),t=this.source.indexOf(`
|
|
138
|
-
`,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 i=e.items[e.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,t.start),i.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,i=n&&(t.sep||t.explicitKey)&&this.type!=="seq-item-ind";let r=[];if(i&&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&&(r=t.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":i||t.value?(r.push(this.sourceToken),e.items.push({start:r}),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):i||t.value?(r.push(this.sourceToken),e.items.push({start:r,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(Ee(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]});else if(
|
|
138
|
+
`,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 i=e.items[e.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,t.start),i.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,i=n&&(t.sep||t.explicitKey)&&this.type!=="seq-item-ind";let r=[];if(i&&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&&(r=t.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":i||t.value?(r.push(this.sourceToken),e.items.push({start:r}),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):i||t.value?(r.push(this.sourceToken),e.items.push({start:r,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(Ee(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]});else if($i(t.key)&&!Ee(t.sep,"newline")){const o=He(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 r.length>0?t.sep=t.sep.concat(r,this.sourceToken):t.sep.push(this.sourceToken);else if(Ee(t.start,"newline"))Object.assign(t,{key:null,sep:[this.sourceToken]});else{const o=He(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||i?e.items.push({start:r,key:null,sep:[this.sourceToken]}):Ee(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);i||t.value?(e.items.push({start:r,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&&!Ee(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:r});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 i=e.items[e.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,t.start),i.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||Ee(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 i=this.flowScalar(this.type);!t||t.value?e.items.push({start:[],key:i,sep:[]}):t.sep?this.stack.push(i):Object.assign(t,{key:i,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 i=Gt(n),r=He(i);Li(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:r,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(`
|
|
139
139
|
`)+1;for(;t!==0;)this.onNewLine(this.offset+t),t=this.source.indexOf(`
|
|
140
|
-
`,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=Jt(e),n=He(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=Jt(e),n=He(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 Li(s){const e=s.prettyErrors!==!1;return{lineCounter:s.lineCounter||e&&new Ni||null,prettyErrors:e}}c(Li,"parseOptions");function ca(s,e={}){const{lineCounter:t,prettyErrors:n}=Li(e),i=new qn(t?.addNewLine),r=new _n(e),o=Array.from(r.compose(i.parse(s)));if(n&&t)for(const a of o)a.errors.forEach(jt(s,t)),a.warnings.forEach(jt(s,t));return o.length>0?o:Object.assign([],{empty:!0},r.streamInfo())}c(ca,"parseAllDocuments");function xi(s,e={}){const{lineCounter:t,prettyErrors:n}=Li(e),i=new qn(t?.addNewLine),r=new _n(e);let o=null;for(const a of r.compose(i.parse(s),!0,s.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new $e(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return n&&t&&(o.errors.forEach(jt(s,t)),o.warnings.forEach(jt(s,t))),o}c(xi,"parseDocument");function la(s,e,t){let n;typeof e=="function"?n=e:t===void 0&&e&&typeof e=="object"&&(t=e);const i=xi(s,t);if(!i)return null;if(i.warnings.forEach(r=>qs(i.options.logLevel,r)),i.errors.length>0){if(i.options.logLevel!=="silent")throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:n},t))}c(la,"parse");function ua(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 i=Math.round(t);t=i<1?void 0:i>8?{indent:8}:{indent:i}}if(s===void 0){const{keepUndefined:i}=t??e??{};if(!i)return}return Te(s)&&!n?s.toString(t):new Qe(s,n,t).toString(t)}c(ua,"stringify");var fa=Object.freeze({__proto__:null,Alias:St,CST:ra,Composer:_n,Document:Qe,Lexer:Ti,LineCounter:Ni,Pair:X,Parser:qn,Scalar:x,Schema:Ht,YAMLError:Dn,YAMLMap:se,YAMLParseError:$e,YAMLSeq:ve,YAMLWarning:hi,isAlias:ke,isCollection:q,isDocument:Te,isMap:je,isNode:J,isPair:F,isScalar:K,isSeq:Ke,parse:la,parseAllDocuments:ca,parseDocument:xi,stringify:ua,visit:Ne,visitAsync:bt});const ne={Added:"added",Changed:"changed",Deleted:"deleted",Stopped:"stopped"},ha={ignored:Xr,persistent:!0,ignoreInitial:!0,followSymlinks:!1,depth:10,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100},ignorePermissionErrors:!0,atomic:!0,usePolling:!1,alwaysStat:!1,interval:1e3,binaryInterval:300};class da extends ps{static{c(this,"FileWatcher")}constructor(e){super(),this.options=e,this.membraneDir=wt(this.options.cwd)}isWatching=!1;watcher;membraneDir;contentCache={};async start(){this.isWatching||(L.existsSync(this.membraneDir)||L.mkdirSync(this.membraneDir,{recursive:!0}),this.initializeContentCache(),this.watcher=dr.watch(this.membraneDir,ha),this.watcher.on("add",e=>this.handleFileSystemEvent(ne.Added,e)).on("change",e=>this.handleFileSystemEvent(ne.Changed,e)).on("unlink",e=>this.handleFileSystemEvent(ne.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.emit(ne.Stopped))}getCwd(){return this.options.cwd}handleFileSystemEvent(e,t){const n=P.relative(this.membraneDir,t);if(e===ne.Deleted){this.removeFromCache(n);const a={filePath:t,relativePath:n,data:void 0};$.info(`[local] ${e}: ${a.relativePath}`),this.emit(e,a);return}const i=this.readFileContent(t);if(!this.hasContentChanged(n,i,e))return;const o=this.processFileEvent(t,i);this.updateCache(n,i),o&&($.info(`[local] ${e}: ${o.relativePath}`),this.emit(e,o))}readFileContent(e){return L.readFileSync(e,"utf8")}processFileEvent(e,t){const n=P.relative(this.membraneDir,e);let i;try{i=t?fa.parse(t):void 0}catch{i=void 0}return{filePath:e,relativePath:n,data:i}}hasContentChanged(e,t,n){if(n==="added")return!0;if(!t)return this.contentCache[e]!==void 0;const i=this.getContentHash(t);return this.contentCache[e]!==i}getContentHash(e){return Zi.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(){L.existsSync(this.membraneDir)&&this.scanDirectoryForCache(this.membraneDir)}scanDirectoryForCache(e){const t=L.readdirSync(e,{withFileTypes:!0});for(const n of t){const i=P.join(e,n.name);if(n.isDirectory())this.scanDirectoryForCache(i);else if(n.isFile())try{const r=L.readFileSync(i,"utf8"),o=P.relative(this.membraneDir,i);this.updateCache(o,r)}catch{}}}}const Z={UPDATE:"update",DELETE:"delete",CREATE:"create"},de={INCOMING:"incoming",OUTGOING:"outgoing"};class ft{static{c(this,"ElementSyncService")}constructor(e,t){this.localManager=e,this.remoteManager=t,this.notifier=z}fileWatcher=void 0;notifier;changes=[];hasConflicts(){return this.changes.some(e=>e.isConflict)}hasChanges(){return this.changes.length>0}async startWatching(){this.fileWatcher=new da({cwd:process.cwd()}),this.fileWatcher.on(ne.Added,e=>this.handleLocalEvent(e,ne.Added)),this.fileWatcher.on(ne.Changed,e=>this.handleLocalEvent(e,ne.Changed)),this.fileWatcher.on(ne.Deleted,e=>this.handleLocalEvent(e,ne.Deleted)),await this.fileWatcher.start(),$.success("[local] Tracking changes..")}async stopWatching(){await this.fileWatcher?.stop(),this.fileWatcher=void 0}async handleLocalEvent(e,t){let n=V.fromPathAndData(e.filePath,e.data);if(!n){const r=V.idFromPath(e.filePath);if(!r||(n=this.remoteManager.cache.get(r),!n))return}const i=this.getManager(de.OUTGOING);switch($.info(`[resolver][${this.getDirectionLabel(de.OUTGOING)}] ${t}: ${n.id}`),t){case ne.Added:case ne.Changed:await i.putElement(n);break;case ne.Deleted:await i.deleteElement(n);break}}detectIncomingChanges(){this.clearChanges();const e=ft.getChanges(de.INCOMING,this.remoteManager.cache,this.localManager.cache);return this.updateChanges(e),e}detectOutgoingChanges(){this.clearChanges();const e=ft.getChanges(de.OUTGOING,this.localManager.cache,this.remoteManager.cache);return this.updateChanges(e),e}getChange(e){const t=this.localManager.cache.get(e.id),n=this.remoteManager.cache.get(e.id);return!t&&n?{type:Z.CREATE,element:n,direction:de.INCOMING,isConflict:!1}:t&&!n?{type:Z.DELETE,element:t,direction:de.OUTGOING,isConflict:!0}:t&&n&&!t.isEqual(n)?{type:Z.UPDATE,element:t,direction:de.OUTGOING,isConflict:!0}:null}async resolveChanges(){this.hasChanges()&&($.info("[resolver] Resolving changes.."),await Promise.all(this.changes.map(e=>this.resolveChange(e))),$.success(`[resolver] Resolved ${this.changes.length} changes`))}async resolveChange(e){const t=this.getManager(e.direction);switch(e.type){case Z.DELETE:return $.info(`[resolver][${this.getDirectionLabel(e.direction)}] Deleting ${e.element.id}`),t.deleteElement(e.element);case Z.CREATE:return $.info(`[resolver][${this.getDirectionLabel(e.direction)}] Creating ${e.element.id}`),t.putElement(e.element);case Z.UPDATE:return $.info(`[resolver][${this.getDirectionLabel(e.direction)}] Updating ${e.element.id}`),t.putElement(e.element)}}getManager(e){return e===de.INCOMING?this.localManager:this.remoteManager}static getChanges(e,t,n){const i=t.getAllIds(),r=n.getAllIds(),o=new Set([...i,...r]),a=[];for(const l of o){const u=t.get(l),p=n.get(l),h=ft.detectChangeForElement(u,p,e);h&&a.push(h)}return a}updateChanges(e){this.changes=e;for(const t of e)$.info(`[resolver][${this.getDirectionLabel(t.direction)}] ${this.getTypeLabel(t.type)} ${t.element.id}`);if(this.hasConflicts()){const t=e.filter(n=>n.isConflict);$.warning("[resolver] Conflicts detected"),this.notifier.setConflicts(t)}}clearChanges(){this.changes=[]}getDirectionLabel(e){switch(e){case de.INCOMING:return"local\u2190remote";case de.OUTGOING:return"local\u2192remote"}}getTypeLabel(e){switch(e){case Z.CREATE:return"ADD";case Z.UPDATE:return"UPD";case Z.DELETE:return"DEL"}}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:!0}:null}}class pa{static{c(this,"WorkspaceService")}notifier;local;remote;syncService;constructor(){this.notifier=z,this.local=new vs(new eo),this.remote=new vs(new to),this.syncService=new ft(this.local,this.remote)}async push(e={}){await this.notifier.setState(M.PUSHING);try{await this.refreshElements()}catch(n){return $.error(`Failed to refresh elements: ${n instanceof Error?n.message:"Unknown error"}`),e?.onComplete?.()}if(this.syncService.detectOutgoingChanges(),this.syncService.hasConflicts()&&!e.force)return await this.notifier.setState(M.CONFLICTS);const t=await Jr();this.remote.setConnectorsMapping(t),await this.syncLocalAndRemoteWorkspaces({watch:e.watch})}async notifyRemote(){await this.notifier.connectToRemote()}async pull(e={}){await this.notifier.setState(M.PULLING);try{await this.refreshElements()}catch(t){return $.error(`Failed to refresh elements: ${t instanceof Error?t.message:"Unknown error"}`),e?.onComplete?.()}if(this.syncService.detectIncomingChanges(),this.syncService.hasConflicts()&&!e.force)return this.notifier.setState(M.CONFLICTS);await qr({integrations:this.remote.cache.getElementsByType(j.Integration).map(t=>t.data),allConnectors:e.allConnectors}),await this.syncLocalAndRemoteWorkspaces({watch:e.watch})}async syncLocalAndRemoteWorkspaces(e={}){await this.notifier.setState(M.RESOLVING),this.syncService.hasChanges()&&await this.syncService.resolveChanges(),this.updateStats(),await this.notifier.setState(M.SYNCED),e.watch&&(await this.notifier.setState(M.WATCHING),await this.syncService.startWatching()),e.onComplete?.()}async refreshElements(){return Promise.all([this.remote.refresh(),this.local.refresh()])}updateStats(){const e={};for(const t of this.local.cache.getAll())e[t.type]=(e[t.type]||0)+1;this.notifier.setStats(e)}}const Wt=new pa,Di=zt(null);function Jn({children:s,onExit:e,notifyRemote:t=!1}){const{config:n,isLoading:i}=Ze(),{data:r}=as("/account"),[o,a]=_(M.NOT_SYNCED),[l,u]=_([]),[p,h]=_({}),[f,g]=_([]),d=r?.workspaces?.find(A=>A.key===n?.workspaceKey)||null,y=n?.workspaceKey&&n?.workspaceSecret;async function C(){t&&y&&await Wt.notifyRemote()}c(C,"handleNotifyRemote");function v(A){if(y)try{Wt.syncLocalAndRemoteWorkspaces(A||{})}catch(D){console.error("Failed to resolve conflicts:",D),N()}}c(v,"resolveConflicts");function O(A){if(y)try{Wt.pull(A||{})}catch(D){console.error("Failed to pull:",D),N()}}c(O,"pull");function T(A){if(y)try{Wt.push(A||{})}catch(D){console.error("Failed to push:",D),N()}}c(T,"push");function N(){y&&e()}return c(N,"exit"),pe(()=>{const A=c(({state:Q})=>a(Q),"handleStateChanged"),D=c(({stats:Q})=>h(Q),"handleStatsChanged"),I=c(({log:Q})=>g(we=>[...we,Q]),"handleLogAdded"),W=c(({conflicts:Q})=>u(Q),"handleConflictsUpdated");return z.on(Y.StateChanged,A),z.on(Y.StatsChanged,D),z.on(Y.LogAdded,I),z.on(Y.ConflictsChanged,W),()=>{z.off(Y.StateChanged,A),z.off(Y.StatsChanged,D),z.off(Y.LogAdded,I),z.off(Y.ConflictsChanged,W)}},[]),i?null:y?m(Di.Provider,{value:{state:o,stats:p,logs:f,currentWorkspace:d,conflicts:l,resolveConflicts:v,notifyRemote:C,pull:O,push:T,exit:N},children:s}):m(b,{children:m(S,{children:"No workspace selected. Please run `membrane init` to select a workspace."})})}c(Jn,"WorkspaceServiceProvider");function xe(){const s=Qt(Di);if(!s)throw new Error("useWorkspaceService must be used within WorkspaceServiceProvider");return s}c(xe,"useWorkspaceService");function Wn(){const{stats:s}=xe(),e=Object.entries(s).filter(([t,n])=>n>0);return e.length===0?null:E(b,{flexDirection:"column",children:[m(b,{children:m(b,{width:12,children:m(S,{color:"grey",children:"Elements:"})})}),m(b,{flexDirection:"column",marginLeft:1,children:e.map(([t,n])=>E(b,{children:[m(b,{width:20,children:E(S,{children:[t,":"]})}),m(S,{color:"green",children:n})]},t))})]})}c(Wn,"ElementStats");const Gn=c(s=>{switch(s){case"error":return"red";case"success":return"green";case"warning":return"yellow";default:return}},"getLogColor");function Pi(s,e){return e<3?s.slice(0,Math.max(0,e)):s.length<=e?s:`${s.slice(0,e-3)}...`}c(Pi,"truncateText");const Vn=5,ma=6;function ga(){const{logs:s}=xe(),[e,t]=_(0),n=Math.min(100,process.stdout.columns||100),i=Vn,r=Math.max(0,s.length-i-e),o=s.length-e,a=s.slice(r,o),l=n-ma,u=e<s.length-i,p=e>0;return De((h,f)=>{if(s.length!==0)if(f.upArrow){const g=Math.max(0,s.length-i);t(w=>Math.min(g,w+1))}else f.downArrow?t(g=>Math.max(0,g-1)):(h==="G"||h==="g")&&t(0)}),E(b,{flexDirection:"column",paddingTop:1,children:[E(S,{color:"grey",children:["Recent Activity (",r+1,"-",o," of ",s.length,"):",s.length>Vn&&m(S,{color:"grey",children:" [arrows: scroll] [g: end]"})]}),a.map((h,f)=>m(b,{marginLeft:1,children:m(S,{color:Gn(h.type),children:Pi(h.message,l)})},h.timestamp+f)),s.length>Vn&&E(b,{marginLeft:1,flexDirection:"row",children:[u&&m(S,{color:"grey",children:"\u2191 "}),p&&m(S,{color:"grey",children:"\u2193 "})]})]})}c(ga,"Logs");const Gt=[{value:"sync",label:"Continue (overwrite/delete)",key:""},{value:"exit",label:"Cancel",key:""}];function ya(){const{state:s,resolveConflicts:e,exit:t}=xe(),[n,i]=_(0),[r,o]=_(!1);return De((a,l)=>{r||(l.upArrow?i(u=>u>0?u-1:Gt.length-1):l.downArrow?i(u=>u<Gt.length-1?u+1:0):a.toLowerCase()==="y"?i(0):a.toLowerCase()==="n"?i(1):(l.return||a===" ")&&(o(!0),Gt[n].value==="sync"?e({watch:!0}):t()))}),pe(()=>{s!==M.CONFLICTS&&r&&o(!1)},[s,r]),E(b,{flexDirection:"column",paddingTop:1,children:[m(b,{children:m(b,{flexDirection:"row",gap:2,children:m(S,{bold:!0,color:"white",children:"Conflicts with remote"})})}),m(b,{children:m(S,{color:"grey",children:"The remote workspace has changes that aren't in your local workspace:"})}),m(b,{marginTop:1,marginLeft:2,children:m(Hn,{})}),E(b,{marginTop:2,flexDirection:"row",gap:1,children:[m(S,{color:"white",bold:!0,children:"What would you like to do?"}),m(S,{color:"grey",children:"[up/down, enter]"})]}),m(b,{children:r?E(b,{flexDirection:"row",gap:1,children:[m(pt,{type:"dots"}),m(S,{color:"blue",bold:!0,children:"Syncing with remote..."})]}):m(b,{flexDirection:"column",children:Gt.map((a,l)=>m(b,{flexDirection:"column",children:E(b,{flexDirection:"row",gap:1,children:[m(S,{color:n===l?"cyan":"grey",children:n===l?"\u25B6":" "}),m(S,{color:n===l?"cyan":"grey",bold:n===l,children:a.label})]})},a.value))})})]})}c(ya,"ResolveChangesUI");const wa={[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 Hn(){const{conflicts:s}=xe(),e=Hi(()=>{const t={};return s.forEach(n=>{const i=`${n.type}-${n.direction}`;t[i]||(t[i]=[]),t[i].push(n)}),t},[s]);return m(b,{flexDirection:"column",children:Object.entries(e).map(([t,n])=>{if(n.length===0)return null;const[i,r]=t.split("-"),o=wa[i][r];return E(b,{flexDirection:"column",children:[E(b,{flexDirection:"row",gap:1,children:[E(S,{color:"yellow",children:[o.label," (",n.length,")"]}),m(S,{color:"white",children:o.description})]}),n.map(a=>m(b,{marginLeft:2,children:E(S,{color:"grey",children:["\u2022 ",a.element.id," (",a.element.relativePath,")"]})},a.element.id))]},t)})})}c(Hn,"Conflicts");function ba(){const{config:s}=Ze(),{state:e,logs:t,currentWorkspace:n,pull:i,notifyRemote:r}=xe(),o=n?.name,a=o?Pi(o,30):s?.workspaceKey,l=Math.min(100,process.stdout.columns||100);return pe(()=>{r().then(()=>{i({allConnectors:!1,force:!1,watch:!0})}).catch(u=>{})},[]),E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:l,children:[m(b,{marginTop:-1,marginBottom:1,children:E(b,{flexDirection:"row",gap:1,children:[m(S,{bold:!0,children:"\u{1F504} Workspace"}),E(S,{color:Ca(e),children:[" [",Sa(e),"] "]})]})}),E(b,{children:[m(b,{width:12,children:m(S,{color:"grey",children:"Local:"})}),m(S,{color:"grey",children:process.cwd()})]}),E(b,{children:[m(b,{width:12,children:m(S,{color:"grey",children:"Remote:"})}),s?.workspaceKey?E(S,{color:"grey",children:[a," [o: open in console] [w: change]"]}):E(S,{children:[m(S,{color:"yellow",children:"not selected"})," [w: select]"]})]}),e===M.CONFLICTS?m(ya,{}):E(Yt,{children:[m(b,{paddingTop:1,children:m(Wn,{})}),t.length>0&&m(ga,{})]})]})}c(ba,"Workspace");function Sa(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";default:return"unknown"}}c(Sa,"getStatusDisplay");function Ca(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";default:return"grey"}}c(Ca,"getStatusColor");const ka=c(()=>{const{isSetupComplete:s}=Ss(),{config:e}=Ze();return{isSetupComplete:s,workspaceKey:e?.workspaceKey,config:e}},"useStatus");function va({onExit:s}){const e=hs(),{isSetupComplete:t,workspaceKey:n,config:i}=ka(),[r,o]=_(null),a=Yi(!0),l=r??(t?"main":"setup");return De(u=>{l==="main"&&(u==="w"&&o("workspace-selection"),u==="a"&&o("add-mcp-server"),u==="o"&&n&&i?.workspaceSecret&&(async()=>{try{const h=`https://console.integration.app/w/${await ms(e)}`,f=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";rr(`${f} "${h}"`)}catch(p){console.error("Failed to open workspace:",p),s()}})(),u==="s"&&o("setup"))}),pe(()=>(a.current=!0,()=>{a.current=!1}),[]),l==="workspace-selection"?m(bs,{onExit:c(()=>o(null),"onExit")}):l==="add-mcp-server"?m(Mr,{onExit:c(()=>o(null),"onExit"),onComplete:c(()=>o(null),"onComplete")}):l==="setup"?m(Cs,{onComplete:c(()=>o(null),"onComplete")},Date.now()):E(b,{flexDirection:"column",children:[m(b,{flexGrow:1,children:m(jr,{})}),m(Jn,{onExit:s,notifyRemote:!0,children:m(ba,{})}),m(b,{paddingLeft:2,children:m(S,{color:"grey",children:"[s: (re-)setup]"})})]})}c(va,"Main");const Mi=Vi(process.argv.slice(2)),Ea=Mi.cwd?qi(Mi.cwd):process.cwd(),Ia=c(()=>process.exit(0),"onExit"),Ta=c(()=>m(gt,{cwd:Ea,children:m(va,{onExit:Ia})}),"App");function Na(){ht(m(Ta,{}))}c(Na,"runAgent");const Aa="membrane.config.yml";function Oa(s){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(`
|
|
141
|
-
`)).action(e=>{if(e.key&&e.secret){const t=process.cwd(),n=
|
|
142
|
-
`)).action(async()=>{try{process.env.FASTMCP_SUPPRESS_WARNINGS="true";const e=Me();e||(console.error("No membrane.config.yml found. Please run `membrane init` first."),process.exit(1)),(!e.workspaceKey||!e.workspaceSecret)&&(console.error("Missing workspace credentials"),process.exit(1));const t=e.apiUri||
|
|
140
|
+
`,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=Gt(e),n=He(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=Gt(e),n=He(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 xi(s){const e=s.prettyErrors!==!1;return{lineCounter:s.lineCounter||e&&new Ai||null,prettyErrors:e}}c(xi,"parseOptions");function fa(s,e={}){const{lineCounter:t,prettyErrors:n}=xi(e),i=new Gn(t?.addNewLine),r=new Un(e),o=Array.from(r.compose(i.parse(s)));if(n&&t)for(const a of o)a.errors.forEach(Kt(s,t)),a.warnings.forEach(Kt(s,t));return o.length>0?o:Object.assign([],{empty:!0},r.streamInfo())}c(fa,"parseAllDocuments");function Pi(s,e={}){const{lineCounter:t,prettyErrors:n}=xi(e),i=new Gn(t?.addNewLine),r=new Un(e);let o=null;for(const a of r.compose(i.parse(s),!0,s.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new $e(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return n&&t&&(o.errors.forEach(Kt(s,t)),o.warnings.forEach(Kt(s,t))),o}c(Pi,"parseDocument");function ha(s,e,t){let n;typeof e=="function"?n=e:t===void 0&&e&&typeof e=="object"&&(t=e);const i=Pi(s,t);if(!i)return null;if(i.warnings.forEach(r=>Js(i.options.logLevel,r)),i.errors.length>0){if(i.options.logLevel!=="silent")throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:n},t))}c(ha,"parse");function da(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 i=Math.round(t);t=i<1?void 0:i>8?{indent:8}:{indent:i}}if(s===void 0){const{keepUndefined:i}=t??e??{};if(!i)return}return Te(s)&&!n?s.toString(t):new Qe(s,n,t).toString(t)}c(da,"stringify");var pa=Object.freeze({__proto__:null,Alias:kt,CST:ca,Composer:Un,Document:Qe,Lexer:Ni,LineCounter:Ai,Pair:Z,Parser:Gn,Scalar:x,Schema:zt,YAMLError:Rn,YAMLMap:ie,YAMLParseError:$e,YAMLSeq:ve,YAMLWarning:di,isAlias:ke,isCollection:q,isDocument:Te,isMap:je,isNode:J,isPair:_,isScalar:F,isSeq:Fe,parse:ha,parseAllDocuments:fa,parseDocument:Pi,stringify:da,visit:Ne,visitAsync:Ct});const Q={Added:"added",Changed:"changed",Deleted:"deleted",Stopped:"stopped"},ma={ignored:to,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 ga extends ys{static{c(this,"FileWatcher")}constructor(e){super(),this.options=e,this.membraneDir=St(this.options.cwd)}isWatching=!1;watcher;membraneDir;contentCache={};async start(){this.isWatching||(L.existsSync(this.membraneDir)||L.mkdirSync(this.membraneDir,{recursive:!0}),this.initializeContentCache(),this.watcher=pr.watch(this.membraneDir,ma),this.watcher.on("add",e=>this.handleFileSystemEvent(Q.Added,e)).on("change",e=>this.handleFileSystemEvent(Q.Changed,e)).on("unlink",e=>this.handleFileSystemEvent(Q.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.emit(Q.Stopped))}getCwd(){return this.options.cwd}handleFileSystemEvent(e,t){const n=D.relative(this.membraneDir,t);if(e===Q.Deleted){this.removeFromCache(n);const a={filePath:t,relativePath:n,data:void 0};O.info(`[local] ${e}: ${a.relativePath}`),this.emit(e,a);return}const i=this.readFileContent(t);if(!this.hasContentChanged(n,i,e))return;const o=this.processFileEvent(t,i);this.updateCache(n,i),o&&(O.info(`[local] ${e}: ${o.relativePath}`),this.emit(e,o))}readFileContent(e){return L.readFileSync(e,"utf8")}processFileEvent(e,t){const n=D.relative(this.membraneDir,e);let i;try{i=t?pa.parse(t):void 0}catch{i=void 0}return{filePath:e,relativePath:n,data:i}}hasContentChanged(e,t,n){if(n==="added")return!0;if(!t)return this.contentCache[e]!==void 0;const i=this.getContentHash(t);return this.contentCache[e]!==i}getContentHash(e){return er.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(){L.existsSync(this.membraneDir)&&this.scanDirectoryForCache(this.membraneDir)}scanDirectoryForCache(e){const t=L.readdirSync(e,{withFileTypes:!0});for(const n of t){const i=D.join(e,n.name);if(n.isDirectory())this.scanDirectoryForCache(i);else if(n.isFile())try{const r=L.readFileSync(i,"utf8"),o=D.relative(this.membraneDir,i);this.updateCache(o,r)}catch{}}}}const ee={UPDATE:"update",DELETE:"delete",CREATE:"create"},pe={INCOMING:"incoming",OUTGOING:"outgoing"};class dt{static{c(this,"ElementSyncService")}constructor(e,t){this.localManager=e,this.remoteManager=t,this.notifier=z}fileWatcher=void 0;notifier;changes=[];hasConflicts(){return this.changes.some(e=>e.isConflict)}hasChanges(){return this.changes.length>0}async startWatching(){this.fileWatcher=new ga({cwd:process.cwd()}),this.fileWatcher.on(Q.Added,e=>this.handleLocalEvent(e,Q.Added)),this.fileWatcher.on(Q.Changed,e=>this.handleLocalEvent(e,Q.Changed)),this.fileWatcher.on(Q.Deleted,e=>this.handleLocalEvent(e,Q.Deleted)),await this.fileWatcher.start(),O.success("[local] Tracking changes..")}async stopWatching(){await this.fileWatcher?.stop(),this.fileWatcher=void 0}async handleLocalEvent(e,t){try{if(Qr(e.filePath))switch(t){case Q.Added:case Q.Changed:await Xr(e.filePath);break;case Q.Deleted:await Zr(e.filePath);break}else{let n=V.fromPathAndData(e.filePath,e.data);if(!n){const r=V.idFromPath(e.filePath);if(!r||(n=this.remoteManager.cache.get(r),!n))return}const i=this.getManager(pe.OUTGOING);switch(O.info(`[resolver][${this.getDirectionLabel(pe.OUTGOING)}] ${t}: ${n.id}`),t){case Q.Added:case Q.Changed:await i.putElement(n);break;case Q.Deleted:await i.deleteElement(n);break}}}catch(n){O.error(`[sync] Error handling local event: ${n}`)}}detectIncomingChanges(){this.clearChanges();const e=dt.getChanges(pe.INCOMING,this.remoteManager.cache,this.localManager.cache);return this.updateChanges(e),e}detectOutgoingChanges(){this.clearChanges();const e=dt.getChanges(pe.OUTGOING,this.localManager.cache,this.remoteManager.cache);return this.updateChanges(e),e}getChange(e){const t=this.localManager.cache.get(e.id),n=this.remoteManager.cache.get(e.id);return!t&&n?{type:ee.CREATE,element:n,direction:pe.INCOMING,isConflict:!1}:t&&!n?{type:ee.DELETE,element:t,direction:pe.OUTGOING,isConflict:!0}:t&&n&&!t.isEqual(n)?{type:ee.UPDATE,element:t,direction:pe.OUTGOING,isConflict:!0}:null}async resolveChanges(){this.hasChanges()&&(O.info("[resolver] Resolving changes.."),await Promise.all(this.changes.map(e=>this.resolveChange(e))),O.success(`[resolver] Resolved ${this.changes.length} changes`))}async resolveChange(e){const t=this.getManager(e.direction);switch(e.type){case ee.DELETE:return O.info(`[resolver][${this.getDirectionLabel(e.direction)}] Deleting ${e.element.id}`),t.deleteElement(e.element);case ee.CREATE:return O.info(`[resolver][${this.getDirectionLabel(e.direction)}] Creating ${e.element.id}`),t.putElement(e.element);case ee.UPDATE:return O.info(`[resolver][${this.getDirectionLabel(e.direction)}] Updating ${e.element.id}`),t.putElement(e.element)}}getManager(e){return e===pe.INCOMING?this.localManager:this.remoteManager}static getChanges(e,t,n){const i=t.getAllIds(),r=n.getAllIds(),o=new Set([...i,...r]),a=[];for(const l of o){const u=t.get(l),p=n.get(l),h=dt.detectChangeForElement(u,p,e);h&&a.push(h)}return a}updateChanges(e){this.changes=e;for(const t of e)O.info(`[resolver][${this.getDirectionLabel(t.direction)}] ${this.getTypeLabel(t.type)} ${t.element.id}`);if(this.hasConflicts()){const t=e.filter(n=>n.isConflict);O.warning("[resolver] Conflicts detected"),this.notifier.setConflicts(t)}}clearChanges(){this.changes=[]}getDirectionLabel(e){switch(e){case pe.INCOMING:return"local\u2190remote";case pe.OUTGOING:return"local\u2192remote"}}getTypeLabel(e){switch(e){case ee.CREATE:return"ADD";case ee.UPDATE:return"UPD";case ee.DELETE:return"DEL"}}static detectChangeForElement(e,t,n){return e&&!t?{type:ee.CREATE,element:e,direction:n,isConflict:!1}:!e&&t?{type:ee.DELETE,element:t,direction:n,isConflict:!0}:e&&t&&!e.isEqual(t)?{type:ee.UPDATE,element:e,direction:n,isConflict:!0}:null}}class ya{static{c(this,"WorkspaceService")}notifier;local;remote;syncService;constructor(){this.notifier=z,this.local=new Ts(new so),this.remote=new Ts(new io),this.syncService=new dt(this.local,this.remote)}async push(e={}){await this.notifier.setState(R.PUSHING);try{await this.refreshElements()}catch(n){return O.error(`Failed to refresh elements: ${se(n)?.message??"Unknown error"}`),e?.onComplete?.()}if(this.syncService.detectOutgoingChanges(),this.syncService.hasConflicts()&&!e.force)return await this.notifier.setState(R.CONFLICTS);const t=await Wr();this.remote.setConnectorsMapping(t),await this.syncLocalAndRemoteWorkspaces({watch:e.watch})}async notifyRemote(){await this.notifier.connectToRemote()}async pull(e={}){await this.notifier.setState(R.PULLING);try{await this.refreshElements()}catch(t){return O.error(`Failed to refresh elements: ${se(t)?.message??"Unknown error"}`),e?.onComplete?.()}if(this.syncService.detectIncomingChanges(),this.syncService.hasConflicts()&&!e.force)return this.notifier.setState(R.CONFLICTS);await Jr({integrations:this.remote.cache.getElementsByType(j.Integration).map(t=>t.data),allConnectors:e.allConnectors}),await this.syncLocalAndRemoteWorkspaces({watch:e.watch})}async syncLocalAndRemoteWorkspaces(e={}){await this.notifier.setState(R.RESOLVING),this.syncService.hasChanges()&&await this.syncService.resolveChanges(),this.updateStats(),await this.notifier.setState(R.SYNCED),e.watch&&(await this.notifier.setState(R.WATCHING),await this.syncService.startWatching()),e.onComplete?.()}async refreshElements(){return Promise.all([this.remote.refresh(),this.local.refresh()])}updateStats(){const e={};for(const t of this.local.cache.getAll())e[t.type]=(e[t.type]||0)+1;this.notifier.setStats(e)}}const Vt=new ya,Di=Xt(null);function Vn({children:s,onExit:e,notifyRemote:t=!1}){const{config:n,isLoading:i}=Ze(),{data:r}=us("/account"),[o,a]=K(R.NOT_SYNCED),[l,u]=K([]),[p,h]=K({}),[f,g]=K([]),d=r?.workspaces?.find(A=>A.key===n?.workspaceKey)||null,y=n?.workspaceKey&&n?.workspaceSecret;async function C(){t&&y&&await Vt.notifyRemote()}c(C,"handleNotifyRemote");function v(A){if(y)try{Vt.syncLocalAndRemoteWorkspaces(A||{})}catch(P){console.error("Failed to resolve conflicts:",P),N()}}c(v,"resolveConflicts");function $(A){if(y)try{Vt.pull(A||{})}catch(P){console.error("Failed to pull:",P),N()}}c($,"pull");function T(A){if(y)try{Vt.push(A||{})}catch(P){console.error("Failed to push:",P),N()}}c(T,"push");function N(){y&&e()}return c(N,"exit"),me(()=>{const A=c(({state:X})=>a(X),"handleStateChanged"),P=c(({stats:X})=>h(X),"handleStatsChanged"),I=c(({log:X})=>g(be=>[...be,X]),"handleLogAdded"),W=c(({conflicts:X})=>u(X),"handleConflictsUpdated");return z.on(Y.StateChanged,A),z.on(Y.StatsChanged,P),z.on(Y.LogAdded,I),z.on(Y.ConflictsChanged,W),()=>{z.off(Y.StateChanged,A),z.off(Y.StatsChanged,P),z.off(Y.LogAdded,I),z.off(Y.ConflictsChanged,W)}},[]),i?null:y?m(Di.Provider,{value:{state:o,stats:p,logs:f,currentWorkspace:d,conflicts:l,resolveConflicts:v,notifyRemote:C,pull:$,push:T,exit:N},children:s}):m(b,{children:m(S,{children:"No workspace selected. Please run `membrane init` to select a workspace."})})}c(Vn,"WorkspaceServiceProvider");function xe(){const s=Zt(Di);if(!s)throw new Error("useWorkspaceService must be used within WorkspaceServiceProvider");return s}c(xe,"useWorkspaceService");function Hn(){const{stats:s}=xe(),e=Object.entries(s).filter(([t,n])=>n>0);return e.length===0?null:E(b,{flexDirection:"column",children:[m(b,{children:m(b,{width:12,children:m(S,{color:"grey",children:"Elements:"})})}),m(b,{flexDirection:"column",marginLeft:1,children:e.map(([t,n])=>E(b,{children:[m(b,{width:20,children:E(S,{children:[t,":"]})}),m(S,{color:"green",children:n})]},t))})]})}c(Hn,"ElementStats");const Yn=c(s=>{switch(s){case"error":return"red";case"success":return"green";case"warning":return"yellow";default:return}},"getLogColor");function Mi(s,e){return e<3?s.slice(0,Math.max(0,e)):s.length<=e?s:`${s.slice(0,e-3)}...`}c(Mi,"truncateText");const zn=5,wa=6;function ba(){const{logs:s}=xe(),[e,t]=K(0),n=Math.min(100,process.stdout.columns||100),i=zn,r=Math.max(0,s.length-i-e),o=s.length-e,a=s.slice(r,o),l=n-wa,u=e<s.length-i,p=e>0;return Pe((h,f)=>{if(s.length!==0)if(f.upArrow){const g=Math.max(0,s.length-i);t(w=>Math.min(g,w+1))}else f.downArrow?t(g=>Math.max(0,g-1)):(h==="G"||h==="g")&&t(0)}),E(b,{flexDirection:"column",paddingTop:1,children:[E(S,{color:"grey",children:["Recent Activity (",r+1,"-",o," of ",s.length,"):",s.length>zn&&m(S,{color:"grey",children:" [arrows: scroll] [g: end]"})]}),a.map((h,f)=>m(b,{marginLeft:1,children:m(S,{color:Yn(h.type),children:Mi(h.message,l)})},h.timestamp+f)),s.length>zn&&E(b,{marginLeft:1,flexDirection:"row",children:[u&&m(S,{color:"grey",children:"\u2191 "}),p&&m(S,{color:"grey",children:"\u2193 "})]})]})}c(ba,"Logs");const Ht=[{value:"sync",label:"Continue (overwrite/delete)",key:""},{value:"exit",label:"Cancel",key:""}];function Sa(){const{state:s,resolveConflicts:e,exit:t}=xe(),[n,i]=K(0),[r,o]=K(!1);return Pe((a,l)=>{r||(l.upArrow?i(u=>u>0?u-1:Ht.length-1):l.downArrow?i(u=>u<Ht.length-1?u+1:0):a.toLowerCase()==="y"?i(0):a.toLowerCase()==="n"?i(1):(l.return||a===" ")&&(o(!0),Ht[n].value==="sync"?e({watch:!0}):t()))}),me(()=>{s!==R.CONFLICTS&&r&&o(!1)},[s,r]),E(b,{flexDirection:"column",paddingTop:1,children:[m(b,{children:m(b,{flexDirection:"row",gap:2,children:m(S,{bold:!0,color:"white",children:"Conflicts with remote"})})}),m(b,{children:m(S,{color:"grey",children:"The remote workspace has changes that aren't in your local workspace:"})}),m(b,{marginTop:1,marginLeft:2,children:m(Qn,{})}),E(b,{marginTop:2,flexDirection:"row",gap:1,children:[m(S,{color:"white",bold:!0,children:"What would you like to do?"}),m(S,{color:"grey",children:"[up/down, enter]"})]}),m(b,{children:r?E(b,{flexDirection:"row",gap:1,children:[m(gt,{type:"dots"}),m(S,{color:"blue",bold:!0,children:"Syncing with remote..."})]}):m(b,{flexDirection:"column",children:Ht.map((a,l)=>m(b,{flexDirection:"column",children:E(b,{flexDirection:"row",gap:1,children:[m(S,{color:n===l?"cyan":"grey",children:n===l?"\u25B6":" "}),m(S,{color:n===l?"cyan":"grey",bold:n===l,children:a.label})]})},a.value))})})]})}c(Sa,"ResolveChangesUI");const Ca={[ee.UPDATE]:{incoming:{label:"Elements updated in remote",description:"(to be overwritten from remote)"},outgoing:{label:"Elements updated locally",description:"(to be pushed to remote)"}},[ee.DELETE]:{incoming:{label:"Elements not existing in remote",description:"(to be deleted locally)"},outgoing:{label:"Elements deleted locally",description:"(to be deleted from remote)"}},[ee.CREATE]:{incoming:{label:"Elements created in remote",description:"(to be created locally)"},outgoing:{label:"Elements created locally",description:"(to be created in remote)"}}};function Qn(){const{conflicts:s}=xe(),e=Yi(()=>{const t={};return s.forEach(n=>{const i=`${n.type}-${n.direction}`;t[i]||(t[i]=[]),t[i].push(n)}),t},[s]);return m(b,{flexDirection:"column",children:Object.entries(e).map(([t,n])=>{if(n.length===0)return null;const[i,r]=t.split("-"),o=Ca[i][r];return E(b,{flexDirection:"column",children:[E(b,{flexDirection:"row",gap:1,children:[E(S,{color:"yellow",children:[o.label," (",n.length,")"]}),m(S,{color:"white",children:o.description})]}),n.map(a=>m(b,{marginLeft:2,children:E(S,{color:"grey",children:["\u2022 ",a.element.id," (",a.element.relativePath,")"]})},a.element.id))]},t)})})}c(Qn,"Conflicts");function ka(){const{config:s}=Ze(),{state:e,logs:t,currentWorkspace:n,pull:i,notifyRemote:r}=xe(),o=n?.name,a=o?Mi(o,30):s?.workspaceKey,l=Math.min(100,process.stdout.columns||100);return me(()=>{r().then(()=>{i({allConnectors:!1,force:!1,watch:!0})}).catch(u=>{})},[]),E(b,{flexDirection:"column",paddingX:1,borderStyle:"round",borderTop:!0,width:l,children:[m(b,{marginTop:-1,marginBottom:1,children:E(b,{flexDirection:"row",gap:1,children:[m(S,{bold:!0,children:"\u{1F504} Workspace"}),E(S,{color:Ea(e),children:[" [",va(e),"] "]})]})}),E(b,{children:[m(b,{width:12,children:m(S,{color:"grey",children:"Local:"})}),m(S,{color:"grey",children:process.cwd()})]}),E(b,{children:[m(b,{width:12,children:m(S,{color:"grey",children:"Remote:"})}),s?.workspaceKey?E(S,{color:"grey",children:[a," [o: open in console] [w: change]"]}):E(S,{children:[m(S,{color:"yellow",children:"not selected"})," [w: select]"]})]}),e===R.CONFLICTS?m(Sa,{}):E(Qt,{children:[m(b,{paddingTop:1,children:m(Hn,{})}),t.length>0&&m(ba,{})]})]})}c(ka,"Workspace");function va(s){switch(s){case R.PULLING:return"pulling";case R.PUSHING:return"pushing";case R.CONFLICTS:return"conflicts";case R.SYNCED:return"synced";case R.ERROR:return"error";case R.WATCHING:return"tracking changes";case R.RESOLVING:return"resolving";case R.NOT_SYNCED:return"not synced";default:return"unknown"}}c(va,"getStatusDisplay");function Ea(s){switch(s){case R.PULLING:return"yellow";case R.PUSHING:return"yellow";case R.CONFLICTS:return"red";case R.SYNCED:return"green";case R.ERROR:return"red";case R.WATCHING:return"green";case R.RESOLVING:return"yellow";case R.NOT_SYNCED:return"grey";default:return"grey"}}c(Ea,"getStatusColor");const Ia=c(()=>{const{isSetupComplete:s}=vs(),{config:e}=Ze();return{isSetupComplete:s,workspaceKey:e?.workspaceKey,config:e}},"useStatus");function Ta({onExit:s}){const e=ms(),{isSetupComplete:t,workspaceKey:n,config:i}=Ia(),[r,o]=K(null),a=zi(!0),l=r??(t?"main":"setup");return Pe(u=>{l==="main"&&(u==="w"&&o("workspace-selection"),u==="a"&&o("add-mcp-server"),u==="o"&&n&&i?.workspaceSecret&&(async()=>{try{const h=`https://console.integration.app/w/${await ws(e)}`,f=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";or(`${f} "${h}"`)}catch(p){console.error("Failed to open workspace:",p),s()}})(),u==="s"&&o("setup"))}),me(()=>(a.current=!0,()=>{a.current=!1}),[]),l==="workspace-selection"?m(ks,{onExit:c(()=>o(null),"onExit")}):l==="add-mcp-server"?m(Rr,{onExit:c(()=>o(null),"onExit"),onComplete:c(()=>o(null),"onComplete")}):l==="setup"?m(Es,{onComplete:c(()=>o(null),"onComplete")},Date.now()):E(b,{flexDirection:"column",children:[m(b,{flexGrow:1,children:m(Fr,{})}),m(Vn,{onExit:s,notifyRemote:!0,children:m(ka,{})}),m(b,{paddingLeft:2,children:m(S,{color:"grey",children:"[s: (re-)setup]"})})]})}c(Ta,"Main");const Ri=Hi(process.argv.slice(2)),Na=Ri.cwd?Ji(Ri.cwd):process.cwd(),Aa=c(()=>process.exit(0),"onExit"),Oa=c(()=>m(wt,{cwd:Na,children:m(Ta,{onExit:Aa})}),"App");function $a(){pt(m(Oa,{}))}c($a,"runAgent");const La="membrane.config.yml";function xa(s){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(`
|
|
141
|
+
`)).action(e=>{if(e.key&&e.secret){const t=process.cwd(),n=D.join(t,La);let i={};if(L.existsSync(n))try{const a=L.readFileSync(n,"utf8");i=ce.load(a)||{}}catch{console.error("Warning: Could not read existing config file")}const r={...i,workspaceKey:e.key,workspaceSecret:e.secret},o=ln.safeParse(r);o.success||(console.error("Invalid configuration:",o.error.message),process.exit(1));try{L.writeFileSync(n,ce.dump(o.data)),console.error("\u2705 Configuration saved to membrane.config.yml"),process.exit(0)}catch(a){console.error("Error writing configuration file:",a),process.exit(1)}}else e.key||e.secret?(console.error("Error: Both --key and --secret must be provided for non-interactive mode"),process.exit(1)):pt(De.createElement(wt,null,De.createElement(Es,{onComplete:c(()=>process.exit(0),"onComplete")})))})}c(xa,"setupInitCommand");async function ji(s,e){const t={iss:s,exp:Math.floor(Date.now()/1e3)+600,isAdmin:!0};return sn.sign(t,e)}c(ji,"generateAdminAccessToken");async function Pa(s,e){return(await rn.get(`${s}/docs-json`,{headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"}})).data}c(Pa,"fetchOpenApiSchema");function Fi(s,e=!0){if(!s)return e?U.string():U.string().optional();let t;switch(s.type){case"integer":t=U.coerce.number().int();break;case"number":t=U.coerce.number();break;case"boolean":t=U.coerce.boolean();break;case"string":default:t=U.string();break}return s.format==="uuid"?t=U.string().uuid():s.format==="email"?t=U.string().email():s.format==="date"?t=U.string().regex(/^\d{4}-\d{2}-\d{2}$/):s.format==="date-time"&&(t=U.string().datetime()),s.enum&&(t=U.enum(s.enum)),(s.type==="integer"||s.type==="number")&&(s.minimum!==void 0&&(t=t.min(s.minimum)),s.maximum!==void 0&&(t=t.max(s.maximum))),s.type==="string"&&(s.minLength!==void 0&&(t=t.min(s.minLength)),s.maxLength!==void 0&&(t=t.max(s.maxLength))),e?t:t.optional()}c(Fi,"convertOpenApiSchemaToZod");function Ki(s){const e=s.match(/\{([^}]+)\}/g);return e?e.map(t=>t.slice(1,-1)):[]}c(Ki,"extractPathParameters");function Da(s,e,t,n,i,r){const o=s.operationId||`${t}_${e.replace(/[^a-zA-Z0-9]/g,"_")}`,a=s.description||s.summary||`${t.toUpperCase()} ${e}`,l={},u={},p={};if(s.parameters){for(const f of s.parameters)if(f.in==="path")u[f.name]=Fi(f.schema,!0).describe(f.description||`Path parameter: ${f.name}`);else if(f.in==="query"){const g=f.required===!0;p[f.name]=Fi(f.schema,g).describe(f.description||`Query parameter: ${f.name}`)}}Object.keys(u).length>0&&(l.params=U.object(u).describe("Path parameters")),Object.keys(p).length>0&&(l.query=U.object(p).describe("Query parameters")),s.requestBody&&s.requestBody.content&&s.requestBody.content["application/json"]&&(l.body=U.any().describe("Request body"));const h=Object.keys(l).length>0?U.object(l):U.object({});return{name:o,description:a,parameters:h,async execute(f){try{const g=Ki(e);if(g.length>0){if(!f.params)throw new Error(`Missing required path parameters: ${g.join(", ")}`);const T=g.filter(N=>!(N in f.params));if(T.length>0)throw new Error(`Missing required path parameters: ${T.join(", ")}`)}let w=`${n}${e}`;if(f.params)for(const[T,N]of Object.entries(f.params)){const A=`{${T}}`;w.includes(A)&&(w=w.replace(A,String(N)))}const d=Ki(w);if(d.length>0)throw new Error(`Unresolved path parameters: ${d.join(", ")}`);const y=new URLSearchParams;if(f.query)for(const[T,N]of Object.entries(f.query))N!=null&&y.append(T,String(N));y.toString()&&(w+=`?${y.toString()}`);const C=await ji(i,r),v={method:t.toUpperCase(),headers:{Authorization:`Bearer ${C}`,"Content-Type":"application/json"}};f.body&&t.toLowerCase()!=="get"&&(v.data=f.body);const $=await rn.request({url:w,...v});return{content:[{type:"text",text:JSON.stringify($.data,null,2)}]}}catch(g){return rn.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(Da,"createApiTool");function Ma(s,e,t,n){const i=[];if(!s.paths)return i;for(const[r,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=Da(l,r,a,e,t,n);i.push(u)}}return i}c(Ma,"convertOpenApiToTools");function Ra(s){s.command("mcp").description("Launch MCP server with OpenAPI endpoints as tools (API URI is read from membrane.config.yml)").addHelpText("after",["","Examples:"," membrane mcp # Launch MCP server using API URI from membrane.config.yml",""].join(`
|
|
142
|
+
`)).action(async()=>{try{process.env.FASTMCP_SUPPRESS_WARNINGS="true";const e=Me();e||(console.error("No membrane.config.yml found. Please run `membrane init` first."),process.exit(1)),(!e.workspaceKey||!e.workspaceSecret)&&(console.error("Missing workspace credentials"),process.exit(1));const t=e.apiUri||an,n=await ji(e.workspaceKey,e.workspaceSecret),i=await Pa(t,n),r=Ma(i,t,e.workspaceKey,e.workspaceSecret),o=new yr({name:"Membrane API",instructions:`This MCP server lets you interact with Membrane to configure, run, and troubleshoot integrations.
|
|
143
143
|
Use it for anything related to Membrane or integrations.
|
|
144
|
-
`,version:"1.0.0"});for(const u of r){const p=u.execute;u.execute=async h=>(
|
|
144
|
+
`,version:"1.0.0"});for(const u of r){const p=u.execute;u.execute=async h=>(Mr(process.pid,process.cwd()),p(h)),o.addTool(u)}un({isRunning:!0,startTime:new Date().toISOString(),toolsCount:r.length,lastActivity:new Date().toISOString(),processId:process.pid,cwd:process.cwd(),agentName:process.env.AGENT_NAME||"Unnamed Agent"});const a=setInterval(()=>{un({processId:process.pid,cwd:process.cwd(),lastActivity:new Date().toISOString()})},5e3),l=c(async()=>{clearInterval(a),et(process.pid,process.cwd());try{await o.stop()}catch{}},"cleanup");await o.start({transportType:"stdio"}),process.on("SIGINT",async()=>{await l(),process.exit(0)}),process.on("SIGTERM",async()=>{await l(),process.exit(0)}),process.on("exit",()=>{et(process.pid,process.cwd())}),process.on("uncaughtException",async u=>{console.error("Uncaught exception:",u.message),await l(),process.exit(1)}),process.on("unhandledRejection",async u=>{console.error("Unhandled rejection:",u),await l(),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(Ra,"setupMcpCommand");const ja={info:"\u{1F4DD}",success:"\u2728",warning:"\u26A0\uFE0F",error:"\u274C",debug:"\u{1F50D}"},Fa={info:k.blue,success:k.green,warning:k.yellow,error:k.red,debug:k.gray};class G{static{c(this,"Logger")}static formatMessage(e,t,n={}){const i=n.timestamp?`${k.gray(new Date().toISOString())} `:"",r=n.prefix?`${k.gray(n.prefix)} `:"",o=n.suffix?` ${k.gray(n.suffix)}`:"",a=ja[t],l=Fa[t];return`${i}${a} ${r}${l(e)}${o}`}static info(e,t){let n=k.blue;if(t?.color&&(n=k[t.color.toLowerCase()]||k.blue),t?.timestamp){const i=new Date().toLocaleTimeString();console.debug(`${k.gray(`[${i}]`)} ${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(k.gray(`[${t.prefix}] ${e}`),t.error?`
|
|
145
145
|
${k.red(t.error)}`:""):console.debug(k.gray(e),t?.error?`
|
|
146
|
-
${k.red(t.error)}`:"")}static step(e,t){}static header(e){console.debug(),console.debug(k.bold.cyan(`\u25B6 ${e}`)),console.debug()}static table(e,t){if(e.length===0)return;const n=t||Object.keys(e[0]),i=e.map(r=>{const o={};return n.forEach(a=>{o[a]=r[a]}),o});console.table(i,n)}static divider(){}}function
|
|
147
|
-
`)).action(async()=>{try{G.header("Opening Workspace in Browser"),G.info("Loading configuration...");const e=Me();if(!e)throw new Error("No membrane.config.yml found. Please run `membrane init` first.");if(!e.workspaceKey||!e.workspaceSecret)throw new Error("Missing workspace credentials");G.info("Retrieving workspace ID...");const n=`https://console.integration.app/w/${await
|
|
148
|
-
`)).action(e=>{const t=c(()=>process.exit(0),"onExit"),n=e.watch?_i():t;
|
|
149
|
-
`)).action(e=>{const t=c(()=>process.exit(0),"onExit"),n=e.watch?_i():t;
|
|
146
|
+
${k.red(t.error)}`:"")}static step(e,t){}static header(e){console.debug(),console.debug(k.bold.cyan(`\u25B6 ${e}`)),console.debug()}static table(e,t){if(e.length===0)return;const n=t||Object.keys(e[0]),i=e.map(r=>{const o={};return n.forEach(a=>{o[a]=r[a]}),o});console.table(i,n)}static divider(){}}function Ka(s){s.command("open").description("Open the workspace in the browser").addHelpText("after",["","Examples:"," membrane open # Open workspace in browser",""].join(`
|
|
147
|
+
`)).action(async()=>{try{G.header("Opening Workspace in Browser"),G.info("Loading configuration...");const e=Me();if(!e)throw new Error("No membrane.config.yml found. Please run `membrane init` first.");if(!e.workspaceKey||!e.workspaceSecret)throw new Error("Missing workspace credentials");G.info("Retrieving workspace ID...");const n=`https://console.integration.app/w/${await ws(process.cwd())}`;G.info(`Opening ${n}...`);const{default:i}=await import("open");await i(n),G.success("Browser opened successfully")}catch(e){e instanceof Error&&(G.error(e.message),process.exit(1)),G.error("An unknown error occurred"),process.exit(1)}})}c(Ka,"setupOpenCommand");function _a(s){return m(Vn,{onExit:s.onExit,children:m(Ba,{...s})})}c(_a,"PullWrapper");function Ba(s){const{logs:e,state:t,conflicts:n,pull:i}=xe();me(()=>{i(s)},[]);const r=t===R.CONFLICTS;return E(b,{flexDirection:"column",children:[e.slice().map((o,a)=>m(S,{color:Yn(o.type),children:o.message},o.timestamp+a)),r&&E(Qt,{children:[E(S,{color:"yellow",bold:!0,children:["Found ",n.length," conflicts with remote:"]}),m(Qn,{}),m(S,{color:"red",children:"Out of sync with remote, use --force to overwrite conflict changes"})]}),t===R.SYNCED&&m(Hn,{})]})}c(Ba,"Pull");function _i(){const s=setInterval(()=>{},3e4),e=c(()=>{clearInterval(s)},"cleanup");return process.on("SIGINT",()=>{e(),process.exit(0)}),process.on("SIGTERM",()=>{e(),process.exit(0)}),process.on("exit",e),()=>{}}c(_i,"getWatchModeCallback");function Ua(s){s.command("pull").description("Pull workspace data from specified workspace").option("--force","Overwrite conflicts with remote data",!1).option("--watch","Watch for changes and pull automatically",!1).option("--all-connectors","Include public connectors in export - to push to the self-hosted instance",!1).addHelpText("after",["","Examples:"," membrane pull # Pull from default workspace"," membrane pull --force # Overwrite conflicts with remote data"," membrane pull --all-connectors # Pull all connectors"," membrane pull --watch # Watch for changes and pull automatically",""].join(`
|
|
148
|
+
`)).action(e=>{const t=c(()=>process.exit(0),"onExit"),n=e.watch?_i():t;pt(De.createElement(wt,null,De.createElement(_a,{force:e.force,watch:e.watch,allConnectors:e.allConnectors,onComplete:n,onExit:t})))})}c(Ua,"setupPullCommand");function qa(s){return m(Vn,{onExit:s.onExit,children:m(Ja,{...s})})}c(qa,"PushWrapper");function Ja(s){const{logs:e,state:t,conflicts:n,push:i}=xe();me(()=>{i(s)},[]);const r=t===R.CONFLICTS;return E(b,{flexDirection:"column",children:[e.slice().map((o,a)=>m(S,{color:Yn(o.type),children:o.message},o.timestamp+a)),r&&E(Qt,{children:[E(S,{color:"yellow",bold:!0,children:["Found ",n.length," conflicts with remote:"]}),m(Qn,{}),m(S,{color:"red",children:"Out of sync with remote, use --force to overwrite conflict changes"})]}),t===R.SYNCED&&m(Hn,{})]})}c(Ja,"Push");function Wa(s){s.command("push").description("Push workspace data to specified workspace").option("--force","Overwrite conflicts with local data",!1).option("--watch","Watch for changes and push automatically",!1).addHelpText("after",["","Examples:"," membrane push # Push to default workspace"," membrane push --force # Overwrite conflicts with local data",""].join(`
|
|
149
|
+
`)).action(e=>{const t=c(()=>process.exit(0),"onExit"),n=e.watch?_i():t;pt(De.createElement(wt,null,De.createElement(qa,{force:e.force,watch:e.watch,onComplete:n,onExit:t})))})}c(Wa,"setupPushCommand");class Ga{static{c(this,"BaseRunner")}constructor(e){if(this.options=e,this.fsPaths=cn(),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 Va="claude-sonnet-4-20250514";class ns{static{c(this,"TestEnvironment")}client;connectionId;testsDir;testBasePath;options;llm;state={};constructor({connectionId:e,testsDir:t,testBasePath:n,client:i,options:r,llm:o}){this.client=i,this.connectionId=e,this.testsDir=t,this.testBasePath=n,this.llm=o,this.options=r}static async create({connectionId:e,testBasePath:t,options:n}){const i=Me();if(!i)throw new Error("No membrane.config.yml found. Please run `membrane init` first.");if(!i.workspaceKey||!i.workspaceSecret)throw new Error("Missing workspace credentials");if(!i.anthropicApiKey)throw new Error("Anthropic API key not configured. Run `membrane init` to set up testing.");const r=new os({token:await this.createMembraneToken(i),apiUri:i.apiUri}),o=new wr({apiKey:i.anthropicApiKey}),a={complete:c(async({prompt:l,maxTokens:u})=>{const p=await o.messages.create({model:Va,max_tokens:u,messages:[{role:"user",content:l}]});return p.content[0].type==="text"?p.content[0].text:""},"complete")};return new ns({client:r,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(),on(t,n.getResult());this.writeResults(t)}async readYaml(e){const t=B.join(this.testsDir,this.testBasePath,this.connectionId,e);if(M.existsSync(t))return ce.load(M.readFileSync(t,"utf8"))}async writeYaml(e,t){const n=B.join(this.testsDir,this.testBasePath,this.connectionId,e);M.mkdirSync(B.dirname(n),{recursive:!0}),M.writeFileSync(n,ce.dump(t,{noRefs:!0}))}writeResults(e){const t=B.join(this.testsDir,this.testBasePath,this.connectionId);M.mkdirSync(t,{recursive:!0});const n=B.join(t,"test-results.yaml");M.writeFileSync(n,ce.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},i={issuer:e.workspaceKey,expiresIn:7200,algorithm:"HS512"};return sn.sign(n,e.workspaceSecret,i)}}Sr.interpolate=/{{([\s\S]+?)}}/g;function Xn(s,e){if(typeof s=="string"){const t=br(s),n={state:e,random:{number:c(()=>Xe.number.int(),"number"),alphaNumeric:c(r=>Xe.string.alphanumeric(r),"alphaNumeric")},faker:{company:{name:c(()=>Xe.company.name(),"name"),catchPhrase:c(()=>Xe.company.catchPhrase(),"catchPhrase")},internet:{email:c(()=>Xe.internet.email(),"email")}},entries:e["journal-entries"],orders:e["purchase-orders"]||e["sales-orders"],bills:e["vendor-bills"]},i=t(n);return s.includes("{{")&&s.includes("}}")&&(console.debug(`[TEMPLATE] Input: ${s}`),console.debug(`[TEMPLATE] Output: ${i}`)),i}return Array.isArray(s)?s.map(t=>Xn(t,e)):typeof s=="object"&&s!==null?Object.fromEntries(Object.entries(s).map(([t,n])=>[t,Xn(n,e)])):s}c(Xn,"processNode");function Ha(s,e){return Xn(s,e)}c(Ha,"handleTemplate");class Ya{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(`${k.bold.cyan("[start]")} ${k.yellow(e.path)}`);let t=!1,n=!1,i={},r={},o;for(;!t;)try{r=await e.readTestCase(),r||(r=await e.generateConfig(),await this.environment.writeYaml(e.getTestCasePath(),r),console.debug(`${k.bold.yellow("[initialized]")} ${k.yellow(e.path)}`)),o=Ha(r,this.environment.state),await e.run(o),console.debug(`${k.bold.green("[success]")} ${k.yellow(e.path)}`),t=!0,i=e.getResult(),en(this.result,e.path,i)}catch(l){if(console.error(`${k.bold.red("[error]")} ${k.yellow(e.path)}: ${l}`),this.environment.options.fix&&!n){n=!0;try{await e.fix(l);continue}catch(u){console.error(`${k.bold.red("[fix fail]")} ${k.yellow(e.path)}: ${u}`)}}en(this.result,e.path,{error:se(l)}),t=!0,i={error:se(l)}}const a={...o,result:i};await this.environment.writeYaml(e.getTestCasePath(),a)}async runTestSuite(e){await e.run(),on(this.result,e.getResult())}}class Ie{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}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(k.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 i=await e();i?(this.logMsg(`\u2705 ${t}`),this.assertions.push({message:t,result:i})):(this.logMsg(`\u274C ${t}`),this.assertions.push({message:t,result:!1,details:n}))}catch(i){this.assertions.push({message:t,result:!1,details:se(i)}),this.logMsg(`\u274C ${t}: ${i.message}`)}}logMsg(e){console.debug(`${" ".repeat(this.level*2)}${e}`)}getTestCasePath(){return`${this.path}.test.yml`}}function Zn(s,e){const t={};for(const n in e){if(!(n in s)){t[n]=e[n];continue}const i=s[n],r=e[n];if(i&&r&&typeof i=="object"&&typeof r=="object"){if(Array.isArray(i)&&Array.isArray(r)){const o=r.filter(a=>!i.some(l=>{if(typeof l=="object"&&typeof a=="object"&&l!==null&&a!==null&&!Array.isArray(l)&&!Array.isArray(a)){for(const u in a)if(!(u in l)||!es(l[u],a[u]))return!1;return!0}else return JSON.stringify(l)===JSON.stringify(a)}));o.length>0&&(t[n]=o)}else if(!Array.isArray(i)&&!Array.isArray(r)){const o=Zn(i,r);o!==null&&(t[n]=o)}else t[n]=r;continue}es(i,r)||(t[n]=r)}return Object.keys(t).length===0?null:t}c(Zn,"getNotMatchingSubFields");function es(s,e){if(s==e||s?.toString?.()===e?.toString?.())return!0;const t=new Date(s),n=new Date(e);return!isNaN(t.getTime())&&!isNaN(n.getTime())?t.getTime()===n.getTime():!1}c(es,"softCompare");class za extends Ie{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=tn(this.dataCollection);if(this.dataCollection.findById){const r=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).findById({id:t.id});await this.assert(()=>!!r.record,"Record is returned from findById"),r.record&&(this.environment.state[this.dataCollectionKey]={createdRecordId:t.id,createdRecord:r.record.fields});const o=as(n),a=mt(e.input.fields,o,{skipUnknownFields:!0}),l=mt(r.record.fields,o),u=Zn(l,a);await this.assert(()=>!u,"Returned fields match created fields",{difference:u,sentFields:a,receivedFields:l})}const i=ir(n);if(i.length>0){const r={};i.forEach(a=>{const l=rr(e.input.fields,a);typeof l<"u"&&en(r,a,l)});const o=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).create({fields:r});await this.assert(()=>!!o.id,"Record can be created with schema-defined required fields only")}}async generateConfig(){const e=tn(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=se(t),i=tn(this.dataCollection),r=await this.getExampleRecordsForSchema(i),o=`I'm trying to create a data record in a data collection with the following fields schema:
|
|
150
150
|
|
|
151
151
|
${JSON.stringify(i,null,2)}
|
|
152
152
|
|
|
@@ -186,7 +186,7 @@ ${JSON.stringify(i,null,2)}`).join(`
|
|
|
186
186
|
|
|
187
187
|
`)}.
|
|
188
188
|
|
|
189
|
-
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
|
|
189
|
+
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 cs(e,i=>{if(i.referenceCollection){const r=i.referenceCollection.key,o=i.referenceCollection.parameters,a=`${r}:${JSON.stringify(o||{})}`;t.has(a)||(t.add(a),n.push({key:r,parameters:o}))}return i}),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 i of t){const r=ls(i);n[r]=await this.fetchExampleRecords(i)}return n}}class Qa extends Ie{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=se(t),i=`I'm trying to delete a record from a data collection.
|
|
190
190
|
|
|
191
191
|
I tried to delete a record with this ID:
|
|
192
192
|
|
|
@@ -206,7 +206,7 @@ Format your response as a JSON object with two fields:
|
|
|
206
206
|
"id": "fixed id"
|
|
207
207
|
}.
|
|
208
208
|
|
|
209
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:{id:o.id}}}}class
|
|
209
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:{id:o.id}}}}class Xa extends Ie{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=se(t),i=`I'm trying to find a record by ID in a data collection.
|
|
210
210
|
|
|
211
211
|
I tried to find a record with this ID:
|
|
212
212
|
|
|
@@ -226,7 +226,7 @@ Format your response as a JSON object with two fields:
|
|
|
226
226
|
"id": "fixed id"
|
|
227
227
|
}.
|
|
228
228
|
|
|
229
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:{id:o.id}}}}class
|
|
229
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:{id:o.id}}}}class Za extends Ie{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:i}=e.input.sort,r=t.records;if(r.length>1)for(let o=1;o<r.length;o++){const a=r[o-1].fields[n],l=r[o].fields[n];a==null||l==null||(i==="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=se(t),i=`I'm trying to list records from a data collection.
|
|
230
230
|
|
|
231
231
|
I tried to list records with these parameters:
|
|
232
232
|
|
|
@@ -246,7 +246,7 @@ Format your response as a JSON object with two fields:
|
|
|
246
246
|
"input": { ... fixed parameters ... }
|
|
247
247
|
}.
|
|
248
248
|
|
|
249
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:o.input}}}class
|
|
249
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:o.input}}}class ec extends Ie{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,r=(await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).findById({id:n.id})).record;for(const[o,a]of Object.entries(e.input.query)){const l=r.fields[o];await this.assert(()=>es(l,a),`Record field ${o} 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={},i=t.fields||{},r=Object.entries(i).filter(([o,a])=>o!=="links"&&a!=null&&a!=="").slice(0,1);if(r.length===0)throw new Error("No usable fields found in record for matching");for(const[o,a]of r)n[o]=a;return{input:{query:n}}}async fixTestCase({config:e,error:t}){const n=se(t),i=`I'm trying to match a record in a data collection.
|
|
250
250
|
|
|
251
251
|
I tried to match a record with this query:
|
|
252
252
|
|
|
@@ -266,12 +266,12 @@ Format your response as a JSON object with two fields:
|
|
|
266
266
|
"query": { ... fixed query ... }
|
|
267
267
|
}.
|
|
268
268
|
|
|
269
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:{query:o.query}}}}class
|
|
269
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:{query:o.query}}}}class tc extends Ie{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(i=>i.id===e.expectedRecordId);n||console.debug(k.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.
|
|
270
270
|
|
|
271
271
|
Record fields:
|
|
272
272
|
${JSON.stringify(e,null,2)}
|
|
273
273
|
|
|
274
|
-
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=
|
|
274
|
+
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=se(t),i=`I'm trying to search records in a data collection.
|
|
275
275
|
|
|
276
276
|
I tried to search records with these parameters:
|
|
277
277
|
|
|
@@ -291,7 +291,7 @@ Format your response as a JSON object with two fields:
|
|
|
291
291
|
"input": { ... fixed parameters ... }
|
|
292
292
|
}.
|
|
293
293
|
|
|
294
|
-
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:o.input,expectedRecordId:e.expectedRecordId}}}class
|
|
294
|
+
Only return the JSON object, no other text or wrapping (like \`\`\`json or \`\`\`).`,r=await this.environment.llm.complete({prompt:i,maxTokens:1e3}),o=JSON.parse(r.trim());return console.warn(k.bold.yellow("[auto-fix]"),`${this.path}:`,o.explanation),{input:o.input,expectedRecordId:e.expectedRecordId}}}class nc extends Ie{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 sc extends Ie{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 i=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).findById({id:n.id});await this.assert(()=>!!i.record,"Record is returned from findById");const r=nn(this.dataCollection),o=as(r),a=mt(e.input.fields,o,{skipUnknownFields:!0}),l=mt(i.record.fields,o),u=Zn(l,a);await this.assert(()=>!u,"Returned fields match updated fields",{difference:u,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 i=await this.environment.client.connection(this.environment.connectionId).dataCollection(this.dataCollectionKey).list({});if(!i?.records?.length)throw new Error(`No records found to test update for ${this.dataCollectionKey}`);e=i.records[0].id}const t=nn(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=se(t),i=nn(this.dataCollection),r=await this.getExampleRecordsForSchema(i),o=`I'm trying to update a data record in a data collection with the following fields schema:
|
|
295
295
|
|
|
296
296
|
${JSON.stringify(i,null,2)}
|
|
297
297
|
|
|
@@ -331,9 +331,9 @@ ${JSON.stringify(i,null,2)}`).join(`
|
|
|
331
331
|
|
|
332
332
|
`)}.
|
|
333
333
|
|
|
334
|
-
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
|
|
335
|
-
`),"createExperimentalWarning");function
|
|
336
|
-
`)).action(async(t,n)=>{try{console.warn(
|
|
337
|
-
${k.bold.cyan("Membrane Agent CLI")} ${k.gray(`v${
|
|
334
|
+
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 cs(e,i=>{if(i.referenceCollection){const r=i.referenceCollection.key,o=i.referenceCollection.parameters,a=`${r}:${JSON.stringify(o||{})}`;t.has(a)||(t.add(a),n.push({key:r,parameters:o}))}return i}),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 i of t){const r=ls(i);n[r]=await this.fetchExampleRecords(i)}return n}}const ts={spec:{testerClass:nc},create:{testerClass:za,operationKey:"create"},"find-by-id":{testerClass:Xa,operationKey:"findById"},list:{testerClass:Za,operationKey:"list"},match:{testerClass:ec,operationKey:"match"},search:{testerClass:tc,operationKey:"search"},update:{testerClass:sc,operationKey:"update"},delete:{testerClass:Qa,operationKey:"delete"}};class ic extends Ya{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);G.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=ts[e];if(!n)throw new Error(`Unknown test method "${e}". Available: ${this.getAvailableTestMethods(t).join(", ")}`);const i="operationKey"in n?n.operationKey:void 0;if(!this.isOperationAvailable(t,i))throw new Error(`${i} operation not available for data collection "${this.dataCollectionKey}"`);return this.instantiateTester(n,t)}createAllAvailableTesters(e){return Object.entries(ts).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(ts).filter(([,t])=>{const n="operationKey"in t?t.operationKey:void 0;return this.isOperationAvailable(e,n)}).map(([t])=>t)}displayTestSummary(e){G.info(`\u{1F4CA} ${e} test${e===1?"":"s"} executed`)}}class rc extends Ga{static{c(this,"TestRunner")}constructor(e){super(e)}async initialize(){G.debug("Initializing test runner",{prefix:"TestRunner"})}async run(){try{const{testPath:e,path:t,fix:n}=this.options,i=e.split("/");i.length<2&&(G.error("Invalid test path. Expected format: <type>/<name>[/additional/path][/method]"),process.exit(1));const[r,o,...a]=i;r!=="connectors"&&(G.error(`Test type "${r}" is not yet fully implemented. Currently only "connectors" is fully supported.`),G.error("Supported test types: connectors"),process.exit(1));const l=o,u=r,p=[...a,...t?t.split("/"):[]].join("/"),h=await ns.create({connectionId:l,testBasePath:u,options:{fix:n}}),g=await h.client.get(`connections/${l}/data`),w=[],d=p?p.split("/"):[];if(d.length===0||d[0]==="data"){d[0]==="data"&&d.shift();let C,v;d.length>=1&&(v=d[0],d.length>=2&&d[1].trim()!==""&&(C=d[1]));for(const $ of g){if(v&&v!==$.key)continue;const T=new ic({environment:h,dataCollectionKey:$.key,testMethod:C});w.push(T)}}w.length===0&&(G.error(`No test suites found for path: ${e}${p?"/"+p:""}`),process.exit(1));const y={};for(const C of w){await C.run();const v=C.getResult();G.debug(`Suite ${C.constructor.name} result:`,{prefix:"TestRunner"}),on(y,v)}console.debug("[TestRunner] All results collected:",Object.keys(y)),h.writeResults(y)}catch(e){throw console.error("Error in TestRunner.run():",e),e}}}const Yt=c(()=>[k.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"),k.yellow("\u2502 \u26A0\uFE0F EXPERIMENTAL FEATURE WARNING \u2502"),k.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"),k.yellow("\u2502 The test command is experimental and subject to rapid changes. \u2502"),k.yellow("\u2502 Features, APIs, and file structures may change without notice. \u2502"),k.yellow("\u2502 Use in production environments is not recommended. \u2502"),k.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(`
|
|
335
|
+
`),"createExperimentalWarning");function oc(s){s.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",Yt()).action(async()=>{console.warn(Yt()),G.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",["",k.bold("Examples:"),` ${k.gray("\u25B8")} ${k.cyan("membrane test run connectors/netsuite")} # Test all data collections for netsuite connector`,` ${k.gray("\u25B8")} ${k.cyan("membrane test run connectors/netsuite/data/contacts")} # Test specific data collection`,` ${k.gray("\u25B8")} ${k.cyan("membrane test run connectors/netsuite/data/contacts/create")} # Test specific method for data collection`,` ${k.gray("\u25B8")} ${k.cyan("membrane test run connectors/netsuite/data/contacts/delete")} # Test delete method for data collection`,` ${k.gray("\u25B8")} ${k.cyan("membrane test run actions/create-contact")} # Test specific action`,` ${k.gray("\u25B8")} ${k.cyan("membrane test run connectors/hubspot/events")} # Test events for hubspot`,` ${k.gray("\u25B8")} ${k.cyan("membrane test run connectors/salesforce --fix")} # Run tests with auto-fix enabled`,"",k.gray("For more information, visit:"),k.blue(" https://docs.integration.app/cli"),"",Yt()].join(`
|
|
336
|
+
`)).action(async(t,n)=>{try{console.warn(Yt()),t||(G.error("Test path is required"),process.exit(1)),G.header(`Testing: ${t}`);const i=new rc({testPath:t,path:n.path,fix:n.fix});await i.initialize(),await i.run(),G.success("Tests completed")}catch(i){i instanceof Error&&(G.error(i.message),process.exit(1)),G.error("An unknown error occurred"),process.exit(1)}})}c(oc,"setupTestCommand");const ac=c(()=>{try{const s=mr(import.meta.url),e=Wi(s),t=Gi(e,"..","package.json");return JSON.parse(Zi(t,"utf-8")).version}catch{return"1.0.0"}},"getPackageVersion"),Bi=ac();function cc(){const s=new gr().name("membrane").description("Command-line interface for Membrane Agent").version(Bi,"-v, --version","Output the version number");s.configureHelp({sortSubcommands:!0,subcommandTerm:c(e=>k.cyan(e.name()),"subcommandTerm"),commandUsage:c(e=>e.name()==="membrane"?`${k.cyan(e.name())} ${k.gray("[options]")} ${k.cyan("[command]")}`:e.usage(),"commandUsage"),optionTerm:c(e=>{const t=e.flags;return`${k.gray("\u25B8")} ${k.cyan(t)}`},"optionTerm"),subcommandDescription:c(e=>k.gray(e.description()),"subcommandDescription"),optionDescription:c(e=>k.gray(e.description),"optionDescription"),commandDescription:c(e=>k.gray(e.description()),"commandDescription")}),s.addHelpText("beforeAll",`
|
|
337
|
+
${k.bold.cyan("Membrane Agent CLI")} ${k.gray(`v${Bi}`)}
|
|
338
338
|
|
|
339
|
-
`),
|
|
339
|
+
`),Ua(s),Wa(s),oc(s),Ka(s),Ra(s),xa(s),process.argv.length===2&&(s.outputHelp(),process.exit(0)),s.parse()}c(cc,"runCLI");const Ui=["--cwd"];function lc(){const s=process.argv.slice(2);return s.some((e,t)=>t>0&&Ui.includes(s[t-1])?!1:!Ui.includes(e))}c(lc,"hasCLIArguments"),lc()?cc():$a();
|