velloo 0.3.0 → 0.3.1
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/canvas/assets/{index-CqXW6xA_.js → index-DZFrkC4P.js} +11 -11
- package/canvas/assets/{lucide-all-C_CNpsMs.js → lucide-all-Bu8-9UDF.js} +1 -1
- package/canvas/index.html +1 -1
- package/chunk-0s6drs3n.js +2 -0
- package/{chunk-1jzhw3p4.js → chunk-1xb88e07.js} +1 -1
- package/{chunk-tc4mzzfw.js → chunk-2e3nd4tz.js} +1 -1
- package/{chunk-m3czg1tt.js → chunk-2p37rp3j.js} +1 -1
- package/{chunk-n9kcxaj7.js → chunk-2zbn6641.js} +1 -1
- package/{chunk-wcqqx6tz.js → chunk-3px2d1j1.js} +1 -1
- package/{chunk-dsks52m7.js → chunk-4e9jh482.js} +1 -1
- package/{chunk-bpeezw7w.js → chunk-4g250157.js} +1 -1
- package/{chunk-k9219kmj.js → chunk-4ma2wnqw.js} +1 -1
- package/{chunk-7bvvbsqy.js → chunk-59zas5y2.js} +1 -1
- package/{chunk-nr3ej3qf.js → chunk-7cvhnp9h.js} +1 -1
- package/{chunk-9f22qnge.js → chunk-7s8frnag.js} +1 -1
- package/chunk-7t13w87m.js +2 -0
- package/{chunk-cxzkkn12.js → chunk-7yaafw73.js} +1 -1
- package/{chunk-5ezzc1h2.js → chunk-88eqqdk1.js} +2 -2
- package/{chunk-wzngjjeb.js → chunk-8z3ykvcs.js} +1 -1
- package/{chunk-wa6qamwh.js → chunk-98vvrj0c.js} +1 -1
- package/{chunk-3tmsrvaj.js → chunk-9cdwhrkh.js} +1 -1
- package/{chunk-7k7dpj5y.js → chunk-9p1dk5cb.js} +1 -1
- package/{chunk-kz4423th.js → chunk-9psr8atb.js} +1 -1
- package/{chunk-qdnb2t6a.js → chunk-9ydc34wc.js} +1 -1
- package/{chunk-6nzqhfqq.js → chunk-asbajsmd.js} +1 -1
- package/{chunk-9nhw49vv.js → chunk-avkfsc3p.js} +1 -1
- package/{chunk-t5bb30zy.js → chunk-f0vsjfpc.js} +1 -1
- package/{chunk-4nqr089t.js → chunk-g71v35gd.js} +1 -1
- package/{chunk-k7sehkm8.js → chunk-mfbxfb9b.js} +1 -1
- package/{chunk-9g4tr0r6.js → chunk-mt8ds8zj.js} +1 -1
- package/{chunk-d9p6s05n.js → chunk-nev5mv85.js} +1 -1
- package/{chunk-3g3dqej3.js → chunk-p62fygqz.js} +1 -1
- package/{chunk-nycs0z7h.js → chunk-p6e1eg76.js} +1 -1
- package/{chunk-jx11jvq8.js → chunk-ph2jfg1x.js} +1 -1
- package/{chunk-y5r2w2z3.js → chunk-pve2mmnr.js} +1 -1
- package/{chunk-7njj1qmq.js → chunk-t2w8a591.js} +1 -1
- package/{chunk-qgwhd4n6.js → chunk-t5m5mznb.js} +1 -1
- package/{chunk-yeh9gb5w.js → chunk-t947mxr1.js} +1 -1
- package/{chunk-49cgk5s2.js → chunk-tt7fys2w.js} +1 -1
- package/{chunk-td5z2sm4.js → chunk-wafb2xm9.js} +1 -1
- package/{chunk-52hxv18g.js → chunk-whw3epmr.js} +1 -1
- package/{chunk-1n5kmsxb.js → chunk-wndntr7s.js} +1 -1
- package/{chunk-tbmkq7wy.js → chunk-wnwgqvtd.js} +1 -1
- package/{chunk-k6n249vb.js → chunk-wp123630.js} +1 -1
- package/{chunk-maz6z7tz.js → chunk-wvs939t5.js} +1 -1
- package/{chunk-bvmtq0vn.js → chunk-z21hg6j3.js} +1 -1
- package/cli.js +1 -1
- package/package.json +1 -1
- package/chunk-788t8y5x.js +0 -2
- package/chunk-xyfed1j0.js +0 -2
|
@@ -125,7 +125,7 @@ ${registry}
|
|
|
125
125
|
};
|
|
126
126
|
export { React, createRoot, ErrorBoundary };
|
|
127
127
|
`}function registryFor(source){let{folder}=source;return(screen)=>registryForScreen(screen,source.providers,source.defaultProvider,folder.config.extensions??{},folder.config.styling?.framework)}function boardsPlacing(folder,screenId){return[...folder.boards.values()].filter((board)=>board.frames.some((frame)=>frame.screen===screenId)).map((board)=>({id:board.id,name:board.name}))}function preflightScreens(source,screens){let registry=registryFor(source),out=[];for(let screen of screens){let where={screenId:screen.id,screenName:screen.name,boards:boardsPlacing(source.folder,screen.id)};try{for(let failure of renderBodyGuarded(screen,registry(screen),source.folder.snippets).failures)out.push({...where,componentId:failure.componentId,reason:failure.reason})}catch(error){if(error instanceof RenderGuardLimitError)for(let failure of error.failures)out.push({...where,componentId:failure.componentId,reason:failure.reason});out.push({...where,componentId:null,reason:error instanceof Error?error.message:String(error)})}}return out}function screenById(folder,id){return id===void 0?void 0:folder.screens.get(id)}function screensForBoards(folder,boardIds){let seen=new Map;for(let boardId of boardIds){let board=folder.boards.get(boardId);if(!board)continue;for(let frame of board.frames){let screen=screenById(folder,frame.screen);if(screen&&!seen.has(screen.id))seen.set(screen.id,screen)}}return[...seen.values()]}function screensForExportTarget(folder,kind,id){if(kind==="board")return screensForBoards(folder,[id]);if(kind==="screen"){let screen=folder.screens.get(id);return screen?[screen]:[]}for(let board of folder.boards.values()){let frame=board.frames.find((f)=>f.id===id);if(!frame)continue;let screen=screenById(folder,frame.screen);return screen?[screen]:[]}return[]}import{existsSync as existsSync5}from"fs";import{dirname as dirname9,join as join13}from"path";import{fileURLToPath}from"url";var here=dirname9(fileURLToPath(import.meta.url));function resolveDir(){return[process.env.VELLOO_HELPERS_SRC,join13(here,"pkgs","helpers","src"),here].filter((p)=>Boolean(p)).find((d)=>existsSync5(join13(d,"heading.tsx")))??here}var helpersComponentsDir=resolveDir(),HELPER_SOURCE_FILES={Box:"box.tsx",Divider:"divider.tsx",Gradient:"gradient.tsx",Heading:"heading.tsx",Icon:"icon.tsx",Image:"image.tsx",Layer:"layer.tsx",Placeholder:"placeholder.tsx",Prose:"prose.tsx",SVG:"svg.tsx",Text:"text.tsx"};function helperSourcePath(id){let file=HELPER_SOURCE_FILES[id];return file?join13(helpersComponentsDir,file):void 0}import{existsSync as existsSync6,readdirSync as readdirSync2,readFileSync as readFileSync5,realpathSync as realpathSync3}from"fs";import{join as join14,relative as relative2,resolve as resolve5,sep as sep2}from"path";var SWITCH_DESIGN_META="velloo/switchDesign",PICK_REASONS=["cwd","only","default","arbitrary"];function parseMcpSessionUrl(url){let params=new URL(url??"/mcp","http://velloo.local").searchParams,pick=params.get("pick");return{switchable:params.get("switch")==="1",pick:PICK_REASONS.find((reason)=>reason===pick)}}function withMcpSessionUrl(url,session){let parsed=new URL(url);if(session.switchable)parsed.searchParams.set("switch","1");else parsed.searchParams.delete("switch");if(session.pick)parsed.searchParams.set("pick",session.pick);else parsed.searchParams.delete("pick");return parsed.toString()}function realOr3(path){return existsSync6(path)?realpathSync3(path):resolve5(path)}function usableDesigns(set){return(set?.designs??[]).filter((d)=>d.exists&&!d.outsideRepo&&set?.byName.get(d.name)===d)}async function sessionDesigns(root,current,options){let set=await designsFor(root).catch(()=>null),here=realOr3(root),others=usableDesigns(set).filter((d)=>realOr3(d.root)!==here);if(others.length===0)return null;let names=[...new Set([current,...others.map((d)=>d.name)])].sort();return{current,names,switchable:options.switchable,pick:options.pick}}function designsInstruction(designs){let{current,names}=designs,list=names.map((n)=>n===current?`\`${n}\` (this session)`:`\`${n}\``),move=designs.switchable?"`switch_design` moves to another":"to work on another, the user reconnects with `velloo mcp <name>`",lines=[`**Design: \`${current}\`** \u2014 one of ${names.length} here: ${list.join(", ")}. Operations target \`${current}\`; ${move}. Tell the user when you switch.`];if(designs.pick==="arbitrary")lines.unshift(`**No design was specified, so this session opened \`${current}\`.** Confirm which design the user means before changing anything.`);return lines}function countJson(dir,skipSuffix){try{return readdirSync2(dir).filter((f)=>f.endsWith(".json")&&!f.endsWith(skipSuffix)).length}catch{return 0}}function defaultLibraryOf(folder){try{let config=JSON.parse(readFileSync5(join14(folder,".design","config.json"),"utf8")),key=typeof config.defaultLibrary==="string"?config.defaultLibrary:void 0,id=key?config.libraries?.[key]?.id:void 0;return typeof id==="string"?id:void 0}catch{return}}async function listDesigns(root){let set=await designsFor(root),here=realOr3(root);return usableDesigns(set).map((d)=>({name:d.name,path:d.local||!set?.repo?d.root:relative2(set.repo.dir,d.root).split(sep2).join("/")||".",current:realOr3(d.root)===here,local:d.local!==null,library:defaultLibraryOf(d.root),boards:countJson(join14(d.root,"boards"),".notes.json"),screens:countJson(join14(d.root,"screens"),".annotations.json")}))}async function switchTarget(root,name){let set=await designsFor(root),target=usableDesigns(set).find((d)=>d.name===name);if(!target)return{ok:!1,error:{kind:"UnknownDesign",name,designs:usableDesigns(set).map((d)=>d.name)}};return{ok:!0,directive:{name:target.name,root:target.root}}}function summarizeIssues(issues,acceptedKeys){let lines=[...new Set(issues.map((issue)=>describe(issue,acceptedKeys)).filter(Boolean))];if(lines.length===0)return;let shown=lines.slice(0,MAX_LINES),rest=lines.length-shown.length;return rest>0?`${shown.join(" ")} (+${rest} more \u2014 see \`issues\`.)`:shown.join(" ")}var MAX_LINES=4;function describe(issue,acceptedKeys){let at=pathOf(issue.path);switch(issue.code){case"unrecognized_keys":{let keys=issue.keys,nested=issue.path.length>0,suggestions=nested?[]:keys.map((key)=>({key,match:closest(key,acceptedKeys)})).filter((s)=>s.match!==void 0).map((s)=>`use \`${s.match}\` instead of \`${s.key}\``);return[`${plural(keys.length,"Unknown argument")} ${list(keys)}${at?` at ${at}`:""}.`,suggestions.length>0?`Did you mean: ${suggestions.join("; ")}?`:"",!nested&&acceptedKeys.length>0?`This operation accepts ${list(acceptedKeys)}.`:""].filter(Boolean).join(" ")}case"invalid_union":{let shapes=[...new Set(unionExpectations(issue))],detail=branchDetail(issue);return`\`${at||"the arguments"}\` doesn't match any accepted shape \u2014 it takes ${list(shapes.length>0?shapes:["one of the documented shapes"])}.${detail?` ${detail}`:""}`}case"invalid_type":return`\`${at||"the arguments"}\` expects ${issue.expected}, got ${received(issue)}.`;default:return issue.message?`${at?`\`${at}\`: `:""}${issue.message}`:""}}function unionExpectations(issue){let out=[];for(let branch of issue.errors)for(let inner of branch){if(inner.path.length>0)continue;if(inner.code==="invalid_type")out.push(String(inner.expected));else if(inner.code==="invalid_value")out.push(...inner.values.map(String))}return out}function branchDetail(issue){for(let branch of issue.errors)for(let inner of branch){if(inner.path.length===0)continue;let at=pathOf([...issue.path,...inner.path]);return inner.code==="invalid_type"?`The closest shape wants \`${at}\` to be ${inner.expected}, got ${received(inner)}.`:`The closest shape wants \`${at}\`: ${inner.message}`}return""}function received(issue){return/received (\w+)/.exec(issue.message)?.[1]??"something else"}function pathOf(path){return path.map(String).join(".")}function list(values){let quoted=values.map((v)=>`\`${v}\``);if(quoted.length<=1)return quoted.join("");return`${quoted.slice(0,-1).join(", ")} and ${quoted.at(-1)}`}function plural(count,word){return count===1?word:`${word}s`}function closest(key,accepted){let lower=key.toLowerCase(),contains=accepted.find((candidate)=>{let other=candidate.toLowerCase();return other.includes(lower)||lower.includes(other)});if(contains)return contains;return accepted.find((candidate)=>editDistance(lower,candidate.toLowerCase())<=2)}function editDistance(a,b){if(Math.abs(a.length-b.length)>2)return 99;let prev=Array.from({length:b.length+1},(_,i)=>i);for(let i=1;i<=a.length;i++){let row=[i];for(let j=1;j<=b.length;j++)row[j]=Math.min((prev[j]??0)+1,(row[j-1]??0)+1,(prev[j-1]??0)+(a[i-1]===b[j-1]?0:1));prev=row}return prev[b.length]??99}function jsonResult(value){return{content:[{type:"text",text:JSON.stringify(value)}]}}function structuredResult(value,...extra){return{content:[{type:"text",text:JSON.stringify(value)},...extra],structuredContent:value}}function errorResult(error){return{isError:!0,content:[{type:"text",text:JSON.stringify(typeof error==="string"?{kind:"Error",message:error}:error)}]}}function toMcp(result){return result.ok?jsonResult(result.value):errorResult(result.error)}var MCP_SURFACE_MODES=["guided","full"],DEFAULT_MCP_SURFACE={mode:"guided"},LEGACY_SURFACE_ALIASES={profile:"full"};function parseMcpSurfaceSelection(modeValue){let raw=modeValue||DEFAULT_MCP_SURFACE.mode,mode=LEGACY_SURFACE_ALIASES[raw]??raw;if(!MCP_SURFACE_MODES.includes(mode))return{ok:!1,error:`unknown MCP surface "${raw}"; expected ${MCP_SURFACE_MODES.join(", ")}`};return{ok:!0,selection:{mode}}}function parseMcpSurfaceUrl(url){let parsed=new URL(url??"/mcp","http://velloo.local");return parseMcpSurfaceSelection(parsed.searchParams.get("surface"))}function withMcpSurfaceUrl(url,selection){let parsed=new URL(url);return parsed.searchParams.set("surface",selection.mode),parsed.searchParams.delete("profile"),parsed.toString()}function schemaJson(tool){if(!tool.inputSchema)return{type:"object",properties:{},additionalProperties:!1};try{return toJSONSchema(tool.inputSchema,{io:"input"})}catch{return{type:"object",description:"Schema is not representable as JSON Schema"}}}function acceptedKeys(schema){let properties=schema.properties;return properties&&typeof properties==="object"?Object.keys(properties):[]}function operationHelp(operation,tool,schema=schemaJson(tool)){return{operation,description:tool.description??"",inputSchema:schema,annotations:tool.annotations??{}}}function errorTextOf(result){return result.content.filter((part)=>part.type==="text").map((part)=>part.text).join(" ").slice(0,400)}function appendSchemaHelp(result,operation,tool){if(result.isError!==!0)return result;return{...result,content:[...result.content,{type:"text",text:JSON.stringify({kind:"OperationSchemaHelp",...operationHelp(operation,tool)})}]}}function applyMcpToolSurface(mcp,selection){let original=mcp.registerTool.bind(mcp),native=new Map,registeringNative=!0,patched=(name,config,cb)=>{let registered=original(name,config,cb);if(registeringNative){if(native.set(name,registered),selection.mode!=="full")registered.disable()}return registered};mcp.registerTool=patched;let invoke=async(operation,args,extra)=>{let tool=native.get(operation);if(!tool)return errorResult({kind:"UnknownOperation",operation});if(tool.inputSchema){let parsed=await tool.inputSchema.safeParseAsync(args);if(!parsed.success){let schema=schemaJson(tool),problem=summarizeIssues(parsed.error.issues,acceptedKeys(schema));return errorResult({kind:"InvalidOperationArguments",operation,...problem?{problem}:{},issues:parsed.error.issues,...operationHelp(operation,tool,schema)})}return appendSchemaHelp(await tool.handler(parsed.data,extra),operation,tool)}return appendSchemaHelp(await tool.handler(extra,void 0),operation,tool)};return{nativeTools:()=>native,finish(){if(registeringNative=!1,selection.mode!=="guided")return;let operation=_enum([...native.keys()]);mcp.registerTool("call_velloo",{description:"Call one native Velloo operation. Failed calls include the exact correction schema.",inputSchema:{operation,arguments:record(string(),unknown()).describe("Arguments object for the native operation")}},async({operation:name,arguments:args},extra)=>invoke(name,args,extra)),mcp.registerTool("run_velloo_plan",{description:"Run up to eight native Velloo calls sequentially, stopping on the first error by default.",inputSchema:{calls:array(object({operation,arguments:record(string(),unknown())})).min(1).max(8),stopOnError:boolean().default(!0)}},async({calls,stopOnError},extra)=>{let content=[],failedAt=null,failures=[];for(let[index,call]of calls.entries()){let result=call.operation==="switch_design"?errorResult({kind:"SwitchDesignInPlan",message:"Call switch_design on its own, then plan against the new design."}):await invoke(call.operation,call.arguments,extra);if(content.push({type:"text",text:JSON.stringify({index,operation:call.operation,isError:result.isError===!0})}),content.push(...result.content),result.isError===!0){if(failures.push({index,operation:call.operation,error:errorTextOf(result)}),stopOnError!==!1){failedAt=index;break}}}let failure=failures.at(-1),summary=failedAt===null?{kind:"PlanCompleted",completed:calls.length-failures.length,...failures.length>0?{failed:failures}:{}}:{kind:"PlanFailed",failedAt,completed:failedAt,operation:failure?.operation,error:failure?.error,remaining:calls.length-failedAt-1};return{...failedAt===null?{}:{isError:!0},content:[{type:"text",text:JSON.stringify(summary)},...content]}}),mcp.registerTool("operation_schema",{description:"Return the exact schema and description for one native operation.",inputSchema:{operation}},async({operation:name})=>{let tool=native.get(name);return tool?jsonResult(operationHelp(name,tool)):errorResult({kind:"UnknownOperation",operation:name})})}}}import{mkdir as mkdir8,readFile as readFile6}from"fs/promises";import{homedir as homedir3}from"os";import{dirname as dirname10,join as join15}from"path";var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(message){this.toString=function(){return"CORRUPT: "+this.message},this.message=message},invalid:function(message){this.toString=function(){return"INVALID: "+this.message},this.message=message},bug:function(message){this.toString=function(){return"BUG: "+this.message},this.message=message},notReady:function(message){this.toString=function(){return"NOT READY: "+this.message},this.message=message}}};sjcl.cipher.aes=function(key){if(!this._tables[0][0][0])this._precompute();var i,j,tmp,encKey,decKey,sbox=this._tables[0][4],decTable=this._tables[1],keyLen=key.length,rcon=1;if(keyLen!==4&&keyLen!==6&&keyLen!==8)throw new sjcl.exception.invalid("invalid aes key size");this._key=[encKey=key.slice(0),decKey=[]];for(i=keyLen;i<4*keyLen+28;i++){if(tmp=encKey[i-1],i%keyLen===0||keyLen===8&&i%keyLen===4){if(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[tmp&255],i%keyLen===0)tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^(rcon>>7)*283}encKey[i]=encKey[i-keyLen]^tmp}for(j=0;i;j++,i--)if(tmp=encKey[j&3?i:i-4],i<=4||j<4)decKey[j]=tmp;else decKey[j]=decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[tmp&255]]};sjcl.cipher.aes.prototype={encrypt:function(data){return this._crypt(data,0)},decrypt:function(data){return this._crypt(data,1)},_tables:[[[],[],[],[],[]],[[],[],[],[],[]]],_precompute:function(){var encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],i,x,xInv,d=[],th=[],x2,x4,x8,s,tEnc,tDec;for(i=0;i<256;i++)th[(d[i]=i<<1^(i>>7)*283)^i]=i;for(x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4,s=s>>8^s&255^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]],tDec=x8*16843009^x4*65537^x2*257^x*16843008,tEnc=d[s]*257^s*16843008;for(i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)},_crypt:function(input,dir){if(input.length!==4)throw new sjcl.exception.invalid("invalid aes block size");var key=this._key[dir],a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],a2,b2,c2,nInnerRounds=key.length/4-2,i,kIndex=4,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];for(i=0;i<nInnerRounds;i++)a2=t0[a>>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[d&255]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[a&255]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[b&255]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[c&255]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[d&255]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}};sjcl.bitArray={bitSlice:function(a,bstart,bend){return a=sjcl.bitArray._shiftRight(a.slice(bstart/32),32-(bstart&31)).slice(1),bend===void 0?a:sjcl.bitArray.clamp(a,bend-bstart)},extract:function(a,bstart,blength){var x,sh=Math.floor(-bstart-blength&31);if((bstart+blength-1^bstart)&-32)x=a[bstart/32|0]<<32-sh^a[bstart/32+1|0]>>>sh;else x=a[bstart/32|0]>>>sh;return x&(1<<blength)-1},concat:function(a1,a2){if(a1.length===0||a2.length===0)return a1.concat(a2);var last=a1[a1.length-1],shift=sjcl.bitArray.getPartial(last);if(shift===32)return a1.concat(a2);else return sjcl.bitArray._shiftRight(a2,shift,last|0,a1.slice(0,a1.length-1))},bitLength:function(a){var l=a.length,x;if(l===0)return 0;return x=a[l-1],(l-1)*32+sjcl.bitArray.getPartial(x)},clamp:function(a,len){if(a.length*32<len)return a;a=a.slice(0,Math.ceil(len/32));var l=a.length;if(len=len&31,l>0&&len)a[l-1]=sjcl.bitArray.partial(len,a[l-1]&2147483648>>len-1,1);return a},partial:function(len,x,_end){if(len===32)return x;return(_end?x|0:x<<32-len)+len*1099511627776},getPartial:function(x){return Math.round(x/1099511627776)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var x=0,i;for(i=0;i<a.length;i++)x|=a[i]^b[i];return x===0},_shiftRight:function(a,shift,carry,out){var i,last2=0,shift2;if(out===void 0)out=[];for(;shift>=32;shift-=32)out.push(carry),carry=0;if(shift===0)return out.concat(a);for(i=0;i<a.length;i++)out.push(carry|a[i]>>>shift),carry=a[i]<<32-shift;return last2=a.length?a[a.length-1]:0,shift2=sjcl.bitArray.getPartial(last2),out.push(sjcl.bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out},_xor4:function(x,y){return[x[0]^y[0],x[1]^y[1],x[2]^y[2],x[3]^y[3]]},byteswapM:function(a){var i,v,m=65280;for(i=0;i<a.length;++i)v=a[i],a[i]=v>>>24|v>>>8&m|(v&m)<<8|v<<24;return a}};sjcl.codec.utf8String={fromBits:function(arr){var out="",bl=sjcl.bitArray.bitLength(arr),i,tmp;for(i=0;i<bl/8;i++){if((i&3)===0)tmp=arr[i/4];out+=String.fromCharCode(tmp>>>8>>>8>>>8),tmp<<=8}return decodeURIComponent(escape(out))},toBits:function(str){str=unescape(encodeURIComponent(str));var out=[],i,tmp=0;for(i=0;i<str.length;i++)if(tmp=tmp<<8|str.charCodeAt(i),(i&3)===3)out.push(tmp),tmp=0;if(i&3)out.push(sjcl.bitArray.partial(8*(i&3),tmp));return out}};sjcl.codec.hex={fromBits:function(arr){var out="",i;for(i=0;i<arr.length;i++)out+=((arr[i]|0)+263882790666240).toString(16).substr(4);return out.substr(0,sjcl.bitArray.bitLength(arr)/4)},toBits:function(str){var i,out=[],len;str=str.replace(/\s|0x/g,""),len=str.length,str=str+"00000000";for(i=0;i<str.length;i+=8)out.push(parseInt(str.substr(i,8),16)^0);return sjcl.bitArray.clamp(out,len*4)}};sjcl.codec.base64={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(arr,_noEquals,_url){var out="",i,bits=0,c=sjcl.codec.base64._chars,ta=0,bl=sjcl.bitArray.bitLength(arr);if(_url)c=c.substr(0,62)+"-_";for(i=0;out.length*6<bl;)if(out+=c.charAt((ta^arr[i]>>>bits)>>>26),bits<6)ta=arr[i]<<6-bits,bits+=26,i++;else ta<<=6,bits-=6;while(out.length&3&&!_noEquals)out+="=";return out},toBits:function(str,_url){str=str.replace(/\s|=/g,"");var out=[],i,bits=0,c=sjcl.codec.base64._chars,ta=0,x;if(_url)c=c.substr(0,62)+"-_";for(i=0;i<str.length;i++){if(x=c.indexOf(str.charAt(i)),x<0)throw new sjcl.exception.invalid("this isn't base64!");if(bits>26)bits-=26,out.push(ta^x>>>bits),ta=x<<32-bits;else bits+=6,ta^=x<<32-bits}if(bits&56)out.push(sjcl.bitArray.partial(bits&56,ta,1));return out}};sjcl.codec.base64url={fromBits:function(arr){return sjcl.codec.base64.fromBits(arr,1,1)},toBits:function(str){return sjcl.codec.base64.toBits(str,1)}};sjcl.codec.bytes={fromBits:function(arr){var out=[],bl=sjcl.bitArray.bitLength(arr),i,tmp;for(i=0;i<bl/8;i++){if((i&3)===0)tmp=arr[i/4];out.push(tmp>>>24),tmp<<=8}return out},toBits:function(bytes){var out=[],i,tmp=0;for(i=0;i<bytes.length;i++)if(tmp=tmp<<8|bytes[i],(i&3)===3)out.push(tmp),tmp=0;if(i&3)out.push(sjcl.bitArray.partial(8*(i&3),tmp));return out}};sjcl.hash.sha256=function(hash){if(!this._key[0])this._precompute();if(hash)this._h=hash._h.slice(0),this._buffer=hash._buffer.slice(0),this._length=hash._length;else this.reset()};sjcl.hash.sha256.hash=function(data){return new sjcl.hash.sha256().update(data).finalize()};sjcl.hash.sha256.prototype={blockSize:512,reset:function(){return this._h=this._init.slice(0),this._buffer=[],this._length=0,this},update:function(data){if(typeof data==="string")data=sjcl.codec.utf8String.toBits(data);var i,b=this._buffer=sjcl.bitArray.concat(this._buffer,data),ol=this._length,nl=this._length=ol+sjcl.bitArray.bitLength(data);if(nl>9007199254740991)throw new sjcl.exception.invalid("Cannot hash more than 2^53 - 1 bits");if(typeof Uint32Array<"u"){var c=new Uint32Array(b),j=0;for(i=512+ol-(512+ol&511);i<=nl;i+=512)this._block(c.subarray(16*j,16*(j+1))),j+=1;b.splice(0,16*j)}else for(i=512+ol-(512+ol&511);i<=nl;i+=512)this._block(b.splice(0,16));return this},finalize:function(){var i,b=this._buffer,h=this._h;b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(i=b.length+2;i&15;i++)b.push(0);b.push(Math.floor(this._length/4294967296)),b.push(this._length|0);while(b.length)this._block(b.splice(0,16));return this.reset(),h},_init:[],_key:[],_precompute:function(){var i=0,prime=2,factor,isPrime;function frac(x){return(x-Math.floor(x))*4294967296|0}for(;i<64;prime++){isPrime=!0;for(factor=2;factor*factor<=prime;factor++)if(prime%factor===0){isPrime=!1;break}if(isPrime){if(i<8)this._init[i]=frac(Math.pow(prime,0.5));this._key[i]=frac(Math.pow(prime,0.3333333333333333)),i++}}},_block:function(w){var i,tmp,a,b,h=this._h,k=this._key,h0=h[0],h1=h[1],h2=h[2],h3=h[3],h4=h[4],h5=h[5],h6=h[6],h7=h[7];for(i=0;i<64;i++){if(i<16)tmp=w[i];else a=w[i+1&15],b=w[i+14&15],tmp=w[i&15]=(a>>>7^a>>>18^a>>>3^a<<25^a<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+w[i&15]+w[i+9&15]|0;tmp=tmp+h7+(h4>>>6^h4>>>11^h4>>>25^h4<<26^h4<<21^h4<<7)+(h6^h4&(h5^h6))+k[i],h7=h6,h6=h5,h5=h4,h4=h3+tmp|0,h3=h2,h2=h1,h1=h0,h0=tmp+(h1&h2^h3&(h1^h2))+(h1>>>2^h1>>>13^h1>>>22^h1<<30^h1<<19^h1<<10)|0}h[0]=h[0]+h0|0,h[1]=h[1]+h1|0,h[2]=h[2]+h2|0,h[3]=h[3]+h3|0,h[4]=h[4]+h4|0,h[5]=h[5]+h5|0,h[6]=h[6]+h6|0,h[7]=h[7]+h7|0}};sjcl.mode.ccm={name:"ccm",_progressListeners:[],listenProgress:function(cb){sjcl.mode.ccm._progressListeners.push(cb)},unListenProgress:function(cb){var index=sjcl.mode.ccm._progressListeners.indexOf(cb);if(index>-1)sjcl.mode.ccm._progressListeners.splice(index,1)},_callProgressListener:function(val){var p=sjcl.mode.ccm._progressListeners.slice(),i;for(i=0;i<p.length;i+=1)p[i](val)},encrypt:function(prf,plaintext,iv,adata,tlen){var L,out=plaintext.slice(0),tag,w=sjcl.bitArray,ivl=w.bitLength(iv)/8,ol=w.bitLength(out)/8;if(tlen=tlen||64,adata=adata||[],ivl<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(L=2;L<4&&ol>>>8*L;L++);if(L<15-ivl)L=15-ivl;return iv=w.clamp(iv,8*(15-L)),tag=sjcl.mode.ccm._computeTag(prf,plaintext,iv,adata,tlen,L),out=sjcl.mode.ccm._ctrMode(prf,out,iv,tag,tlen,L),w.concat(out.data,out.tag)},decrypt:function(prf,ciphertext,iv,adata,tlen){tlen=tlen||64,adata=adata||[];var L,w=sjcl.bitArray,ivl=w.bitLength(iv)/8,ol=w.bitLength(ciphertext),out=w.clamp(ciphertext,ol-tlen),tag=w.bitSlice(ciphertext,ol-tlen),tag2;if(ol=(ol-tlen)/8,ivl<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(L=2;L<4&&ol>>>8*L;L++);if(L<15-ivl)L=15-ivl;if(iv=w.clamp(iv,8*(15-L)),out=sjcl.mode.ccm._ctrMode(prf,out,iv,tag,tlen,L),tag2=sjcl.mode.ccm._computeTag(prf,out.data,iv,adata,tlen,L),!w.equal(out.tag,tag2))throw new sjcl.exception.corrupt("ccm: tag doesn't match");return out.data},_macAdditionalData:function(prf,adata,iv,tlen,ol,L){var mac,tmp,i,macData=[],w=sjcl.bitArray,xor=w._xor4;if(mac=[w.partial(8,(adata.length?64:0)|tlen-2<<2|L-1)],mac=w.concat(mac,iv),mac[3]|=ol,mac=prf.encrypt(mac),adata.length){if(tmp=w.bitLength(adata)/8,tmp<=65279)macData=[w.partial(16,tmp)];else if(tmp<=4294967295)macData=w.concat([w.partial(16,65534)],[tmp]);macData=w.concat(macData,adata);for(i=0;i<macData.length;i+=4)mac=prf.encrypt(xor(mac,macData.slice(i,i+4).concat([0,0,0])))}return mac},_computeTag:function(prf,plaintext,iv,adata,tlen,L){var mac,i,w=sjcl.bitArray,xor=w._xor4;if(tlen/=8,tlen%2||tlen<4||tlen>16)throw new sjcl.exception.invalid("ccm: invalid tag length");if(adata.length>4294967295||plaintext.length>4294967295)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");mac=sjcl.mode.ccm._macAdditionalData(prf,adata,iv,tlen,w.bitLength(plaintext)/8,L);for(i=0;i<plaintext.length;i+=4)mac=prf.encrypt(xor(mac,plaintext.slice(i,i+4).concat([0,0,0])));return w.clamp(mac,tlen*8)},_ctrMode:function(prf,data,iv,tag,tlen,L){var enc,i,w=sjcl.bitArray,xor=w._xor4,ctr,l=data.length,bl=w.bitLength(data),n=l/50,p=n;if(ctr=w.concat([w.partial(8,L-1)],iv).concat([0,0,0]).slice(0,4),tag=w.bitSlice(xor(tag,prf.encrypt(ctr)),0,tlen),!l)return{tag,data:[]};for(i=0;i<l;i+=4){if(i>n)sjcl.mode.ccm._callProgressListener(i/l),n+=p;ctr[3]++,enc=prf.encrypt(ctr),data[i]^=enc[0],data[i+1]^=enc[1],data[i+2]^=enc[2],data[i+3]^=enc[3]}return{tag,data:w.clamp(data,bl)}}};sjcl.misc.hmac=function(key,Hash){this._hash=Hash=Hash||sjcl.hash.sha256;var exKey=[[],[]],i,bs=Hash.prototype.blockSize/32;if(this._baseHash=[new Hash,new Hash],key.length>bs)key=Hash.hash(key);for(i=0;i<bs;i++)exKey[0][i]=key[i]^909522486,exKey[1][i]=key[i]^1549556828;this._baseHash[0].update(exKey[0]),this._baseHash[1].update(exKey[1]),this._resultHash=new Hash(this._baseHash[0])};sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(data){if(!this._updated)return this.update(data),this.digest(data);else throw new sjcl.exception.invalid("encrypt on already updated hmac called!")};sjcl.misc.hmac.prototype.reset=function(){this._resultHash=new this._hash(this._baseHash[0]),this._updated=!1};sjcl.misc.hmac.prototype.update=function(data){this._updated=!0,this._resultHash.update(data)};sjcl.misc.hmac.prototype.digest=function(){var w=this._resultHash.finalize(),result=new this._hash(this._baseHash[1]).update(w).finalize();return this.reset(),result};sjcl.misc.pbkdf2=function(password,salt,count,length,Prff){if(count=count||1e4,length<0||count<0)throw new sjcl.exception.invalid("invalid params to pbkdf2");if(typeof password==="string")password=sjcl.codec.utf8String.toBits(password);if(typeof salt==="string")salt=sjcl.codec.utf8String.toBits(salt);Prff=Prff||sjcl.misc.hmac;var prf=new Prff(password),u,ui,i,j,k,out=[],b=sjcl.bitArray;for(k=1;32*out.length<(length||1);k++){u=ui=prf.encrypt(b.concat(salt,[k]));for(i=1;i<count;i++){ui=prf.encrypt(ui);for(j=0;j<ui.length;j++)u[j]^=ui[j]}out=out.concat(u)}if(length)out=b.clamp(out,length);return out};sjcl.prng=function(defaultParanoia){this._pools=[new sjcl.hash.sha256],this._poolEntropy=[0],this._reseedCount=0,this._robins={},this._eventId=0,this._collectorIds={},this._collectorIdNext=0,this._strength=0,this._poolStrength=0,this._nextReseed=0,this._key=[0,0,0,0,0,0,0,0],this._counter=[0,0,0,0],this._cipher=void 0,this._defaultParanoia=defaultParanoia,this._collectorsStarted=!1,this._callbacks={progress:{},seeded:{}},this._callbackI=0,this._NOT_READY=0,this._READY=1,this._REQUIRES_RESEED=2,this._MAX_WORDS_PER_BURST=65536,this._PARANOIA_LEVELS=[0,48,64,96,128,192,256,384,512,768,1024],this._MILLISECONDS_PER_RESEED=30000,this._BITS_PER_RESEED=80};sjcl.prng.prototype={randomWords:function(nwords,paranoia){var out=[],i,readiness=this.isReady(paranoia),g;if(readiness===this._NOT_READY)throw new sjcl.exception.notReady("generator isn't seeded");else if(readiness&this._REQUIRES_RESEED)this._reseedFromPools(!(readiness&this._READY));for(i=0;i<nwords;i+=4){if((i+1)%this._MAX_WORDS_PER_BURST===0)this._gate();g=this._gen4words(),out.push(g[0],g[1],g[2],g[3])}return this._gate(),out.slice(0,nwords)},setDefaultParanoia:function(paranoia,allowZeroParanoia){if(paranoia===0&&allowZeroParanoia!=="Setting paranoia=0 will ruin your security; use it only for testing")throw new sjcl.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing");this._defaultParanoia=paranoia},addEntropy:function(data,estimatedEntropy,source){source=source||"user";var id,i,tmp,t=new Date().valueOf(),robin=this._robins[source],oldReady=this.isReady(),err=0,objName;if(id=this._collectorIds[source],id===void 0)id=this._collectorIds[source]=this._collectorIdNext++;if(robin===void 0)robin=this._robins[source]=0;switch(this._robins[source]=(this._robins[source]+1)%this._pools.length,typeof data){case"number":if(estimatedEntropy===void 0)estimatedEntropy=1;this._pools[robin].update([id,this._eventId++,1,estimatedEntropy,t,1,data|0]);break;case"object":if(objName=Object.prototype.toString.call(data),objName==="[object Uint32Array]"){tmp=[];for(i=0;i<data.length;i++)tmp.push(data[i]);data=tmp}else{if(objName!=="[object Array]")err=1;for(i=0;i<data.length&&!err;i++)if(typeof data[i]!=="number")err=1}if(!err){if(estimatedEntropy===void 0){estimatedEntropy=0;for(i=0;i<data.length;i++){tmp=data[i];while(tmp>0)estimatedEntropy++,tmp=tmp>>>1}}this._pools[robin].update([id,this._eventId++,2,estimatedEntropy,t,data.length].concat(data))}break;case"string":if(estimatedEntropy===void 0)estimatedEntropy=data.length;this._pools[robin].update([id,this._eventId++,3,estimatedEntropy,t,data.length]),this._pools[robin].update(data);break;default:err=1}if(err)throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string");if(this._poolEntropy[robin]+=estimatedEntropy,this._poolStrength+=estimatedEntropy,oldReady===this._NOT_READY){if(this.isReady()!==this._NOT_READY)this._fireEvent("seeded",Math.max(this._strength,this._poolStrength));this._fireEvent("progress",this.getProgress())}},isReady:function(paranoia){var entropyRequired=this._PARANOIA_LEVELS[paranoia!==void 0?paranoia:this._defaultParanoia];if(this._strength&&this._strength>=entropyRequired)return this._poolEntropy[0]>this._BITS_PER_RESEED&&new Date().valueOf()>this._nextReseed?this._REQUIRES_RESEED|this._READY:this._READY;else return this._poolStrength>=entropyRequired?this._REQUIRES_RESEED|this._NOT_READY:this._NOT_READY},getProgress:function(paranoia){var entropyRequired=this._PARANOIA_LEVELS[paranoia?paranoia:this._defaultParanoia];if(this._strength>=entropyRequired)return 1;else return this._poolStrength>entropyRequired?1:this._poolStrength/entropyRequired},startCollectors:function(){if(this._collectorsStarted)return;if(this._eventListener={loadTimeCollector:this._bind(this._loadTimeCollector),mouseCollector:this._bind(this._mouseCollector),keyboardCollector:this._bind(this._keyboardCollector),accelerometerCollector:this._bind(this._accelerometerCollector),touchCollector:this._bind(this._touchCollector)},window.addEventListener)window.addEventListener("load",this._eventListener.loadTimeCollector,!1),window.addEventListener("mousemove",this._eventListener.mouseCollector,!1),window.addEventListener("keypress",this._eventListener.keyboardCollector,!1),window.addEventListener("devicemotion",this._eventListener.accelerometerCollector,!1),window.addEventListener("touchmove",this._eventListener.touchCollector,!1);else if(document.attachEvent)document.attachEvent("onload",this._eventListener.loadTimeCollector),document.attachEvent("onmousemove",this._eventListener.mouseCollector),document.attachEvent("keypress",this._eventListener.keyboardCollector);else throw new sjcl.exception.bug("can't attach event");this._collectorsStarted=!0},stopCollectors:function(){if(!this._collectorsStarted)return;if(window.removeEventListener)window.removeEventListener("load",this._eventListener.loadTimeCollector,!1),window.removeEventListener("mousemove",this._eventListener.mouseCollector,!1),window.removeEventListener("keypress",this._eventListener.keyboardCollector,!1),window.removeEventListener("devicemotion",this._eventListener.accelerometerCollector,!1),window.removeEventListener("touchmove",this._eventListener.touchCollector,!1);else if(document.detachEvent)document.detachEvent("onload",this._eventListener.loadTimeCollector),document.detachEvent("onmousemove",this._eventListener.mouseCollector),document.detachEvent("keypress",this._eventListener.keyboardCollector);this._collectorsStarted=!1},addEventListener:function(name,callback){this._callbacks[name][this._callbackI++]=callback},removeEventListener:function(name,cb){var i,j,cbs=this._callbacks[name],jsTemp=[];for(j in cbs)if(cbs.hasOwnProperty(j)&&cbs[j]===cb)jsTemp.push(j);for(i=0;i<jsTemp.length;i++)j=jsTemp[i],delete cbs[j]},_bind:function(func){var that=this;return function(){func.apply(that,arguments)}},_gen4words:function(){for(var i=0;i<4;i++)if(this._counter[i]=this._counter[i]+1|0,this._counter[i])break;return this._cipher.encrypt(this._counter)},_gate:function(){this._key=this._gen4words().concat(this._gen4words()),this._cipher=new sjcl.cipher.aes(this._key)},_reseed:function(seedWords){this._key=sjcl.hash.sha256.hash(this._key.concat(seedWords)),this._cipher=new sjcl.cipher.aes(this._key);for(var i=0;i<4;i++)if(this._counter[i]=this._counter[i]+1|0,this._counter[i])break},_reseedFromPools:function(full){var reseedData=[],strength=0,i;this._nextReseed=reseedData[0]=new Date().valueOf()+this._MILLISECONDS_PER_RESEED;for(i=0;i<16;i++)reseedData.push(Math.random()*4294967296|0);for(i=0;i<this._pools.length;i++)if(reseedData=reseedData.concat(this._pools[i].finalize()),strength+=this._poolEntropy[i],this._poolEntropy[i]=0,!full&&this._reseedCount&1<<i)break;if(this._reseedCount>=1<<this._pools.length)this._pools.push(new sjcl.hash.sha256),this._poolEntropy.push(0);if(this._poolStrength-=strength,strength>this._strength)this._strength=strength;this._reseedCount++,this._reseed(reseedData)},_keyboardCollector:function(){this._addCurrentTimeToEntropy(1)},_mouseCollector:function(ev){var x,y;try{x=ev.x||ev.clientX||ev.offsetX||0,y=ev.y||ev.clientY||ev.offsetY||0}catch(err){x=0,y=0}if(x!=0&&y!=0)this.addEntropy([x,y],2,"mouse");this._addCurrentTimeToEntropy(0)},_touchCollector:function(ev){var touch=ev.touches[0]||ev.changedTouches[0],x=touch.pageX||touch.clientX,y=touch.pageY||touch.clientY;this.addEntropy([x,y],1,"touch"),this._addCurrentTimeToEntropy(0)},_loadTimeCollector:function(){this._addCurrentTimeToEntropy(2)},_addCurrentTimeToEntropy:function(estimatedEntropy){if(typeof window<"u"&&window.performance&&typeof window.performance.now==="function")this.addEntropy(window.performance.now(),estimatedEntropy,"loadtime");else this.addEntropy(new Date().valueOf(),estimatedEntropy,"loadtime")},_accelerometerCollector:function(ev){var ac=ev.accelerationIncludingGravity.x||ev.accelerationIncludingGravity.y||ev.accelerationIncludingGravity.z;if(window.orientation){var or=window.orientation;if(typeof or==="number")this.addEntropy(or,1,"accelerometer")}if(ac)this.addEntropy(ac,2,"accelerometer");this._addCurrentTimeToEntropy(0)},_fireEvent:function(name,arg){var j,cbs=sjcl.random._callbacks[name],cbsTemp=[];for(j in cbs)if(cbs.hasOwnProperty(j))cbsTemp.push(cbs[j]);for(j=0;j<cbsTemp.length;j++)cbsTemp[j](arg)}};sjcl.random=new sjcl.prng(6);(function(){function getCryptoModule(){try{return __require("crypto")}catch(e){return null}}try{var buf,crypt,ab;if(typeof module_sjcl<"u"&&exports_sjcl&&(crypt=getCryptoModule())&&crypt.randomBytes)buf=crypt.randomBytes(128),buf=new Uint32Array(new Uint8Array(buf).buffer),sjcl.random.addEntropy(buf,1024,"crypto.randomBytes");else if(typeof window<"u"&&typeof Uint32Array<"u"){if(ab=new Uint32Array(32),window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(ab);else if(window.msCrypto&&window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(ab);else return;sjcl.random.addEntropy(ab,1024,"crypto.getRandomValues")}}catch(e){if(typeof window<"u"&&window.console)console.log("There was an error collecting entropy from the browser:"),console.log(e)}})();sjcl.json={defaults:{v:1,iter:1e4,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},_encrypt:function(password,plaintext,params,rp){params=params||{},rp=rp||{};var j=sjcl.json,p=j._add({iv:sjcl.random.randomWords(4,0)},j.defaults),tmp,prp,adata;if(j._add(p,params),adata=p.adata,typeof p.salt==="string")p.salt=sjcl.codec.base64.toBits(p.salt);if(typeof p.iv==="string")p.iv=sjcl.codec.base64.toBits(p.iv);if(!sjcl.mode[p.mode]||!sjcl.cipher[p.cipher]||typeof password==="string"&&p.iter<=100||p.ts!==64&&p.ts!==96&&p.ts!==128||p.ks!==128&&p.ks!==192&&p.ks!==256||(p.iv.length<2||p.iv.length>4))throw new sjcl.exception.invalid("json encrypt: invalid parameters");if(typeof password==="string")tmp=sjcl.misc.cachedPbkdf2(password,p),password=tmp.key.slice(0,p.ks/32),p.salt=tmp.salt;else if(sjcl.ecc&&password instanceof sjcl.ecc.elGamal.publicKey)tmp=password.kem(),p.kemtag=tmp.tag,password=tmp.key.slice(0,p.ks/32);if(typeof plaintext==="string")plaintext=sjcl.codec.utf8String.toBits(plaintext);if(typeof adata==="string")p.adata=adata=sjcl.codec.utf8String.toBits(adata);if(prp=new sjcl.cipher[p.cipher](password),j._add(rp,p),rp.key=password,p.mode==="ccm"&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&plaintext instanceof ArrayBuffer)p.ct=sjcl.arrayBuffer.ccm.encrypt(prp,plaintext,p.iv,adata,p.ts);else p.ct=sjcl.mode[p.mode].encrypt(prp,plaintext,p.iv,adata,p.ts);return p},encrypt:function(password,plaintext,params,rp){var j=sjcl.json,p=j._encrypt.apply(j,arguments);return j.encode(p)},_decrypt:function(password,ciphertext,params,rp){params=params||{},rp=rp||{};var j=sjcl.json,p=j._add(j._add(j._add({},j.defaults),ciphertext),params,!0),ct,tmp,prp,adata=p.adata;if(typeof p.salt==="string")p.salt=sjcl.codec.base64.toBits(p.salt);if(typeof p.iv==="string")p.iv=sjcl.codec.base64.toBits(p.iv);if(!sjcl.mode[p.mode]||!sjcl.cipher[p.cipher]||typeof password==="string"&&p.iter<=100||p.ts!==64&&p.ts!==96&&p.ts!==128||p.ks!==128&&p.ks!==192&&p.ks!==256||!p.iv||(p.iv.length<2||p.iv.length>4))throw new sjcl.exception.invalid("json decrypt: invalid parameters");if(typeof password==="string")tmp=sjcl.misc.cachedPbkdf2(password,p),password=tmp.key.slice(0,p.ks/32),p.salt=tmp.salt;else if(sjcl.ecc&&password instanceof sjcl.ecc.elGamal.secretKey)password=password.unkem(sjcl.codec.base64.toBits(p.kemtag)).slice(0,p.ks/32);if(typeof adata==="string")adata=sjcl.codec.utf8String.toBits(adata);if(prp=new sjcl.cipher[p.cipher](password),p.mode==="ccm"&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&p.ct instanceof ArrayBuffer)ct=sjcl.arrayBuffer.ccm.decrypt(prp,p.ct,p.iv,p.tag,adata,p.ts);else ct=sjcl.mode[p.mode].decrypt(prp,p.ct,p.iv,adata,p.ts);if(j._add(rp,p),rp.key=password,params.raw===1)return ct;else return sjcl.codec.utf8String.fromBits(ct)},decrypt:function(password,ciphertext,params,rp){var j=sjcl.json;return j._decrypt(password,j.decode(ciphertext),params,rp)},encode:function(obj){var i,out="{",comma="";for(i in obj)if(obj.hasOwnProperty(i)){if(!i.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");switch(out+=comma+'"'+i+'":',comma=",",typeof obj[i]){case"number":case"boolean":out+=obj[i];break;case"string":out+='"'+escape(obj[i])+'"';break;case"object":out+='"'+sjcl.codec.base64.fromBits(obj[i],0)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type")}}return out+"}"},decode:function(str){if(str=str.replace(/\s/g,""),!str.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");var a=str.replace(/^\{|\}$/g,"").split(/,/),out={},i,m;for(i=0;i<a.length;i++){if(!(m=a[i].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");if(m[3]!=null)out[m[2]]=parseInt(m[3],10);else if(m[4]!=null)out[m[2]]=m[2].match(/^(ct|adata|salt|iv)$/)?sjcl.codec.base64.toBits(m[4]):unescape(m[4]);else if(m[5]!=null)out[m[2]]=m[5]==="true"}return out},_add:function(target,src,requireSame){if(target===void 0)target={};if(src===void 0)return target;var i;for(i in src)if(src.hasOwnProperty(i)){if(requireSame&&target[i]!==void 0&&target[i]!==src[i])throw new sjcl.exception.invalid("required parameter overridden");target[i]=src[i]}return target},_subtract:function(plus,minus){var out={},i;for(i in plus)if(plus.hasOwnProperty(i)&&plus[i]!==minus[i])out[i]=plus[i];return out},_filter:function(src,filter){var out={},i;for(i=0;i<filter.length;i++)if(src[filter[i]]!==void 0)out[filter[i]]=src[filter[i]];return out}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc._pbkdf2Cache={};sjcl.misc.cachedPbkdf2=function(password,obj){var cache=sjcl.misc._pbkdf2Cache,c,cp,str,salt,iter;return obj=obj||{},iter=obj.iter||1000,cp=cache[password]=cache[password]||{},c=cp[iter]=cp[iter]||{firstSalt:obj.salt&&obj.salt.length?obj.salt.slice(0):sjcl.random.randomWords(2,0)},salt=obj.salt===void 0?c.firstSalt:obj.salt,c[salt]=c[salt]||sjcl.misc.pbkdf2(password,salt,obj.iter),{key:c[salt].slice(0),salt:salt.slice(0)}};sjcl.bn=function(it){this.initWith(it)};sjcl.bn.prototype={radix:24,maxMul:8,_class:sjcl.bn,copy:function(){return new this._class(this)},initWith:function(it){var i=0,k;switch(typeof it){case"object":this.limbs=it.limbs.slice(0);break;case"number":this.limbs=[it],this.normalize();break;case"string":it=it.replace(/^0x/,""),this.limbs=[],k=this.radix/4;for(i=0;i<it.length;i+=k)this.limbs.push(parseInt(it.substring(Math.max(it.length-i-k,0),it.length-i),16));break;default:this.limbs=[0]}return this},equals:function(that){if(typeof that==="number")that=new this._class(that);var difference=0,i;this.fullReduce(),that.fullReduce();for(i=0;i<this.limbs.length||i<that.limbs.length;i++)difference|=this.getLimb(i)^that.getLimb(i);return difference===0},getLimb:function(i){return i>=this.limbs.length?0:this.limbs[i]},greaterEquals:function(that){if(typeof that==="number")that=new this._class(that);var less=0,greater=0,i,a,b;i=Math.max(this.limbs.length,that.limbs.length)-1;for(;i>=0;i--)a=this.getLimb(i),b=that.getLimb(i),greater|=b-a&~less,less|=a-b&~greater;return(greater|~less)>>>31},toString:function(){this.fullReduce();var out="",i,s,l=this.limbs;for(i=0;i<this.limbs.length;i++){s=l[i].toString(16);while(i<this.limbs.length-1&&s.length<6)s="0"+s;out=s+out}return"0x"+out},addM:function(that){if(typeof that!=="object")that=new this._class(that);var i,l=this.limbs,ll=that.limbs;for(i=l.length;i<ll.length;i++)l[i]=0;for(i=0;i<ll.length;i++)l[i]+=ll[i];return this},doubleM:function(){var i,carry=0,tmp,r=this.radix,m=this.radixMask,l=this.limbs;for(i=0;i<l.length;i++)tmp=l[i],tmp=tmp+tmp+carry,l[i]=tmp&m,carry=tmp>>r;if(carry)l.push(carry);return this},halveM:function(){var i,carry=0,tmp,r=this.radix,l=this.limbs;for(i=l.length-1;i>=0;i--)tmp=l[i],l[i]=tmp+carry>>1,carry=(tmp&1)<<r;if(!l[l.length-1])l.pop();return this},subM:function(that){if(typeof that!=="object")that=new this._class(that);var i,l=this.limbs,ll=that.limbs;for(i=l.length;i<ll.length;i++)l[i]=0;for(i=0;i<ll.length;i++)l[i]-=ll[i];return this},mod:function(that){var neg=!this.greaterEquals(new sjcl.bn(0));that=new sjcl.bn(that).normalize();var out=new sjcl.bn(this).normalize(),ci=0;if(neg)out=new sjcl.bn(0).subM(out).normalize();for(;out.greaterEquals(that);ci++)that.doubleM();if(neg)out=that.sub(out).normalize();for(;ci>0;ci--)if(that.halveM(),out.greaterEquals(that))out.subM(that).normalize();return out.trim()},inverseMod:function(p){var a=new sjcl.bn(1),b=new sjcl.bn(0),x=new sjcl.bn(this),y=new sjcl.bn(p),tmp,i,nz=1;if(!(p.limbs[0]&1))throw new sjcl.exception.invalid("inverseMod: p must be odd");do{if(x.limbs[0]&1){if(!x.greaterEquals(y))tmp=x,x=y,y=tmp,tmp=a,a=b,b=tmp;if(x.subM(y),x.normalize(),!a.greaterEquals(b))a.addM(p);a.subM(b)}if(x.halveM(),a.limbs[0]&1)a.addM(p);a.normalize(),a.halveM();for(i=nz=0;i<x.limbs.length;i++)nz|=x.limbs[i]}while(nz);if(!y.equals(1))throw new sjcl.exception.invalid("inverseMod: p and x must be relatively prime");return b},add:function(that){return this.copy().addM(that)},sub:function(that){return this.copy().subM(that)},mul:function(that){if(typeof that==="number")that=new this._class(that);else that.normalize();this.normalize();var i,j,a=this.limbs,b=that.limbs,al=a.length,bl=b.length,out=new this._class,c=out.limbs,ai,ii=this.maxMul;for(i=0;i<this.limbs.length+that.limbs.length+1;i++)c[i]=0;for(i=0;i<al;i++){ai=a[i];for(j=0;j<bl;j++)c[i+j]+=ai*b[j];if(!--ii)ii=this.maxMul,out.cnormalize()}return out.cnormalize().reduce()},square:function(){return this.mul(this)},power:function(l){l=new sjcl.bn(l).normalize().trim().limbs;var i,j,out=new this._class(1),pow=this;for(i=0;i<l.length;i++)for(j=0;j<this.radix;j++){if(l[i]&1<<j)out=out.mul(pow);if(i==l.length-1&&l[i]>>j+1==0)break;pow=pow.square()}return out},mulmod:function(that,N){return this.mod(N).mul(that.mod(N)).mod(N)},powermod:function(x,N){if(x=new sjcl.bn(x),N=new sjcl.bn(N),(N.limbs[0]&1)==1){var montOut=this.montpowermod(x,N);if(montOut!=!1)return montOut}var i,j,l=x.normalize().trim().limbs,out=new this._class(1),pow=this;for(i=0;i<l.length;i++)for(j=0;j<this.radix;j++){if(l[i]&1<<j)out=out.mulmod(pow,N);if(i==l.length-1&&l[i]>>j+1==0)break;pow=pow.mulmod(pow,N)}return out},montpowermod:function(x,N){x=new sjcl.bn(x).normalize().trim(),N=new sjcl.bn(N);var i,j,radix=this.radix,out=new this._class(1),pow=this.copy(),R,s,wind,bitsize=x.bitLength();R=new sjcl.bn({limbs:N.copy().normalize().trim().limbs.map(function(){return 0})});for(s=this.radix;s>0;s--)if((N.limbs[N.limbs.length-1]>>s&1)==1){R.limbs[R.limbs.length-1]=1<<s;break}if(bitsize==0)return this;else if(bitsize<18)wind=1;else if(bitsize<48)wind=3;else if(bitsize<144)wind=4;else if(bitsize<768)wind=5;else wind=6;var RR=R.copy(),NN=N.copy(),RP=new sjcl.bn(1),NP=new sjcl.bn(0),RT=R.copy();while(RT.greaterEquals(1))if(RT.halveM(),(RP.limbs[0]&1)==0)RP.halveM(),NP.halveM();else RP.addM(NN),RP.halveM(),NP.halveM(),NP.addM(RR);RP=RP.normalize(),NP=NP.normalize(),RR.doubleM();var R2=RR.mulmod(RR,N);if(!RR.mul(RP).sub(N.mul(NP)).equals(1))return!1;var montIn=function(c){return montMul(c,R2)},montMul=function(a,b){var k,ab,right,abBar,mask=(1<<s+1)-1;if(ab=a.mul(b),right=ab.mul(NP),right.limbs=right.limbs.slice(0,R.limbs.length),right.limbs.length==R.limbs.length)right.limbs[R.limbs.length-1]&=mask;right=right.mul(N),abBar=ab.add(right).normalize().trim(),abBar.limbs=abBar.limbs.slice(R.limbs.length-1);for(k=0;k<abBar.limbs.length;k++){if(k>0)abBar.limbs[k-1]|=(abBar.limbs[k]&mask)<<radix-s-1;abBar.limbs[k]=abBar.limbs[k]>>s+1}if(abBar.greaterEquals(N))abBar.subM(N);return abBar},montOut=function(c){return montMul(c,1)};pow=montIn(pow),out=montIn(out);var h,precomp={},cap=(1<<wind-1)-1;precomp[1]=pow.copy(),precomp[2]=montMul(pow,pow);for(h=1;h<=cap;h++)precomp[2*h+1]=montMul(precomp[2*h-1],precomp[2]);var getBit=function(exp,i){var off=i%exp.radix;return(exp.limbs[Math.floor(i/exp.radix)]&1<<off)>>off};for(i=x.bitLength()-1;i>=0;)if(getBit(x,i)==0)out=montMul(out,out),i=i-1;else{var l=i-wind+1;while(getBit(x,l)==0)l++;var indx=0;for(j=l;j<=i;j++)indx+=getBit(x,j)<<j-l,out=montMul(out,out);out=montMul(out,precomp[indx]),i=l-1}return montOut(out)},trim:function(){var l=this.limbs,p;do p=l.pop();while(l.length&&p===0);return l.push(p),this},reduce:function(){return this},fullReduce:function(){return this.normalize()},normalize:function(){var carry=0,i,pv=this.placeVal,ipv=this.ipv,l,m,limbs=this.limbs,ll=limbs.length,mask=this.radixMask;for(i=0;i<ll||carry!==0&&carry!==-1;i++)l=(limbs[i]||0)+carry,m=limbs[i]=l&mask,carry=(l-m)*ipv;if(carry===-1)limbs[i-1]-=pv;return this.trim(),this},cnormalize:function(){var carry=0,i,ipv=this.ipv,l,m,limbs=this.limbs,ll=limbs.length,mask=this.radixMask;for(i=0;i<ll-1;i++)l=limbs[i]+carry,m=limbs[i]=l&mask,carry=(l-m)*ipv;return limbs[i]+=carry,this},toBits:function(len){this.fullReduce(),len=len||this.exponent||this.bitLength();var i=Math.floor((len-1)/24),w=sjcl.bitArray,e=(len+7&-8)%this.radix||this.radix,out=[w.partial(e,this.getLimb(i))];for(i--;i>=0;i--)out=w.concat(out,[w.partial(Math.min(this.radix,len),this.getLimb(i))]),len-=this.radix;return out},bitLength:function(){this.fullReduce();var out=this.radix*(this.limbs.length-1),b=this.limbs[this.limbs.length-1];for(;b;b>>>=1)out++;return out+7&-8}};sjcl.bn.fromBits=function(bits){var Class=this,out=new Class,words=[],w=sjcl.bitArray,t=this.prototype,l=Math.min(this.bitLength||4294967296,w.bitLength(bits)),e=l%t.radix||t.radix;words[0]=w.extract(bits,0,e);for(;e<l;e+=t.radix)words.unshift(w.extract(bits,e,t.radix));return out.limbs=words,out};sjcl.bn.prototype.ipv=1/(sjcl.bn.prototype.placeVal=Math.pow(2,sjcl.bn.prototype.radix));sjcl.bn.prototype.radixMask=(1<<sjcl.bn.prototype.radix)-1;sjcl.bn.pseudoMersennePrime=function(exponent,coeff){function p(it){this.initWith(it)}var ppr=p.prototype=new sjcl.bn,i,tmp,mo;mo=ppr.modOffset=Math.ceil(tmp=exponent/ppr.radix),ppr.exponent=exponent,ppr.offset=[],ppr.factor=[],ppr.minOffset=mo,ppr.fullMask=0,ppr.fullOffset=[],ppr.fullFactor=[],ppr.modulus=p.modulus=new sjcl.bn(Math.pow(2,exponent)),ppr.fullMask=0|-Math.pow(2,exponent%ppr.radix);for(i=0;i<coeff.length;i++)ppr.offset[i]=Math.floor(coeff[i][0]/ppr.radix-tmp),ppr.fullOffset[i]=Math.floor(coeff[i][0]/ppr.radix)-mo+1,ppr.factor[i]=coeff[i][1]*Math.pow(0.5,exponent-coeff[i][0]+ppr.offset[i]*ppr.radix),ppr.fullFactor[i]=coeff[i][1]*Math.pow(0.5,exponent-coeff[i][0]+ppr.fullOffset[i]*ppr.radix),ppr.modulus.addM(new sjcl.bn(Math.pow(2,coeff[i][0])*coeff[i][1])),ppr.minOffset=Math.min(ppr.minOffset,-ppr.offset[i]);return ppr._class=p,ppr.modulus.cnormalize(),ppr.reduce=function(){var i,k,l,mo=this.modOffset,limbs=this.limbs,off=this.offset,ol=this.offset.length,fac=this.factor,ll;i=this.minOffset;while(limbs.length>mo){l=limbs.pop(),ll=limbs.length;for(k=0;k<ol;k++)limbs[ll+off[k]]-=fac[k]*l;if(i--,!i)limbs.push(0),this.cnormalize(),i=this.minOffset}return this.cnormalize(),this},ppr._strongReduce=ppr.fullMask===-1?ppr.reduce:function(){var limbs=this.limbs,i=limbs.length-1,k,l;if(this.reduce(),i===this.modOffset-1){l=limbs[i]&this.fullMask,limbs[i]-=l;for(k=0;k<this.fullOffset.length;k++)limbs[i+this.fullOffset[k]]-=this.fullFactor[k]*l;this.normalize()}},ppr.fullReduce=function(){var greater,i;this._strongReduce(),this.addM(this.modulus),this.addM(this.modulus),this.normalize(),this._strongReduce();for(i=this.limbs.length;i<this.modOffset;i++)this.limbs[i]=0;greater=this.greaterEquals(this.modulus);for(i=0;i<this.limbs.length;i++)this.limbs[i]-=this.modulus.limbs[i]*greater;return this.cnormalize(),this},ppr.inverse=function(){return this.power(this.modulus.sub(2))},p.fromBits=sjcl.bn.fromBits,p};var sbp=sjcl.bn.pseudoMersennePrime;sjcl.bn.prime={p127:sbp(127,[[0,-1]]),p25519:sbp(255,[[0,-19]]),p192k:sbp(192,[[32,-1],[12,-1],[8,-1],[7,-1],[6,-1],[3,-1],[0,-1]]),p224k:sbp(224,[[32,-1],[12,-1],[11,-1],[9,-1],[7,-1],[4,-1],[1,-1],[0,-1]]),p256k:sbp(256,[[32,-1],[9,-1],[8,-1],[7,-1],[6,-1],[4,-1],[0,-1]]),p192:sbp(192,[[0,-1],[64,-1]]),p224:sbp(224,[[0,1],[96,-1]]),p256:sbp(256,[[0,-1],[96,1],[192,1],[224,-1]]),p384:sbp(384,[[0,-1],[32,1],[96,-1],[128,-1]]),p521:sbp(521,[[0,-1]])};sjcl.bn.random=function(modulus,paranoia){if(typeof modulus!=="object")modulus=new sjcl.bn(modulus);var words,i,l=modulus.limbs.length,m=modulus.limbs[l-1]+1,out=new sjcl.bn;while(!0){do if(words=sjcl.random.randomWords(l,paranoia),words[l-1]<0)words[l-1]+=4294967296;while(Math.floor(words[l-1]/m)===Math.floor(4294967296/m));words[l-1]%=m;for(i=0;i<l-1;i++)words[i]&=modulus.radixMask;if(out.limbs=words,!out.greaterEquals(modulus))return out}};if(typeof ArrayBuffer>"u")(function(globals){globals.ArrayBuffer=function(){},globals.DataView=function(){}})(null);sjcl.codec.arrayBuffer={fromBits:function(arr,padding,padding_count){var out,i,ol,tmp,smallest;if(padding=padding==null?!0:padding,padding_count=padding_count||8,arr.length===0)return new ArrayBuffer(0);if(ol=sjcl.bitArray.bitLength(arr)/8,sjcl.bitArray.bitLength(arr)%8!==0)throw new sjcl.exception.invalid("Invalid bit size, must be divisble by 8 to fit in an arraybuffer correctly");if(padding&&ol%padding_count!==0)ol+=padding_count-ol%padding_count;tmp=new DataView(new ArrayBuffer(arr.length*4));for(i=0;i<arr.length;i++)tmp.setUint32(i*4,arr[i]<<32);if(out=new DataView(new ArrayBuffer(ol)),out.byteLength===tmp.byteLength)return tmp.buffer;smallest=tmp.byteLength<out.byteLength?tmp.byteLength:out.byteLength;for(i=0;i<smallest;i++)out.setUint8(i,tmp.getUint8(i));return out.buffer},toBits:function(buffer){var i,out=[],len,inView,tmp;if(buffer.byteLength===0)return[];inView=new DataView(buffer),len=inView.byteLength-inView.byteLength%4;for(var i=0;i<len;i+=4)out.push(inView.getUint32(i));if(inView.byteLength%4!=0){tmp=new DataView(new ArrayBuffer(4));for(var i=0,l=inView.byteLength%4;i<l;i++)tmp.setUint8(i+4-l,inView.getUint8(len+i));out.push(sjcl.bitArray.partial(inView.byteLength%4*8,tmp.getUint32(0)))}return out},hexDumpBuffer:function(buffer){var stringBufferView=new DataView(buffer),string="",pad=function(n,width){return n=n+"",n.length>=width?n:Array(width-n.length+1).join("0")+n};for(var i=0;i<stringBufferView.byteLength;i+=2){if(i%16==0)string+=`
|
|
128
|
-
`+i.toString(16)+"\t";string+=pad(stringBufferView.getUint16(i).toString(16),4)+" "}if(typeof console===void 0)console=console||{log:function(){}};console.log(string.toUpperCase())}};var sjcl_default=sjcl;function assertNever(name,x){throw Error(`unexpected ${name} identifier: ${x}`)}function getHashParams(hash){switch(hash){case"SHA-1":return{name:hash,hLen:20};case"SHA-256":return{name:hash,hLen:32};case"SHA-384":return{name:hash,hLen:48};case"SHA-512":return{name:hash,hLen:64};default:assertNever("Hash",hash)}}function os2ip(bytes){return sjcl_default.bn.fromBits(sjcl_default.codec.bytes.toBits(Array.from(bytes)))}function i2osp(num,byteLength){if(Math.ceil(num.bitLength()/8)>byteLength)throw Error(`number does not fit in ${byteLength} bytes`);let bytes=new Uint8Array(byteLength),unpadded=new Uint8Array(sjcl_default.codec.bytes.fromBits(num.toBits(void 0)));return bytes.set(unpadded,byteLength-unpadded.length),bytes}function joinAll(a){let size=0;for(let ai of a)size+=ai.length;let ret=new Uint8Array(new ArrayBuffer(size)),offset=0;for(let ai of a)ret.set(ai,offset),offset+=ai.length;return ret}function xor(a,b){if(a.length!==b.length||a.length===0)throw Error(`arrays of different length: ${a.length} - ${b.length}`);let ai=a[Symbol.iterator](),bi=b[Symbol.iterator]();return new Uint8Array(a.length).map(()=>ai.next().value^bi.next().value)}function incCounter(c){if(c[3]++,c[3]!=0)return;if(c[2]++,c[2]!=0)return;if(c[1]++,c[1]!=0)return;c[0]++;return}async function mgf1(h,seed,mLen){let n=Math.ceil(mLen/h.hLen);if(n>Math.pow(2,32))throw Error("mask too long");let T=new Uint8Array,counter=new Uint8Array(4);for(let i=0;i<n;i++){let hash=new Uint8Array(await crypto.subtle.digest(h.name,joinAll([seed,counter]).slice().buffer));T=joinAll([T,hash]),incCounter(counter)}return T.subarray(0,mLen)}async function emsa_pss_encode(msg,emBits,opts,mgf=mgf1){let{hash,sLen}=opts,hashParams=getHashParams(hash),{hLen}=hashParams,emLen=Math.ceil(emBits/8),mHash=new Uint8Array(await crypto.subtle.digest(hash,msg.slice().buffer));if(emLen<hLen+sLen+2)throw Error("encoding error");let salt=crypto.getRandomValues(new Uint8Array(sLen)),mPrime=joinAll([new Uint8Array(8),mHash,salt]),h=new Uint8Array(await crypto.subtle.digest(hash,mPrime.slice().buffer)),ps=new Uint8Array(emLen-sLen-hLen-2),db=joinAll([ps,Uint8Array.of(1),salt]),dbMask=await mgf(hashParams,h,emLen-hLen-1),maskedDB=xor(db,dbMask);return maskedDB[0]&=255>>8*emLen-emBits,joinAll([maskedDB,h,Uint8Array.of(188)])}function rsavp1(pkS,s){if(!s.greaterEquals(new sjcl_default.bn(0))||s.greaterEquals(pkS.n))throw Error("signature representative out of range");return s.powermod(pkS.e,pkS.n)}function rsasp1(skS,m){if(!m.greaterEquals(new sjcl_default.bn(0))||m.greaterEquals(skS.n))throw Error("signature representative out of range");return m.powermod(skS.d,skS.n)}function is_coprime(x,n){try{x.inverseMod(n)}catch{return!1}return!0}function random_integer_uniform(n,kLen){for(let i=0;i<128;i++){let r=os2ip(crypto.getRandomValues(new Uint8Array(kLen)));if(!(r.greaterEquals(n)||r.equals(0)))return r}throw Error("reached maximum tries for random integer generation")}var NATIVE_SUPPORT_NAME="RSA-RAW";async function rsaRawBlingSign(privateKey,blindMsg){if(privateKey.algorithm.name!==NATIVE_SUPPORT_NAME)privateKey=await crypto.subtle.importKey("pkcs8",await crypto.subtle.exportKey("pkcs8",privateKey),{...privateKey.algorithm,name:NATIVE_SUPPORT_NAME},privateKey.extractable,privateKey.usages);let signature=await crypto.subtle.sign({name:privateKey.algorithm.name},privateKey,blindMsg.slice().buffer);return new Uint8Array(signature)}var PrepareType;(function(PrepareType){PrepareType[PrepareType.Deterministic=0]="Deterministic",PrepareType[PrepareType.Randomized=32]="Randomized"})(PrepareType||(PrepareType={}));class BlindRSA{params;static NAME="RSA-PSS";constructor(params){switch(this.params=params,params.prepareType){case PrepareType.Deterministic:case PrepareType.Randomized:return;default:assertNever("PrepareType",params.prepareType)}}toString(){let hash=this.params.hash.replace("-",""),pssType="PSS"+(this.params.saltLength===0?"ZERO":""),prepare=PrepareType[this.params.prepareType];return`RSABSSA-${hash}-${pssType}-${prepare}`}prepare(msg){let msg_prefix_len=this.params.prepareType,msg_prefix=crypto.getRandomValues(new Uint8Array(msg_prefix_len));return joinAll([msg_prefix,msg])}async extractKeyParams(key,type){if(key.type!==type||key.algorithm.name!==BlindRSA.NAME)throw Error(`key is not ${BlindRSA.NAME}`);if(!key.extractable)throw Error("key is not extractable");let{modulusLength:modulusLengthBits,hash:hashFn}=key.algorithm,modulusLengthBytes=Math.ceil(modulusLengthBits/8),hash=hashFn.name;if(hash.toLowerCase()!==this.params.hash.toLowerCase())throw Error(`hash is not ${this.params.hash}`);return{jwkKey:await crypto.subtle.exportKey("jwk",key),modulusLengthBits,modulusLengthBytes,hash}}async blind(publicKey,msg){let{jwkKey,modulusLengthBits:modulusLength,modulusLengthBytes:kLen,hash}=await this.extractKeyParams(publicKey,"public");if(!jwkKey.n||!jwkKey.e)throw Error("key has invalid parameters");let n=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.n)),pk={e:sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.e)),n},opts={sLen:this.params.saltLength,hash},encoded_msg=await emsa_pss_encode(msg,modulusLength-1,opts),m=os2ip(encoded_msg);if(!is_coprime(m,n))throw Error("invalid input");let r=random_integer_uniform(n,kLen),inv;try{inv=i2osp(r.inverseMod(n),kLen)}catch(e){throw Error(`blinding error: ${e.toString()}`)}let x=rsavp1(pk,r),z=m.mulmod(x,n);return{blindedMsg:i2osp(z,kLen),inv}}async blindSign(privateKey,blindMsg){if(this.params.supportsRSARAW)return rsaRawBlingSign(privateKey,blindMsg);let{jwkKey,modulusLengthBytes:kLen}=await this.extractKeyParams(privateKey,"private");if(!jwkKey.n||!jwkKey.d||!jwkKey.e)throw Error("key has invalid parameters");let n=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.n)),d=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.d)),e=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.e)),sk={n,d},pk={n,e},m=os2ip(blindMsg),s=rsasp1(sk,m),mp=rsavp1(pk,s);if(!m.equals(mp))throw Error("signing failure");return i2osp(s,kLen)}async finalize(publicKey,msg,blindSig,inv){let{jwkKey,modulusLengthBytes:kLen}=await this.extractKeyParams(publicKey,"public");if(!jwkKey.n)throw Error("key has invalid parameters");let n=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.n));if(inv.length!=kLen)throw Error("unexpected input size");let rInv=os2ip(inv);if(blindSig.length!=kLen)throw Error("unexpected input size");let s=os2ip(blindSig).mulmod(rInv,n),sig=i2osp(s,kLen),algorithm={name:BlindRSA.NAME,saltLength:this.params.saltLength};if(!await crypto.subtle.verify(algorithm,publicKey,sig.slice().buffer,msg.slice().buffer))throw Error("invalid signature");return sig}static generateKey(algorithm){return crypto.subtle.generateKey({...algorithm,name:BlindRSA.NAME},!0,["sign","verify"])}generateKey(algorithm){return BlindRSA.generateKey({...algorithm,hash:this.params.hash})}verify(publicKey,signature,message){return crypto.subtle.verify({name:BlindRSA.NAME,saltLength:this.params.saltLength},publicKey,signature.slice().buffer,message.slice().buffer)}}var Params={RSABSSA_SHA384_PSS_Randomized:{name:"RSABSSA-SHA384-PSS-Randomized",hash:"SHA-384",saltLength:48,prepareType:PrepareType.Randomized},RSABSSA_SHA384_PSS_Deterministic:{name:"RSABSSA-SHA384-PSS-Deterministic",hash:"SHA-384",saltLength:48,prepareType:PrepareType.Deterministic},RSABSSA_SHA384_PSSZERO_Randomized:{name:"RSABSSA-SHA384-PSSZERO-Randomized",hash:"SHA-384",saltLength:0,prepareType:PrepareType.Randomized},RSABSSA_SHA384_PSSZERO_Deterministic:{name:"RSABSSA-SHA384-PSSZERO-Deterministic",hash:"SHA-384",saltLength:0,prepareType:PrepareType.Deterministic},RSAPBSSA_SHA384_PSS_Randomized:{name:"RSAPBSSA-SHA384-PSS-Randomized",hash:"SHA-384",saltLength:48,prepareType:PrepareType.Randomized},RSAPBSSA_SHA384_PSS_Deterministic:{name:"RSAPBSSA-SHA384-PSS-Deterministic",hash:"SHA-384",saltLength:48,prepareType:PrepareType.Deterministic},RSAPBSSA_SHA384_PSSZERO_Randomized:{name:"RSAPBSSA-SHA384-PSSZERO-Randomized",hash:"SHA-384",saltLength:0,prepareType:PrepareType.Randomized},RSAPBSSA_SHA384_PSSZERO_Deterministic:{name:"RSAPBSSA-SHA384-PSSZERO-Deterministic",hash:"SHA-384",saltLength:0,prepareType:PrepareType.Deterministic}},RSABSSA={SHA384:{generateKey:(algorithm)=>BlindRSA.generateKey({...algorithm,hash:"SHA-384"}),PSS:{Randomized:(params={supportsRSARAW:!1})=>new BlindRSA({...Params.RSABSSA_SHA384_PSS_Randomized,...params}),Deterministic:(params={supportsRSARAW:!1})=>new BlindRSA({...Params.RSABSSA_SHA384_PSS_Deterministic,...params})},PSSZero:{Randomized:(params={supportsRSARAW:!1})=>new BlindRSA({...Params.RSABSSA_SHA384_PSSZERO_Randomized,...params}),Deterministic:(params={supportsRSARAW:!1})=>new BlindRSA({...Params.RSABSSA_SHA384_PSSZERO_Deterministic,...params})}}};var PINNED_ISSUER_KEYS={"https://api.velloo.ai":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs54VddkMfc1b0S+2i8GOouyseMo4mb6+zPYBv/Omu1sZQfTYFVFttZOWO0vw6ObT8EVBC/4qCgZPa1d8To55rNe6ZSWJkvXFuoEeOaVDlfDhxduFnVFa5QelxEwVXAFpVSSdPwcFicoCNxuhHTbezPQl3yKLZVwIUncMNhpwsjXVyrKEtSp+5cAY1SH2axLBpqPT1nReH5HAZmAmUcZFvJND45htig2o2tvFSTkOCurFt6lw9HiCWjNE1L1C3Y/VuGkvIVbQShNipyBvgn1ZtJxFvkY4M4ULUj9G9JMb6pYtUupUddPLfpROXSPFvbDk22JOOP2VWtv5r9mXeTCAIQIDAQAB"};var TOKEN_SCHEME="RSABSSA-SHA384.PSS.Randomized",suite=RSABSSA.SHA384.PSS.Randomized(),KEY_ALG={name:"RSA-PSS",hash:"SHA-384"},BATCH=10,defaultTokenStorePath=()=>join15(homedir3(),".velloo","feedback-tokens.json");async function loadStore(path){try{return JSON.parse(await readFile6(path,"utf8"))}catch{return{}}}async function saveStore(path,store){await mkdir8(dirname10(path),{recursive:!0}),await writeJsonAtomic(path,store)}var originOf=(url)=>new URL(url).origin;async function fetchIssuerKey(cloudUrl,prior){let res=await fetch(`${cloudUrl}/v1/feedback/token-key`,{signal:AbortSignal.timeout(5000)});if(!res.ok)throw new TokenIssueError("rejected",`token key fetch failed (${res.status})`);let parsed=FeedbackIssuerResponseSchema.safeParse(await res.json().catch(()=>null));if(!parsed.success)throw Error("the cloud's feedback token key reply was malformed");let{scheme,publicKey}=parsed.data;if(scheme!==TOKEN_SCHEME)throw Error(`unsupported feedback token scheme ${JSON.stringify(scheme)}`);let pinned=PINNED_ISSUER_KEYS[originOf(cloudUrl)];if(pinned&&publicKey!==pinned)throw Error("the cloud's feedback issuer key does not match the key pinned in this velloo build \u2014 refusing to fetch tokens (a per-user key would deanonymize feedback).");if(!pinned&&prior&&prior.publicKey!==publicKey)throw Error(`the cloud's feedback issuer key changed since tokens were first issued \u2014 refusing to fetch more. If the rotation is expected, delete ${defaultTokenStorePath()} and retry.`);return{publicKey:await crypto.subtle.importKey("spki",Buffer.from(publicKey,"base64"),KEY_ALG,!0,["verify"]),spkiB64:publicKey}}async function topUpTokens(cloud,min=1,storePath=defaultTokenStorePath()){let store=await loadStore(storePath),origin=originOf(cloud.url),entry=store[origin];if((entry?.tokens.length??0)>=min)return;if(!cloud.token)throw new TokenIssueError("signed-out","not signed in \u2014 run `velloo login` to fetch feedback tokens");let issuer=await fetchIssuerKey(cloud.url,entry),blinds=[];for(let i=0;i<BATCH;i++){let prepared=suite.prepare(crypto.getRandomValues(new Uint8Array(32)));blinds.push({prepared,...await suite.blind(issuer.publicKey,prepared)})}let res=await fetch(`${cloud.url}/v1/feedback/tokens`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${cloud.token}`},body:JSON.stringify({blinded:blinds.map((b)=>Buffer.from(b.blindedMsg).toString("base64"))}),signal:AbortSignal.timeout(15000)});if(!res.ok)throw new TokenIssueError(res.status===402||res.status===429?"no-tokens":"rejected",`token issuance failed (${res.status})`);let issued=FeedbackSignaturesResponseSchema.safeParse(await res.json().catch(()=>null));if(!issued.success||issued.data.signatures.length!==blinds.length)throw Error("token issuance returned a malformed signature batch");let{signatures}=issued.data,tokens=[];for(let i=0;i<blinds.length;i++){let b=blinds[i];if(!b)continue;let sig=await suite.finalize(issuer.publicKey,b.prepared,Buffer.from(signatures[i]??"","base64"),b.inv);if(!await suite.verify(issuer.publicKey,sig,b.prepared))throw Error("issued token failed local verification \u2014 not storing it");tokens.push({token:Buffer.from(b.prepared).toString("base64"),sig:Buffer.from(sig).toString("base64")})}store[origin]={scheme:TOKEN_SCHEME,publicKey:issuer.spkiB64,tokens:[...entry?.tokens??[],...tokens]},await saveStore(storePath,store)}async function popToken(cloudUrl,storePath){let store=await loadStore(storePath),entry=store[originOf(cloudUrl)],token=entry?.tokens.shift();if(!entry||!token)return null;return await saveStore(storePath,store),token}function feedbackError(reason,message,retryable){return{kind:"FeedbackNotSent",reason,message,retryable}}class TokenIssueError extends Error{reason;constructor(reason,message){super(message);this.reason=reason}}async function sendAnonymousFeedback(cloud,payload,storePath=defaultTokenStorePath()){for(let attempt=0;attempt<2;attempt++){try{await topUpTokens(cloud,1,storePath)}catch(e){let message=e instanceof Error?e.message:String(e);if(e instanceof TokenIssueError)return err(feedbackError(e.reason,message,e.reason!=="signed-out"));return err(feedbackError("unreachable",message,!0))}let token=await popToken(cloud.url,storePath);if(!token)return err(feedbackError("no-tokens","no anonymous feedback tokens available for this account",!0));try{let res=await fetch(`${cloud.url}/v1/feedback/anonymous`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({body:payload.body,...payload.toolVersion?{toolVersion:payload.toolVersion}:{},...payload.source?{source:payload.source}:{},token:token.token,signature:token.sig}),signal:AbortSignal.timeout(5000)});if(res.status===409)continue;if(!res.ok)return err(feedbackError("rejected",`velloo-cloud refused the message (${res.status}).`,!1));return ok("Thanks \u2014 your feedback was sent (anonymously).")}catch{return err(feedbackError("unreachable","Couldn't reach velloo-cloud; feedback not sent.",!0))}}return err(feedbackError("rejected","feedback tokens kept colliding \u2014 try again later",!0))}import{existsSync as existsSync7}from"fs";import{isAbsolute,resolve as resolve6}from"path";function createServerProviderLoader(folderRoot,hostApp){let hostAppRoot=folderRoot?hostAppRootFrom(folderRoot,hostApp):void 0;return createProviderLoader({none:async()=>(await import("./chunk-49cgk5s2.js")).createProvider(),mui:async()=>(await import("./chunk-n9kcxaj7.js")).createProvider(),antd:async()=>(await import("./chunk-k6n249vb.js")).createProvider(),chakra:async()=>(await import("./chunk-bvmtq0vn.js")).createProvider(),"shadcn-upstream":async(library)=>{let cacheDir=resolveUpstreamCacheDir(library,folderRoot);return(await import("./chunk-dsks52m7.js")).createProvider({version:library.version,...cacheDir?{cacheDir}:{},...hostAppRoot?{hostAppRoot}:{}})}})}function resolveUpstreamCacheDir(library,folderRoot){let path=library.componentsPath;if(!path||path==="binary")return null;if(path.startsWith("~/")){let home=process.env.HOME??process.env.USERPROFILE??"";if(!home)return null;let abs=resolve6(home,path.slice(2));return existsSync7(abs)?abs:null}if(isAbsolute(path))return library.source==="in-repo"||existsSync7(path)?path:null;if(!folderRoot)return null;let abs=resolveAppPath(folderRoot,path);return library.source==="in-repo"||existsSync7(abs)?abs:null}async function resolveProviders(config,folderRoot,loader){let effective=loader??createServerProviderLoader(folderRoot,config.hostApp),providers={};for(let[libraryId,library]of Object.entries(config.libraries))try{providers[libraryId]=await effective(library)}catch(err){if(err instanceof UnknownProviderError)throw Error(`velloo: this binary doesn't know how to load library "${err.id}" (registered as "${libraryId}"). Upgrade velloo or pick a supported provider in .design/config.json.`);throw err}let defaultProvider=providers[config.defaultLibrary];if(!defaultProvider)throw Error(`velloo: defaultLibrary "${config.defaultLibrary}" doesn't match any registered library.`);if(config.styling){let css=config.styling.framework,wanted=CSS_FRAMEWORK_CHANNEL[css];if(!Object.values(providers).some((p)=>styleChannelOf(p,css).kind===wanted)){let libs=Object.values(config.libraries).map((l)=>l.id).join(", ");throw Error(`velloo: config.styling.framework "${css}" isn't supported by any registered library (${libs}). shadcn and MUI carry their own styling; only the no-framework library can pair with "none". Fix the CSS framework or library in .design/config.json.`)}}return{providers,defaultProvider}}import{existsSync as existsSync8}from"fs";import{resolve as resolve7}from"path";var CONFIG_NAMES=["tailwind.config.ts","tailwind.config.js","tailwind.config.cjs","tailwind.config.mjs"];function findHostTailwindConfig(folderRoot,hostApp){let root=hostAppRootFrom(folderRoot,hostApp);for(let name of CONFIG_NAMES){let path=resolve7(root,name);if(existsSync8(path))return path}return null}import{readFile as readFile7}from"fs/promises";import{dirname as dirname11,join as join16}from"path";import{compile}from"@tailwindcss/node";import{Scanner}from"@tailwindcss/oxide";class TailwindJit{pagesDir;extraEntryCss;extraSourceDirs;hostConfigPath;compilerPromise=null;cached=null;cachedCandidates=null;snippetsDir;providers;tailwindProviders;constructor(providers,pagesDir,snippetsDir,extraEntryCss,extraSourceDirs,hostConfigPath,folderCss){this.pagesDir=pagesDir;this.extraEntryCss=extraEntryCss;this.extraSourceDirs=extraSourceDirs;this.hostConfigPath=hostConfigPath;if(this.providers=Array.isArray(providers)?providers:[providers],this.providers.length===0)throw Error("TailwindJit: at least one provider is required.");this.tailwindProviders=this.providers.filter((p)=>styleChannelOf(p,folderCss).needsTailwindJit),this.snippetsDir=snippetsDir??join16(pagesDir,"..","snippets")}invalidate(){this.cached=null,this.cachedCandidates=null,this.compilerPromise=null}async build(extraCandidates){if(this.tailwindProviders.length===0)return"";let hasExtra=extraCandidates!==void 0&&extraCandidates.length>0;if(!hasExtra&&this.cached!==null)return this.cached;let compiler=await this.getCompiler(),candidates=this.scanCandidates();if(!hasExtra)return this.cached=compiler.build(candidates),this.cached;return compiler.build([...candidates,...extraCandidates])}scanCandidates(){if(this.cachedCandidates!==null)return this.cachedCandidates;let dedupedDirs=Array.from(new Set([...this.tailwindProviders.map((p)=>p.componentsDir),helpersComponentsDir])),hostDirs=Array.from(new Set(this.extraSourceDirs?.()??[])),scanner=new Scanner({sources:[...dedupedDirs.map((base)=>({base,pattern:"**/*.tsx",negated:!1})),...hostDirs.map((base)=>({base,pattern:"**/*.tsx",negated:!1})),{base:this.pagesDir,pattern:"**/*.json",negated:!1},{base:this.snippetsDir,pattern:"**/*.json",negated:!1}]});return this.cachedCandidates=scanner.scan(),this.cachedCandidates}entryCss(){return this.mergedEntryCss()}async mergedEntryCss(){let primary=this.tailwindProviders[0];if(!primary)throw Error("TailwindJit: no Tailwind-channel provider, cannot build entry CSS.");let primaryBase=dirname11(primary.styleEntryPath),extra=this.extraEntryCss?.()??"";if(this.tailwindProviders.length===1){let css=await readFile7(primary.styleEntryPath,"utf8");return{css:extra?`${css}
|
|
128
|
+
`+i.toString(16)+"\t";string+=pad(stringBufferView.getUint16(i).toString(16),4)+" "}if(typeof console===void 0)console=console||{log:function(){}};console.log(string.toUpperCase())}};var sjcl_default=sjcl;function assertNever(name,x){throw Error(`unexpected ${name} identifier: ${x}`)}function getHashParams(hash){switch(hash){case"SHA-1":return{name:hash,hLen:20};case"SHA-256":return{name:hash,hLen:32};case"SHA-384":return{name:hash,hLen:48};case"SHA-512":return{name:hash,hLen:64};default:assertNever("Hash",hash)}}function os2ip(bytes){return sjcl_default.bn.fromBits(sjcl_default.codec.bytes.toBits(Array.from(bytes)))}function i2osp(num,byteLength){if(Math.ceil(num.bitLength()/8)>byteLength)throw Error(`number does not fit in ${byteLength} bytes`);let bytes=new Uint8Array(byteLength),unpadded=new Uint8Array(sjcl_default.codec.bytes.fromBits(num.toBits(void 0)));return bytes.set(unpadded,byteLength-unpadded.length),bytes}function joinAll(a){let size=0;for(let ai of a)size+=ai.length;let ret=new Uint8Array(new ArrayBuffer(size)),offset=0;for(let ai of a)ret.set(ai,offset),offset+=ai.length;return ret}function xor(a,b){if(a.length!==b.length||a.length===0)throw Error(`arrays of different length: ${a.length} - ${b.length}`);let ai=a[Symbol.iterator](),bi=b[Symbol.iterator]();return new Uint8Array(a.length).map(()=>ai.next().value^bi.next().value)}function incCounter(c){if(c[3]++,c[3]!=0)return;if(c[2]++,c[2]!=0)return;if(c[1]++,c[1]!=0)return;c[0]++;return}async function mgf1(h,seed,mLen){let n=Math.ceil(mLen/h.hLen);if(n>Math.pow(2,32))throw Error("mask too long");let T=new Uint8Array,counter=new Uint8Array(4);for(let i=0;i<n;i++){let hash=new Uint8Array(await crypto.subtle.digest(h.name,joinAll([seed,counter]).slice().buffer));T=joinAll([T,hash]),incCounter(counter)}return T.subarray(0,mLen)}async function emsa_pss_encode(msg,emBits,opts,mgf=mgf1){let{hash,sLen}=opts,hashParams=getHashParams(hash),{hLen}=hashParams,emLen=Math.ceil(emBits/8),mHash=new Uint8Array(await crypto.subtle.digest(hash,msg.slice().buffer));if(emLen<hLen+sLen+2)throw Error("encoding error");let salt=crypto.getRandomValues(new Uint8Array(sLen)),mPrime=joinAll([new Uint8Array(8),mHash,salt]),h=new Uint8Array(await crypto.subtle.digest(hash,mPrime.slice().buffer)),ps=new Uint8Array(emLen-sLen-hLen-2),db=joinAll([ps,Uint8Array.of(1),salt]),dbMask=await mgf(hashParams,h,emLen-hLen-1),maskedDB=xor(db,dbMask);return maskedDB[0]&=255>>8*emLen-emBits,joinAll([maskedDB,h,Uint8Array.of(188)])}function rsavp1(pkS,s){if(!s.greaterEquals(new sjcl_default.bn(0))||s.greaterEquals(pkS.n))throw Error("signature representative out of range");return s.powermod(pkS.e,pkS.n)}function rsasp1(skS,m){if(!m.greaterEquals(new sjcl_default.bn(0))||m.greaterEquals(skS.n))throw Error("signature representative out of range");return m.powermod(skS.d,skS.n)}function is_coprime(x,n){try{x.inverseMod(n)}catch{return!1}return!0}function random_integer_uniform(n,kLen){for(let i=0;i<128;i++){let r=os2ip(crypto.getRandomValues(new Uint8Array(kLen)));if(!(r.greaterEquals(n)||r.equals(0)))return r}throw Error("reached maximum tries for random integer generation")}var NATIVE_SUPPORT_NAME="RSA-RAW";async function rsaRawBlingSign(privateKey,blindMsg){if(privateKey.algorithm.name!==NATIVE_SUPPORT_NAME)privateKey=await crypto.subtle.importKey("pkcs8",await crypto.subtle.exportKey("pkcs8",privateKey),{...privateKey.algorithm,name:NATIVE_SUPPORT_NAME},privateKey.extractable,privateKey.usages);let signature=await crypto.subtle.sign({name:privateKey.algorithm.name},privateKey,blindMsg.slice().buffer);return new Uint8Array(signature)}var PrepareType;(function(PrepareType){PrepareType[PrepareType.Deterministic=0]="Deterministic",PrepareType[PrepareType.Randomized=32]="Randomized"})(PrepareType||(PrepareType={}));class BlindRSA{params;static NAME="RSA-PSS";constructor(params){switch(this.params=params,params.prepareType){case PrepareType.Deterministic:case PrepareType.Randomized:return;default:assertNever("PrepareType",params.prepareType)}}toString(){let hash=this.params.hash.replace("-",""),pssType="PSS"+(this.params.saltLength===0?"ZERO":""),prepare=PrepareType[this.params.prepareType];return`RSABSSA-${hash}-${pssType}-${prepare}`}prepare(msg){let msg_prefix_len=this.params.prepareType,msg_prefix=crypto.getRandomValues(new Uint8Array(msg_prefix_len));return joinAll([msg_prefix,msg])}async extractKeyParams(key,type){if(key.type!==type||key.algorithm.name!==BlindRSA.NAME)throw Error(`key is not ${BlindRSA.NAME}`);if(!key.extractable)throw Error("key is not extractable");let{modulusLength:modulusLengthBits,hash:hashFn}=key.algorithm,modulusLengthBytes=Math.ceil(modulusLengthBits/8),hash=hashFn.name;if(hash.toLowerCase()!==this.params.hash.toLowerCase())throw Error(`hash is not ${this.params.hash}`);return{jwkKey:await crypto.subtle.exportKey("jwk",key),modulusLengthBits,modulusLengthBytes,hash}}async blind(publicKey,msg){let{jwkKey,modulusLengthBits:modulusLength,modulusLengthBytes:kLen,hash}=await this.extractKeyParams(publicKey,"public");if(!jwkKey.n||!jwkKey.e)throw Error("key has invalid parameters");let n=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.n)),pk={e:sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.e)),n},opts={sLen:this.params.saltLength,hash},encoded_msg=await emsa_pss_encode(msg,modulusLength-1,opts),m=os2ip(encoded_msg);if(!is_coprime(m,n))throw Error("invalid input");let r=random_integer_uniform(n,kLen),inv;try{inv=i2osp(r.inverseMod(n),kLen)}catch(e){throw Error(`blinding error: ${e.toString()}`)}let x=rsavp1(pk,r),z=m.mulmod(x,n);return{blindedMsg:i2osp(z,kLen),inv}}async blindSign(privateKey,blindMsg){if(this.params.supportsRSARAW)return rsaRawBlingSign(privateKey,blindMsg);let{jwkKey,modulusLengthBytes:kLen}=await this.extractKeyParams(privateKey,"private");if(!jwkKey.n||!jwkKey.d||!jwkKey.e)throw Error("key has invalid parameters");let n=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.n)),d=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.d)),e=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.e)),sk={n,d},pk={n,e},m=os2ip(blindMsg),s=rsasp1(sk,m),mp=rsavp1(pk,s);if(!m.equals(mp))throw Error("signing failure");return i2osp(s,kLen)}async finalize(publicKey,msg,blindSig,inv){let{jwkKey,modulusLengthBytes:kLen}=await this.extractKeyParams(publicKey,"public");if(!jwkKey.n)throw Error("key has invalid parameters");let n=sjcl_default.bn.fromBits(sjcl_default.codec.base64url.toBits(jwkKey.n));if(inv.length!=kLen)throw Error("unexpected input size");let rInv=os2ip(inv);if(blindSig.length!=kLen)throw Error("unexpected input size");let s=os2ip(blindSig).mulmod(rInv,n),sig=i2osp(s,kLen),algorithm={name:BlindRSA.NAME,saltLength:this.params.saltLength};if(!await crypto.subtle.verify(algorithm,publicKey,sig.slice().buffer,msg.slice().buffer))throw Error("invalid signature");return sig}static generateKey(algorithm){return crypto.subtle.generateKey({...algorithm,name:BlindRSA.NAME},!0,["sign","verify"])}generateKey(algorithm){return BlindRSA.generateKey({...algorithm,hash:this.params.hash})}verify(publicKey,signature,message){return crypto.subtle.verify({name:BlindRSA.NAME,saltLength:this.params.saltLength},publicKey,signature.slice().buffer,message.slice().buffer)}}var Params={RSABSSA_SHA384_PSS_Randomized:{name:"RSABSSA-SHA384-PSS-Randomized",hash:"SHA-384",saltLength:48,prepareType:PrepareType.Randomized},RSABSSA_SHA384_PSS_Deterministic:{name:"RSABSSA-SHA384-PSS-Deterministic",hash:"SHA-384",saltLength:48,prepareType:PrepareType.Deterministic},RSABSSA_SHA384_PSSZERO_Randomized:{name:"RSABSSA-SHA384-PSSZERO-Randomized",hash:"SHA-384",saltLength:0,prepareType:PrepareType.Randomized},RSABSSA_SHA384_PSSZERO_Deterministic:{name:"RSABSSA-SHA384-PSSZERO-Deterministic",hash:"SHA-384",saltLength:0,prepareType:PrepareType.Deterministic},RSAPBSSA_SHA384_PSS_Randomized:{name:"RSAPBSSA-SHA384-PSS-Randomized",hash:"SHA-384",saltLength:48,prepareType:PrepareType.Randomized},RSAPBSSA_SHA384_PSS_Deterministic:{name:"RSAPBSSA-SHA384-PSS-Deterministic",hash:"SHA-384",saltLength:48,prepareType:PrepareType.Deterministic},RSAPBSSA_SHA384_PSSZERO_Randomized:{name:"RSAPBSSA-SHA384-PSSZERO-Randomized",hash:"SHA-384",saltLength:0,prepareType:PrepareType.Randomized},RSAPBSSA_SHA384_PSSZERO_Deterministic:{name:"RSAPBSSA-SHA384-PSSZERO-Deterministic",hash:"SHA-384",saltLength:0,prepareType:PrepareType.Deterministic}},RSABSSA={SHA384:{generateKey:(algorithm)=>BlindRSA.generateKey({...algorithm,hash:"SHA-384"}),PSS:{Randomized:(params={supportsRSARAW:!1})=>new BlindRSA({...Params.RSABSSA_SHA384_PSS_Randomized,...params}),Deterministic:(params={supportsRSARAW:!1})=>new BlindRSA({...Params.RSABSSA_SHA384_PSS_Deterministic,...params})},PSSZero:{Randomized:(params={supportsRSARAW:!1})=>new BlindRSA({...Params.RSABSSA_SHA384_PSSZERO_Randomized,...params}),Deterministic:(params={supportsRSARAW:!1})=>new BlindRSA({...Params.RSABSSA_SHA384_PSSZERO_Deterministic,...params})}}};var PINNED_ISSUER_KEYS={"https://api.velloo.ai":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs54VddkMfc1b0S+2i8GOouyseMo4mb6+zPYBv/Omu1sZQfTYFVFttZOWO0vw6ObT8EVBC/4qCgZPa1d8To55rNe6ZSWJkvXFuoEeOaVDlfDhxduFnVFa5QelxEwVXAFpVSSdPwcFicoCNxuhHTbezPQl3yKLZVwIUncMNhpwsjXVyrKEtSp+5cAY1SH2axLBpqPT1nReH5HAZmAmUcZFvJND45htig2o2tvFSTkOCurFt6lw9HiCWjNE1L1C3Y/VuGkvIVbQShNipyBvgn1ZtJxFvkY4M4ULUj9G9JMb6pYtUupUddPLfpROXSPFvbDk22JOOP2VWtv5r9mXeTCAIQIDAQAB"};var TOKEN_SCHEME="RSABSSA-SHA384.PSS.Randomized",suite=RSABSSA.SHA384.PSS.Randomized(),KEY_ALG={name:"RSA-PSS",hash:"SHA-384"},BATCH=10,defaultTokenStorePath=()=>join15(homedir3(),".velloo","feedback-tokens.json");async function loadStore(path){try{return JSON.parse(await readFile6(path,"utf8"))}catch{return{}}}async function saveStore(path,store){await mkdir8(dirname10(path),{recursive:!0}),await writeJsonAtomic(path,store)}var originOf=(url)=>new URL(url).origin;async function fetchIssuerKey(cloudUrl,prior){let res=await fetch(`${cloudUrl}/v1/feedback/token-key`,{signal:AbortSignal.timeout(5000)});if(!res.ok)throw new TokenIssueError("rejected",`token key fetch failed (${res.status})`);let parsed=FeedbackIssuerResponseSchema.safeParse(await res.json().catch(()=>null));if(!parsed.success)throw Error("the cloud's feedback token key reply was malformed");let{scheme,publicKey}=parsed.data;if(scheme!==TOKEN_SCHEME)throw Error(`unsupported feedback token scheme ${JSON.stringify(scheme)}`);let pinned=PINNED_ISSUER_KEYS[originOf(cloudUrl)];if(pinned&&publicKey!==pinned)throw Error("the cloud's feedback issuer key does not match the key pinned in this velloo build \u2014 refusing to fetch tokens (a per-user key would deanonymize feedback).");if(!pinned&&prior&&prior.publicKey!==publicKey)throw Error(`the cloud's feedback issuer key changed since tokens were first issued \u2014 refusing to fetch more. If the rotation is expected, delete ${defaultTokenStorePath()} and retry.`);return{publicKey:await crypto.subtle.importKey("spki",Buffer.from(publicKey,"base64"),KEY_ALG,!0,["verify"]),spkiB64:publicKey}}async function topUpTokens(cloud,min=1,storePath=defaultTokenStorePath()){let store=await loadStore(storePath),origin=originOf(cloud.url),entry=store[origin];if((entry?.tokens.length??0)>=min)return;if(!cloud.token)throw new TokenIssueError("signed-out","not signed in \u2014 run `velloo login` to fetch feedback tokens");let issuer=await fetchIssuerKey(cloud.url,entry),blinds=[];for(let i=0;i<BATCH;i++){let prepared=suite.prepare(crypto.getRandomValues(new Uint8Array(32)));blinds.push({prepared,...await suite.blind(issuer.publicKey,prepared)})}let res=await fetch(`${cloud.url}/v1/feedback/tokens`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${cloud.token}`},body:JSON.stringify({blinded:blinds.map((b)=>Buffer.from(b.blindedMsg).toString("base64"))}),signal:AbortSignal.timeout(15000)});if(!res.ok)throw new TokenIssueError(res.status===402||res.status===429?"no-tokens":"rejected",`token issuance failed (${res.status})`);let issued=FeedbackSignaturesResponseSchema.safeParse(await res.json().catch(()=>null));if(!issued.success||issued.data.signatures.length!==blinds.length)throw Error("token issuance returned a malformed signature batch");let{signatures}=issued.data,tokens=[];for(let i=0;i<blinds.length;i++){let b=blinds[i];if(!b)continue;let sig=await suite.finalize(issuer.publicKey,b.prepared,Buffer.from(signatures[i]??"","base64"),b.inv);if(!await suite.verify(issuer.publicKey,sig,b.prepared))throw Error("issued token failed local verification \u2014 not storing it");tokens.push({token:Buffer.from(b.prepared).toString("base64"),sig:Buffer.from(sig).toString("base64")})}store[origin]={scheme:TOKEN_SCHEME,publicKey:issuer.spkiB64,tokens:[...entry?.tokens??[],...tokens]},await saveStore(storePath,store)}async function popToken(cloudUrl,storePath){let store=await loadStore(storePath),entry=store[originOf(cloudUrl)],token=entry?.tokens.shift();if(!entry||!token)return null;return await saveStore(storePath,store),token}function feedbackError(reason,message,retryable){return{kind:"FeedbackNotSent",reason,message,retryable}}class TokenIssueError extends Error{reason;constructor(reason,message){super(message);this.reason=reason}}async function sendAnonymousFeedback(cloud,payload,storePath=defaultTokenStorePath()){for(let attempt=0;attempt<2;attempt++){try{await topUpTokens(cloud,1,storePath)}catch(e){let message=e instanceof Error?e.message:String(e);if(e instanceof TokenIssueError)return err(feedbackError(e.reason,message,e.reason!=="signed-out"));return err(feedbackError("unreachable",message,!0))}let token=await popToken(cloud.url,storePath);if(!token)return err(feedbackError("no-tokens","no anonymous feedback tokens available for this account",!0));try{let res=await fetch(`${cloud.url}/v1/feedback/anonymous`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({body:payload.body,...payload.toolVersion?{toolVersion:payload.toolVersion}:{},...payload.source?{source:payload.source}:{},token:token.token,signature:token.sig}),signal:AbortSignal.timeout(5000)});if(res.status===409)continue;if(!res.ok)return err(feedbackError("rejected",`velloo-cloud refused the message (${res.status}).`,!1));return ok("Thanks \u2014 your feedback was sent (anonymously).")}catch{return err(feedbackError("unreachable","Couldn't reach velloo-cloud; feedback not sent.",!0))}}return err(feedbackError("rejected","feedback tokens kept colliding \u2014 try again later",!0))}import{existsSync as existsSync7}from"fs";import{isAbsolute,resolve as resolve6}from"path";function createServerProviderLoader(folderRoot,hostApp){let hostAppRoot=folderRoot?hostAppRootFrom(folderRoot,hostApp):void 0;return createProviderLoader({none:async()=>(await import("./chunk-tt7fys2w.js")).createProvider(),mui:async()=>(await import("./chunk-2zbn6641.js")).createProvider(),antd:async()=>(await import("./chunk-wp123630.js")).createProvider(),chakra:async()=>(await import("./chunk-z21hg6j3.js")).createProvider(),"shadcn-upstream":async(library)=>{let cacheDir=resolveUpstreamCacheDir(library,folderRoot);return(await import("./chunk-4e9jh482.js")).createProvider({version:library.version,...cacheDir?{cacheDir}:{},...hostAppRoot?{hostAppRoot}:{}})}})}function resolveUpstreamCacheDir(library,folderRoot){let path=library.componentsPath;if(!path||path==="binary")return null;if(path.startsWith("~/")){let home=process.env.HOME??process.env.USERPROFILE??"";if(!home)return null;let abs=resolve6(home,path.slice(2));return existsSync7(abs)?abs:null}if(isAbsolute(path))return library.source==="in-repo"||existsSync7(path)?path:null;if(!folderRoot)return null;let abs=resolveAppPath(folderRoot,path);return library.source==="in-repo"||existsSync7(abs)?abs:null}async function resolveProviders(config,folderRoot,loader){let effective=loader??createServerProviderLoader(folderRoot,config.hostApp),providers={};for(let[libraryId,library]of Object.entries(config.libraries))try{providers[libraryId]=await effective(library)}catch(err){if(err instanceof UnknownProviderError)throw Error(`velloo: this binary doesn't know how to load library "${err.id}" (registered as "${libraryId}"). Upgrade velloo or pick a supported provider in .design/config.json.`);throw err}let defaultProvider=providers[config.defaultLibrary];if(!defaultProvider)throw Error(`velloo: defaultLibrary "${config.defaultLibrary}" doesn't match any registered library.`);if(config.styling){let css=config.styling.framework,wanted=CSS_FRAMEWORK_CHANNEL[css];if(!Object.values(providers).some((p)=>styleChannelOf(p,css).kind===wanted)){let libs=Object.values(config.libraries).map((l)=>l.id).join(", ");throw Error(`velloo: config.styling.framework "${css}" isn't supported by any registered library (${libs}). shadcn and MUI carry their own styling; only the no-framework library can pair with "none". Fix the CSS framework or library in .design/config.json.`)}}return{providers,defaultProvider}}import{existsSync as existsSync8}from"fs";import{resolve as resolve7}from"path";var CONFIG_NAMES=["tailwind.config.ts","tailwind.config.js","tailwind.config.cjs","tailwind.config.mjs"];function findHostTailwindConfig(folderRoot,hostApp){let root=hostAppRootFrom(folderRoot,hostApp);for(let name of CONFIG_NAMES){let path=resolve7(root,name);if(existsSync8(path))return path}return null}import{readFile as readFile7}from"fs/promises";import{dirname as dirname11,join as join16}from"path";import{compile}from"@tailwindcss/node";import{Scanner}from"@tailwindcss/oxide";class TailwindJit{pagesDir;extraEntryCss;extraSourceDirs;hostConfigPath;compilerPromise=null;cached=null;cachedCandidates=null;snippetsDir;providers;tailwindProviders;constructor(providers,pagesDir,snippetsDir,extraEntryCss,extraSourceDirs,hostConfigPath,folderCss){this.pagesDir=pagesDir;this.extraEntryCss=extraEntryCss;this.extraSourceDirs=extraSourceDirs;this.hostConfigPath=hostConfigPath;if(this.providers=Array.isArray(providers)?providers:[providers],this.providers.length===0)throw Error("TailwindJit: at least one provider is required.");this.tailwindProviders=this.providers.filter((p)=>styleChannelOf(p,folderCss).needsTailwindJit),this.snippetsDir=snippetsDir??join16(pagesDir,"..","snippets")}invalidate(){this.cached=null,this.cachedCandidates=null,this.compilerPromise=null}async build(extraCandidates){if(this.tailwindProviders.length===0)return"";let hasExtra=extraCandidates!==void 0&&extraCandidates.length>0;if(!hasExtra&&this.cached!==null)return this.cached;let compiler=await this.getCompiler(),candidates=this.scanCandidates();if(!hasExtra)return this.cached=compiler.build(candidates),this.cached;return compiler.build([...candidates,...extraCandidates])}scanCandidates(){if(this.cachedCandidates!==null)return this.cachedCandidates;let dedupedDirs=Array.from(new Set([...this.tailwindProviders.map((p)=>p.componentsDir),helpersComponentsDir])),hostDirs=Array.from(new Set(this.extraSourceDirs?.()??[])),scanner=new Scanner({sources:[...dedupedDirs.map((base)=>({base,pattern:"**/*.tsx",negated:!1})),...hostDirs.map((base)=>({base,pattern:"**/*.tsx",negated:!1})),{base:this.pagesDir,pattern:"**/*.json",negated:!1},{base:this.snippetsDir,pattern:"**/*.json",negated:!1}]});return this.cachedCandidates=scanner.scan(),this.cachedCandidates}entryCss(){return this.mergedEntryCss()}async mergedEntryCss(){let primary=this.tailwindProviders[0];if(!primary)throw Error("TailwindJit: no Tailwind-channel provider, cannot build entry CSS.");let primaryBase=dirname11(primary.styleEntryPath),extra=this.extraEntryCss?.()??"";if(this.tailwindProviders.length===1){let css=await readFile7(primary.styleEntryPath,"utf8");return{css:extra?`${css}
|
|
129
129
|
|
|
130
130
|
${extra}`:css,base:primaryBase}}let merged=(await Promise.all(this.tailwindProviders.map(async(p)=>{let css=await readFile7(p.styleEntryPath,"utf8");return`/* === provider: ${p.id} (${p.version}) === */
|
|
131
131
|
${css}`}))).join(`
|
|
@@ -142,7 +142,7 @@ ${extra}`:merged,base:primaryBase}}warnedHostConfig=!1;getCompiler(){if(this.com
|
|
|
142
142
|
`:`[${source[i]}\r
|
|
143
143
|
]`;continue}if(pattern+=source[i],source[i]==="\\")isEscaped=!0;else if(inCharGroup&&source[i]==="]")inCharGroup=!1;else if(!inCharGroup&&source[i]==="[")inCharGroup=!0}try{new RegExp(pattern)}catch{return console.warn(`Could not convert regex pattern at ${refs.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),regex.source}return pattern}function parseRecordDef(def,refs){if(refs.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(refs.target==="openApi3"&&def.keyType?._def.typeName===ZodFirstPartyTypeKind2.ZodEnum)return{type:"object",required:def.keyType._def.values,properties:def.keyType._def.values.reduce((acc,key)=>({...acc,[key]:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"properties",key]})??parseAnyDef(refs)}),{}),additionalProperties:refs.rejectedAdditionalProperties};let schema={type:"object",additionalProperties:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"additionalProperties"]})??refs.allowedAdditionalProperties};if(refs.target==="openApi3")return schema;if(def.keyType?._def.typeName===ZodFirstPartyTypeKind2.ZodString&&def.keyType._def.checks?.length){let{type,...keyType}=parseStringDef(def.keyType._def,refs);return{...schema,propertyNames:keyType}}else if(def.keyType?._def.typeName===ZodFirstPartyTypeKind2.ZodEnum)return{...schema,propertyNames:{enum:def.keyType._def.values}};else if(def.keyType?._def.typeName===ZodFirstPartyTypeKind2.ZodBranded&&def.keyType._def.type._def.typeName===ZodFirstPartyTypeKind2.ZodString&&def.keyType._def.type._def.checks?.length){let{type,...keyType}=parseBrandedDef(def.keyType._def,refs);return{...schema,propertyNames:keyType}}return schema}function parseMapDef(def,refs){if(refs.mapStrategy==="record")return parseRecordDef(def,refs);let keys=parseDef(def.keyType._def,{...refs,currentPath:[...refs.currentPath,"items","items","0"]})||parseAnyDef(refs),values=parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"items","items","1"]})||parseAnyDef(refs);return{type:"array",maxItems:125,items:{type:"array",items:[keys,values],minItems:2,maxItems:2}}}function parseNativeEnumDef(def){let object=def.values,actualValues=Object.keys(def.values).filter((key)=>typeof object[object[key]]!=="number").map((key)=>object[key]),parsedTypes=Array.from(new Set(actualValues.map((values)=>typeof values)));return{type:parsedTypes.length===1?parsedTypes[0]==="string"?"string":"number":["string","number"],enum:actualValues}}function parseNeverDef(refs){return refs.target==="openAi"?void 0:{not:parseAnyDef({...refs,currentPath:[...refs.currentPath,"not"]})}}function parseNullDef(refs){return refs.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var primitiveMappings={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function parseUnionDef(def,refs){if(refs.target==="openApi3")return asAnyOf(def,refs);let options=def.options instanceof Map?Array.from(def.options.values()):def.options;if(options.every((x)=>(x._def.typeName in primitiveMappings)&&(!x._def.checks||!x._def.checks.length))){let types=options.reduce((types,x)=>{let type=primitiveMappings[x._def.typeName];return type&&!types.includes(type)?[...types,type]:types},[]);return{type:types.length>1?types:types[0]}}else if(options.every((x)=>x._def.typeName==="ZodLiteral"&&!x.description)){let types=options.reduce((acc,x)=>{let type=typeof x._def.value;switch(type){case"string":case"number":case"boolean":return[...acc,type];case"bigint":return[...acc,"integer"];case"object":if(x._def.value===null)return[...acc,"null"];case"symbol":case"undefined":case"function":default:return acc}},[]);if(types.length===options.length){let uniqueTypes=types.filter((x,i,a)=>a.indexOf(x)===i);return{type:uniqueTypes.length>1?uniqueTypes:uniqueTypes[0],enum:options.reduce((acc,x)=>acc.includes(x._def.value)?acc:[...acc,x._def.value],[])}}}else if(options.every((x)=>x._def.typeName==="ZodEnum"))return{type:"string",enum:options.reduce((acc,x)=>[...acc,...x._def.values.filter((x)=>!acc.includes(x))],[])};return asAnyOf(def,refs)}var asAnyOf=(def,refs)=>{let anyOf=(def.options instanceof Map?Array.from(def.options.values()):def.options).map((x,i)=>parseDef(x._def,{...refs,currentPath:[...refs.currentPath,"anyOf",`${i}`]})).filter((x)=>!!x&&(!refs.strictUnions||typeof x==="object"&&Object.keys(x).length>0));return anyOf.length?{anyOf}:void 0};function parseNullableDef(def,refs){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(def.innerType._def.typeName)&&(!def.innerType._def.checks||!def.innerType._def.checks.length)){if(refs.target==="openApi3")return{type:primitiveMappings[def.innerType._def.typeName],nullable:!0};return{type:[primitiveMappings[def.innerType._def.typeName],"null"]}}if(refs.target==="openApi3"){let base=parseDef(def.innerType._def,{...refs,currentPath:[...refs.currentPath]});if(base&&"$ref"in base)return{allOf:[base],nullable:!0};return base&&{...base,nullable:!0}}let base=parseDef(def.innerType._def,{...refs,currentPath:[...refs.currentPath,"anyOf","0"]});return base&&{anyOf:[base,{type:"null"}]}}function parseNumberDef(def,refs){let res={type:"number"};if(!def.checks)return res;for(let check of def.checks)switch(check.kind){case"int":res.type="integer",addErrorMessage(res,"type",check.message,refs);break;case"min":if(refs.target==="jsonSchema7")if(check.inclusive)setResponseValueAndErrors(res,"minimum",check.value,check.message,refs);else setResponseValueAndErrors(res,"exclusiveMinimum",check.value,check.message,refs);else{if(!check.inclusive)res.exclusiveMinimum=!0;setResponseValueAndErrors(res,"minimum",check.value,check.message,refs)}break;case"max":if(refs.target==="jsonSchema7")if(check.inclusive)setResponseValueAndErrors(res,"maximum",check.value,check.message,refs);else setResponseValueAndErrors(res,"exclusiveMaximum",check.value,check.message,refs);else{if(!check.inclusive)res.exclusiveMaximum=!0;setResponseValueAndErrors(res,"maximum",check.value,check.message,refs)}break;case"multipleOf":setResponseValueAndErrors(res,"multipleOf",check.value,check.message,refs);break}return res}function parseObjectDef(def,refs){let forceOptionalIntoNullable=refs.target==="openAi",result={type:"object",properties:{}},required=[],shape=def.shape();for(let propName in shape){let propDef=shape[propName];if(propDef===void 0||propDef._def===void 0)continue;let propOptional=safeIsOptional(propDef);if(propOptional&&forceOptionalIntoNullable){if(propDef._def.typeName==="ZodOptional")propDef=propDef._def.innerType;if(!propDef.isNullable())propDef=propDef.nullable();propOptional=!1}let parsedDef=parseDef(propDef._def,{...refs,currentPath:[...refs.currentPath,"properties",propName],propertyPath:[...refs.currentPath,"properties",propName]});if(parsedDef===void 0)continue;if(result.properties[propName]=parsedDef,!propOptional)required.push(propName)}if(required.length)result.required=required;let additionalProperties=decideAdditionalProperties(def,refs);if(additionalProperties!==void 0)result.additionalProperties=additionalProperties;return result}function decideAdditionalProperties(def,refs){if(def.catchall._def.typeName!=="ZodNever")return parseDef(def.catchall._def,{...refs,currentPath:[...refs.currentPath,"additionalProperties"]});switch(def.unknownKeys){case"passthrough":return refs.allowedAdditionalProperties;case"strict":return refs.rejectedAdditionalProperties;case"strip":return refs.removeAdditionalStrategy==="strict"?refs.allowedAdditionalProperties:refs.rejectedAdditionalProperties}}function safeIsOptional(schema){try{return schema.isOptional()}catch{return!0}}var parseOptionalDef=(def,refs)=>{if(refs.currentPath.toString()===refs.propertyPath?.toString())return parseDef(def.innerType._def,refs);let innerSchema=parseDef(def.innerType._def,{...refs,currentPath:[...refs.currentPath,"anyOf","1"]});return innerSchema?{anyOf:[{not:parseAnyDef(refs)},innerSchema]}:parseAnyDef(refs)};var parsePipelineDef=(def,refs)=>{if(refs.pipeStrategy==="input")return parseDef(def.in._def,refs);else if(refs.pipeStrategy==="output")return parseDef(def.out._def,refs);let a=parseDef(def.in._def,{...refs,currentPath:[...refs.currentPath,"allOf","0"]}),b=parseDef(def.out._def,{...refs,currentPath:[...refs.currentPath,"allOf",a?"1":"0"]});return{allOf:[a,b].filter((x)=>x!==void 0)}};function parsePromiseDef(def,refs){return parseDef(def.type._def,refs)}function parseSetDef(def,refs){let schema={type:"array",uniqueItems:!0,items:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"items"]})};if(def.minSize)setResponseValueAndErrors(schema,"minItems",def.minSize.value,def.minSize.message,refs);if(def.maxSize)setResponseValueAndErrors(schema,"maxItems",def.maxSize.value,def.maxSize.message,refs);return schema}function parseTupleDef(def,refs){if(def.rest)return{type:"array",minItems:def.items.length,items:def.items.map((x,i)=>parseDef(x._def,{...refs,currentPath:[...refs.currentPath,"items",`${i}`]})).reduce((acc,x)=>x===void 0?acc:[...acc,x],[]),additionalItems:parseDef(def.rest._def,{...refs,currentPath:[...refs.currentPath,"additionalItems"]})};else return{type:"array",minItems:def.items.length,maxItems:def.items.length,items:def.items.map((x,i)=>parseDef(x._def,{...refs,currentPath:[...refs.currentPath,"items",`${i}`]})).reduce((acc,x)=>x===void 0?acc:[...acc,x],[])}}function parseUndefinedDef(refs){return{not:parseAnyDef(refs)}}function parseUnknownDef(refs){return parseAnyDef(refs)}var parseReadonlyDef=(def,refs)=>parseDef(def.innerType._def,refs);var selectParser=(def,typeName,refs)=>{switch(typeName){case ZodFirstPartyTypeKind2.ZodString:return parseStringDef(def,refs);case ZodFirstPartyTypeKind2.ZodNumber:return parseNumberDef(def,refs);case ZodFirstPartyTypeKind2.ZodObject:return parseObjectDef(def,refs);case ZodFirstPartyTypeKind2.ZodBigInt:return parseBigintDef(def,refs);case ZodFirstPartyTypeKind2.ZodBoolean:return parseBooleanDef();case ZodFirstPartyTypeKind2.ZodDate:return parseDateDef(def,refs);case ZodFirstPartyTypeKind2.ZodUndefined:return parseUndefinedDef(refs);case ZodFirstPartyTypeKind2.ZodNull:return parseNullDef(refs);case ZodFirstPartyTypeKind2.ZodArray:return parseArrayDef(def,refs);case ZodFirstPartyTypeKind2.ZodUnion:case ZodFirstPartyTypeKind2.ZodDiscriminatedUnion:return parseUnionDef(def,refs);case ZodFirstPartyTypeKind2.ZodIntersection:return parseIntersectionDef(def,refs);case ZodFirstPartyTypeKind2.ZodTuple:return parseTupleDef(def,refs);case ZodFirstPartyTypeKind2.ZodRecord:return parseRecordDef(def,refs);case ZodFirstPartyTypeKind2.ZodLiteral:return parseLiteralDef(def,refs);case ZodFirstPartyTypeKind2.ZodEnum:return parseEnumDef(def);case ZodFirstPartyTypeKind2.ZodNativeEnum:return parseNativeEnumDef(def);case ZodFirstPartyTypeKind2.ZodNullable:return parseNullableDef(def,refs);case ZodFirstPartyTypeKind2.ZodOptional:return parseOptionalDef(def,refs);case ZodFirstPartyTypeKind2.ZodMap:return parseMapDef(def,refs);case ZodFirstPartyTypeKind2.ZodSet:return parseSetDef(def,refs);case ZodFirstPartyTypeKind2.ZodLazy:return()=>def.getter()._def;case ZodFirstPartyTypeKind2.ZodPromise:return parsePromiseDef(def,refs);case ZodFirstPartyTypeKind2.ZodNaN:case ZodFirstPartyTypeKind2.ZodNever:return parseNeverDef(refs);case ZodFirstPartyTypeKind2.ZodEffects:return parseEffectsDef(def,refs);case ZodFirstPartyTypeKind2.ZodAny:return parseAnyDef(refs);case ZodFirstPartyTypeKind2.ZodUnknown:return parseUnknownDef(refs);case ZodFirstPartyTypeKind2.ZodDefault:return parseDefaultDef(def,refs);case ZodFirstPartyTypeKind2.ZodBranded:return parseBrandedDef(def,refs);case ZodFirstPartyTypeKind2.ZodReadonly:return parseReadonlyDef(def,refs);case ZodFirstPartyTypeKind2.ZodCatch:return parseCatchDef(def,refs);case ZodFirstPartyTypeKind2.ZodPipeline:return parsePipelineDef(def,refs);case ZodFirstPartyTypeKind2.ZodFunction:case ZodFirstPartyTypeKind2.ZodVoid:case ZodFirstPartyTypeKind2.ZodSymbol:return;default:return((_)=>{return})(typeName)}};function parseDef(def,refs,forceResolution=!1){let seenItem=refs.seen.get(def);if(refs.override){let overrideResult=refs.override?.(def,refs,seenItem,forceResolution);if(overrideResult!==ignoreOverride)return overrideResult}if(seenItem&&!forceResolution){let seenSchema=get$ref(seenItem,refs);if(seenSchema!==void 0)return seenSchema}let newItem={def,path:refs.currentPath,jsonSchema:void 0};refs.seen.set(def,newItem);let jsonSchemaOrGetter=selectParser(def,def.typeName,refs),jsonSchema=typeof jsonSchemaOrGetter==="function"?parseDef(jsonSchemaOrGetter(),refs):jsonSchemaOrGetter;if(jsonSchema)addMeta(def,refs,jsonSchema);if(refs.postProcess){let postProcessResult=refs.postProcess(jsonSchema,def,refs);return newItem.jsonSchema=jsonSchema,postProcessResult}return newItem.jsonSchema=jsonSchema,jsonSchema}var get$ref=(item,refs)=>{switch(refs.$refStrategy){case"root":return{$ref:item.path.join("/")};case"relative":return{$ref:getRelativePath(refs.currentPath,item.path)};case"none":case"seen":{if(item.path.length<refs.currentPath.length&&item.path.every((value,index)=>refs.currentPath[index]===value))return console.warn(`Recursive reference detected at ${refs.currentPath.join("/")}! Defaulting to any`),parseAnyDef(refs);return refs.$refStrategy==="seen"?parseAnyDef(refs):void 0}}},addMeta=(def,refs,jsonSchema)=>{if(def.description){if(jsonSchema.description=def.description,refs.markdownDescription)jsonSchema.markdownDescription=def.description}return jsonSchema};var zodToJsonSchema=(schema,options)=>{let refs=getRefs(options),definitions=typeof options==="object"&&options.definitions?Object.entries(options.definitions).reduce((acc,[name,schema])=>({...acc,[name]:parseDef(schema._def,{...refs,currentPath:[...refs.basePath,refs.definitionPath,name]},!0)??parseAnyDef(refs)}),{}):void 0,name=typeof options==="string"?options:options?.nameStrategy==="title"?void 0:options?.name,main=parseDef(schema._def,name===void 0?refs:{...refs,currentPath:[...refs.basePath,refs.definitionPath,name]},!1)??parseAnyDef(refs),title=typeof options==="object"&&options.name!==void 0&&options.nameStrategy==="title"?options.name:void 0;if(title!==void 0)main.title=title;if(refs.flags.hasReferencedOpenAiAnyType){if(!definitions)definitions={};if(!definitions[refs.openAiAnyTypeName])definitions[refs.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:refs.$refStrategy==="relative"?"1":[...refs.basePath,refs.definitionPath,refs.openAiAnyTypeName].join("/")}}}let combined=name===void 0?definitions?{...main,[refs.definitionPath]:definitions}:main:{$ref:[...refs.$refStrategy==="relative"?[]:refs.basePath,refs.definitionPath,name].join("/"),[refs.definitionPath]:{...definitions,[name]:main}};if(refs.target==="jsonSchema7")combined.$schema="http://json-schema.org/draft-07/schema#";else if(refs.target==="jsonSchema2019-09"||refs.target==="openAi")combined.$schema="https://json-schema.org/draft/2019-09/schema#";if(refs.target==="openAi"&&(("anyOf"in combined)||("oneOf"in combined)||("allOf"in combined)||("type"in combined)&&Array.isArray(combined.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return combined};function mapMiniTarget(t){if(!t)return"draft-7";if(t==="jsonSchema7"||t==="draft-7")return"draft-7";if(t==="jsonSchema2019-09"||t==="draft-2020-12")return"draft-2020-12";return"draft-7"}function toJsonSchemaCompat(schema,opts){if(isZ4Schema(schema))return toJSONSchema(schema,{target:mapMiniTarget(opts?.target),io:opts?.pipeStrategy??"input"});return zodToJsonSchema(schema,{strictUnions:opts?.strictUnions??!0,pipeStrategy:opts?.pipeStrategy??"input"})}function getMethodLiteral(schema){let methodSchema=getObjectShape(schema)?.method;if(!methodSchema)throw Error("Schema is missing a method literal");let value=getLiteralValue(methodSchema);if(typeof value!=="string")throw Error("Schema method literal must be a string");return value}function parseWithCompat(schema,data){let result=safeParse2(schema,data);if(!result.success)throw result.error;return result.data}var DEFAULT_REQUEST_TIMEOUT_MSEC=60000;class Protocol{constructor(_options){if(this._options=_options,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(CancelledNotificationSchema,(notification)=>{this._oncancel(notification)}),this.setNotificationHandler(ProgressNotificationSchema,(notification)=>{this._onprogress(notification)}),this.setRequestHandler(PingRequestSchema,(_request)=>({})),this._taskStore=_options?.taskStore,this._taskMessageQueue=_options?.taskMessageQueue,this._taskStore)this.setRequestHandler(GetTaskRequestSchema,async(request,extra)=>{let task=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,"Failed to retrieve task: Task not found");return{...task}}),this.setRequestHandler(GetTaskPayloadRequestSchema,async(request,extra)=>{let handleTaskResult=async()=>{let taskId=request.params.taskId;if(this._taskMessageQueue){let queuedMessage;while(queuedMessage=await this._taskMessageQueue.dequeue(taskId,extra.sessionId)){if(queuedMessage.type==="response"||queuedMessage.type==="error"){let message=queuedMessage.message,requestId=message.id,resolver=this._requestResolvers.get(requestId);if(resolver)if(this._requestResolvers.delete(requestId),queuedMessage.type==="response")resolver(message);else{let errorMessage=message,error=new McpError(errorMessage.error.code,errorMessage.error.message,errorMessage.error.data);resolver(error)}else{let messageType=queuedMessage.type==="response"?"Response":"Error";this._onerror(Error(`${messageType} handler missing for request ${requestId}`))}continue}await this._transport?.send(queuedMessage.message,{relatedRequestId:extra.requestId})}}let task=await this._taskStore.getTask(taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task not found: ${taskId}`);if(!isTerminal(task.status))return await this._waitForTaskUpdate(taskId,extra.signal),await handleTaskResult();if(isTerminal(task.status)){let result=await this._taskStore.getTaskResult(taskId,extra.sessionId);return this._clearTaskQueue(taskId),{...result,_meta:{...result._meta,[RELATED_TASK_META_KEY]:{taskId}}}}return await handleTaskResult()};return await handleTaskResult()}),this.setRequestHandler(ListTasksRequestSchema,async(request,extra)=>{try{let{tasks,nextCursor}=await this._taskStore.listTasks(request.params?.cursor,extra.sessionId);return{tasks,nextCursor,_meta:{}}}catch(error){throw new McpError(ErrorCode.InvalidParams,`Failed to list tasks: ${error instanceof Error?error.message:String(error)}`)}}),this.setRequestHandler(CancelTaskRequestSchema,async(request,extra)=>{try{let task=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task not found: ${request.params.taskId}`);if(isTerminal(task.status))throw new McpError(ErrorCode.InvalidParams,`Cannot cancel task in terminal status: ${task.status}`);await this._taskStore.updateTaskStatus(request.params.taskId,"cancelled","Client cancelled task execution.",extra.sessionId),this._clearTaskQueue(request.params.taskId);let cancelledTask=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!cancelledTask)throw new McpError(ErrorCode.InvalidParams,`Task not found after cancellation: ${request.params.taskId}`);return{_meta:{},...cancelledTask}}catch(error){if(error instanceof McpError)throw error;throw new McpError(ErrorCode.InvalidRequest,`Failed to cancel task: ${error instanceof Error?error.message:String(error)}`)}})}async _oncancel(notification){if(!notification.params.requestId)return;this._requestHandlerAbortControllers.get(notification.params.requestId)?.abort(notification.params.reason)}_setupTimeout(messageId,timeout,maxTotalTimeout,onTimeout,resetTimeoutOnProgress=!1){this._timeoutInfo.set(messageId,{timeoutId:setTimeout(onTimeout,timeout),startTime:Date.now(),timeout,maxTotalTimeout,resetTimeoutOnProgress,onTimeout})}_resetTimeout(messageId){let info=this._timeoutInfo.get(messageId);if(!info)return!1;let totalElapsed=Date.now()-info.startTime;if(info.maxTotalTimeout&&totalElapsed>=info.maxTotalTimeout)throw this._timeoutInfo.delete(messageId),McpError.fromError(ErrorCode.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:info.maxTotalTimeout,totalElapsed});return clearTimeout(info.timeoutId),info.timeoutId=setTimeout(info.onTimeout,info.timeout),!0}_cleanupTimeout(messageId){let info=this._timeoutInfo.get(messageId);if(info)clearTimeout(info.timeoutId),this._timeoutInfo.delete(messageId)}async connect(transport){if(this._transport)throw Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=transport;let _onclose=this.transport?.onclose;this._transport.onclose=()=>{_onclose?.(),this._onclose()};let _onerror=this.transport?.onerror;this._transport.onerror=(error)=>{_onerror?.(error),this._onerror(error)};let _onmessage=this._transport?.onmessage;this._transport.onmessage=(message,extra)=>{if(_onmessage?.(message,extra),isJSONRPCResultResponse(message)||isJSONRPCErrorResponse(message))this._onresponse(message);else if(isJSONRPCRequest(message))this._onrequest(message,extra);else if(isJSONRPCNotification(message))this._onnotification(message);else this._onerror(Error(`Unknown message type: ${JSON.stringify(message)}`))},await this._transport.start()}_onclose(){let responseHandlers=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let info of this._timeoutInfo.values())clearTimeout(info.timeoutId);this._timeoutInfo.clear();for(let controller of this._requestHandlerAbortControllers.values())controller.abort();this._requestHandlerAbortControllers.clear();let error=McpError.fromError(ErrorCode.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let handler of responseHandlers.values())handler(error)}_onerror(error){this.onerror?.(error)}_onnotification(notification){let handler=this._notificationHandlers.get(notification.method)??this.fallbackNotificationHandler;if(handler===void 0)return;Promise.resolve().then(()=>handler(notification)).catch((error)=>this._onerror(Error(`Uncaught error in notification handler: ${error}`)))}_onrequest(request,extra){let handler=this._requestHandlers.get(request.method)??this.fallbackRequestHandler,capturedTransport=this._transport,relatedTaskId=request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId;if(handler===void 0){let errorResponse={jsonrpc:"2.0",id:request.id,error:{code:ErrorCode.MethodNotFound,message:"Method not found"}};if(relatedTaskId&&this._taskMessageQueue)this._enqueueTaskMessage(relatedTaskId,{type:"error",message:errorResponse,timestamp:Date.now()},capturedTransport?.sessionId).catch((error)=>this._onerror(Error(`Failed to enqueue error response: ${error}`)));else capturedTransport?.send(errorResponse).catch((error)=>this._onerror(Error(`Failed to send an error response: ${error}`)));return}let abortController=new AbortController;this._requestHandlerAbortControllers.set(request.id,abortController);let taskCreationParams=isTaskAugmentedRequestParams(request.params)?request.params.task:void 0,taskStore=this._taskStore?this.requestTaskStore(request,capturedTransport?.sessionId):void 0,fullExtra={signal:abortController.signal,sessionId:capturedTransport?.sessionId,_meta:request.params?._meta,sendNotification:async(notification)=>{if(abortController.signal.aborted)return;let notificationOptions={relatedRequestId:request.id};if(relatedTaskId)notificationOptions.relatedTask={taskId:relatedTaskId};await this.notification(notification,notificationOptions)},sendRequest:async(r,resultSchema,options)=>{if(abortController.signal.aborted)throw new McpError(ErrorCode.ConnectionClosed,"Request was cancelled");let requestOptions={...options,relatedRequestId:request.id};if(relatedTaskId&&!requestOptions.relatedTask)requestOptions.relatedTask={taskId:relatedTaskId};let effectiveTaskId=requestOptions.relatedTask?.taskId??relatedTaskId;if(effectiveTaskId&&taskStore)await taskStore.updateTaskStatus(effectiveTaskId,"input_required");return await this.request(r,resultSchema,requestOptions)},authInfo:extra?.authInfo,requestId:request.id,requestInfo:extra?.requestInfo,taskId:relatedTaskId,taskStore,taskRequestedTtl:taskCreationParams?.ttl,closeSSEStream:extra?.closeSSEStream,closeStandaloneSSEStream:extra?.closeStandaloneSSEStream};Promise.resolve().then(()=>{if(taskCreationParams)this.assertTaskHandlerCapability(request.method)}).then(()=>handler(request,fullExtra)).then(async(result)=>{if(abortController.signal.aborted)return;let response={result,jsonrpc:"2.0",id:request.id};if(relatedTaskId&&this._taskMessageQueue)await this._enqueueTaskMessage(relatedTaskId,{type:"response",message:response,timestamp:Date.now()},capturedTransport?.sessionId);else await capturedTransport?.send(response)},async(error)=>{if(abortController.signal.aborted)return;let errorResponse={jsonrpc:"2.0",id:request.id,error:{code:Number.isSafeInteger(error.code)?error.code:ErrorCode.InternalError,message:error.message??"Internal error",...error.data!==void 0&&{data:error.data}}};if(relatedTaskId&&this._taskMessageQueue)await this._enqueueTaskMessage(relatedTaskId,{type:"error",message:errorResponse,timestamp:Date.now()},capturedTransport?.sessionId);else await capturedTransport?.send(errorResponse)}).catch((error)=>this._onerror(Error(`Failed to send response: ${error}`))).finally(()=>{if(this._requestHandlerAbortControllers.get(request.id)===abortController)this._requestHandlerAbortControllers.delete(request.id)})}_onprogress(notification){let{progressToken,...params}=notification.params,messageId=Number(progressToken),handler=this._progressHandlers.get(messageId);if(!handler){this._onerror(Error(`Received a progress notification for an unknown token: ${JSON.stringify(notification)}`));return}let responseHandler=this._responseHandlers.get(messageId),timeoutInfo=this._timeoutInfo.get(messageId);if(timeoutInfo&&responseHandler&&timeoutInfo.resetTimeoutOnProgress)try{this._resetTimeout(messageId)}catch(error){this._responseHandlers.delete(messageId),this._progressHandlers.delete(messageId),this._cleanupTimeout(messageId),responseHandler(error);return}handler(params)}_onresponse(response){let messageId=Number(response.id),resolver=this._requestResolvers.get(messageId);if(resolver){if(this._requestResolvers.delete(messageId),isJSONRPCResultResponse(response))resolver(response);else{let error=new McpError(response.error.code,response.error.message,response.error.data);resolver(error)}return}let handler=this._responseHandlers.get(messageId);if(handler===void 0){this._onerror(Error(`Received a response for an unknown message ID: ${JSON.stringify(response)}`));return}this._responseHandlers.delete(messageId),this._cleanupTimeout(messageId);let isTaskResponse=!1;if(isJSONRPCResultResponse(response)&&response.result&&typeof response.result==="object"){let result=response.result;if(result.task&&typeof result.task==="object"){let task=result.task;if(typeof task.taskId==="string")isTaskResponse=!0,this._taskProgressTokens.set(task.taskId,messageId)}}if(!isTaskResponse)this._progressHandlers.delete(messageId);if(isJSONRPCResultResponse(response))handler(response);else{let error=McpError.fromError(response.error.code,response.error.message,response.error.data);handler(error)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(request,resultSchema,options){let{task}=options??{};if(!task){try{yield{type:"result",result:await this.request(request,resultSchema,options)}}catch(error){yield{type:"error",error:error instanceof McpError?error:new McpError(ErrorCode.InternalError,String(error))}}return}let taskId;try{let createResult=await this.request(request,CreateTaskResultSchema,options);if(createResult.task)taskId=createResult.task.taskId,yield{type:"taskCreated",task:createResult.task};else throw new McpError(ErrorCode.InternalError,"Task creation did not return a task");while(!0){let task=await this.getTask({taskId},options);if(yield{type:"taskStatus",task},isTerminal(task.status)){if(task.status==="completed")yield{type:"result",result:await this.getTaskResult({taskId},resultSchema,options)};else if(task.status==="failed")yield{type:"error",error:new McpError(ErrorCode.InternalError,`Task ${taskId} failed`)};else if(task.status==="cancelled")yield{type:"error",error:new McpError(ErrorCode.InternalError,`Task ${taskId} was cancelled`)};return}if(task.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId},resultSchema,options)};return}let pollInterval=task.pollInterval??this._options?.defaultTaskPollInterval??1000;await new Promise((resolve)=>setTimeout(resolve,pollInterval)),options?.signal?.throwIfAborted()}}catch(error){yield{type:"error",error:error instanceof McpError?error:new McpError(ErrorCode.InternalError,String(error))}}}request(request,resultSchema,options){let{relatedRequestId,resumptionToken,onresumptiontoken,task,relatedTask}=options??{};return new Promise((resolve,reject)=>{let earlyReject=(error)=>{reject(error)};if(!this._transport){earlyReject(Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{if(this.assertCapabilityForMethod(request.method),task)this.assertTaskCapability(request.method)}catch(e){earlyReject(e);return}options?.signal?.throwIfAborted();let messageId=this._requestMessageId++,jsonrpcRequest={...request,jsonrpc:"2.0",id:messageId};if(options?.onprogress)this._progressHandlers.set(messageId,options.onprogress),jsonrpcRequest.params={...request.params,_meta:{...request.params?._meta||{},progressToken:messageId}};if(task)jsonrpcRequest.params={...jsonrpcRequest.params,task};if(relatedTask)jsonrpcRequest.params={...jsonrpcRequest.params,_meta:{...jsonrpcRequest.params?._meta||{},[RELATED_TASK_META_KEY]:relatedTask}};let cancel=(reason)=>{this._responseHandlers.delete(messageId),this._progressHandlers.delete(messageId),this._cleanupTimeout(messageId),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:messageId,reason:String(reason)}},{relatedRequestId,resumptionToken,onresumptiontoken}).catch((error)=>this._onerror(Error(`Failed to send cancellation: ${error}`)));let error=reason instanceof McpError?reason:new McpError(ErrorCode.RequestTimeout,String(reason));reject(error)};this._responseHandlers.set(messageId,(response)=>{if(options?.signal?.aborted)return;if(response instanceof Error)return reject(response);try{let parseResult=safeParse2(resultSchema,response.result);if(!parseResult.success)reject(parseResult.error);else resolve(parseResult.data)}catch(error){reject(error)}}),options?.signal?.addEventListener("abort",()=>{cancel(options?.signal?.reason)});let timeout=options?.timeout??DEFAULT_REQUEST_TIMEOUT_MSEC,timeoutHandler=()=>cancel(McpError.fromError(ErrorCode.RequestTimeout,"Request timed out",{timeout}));this._setupTimeout(messageId,timeout,options?.maxTotalTimeout,timeoutHandler,options?.resetTimeoutOnProgress??!1);let relatedTaskId=relatedTask?.taskId;if(relatedTaskId){let responseResolver=(response)=>{let handler=this._responseHandlers.get(messageId);if(handler)handler(response);else this._onerror(Error(`Response handler missing for side-channeled request ${messageId}`))};this._requestResolvers.set(messageId,responseResolver),this._enqueueTaskMessage(relatedTaskId,{type:"request",message:jsonrpcRequest,timestamp:Date.now()}).catch((error)=>{this._cleanupTimeout(messageId),reject(error)})}else this._transport.send(jsonrpcRequest,{relatedRequestId,resumptionToken,onresumptiontoken}).catch((error)=>{this._cleanupTimeout(messageId),reject(error)})})}async getTask(params,options){return this.request({method:"tasks/get",params},GetTaskResultSchema,options)}async getTaskResult(params,resultSchema,options){return this.request({method:"tasks/result",params},resultSchema,options)}async listTasks(params,options){return this.request({method:"tasks/list",params},ListTasksResultSchema,options)}async cancelTask(params,options){return this.request({method:"tasks/cancel",params},CancelTaskResultSchema,options)}async notification(notification,options){if(!this._transport)throw Error("Not connected");this.assertNotificationCapability(notification.method);let relatedTaskId=options?.relatedTask?.taskId;if(relatedTaskId){let jsonrpcNotification={...notification,jsonrpc:"2.0",params:{...notification.params,_meta:{...notification.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}};await this._enqueueTaskMessage(relatedTaskId,{type:"notification",message:jsonrpcNotification,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(notification.method)&&!notification.params&&!options?.relatedRequestId&&!options?.relatedTask){if(this._pendingDebouncedNotifications.has(notification.method))return;this._pendingDebouncedNotifications.add(notification.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(notification.method),!this._transport)return;let jsonrpcNotification={...notification,jsonrpc:"2.0"};if(options?.relatedTask)jsonrpcNotification={...jsonrpcNotification,params:{...jsonrpcNotification.params,_meta:{...jsonrpcNotification.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}};this._transport?.send(jsonrpcNotification,options).catch((error)=>this._onerror(error))});return}let jsonrpcNotification={...notification,jsonrpc:"2.0"};if(options?.relatedTask)jsonrpcNotification={...jsonrpcNotification,params:{...jsonrpcNotification.params,_meta:{...jsonrpcNotification.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}};await this._transport.send(jsonrpcNotification,options)}setRequestHandler(requestSchema,handler){let method=getMethodLiteral(requestSchema);this.assertRequestHandlerCapability(method),this._requestHandlers.set(method,(request,extra)=>{let parsed=parseWithCompat(requestSchema,request);return Promise.resolve(handler(parsed,extra))})}removeRequestHandler(method){this._requestHandlers.delete(method)}assertCanSetRequestHandler(method){if(this._requestHandlers.has(method))throw Error(`A request handler for ${method} already exists, which would be overridden`)}setNotificationHandler(notificationSchema,handler){let method=getMethodLiteral(notificationSchema);this._notificationHandlers.set(method,(notification)=>{let parsed=parseWithCompat(notificationSchema,notification);return Promise.resolve(handler(parsed))})}removeNotificationHandler(method){this._notificationHandlers.delete(method)}_cleanupTaskProgressHandler(taskId){let progressToken=this._taskProgressTokens.get(taskId);if(progressToken!==void 0)this._progressHandlers.delete(progressToken),this._taskProgressTokens.delete(taskId)}async _enqueueTaskMessage(taskId,message,sessionId){if(!this._taskStore||!this._taskMessageQueue)throw Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let maxQueueSize=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(taskId,message,sessionId,maxQueueSize)}async _clearTaskQueue(taskId,sessionId){if(this._taskMessageQueue){let messages=await this._taskMessageQueue.dequeueAll(taskId,sessionId);for(let message of messages)if(message.type==="request"&&isJSONRPCRequest(message.message)){let requestId=message.message.id,resolver=this._requestResolvers.get(requestId);if(resolver)resolver(new McpError(ErrorCode.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(requestId);else this._onerror(Error(`Resolver missing for request ${requestId} during task ${taskId} cleanup`))}}}async _waitForTaskUpdate(taskId,signal){let interval=this._options?.defaultTaskPollInterval??1000;try{let task=await this._taskStore?.getTask(taskId);if(task?.pollInterval)interval=task.pollInterval}catch{}return new Promise((resolve,reject)=>{if(signal.aborted){reject(new McpError(ErrorCode.InvalidRequest,"Request cancelled"));return}let timeoutId=setTimeout(resolve,interval);signal.addEventListener("abort",()=>{clearTimeout(timeoutId),reject(new McpError(ErrorCode.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(request,sessionId){let taskStore=this._taskStore;if(!taskStore)throw Error("No task store configured");return{createTask:async(taskParams)=>{if(!request)throw Error("No request provided");return await taskStore.createTask(taskParams,request.id,{method:request.method,params:request.params},sessionId)},getTask:async(taskId)=>{let task=await taskStore.getTask(taskId,sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,"Failed to retrieve task: Task not found");return task},storeTaskResult:async(taskId,status,result)=>{await taskStore.storeTaskResult(taskId,status,result,sessionId);let task=await taskStore.getTask(taskId,sessionId);if(task){let notification=TaskStatusNotificationSchema.parse({method:"notifications/tasks/status",params:task});if(await this.notification(notification),isTerminal(task.status))this._cleanupTaskProgressHandler(taskId)}},getTaskResult:(taskId)=>taskStore.getTaskResult(taskId,sessionId),updateTaskStatus:async(taskId,status,statusMessage)=>{let task=await taskStore.getTask(taskId,sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task "${taskId}" not found - it may have been cleaned up`);if(isTerminal(task.status))throw new McpError(ErrorCode.InvalidParams,`Cannot update task "${taskId}" from terminal status "${task.status}" to "${status}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await taskStore.updateTaskStatus(taskId,status,statusMessage,sessionId);let updatedTask=await taskStore.getTask(taskId,sessionId);if(updatedTask){let notification=TaskStatusNotificationSchema.parse({method:"notifications/tasks/status",params:updatedTask});if(await this.notification(notification),isTerminal(updatedTask.status))this._cleanupTaskProgressHandler(taskId)}},listTasks:(cursor)=>taskStore.listTasks(cursor,sessionId)}}}function isPlainObject(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)}function mergeCapabilities(base,additional){let result={...base};for(let key in additional){let k=key,addValue=additional[k];if(addValue===void 0)continue;let baseValue=result[k];if(isPlainObject(baseValue)&&isPlainObject(addValue))result[k]={...baseValue,...addValue};else result[k]=addValue}return result}var import_ajv=__toESM(require_ajv(),1),import_ajv_formats=__toESM(require_dist(),1);function createDefaultAjvInstance(){let ajv=new import_ajv.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return import_ajv_formats.default(ajv),ajv}class AjvJsonSchemaValidator{constructor(ajv){this._ajv=ajv??createDefaultAjvInstance()}getValidator(schema){let ajvValidator="$id"in schema&&typeof schema.$id==="string"?this._ajv.getSchema(schema.$id)??this._ajv.compile(schema):this._ajv.compile(schema);return(input)=>{if(ajvValidator(input))return{valid:!0,data:input,errorMessage:void 0};else return{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(ajvValidator.errors)}}}}class ExperimentalServerTasks{constructor(_server){this._server=_server}requestStream(request,resultSchema,options){return this._server.requestStream(request,resultSchema,options)}createMessageStream(params,options){let clientCapabilities=this._server.getClientCapabilities();if((params.tools||params.toolChoice)&&!clientCapabilities?.sampling?.tools)throw Error("Client does not support sampling tools capability.");if(params.messages.length>0){let lastMessage=params.messages[params.messages.length-1],lastContent=Array.isArray(lastMessage.content)?lastMessage.content:[lastMessage.content],hasToolResults=lastContent.some((c)=>c.type==="tool_result"),previousMessage=params.messages.length>1?params.messages[params.messages.length-2]:void 0,previousContent=previousMessage?Array.isArray(previousMessage.content)?previousMessage.content:[previousMessage.content]:[],hasPreviousToolUse=previousContent.some((c)=>c.type==="tool_use");if(hasToolResults){if(lastContent.some((c)=>c.type!=="tool_result"))throw Error("The last message must contain only tool_result content if any is present");if(!hasPreviousToolUse)throw Error("tool_result blocks are not matching any tool_use from the previous message")}if(hasPreviousToolUse){let toolUseIds=new Set(previousContent.filter((c)=>c.type==="tool_use").map((c)=>c.id)),toolResultIds=new Set(lastContent.filter((c)=>c.type==="tool_result").map((c)=>c.toolUseId));if(toolUseIds.size!==toolResultIds.size||![...toolUseIds].every((id)=>toolResultIds.has(id)))throw Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params},CreateMessageResultSchema,options)}elicitInputStream(params,options){let clientCapabilities=this._server.getClientCapabilities(),mode=params.mode??"form";switch(mode){case"url":{if(!clientCapabilities?.elicitation?.url)throw Error("Client does not support url elicitation.");break}case"form":{if(!clientCapabilities?.elicitation?.form)throw Error("Client does not support form elicitation.");break}}let normalizedParams=mode==="form"&¶ms.mode===void 0?{...params,mode:"form"}:params;return this.requestStream({method:"elicitation/create",params:normalizedParams},ElicitResultSchema,options)}async getTask(taskId,options){return this._server.getTask({taskId},options)}async getTaskResult(taskId,resultSchema,options){return this._server.getTaskResult({taskId},resultSchema,options)}async listTasks(cursor,options){return this._server.listTasks(cursor?{cursor}:void 0,options)}async cancelTask(taskId,options){return this._server.cancelTask({taskId},options)}}function assertToolsCallTaskCapability(requests,method,entityName){if(!requests)throw Error(`${entityName} does not support task creation (required for ${method})`);switch(method){case"tools/call":if(!requests.tools?.call)throw Error(`${entityName} does not support task creation for tools/call (required for ${method})`);break;default:break}}function assertClientRequestTaskCapability(requests,method,entityName){if(!requests)throw Error(`${entityName} does not support task creation (required for ${method})`);switch(method){case"sampling/createMessage":if(!requests.sampling?.createMessage)throw Error(`${entityName} does not support task creation for sampling/createMessage (required for ${method})`);break;case"elicitation/create":if(!requests.elicitation?.create)throw Error(`${entityName} does not support task creation for elicitation/create (required for ${method})`);break;default:break}}class Server extends Protocol{constructor(_serverInfo,options){super(options);if(this._serverInfo=_serverInfo,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(LoggingLevelSchema.options.map((level,index)=>[level,index])),this.isMessageIgnored=(level,sessionId)=>{let currentLevel=this._loggingLevels.get(sessionId);return currentLevel?this.LOG_LEVEL_SEVERITY.get(level)<this.LOG_LEVEL_SEVERITY.get(currentLevel):!1},this._capabilities=options?.capabilities??{},this._instructions=options?.instructions,this._jsonSchemaValidator=options?.jsonSchemaValidator??new AjvJsonSchemaValidator,this.setRequestHandler(InitializeRequestSchema,(request)=>this._oninitialize(request)),this.setNotificationHandler(InitializedNotificationSchema,()=>this.oninitialized?.()),this._capabilities.logging)this.setRequestHandler(SetLevelRequestSchema,async(request,extra)=>{let transportSessionId=extra.sessionId||extra.requestInfo?.headers["mcp-session-id"]||void 0,{level}=request.params,parseResult=LoggingLevelSchema.safeParse(level);if(parseResult.success)this._loggingLevels.set(transportSessionId,parseResult.data);return{}})}get experimental(){if(!this._experimental)this._experimental={tasks:new ExperimentalServerTasks(this)};return this._experimental}registerCapabilities(capabilities){if(this.transport)throw Error("Cannot register capabilities after connecting to transport");this._capabilities=mergeCapabilities(this._capabilities,capabilities)}setRequestHandler(requestSchema,handler){let methodSchema=getObjectShape(requestSchema)?.method;if(!methodSchema)throw Error("Schema is missing a method literal");let methodValue=getLiteralValue(methodSchema);if(typeof methodValue!=="string")throw Error("Schema method literal must be a string");if(methodValue==="tools/call"){let wrappedHandler=async(request,extra)=>{let validatedRequest=safeParse2(CallToolRequestSchema,request);if(!validatedRequest.success){let errorMessage=validatedRequest.error instanceof Error?validatedRequest.error.message:String(validatedRequest.error);throw new McpError(ErrorCode.InvalidParams,`Invalid tools/call request: ${errorMessage}`)}let{params}=validatedRequest.data,result=await Promise.resolve(handler(request,extra));if(params.task){let taskValidationResult=safeParse2(CreateTaskResultSchema,result);if(!taskValidationResult.success){let errorMessage=taskValidationResult.error instanceof Error?taskValidationResult.error.message:String(taskValidationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid task creation result: ${errorMessage}`)}return taskValidationResult.data}let validationResult=safeParse2(CallToolResultSchema,result);if(!validationResult.success){let errorMessage=validationResult.error instanceof Error?validationResult.error.message:String(validationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid tools/call result: ${errorMessage}`)}return validationResult.data};return super.setRequestHandler(requestSchema,wrappedHandler)}return super.setRequestHandler(requestSchema,handler)}assertCapabilityForMethod(method){switch(method){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw Error(`Client does not support sampling (required for ${method})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw Error(`Client does not support elicitation (required for ${method})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw Error(`Client does not support listing roots (required for ${method})`);break;case"ping":break}}assertNotificationCapability(method){switch(method){case"notifications/message":if(!this._capabilities.logging)throw Error(`Server does not support logging (required for ${method})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw Error(`Server does not support notifying about resources (required for ${method})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw Error(`Server does not support notifying of tool list changes (required for ${method})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw Error(`Server does not support notifying of prompt list changes (required for ${method})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw Error(`Client does not support URL elicitation (required for ${method})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(method){if(!this._capabilities)return;switch(method){case"completion/complete":if(!this._capabilities.completions)throw Error(`Server does not support completions (required for ${method})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw Error(`Server does not support logging (required for ${method})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw Error(`Server does not support prompts (required for ${method})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw Error(`Server does not support resources (required for ${method})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw Error(`Server does not support tools (required for ${method})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw Error(`Server does not support tasks capability (required for ${method})`);break;case"ping":case"initialize":break}}assertTaskCapability(method){assertClientRequestTaskCapability(this._clientCapabilities?.tasks?.requests,method,"Client")}assertTaskHandlerCapability(method){if(!this._capabilities)return;assertToolsCallTaskCapability(this._capabilities.tasks?.requests,method,"Server")}async _oninitialize(request){let requestedVersion=request.params.protocolVersion;return this._clientCapabilities=request.params.capabilities,this._clientVersion=request.params.clientInfo,{protocolVersion:SUPPORTED_PROTOCOL_VERSIONS.includes(requestedVersion)?requestedVersion:LATEST_PROTOCOL_VERSION,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},EmptyResultSchema)}async createMessage(params,options){if(params.tools||params.toolChoice){if(!this._clientCapabilities?.sampling?.tools)throw Error("Client does not support sampling tools capability.")}if(params.messages.length>0){let lastMessage=params.messages[params.messages.length-1],lastContent=Array.isArray(lastMessage.content)?lastMessage.content:[lastMessage.content],hasToolResults=lastContent.some((c)=>c.type==="tool_result"),previousMessage=params.messages.length>1?params.messages[params.messages.length-2]:void 0,previousContent=previousMessage?Array.isArray(previousMessage.content)?previousMessage.content:[previousMessage.content]:[],hasPreviousToolUse=previousContent.some((c)=>c.type==="tool_use");if(hasToolResults){if(lastContent.some((c)=>c.type!=="tool_result"))throw Error("The last message must contain only tool_result content if any is present");if(!hasPreviousToolUse)throw Error("tool_result blocks are not matching any tool_use from the previous message")}if(hasPreviousToolUse){let toolUseIds=new Set(previousContent.filter((c)=>c.type==="tool_use").map((c)=>c.id)),toolResultIds=new Set(lastContent.filter((c)=>c.type==="tool_result").map((c)=>c.toolUseId));if(toolUseIds.size!==toolResultIds.size||![...toolUseIds].every((id)=>toolResultIds.has(id)))throw Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}if(params.tools)return this.request({method:"sampling/createMessage",params},CreateMessageResultWithToolsSchema,options);return this.request({method:"sampling/createMessage",params},CreateMessageResultSchema,options)}async elicitInput(params,options){switch(params.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw Error("Client does not support url elicitation.");let urlParams=params;return this.request({method:"elicitation/create",params:urlParams},ElicitResultSchema,options)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw Error("Client does not support form elicitation.");let formParams=params.mode==="form"?params:{...params,mode:"form"},result=await this.request({method:"elicitation/create",params:formParams},ElicitResultSchema,options);if(result.action==="accept"&&result.content&&formParams.requestedSchema)try{let validationResult=this._jsonSchemaValidator.getValidator(formParams.requestedSchema)(result.content);if(!validationResult.valid)throw new McpError(ErrorCode.InvalidParams,`Elicitation response content does not match requested schema: ${validationResult.errorMessage}`)}catch(error){if(error instanceof McpError)throw error;throw new McpError(ErrorCode.InternalError,`Error validating elicitation response: ${error instanceof Error?error.message:String(error)}`)}return result}}}createElicitationCompletionNotifier(elicitationId,options){if(!this._clientCapabilities?.elicitation?.url)throw Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId}},options)}async listRoots(params,options){return this.request({method:"roots/list",params},ListRootsResultSchema,options)}async sendLoggingMessage(params,sessionId){if(this._capabilities.logging){if(!this.isMessageIgnored(params.level,sessionId))return this.notification({method:"notifications/message",params})}}async sendResourceUpdated(params){return this.notification({method:"notifications/resources/updated",params})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}}var COMPLETABLE_SYMBOL=Symbol.for("mcp.completable");function isCompletable(schema){return!!schema&&typeof schema==="object"&&COMPLETABLE_SYMBOL in schema}function getCompleter(schema){return schema[COMPLETABLE_SYMBOL]?.complete}var McpZodTypeKind;(function(McpZodTypeKind){McpZodTypeKind.Completable="McpCompletable"})(McpZodTypeKind||(McpZodTypeKind={}));var TOOL_NAME_REGEX=/^[A-Za-z0-9._-]{1,128}$/;function validateToolName(name){let warnings=[];if(name.length===0)return{isValid:!1,warnings:["Tool name cannot be empty"]};if(name.length>128)return{isValid:!1,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${name.length})`]};if(name.includes(" "))warnings.push("Tool name contains spaces, which may cause parsing issues");if(name.includes(","))warnings.push("Tool name contains commas, which may cause parsing issues");if(name.startsWith("-")||name.endsWith("-"))warnings.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts");if(name.startsWith(".")||name.endsWith("."))warnings.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts");if(!TOOL_NAME_REGEX.test(name)){let invalidChars=name.split("").filter((char)=>!/[A-Za-z0-9._-]/.test(char)).filter((char,index,arr)=>arr.indexOf(char)===index);return warnings.push(`Tool name contains invalid characters: ${invalidChars.map((c)=>`"${c}"`).join(", ")}`,"Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"),{isValid:!1,warnings}}return{isValid:!0,warnings}}function issueToolNameWarning(name,warnings){if(warnings.length>0){console.warn(`Tool name validation warning for "${name}":`);for(let warning of warnings)console.warn(` - ${warning}`);console.warn("Tool registration will proceed, but this may cause compatibility issues."),console.warn("Consider updating the tool name to conform to the MCP tool naming standard."),console.warn("See SEP: Specify Format for Tool Names (https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986) for more details.")}}function validateAndWarnToolName(name){let result=validateToolName(name);return issueToolNameWarning(name,result.warnings),result.isValid}class ExperimentalMcpServerTasks{constructor(_mcpServer){this._mcpServer=_mcpServer}registerToolTask(name,config,handler){let execution={taskSupport:"required",...config.execution};if(execution.taskSupport==="forbidden")throw Error(`Cannot register task-based tool '${name}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(name,config.title,config.description,config.inputSchema,config.outputSchema,config.annotations,execution,config._meta,handler)}}class McpServer{constructor(serverInfo,options){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new Server(serverInfo,options)}get experimental(){if(!this._experimental)this._experimental={tasks:new ExperimentalMcpServerTasks(this)};return this._experimental}async connect(transport){return await this.server.connect(transport)}async close(){await this.server.close()}setToolRequestHandlers(){if(this._toolHandlersInitialized)return;this.server.assertCanSetRequestHandler(getMethodValue(ListToolsRequestSchema)),this.server.assertCanSetRequestHandler(getMethodValue(CallToolRequestSchema)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(ListToolsRequestSchema,()=>({tools:Object.entries(this._registeredTools).filter(([,tool])=>tool.enabled).map(([name,tool])=>{let toolDefinition={name,title:tool.title,description:tool.description,inputSchema:(()=>{let obj=normalizeObjectSchema(tool.inputSchema);return obj?toJsonSchemaCompat(obj,{strictUnions:!0,pipeStrategy:"input"}):EMPTY_OBJECT_JSON_SCHEMA})(),annotations:tool.annotations,execution:tool.execution,_meta:tool._meta};if(tool.outputSchema){let obj=normalizeObjectSchema(tool.outputSchema);if(obj)toolDefinition.outputSchema=toJsonSchemaCompat(obj,{strictUnions:!0,pipeStrategy:"output"})}return toolDefinition})})),this.server.setRequestHandler(CallToolRequestSchema,async(request,extra)=>{try{let tool=this._registeredTools[request.params.name];if(!tool)throw new McpError(ErrorCode.InvalidParams,`Tool ${request.params.name} not found`);if(!tool.enabled)throw new McpError(ErrorCode.InvalidParams,`Tool ${request.params.name} disabled`);let isTaskRequest=!!request.params.task,taskSupport=tool.execution?.taskSupport,isTaskHandler="createTask"in tool.handler;if((taskSupport==="required"||taskSupport==="optional")&&!isTaskHandler)throw new McpError(ErrorCode.InternalError,`Tool ${request.params.name} has taskSupport '${taskSupport}' but was not registered with registerToolTask`);if(taskSupport==="required"&&!isTaskRequest)throw new McpError(ErrorCode.MethodNotFound,`Tool ${request.params.name} requires task augmentation (taskSupport: 'required')`);if(taskSupport==="optional"&&!isTaskRequest&&isTaskHandler)return await this.handleAutomaticTaskPolling(tool,request,extra);let args=await this.validateToolInput(tool,request.params.arguments,request.params.name),result=await this.executeToolHandler(tool,args,extra);if(isTaskRequest)return result;return await this.validateToolOutput(tool,result,request.params.name),result}catch(error){if(error instanceof McpError){if(error.code===ErrorCode.UrlElicitationRequired)throw error}return this.createToolError(error instanceof Error?error.message:String(error))}}),this._toolHandlersInitialized=!0}createToolError(errorMessage){return{content:[{type:"text",text:errorMessage}],isError:!0}}async validateToolInput(tool,args,toolName){if(!tool.inputSchema)return;let schemaToParse=normalizeObjectSchema(tool.inputSchema)??tool.inputSchema,parseResult=await safeParseAsync2(schemaToParse,args);if(!parseResult.success){let error="error"in parseResult?parseResult.error:"Unknown error",errorMessage=getParseErrorMessage(error);throw new McpError(ErrorCode.InvalidParams,`Input validation error: Invalid arguments for tool ${toolName}: ${errorMessage}`)}return parseResult.data}async validateToolOutput(tool,result,toolName){if(!tool.outputSchema)return;if(!("content"in result))return;if(result.isError)return;if(!result.structuredContent)throw new McpError(ErrorCode.InvalidParams,`Output validation error: Tool ${toolName} has an output schema but no structured content was provided`);let outputObj=normalizeObjectSchema(tool.outputSchema),parseResult=await safeParseAsync2(outputObj,result.structuredContent);if(!parseResult.success){let error="error"in parseResult?parseResult.error:"Unknown error",errorMessage=getParseErrorMessage(error);throw new McpError(ErrorCode.InvalidParams,`Output validation error: Invalid structured content for tool ${toolName}: ${errorMessage}`)}}async executeToolHandler(tool,args,extra){let handler=tool.handler;if("createTask"in handler){if(!extra.taskStore)throw Error("No task store provided.");let taskExtra={...extra,taskStore:extra.taskStore};if(tool.inputSchema)return await Promise.resolve(handler.createTask(args,taskExtra));else return await Promise.resolve(handler.createTask(taskExtra))}if(tool.inputSchema)return await Promise.resolve(handler(args,extra));else return await Promise.resolve(handler(extra))}async handleAutomaticTaskPolling(tool,request,extra){if(!extra.taskStore)throw Error("No task store provided for task-capable tool.");let args=await this.validateToolInput(tool,request.params.arguments,request.params.name),handler=tool.handler,taskExtra={...extra,taskStore:extra.taskStore},createTaskResult=args?await Promise.resolve(handler.createTask(args,taskExtra)):await Promise.resolve(handler.createTask(taskExtra)),taskId=createTaskResult.task.taskId,task=createTaskResult.task,pollInterval=task.pollInterval??5000;while(task.status!=="completed"&&task.status!=="failed"&&task.status!=="cancelled"){await new Promise((resolve)=>setTimeout(resolve,pollInterval));let updatedTask=await extra.taskStore.getTask(taskId);if(!updatedTask)throw new McpError(ErrorCode.InternalError,`Task ${taskId} not found during polling`);task=updatedTask}return await extra.taskStore.getTaskResult(taskId)}setCompletionRequestHandler(){if(this._completionHandlerInitialized)return;this.server.assertCanSetRequestHandler(getMethodValue(CompleteRequestSchema)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(CompleteRequestSchema,async(request)=>{switch(request.params.ref.type){case"ref/prompt":return assertCompleteRequestPrompt(request),this.handlePromptCompletion(request,request.params.ref);case"ref/resource":return assertCompleteRequestResourceTemplate(request),this.handleResourceCompletion(request,request.params.ref);default:throw new McpError(ErrorCode.InvalidParams,`Invalid completion reference: ${request.params.ref}`)}}),this._completionHandlerInitialized=!0}async handlePromptCompletion(request,ref){let prompt=this._registeredPrompts[ref.name];if(!prompt)throw new McpError(ErrorCode.InvalidParams,`Prompt ${ref.name} not found`);if(!prompt.enabled)throw new McpError(ErrorCode.InvalidParams,`Prompt ${ref.name} disabled`);if(!prompt.argsSchema)return EMPTY_COMPLETION_RESULT;let field=getObjectShape(prompt.argsSchema)?.[request.params.argument.name];if(!isCompletable(field))return EMPTY_COMPLETION_RESULT;let completer=getCompleter(field);if(!completer)return EMPTY_COMPLETION_RESULT;let suggestions=await completer(request.params.argument.value,request.params.context);return createCompletionResult(suggestions)}async handleResourceCompletion(request,ref){let template=Object.values(this._registeredResourceTemplates).find((t)=>t.resourceTemplate.uriTemplate.toString()===ref.uri);if(!template){if(this._registeredResources[ref.uri])return EMPTY_COMPLETION_RESULT;throw new McpError(ErrorCode.InvalidParams,`Resource template ${request.params.ref.uri} not found`)}let completer=template.resourceTemplate.completeCallback(request.params.argument.name);if(!completer)return EMPTY_COMPLETION_RESULT;let suggestions=await completer(request.params.argument.value,request.params.context);return createCompletionResult(suggestions)}setResourceRequestHandlers(){if(this._resourceHandlersInitialized)return;this.server.assertCanSetRequestHandler(getMethodValue(ListResourcesRequestSchema)),this.server.assertCanSetRequestHandler(getMethodValue(ListResourceTemplatesRequestSchema)),this.server.assertCanSetRequestHandler(getMethodValue(ReadResourceRequestSchema)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(ListResourcesRequestSchema,async(request,extra)=>{let resources=Object.entries(this._registeredResources).filter(([_,resource])=>resource.enabled).map(([uri,resource])=>({uri,name:resource.name,...resource.metadata})),templateResources=[];for(let template of Object.values(this._registeredResourceTemplates)){if(!template.resourceTemplate.listCallback)continue;let result=await template.resourceTemplate.listCallback(extra);for(let resource of result.resources)templateResources.push({...template.metadata,...resource})}return{resources:[...resources,...templateResources]}}),this.server.setRequestHandler(ListResourceTemplatesRequestSchema,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([name,template])=>({name,uriTemplate:template.resourceTemplate.uriTemplate.toString(),...template.metadata}))})),this.server.setRequestHandler(ReadResourceRequestSchema,async(request,extra)=>{let uri=new URL(request.params.uri),resource=this._registeredResources[uri.toString()];if(resource){if(!resource.enabled)throw new McpError(ErrorCode.InvalidParams,`Resource ${uri} disabled`);return resource.readCallback(uri,extra)}for(let template of Object.values(this._registeredResourceTemplates)){let variables=template.resourceTemplate.uriTemplate.match(uri.toString());if(variables)return template.readCallback(uri,variables,extra)}throw new McpError(ErrorCode.InvalidParams,`Resource ${uri} not found`)}),this._resourceHandlersInitialized=!0}setPromptRequestHandlers(){if(this._promptHandlersInitialized)return;this.server.assertCanSetRequestHandler(getMethodValue(ListPromptsRequestSchema)),this.server.assertCanSetRequestHandler(getMethodValue(GetPromptRequestSchema)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(ListPromptsRequestSchema,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,prompt])=>prompt.enabled).map(([name,prompt])=>({name,title:prompt.title,description:prompt.description,arguments:prompt.argsSchema?promptArgumentsFromSchema(prompt.argsSchema):void 0}))})),this.server.setRequestHandler(GetPromptRequestSchema,async(request,extra)=>{let prompt=this._registeredPrompts[request.params.name];if(!prompt)throw new McpError(ErrorCode.InvalidParams,`Prompt ${request.params.name} not found`);if(!prompt.enabled)throw new McpError(ErrorCode.InvalidParams,`Prompt ${request.params.name} disabled`);if(prompt.argsSchema){let argsObj=normalizeObjectSchema(prompt.argsSchema),parseResult=await safeParseAsync2(argsObj,request.params.arguments);if(!parseResult.success){let error="error"in parseResult?parseResult.error:"Unknown error",errorMessage=getParseErrorMessage(error);throw new McpError(ErrorCode.InvalidParams,`Invalid arguments for prompt ${request.params.name}: ${errorMessage}`)}let args=parseResult.data,cb=prompt.callback;return await Promise.resolve(cb(args,extra))}else{let cb=prompt.callback;return await Promise.resolve(cb(extra))}}),this._promptHandlersInitialized=!0}resource(name,uriOrTemplate,...rest){let metadata;if(typeof rest[0]==="object")metadata=rest.shift();let readCallback=rest[0];if(typeof uriOrTemplate==="string"){if(this._registeredResources[uriOrTemplate])throw Error(`Resource ${uriOrTemplate} is already registered`);let registeredResource=this._createRegisteredResource(name,void 0,uriOrTemplate,metadata,readCallback);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),registeredResource}else{if(this._registeredResourceTemplates[name])throw Error(`Resource template ${name} is already registered`);let registeredResourceTemplate=this._createRegisteredResourceTemplate(name,void 0,uriOrTemplate,metadata,readCallback);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),registeredResourceTemplate}}registerResource(name,uriOrTemplate,config,readCallback){if(typeof uriOrTemplate==="string"){if(this._registeredResources[uriOrTemplate])throw Error(`Resource ${uriOrTemplate} is already registered`);let registeredResource=this._createRegisteredResource(name,config.title,uriOrTemplate,config,readCallback);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),registeredResource}else{if(this._registeredResourceTemplates[name])throw Error(`Resource template ${name} is already registered`);let registeredResourceTemplate=this._createRegisteredResourceTemplate(name,config.title,uriOrTemplate,config,readCallback);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),registeredResourceTemplate}}_createRegisteredResource(name,title,uri,metadata,readCallback){let registeredResource={name,title,metadata,readCallback,enabled:!0,disable:()=>registeredResource.update({enabled:!1}),enable:()=>registeredResource.update({enabled:!0}),remove:()=>registeredResource.update({uri:null}),update:(updates)=>{if(typeof updates.uri<"u"&&updates.uri!==uri){if(delete this._registeredResources[uri],updates.uri)this._registeredResources[updates.uri]=registeredResource}if(typeof updates.name<"u")registeredResource.name=updates.name;if(typeof updates.title<"u")registeredResource.title=updates.title;if(typeof updates.metadata<"u")registeredResource.metadata=updates.metadata;if(typeof updates.callback<"u")registeredResource.readCallback=updates.callback;if(typeof updates.enabled<"u")registeredResource.enabled=updates.enabled;this.sendResourceListChanged()}};return this._registeredResources[uri]=registeredResource,registeredResource}_createRegisteredResourceTemplate(name,title,template,metadata,readCallback){let registeredResourceTemplate={resourceTemplate:template,title,metadata,readCallback,enabled:!0,disable:()=>registeredResourceTemplate.update({enabled:!1}),enable:()=>registeredResourceTemplate.update({enabled:!0}),remove:()=>registeredResourceTemplate.update({name:null}),update:(updates)=>{if(typeof updates.name<"u"&&updates.name!==name){if(delete this._registeredResourceTemplates[name],updates.name)this._registeredResourceTemplates[updates.name]=registeredResourceTemplate}if(typeof updates.title<"u")registeredResourceTemplate.title=updates.title;if(typeof updates.template<"u")registeredResourceTemplate.resourceTemplate=updates.template;if(typeof updates.metadata<"u")registeredResourceTemplate.metadata=updates.metadata;if(typeof updates.callback<"u")registeredResourceTemplate.readCallback=updates.callback;if(typeof updates.enabled<"u")registeredResourceTemplate.enabled=updates.enabled;this.sendResourceListChanged()}};this._registeredResourceTemplates[name]=registeredResourceTemplate;let variableNames=template.uriTemplate.variableNames;if(Array.isArray(variableNames)&&variableNames.some((v)=>!!template.completeCallback(v)))this.setCompletionRequestHandler();return registeredResourceTemplate}_createRegisteredPrompt(name,title,description,argsSchema,callback){let registeredPrompt={title,description,argsSchema:argsSchema===void 0?void 0:objectFromShape(argsSchema),callback,enabled:!0,disable:()=>registeredPrompt.update({enabled:!1}),enable:()=>registeredPrompt.update({enabled:!0}),remove:()=>registeredPrompt.update({name:null}),update:(updates)=>{if(typeof updates.name<"u"&&updates.name!==name){if(delete this._registeredPrompts[name],updates.name)this._registeredPrompts[updates.name]=registeredPrompt}if(typeof updates.title<"u")registeredPrompt.title=updates.title;if(typeof updates.description<"u")registeredPrompt.description=updates.description;if(typeof updates.argsSchema<"u")registeredPrompt.argsSchema=objectFromShape(updates.argsSchema);if(typeof updates.callback<"u")registeredPrompt.callback=updates.callback;if(typeof updates.enabled<"u")registeredPrompt.enabled=updates.enabled;this.sendPromptListChanged()}};if(this._registeredPrompts[name]=registeredPrompt,argsSchema){if(Object.values(argsSchema).some((field)=>{let inner=field instanceof ZodOptional?field._def?.innerType:field;return isCompletable(inner)}))this.setCompletionRequestHandler()}return registeredPrompt}_createRegisteredTool(name,title,description,inputSchema,outputSchema,annotations,execution,_meta,handler){validateAndWarnToolName(name);let registeredTool={title,description,inputSchema:getZodSchemaObject(inputSchema),outputSchema:getZodSchemaObject(outputSchema),annotations,execution,_meta,handler,enabled:!0,disable:()=>registeredTool.update({enabled:!1}),enable:()=>registeredTool.update({enabled:!0}),remove:()=>registeredTool.update({name:null}),update:(updates)=>{if(typeof updates.name<"u"&&updates.name!==name){if(typeof updates.name==="string")validateAndWarnToolName(updates.name);if(delete this._registeredTools[name],updates.name)this._registeredTools[updates.name]=registeredTool}if(typeof updates.title<"u")registeredTool.title=updates.title;if(typeof updates.description<"u")registeredTool.description=updates.description;if(typeof updates.paramsSchema<"u")registeredTool.inputSchema=objectFromShape(updates.paramsSchema);if(typeof updates.outputSchema<"u")registeredTool.outputSchema=objectFromShape(updates.outputSchema);if(typeof updates.callback<"u")registeredTool.handler=updates.callback;if(typeof updates.annotations<"u")registeredTool.annotations=updates.annotations;if(typeof updates._meta<"u")registeredTool._meta=updates._meta;if(typeof updates.enabled<"u")registeredTool.enabled=updates.enabled;this.sendToolListChanged()}};return this._registeredTools[name]=registeredTool,this.setToolRequestHandlers(),this.sendToolListChanged(),registeredTool}tool(name,...rest){if(this._registeredTools[name])throw Error(`Tool ${name} is already registered`);let description,inputSchema,outputSchema,annotations;if(typeof rest[0]==="string")description=rest.shift();if(rest.length>1){let firstArg=rest[0];if(isZodRawShapeCompat(firstArg)){if(inputSchema=rest.shift(),rest.length>1&&typeof rest[0]==="object"&&rest[0]!==null&&!isZodRawShapeCompat(rest[0]))annotations=rest.shift()}else if(typeof firstArg==="object"&&firstArg!==null){if(Object.values(firstArg).some((v)=>typeof v==="object"&&v!==null))throw Error(`Tool ${name} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);annotations=rest.shift()}}let callback=rest[0];return this._createRegisteredTool(name,void 0,description,inputSchema,outputSchema,annotations,{taskSupport:"forbidden"},void 0,callback)}registerTool(name,config,cb){if(this._registeredTools[name])throw Error(`Tool ${name} is already registered`);let{title,description,inputSchema,outputSchema,annotations,_meta}=config;return this._createRegisteredTool(name,title,description,inputSchema,outputSchema,annotations,{taskSupport:"forbidden"},_meta,cb)}prompt(name,...rest){if(this._registeredPrompts[name])throw Error(`Prompt ${name} is already registered`);let description;if(typeof rest[0]==="string")description=rest.shift();let argsSchema;if(rest.length>1)argsSchema=rest.shift();let cb=rest[0],registeredPrompt=this._createRegisteredPrompt(name,void 0,description,argsSchema,cb);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),registeredPrompt}registerPrompt(name,config,cb){if(this._registeredPrompts[name])throw Error(`Prompt ${name} is already registered`);let{title,description,argsSchema}=config,registeredPrompt=this._createRegisteredPrompt(name,title,description,argsSchema,cb);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),registeredPrompt}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(params,sessionId){return this.server.sendLoggingMessage(params,sessionId)}sendResourceListChanged(){if(this.isConnected())this.server.sendResourceListChanged()}sendToolListChanged(){if(this.isConnected())this.server.sendToolListChanged()}sendPromptListChanged(){if(this.isConnected())this.server.sendPromptListChanged()}}var EMPTY_OBJECT_JSON_SCHEMA={type:"object",properties:{}};function isZodTypeLike(value){return value!==null&&typeof value==="object"&&"parse"in value&&typeof value.parse==="function"&&"safeParse"in value&&typeof value.safeParse==="function"}function isZodSchemaInstance(obj){return"_def"in obj||"_zod"in obj||isZodTypeLike(obj)}function isZodRawShapeCompat(obj){if(typeof obj!=="object"||obj===null)return!1;if(isZodSchemaInstance(obj))return!1;if(Object.keys(obj).length===0)return!0;return Object.values(obj).some(isZodTypeLike)}function getZodSchemaObject(schema){if(!schema)return;if(isZodRawShapeCompat(schema))return objectFromShape(schema);if(!isZodSchemaInstance(schema))throw Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return schema}function promptArgumentsFromSchema(schema){let shape=getObjectShape(schema);if(!shape)return[];return Object.entries(shape).map(([name,field])=>{let description=getSchemaDescription(field),isOptional=isSchemaOptional(field);return{name,description,required:!isOptional}})}function getMethodValue(schema){let methodSchema=getObjectShape(schema)?.method;if(!methodSchema)throw Error("Schema is missing a method literal");let value=getLiteralValue(methodSchema);if(typeof value==="string")return value;throw Error("Schema method literal must be a string")}function createCompletionResult(suggestions){return{completion:{values:suggestions.slice(0,100),total:suggestions.length,hasMore:suggestions.length>100}}}var EMPTY_COMPLETION_RESULT={completion:{values:[],hasMore:!1}};import process2 from"process";var STDIO_DEFAULT_MAX_BUFFER_SIZE=10485760;class ReadBuffer{constructor(options){this._maxBufferSize=options?.maxBufferSize??STDIO_DEFAULT_MAX_BUFFER_SIZE}append(chunk){if((this._buffer?.length??0)+chunk.length>this._maxBufferSize)throw this.clear(),Error(`ReadBuffer exceeded maximum size of ${this._maxBufferSize} bytes`);this._buffer=this._buffer?Buffer.concat([this._buffer,chunk]):chunk}readMessage(){if(!this._buffer)return null;let index=this._buffer.indexOf(`
|
|
144
144
|
`);if(index===-1)return null;let line=this._buffer.toString("utf8",0,index).replace(/\r$/,"");return this._buffer=this._buffer.subarray(index+1),deserializeMessage(line)}clear(){this._buffer=void 0}}function deserializeMessage(line){return JSONRPCMessageSchema.parse(JSON.parse(line))}function serializeMessage(message){return JSON.stringify(message)+`
|
|
145
|
-
`}class StdioServerTransport{constructor(_stdin=process2.stdin,_stdout=process2.stdout,options){this._stdin=_stdin,this._stdout=_stdout,this._started=!1,this._ondata=(chunk)=>{try{this._readBuffer.append(chunk),this.processReadBuffer()}catch(error){this.onerror?.(error),this.close().catch(()=>{})}},this._onerror=(error)=>{this.onerror?.(error)},this._readBuffer=new ReadBuffer({maxBufferSize:options?.maxBufferSize})}async start(){if(this._started)throw Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){while(!0)try{let message=this._readBuffer.readMessage();if(message===null)break;this.onmessage?.(message)}catch(error){this.onerror?.(error)}}async close(){if(this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0)this._stdin.pause();this._readBuffer.clear(),this.onclose?.()}send(message){return new Promise((resolve)=>{let json=serializeMessage(message);if(this._stdout.write(json))resolve();else this._stdout.once("drain",resolve)})}}var SERVER_VERSION="0.3.
|
|
145
|
+
`}class StdioServerTransport{constructor(_stdin=process2.stdin,_stdout=process2.stdout,options){this._stdin=_stdin,this._stdout=_stdout,this._started=!1,this._ondata=(chunk)=>{try{this._readBuffer.append(chunk),this.processReadBuffer()}catch(error){this.onerror?.(error),this.close().catch(()=>{})}},this._onerror=(error)=>{this.onerror?.(error)},this._readBuffer=new ReadBuffer({maxBufferSize:options?.maxBufferSize})}async start(){if(this._started)throw Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){while(!0)try{let message=this._readBuffer.readMessage();if(message===null)break;this.onmessage?.(message)}catch(error){this.onerror?.(error)}}async close(){if(this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0)this._stdin.pause();this._readBuffer.clear(),this.onclose?.()}send(message){return new Promise((resolve)=>{let json=serializeMessage(message);if(this._stdout.write(json))resolve();else this._stdout.once("drain",resolve)})}}var SERVER_VERSION="0.3.1",MCP_SERVER_INFO={name:"velloo",version:SERVER_VERSION};function gateInstructions(opts){let mismatch=`Velloo could not open the design folder at ${opts.root}: it is on design-folder format v${opts.found}, but this velloo reads v${opts.current}. The canvas and all `+"design tools are unavailable until that is resolved \u2014 this session only carries "+`this notice${opts.upgrade?" and the migration tool":""}.`,fix=opts.upgrade?"To fix it, call the `upgrade_design_folder` tool \u2014 it migrates the folder in "+`place, exactly like running \`velloo upgrade ${opts.root}\` in a shell (which also works, if you prefer). After it succeeds, reconnect this MCP server (restart it in your client) to load the design tools.`:"The folder was written by a NEWER velloo than this one \u2014 nothing here can migrate "+"it backwards. The velloo CLI itself must be updated (e.g. its global install), then reconnect this MCP server.";return`${mismatch}
|
|
146
146
|
|
|
147
147
|
${fix}
|
|
148
148
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{ScreenSchema}from"./chunk-nte0t7v3.js";import{detectTailwindMajor,emitCode,moduleTarget,v3ClassIssues,classNamesInJsx,styleChannelOf,loadDesignFolder,hostAppRootFrom,resolveProviders}from"./chunk-
|
|
2
|
+
import{ScreenSchema}from"./chunk-nte0t7v3.js";import{detectTailwindMajor,emitCode,moduleTarget,v3ClassIssues,classNamesInJsx,styleChannelOf,loadDesignFolder,hostAppRootFrom,resolveProviders}from"./chunk-88eqqdk1.js";import"./chunk-n9t36h0q.js";import"./chunk-c4fym47a.js";import"./chunk-80fjfyha.js";import{fail}from"./chunk-s23gtejf.js";import{findDesignConfig}from"./chunk-bhx8k09w.js";import{createProgress}from"./chunk-pjtg3wnm.js";import{DESIGN_ARG_DESCRIPTION,resolveDesign,pickScreen}from"./chunk-wafb2xm9.js";import{defineCommand}from"./chunk-2smsg2ct.js";import{readFile,writeFile}from"fs/promises";import{isAbsolute,resolve}from"path";import{stdout}from"process";async function folderEmitContext(screenPath,screen){let found=await findDesignConfig(screenPath);if(!found)return{};let design=await loadDesignFolder(found.folder),{providers,defaultProvider}=await resolveProviders(design.config,found.folder),provider=screen.library&&providers[screen.library]||defaultProvider,adapter=provider,target;if(adapter.codegenModule){let manifest=await provider.loadManifest();target=moduleTarget(manifest.filter((c)=>c.source!=="velloo").map((c)=>c.id),adapter.codegenModule)}let inlineStyle=styleChannelOf(provider,design.config.styling?.framework).kind==="style";return{snippets:design.snippets,...design.config.extensions?{extensions:design.config.extensions}:{},...target?{target}:{},...inlineStyle?{inlineStyle:!0}:{}}}var emit_default=defineCommand({meta:{name:"emit",description:"Print or write agent-consumed IR for a screen."},args:{screen:{type:"positional",required:!1,description:"Screen id, or a path to a screen JSON. Omit to pick interactively."},design:{type:"string",description:DESIGN_ARG_DESCRIPTION},to:{type:"string",description:"Write IR as JSON to this path. Omit to print the JSX body to stdout (agent-friendly when piped)."},"components-alias":{type:"string",description:'Override the import prefix the IR mentions in snippet identifiers. Defaults to .design/config.json#codegen.componentsAlias, else "@/components/ui".'}},async run({args}){let interactive=Boolean(process.stdin.isTTY),screenArg=args.screen,screenPath=!!screenArg&&(screenArg.includes("/")||screenArg.endsWith(".json"))?resolve(screenArg):(await pickScreen(await resolveDesign(args.design,"emit",{designFlag:"--design"}),screenArg,interactive,"emit")).path,screenJson=JSON.parse(await readFile(screenPath,"utf8")),screen=ScreenSchema.parse(screenJson),progress=createProgress();progress.start("preparing code");try{let componentsAlias=args["components-alias"]??await readConfigAlias(screenPath),context=await folderEmitContext(screenPath,screen);progress.step("generating code");let result=await emitCode(screen,{...componentsAlias?{componentsAlias}:{},...context});if(!result.ok){progress.fail("code generation failed");let e=result.error;if(e.kind==="UnknownComponent")fail("emit",`unknown component: ${JSON.stringify(e.ref)}`);else if(e.kind==="SnippetNotFound")fail("emit",`snippet not found: ${JSON.stringify(e.snippetId)}`);else fail("emit",`screen not found: ${JSON.stringify(e.screenId)}`)}let found=await findDesignConfig(screenPath),tailwindV3Compat=found&&!context?.target&&!context?.inlineStyle?detectTailwindMajor(hostAppRootFrom(found.folder,found.config.hostApp))===3?v3ClassIssues([...result.value.classesUsed,...result.value.snippetsUsed.flatMap((s)=>classNamesInJsx(s.jsx))]):[]:[];if(args.to){progress.step("writing code");let outPath=isAbsolute(args.to)?args.to:resolve(args.to),ir=tailwindV3Compat.length>0?{...result.value,tailwindV3Compat}:result.value;await writeFile(outPath,JSON.stringify(ir,null,2),"utf8"),progress.succeed("generated code"),console.log(`velloo emit: wrote ${outPath}`);return}if(progress.succeed("generated code"),stdout.write(`// screen: ${result.value.screen.id} (${result.value.screen.name})
|
|
3
3
|
`),stdout.write(`// components: ${result.value.componentsUsed.join(", ")||"(none)"}
|
|
4
4
|
`),result.value.iconsUsed.length>0)stdout.write(`// icons (lucide): ${result.value.iconsUsed.join(", ")}
|
|
5
5
|
`);if(result.value.snippetsUsed.length>0)stdout.write(`// snippets: ${result.value.snippetsUsed.map((s)=>`${s.componentName}(${s.id})`).join(", ")}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{isCancel,select}from"./chunk-80fjfyha.js";import"./chunk-nte0t7v3.js";import"./chunk-
|
|
2
|
+
import{isCancel,select}from"./chunk-80fjfyha.js";import"./chunk-nte0t7v3.js";import"./chunk-88eqqdk1.js";import"./chunk-n9t36h0q.js";import"./chunk-c4fym47a.js";import"./chunk-9psr8atb.js";import{daemonRoot,listDaemons,stopDaemon}from"./chunk-4ma2wnqw.js";import{fail}from"./chunk-s23gtejf.js";import"./chunk-2fgfex9b.js";import"./chunk-9ydc34wc.js";import"./chunk-cvn689d5.js";import"./chunk-t2w8a591.js";import{designWithFolder}from"./chunk-4g250157.js";import{DESIGN_ARG_DESCRIPTION,resolveDesign}from"./chunk-wafb2xm9.js";import"./chunk-t5m5mznb.js";import"./chunk-as08hzp3.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";import{resolve}from"path";var import_picocolors=__toESM(require_picocolors(),1);var ALL="__all__",canvasLine=(d)=>`${designWithFolder(d.root,void 0,{absolute:!0})} \u2014 ${d.canvasUrl}`;async function stopEach(daemons){for(let d of daemons)await stopDaemon(d.root),console.log(`velloo: stopped ${canvasLine(d)}`)}async function designHere(){try{return await resolveDesign(void 0,"stop",{onFail:()=>{throw Error("no design here")}})}catch{return}}function runningFor(daemons,folder){if(!folder)return;let root=resolve(daemonRoot(folder));return daemons.find((d)=>resolve(d.root)===root)?.root}var stop_default=defineCommand({meta:{name:"stop",description:"Stop a running canvas (picks from the running ones when none is named)"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},all:{type:"boolean",default:!1,description:"Stop every running velloo canvas on this machine"}},async run({args}){if(args.all){let daemons=await listDaemons();if(daemons.length===0)console.log("velloo: no canvas daemons running.");else await stopEach(daemons);return}if(!args.design&&process.stdin.isTTY){let daemons=await listDaemons();if(daemons.length===0){console.log("velloo: no canvas daemons running.");return}if(daemons.length===1){await stopEach(daemons);return}let here=runningFor(daemons,await designHere()),ordered=[...daemons].sort((a,b)=>a.root===here?-1:b.root===here?1:0),chosen=await select({message:"Stop which canvas?",options:[...ordered.map((d)=>({value:d.root,label:designWithFolder(d.root,void 0,{absolute:!0}),hint:d.root===here?`${d.canvasUrl} \xB7 this directory`:d.canvasUrl})),{value:ALL,label:`All ${daemons.length} canvases`}],...here?{initialValue:here}:{}});if(isCancel(chosen))fail("stop","cancelled.");await stopEach(chosen===ALL?daemons:daemons.filter((d)=>d.root===chosen));return}if(!args.design&&!await designHere()){let daemons=await listDaemons();if(daemons.length===0){console.log("velloo: no canvas daemons running.");return}fail("stop",[`there is no design in this directory. ${daemons.length} canvas${daemons.length===1?" is":"es are"} running \u2014 stop one by its design folder, or all of them with \`velloo stop --all\`:`,...daemons.map((d)=>` ${canvasLine(d)}`)].join(`
|
|
3
3
|
`))}let folder=await resolveDesign(args.design,"stop"),root=daemonRoot(folder);if(await stopDaemon(root)){console.log(`velloo: stopped ${designWithFolder(folder)}`);return}console.log(`velloo: no canvas running for ${designWithFolder(folder)}`);let others=await listDaemons();if(others.length===0)return;console.log(import_picocolors.default.dim(` ${others.length} canvas${others.length===1?"":"es"} running elsewhere \u2014 run \`velloo stop\` to pick, or \`velloo stop --all\`:`));for(let d of others)console.log(import_picocolors.default.dim(` ${canvasLine(d)}`))}});export{stop_default as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import"./chunk-nte0t7v3.js";import{recordedDesignName}from"./chunk-
|
|
2
|
+
import"./chunk-nte0t7v3.js";import{recordedDesignName}from"./chunk-88eqqdk1.js";import"./chunk-n9t36h0q.js";import"./chunk-c4fym47a.js";import"./chunk-9psr8atb.js";import{assertLoopbackHost,daemonRoot,isLive,ensureDaemon,stopDaemon}from"./chunk-4ma2wnqw.js";import"./chunk-80fjfyha.js";import{fail}from"./chunk-s23gtejf.js";import"./chunk-2fgfex9b.js";import"./chunk-9ydc34wc.js";import"./chunk-cvn689d5.js";import"./chunk-t2w8a591.js";import{createProgress}from"./chunk-pjtg3wnm.js";import{designWithFolder}from"./chunk-4g250157.js";import{findDesigns,DESIGN_ARG_DESCRIPTION,resolveDesign}from"./chunk-wafb2xm9.js";import{openUrl}from"./chunk-hggap8fq.js";import"./chunk-t5m5mznb.js";import"./chunk-as08hzp3.js";import{traceEnabled}from"./chunk-6tx68d90.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";import{basename,join}from"path";var import_picocolors=__toESM(require_picocolors(),1);function actionForRunKey(key,targetCount=1){if(key==="b")return{kind:"background"};if(key==="q"||key==="\x03")return{kind:"stop"};if(targetCount<=1)return key==="o"?{kind:"open"}:null;if(key==="a"||key==="o")return{kind:"open"};if(/^[1-9]$/.test(key)){let index=Number(key);return index<=targetCount?{kind:"open",index}:null}return null}function shouldStayForeground(opts){return!opts.background&&opts.stdinIsTTY}function bindRunKeys(onKey){let stdin=process.stdin;if(!stdin.isTTY)return()=>{};stdin.setRawMode(!0),stdin.resume(),stdin.setEncoding("utf8");let onData=(chunk)=>{onKey(chunk)};return stdin.on("data",onData),()=>{if(stdin.off("data",onData),stdin.isTTY)stdin.setRawMode(!1);stdin.pause()}}var LIVE_POLL_MS=2000;async function waitInForeground(opts){return await new Promise((resolve)=>{let settled=!1,unbind=()=>{},timer,finish=(outcome)=>{if(settled)return;if(settled=!0,unbind(),timer!==void 0)clearInterval(timer);process.off("SIGINT",onStop),process.off("SIGTERM",onStop),resolve(outcome)},onStop=()=>finish("stop");unbind=bindRunKeys((key)=>{let action=actionForRunKey(key,opts.targetCount??1);if(!action)return;if(action.kind==="open")opts.onOpen(action.index);else finish(action.kind)}),process.on("SIGINT",onStop),process.on("SIGTERM",onStop),timer=setInterval(()=>{opts.isLive().then((live)=>{if(!live)finish("died")})},LIVE_POLL_MS)})}import{resolve}from"path";async function resolveRunTargets(arg,opts={}){let cwd=resolve(opts.cwd??"."),single=async()=>{let folder=await resolveDesign(arg,"run",{interactive:!0,requireConfig:!0,cwd});return[{name:recordedDesignName(folder)??void 0,folder}]};if(arg)return single();let found;try{found=await findDesigns(cwd)}catch{return single()}if(!found||found.designs.length<2)return single();let targets=[];for(let design of found.designs)if(design.exists&&!design.outsideRepo)targets.push({name:design.name,folder:design.root});if(targets.length===0)return single();if(targets.length===1)return targets;let defaultDesign=found.defaultDesign;if(defaultDesign)targets.sort((a,b)=>a.name===defaultDesign?-1:b.name===defaultDesign?1:0);return targets}function label(target){return recordedDesignName(target.folder)??target.name??basename(target.folder)}function printKeys(attached){if(console.log(""),attached.length>1)attached.forEach(({target},i)=>{console.log(` ${import_picocolors.default.cyan(String(i+1))} open ${label(target)}`)}),console.log(` ${import_picocolors.default.cyan("a")} open all`);else console.log(` ${import_picocolors.default.cyan("o")} open the browser`);console.log(` ${import_picocolors.default.cyan("b")} run in the background`),console.log(` ${import_picocolors.default.cyan("q")} stop`),console.log("")}function printBackgroundStay(designArg){console.log(`velloo: it keeps running in the background \u2014 awake while the canvas is open or an agent is connected. Stop it anytime with \`velloo stop${designArg}\`.`)}var run_default=defineCommand({meta:{name:"run",description:"Open the canvas for a design folder and stay in the foreground (starts a persistent canvas if none is running)"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},port:{type:"string",description:"Preferred canvas port when starting fresh (default: the port this folder ran on last, else 7300)"},host:{type:"string",description:"Loopback bind hostname: 127.0.0.1 (default), localhost or ::1"},open:{type:"boolean",default:!1,description:"Open the canvas in your browser"},background:{type:"boolean",default:!1,description:"Leave the canvas running and return to the shell (the default when stdin is not a TTY)"}},async run({args}){assertLoopbackHost(args.host??"127.0.0.1");let targets=await resolveRunTargets(args.design,{}),preferredPort=args.port?Number(args.port):void 0;if(preferredPort!==void 0&&(!Number.isFinite(preferredPort)||preferredPort<0))fail("run",`invalid --port ${JSON.stringify(args.port)}`);let progress=createProgress();progress.start(targets.length>1?"starting canvases":"starting canvas");let spawned=0,running=[];try{for(let[index,target]of targets.entries()){if(targets.length>1)progress.step(`starting ${label(target)}`);let rec=await ensureDaemon(target.folder,{...preferredPort!==void 0&&index===0?{preferredPort}:{},host:args.host,onSpawn:()=>{spawned++,progress.step(`waiting for ${label(target)}`)}});running.push({target,rec})}progress.succeed(spawned===0?targets.length>1?"connected to running canvases":"connected to running canvas":targets.length>1?`started ${targets.length} canvases`:"started canvas")}catch(error){throw progress.fail("could not start canvas"),error}let designArg=args.design?` ${args.design}`:"",first=running[0];if(running.length===1)console.log(`velloo: design ${designWithFolder(first.target.folder,first.target.name)}`),console.log(`velloo: canvas at ${first.rec.canvasUrl}`);else{console.log("velloo: canvases");let rows=running.map(({target,rec})=>({design:designWithFolder(target.folder,target.name),url:rec.canvasUrl})),width=Math.max(...rows.map((row)=>row.design.length));for(let row of rows)console.log(` ${import_picocolors.default.bold(row.design.padEnd(width))} ${row.url}`)}if(traceEnabled())if(spawned>0)console.log(`velloo: \u29BF trace recording ON \u2014 agent MCP calls tape to ${join(first.target.folder,".velloo","trace")} (view with \`velloo trace\`)`);else console.log(`velloo: VELLOO_TRACE is set, but a canvas was already running \u2014 recording is NOT active on it. Run \`velloo stop${designArg}\`, then re-run to record. The agent must also connect through this same (trace-enabled) velloo.`);let foreground=shouldStayForeground({background:Boolean(args.background),stdinIsTTY:Boolean(process.stdin.isTTY)});if(foreground)printKeys(running);else printBackgroundStay(designArg);let attached=running,openTarget=(index)=>{let picked=index===void 0?attached:[attached[index-1]];for(let entry of picked)if(entry)openUrl(entry.rec.canvasUrl)};if(args.open)openTarget(running.length>1?void 0:1);if(!foreground)return;for(;;){let outcome=await waitInForeground({isLive:async()=>{for(let{rec}of attached)if(!await isLive(rec))return!1;return!0},onOpen:openTarget,targetCount:attached.length});if(outcome==="background"){printBackgroundStay(designArg);return}if(outcome==="died"){let alive=[];for(let entry of attached)if(await isLive(entry.rec))alive.push(entry);else console.log(`velloo: the canvas for "${label(entry.target)}" stopped.`);if(attached=alive,attached.length===0){console.log(`velloo: no canvases left. Start again with \`velloo run${designArg}\`.`);return}console.log(import_picocolors.default.dim(` Still running: ${attached.map(({target})=>label(target)).join(", ")}.`)),printKeys(attached);continue}for(let{target}of attached){let stopped=await stopDaemon(daemonRoot(target.folder));console.log(stopped?`velloo: stopped ${designWithFolder(target.folder)}`:`velloo: no canvas running for ${designWithFolder(target.folder)}`)}return}}});export{run_default as default};
|