@inkly-org/cli 0.7.0 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- var Fo=Object.defineProperty;var Ho=(e,t)=>{for(var n in t)Fo(e,n,{get:t[n],enumerable:!0})};import Dh from"mri";import{existsSync as si,statSync as Nh}from"fs";import{isAbsolute as Mh,join as Co,resolve as Lh}from"path";import{Buffer as Hc}from"buffer";import{mkdir as sa,writeFile as Bc,access as Wc}from"fs/promises";import{dirname as Vc,join as Jc,resolve as Zc,sep as la}from"path";var l={};Ho(l,{BRAND:()=>ms,DIRTY:()=>Xe,EMPTY_PATH:()=>Jo,INVALID:()=>v,NEVER:()=>Xs,OK:()=>Y,ParseStatus:()=>q,Schema:()=>T,ZodAny:()=>Fe,ZodArray:()=>Ee,ZodBigInt:()=>et,ZodBoolean:()=>tt,ZodBranded:()=>Kt,ZodCatch:()=>pt,ZodDate:()=>nt,ZodDefault:()=>ut,ZodDiscriminatedUnion:()=>gn,ZodEffects:()=>ue,ZodEnum:()=>ct,ZodError:()=>re,ZodFirstPartyTypeKind:()=>S,ZodFunction:()=>yn,ZodIntersection:()=>ot,ZodIssueCode:()=>m,ZodLazy:()=>st,ZodLiteral:()=>lt,ZodMap:()=>Pt,ZodNaN:()=>Et,ZodNativeEnum:()=>dt,ZodNever:()=>he,ZodNull:()=>it,ZodNullable:()=>ke,ZodNumber:()=>Qe,ZodObject:()=>ie,ZodOptional:()=>ce,ZodParsedType:()=>y,ZodPipeline:()=>Yt,ZodPromise:()=>He,ZodReadonly:()=>ht,ZodRecord:()=>bn,ZodSchema:()=>T,ZodSet:()=>It,ZodString:()=>Ue,ZodSymbol:()=>Tt,ZodTransformer:()=>ue,ZodTuple:()=>xe,ZodType:()=>T,ZodUndefined:()=>rt,ZodUnion:()=>at,ZodUnknown:()=>Ie,ZodVoid:()=>At,addIssueToContext:()=>g,any:()=>Ss,array:()=>As,bigint:()=>ys,boolean:()=>ki,coerce:()=>Ys,custom:()=>bi,date:()=>xs,datetimeRegex:()=>fi,defaultErrorMap:()=>Ae,discriminatedUnion:()=>Rs,effect:()=>Bs,enum:()=>Us,function:()=>Os,getErrorMap:()=>St,getParsedType:()=>ye,instanceof:()=>gs,intersection:()=>$s,isAborted:()=>mn,isAsync:()=>_t,isDirty:()=>fn,isValid:()=>ze,late:()=>fs,lazy:()=>js,literal:()=>zs,makeIssue:()=>Gt,map:()=>Ms,nan:()=>bs,nativeEnum:()=>Fs,never:()=>Cs,null:()=>vs,nullable:()=>Vs,number:()=>xi,object:()=>Ps,objectUtil:()=>Qn,oboolean:()=>Ks,onumber:()=>Gs,optional:()=>Ws,ostring:()=>qs,pipeline:()=>Zs,preprocess:()=>Js,promise:()=>Hs,quotelessJson:()=>Bo,record:()=>Ns,set:()=>Ls,setErrorMap:()=>Vo,strictObject:()=>Is,string:()=>yi,symbol:()=>ks,transformer:()=>Bs,tuple:()=>Ds,undefined:()=>ws,union:()=>Es,unknown:()=>_s,util:()=>P,void:()=>Ts});var P;(function(e){e.assertEqual=i=>{};function t(i){}e.assertIs=t;function n(i){throw new Error}e.assertNever=n,e.arrayToEnum=i=>{let a={};for(let o of i)a[o]=o;return a},e.getValidEnumValues=i=>{let a=e.objectKeys(i).filter(s=>typeof i[i[s]]!="number"),o={};for(let s of a)o[s]=i[s];return e.objectValues(o)},e.objectValues=i=>e.objectKeys(i).map(function(a){return i[a]}),e.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{let a=[];for(let o in i)Object.prototype.hasOwnProperty.call(i,o)&&a.push(o);return a},e.find=(i,a)=>{for(let o of i)if(a(o))return o},e.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&Number.isFinite(i)&&Math.floor(i)===i;function r(i,a=" | "){return i.map(o=>typeof o=="string"?`'${o}'`:o).join(a)}e.joinValues=r,e.jsonStringifyReplacer=(i,a)=>typeof a=="bigint"?a.toString():a})(P||(P={}));var Qn;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(Qn||(Qn={}));var y=P.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),ye=e=>{switch(typeof e){case"undefined":return y.undefined;case"string":return y.string;case"number":return Number.isNaN(e)?y.nan:y.number;case"boolean":return y.boolean;case"function":return y.function;case"bigint":return y.bigint;case"symbol":return y.symbol;case"object":return Array.isArray(e)?y.array:e===null?y.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?y.promise:typeof Map<"u"&&e instanceof Map?y.map:typeof Set<"u"&&e instanceof Set?y.set:typeof Date<"u"&&e instanceof Date?y.date:y.object;default:return y.unknown}};var m=P.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),Bo=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:"),re=class e extends Error{get errors(){return this.issues}constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};let n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}format(t){let n=t||function(a){return a.message},r={_errors:[]},i=a=>{for(let o of a.issues)if(o.code==="invalid_union")o.unionErrors.map(i);else if(o.code==="invalid_return_type")i(o.returnTypeError);else if(o.code==="invalid_arguments")i(o.argumentsError);else if(o.path.length===0)r._errors.push(n(o));else{let s=r,c=0;for(;c<o.path.length;){let d=o.path[c];c===o.path.length-1?(s[d]=s[d]||{_errors:[]},s[d]._errors.push(n(o))):s[d]=s[d]||{_errors:[]},s=s[d],c++}}};return i(this),r}static assert(t){if(!(t instanceof e))throw new Error(`Not a ZodError: ${t}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,P.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(t=n=>n.message){let n={},r=[];for(let i of this.issues)if(i.path.length>0){let a=i.path[0];n[a]=n[a]||[],n[a].push(t(i))}else r.push(t(i));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}};re.create=e=>new re(e);var Wo=(e,t)=>{let n;switch(e.code){case m.invalid_type:e.received===y.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case m.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,P.jsonStringifyReplacer)}`;break;case m.unrecognized_keys:n=`Unrecognized key(s) in object: ${P.joinValues(e.keys,", ")}`;break;case m.invalid_union:n="Invalid input";break;case m.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${P.joinValues(e.options)}`;break;case m.invalid_enum_value:n=`Invalid enum value. Expected ${P.joinValues(e.options)}, received '${e.received}'`;break;case m.invalid_arguments:n="Invalid function arguments";break;case m.invalid_return_type:n="Invalid function return type";break;case m.invalid_date:n="Invalid date";break;case m.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:P.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case m.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="bigint"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case m.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case m.custom:n="Invalid input";break;case m.invalid_intersection_types:n="Intersection results could not be merged";break;case m.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case m.not_finite:n="Number must be finite";break;default:n=t.defaultError,P.assertNever(e)}return{message:n}},Ae=Wo;var di=Ae;function Vo(e){di=e}function St(){return di}var Gt=e=>{let{data:t,path:n,errorMaps:r,issueData:i}=e,a=[...n,...i.path||[]],o={...i,path:a};if(i.message!==void 0)return{...i,path:a,message:i.message};let s="",c=r.filter(d=>!!d).slice().reverse();for(let d of c)s=d(o,{data:t,defaultError:s}).message;return{...i,path:a,message:s}},Jo=[];function g(e,t){let n=St(),r=Gt({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,n,n===Ae?void 0:Ae].filter(i=>!!i)});e.common.issues.push(r)}var q=class e{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){let r=[];for(let i of n){if(i.status==="aborted")return v;i.status==="dirty"&&t.dirty(),r.push(i.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){let r=[];for(let i of n){let a=await i.key,o=await i.value;r.push({key:a,value:o})}return e.mergeObjectSync(t,r)}static mergeObjectSync(t,n){let r={};for(let i of n){let{key:a,value:o}=i;if(a.status==="aborted"||o.status==="aborted")return v;a.status==="dirty"&&t.dirty(),o.status==="dirty"&&t.dirty(),a.value!=="__proto__"&&(typeof o.value<"u"||i.alwaysSet)&&(r[a.value]=o.value)}return{status:t.value,value:r}}},v=Object.freeze({status:"aborted"}),Xe=e=>({status:"dirty",value:e}),Y=e=>({status:"valid",value:e}),mn=e=>e.status==="aborted",fn=e=>e.status==="dirty",ze=e=>e.status==="valid",_t=e=>typeof Promise<"u"&&e instanceof Promise;var k;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t?.message})(k||(k={}));var de=class{constructor(t,n,r,i){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=i}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},ui=(e,t)=>{if(ze(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let n=new re(e.common.issues);return this._error=n,this._error}}};function C(e){if(!e)return{};let{errorMap:t,invalid_type_error:n,required_error:r,description:i}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:i}:{errorMap:(o,s)=>{let{message:c}=e;return o.code==="invalid_enum_value"?{message:c??s.defaultError}:typeof s.data>"u"?{message:c??r??s.defaultError}:o.code!=="invalid_type"?{message:s.defaultError}:{message:c??n??s.defaultError}},description:i}}var T=class{get description(){return this._def.description}_getType(t){return ye(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:ye(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new q,ctx:{common:t.parent.common,data:t.data,parsedType:ye(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){let n=this._parse(t);if(_t(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){let n=this._parse(t);return Promise.resolve(n)}parse(t,n){let r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){let r={common:{issues:[],async:n?.async??!1,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:ye(t)},i=this._parseSync({data:t,path:r.path,parent:r});return ui(r,i)}"~validate"(t){let n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:ye(t)};if(!this["~standard"].async)try{let r=this._parseSync({data:t,path:[],parent:n});return ze(r)?{value:r.value}:{issues:n.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:t,path:[],parent:n}).then(r=>ze(r)?{value:r.value}:{issues:n.common.issues})}async parseAsync(t,n){let r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){let r={common:{issues:[],contextualErrorMap:n?.errorMap,async:!0},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:ye(t)},i=this._parse({data:t,path:r.path,parent:r}),a=await(_t(i)?i:Promise.resolve(i));return ui(r,a)}refine(t,n){let r=i=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(i):n;return this._refinement((i,a)=>{let o=t(i),s=()=>a.addIssue({code:m.custom,...r(i)});return typeof Promise<"u"&&o instanceof Promise?o.then(c=>c?!0:(s(),!1)):o?!0:(s(),!1)})}refinement(t,n){return this._refinement((r,i)=>t(r)?!0:(i.addIssue(typeof n=="function"?n(r,i):n),!1))}_refinement(t){return new ue({schema:this,typeName:S.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return ce.create(this,this._def)}nullable(){return ke.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Ee.create(this)}promise(){return He.create(this,this._def)}or(t){return at.create([this,t],this._def)}and(t){return ot.create(this,t,this._def)}transform(t){return new ue({...C(this._def),schema:this,typeName:S.ZodEffects,effect:{type:"transform",transform:t}})}default(t){let n=typeof t=="function"?t:()=>t;return new ut({...C(this._def),innerType:this,defaultValue:n,typeName:S.ZodDefault})}brand(){return new Kt({typeName:S.ZodBranded,type:this,...C(this._def)})}catch(t){let n=typeof t=="function"?t:()=>t;return new pt({...C(this._def),innerType:this,catchValue:n,typeName:S.ZodCatch})}describe(t){let n=this.constructor;return new n({...this._def,description:t})}pipe(t){return Yt.create(this,t)}readonly(){return ht.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},Zo=/^c[^\s-]{8,}$/i,qo=/^[0-9a-z]+$/,Go=/^[0-9A-HJKMNP-TV-Z]{26}$/i,Ko=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Yo=/^[a-z0-9_-]{21}$/i,Xo=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Qo=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,es=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,ts="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",er,ns=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,rs=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,is=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,as=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,os=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,ss=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,hi="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",ls=new RegExp(`^${hi}$`);function mi(e){let t="[0-5]\\d";e.precision?t=`${t}\\.\\d{${e.precision}}`:e.precision==null&&(t=`${t}(\\.\\d+)?`);let n=e.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${t})${n}`}function cs(e){return new RegExp(`^${mi(e)}$`)}function fi(e){let t=`${hi}T${mi(e)}`,n=[];return n.push(e.local?"Z?":"Z"),e.offset&&n.push("([+-]\\d{2}:?\\d{2})"),t=`${t}(${n.join("|")})`,new RegExp(`^${t}$`)}function ds(e,t){return!!((t==="v4"||!t)&&ns.test(e)||(t==="v6"||!t)&&is.test(e))}function us(e,t){if(!Xo.test(e))return!1;try{let[n]=e.split(".");if(!n)return!1;let r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),i=JSON.parse(atob(r));return!(typeof i!="object"||i===null||"typ"in i&&i?.typ!=="JWT"||!i.alg||t&&i.alg!==t)}catch{return!1}}function ps(e,t){return!!((t==="v4"||!t)&&rs.test(e)||(t==="v6"||!t)&&as.test(e))}var Ue=class e extends T{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==y.string){let a=this._getOrReturnCtx(t);return g(a,{code:m.invalid_type,expected:y.string,received:a.parsedType}),v}let r=new q,i;for(let a of this._def.checks)if(a.kind==="min")t.data.length<a.value&&(i=this._getOrReturnCtx(t,i),g(i,{code:m.too_small,minimum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="max")t.data.length>a.value&&(i=this._getOrReturnCtx(t,i),g(i,{code:m.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="length"){let o=t.data.length>a.value,s=t.data.length<a.value;(o||s)&&(i=this._getOrReturnCtx(t,i),o?g(i,{code:m.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!0,message:a.message}):s&&g(i,{code:m.too_small,minimum:a.value,type:"string",inclusive:!0,exact:!0,message:a.message}),r.dirty())}else if(a.kind==="email")es.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"email",code:m.invalid_string,message:a.message}),r.dirty());else if(a.kind==="emoji")er||(er=new RegExp(ts,"u")),er.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"emoji",code:m.invalid_string,message:a.message}),r.dirty());else if(a.kind==="uuid")Ko.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"uuid",code:m.invalid_string,message:a.message}),r.dirty());else if(a.kind==="nanoid")Yo.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"nanoid",code:m.invalid_string,message:a.message}),r.dirty());else if(a.kind==="cuid")Zo.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"cuid",code:m.invalid_string,message:a.message}),r.dirty());else if(a.kind==="cuid2")qo.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"cuid2",code:m.invalid_string,message:a.message}),r.dirty());else if(a.kind==="ulid")Go.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"ulid",code:m.invalid_string,message:a.message}),r.dirty());else if(a.kind==="url")try{new URL(t.data)}catch{i=this._getOrReturnCtx(t,i),g(i,{validation:"url",code:m.invalid_string,message:a.message}),r.dirty()}else a.kind==="regex"?(a.regex.lastIndex=0,a.regex.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"regex",code:m.invalid_string,message:a.message}),r.dirty())):a.kind==="trim"?t.data=t.data.trim():a.kind==="includes"?t.data.includes(a.value,a.position)||(i=this._getOrReturnCtx(t,i),g(i,{code:m.invalid_string,validation:{includes:a.value,position:a.position},message:a.message}),r.dirty()):a.kind==="toLowerCase"?t.data=t.data.toLowerCase():a.kind==="toUpperCase"?t.data=t.data.toUpperCase():a.kind==="startsWith"?t.data.startsWith(a.value)||(i=this._getOrReturnCtx(t,i),g(i,{code:m.invalid_string,validation:{startsWith:a.value},message:a.message}),r.dirty()):a.kind==="endsWith"?t.data.endsWith(a.value)||(i=this._getOrReturnCtx(t,i),g(i,{code:m.invalid_string,validation:{endsWith:a.value},message:a.message}),r.dirty()):a.kind==="datetime"?fi(a).test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{code:m.invalid_string,validation:"datetime",message:a.message}),r.dirty()):a.kind==="date"?ls.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{code:m.invalid_string,validation:"date",message:a.message}),r.dirty()):a.kind==="time"?cs(a).test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{code:m.invalid_string,validation:"time",message:a.message}),r.dirty()):a.kind==="duration"?Qo.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"duration",code:m.invalid_string,message:a.message}),r.dirty()):a.kind==="ip"?ds(t.data,a.version)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"ip",code:m.invalid_string,message:a.message}),r.dirty()):a.kind==="jwt"?us(t.data,a.alg)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"jwt",code:m.invalid_string,message:a.message}),r.dirty()):a.kind==="cidr"?ps(t.data,a.version)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"cidr",code:m.invalid_string,message:a.message}),r.dirty()):a.kind==="base64"?os.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"base64",code:m.invalid_string,message:a.message}),r.dirty()):a.kind==="base64url"?ss.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"base64url",code:m.invalid_string,message:a.message}),r.dirty()):P.assertNever(a);return{status:r.value,value:t.data}}_regex(t,n,r){return this.refinement(i=>t.test(i),{validation:n,code:m.invalid_string,...k.errToObj(r)})}_addCheck(t){return new e({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...k.errToObj(t)})}url(t){return this._addCheck({kind:"url",...k.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...k.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...k.errToObj(t)})}nanoid(t){return this._addCheck({kind:"nanoid",...k.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...k.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...k.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...k.errToObj(t)})}base64(t){return this._addCheck({kind:"base64",...k.errToObj(t)})}base64url(t){return this._addCheck({kind:"base64url",...k.errToObj(t)})}jwt(t){return this._addCheck({kind:"jwt",...k.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...k.errToObj(t)})}cidr(t){return this._addCheck({kind:"cidr",...k.errToObj(t)})}datetime(t){return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof t?.precision>"u"?null:t?.precision,offset:t?.offset??!1,local:t?.local??!1,...k.errToObj(t?.message)})}date(t){return this._addCheck({kind:"date",message:t})}time(t){return typeof t=="string"?this._addCheck({kind:"time",precision:null,message:t}):this._addCheck({kind:"time",precision:typeof t?.precision>"u"?null:t?.precision,...k.errToObj(t?.message)})}duration(t){return this._addCheck({kind:"duration",...k.errToObj(t)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...k.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n?.position,...k.errToObj(n?.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...k.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...k.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...k.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...k.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...k.errToObj(n)})}nonempty(t){return this.min(1,k.errToObj(t))}trim(){return new e({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new e({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new e({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isDate(){return!!this._def.checks.find(t=>t.kind==="date")}get isTime(){return!!this._def.checks.find(t=>t.kind==="time")}get isDuration(){return!!this._def.checks.find(t=>t.kind==="duration")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(t=>t.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get isCIDR(){return!!this._def.checks.find(t=>t.kind==="cidr")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}get isBase64url(){return!!this._def.checks.find(t=>t.kind==="base64url")}get minLength(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}};Ue.create=e=>new Ue({checks:[],typeName:S.ZodString,coerce:e?.coerce??!1,...C(e)});function hs(e,t){let n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,i=n>r?n:r,a=Number.parseInt(e.toFixed(i).replace(".","")),o=Number.parseInt(t.toFixed(i).replace(".",""));return a%o/10**i}var Qe=class e extends T{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==y.number){let a=this._getOrReturnCtx(t);return g(a,{code:m.invalid_type,expected:y.number,received:a.parsedType}),v}let r,i=new q;for(let a of this._def.checks)a.kind==="int"?P.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),g(r,{code:m.invalid_type,expected:"integer",received:"float",message:a.message}),i.dirty()):a.kind==="min"?(a.inclusive?t.data<a.value:t.data<=a.value)&&(r=this._getOrReturnCtx(t,r),g(r,{code:m.too_small,minimum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),i.dirty()):a.kind==="max"?(a.inclusive?t.data>a.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),g(r,{code:m.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),i.dirty()):a.kind==="multipleOf"?hs(t.data,a.value)!==0&&(r=this._getOrReturnCtx(t,r),g(r,{code:m.not_multiple_of,multipleOf:a.value,message:a.message}),i.dirty()):a.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),g(r,{code:m.not_finite,message:a.message}),i.dirty()):P.assertNever(a);return{status:i.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,k.toString(n))}gt(t,n){return this.setLimit("min",t,!1,k.toString(n))}lte(t,n){return this.setLimit("max",t,!0,k.toString(n))}lt(t,n){return this.setLimit("max",t,!1,k.toString(n))}setLimit(t,n,r,i){return new e({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:k.toString(i)}]})}_addCheck(t){return new e({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:k.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:k.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:k.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:k.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:k.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:k.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:k.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:k.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:k.toString(t)})}get minValue(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}get isInt(){return!!this._def.checks.find(t=>t.kind==="int"||t.kind==="multipleOf"&&P.isInteger(t.value))}get isFinite(){let t=null,n=null;for(let r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.value<t)&&(t=r.value)}return Number.isFinite(n)&&Number.isFinite(t)}};Qe.create=e=>new Qe({checks:[],typeName:S.ZodNumber,coerce:e?.coerce||!1,...C(e)});var et=class e extends T{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce)try{t.data=BigInt(t.data)}catch{return this._getInvalidInput(t)}if(this._getType(t)!==y.bigint)return this._getInvalidInput(t);let r,i=new q;for(let a of this._def.checks)a.kind==="min"?(a.inclusive?t.data<a.value:t.data<=a.value)&&(r=this._getOrReturnCtx(t,r),g(r,{code:m.too_small,type:"bigint",minimum:a.value,inclusive:a.inclusive,message:a.message}),i.dirty()):a.kind==="max"?(a.inclusive?t.data>a.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),g(r,{code:m.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),i.dirty()):a.kind==="multipleOf"?t.data%a.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),g(r,{code:m.not_multiple_of,multipleOf:a.value,message:a.message}),i.dirty()):P.assertNever(a);return{status:i.value,value:t.data}}_getInvalidInput(t){let n=this._getOrReturnCtx(t);return g(n,{code:m.invalid_type,expected:y.bigint,received:n.parsedType}),v}gte(t,n){return this.setLimit("min",t,!0,k.toString(n))}gt(t,n){return this.setLimit("min",t,!1,k.toString(n))}lte(t,n){return this.setLimit("max",t,!0,k.toString(n))}lt(t,n){return this.setLimit("max",t,!1,k.toString(n))}setLimit(t,n,r,i){return new e({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:k.toString(i)}]})}_addCheck(t){return new e({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:k.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:k.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:k.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:k.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:k.toString(n)})}get minValue(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}};et.create=e=>new et({checks:[],typeName:S.ZodBigInt,coerce:e?.coerce??!1,...C(e)});var tt=class extends T{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==y.boolean){let r=this._getOrReturnCtx(t);return g(r,{code:m.invalid_type,expected:y.boolean,received:r.parsedType}),v}return Y(t.data)}};tt.create=e=>new tt({typeName:S.ZodBoolean,coerce:e?.coerce||!1,...C(e)});var nt=class e extends T{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==y.date){let a=this._getOrReturnCtx(t);return g(a,{code:m.invalid_type,expected:y.date,received:a.parsedType}),v}if(Number.isNaN(t.data.getTime())){let a=this._getOrReturnCtx(t);return g(a,{code:m.invalid_date}),v}let r=new q,i;for(let a of this._def.checks)a.kind==="min"?t.data.getTime()<a.value&&(i=this._getOrReturnCtx(t,i),g(i,{code:m.too_small,message:a.message,inclusive:!0,exact:!1,minimum:a.value,type:"date"}),r.dirty()):a.kind==="max"?t.data.getTime()>a.value&&(i=this._getOrReturnCtx(t,i),g(i,{code:m.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),r.dirty()):P.assertNever(a);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new e({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:k.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:k.toString(n)})}get minDate(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t!=null?new Date(t):null}};nt.create=e=>new nt({checks:[],coerce:e?.coerce||!1,typeName:S.ZodDate,...C(e)});var Tt=class extends T{_parse(t){if(this._getType(t)!==y.symbol){let r=this._getOrReturnCtx(t);return g(r,{code:m.invalid_type,expected:y.symbol,received:r.parsedType}),v}return Y(t.data)}};Tt.create=e=>new Tt({typeName:S.ZodSymbol,...C(e)});var rt=class extends T{_parse(t){if(this._getType(t)!==y.undefined){let r=this._getOrReturnCtx(t);return g(r,{code:m.invalid_type,expected:y.undefined,received:r.parsedType}),v}return Y(t.data)}};rt.create=e=>new rt({typeName:S.ZodUndefined,...C(e)});var it=class extends T{_parse(t){if(this._getType(t)!==y.null){let r=this._getOrReturnCtx(t);return g(r,{code:m.invalid_type,expected:y.null,received:r.parsedType}),v}return Y(t.data)}};it.create=e=>new it({typeName:S.ZodNull,...C(e)});var Fe=class extends T{constructor(){super(...arguments),this._any=!0}_parse(t){return Y(t.data)}};Fe.create=e=>new Fe({typeName:S.ZodAny,...C(e)});var Ie=class extends T{constructor(){super(...arguments),this._unknown=!0}_parse(t){return Y(t.data)}};Ie.create=e=>new Ie({typeName:S.ZodUnknown,...C(e)});var he=class extends T{_parse(t){let n=this._getOrReturnCtx(t);return g(n,{code:m.invalid_type,expected:y.never,received:n.parsedType}),v}};he.create=e=>new he({typeName:S.ZodNever,...C(e)});var At=class extends T{_parse(t){if(this._getType(t)!==y.undefined){let r=this._getOrReturnCtx(t);return g(r,{code:m.invalid_type,expected:y.void,received:r.parsedType}),v}return Y(t.data)}};At.create=e=>new At({typeName:S.ZodVoid,...C(e)});var Ee=class e extends T{_parse(t){let{ctx:n,status:r}=this._processInputParams(t),i=this._def;if(n.parsedType!==y.array)return g(n,{code:m.invalid_type,expected:y.array,received:n.parsedType}),v;if(i.exactLength!==null){let o=n.data.length>i.exactLength.value,s=n.data.length<i.exactLength.value;(o||s)&&(g(n,{code:o?m.too_big:m.too_small,minimum:s?i.exactLength.value:void 0,maximum:o?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),r.dirty())}if(i.minLength!==null&&n.data.length<i.minLength.value&&(g(n,{code:m.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),r.dirty()),i.maxLength!==null&&n.data.length>i.maxLength.value&&(g(n,{code:m.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((o,s)=>i.type._parseAsync(new de(n,o,n.path,s)))).then(o=>q.mergeArray(r,o));let a=[...n.data].map((o,s)=>i.type._parseSync(new de(n,o,n.path,s)));return q.mergeArray(r,a)}get element(){return this._def.type}min(t,n){return new e({...this._def,minLength:{value:t,message:k.toString(n)}})}max(t,n){return new e({...this._def,maxLength:{value:t,message:k.toString(n)}})}length(t,n){return new e({...this._def,exactLength:{value:t,message:k.toString(n)}})}nonempty(t){return this.min(1,t)}};Ee.create=(e,t)=>new Ee({type:e,minLength:null,maxLength:null,exactLength:null,typeName:S.ZodArray,...C(t)});function Ct(e){if(e instanceof ie){let t={};for(let n in e.shape){let r=e.shape[n];t[n]=ce.create(Ct(r))}return new ie({...e._def,shape:()=>t})}else return e instanceof Ee?new Ee({...e._def,type:Ct(e.element)}):e instanceof ce?ce.create(Ct(e.unwrap())):e instanceof ke?ke.create(Ct(e.unwrap())):e instanceof xe?xe.create(e.items.map(t=>Ct(t))):e}var ie=class e extends T{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let t=this._def.shape(),n=P.objectKeys(t);return this._cached={shape:t,keys:n},this._cached}_parse(t){if(this._getType(t)!==y.object){let d=this._getOrReturnCtx(t);return g(d,{code:m.invalid_type,expected:y.object,received:d.parsedType}),v}let{status:r,ctx:i}=this._processInputParams(t),{shape:a,keys:o}=this._getCached(),s=[];if(!(this._def.catchall instanceof he&&this._def.unknownKeys==="strip"))for(let d in i.data)o.includes(d)||s.push(d);let c=[];for(let d of o){let u=a[d],p=i.data[d];c.push({key:{status:"valid",value:d},value:u._parse(new de(i,p,i.path,d)),alwaysSet:d in i.data})}if(this._def.catchall instanceof he){let d=this._def.unknownKeys;if(d==="passthrough")for(let u of s)c.push({key:{status:"valid",value:u},value:{status:"valid",value:i.data[u]}});else if(d==="strict")s.length>0&&(g(i,{code:m.unrecognized_keys,keys:s}),r.dirty());else if(d!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let d=this._def.catchall;for(let u of s){let p=i.data[u];c.push({key:{status:"valid",value:u},value:d._parse(new de(i,p,i.path,u)),alwaysSet:u in i.data})}}return i.common.async?Promise.resolve().then(async()=>{let d=[];for(let u of c){let p=await u.key,h=await u.value;d.push({key:p,value:h,alwaysSet:u.alwaysSet})}return d}).then(d=>q.mergeObjectSync(r,d)):q.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(t){return k.errToObj,new e({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{let i=this._def.errorMap?.(n,r).message??r.defaultError;return n.code==="unrecognized_keys"?{message:k.errToObj(t).message??i}:{message:i}}}:{}})}strip(){return new e({...this._def,unknownKeys:"strip"})}passthrough(){return new e({...this._def,unknownKeys:"passthrough"})}extend(t){return new e({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new e({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:S.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new e({...this._def,catchall:t})}pick(t){let n={};for(let r of P.objectKeys(t))t[r]&&this.shape[r]&&(n[r]=this.shape[r]);return new e({...this._def,shape:()=>n})}omit(t){let n={};for(let r of P.objectKeys(this.shape))t[r]||(n[r]=this.shape[r]);return new e({...this._def,shape:()=>n})}deepPartial(){return Ct(this)}partial(t){let n={};for(let r of P.objectKeys(this.shape)){let i=this.shape[r];t&&!t[r]?n[r]=i:n[r]=i.optional()}return new e({...this._def,shape:()=>n})}required(t){let n={};for(let r of P.objectKeys(this.shape))if(t&&!t[r])n[r]=this.shape[r];else{let a=this.shape[r];for(;a instanceof ce;)a=a._def.innerType;n[r]=a}return new e({...this._def,shape:()=>n})}keyof(){return gi(P.objectKeys(this.shape))}};ie.create=(e,t)=>new ie({shape:()=>e,unknownKeys:"strip",catchall:he.create(),typeName:S.ZodObject,...C(t)});ie.strictCreate=(e,t)=>new ie({shape:()=>e,unknownKeys:"strict",catchall:he.create(),typeName:S.ZodObject,...C(t)});ie.lazycreate=(e,t)=>new ie({shape:e,unknownKeys:"strip",catchall:he.create(),typeName:S.ZodObject,...C(t)});var at=class extends T{_parse(t){let{ctx:n}=this._processInputParams(t),r=this._def.options;function i(a){for(let s of a)if(s.result.status==="valid")return s.result;for(let s of a)if(s.result.status==="dirty")return n.common.issues.push(...s.ctx.common.issues),s.result;let o=a.map(s=>new re(s.ctx.common.issues));return g(n,{code:m.invalid_union,unionErrors:o}),v}if(n.common.async)return Promise.all(r.map(async a=>{let o={...n,common:{...n.common,issues:[]},parent:null};return{result:await a._parseAsync({data:n.data,path:n.path,parent:o}),ctx:o}})).then(i);{let a,o=[];for(let c of r){let d={...n,common:{...n.common,issues:[]},parent:null},u=c._parseSync({data:n.data,path:n.path,parent:d});if(u.status==="valid")return u;u.status==="dirty"&&!a&&(a={result:u,ctx:d}),d.common.issues.length&&o.push(d.common.issues)}if(a)return n.common.issues.push(...a.ctx.common.issues),a.result;let s=o.map(c=>new re(c));return g(n,{code:m.invalid_union,unionErrors:s}),v}}get options(){return this._def.options}};at.create=(e,t)=>new at({options:e,typeName:S.ZodUnion,...C(t)});var Pe=e=>e instanceof st?Pe(e.schema):e instanceof ue?Pe(e.innerType()):e instanceof lt?[e.value]:e instanceof ct?e.options:e instanceof dt?P.objectValues(e.enum):e instanceof ut?Pe(e._def.innerType):e instanceof rt?[void 0]:e instanceof it?[null]:e instanceof ce?[void 0,...Pe(e.unwrap())]:e instanceof ke?[null,...Pe(e.unwrap())]:e instanceof Kt||e instanceof ht?Pe(e.unwrap()):e instanceof pt?Pe(e._def.innerType):[],gn=class e extends T{_parse(t){let{ctx:n}=this._processInputParams(t);if(n.parsedType!==y.object)return g(n,{code:m.invalid_type,expected:y.object,received:n.parsedType}),v;let r=this.discriminator,i=n.data[r],a=this.optionsMap.get(i);return a?n.common.async?a._parseAsync({data:n.data,path:n.path,parent:n}):a._parseSync({data:n.data,path:n.path,parent:n}):(g(n,{code:m.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),v)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){let i=new Map;for(let a of n){let o=Pe(a.shape[t]);if(!o.length)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(let s of o){if(i.has(s))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(s)}`);i.set(s,a)}}return new e({typeName:S.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:i,...C(r)})}};function tr(e,t){let n=ye(e),r=ye(t);if(e===t)return{valid:!0,data:e};if(n===y.object&&r===y.object){let i=P.objectKeys(t),a=P.objectKeys(e).filter(s=>i.indexOf(s)!==-1),o={...e,...t};for(let s of a){let c=tr(e[s],t[s]);if(!c.valid)return{valid:!1};o[s]=c.data}return{valid:!0,data:o}}else if(n===y.array&&r===y.array){if(e.length!==t.length)return{valid:!1};let i=[];for(let a=0;a<e.length;a++){let o=e[a],s=t[a],c=tr(o,s);if(!c.valid)return{valid:!1};i.push(c.data)}return{valid:!0,data:i}}else return n===y.date&&r===y.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}var ot=class extends T{_parse(t){let{status:n,ctx:r}=this._processInputParams(t),i=(a,o)=>{if(mn(a)||mn(o))return v;let s=tr(a.value,o.value);return s.valid?((fn(a)||fn(o))&&n.dirty(),{status:n.value,value:s.data}):(g(r,{code:m.invalid_intersection_types}),v)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([a,o])=>i(a,o)):i(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}};ot.create=(e,t,n)=>new ot({left:e,right:t,typeName:S.ZodIntersection,...C(n)});var xe=class e extends T{_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==y.array)return g(r,{code:m.invalid_type,expected:y.array,received:r.parsedType}),v;if(r.data.length<this._def.items.length)return g(r,{code:m.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),v;!this._def.rest&&r.data.length>this._def.items.length&&(g(r,{code:m.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());let a=[...r.data].map((o,s)=>{let c=this._def.items[s]||this._def.rest;return c?c._parse(new de(r,o,r.path,s)):null}).filter(o=>!!o);return r.common.async?Promise.all(a).then(o=>q.mergeArray(n,o)):q.mergeArray(n,a)}get items(){return this._def.items}rest(t){return new e({...this._def,rest:t})}};xe.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new xe({items:e,typeName:S.ZodTuple,rest:null,...C(t)})};var bn=class e extends T{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==y.object)return g(r,{code:m.invalid_type,expected:y.object,received:r.parsedType}),v;let i=[],a=this._def.keyType,o=this._def.valueType;for(let s in r.data)i.push({key:a._parse(new de(r,s,r.path,s)),value:o._parse(new de(r,r.data[s],r.path,s)),alwaysSet:s in r.data});return r.common.async?q.mergeObjectAsync(n,i):q.mergeObjectSync(n,i)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof T?new e({keyType:t,valueType:n,typeName:S.ZodRecord,...C(r)}):new e({keyType:Ue.create(),valueType:t,typeName:S.ZodRecord,...C(n)})}},Pt=class extends T{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==y.map)return g(r,{code:m.invalid_type,expected:y.map,received:r.parsedType}),v;let i=this._def.keyType,a=this._def.valueType,o=[...r.data.entries()].map(([s,c],d)=>({key:i._parse(new de(r,s,r.path,[d,"key"])),value:a._parse(new de(r,c,r.path,[d,"value"]))}));if(r.common.async){let s=new Map;return Promise.resolve().then(async()=>{for(let c of o){let d=await c.key,u=await c.value;if(d.status==="aborted"||u.status==="aborted")return v;(d.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(d.value,u.value)}return{status:n.value,value:s}})}else{let s=new Map;for(let c of o){let d=c.key,u=c.value;if(d.status==="aborted"||u.status==="aborted")return v;(d.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(d.value,u.value)}return{status:n.value,value:s}}}};Pt.create=(e,t,n)=>new Pt({valueType:t,keyType:e,typeName:S.ZodMap,...C(n)});var It=class e extends T{_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==y.set)return g(r,{code:m.invalid_type,expected:y.set,received:r.parsedType}),v;let i=this._def;i.minSize!==null&&r.data.size<i.minSize.value&&(g(r,{code:m.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),n.dirty()),i.maxSize!==null&&r.data.size>i.maxSize.value&&(g(r,{code:m.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),n.dirty());let a=this._def.valueType;function o(c){let d=new Set;for(let u of c){if(u.status==="aborted")return v;u.status==="dirty"&&n.dirty(),d.add(u.value)}return{status:n.value,value:d}}let s=[...r.data.values()].map((c,d)=>a._parse(new de(r,c,r.path,d)));return r.common.async?Promise.all(s).then(c=>o(c)):o(s)}min(t,n){return new e({...this._def,minSize:{value:t,message:k.toString(n)}})}max(t,n){return new e({...this._def,maxSize:{value:t,message:k.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}};It.create=(e,t)=>new It({valueType:e,minSize:null,maxSize:null,typeName:S.ZodSet,...C(t)});var yn=class e extends T{constructor(){super(...arguments),this.validate=this.implement}_parse(t){let{ctx:n}=this._processInputParams(t);if(n.parsedType!==y.function)return g(n,{code:m.invalid_type,expected:y.function,received:n.parsedType}),v;function r(s,c){return Gt({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,St(),Ae].filter(d=>!!d),issueData:{code:m.invalid_arguments,argumentsError:c}})}function i(s,c){return Gt({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,St(),Ae].filter(d=>!!d),issueData:{code:m.invalid_return_type,returnTypeError:c}})}let a={errorMap:n.common.contextualErrorMap},o=n.data;if(this._def.returns instanceof He){let s=this;return Y(async function(...c){let d=new re([]),u=await s._def.args.parseAsync(c,a).catch(f=>{throw d.addIssue(r(c,f)),d}),p=await Reflect.apply(o,this,u);return await s._def.returns._def.type.parseAsync(p,a).catch(f=>{throw d.addIssue(i(p,f)),d})})}else{let s=this;return Y(function(...c){let d=s._def.args.safeParse(c,a);if(!d.success)throw new re([r(c,d.error)]);let u=Reflect.apply(o,this,d.data),p=s._def.returns.safeParse(u,a);if(!p.success)throw new re([i(u,p.error)]);return p.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new e({...this._def,args:xe.create(t).rest(Ie.create())})}returns(t){return new e({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new e({args:t||xe.create([]).rest(Ie.create()),returns:n||Ie.create(),typeName:S.ZodFunction,...C(r)})}},st=class extends T{get schema(){return this._def.getter()}_parse(t){let{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}};st.create=(e,t)=>new st({getter:e,typeName:S.ZodLazy,...C(t)});var lt=class extends T{_parse(t){if(t.data!==this._def.value){let n=this._getOrReturnCtx(t);return g(n,{received:n.data,code:m.invalid_literal,expected:this._def.value}),v}return{status:"valid",value:t.data}}get value(){return this._def.value}};lt.create=(e,t)=>new lt({value:e,typeName:S.ZodLiteral,...C(t)});function gi(e,t){return new ct({values:e,typeName:S.ZodEnum,...C(t)})}var ct=class e extends T{_parse(t){if(typeof t.data!="string"){let n=this._getOrReturnCtx(t),r=this._def.values;return g(n,{expected:P.joinValues(r),received:n.parsedType,code:m.invalid_type}),v}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(t.data)){let n=this._getOrReturnCtx(t),r=this._def.values;return g(n,{received:n.data,code:m.invalid_enum_value,options:r}),v}return Y(t.data)}get options(){return this._def.values}get enum(){let t={};for(let n of this._def.values)t[n]=n;return t}get Values(){let t={};for(let n of this._def.values)t[n]=n;return t}get Enum(){let t={};for(let n of this._def.values)t[n]=n;return t}extract(t,n=this._def){return e.create(t,{...this._def,...n})}exclude(t,n=this._def){return e.create(this.options.filter(r=>!t.includes(r)),{...this._def,...n})}};ct.create=gi;var dt=class extends T{_parse(t){let n=P.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==y.string&&r.parsedType!==y.number){let i=P.objectValues(n);return g(r,{expected:P.joinValues(i),received:r.parsedType,code:m.invalid_type}),v}if(this._cache||(this._cache=new Set(P.getValidEnumValues(this._def.values))),!this._cache.has(t.data)){let i=P.objectValues(n);return g(r,{received:r.data,code:m.invalid_enum_value,options:i}),v}return Y(t.data)}get enum(){return this._def.values}};dt.create=(e,t)=>new dt({values:e,typeName:S.ZodNativeEnum,...C(t)});var He=class extends T{unwrap(){return this._def.type}_parse(t){let{ctx:n}=this._processInputParams(t);if(n.parsedType!==y.promise&&n.common.async===!1)return g(n,{code:m.invalid_type,expected:y.promise,received:n.parsedType}),v;let r=n.parsedType===y.promise?n.data:Promise.resolve(n.data);return Y(r.then(i=>this._def.type.parseAsync(i,{path:n.path,errorMap:n.common.contextualErrorMap})))}};He.create=(e,t)=>new He({type:e,typeName:S.ZodPromise,...C(t)});var ue=class extends T{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===S.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){let{status:n,ctx:r}=this._processInputParams(t),i=this._def.effect||null,a={addIssue:o=>{g(r,o),o.fatal?n.abort():n.dirty()},get path(){return r.path}};if(a.addIssue=a.addIssue.bind(a),i.type==="preprocess"){let o=i.transform(r.data,a);if(r.common.async)return Promise.resolve(o).then(async s=>{if(n.value==="aborted")return v;let c=await this._def.schema._parseAsync({data:s,path:r.path,parent:r});return c.status==="aborted"?v:c.status==="dirty"?Xe(c.value):n.value==="dirty"?Xe(c.value):c});{if(n.value==="aborted")return v;let s=this._def.schema._parseSync({data:o,path:r.path,parent:r});return s.status==="aborted"?v:s.status==="dirty"?Xe(s.value):n.value==="dirty"?Xe(s.value):s}}if(i.type==="refinement"){let o=s=>{let c=i.refinement(s,a);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return s};if(r.common.async===!1){let s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?v:(s.status==="dirty"&&n.dirty(),o(s.value),{status:n.value,value:s.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>s.status==="aborted"?v:(s.status==="dirty"&&n.dirty(),o(s.value).then(()=>({status:n.value,value:s.value}))))}if(i.type==="transform")if(r.common.async===!1){let o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!ze(o))return v;let s=i.transform(o.value,a);if(s instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:s}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>ze(o)?Promise.resolve(i.transform(o.value,a)).then(s=>({status:n.value,value:s})):v);P.assertNever(i)}};ue.create=(e,t,n)=>new ue({schema:e,typeName:S.ZodEffects,effect:t,...C(n)});ue.createWithPreprocess=(e,t,n)=>new ue({schema:t,effect:{type:"preprocess",transform:e},typeName:S.ZodEffects,...C(n)});var ce=class extends T{_parse(t){return this._getType(t)===y.undefined?Y(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}};ce.create=(e,t)=>new ce({innerType:e,typeName:S.ZodOptional,...C(t)});var ke=class extends T{_parse(t){return this._getType(t)===y.null?Y(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}};ke.create=(e,t)=>new ke({innerType:e,typeName:S.ZodNullable,...C(t)});var ut=class extends T{_parse(t){let{ctx:n}=this._processInputParams(t),r=n.data;return n.parsedType===y.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}};ut.create=(e,t)=>new ut({innerType:e,typeName:S.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...C(t)});var pt=class extends T{_parse(t){let{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},i=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return _t(i)?i.then(a=>({status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new re(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new re(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}};pt.create=(e,t)=>new pt({innerType:e,typeName:S.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...C(t)});var Et=class extends T{_parse(t){if(this._getType(t)!==y.nan){let r=this._getOrReturnCtx(t);return g(r,{code:m.invalid_type,expected:y.nan,received:r.parsedType}),v}return{status:"valid",value:t.data}}};Et.create=e=>new Et({typeName:S.ZodNaN,...C(e)});var ms=Symbol("zod_brand"),Kt=class extends T{_parse(t){let{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}},Yt=class e extends T{_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{let a=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?v:a.status==="dirty"?(n.dirty(),Xe(a.value)):this._def.out._parseAsync({data:a.value,path:r.path,parent:r})})();{let i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?v:i.status==="dirty"?(n.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(t,n){return new e({in:t,out:n,typeName:S.ZodPipeline})}},ht=class extends T{_parse(t){let n=this._def.innerType._parse(t),r=i=>(ze(i)&&(i.value=Object.freeze(i.value)),i);return _t(n)?n.then(i=>r(i)):r(n)}unwrap(){return this._def.innerType}};ht.create=(e,t)=>new ht({innerType:e,typeName:S.ZodReadonly,...C(t)});function pi(e,t){let n=typeof e=="function"?e(t):typeof e=="string"?{message:e}:e;return typeof n=="string"?{message:n}:n}function bi(e,t={},n){return e?Fe.create().superRefine((r,i)=>{let a=e(r);if(a instanceof Promise)return a.then(o=>{if(!o){let s=pi(t,r),c=s.fatal??n??!0;i.addIssue({code:"custom",...s,fatal:c})}});if(!a){let o=pi(t,r),s=o.fatal??n??!0;i.addIssue({code:"custom",...o,fatal:s})}}):Fe.create()}var fs={object:ie.lazycreate},S;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(S||(S={}));var gs=(e,t={message:`Input not instance of ${e.name}`})=>bi(n=>n instanceof e,t),yi=Ue.create,xi=Qe.create,bs=Et.create,ys=et.create,ki=tt.create,xs=nt.create,ks=Tt.create,ws=rt.create,vs=it.create,Ss=Fe.create,_s=Ie.create,Cs=he.create,Ts=At.create,As=Ee.create,Ps=ie.create,Is=ie.strictCreate,Es=at.create,Rs=gn.create,$s=ot.create,Ds=xe.create,Ns=bn.create,Ms=Pt.create,Ls=It.create,Os=yn.create,js=st.create,zs=lt.create,Us=ct.create,Fs=dt.create,Hs=He.create,Bs=ue.create,Ws=ce.create,Vs=ke.create,Js=ue.createWithPreprocess,Zs=Yt.create,qs=()=>yi().optional(),Gs=()=>xi().optional(),Ks=()=>ki().optional(),Ys={string:(e=>Ue.create({...e,coerce:!0})),number:(e=>Qe.create({...e,coerce:!0})),boolean:(e=>tt.create({...e,coerce:!0})),bigint:(e=>et.create({...e,coerce:!0})),date:(e=>nt.create({...e,coerce:!0}))};var Xs=v;var nr=l.object({id:l.string()}),Qs=l.enum(["top","right","bottom","left","auto"]).default("auto"),rr=l.enum(["left","middle","right"]),el=rr.default("left"),wi=l.object({label:l.string().optional(),hidden:l.boolean().default(!1)}),tl={background:l.string().optional(),textColor:l.string().optional(),borderRadius:l.string().optional(),textAlign:el,anchor:Qs,showNavigation:l.boolean().default(!0),prevButton:wi.optional(),nextButton:wi.optional()},nl=l.enum(["pointer","callout","area"]),rl=l.discriminatedUnion("type",[l.object({type:l.literal("html-element"),alphaId:l.string().min(1)})]),il=nr.extend({type:l.literal("message"),variant:nl.default("callout"),x:l.number().min(0).max(1),y:l.number().min(0).max(1),w:l.number().min(0).max(1).optional(),h:l.number().min(0).max(1).optional(),text:l.string().optional(),target:rl.optional(),advancesStep:l.boolean().default(!0),...tl}),al=nr.extend({type:l.literal("blur"),x:l.number().min(0).max(1),y:l.number().min(0).max(1),w:l.number().min(0).max(1),h:l.number().min(0).max(1),intensity:l.number().min(0).max(20).default(8)}),ol=nr.extend({type:l.literal("text"),x:l.number().min(0).max(1),y:l.number().min(0).max(1),text:l.string(),fontSize:l.number().positive().default(16),color:l.string().optional()}),vi=l.discriminatedUnion("type",[il,al,ol]),Si=new Set(["message","blur","text"]),_i=l.object({type:l.string()}).passthrough();function Ci(e){return typeof e=="object"&&e!==null?e.type:void 0}var Ti=l.any().superRefine((e,t)=>{let i=(Si.has(Ci(e))?vi:_i).safeParse(e);if(!i.success)for(let a of i.error.issues)t.addIssue(a)}).transform(e=>(Si.has(Ci(e))?vi:_i).parse(e));var Ai=l.object({label:l.string().min(1),href:l.string().refine(e=>/^(https?:|mailto:)/i.test(e),"href must be an http(s) or mailto URL")}),ir=l.object({logo:l.string().min(1).optional(),name:l.string().min(1).optional(),logoHref:l.string().refine(e=>/^(https?:|mailto:)/i.test(e),"logoHref must be an http(s) or mailto URL").optional(),favicon:l.string().min(1).optional(),cta:Ai.optional(),secondaryCta:Ai.optional(),watermark:l.boolean().optional()}),Pi=ir.omit({favicon:!0});var sl=l.object({type:l.literal("next")}),ll=l.object({type:l.literal("prev")}),cl=l.object({type:l.literal("step"),stepId:l.string().min(1)}),dl=l.object({type:l.literal("chapter"),chapterId:l.string().min(1)}),ul=l.object({type:l.literal("url"),href:l.string().min(1),target:l.enum(["_self","_blank"]).default("_blank")}),pl=l.object({type:l.literal("restart")}),hl=l.discriminatedUnion("type",[sl,ll,cl,dl,ul,pl]),ml=l.enum(["shimmer"]),xn=l.object({label:l.string().min(1),action:hl.default({type:"next"}),animation:ml.optional(),background:l.string().optional(),textColor:l.string().optional()});var fl="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",ar=/^[A-Za-z0-9_-]{12}$/;function gl(e){let t=globalThis.crypto;if(!t||typeof t.getRandomValues!="function")throw new Error("generateDemoId requires globalThis.crypto.getRandomValues (Node 19+, browsers, or edge runtime).");t.getRandomValues(e)}function oe(){let e=new Uint8Array(12);gl(e);let t="";for(let n of e)t+=fl.charAt(n&63);return t}function Ii(e){return typeof e=="string"&&ar.test(e)}function Ei(e){return String(e+1).padStart(4,"0")}function Ri(e){return`snap-${e.toString().padStart(3,"0")}`}function kn(e){let t=((e??"").toLowerCase().split(";")[0]??"").trim();return t.startsWith("image/")?"image":t.startsWith("video/")?"video":t.startsWith("audio/")?"audio":t.startsWith("font/")||t.includes("font")||t.includes("woff")?"font":"other"}function or(e){if(!e)return"";let t=e.replace(/^(?:tree\s*item|menu\s*item|menuitem|list\s*item|tab(?:\s*panel)?|button|link|option|region|combobox|radio|checkbox|switch|dialog|row|cell|columnheader|rowheader|navigation|article|banner|main|complementary|contentinfo)\s*:?\s+/i,"").trim();return(t.split(/\r?\n/).map(r=>r.trim()).find(Boolean)??t).replace(/\s+/g," ").trim().slice(0,48)}function sr(e){let{stepId:t,assetId:n,posterAssetId:r,kind:i,isLast:a}=e,o=`asset:${n}`,s=i==="video"?{type:"video",src:o,posterSrc:r?`asset:${r}`:void 0,naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight,alt:e.title,sourceUrl:e.sourceUrl??"",title:e.title,autoplay:!0,muted:!0,objectFit:"cover"}:{type:"image",src:o,naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight,alt:e.title,sourceUrl:e.sourceUrl??"",title:e.title,objectFit:"cover"},c=e.click,d=[];if(c){let h=or(c.label);d.push({id:`${t}_pointer`,type:"message",variant:"pointer",x:c.x,y:c.y,text:h?`Click on "${h}"`:"Continue",anchor:"auto",textAlign:"left",advancesStep:!0,showNavigation:!0})}else d.push({id:`${t}_callout`,type:"message",variant:"callout",x:.5,y:.5,text:a?"End of walkthrough":"Continue",anchor:"auto",textAlign:"left",advancesStep:!0,showNavigation:!0});let u=!!c&&!(c.x===0&&c.y===0),p=i==="image"&&e.autoApplyZoom===!0&&u?{zoom:1.35,x:Number(Math.max(0,Math.min(1,c.x)).toFixed(4)),y:Number(Math.max(0,Math.min(1,c.y)).toFixed(4))}:void 0;return{id:t,kind:"content",background:s,...p?{transform:p}:{},annotations:d,advance:{trigger:"click"}}}function $i(e){let{stepId:t,htmlPath:n,click:r}=e,i=[];if(r?.alphaId)i.push({id:`${t}_area`,type:"message",variant:"area",x:Number((r.x??.5).toFixed(4)),y:Number((r.y??.5).toFixed(4)),w:0,h:0,text:or(r.label)||"Click here",target:{type:"html-element",alphaId:r.alphaId},anchor:"auto",textAlign:"left",advancesStep:!0,showNavigation:!0});else if(r){let a=or(r.label);i.push({id:`${t}_pointer`,type:"message",variant:"pointer",x:Number((r.x??.5).toFixed(4)),y:Number((r.y??.5).toFixed(4)),text:a?`Click on "${a}"`:"Continue",anchor:"auto",textAlign:"left",advancesStep:!0,showNavigation:!0})}return{id:t,kind:"content",background:{type:"html",path:n,naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight,zoom:1,scroll:e.scroll,sourceUrl:e.sourceUrl??"",title:e.sourceUrl??""},annotations:i,advance:{trigger:"click"}}}function bl(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function lr(e,t){let n=e;for(let[r,i]of t){let a=bl(r);n=n.replace(new RegExp(`(?:\\.\\./)*assets/${a}`,"g"),i),n=n.replace(new RegExp(`assets/${a}`,"g"),i)}return n}function yl(e){return`<script data-inkly-replay-scroll>(()=>{const c=${JSON.stringify(e).replace(/<\/(script)/gi,"<\\/$1")};function r(){const d=document.documentElement,b=document.body;const vw=innerWidth||d.clientWidth||0;const vh=innerHeight||d.clientHeight||0;const mx=Math.max(0,Math.max(d.scrollWidth,b?b.scrollWidth:0)-vw);const my=Math.max(0,Math.max(d.scrollHeight,b?b.scrollHeight:0)-vh);const x=c.maxX>0&&mx>0?c.x/c.maxX*mx:c.x;const y=c.maxY>0&&my>0?c.y/c.maxY*my:c.y;scrollTo(Math.max(0,x),Math.max(0,y));}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",r,{once:true});r();requestAnimationFrame(r);setTimeout(r,120);setTimeout(r,500);})();</script>`}function Di(e,t){let n=yl(t);return/<\/body\s*>/i.test(e)?e.replace(/<\/body\s*>/i,`${n}</body>`):`${e}${n}`}function Ni(e,t){if(!t||/data-inkly-document-css|document\.css/i.test(e))return e;let n='<link rel="stylesheet" href="./document.css?draft=1" data-inkly-document-css>';return/<\/head\s*>/i.test(e)?e.replace(/<\/head\s*>/i,`${n}</head>`):`${n}${e}`}var Mi=l.object({id:l.string(),text:l.string(),start:l.number().nonnegative().optional(),end:l.number().nonnegative().optional()});var xl=l.enum(["screenshot","image","video","audio","font","other"]),kl=l.object({id:l.string().min(1),path:l.string().min(1).optional(),uri:l.string().min(1).optional(),sha256:l.string().regex(/^[0-9a-f]{64}$/),kind:xl,contentType:l.string().min(1).optional(),publicUrl:l.string().min(1).optional(),cdnPath:l.string().min(1).optional(),file:l.string().min(1).optional(),size:l.number().int().nonnegative().optional(),createdAt:l.string().min(1).optional(),updatedAt:l.string().min(1).optional(),viewport:l.object({w:l.number().int().positive(),h:l.number().int().positive()}).optional()}),Rt=l.object({version:l.literal(1),assets:l.array(kl),screens:l.array(l.unknown()).optional()});var cr=l.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,{message:"must be a hex color like #5b3df5"}),wl=l.enum(["color","image","glassmorphism"]),Li=l.object({type:wl,color:cr.optional(),from:cr.optional(),to:cr.optional(),src:l.string().min(1).optional(),alt:l.string().optional(),intensity:l.number().min(-5).max(48).optional()}).superRefine((e,t)=>{if(e.type==="color"){let n=!!e.color,r=!!e.from&&!!e.to;!n&&!r&&t.addIssue({code:l.ZodIssueCode.custom,path:["color"],message:"color backgrounds require color or from/to"}),!!e.from!=!!e.to&&t.addIssue({code:l.ZodIssueCode.custom,path:e.from?["to"]:["from"],message:"gradient backgrounds require both from and to"})}e.type==="image"&&!e.src&&t.addIssue({code:l.ZodIssueCode.custom,path:["src"],message:"image backgrounds require src"})}),Oi=l.object({src:l.string(),alt:l.string().optional()});var dr=l.object({src:l.string().min(1),duration:l.number().positive().optional()});var vl=l.enum(["text","dropdown"]),Sl=l.object({value:l.string().min(1),label:l.string().min(1)}),_l=l.object({id:l.string(),label:l.string(),type:vl.default("text"),placeholder:l.string().optional(),required:l.boolean().default(!1),options:l.array(Sl).optional()}).superRefine((e,t)=>{e.type==="dropdown"&&(!e.options||e.options.length===0)&&t.addIssue({code:l.ZodIssueCode.custom,message:"Dropdown field requires at least one option.",path:["options"]})}),Hi=l.object({src:l.string().min(1),alt:l.string().optional(),height:l.number().int().positive().optional()}),Cl=l.enum(["left","right","top"]),Tl=l.enum(["standard","hero"]),Bi=l.object({src:l.string().min(1),alt:l.string().optional(),naturalWidth:l.number().positive().optional(),naturalHeight:l.number().positive().optional(),position:Cl.default("right"),layout:Tl.default("hero")}),Al=l.object({type:l.literal("headline"),id:l.string(),logo:Hi.optional(),image:Bi.optional(),title:l.string(),titleColor:l.string().optional(),description:l.string().optional(),descriptionColor:l.string().optional(),textAlign:rr.optional(),cta:xn.optional(),secondaryCta:xn.optional()}),Pl=l.object({type:l.literal("form"),id:l.string(),logo:Hi.optional(),image:Bi.optional(),title:l.string().optional(),description:l.string().optional(),fields:l.array(_l).min(1),submit:xn.default({label:"Submit",action:{type:"next"}})}),Il="allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-presentation",El="camera; microphone; fullscreen; payment; clipboard-write",Rl=l.object({type:l.literal("embed"),id:l.string(),src:l.string(),iframeTitle:l.string().optional(),sandbox:l.string().default(Il),allow:l.string().default(El)}),$l=l.object({type:l.literal("custom"),id:l.string(),name:l.string().min(1),data:l.record(l.unknown()).optional()}),ji=l.discriminatedUnion("type",[Al,Pl,Rl,$l]),zi=new Set(["headline","form","embed","custom"]),Ui=l.object({type:l.string()}).passthrough();function Fi(e){return typeof e=="object"&&e!==null?e.type:void 0}var Wi=l.any().superRefine((e,t)=>{let i=(zi.has(Fi(e))?ji:Ui).safeParse(e);if(!i.success)for(let a of i.error.issues)t.addIssue(a)}).transform(e=>(zi.has(Fi(e))?ji:Ui).parse(e));var Vi=l.enum(["contain","cover","fill"]),Ji=l.enum(["left top","center top","right top","left center","center center","right center","left bottom","center bottom","right bottom"]),Dl=l.object({type:l.literal("image"),src:l.string().min(1),naturalWidth:l.number().positive(),naturalHeight:l.number().positive(),alt:l.string().optional(),sourceUrl:l.string().optional(),title:l.string().optional(),objectFit:Vi.optional(),objectPosition:Ji.optional()}),Nl=l.object({type:l.literal("video"),src:l.string().min(1),posterSrc:l.string().min(1).optional(),naturalWidth:l.number().positive(),naturalHeight:l.number().positive(),alt:l.string().optional(),sourceUrl:l.string().optional(),title:l.string().optional(),autoplay:l.boolean().default(!0),muted:l.boolean().default(!0),objectFit:Vi.optional(),objectPosition:Ji.optional()}),Ml=l.object({x:l.number().nonnegative().default(0),y:l.number().nonnegative().default(0),maxX:l.number().nonnegative().default(0),maxY:l.number().nonnegative().default(0)}),Ll=l.object({type:l.literal("html"),path:l.string().min(1),naturalWidth:l.number().positive(),naturalHeight:l.number().positive(),zoom:l.number().positive().default(1),scroll:Ml.default({x:0,y:0,maxX:0,maxY:0}),sourceUrl:l.string().optional(),title:l.string().optional()}),Ol=l.discriminatedUnion("type",[Dl,Nl,Ll]),jl=l.object({zoom:l.number().min(1).default(1),x:l.number().min(0).max(1).default(.5),y:l.number().min(0).max(1).default(.5)}),zl=l.object({trigger:l.enum(["auto","click"]).default("auto")}).default({trigger:"auto"}),Ul=l.object({kind:l.literal("content").default("content"),id:l.string(),label:l.string().optional(),duration:l.number().positive().optional(),background:Ol,script:l.string().optional(),voiceover:dr.optional(),transform:jl.optional(),advance:zl,annotations:l.array(Ti).default([]),captions:l.array(Mi).optional()}).passthrough(),Fl=l.object({kind:l.literal("cover"),id:l.string(),label:l.string().optional(),widgets:l.array(Wi).length(1),background:Li.optional(),backgroundImage:Oi.optional(),backgroundDim:l.number().min(0).max(1).optional(),script:l.string().optional(),voiceover:dr.optional(),duration:l.number().positive().optional(),advance:l.object({trigger:l.enum(["auto","click"]).default("click")}).default({trigger:"click"})}).passthrough(),Zi=l.discriminatedUnion("kind",[Ul,Fl]);var Hl=/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,qi=l.string().regex(Hl,"must be a hex color like #5b3df5"),wn=l.object({primary:qi.optional(),secondary:qi.optional(),font:l.string().min(1).optional(),radius:l.string().min(1).optional()}).partial();var vn=l.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,{message:"must be a hex color like #5b3df5"}),Bl=l.object({id:l.string(),title:l.string(),stepIds:l.array(l.string()).min(1)}),Wl=l.object({hideHeader:l.boolean().default(!1),hideControls:l.boolean().default(!1),controls:l.enum(["full","minimal","hidden"]).optional(),showHubBreadcrumb:l.boolean().default(!1),mobileFooterMessage:l.boolean().default(!0),autoplay:l.boolean().default(!1)}),Vl=l.object({width:l.number().positive(),height:l.number().positive()}),Jl=l.enum(["public","private"]),Zl=l.enum(["none","color","image"]),ql=l.object({type:Zl,color:vn.optional(),from:vn.optional(),to:vn.optional(),src:l.string().min(1).optional(),alt:l.string().optional()}).superRefine((e,t)=>{if(e.type==="color"){let n=!!e.color,r=!!e.from&&!!e.to;!n&&!r&&t.addIssue({code:l.ZodIssueCode.custom,path:["color"],message:"color backgrounds require color or from/to"}),!!e.from!=!!e.to&&t.addIssue({code:l.ZodIssueCode.custom,path:e.from?["to"]:["from"],message:"gradient backgrounds require both from and to"})}e.type==="image"&&!e.src&&t.addIssue({code:l.ZodIssueCode.custom,path:["src"],message:"image backgrounds require src"})}),mt=l.object({id:l.string().regex(ar,{message:"must be a 12-character URL-safe demo id (see generateDemoId)"}),version:l.number().int().min(1),title:l.string().optional(),subtitle:l.string().optional(),runtime:l.string().min(1).optional(),visibility:Jl.default("public"),backgroundColor:vn.optional(),background:ql.optional(),theme:l.object({preset:l.string().min(1).optional(),tokens:wn.optional(),brand:Pi.optional()}).optional(),chrome:Wl.default({}),aspectRatio:Vl.optional(),chapters:l.array(Bl).default([]),steps:l.array(Zi).min(1)}).passthrough().superRefine((e,t)=>{let n=new Set(e.steps.map(i=>i.id)),r=new Set(e.chapters.map(i=>i.id));e.chapters.forEach((i,a)=>{i.stepIds.forEach(o=>{n.has(o)||t.addIssue({code:l.ZodIssueCode.custom,path:["chapters",a,"stepIds"],message:`Chapter "${i.id}" references unknown step "${o}"`})})}),e.steps.forEach((i,a)=>{i.kind==="cover"&&i.widgets.forEach((o,s)=>{o.type==="headline"&&["cta","secondaryCta"].forEach(c=>{let d=o[c]?.action;d&&(d.type==="step"&&!n.has(d.stepId)&&t.addIssue({code:l.ZodIssueCode.custom,path:["steps",a,"widgets",s,c,"action","stepId"],message:`Widget "${o.id}" CTA targets unknown step "${d.stepId}"`}),d.type==="chapter"&&!r.has(d.chapterId)&&t.addIssue({code:l.ZodIssueCode.custom,path:["steps",a,"widgets",s,c,"action","chapterId"],message:`Widget "${o.id}" CTA targets unknown chapter "${d.chapterId}"`}))})})})});function Sn(e){return mt.parse(e)}function $t(e){let t=typeof e=="object"&&e!==null?e:{},n=Ii(t.id),r=n?t:{...t,id:oe()};return{config:mt.parse(r),changed:!n}}function Gi(e){let t=new Map;e.forEach((r,i)=>{let a=t.get(r.id);a?a.push({entry:r,index:i}):t.set(r.id,[{entry:r,index:i}])});let n=[];for(let r of t.values()){if(r.length<2)continue;let i=[...r].sort((o,s)=>o.entry.updatedAt!==s.entry.updatedAt?o.entry.updatedAt-s.entry.updatedAt:o.index-s.index),[,...a]=i;for(let{entry:o}of a)n.push({entry:o,newId:oe()})}return n}var ur=l.enum(["sidebar","tabs"]),Gl=l.object({name:l.string().min(1),description:l.string().min(1).optional(),icon:l.string().min(1).optional(),demos:l.array(l.string().min(1))}),we=l.object({$schema:l.string().optional(),name:l.string().min(1),runtime:l.string().regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,"runtime must be an exact semver version"),runtimeRange:l.string().min(1).optional(),layout:ur.optional(),theme:l.string().min(1).optional(),tokens:wn.optional(),brand:ir.optional(),title:l.string().min(1).optional(),subtitle:l.string().min(1).optional(),collections:l.array(Gl).optional()});function Ki({slug:e,config:t,resolveAssetSrc:n}){let r=t.title??t.id??e;return{slug:e,title:r,description:Kl(t,r),thumbnail:Ql(t,r,n),visibility:t.visibility}}function _n(e,t){return e.length<=t?e:`${e.slice(0,t-1).trimEnd()}\u2026`}function Kl(e,t){if(e.subtitle?.trim())return _n(e.subtitle.trim(),120);for(let n of e.steps){if(n.kind!=="content")continue;let r=n.captions?.[0]?.text;if(r&&r.trim())return _n(r.trim(),120);break}for(let n of e.steps)if(n.kind==="cover"){for(let r of n.widgets)if(r.type==="headline"&&r.description&&r.description.trim())return _n(r.description.trim(),120)}return _n(`Explore the ${t} workflow.`,120)}function Yl(e){return e.background?e.background.type==="image":e.backgroundImage?!0:e.widgets.some(t=>t.type==="headline"?!!t.title:t.type==="embed"?!!t.src:t.type==="form")}function pr(e,t){return e?t?t(e):e:null}function Xl(e,t){if(!t)return e;let n=e.widgets.map(o=>{if((o.type==="headline"||o.type==="form")&&o.image?.src){let s=t(o.image.src);return s&&s!==o.image.src?{...o,image:{...o.image,src:s}}:o}return o}),r=e.backgroundImage,i=e.background;if(i?.type==="image"&&i.src){let o=t(i.src);o&&o!==i.src&&(i={...i,src:o})}if(r?.src){let o=t(r.src);o&&o!==r.src&&(r={...r,src:o})}return!n.some((o,s)=>o!==e.widgets[s])&&i===e.background&&r===e.backgroundImage?e:{...e,widgets:n,background:i,backgroundImage:r}}function Ql(e,t,n){let r=e.steps[0];if(r){if(r.kind==="cover"&&Yl(r))return{kind:"cover",cover:Xl(r,n),themeTokens:e.theme?.tokens};if(r.kind==="content"){let i=r.background;if(i?.type==="image"){let a=pr(i.src,n);if(a)return{kind:"image",src:a}}else if(i?.type==="video"){let a=pr(i.posterSrc,n);if(a)return{kind:"image",src:a};let o=pr(i.src,n);if(o)return{kind:"video",src:o}}else if(i?.type==="html")return{kind:"html",path:i.path,naturalWidth:i.naturalWidth,naturalHeight:i.naturalHeight,zoom:i.zoom,scroll:i.scroll}}}return{kind:"placeholder",title:t}}function ec(e){return!e||e==="null"?"":e.replace(/\/+$/,"")}function tc(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function nc(e){return String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"")}function hr(e){let t=nc(e);return/\/index\.html$/i.test(t)||/^index\.html$/i.test(t)?t.replace(/index\.html$/i,"document.css"):/\.html?$/i.test(t)?t.replace(/\.html?$/i,".css"):null}function rc(e){return e.replace(/<meta\b(?=[^>]*\bhttp-equiv\s*=\s*["']?content-security-policy\b)[^>]*>/gi,"")}var ic=/\s+(?:href|xlink:href|target|rel|download|ping|referrerpolicy|data-inkly-href)(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s"'=<>`]+))?/gi;function Xt(e){return String(e||"").replace(/<(a|area)\b[^>]*>/gi,t=>t.replace(ic,""))}function ft(e,t={}){let n=ec(t.resourceOrigin),r=String(e||"");return n?r.replace(new RegExp(`(^|["'\\(\\s,=])${tc("/api/hubs/")}`,"g"),`$1${n}/api/hubs/`):r}function ac(e){return rc(e).replace(/<style\b(?=[^>]*\bdata-inkly-document-css\b)[\s\S]*?<\/style>/gi,"").replace(/<link\b(?=[^>]*\bdata-inkly-document-css\b)[^>]*>/gi,"").replace(/<link\b(?=[^>]*\brel\s*=\s*["']?stylesheet\b)(?=[^>]*\bhref\s*=\s*["']?[^"'\s>]*document\.css(?:\?draft=1)?)[^>]*>/gi,"")}function Yi({htmlPath:e,html:t,css:n,cssHref:r,resourceOrigin:i}){let a=ac(Xt(t)),o=hr(e)!=null,s=n?.trim()??"";if(o&&s){let d=`<style data-inkly-document-css>
3
- ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
4
- </style>`,u=/<\/head\s*>/i.test(a)?a.replace(/<\/head\s*>/i,`${d}</head>`):`${d}${a}`;return ft(u,{resourceOrigin:i})}if(o&&r){let d=`<link rel="stylesheet" href="${ft(r,{resourceOrigin:i})}" data-inkly-document-css>`,u=/<\/head\s*>/i.test(a)?a.replace(/<\/head\s*>/i,`${d}</head>`):`${d}${a}`;return ft(u,{resourceOrigin:i})}return ft(a,{resourceOrigin:i})}var Qt=l.string().regex(/^sha(?:256|384|512)-[A-Za-z0-9+/]+=*$/,{message:"must be an SRI string like sha384-<base64>"}),Cn=l.string().regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,{message:"must be an exact semver like 0.1.0"}),oc=l.object({version:Cn,url:l.string().url(),integrity:Qt}),Tn=l.object({$schema:l.string().optional(),runtime:oc});var Xi=l.string().regex(/^[0-9a-f]{64}$/,{message:"must be lowercase sha-256 hex (64 chars)"}),Dt=l.object({version:Cn,externals:l.array(l.string().min(1)),jsHash:Xi,cssHash:Xi,jsBytes:l.number().int().nonnegative(),cssBytes:l.number().int().nonnegative(),integrity:Qt,cssIntegrity:Qt,minSchema:Cn,codemodsIntegrity:Qt.optional(),codemodsBytes:l.number().int().nonnegative().optional()});var gt=["__inkly","assets","api","c"],sc={__inkly:"'__inkly' is reserved for CLI internal endpoints",assets:"'assets' is reserved for hub static files",api:"'api' is reserved for future use",c:"'c' is reserved for future use"},lc=/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;function Re(e){return typeof e!="string"?{ok:!1,reason:"Name is required."}:e.length===0?{ok:!1,reason:"Name cannot be empty."}:/\s/.test(e)?{ok:!1,reason:"Name cannot contain spaces."}:e.includes("/")||e.includes("\\")?{ok:!1,reason:"Name cannot contain slashes."}:e.includes(".")?{ok:!1,reason:"Name cannot contain dots."}:gt.includes(e)?{ok:!1,reason:sc[e]}:e.startsWith("_")?{ok:!1,reason:"Name cannot start with '_' (reserved for internal use)."}:e!==e.toLowerCase()?{ok:!1,reason:'Name must be lowercase (e.g. "getting-started").'}:lc.test(e)?{ok:!0}:{ok:!1,reason:"Name must be kebab-case: lowercase letters, digits, and hyphens, starting and ending with a letter or digit."}}var Be={inkly:{primary:"#5b6cff",secondary:"#ebebeb",radius:"10px",font:"Geist, ui-sans-serif, system-ui, sans-serif"},editorial:{primary:"#d97757",secondary:"#f4f0e7",radius:"12px",font:"Inter, ui-sans-serif, system-ui, sans-serif"},mono:{primary:"#5b6cff",secondary:"#f5f5f5",radius:"10px",font:"Inter, ui-sans-serif, system-ui, sans-serif"},substack:{primary:"#ff6719",secondary:"#fdf1eb",radius:"4px",font:"Inter, ui-sans-serif, system-ui, sans-serif"}};var cc=`
2
+ var Xo=Object.defineProperty;var Qo=(e,t)=>{for(var n in t)Xo(e,n,{get:t[n],enumerable:!0})};import Qh from"mri";import{existsSync as yi,statSync as em}from"fs";import{basename as tm,isAbsolute as nm,join as Lo,resolve as rm}from"path";import{Buffer as nd}from"buffer";import{mkdir as ba,writeFile as rd,access as id}from"fs/promises";import{dirname as ad,join as od,resolve as sd,sep as ya}from"path";var c={};Qo(c,{BRAND:()=>Cs,DIRTY:()=>et,EMPTY_PATH:()=>rs,INVALID:()=>S,NEVER:()=>cl,OK:()=>Q,ParseStatus:()=>q,Schema:()=>E,ZodAny:()=>He,ZodArray:()=>Re,ZodBigInt:()=>nt,ZodBoolean:()=>rt,ZodBranded:()=>nn,ZodCatch:()=>mt,ZodDate:()=>it,ZodDefault:()=>ht,ZodDiscriminatedUnion:()=>kn,ZodEffects:()=>me,ZodEnum:()=>ut,ZodError:()=>re,ZodFirstPartyTypeKind:()=>_,ZodFunction:()=>vn,ZodIntersection:()=>lt,ZodIssueCode:()=>f,ZodLazy:()=>ct,ZodLiteral:()=>dt,ZodMap:()=>Rt,ZodNaN:()=>Dt,ZodNativeEnum:()=>pt,ZodNever:()=>ge,ZodNull:()=>ot,ZodNullable:()=>Se,ZodNumber:()=>tt,ZodObject:()=>ie,ZodOptional:()=>pe,ZodParsedType:()=>b,ZodPipeline:()=>rn,ZodPromise:()=>Be,ZodReadonly:()=>ft,ZodRecord:()=>wn,ZodSchema:()=>E,ZodSet:()=>$t,ZodString:()=>Fe,ZodSymbol:()=>It,ZodTransformer:()=>me,ZodTuple:()=>ve,ZodType:()=>E,ZodUndefined:()=>at,ZodUnion:()=>st,ZodUnknown:()=>Ee,ZodVoid:()=>Et,addIssueToContext:()=>g,any:()=>Ns,array:()=>js,bigint:()=>Is,boolean:()=>Ri,coerce:()=>ll,custom:()=>Pi,date:()=>Es,datetimeRegex:()=>Ti,defaultErrorMap:()=>Pe,discriminatedUnion:()=>Hs,effect:()=>el,enum:()=>Ys,function:()=>Zs,getErrorMap:()=>Tt,getParsedType:()=>we,instanceof:()=>As,intersection:()=>Bs,isAborted:()=>yn,isAsync:()=>At,isDirty:()=>xn,isValid:()=>ze,late:()=>Ts,lazy:()=>Gs,literal:()=>Ks,makeIssue:()=>tn,map:()=>Js,nan:()=>Ps,nativeEnum:()=>Xs,never:()=>Ls,null:()=>Ds,nullable:()=>nl,number:()=>Ei,object:()=>Us,objectUtil:()=>cr,oboolean:()=>sl,onumber:()=>ol,optional:()=>tl,ostring:()=>al,pipeline:()=>il,preprocess:()=>rl,promise:()=>Qs,quotelessJson:()=>es,record:()=>Vs,set:()=>qs,setErrorMap:()=>ns,strictObject:()=>zs,string:()=>Ii,symbol:()=>Rs,transformer:()=>el,tuple:()=>Ws,undefined:()=>$s,union:()=>Fs,unknown:()=>Ms,util:()=>$,void:()=>Os});var $;(function(e){e.assertEqual=i=>{};function t(i){}e.assertIs=t;function n(i){throw new Error}e.assertNever=n,e.arrayToEnum=i=>{let a={};for(let o of i)a[o]=o;return a},e.getValidEnumValues=i=>{let a=e.objectKeys(i).filter(s=>typeof i[i[s]]!="number"),o={};for(let s of a)o[s]=i[s];return e.objectValues(o)},e.objectValues=i=>e.objectKeys(i).map(function(a){return i[a]}),e.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{let a=[];for(let o in i)Object.prototype.hasOwnProperty.call(i,o)&&a.push(o);return a},e.find=(i,a)=>{for(let o of i)if(a(o))return o},e.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&Number.isFinite(i)&&Math.floor(i)===i;function r(i,a=" | "){return i.map(o=>typeof o=="string"?`'${o}'`:o).join(a)}e.joinValues=r,e.jsonStringifyReplacer=(i,a)=>typeof a=="bigint"?a.toString():a})($||($={}));var cr;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(cr||(cr={}));var b=$.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),we=e=>{switch(typeof e){case"undefined":return b.undefined;case"string":return b.string;case"number":return Number.isNaN(e)?b.nan:b.number;case"boolean":return b.boolean;case"function":return b.function;case"bigint":return b.bigint;case"symbol":return b.symbol;case"object":return Array.isArray(e)?b.array:e===null?b.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?b.promise:typeof Map<"u"&&e instanceof Map?b.map:typeof Set<"u"&&e instanceof Set?b.set:typeof Date<"u"&&e instanceof Date?b.date:b.object;default:return b.unknown}};var f=$.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),es=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:"),re=class e extends Error{get errors(){return this.issues}constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};let n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}format(t){let n=t||function(a){return a.message},r={_errors:[]},i=a=>{for(let o of a.issues)if(o.code==="invalid_union")o.unionErrors.map(i);else if(o.code==="invalid_return_type")i(o.returnTypeError);else if(o.code==="invalid_arguments")i(o.argumentsError);else if(o.path.length===0)r._errors.push(n(o));else{let s=r,l=0;for(;l<o.path.length;){let d=o.path[l];l===o.path.length-1?(s[d]=s[d]||{_errors:[]},s[d]._errors.push(n(o))):s[d]=s[d]||{_errors:[]},s=s[d],l++}}};return i(this),r}static assert(t){if(!(t instanceof e))throw new Error(`Not a ZodError: ${t}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,$.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(t=n=>n.message){let n={},r=[];for(let i of this.issues)if(i.path.length>0){let a=i.path[0];n[a]=n[a]||[],n[a].push(t(i))}else r.push(t(i));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}};re.create=e=>new re(e);var ts=(e,t)=>{let n;switch(e.code){case f.invalid_type:e.received===b.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case f.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,$.jsonStringifyReplacer)}`;break;case f.unrecognized_keys:n=`Unrecognized key(s) in object: ${$.joinValues(e.keys,", ")}`;break;case f.invalid_union:n="Invalid input";break;case f.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${$.joinValues(e.options)}`;break;case f.invalid_enum_value:n=`Invalid enum value. Expected ${$.joinValues(e.options)}, received '${e.received}'`;break;case f.invalid_arguments:n="Invalid function arguments";break;case f.invalid_return_type:n="Invalid function return type";break;case f.invalid_date:n="Invalid date";break;case f.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:$.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case f.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="bigint"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case f.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case f.custom:n="Invalid input";break;case f.invalid_intersection_types:n="Intersection results could not be merged";break;case f.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case f.not_finite:n="Number must be finite";break;default:n=t.defaultError,$.assertNever(e)}return{message:n}},Pe=ts;var wi=Pe;function ns(e){wi=e}function Tt(){return wi}var tn=e=>{let{data:t,path:n,errorMaps:r,issueData:i}=e,a=[...n,...i.path||[]],o={...i,path:a};if(i.message!==void 0)return{...i,path:a,message:i.message};let s="",l=r.filter(d=>!!d).slice().reverse();for(let d of l)s=d(o,{data:t,defaultError:s}).message;return{...i,path:a,message:s}},rs=[];function g(e,t){let n=Tt(),r=tn({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,n,n===Pe?void 0:Pe].filter(i=>!!i)});e.common.issues.push(r)}var q=class e{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){let r=[];for(let i of n){if(i.status==="aborted")return S;i.status==="dirty"&&t.dirty(),r.push(i.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){let r=[];for(let i of n){let a=await i.key,o=await i.value;r.push({key:a,value:o})}return e.mergeObjectSync(t,r)}static mergeObjectSync(t,n){let r={};for(let i of n){let{key:a,value:o}=i;if(a.status==="aborted"||o.status==="aborted")return S;a.status==="dirty"&&t.dirty(),o.status==="dirty"&&t.dirty(),a.value!=="__proto__"&&(typeof o.value<"u"||i.alwaysSet)&&(r[a.value]=o.value)}return{status:t.value,value:r}}},S=Object.freeze({status:"aborted"}),et=e=>({status:"dirty",value:e}),Q=e=>({status:"valid",value:e}),yn=e=>e.status==="aborted",xn=e=>e.status==="dirty",ze=e=>e.status==="valid",At=e=>typeof Promise<"u"&&e instanceof Promise;var v;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t?.message})(v||(v={}));var he=class{constructor(t,n,r,i){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=i}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},vi=(e,t)=>{if(ze(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let n=new re(e.common.issues);return this._error=n,this._error}}};function P(e){if(!e)return{};let{errorMap:t,invalid_type_error:n,required_error:r,description:i}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:i}:{errorMap:(o,s)=>{let{message:l}=e;return o.code==="invalid_enum_value"?{message:l??s.defaultError}:typeof s.data>"u"?{message:l??r??s.defaultError}:o.code!=="invalid_type"?{message:s.defaultError}:{message:l??n??s.defaultError}},description:i}}var E=class{get description(){return this._def.description}_getType(t){return we(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:we(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new q,ctx:{common:t.parent.common,data:t.data,parsedType:we(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){let n=this._parse(t);if(At(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){let n=this._parse(t);return Promise.resolve(n)}parse(t,n){let r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){let r={common:{issues:[],async:n?.async??!1,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:we(t)},i=this._parseSync({data:t,path:r.path,parent:r});return vi(r,i)}"~validate"(t){let n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:we(t)};if(!this["~standard"].async)try{let r=this._parseSync({data:t,path:[],parent:n});return ze(r)?{value:r.value}:{issues:n.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:t,path:[],parent:n}).then(r=>ze(r)?{value:r.value}:{issues:n.common.issues})}async parseAsync(t,n){let r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){let r={common:{issues:[],contextualErrorMap:n?.errorMap,async:!0},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:we(t)},i=this._parse({data:t,path:r.path,parent:r}),a=await(At(i)?i:Promise.resolve(i));return vi(r,a)}refine(t,n){let r=i=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(i):n;return this._refinement((i,a)=>{let o=t(i),s=()=>a.addIssue({code:f.custom,...r(i)});return typeof Promise<"u"&&o instanceof Promise?o.then(l=>l?!0:(s(),!1)):o?!0:(s(),!1)})}refinement(t,n){return this._refinement((r,i)=>t(r)?!0:(i.addIssue(typeof n=="function"?n(r,i):n),!1))}_refinement(t){return new me({schema:this,typeName:_.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return pe.create(this,this._def)}nullable(){return Se.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Re.create(this)}promise(){return Be.create(this,this._def)}or(t){return st.create([this,t],this._def)}and(t){return lt.create(this,t,this._def)}transform(t){return new me({...P(this._def),schema:this,typeName:_.ZodEffects,effect:{type:"transform",transform:t}})}default(t){let n=typeof t=="function"?t:()=>t;return new ht({...P(this._def),innerType:this,defaultValue:n,typeName:_.ZodDefault})}brand(){return new nn({typeName:_.ZodBranded,type:this,...P(this._def)})}catch(t){let n=typeof t=="function"?t:()=>t;return new mt({...P(this._def),innerType:this,catchValue:n,typeName:_.ZodCatch})}describe(t){let n=this.constructor;return new n({...this._def,description:t})}pipe(t){return rn.create(this,t)}readonly(){return ft.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},is=/^c[^\s-]{8,}$/i,as=/^[0-9a-z]+$/,os=/^[0-9A-HJKMNP-TV-Z]{26}$/i,ss=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,ls=/^[a-z0-9_-]{21}$/i,cs=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,ds=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,us=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,ps="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",dr,hs=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ms=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,fs=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,gs=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,bs=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,ys=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,_i="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",xs=new RegExp(`^${_i}$`);function Ci(e){let t="[0-5]\\d";e.precision?t=`${t}\\.\\d{${e.precision}}`:e.precision==null&&(t=`${t}(\\.\\d+)?`);let n=e.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${t})${n}`}function ks(e){return new RegExp(`^${Ci(e)}$`)}function Ti(e){let t=`${_i}T${Ci(e)}`,n=[];return n.push(e.local?"Z?":"Z"),e.offset&&n.push("([+-]\\d{2}:?\\d{2})"),t=`${t}(${n.join("|")})`,new RegExp(`^${t}$`)}function ws(e,t){return!!((t==="v4"||!t)&&hs.test(e)||(t==="v6"||!t)&&fs.test(e))}function vs(e,t){if(!cs.test(e))return!1;try{let[n]=e.split(".");if(!n)return!1;let r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),i=JSON.parse(atob(r));return!(typeof i!="object"||i===null||"typ"in i&&i?.typ!=="JWT"||!i.alg||t&&i.alg!==t)}catch{return!1}}function Ss(e,t){return!!((t==="v4"||!t)&&ms.test(e)||(t==="v6"||!t)&&gs.test(e))}var Fe=class e extends E{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==b.string){let a=this._getOrReturnCtx(t);return g(a,{code:f.invalid_type,expected:b.string,received:a.parsedType}),S}let r=new q,i;for(let a of this._def.checks)if(a.kind==="min")t.data.length<a.value&&(i=this._getOrReturnCtx(t,i),g(i,{code:f.too_small,minimum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="max")t.data.length>a.value&&(i=this._getOrReturnCtx(t,i),g(i,{code:f.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="length"){let o=t.data.length>a.value,s=t.data.length<a.value;(o||s)&&(i=this._getOrReturnCtx(t,i),o?g(i,{code:f.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!0,message:a.message}):s&&g(i,{code:f.too_small,minimum:a.value,type:"string",inclusive:!0,exact:!0,message:a.message}),r.dirty())}else if(a.kind==="email")us.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"email",code:f.invalid_string,message:a.message}),r.dirty());else if(a.kind==="emoji")dr||(dr=new RegExp(ps,"u")),dr.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"emoji",code:f.invalid_string,message:a.message}),r.dirty());else if(a.kind==="uuid")ss.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"uuid",code:f.invalid_string,message:a.message}),r.dirty());else if(a.kind==="nanoid")ls.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"nanoid",code:f.invalid_string,message:a.message}),r.dirty());else if(a.kind==="cuid")is.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"cuid",code:f.invalid_string,message:a.message}),r.dirty());else if(a.kind==="cuid2")as.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"cuid2",code:f.invalid_string,message:a.message}),r.dirty());else if(a.kind==="ulid")os.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"ulid",code:f.invalid_string,message:a.message}),r.dirty());else if(a.kind==="url")try{new URL(t.data)}catch{i=this._getOrReturnCtx(t,i),g(i,{validation:"url",code:f.invalid_string,message:a.message}),r.dirty()}else a.kind==="regex"?(a.regex.lastIndex=0,a.regex.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"regex",code:f.invalid_string,message:a.message}),r.dirty())):a.kind==="trim"?t.data=t.data.trim():a.kind==="includes"?t.data.includes(a.value,a.position)||(i=this._getOrReturnCtx(t,i),g(i,{code:f.invalid_string,validation:{includes:a.value,position:a.position},message:a.message}),r.dirty()):a.kind==="toLowerCase"?t.data=t.data.toLowerCase():a.kind==="toUpperCase"?t.data=t.data.toUpperCase():a.kind==="startsWith"?t.data.startsWith(a.value)||(i=this._getOrReturnCtx(t,i),g(i,{code:f.invalid_string,validation:{startsWith:a.value},message:a.message}),r.dirty()):a.kind==="endsWith"?t.data.endsWith(a.value)||(i=this._getOrReturnCtx(t,i),g(i,{code:f.invalid_string,validation:{endsWith:a.value},message:a.message}),r.dirty()):a.kind==="datetime"?Ti(a).test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{code:f.invalid_string,validation:"datetime",message:a.message}),r.dirty()):a.kind==="date"?xs.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{code:f.invalid_string,validation:"date",message:a.message}),r.dirty()):a.kind==="time"?ks(a).test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{code:f.invalid_string,validation:"time",message:a.message}),r.dirty()):a.kind==="duration"?ds.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"duration",code:f.invalid_string,message:a.message}),r.dirty()):a.kind==="ip"?ws(t.data,a.version)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"ip",code:f.invalid_string,message:a.message}),r.dirty()):a.kind==="jwt"?vs(t.data,a.alg)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"jwt",code:f.invalid_string,message:a.message}),r.dirty()):a.kind==="cidr"?Ss(t.data,a.version)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"cidr",code:f.invalid_string,message:a.message}),r.dirty()):a.kind==="base64"?bs.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"base64",code:f.invalid_string,message:a.message}),r.dirty()):a.kind==="base64url"?ys.test(t.data)||(i=this._getOrReturnCtx(t,i),g(i,{validation:"base64url",code:f.invalid_string,message:a.message}),r.dirty()):$.assertNever(a);return{status:r.value,value:t.data}}_regex(t,n,r){return this.refinement(i=>t.test(i),{validation:n,code:f.invalid_string,...v.errToObj(r)})}_addCheck(t){return new e({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...v.errToObj(t)})}url(t){return this._addCheck({kind:"url",...v.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...v.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...v.errToObj(t)})}nanoid(t){return this._addCheck({kind:"nanoid",...v.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...v.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...v.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...v.errToObj(t)})}base64(t){return this._addCheck({kind:"base64",...v.errToObj(t)})}base64url(t){return this._addCheck({kind:"base64url",...v.errToObj(t)})}jwt(t){return this._addCheck({kind:"jwt",...v.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...v.errToObj(t)})}cidr(t){return this._addCheck({kind:"cidr",...v.errToObj(t)})}datetime(t){return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof t?.precision>"u"?null:t?.precision,offset:t?.offset??!1,local:t?.local??!1,...v.errToObj(t?.message)})}date(t){return this._addCheck({kind:"date",message:t})}time(t){return typeof t=="string"?this._addCheck({kind:"time",precision:null,message:t}):this._addCheck({kind:"time",precision:typeof t?.precision>"u"?null:t?.precision,...v.errToObj(t?.message)})}duration(t){return this._addCheck({kind:"duration",...v.errToObj(t)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...v.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n?.position,...v.errToObj(n?.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...v.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...v.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...v.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...v.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...v.errToObj(n)})}nonempty(t){return this.min(1,v.errToObj(t))}trim(){return new e({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new e({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new e({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isDate(){return!!this._def.checks.find(t=>t.kind==="date")}get isTime(){return!!this._def.checks.find(t=>t.kind==="time")}get isDuration(){return!!this._def.checks.find(t=>t.kind==="duration")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(t=>t.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get isCIDR(){return!!this._def.checks.find(t=>t.kind==="cidr")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}get isBase64url(){return!!this._def.checks.find(t=>t.kind==="base64url")}get minLength(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}};Fe.create=e=>new Fe({checks:[],typeName:_.ZodString,coerce:e?.coerce??!1,...P(e)});function _s(e,t){let n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,i=n>r?n:r,a=Number.parseInt(e.toFixed(i).replace(".","")),o=Number.parseInt(t.toFixed(i).replace(".",""));return a%o/10**i}var tt=class e extends E{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==b.number){let a=this._getOrReturnCtx(t);return g(a,{code:f.invalid_type,expected:b.number,received:a.parsedType}),S}let r,i=new q;for(let a of this._def.checks)a.kind==="int"?$.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),g(r,{code:f.invalid_type,expected:"integer",received:"float",message:a.message}),i.dirty()):a.kind==="min"?(a.inclusive?t.data<a.value:t.data<=a.value)&&(r=this._getOrReturnCtx(t,r),g(r,{code:f.too_small,minimum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),i.dirty()):a.kind==="max"?(a.inclusive?t.data>a.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),g(r,{code:f.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),i.dirty()):a.kind==="multipleOf"?_s(t.data,a.value)!==0&&(r=this._getOrReturnCtx(t,r),g(r,{code:f.not_multiple_of,multipleOf:a.value,message:a.message}),i.dirty()):a.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),g(r,{code:f.not_finite,message:a.message}),i.dirty()):$.assertNever(a);return{status:i.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,v.toString(n))}gt(t,n){return this.setLimit("min",t,!1,v.toString(n))}lte(t,n){return this.setLimit("max",t,!0,v.toString(n))}lt(t,n){return this.setLimit("max",t,!1,v.toString(n))}setLimit(t,n,r,i){return new e({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:v.toString(i)}]})}_addCheck(t){return new e({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:v.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:v.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:v.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:v.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:v.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:v.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:v.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:v.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:v.toString(t)})}get minValue(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}get isInt(){return!!this._def.checks.find(t=>t.kind==="int"||t.kind==="multipleOf"&&$.isInteger(t.value))}get isFinite(){let t=null,n=null;for(let r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.value<t)&&(t=r.value)}return Number.isFinite(n)&&Number.isFinite(t)}};tt.create=e=>new tt({checks:[],typeName:_.ZodNumber,coerce:e?.coerce||!1,...P(e)});var nt=class e extends E{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce)try{t.data=BigInt(t.data)}catch{return this._getInvalidInput(t)}if(this._getType(t)!==b.bigint)return this._getInvalidInput(t);let r,i=new q;for(let a of this._def.checks)a.kind==="min"?(a.inclusive?t.data<a.value:t.data<=a.value)&&(r=this._getOrReturnCtx(t,r),g(r,{code:f.too_small,type:"bigint",minimum:a.value,inclusive:a.inclusive,message:a.message}),i.dirty()):a.kind==="max"?(a.inclusive?t.data>a.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),g(r,{code:f.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),i.dirty()):a.kind==="multipleOf"?t.data%a.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),g(r,{code:f.not_multiple_of,multipleOf:a.value,message:a.message}),i.dirty()):$.assertNever(a);return{status:i.value,value:t.data}}_getInvalidInput(t){let n=this._getOrReturnCtx(t);return g(n,{code:f.invalid_type,expected:b.bigint,received:n.parsedType}),S}gte(t,n){return this.setLimit("min",t,!0,v.toString(n))}gt(t,n){return this.setLimit("min",t,!1,v.toString(n))}lte(t,n){return this.setLimit("max",t,!0,v.toString(n))}lt(t,n){return this.setLimit("max",t,!1,v.toString(n))}setLimit(t,n,r,i){return new e({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:v.toString(i)}]})}_addCheck(t){return new e({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:v.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:v.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:v.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:v.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:v.toString(n)})}get minValue(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}};nt.create=e=>new nt({checks:[],typeName:_.ZodBigInt,coerce:e?.coerce??!1,...P(e)});var rt=class extends E{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==b.boolean){let r=this._getOrReturnCtx(t);return g(r,{code:f.invalid_type,expected:b.boolean,received:r.parsedType}),S}return Q(t.data)}};rt.create=e=>new rt({typeName:_.ZodBoolean,coerce:e?.coerce||!1,...P(e)});var it=class e extends E{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==b.date){let a=this._getOrReturnCtx(t);return g(a,{code:f.invalid_type,expected:b.date,received:a.parsedType}),S}if(Number.isNaN(t.data.getTime())){let a=this._getOrReturnCtx(t);return g(a,{code:f.invalid_date}),S}let r=new q,i;for(let a of this._def.checks)a.kind==="min"?t.data.getTime()<a.value&&(i=this._getOrReturnCtx(t,i),g(i,{code:f.too_small,message:a.message,inclusive:!0,exact:!1,minimum:a.value,type:"date"}),r.dirty()):a.kind==="max"?t.data.getTime()>a.value&&(i=this._getOrReturnCtx(t,i),g(i,{code:f.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),r.dirty()):$.assertNever(a);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new e({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:v.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:v.toString(n)})}get minDate(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t!=null?new Date(t):null}};it.create=e=>new it({checks:[],coerce:e?.coerce||!1,typeName:_.ZodDate,...P(e)});var It=class extends E{_parse(t){if(this._getType(t)!==b.symbol){let r=this._getOrReturnCtx(t);return g(r,{code:f.invalid_type,expected:b.symbol,received:r.parsedType}),S}return Q(t.data)}};It.create=e=>new It({typeName:_.ZodSymbol,...P(e)});var at=class extends E{_parse(t){if(this._getType(t)!==b.undefined){let r=this._getOrReturnCtx(t);return g(r,{code:f.invalid_type,expected:b.undefined,received:r.parsedType}),S}return Q(t.data)}};at.create=e=>new at({typeName:_.ZodUndefined,...P(e)});var ot=class extends E{_parse(t){if(this._getType(t)!==b.null){let r=this._getOrReturnCtx(t);return g(r,{code:f.invalid_type,expected:b.null,received:r.parsedType}),S}return Q(t.data)}};ot.create=e=>new ot({typeName:_.ZodNull,...P(e)});var He=class extends E{constructor(){super(...arguments),this._any=!0}_parse(t){return Q(t.data)}};He.create=e=>new He({typeName:_.ZodAny,...P(e)});var Ee=class extends E{constructor(){super(...arguments),this._unknown=!0}_parse(t){return Q(t.data)}};Ee.create=e=>new Ee({typeName:_.ZodUnknown,...P(e)});var ge=class extends E{_parse(t){let n=this._getOrReturnCtx(t);return g(n,{code:f.invalid_type,expected:b.never,received:n.parsedType}),S}};ge.create=e=>new ge({typeName:_.ZodNever,...P(e)});var Et=class extends E{_parse(t){if(this._getType(t)!==b.undefined){let r=this._getOrReturnCtx(t);return g(r,{code:f.invalid_type,expected:b.void,received:r.parsedType}),S}return Q(t.data)}};Et.create=e=>new Et({typeName:_.ZodVoid,...P(e)});var Re=class e extends E{_parse(t){let{ctx:n,status:r}=this._processInputParams(t),i=this._def;if(n.parsedType!==b.array)return g(n,{code:f.invalid_type,expected:b.array,received:n.parsedType}),S;if(i.exactLength!==null){let o=n.data.length>i.exactLength.value,s=n.data.length<i.exactLength.value;(o||s)&&(g(n,{code:o?f.too_big:f.too_small,minimum:s?i.exactLength.value:void 0,maximum:o?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),r.dirty())}if(i.minLength!==null&&n.data.length<i.minLength.value&&(g(n,{code:f.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),r.dirty()),i.maxLength!==null&&n.data.length>i.maxLength.value&&(g(n,{code:f.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((o,s)=>i.type._parseAsync(new he(n,o,n.path,s)))).then(o=>q.mergeArray(r,o));let a=[...n.data].map((o,s)=>i.type._parseSync(new he(n,o,n.path,s)));return q.mergeArray(r,a)}get element(){return this._def.type}min(t,n){return new e({...this._def,minLength:{value:t,message:v.toString(n)}})}max(t,n){return new e({...this._def,maxLength:{value:t,message:v.toString(n)}})}length(t,n){return new e({...this._def,exactLength:{value:t,message:v.toString(n)}})}nonempty(t){return this.min(1,t)}};Re.create=(e,t)=>new Re({type:e,minLength:null,maxLength:null,exactLength:null,typeName:_.ZodArray,...P(t)});function Pt(e){if(e instanceof ie){let t={};for(let n in e.shape){let r=e.shape[n];t[n]=pe.create(Pt(r))}return new ie({...e._def,shape:()=>t})}else return e instanceof Re?new Re({...e._def,type:Pt(e.element)}):e instanceof pe?pe.create(Pt(e.unwrap())):e instanceof Se?Se.create(Pt(e.unwrap())):e instanceof ve?ve.create(e.items.map(t=>Pt(t))):e}var ie=class e extends E{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let t=this._def.shape(),n=$.objectKeys(t);return this._cached={shape:t,keys:n},this._cached}_parse(t){if(this._getType(t)!==b.object){let d=this._getOrReturnCtx(t);return g(d,{code:f.invalid_type,expected:b.object,received:d.parsedType}),S}let{status:r,ctx:i}=this._processInputParams(t),{shape:a,keys:o}=this._getCached(),s=[];if(!(this._def.catchall instanceof ge&&this._def.unknownKeys==="strip"))for(let d in i.data)o.includes(d)||s.push(d);let l=[];for(let d of o){let u=a[d],p=i.data[d];l.push({key:{status:"valid",value:d},value:u._parse(new he(i,p,i.path,d)),alwaysSet:d in i.data})}if(this._def.catchall instanceof ge){let d=this._def.unknownKeys;if(d==="passthrough")for(let u of s)l.push({key:{status:"valid",value:u},value:{status:"valid",value:i.data[u]}});else if(d==="strict")s.length>0&&(g(i,{code:f.unrecognized_keys,keys:s}),r.dirty());else if(d!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let d=this._def.catchall;for(let u of s){let p=i.data[u];l.push({key:{status:"valid",value:u},value:d._parse(new he(i,p,i.path,u)),alwaysSet:u in i.data})}}return i.common.async?Promise.resolve().then(async()=>{let d=[];for(let u of l){let p=await u.key,h=await u.value;d.push({key:p,value:h,alwaysSet:u.alwaysSet})}return d}).then(d=>q.mergeObjectSync(r,d)):q.mergeObjectSync(r,l)}get shape(){return this._def.shape()}strict(t){return v.errToObj,new e({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{let i=this._def.errorMap?.(n,r).message??r.defaultError;return n.code==="unrecognized_keys"?{message:v.errToObj(t).message??i}:{message:i}}}:{}})}strip(){return new e({...this._def,unknownKeys:"strip"})}passthrough(){return new e({...this._def,unknownKeys:"passthrough"})}extend(t){return new e({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new e({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:_.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new e({...this._def,catchall:t})}pick(t){let n={};for(let r of $.objectKeys(t))t[r]&&this.shape[r]&&(n[r]=this.shape[r]);return new e({...this._def,shape:()=>n})}omit(t){let n={};for(let r of $.objectKeys(this.shape))t[r]||(n[r]=this.shape[r]);return new e({...this._def,shape:()=>n})}deepPartial(){return Pt(this)}partial(t){let n={};for(let r of $.objectKeys(this.shape)){let i=this.shape[r];t&&!t[r]?n[r]=i:n[r]=i.optional()}return new e({...this._def,shape:()=>n})}required(t){let n={};for(let r of $.objectKeys(this.shape))if(t&&!t[r])n[r]=this.shape[r];else{let a=this.shape[r];for(;a instanceof pe;)a=a._def.innerType;n[r]=a}return new e({...this._def,shape:()=>n})}keyof(){return Ai($.objectKeys(this.shape))}};ie.create=(e,t)=>new ie({shape:()=>e,unknownKeys:"strip",catchall:ge.create(),typeName:_.ZodObject,...P(t)});ie.strictCreate=(e,t)=>new ie({shape:()=>e,unknownKeys:"strict",catchall:ge.create(),typeName:_.ZodObject,...P(t)});ie.lazycreate=(e,t)=>new ie({shape:e,unknownKeys:"strip",catchall:ge.create(),typeName:_.ZodObject,...P(t)});var st=class extends E{_parse(t){let{ctx:n}=this._processInputParams(t),r=this._def.options;function i(a){for(let s of a)if(s.result.status==="valid")return s.result;for(let s of a)if(s.result.status==="dirty")return n.common.issues.push(...s.ctx.common.issues),s.result;let o=a.map(s=>new re(s.ctx.common.issues));return g(n,{code:f.invalid_union,unionErrors:o}),S}if(n.common.async)return Promise.all(r.map(async a=>{let o={...n,common:{...n.common,issues:[]},parent:null};return{result:await a._parseAsync({data:n.data,path:n.path,parent:o}),ctx:o}})).then(i);{let a,o=[];for(let l of r){let d={...n,common:{...n.common,issues:[]},parent:null},u=l._parseSync({data:n.data,path:n.path,parent:d});if(u.status==="valid")return u;u.status==="dirty"&&!a&&(a={result:u,ctx:d}),d.common.issues.length&&o.push(d.common.issues)}if(a)return n.common.issues.push(...a.ctx.common.issues),a.result;let s=o.map(l=>new re(l));return g(n,{code:f.invalid_union,unionErrors:s}),S}}get options(){return this._def.options}};st.create=(e,t)=>new st({options:e,typeName:_.ZodUnion,...P(t)});var Ie=e=>e instanceof ct?Ie(e.schema):e instanceof me?Ie(e.innerType()):e instanceof dt?[e.value]:e instanceof ut?e.options:e instanceof pt?$.objectValues(e.enum):e instanceof ht?Ie(e._def.innerType):e instanceof at?[void 0]:e instanceof ot?[null]:e instanceof pe?[void 0,...Ie(e.unwrap())]:e instanceof Se?[null,...Ie(e.unwrap())]:e instanceof nn||e instanceof ft?Ie(e.unwrap()):e instanceof mt?Ie(e._def.innerType):[],kn=class e extends E{_parse(t){let{ctx:n}=this._processInputParams(t);if(n.parsedType!==b.object)return g(n,{code:f.invalid_type,expected:b.object,received:n.parsedType}),S;let r=this.discriminator,i=n.data[r],a=this.optionsMap.get(i);return a?n.common.async?a._parseAsync({data:n.data,path:n.path,parent:n}):a._parseSync({data:n.data,path:n.path,parent:n}):(g(n,{code:f.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),S)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){let i=new Map;for(let a of n){let o=Ie(a.shape[t]);if(!o.length)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(let s of o){if(i.has(s))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(s)}`);i.set(s,a)}}return new e({typeName:_.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:i,...P(r)})}};function ur(e,t){let n=we(e),r=we(t);if(e===t)return{valid:!0,data:e};if(n===b.object&&r===b.object){let i=$.objectKeys(t),a=$.objectKeys(e).filter(s=>i.indexOf(s)!==-1),o={...e,...t};for(let s of a){let l=ur(e[s],t[s]);if(!l.valid)return{valid:!1};o[s]=l.data}return{valid:!0,data:o}}else if(n===b.array&&r===b.array){if(e.length!==t.length)return{valid:!1};let i=[];for(let a=0;a<e.length;a++){let o=e[a],s=t[a],l=ur(o,s);if(!l.valid)return{valid:!1};i.push(l.data)}return{valid:!0,data:i}}else return n===b.date&&r===b.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}var lt=class extends E{_parse(t){let{status:n,ctx:r}=this._processInputParams(t),i=(a,o)=>{if(yn(a)||yn(o))return S;let s=ur(a.value,o.value);return s.valid?((xn(a)||xn(o))&&n.dirty(),{status:n.value,value:s.data}):(g(r,{code:f.invalid_intersection_types}),S)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([a,o])=>i(a,o)):i(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}};lt.create=(e,t,n)=>new lt({left:e,right:t,typeName:_.ZodIntersection,...P(n)});var ve=class e extends E{_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==b.array)return g(r,{code:f.invalid_type,expected:b.array,received:r.parsedType}),S;if(r.data.length<this._def.items.length)return g(r,{code:f.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),S;!this._def.rest&&r.data.length>this._def.items.length&&(g(r,{code:f.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());let a=[...r.data].map((o,s)=>{let l=this._def.items[s]||this._def.rest;return l?l._parse(new he(r,o,r.path,s)):null}).filter(o=>!!o);return r.common.async?Promise.all(a).then(o=>q.mergeArray(n,o)):q.mergeArray(n,a)}get items(){return this._def.items}rest(t){return new e({...this._def,rest:t})}};ve.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ve({items:e,typeName:_.ZodTuple,rest:null,...P(t)})};var wn=class e extends E{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==b.object)return g(r,{code:f.invalid_type,expected:b.object,received:r.parsedType}),S;let i=[],a=this._def.keyType,o=this._def.valueType;for(let s in r.data)i.push({key:a._parse(new he(r,s,r.path,s)),value:o._parse(new he(r,r.data[s],r.path,s)),alwaysSet:s in r.data});return r.common.async?q.mergeObjectAsync(n,i):q.mergeObjectSync(n,i)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof E?new e({keyType:t,valueType:n,typeName:_.ZodRecord,...P(r)}):new e({keyType:Fe.create(),valueType:t,typeName:_.ZodRecord,...P(n)})}},Rt=class extends E{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==b.map)return g(r,{code:f.invalid_type,expected:b.map,received:r.parsedType}),S;let i=this._def.keyType,a=this._def.valueType,o=[...r.data.entries()].map(([s,l],d)=>({key:i._parse(new he(r,s,r.path,[d,"key"])),value:a._parse(new he(r,l,r.path,[d,"value"]))}));if(r.common.async){let s=new Map;return Promise.resolve().then(async()=>{for(let l of o){let d=await l.key,u=await l.value;if(d.status==="aborted"||u.status==="aborted")return S;(d.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(d.value,u.value)}return{status:n.value,value:s}})}else{let s=new Map;for(let l of o){let d=l.key,u=l.value;if(d.status==="aborted"||u.status==="aborted")return S;(d.status==="dirty"||u.status==="dirty")&&n.dirty(),s.set(d.value,u.value)}return{status:n.value,value:s}}}};Rt.create=(e,t,n)=>new Rt({valueType:t,keyType:e,typeName:_.ZodMap,...P(n)});var $t=class e extends E{_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==b.set)return g(r,{code:f.invalid_type,expected:b.set,received:r.parsedType}),S;let i=this._def;i.minSize!==null&&r.data.size<i.minSize.value&&(g(r,{code:f.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),n.dirty()),i.maxSize!==null&&r.data.size>i.maxSize.value&&(g(r,{code:f.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),n.dirty());let a=this._def.valueType;function o(l){let d=new Set;for(let u of l){if(u.status==="aborted")return S;u.status==="dirty"&&n.dirty(),d.add(u.value)}return{status:n.value,value:d}}let s=[...r.data.values()].map((l,d)=>a._parse(new he(r,l,r.path,d)));return r.common.async?Promise.all(s).then(l=>o(l)):o(s)}min(t,n){return new e({...this._def,minSize:{value:t,message:v.toString(n)}})}max(t,n){return new e({...this._def,maxSize:{value:t,message:v.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}};$t.create=(e,t)=>new $t({valueType:e,minSize:null,maxSize:null,typeName:_.ZodSet,...P(t)});var vn=class e extends E{constructor(){super(...arguments),this.validate=this.implement}_parse(t){let{ctx:n}=this._processInputParams(t);if(n.parsedType!==b.function)return g(n,{code:f.invalid_type,expected:b.function,received:n.parsedType}),S;function r(s,l){return tn({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Tt(),Pe].filter(d=>!!d),issueData:{code:f.invalid_arguments,argumentsError:l}})}function i(s,l){return tn({data:s,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Tt(),Pe].filter(d=>!!d),issueData:{code:f.invalid_return_type,returnTypeError:l}})}let a={errorMap:n.common.contextualErrorMap},o=n.data;if(this._def.returns instanceof Be){let s=this;return Q(async function(...l){let d=new re([]),u=await s._def.args.parseAsync(l,a).catch(m=>{throw d.addIssue(r(l,m)),d}),p=await Reflect.apply(o,this,u);return await s._def.returns._def.type.parseAsync(p,a).catch(m=>{throw d.addIssue(i(p,m)),d})})}else{let s=this;return Q(function(...l){let d=s._def.args.safeParse(l,a);if(!d.success)throw new re([r(l,d.error)]);let u=Reflect.apply(o,this,d.data),p=s._def.returns.safeParse(u,a);if(!p.success)throw new re([i(u,p.error)]);return p.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new e({...this._def,args:ve.create(t).rest(Ee.create())})}returns(t){return new e({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new e({args:t||ve.create([]).rest(Ee.create()),returns:n||Ee.create(),typeName:_.ZodFunction,...P(r)})}},ct=class extends E{get schema(){return this._def.getter()}_parse(t){let{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}};ct.create=(e,t)=>new ct({getter:e,typeName:_.ZodLazy,...P(t)});var dt=class extends E{_parse(t){if(t.data!==this._def.value){let n=this._getOrReturnCtx(t);return g(n,{received:n.data,code:f.invalid_literal,expected:this._def.value}),S}return{status:"valid",value:t.data}}get value(){return this._def.value}};dt.create=(e,t)=>new dt({value:e,typeName:_.ZodLiteral,...P(t)});function Ai(e,t){return new ut({values:e,typeName:_.ZodEnum,...P(t)})}var ut=class e extends E{_parse(t){if(typeof t.data!="string"){let n=this._getOrReturnCtx(t),r=this._def.values;return g(n,{expected:$.joinValues(r),received:n.parsedType,code:f.invalid_type}),S}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(t.data)){let n=this._getOrReturnCtx(t),r=this._def.values;return g(n,{received:n.data,code:f.invalid_enum_value,options:r}),S}return Q(t.data)}get options(){return this._def.values}get enum(){let t={};for(let n of this._def.values)t[n]=n;return t}get Values(){let t={};for(let n of this._def.values)t[n]=n;return t}get Enum(){let t={};for(let n of this._def.values)t[n]=n;return t}extract(t,n=this._def){return e.create(t,{...this._def,...n})}exclude(t,n=this._def){return e.create(this.options.filter(r=>!t.includes(r)),{...this._def,...n})}};ut.create=Ai;var pt=class extends E{_parse(t){let n=$.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==b.string&&r.parsedType!==b.number){let i=$.objectValues(n);return g(r,{expected:$.joinValues(i),received:r.parsedType,code:f.invalid_type}),S}if(this._cache||(this._cache=new Set($.getValidEnumValues(this._def.values))),!this._cache.has(t.data)){let i=$.objectValues(n);return g(r,{received:r.data,code:f.invalid_enum_value,options:i}),S}return Q(t.data)}get enum(){return this._def.values}};pt.create=(e,t)=>new pt({values:e,typeName:_.ZodNativeEnum,...P(t)});var Be=class extends E{unwrap(){return this._def.type}_parse(t){let{ctx:n}=this._processInputParams(t);if(n.parsedType!==b.promise&&n.common.async===!1)return g(n,{code:f.invalid_type,expected:b.promise,received:n.parsedType}),S;let r=n.parsedType===b.promise?n.data:Promise.resolve(n.data);return Q(r.then(i=>this._def.type.parseAsync(i,{path:n.path,errorMap:n.common.contextualErrorMap})))}};Be.create=(e,t)=>new Be({type:e,typeName:_.ZodPromise,...P(t)});var me=class extends E{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===_.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){let{status:n,ctx:r}=this._processInputParams(t),i=this._def.effect||null,a={addIssue:o=>{g(r,o),o.fatal?n.abort():n.dirty()},get path(){return r.path}};if(a.addIssue=a.addIssue.bind(a),i.type==="preprocess"){let o=i.transform(r.data,a);if(r.common.async)return Promise.resolve(o).then(async s=>{if(n.value==="aborted")return S;let l=await this._def.schema._parseAsync({data:s,path:r.path,parent:r});return l.status==="aborted"?S:l.status==="dirty"?et(l.value):n.value==="dirty"?et(l.value):l});{if(n.value==="aborted")return S;let s=this._def.schema._parseSync({data:o,path:r.path,parent:r});return s.status==="aborted"?S:s.status==="dirty"?et(s.value):n.value==="dirty"?et(s.value):s}}if(i.type==="refinement"){let o=s=>{let l=i.refinement(s,a);if(r.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return s};if(r.common.async===!1){let s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?S:(s.status==="dirty"&&n.dirty(),o(s.value),{status:n.value,value:s.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>s.status==="aborted"?S:(s.status==="dirty"&&n.dirty(),o(s.value).then(()=>({status:n.value,value:s.value}))))}if(i.type==="transform")if(r.common.async===!1){let o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!ze(o))return S;let s=i.transform(o.value,a);if(s instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:s}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>ze(o)?Promise.resolve(i.transform(o.value,a)).then(s=>({status:n.value,value:s})):S);$.assertNever(i)}};me.create=(e,t,n)=>new me({schema:e,typeName:_.ZodEffects,effect:t,...P(n)});me.createWithPreprocess=(e,t,n)=>new me({schema:t,effect:{type:"preprocess",transform:e},typeName:_.ZodEffects,...P(n)});var pe=class extends E{_parse(t){return this._getType(t)===b.undefined?Q(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}};pe.create=(e,t)=>new pe({innerType:e,typeName:_.ZodOptional,...P(t)});var Se=class extends E{_parse(t){return this._getType(t)===b.null?Q(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}};Se.create=(e,t)=>new Se({innerType:e,typeName:_.ZodNullable,...P(t)});var ht=class extends E{_parse(t){let{ctx:n}=this._processInputParams(t),r=n.data;return n.parsedType===b.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}};ht.create=(e,t)=>new ht({innerType:e,typeName:_.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...P(t)});var mt=class extends E{_parse(t){let{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},i=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return At(i)?i.then(a=>({status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new re(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new re(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}};mt.create=(e,t)=>new mt({innerType:e,typeName:_.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...P(t)});var Dt=class extends E{_parse(t){if(this._getType(t)!==b.nan){let r=this._getOrReturnCtx(t);return g(r,{code:f.invalid_type,expected:b.nan,received:r.parsedType}),S}return{status:"valid",value:t.data}}};Dt.create=e=>new Dt({typeName:_.ZodNaN,...P(e)});var Cs=Symbol("zod_brand"),nn=class extends E{_parse(t){let{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}},rn=class e extends E{_parse(t){let{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{let a=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?S:a.status==="dirty"?(n.dirty(),et(a.value)):this._def.out._parseAsync({data:a.value,path:r.path,parent:r})})();{let i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?S:i.status==="dirty"?(n.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(t,n){return new e({in:t,out:n,typeName:_.ZodPipeline})}},ft=class extends E{_parse(t){let n=this._def.innerType._parse(t),r=i=>(ze(i)&&(i.value=Object.freeze(i.value)),i);return At(n)?n.then(i=>r(i)):r(n)}unwrap(){return this._def.innerType}};ft.create=(e,t)=>new ft({innerType:e,typeName:_.ZodReadonly,...P(t)});function Si(e,t){let n=typeof e=="function"?e(t):typeof e=="string"?{message:e}:e;return typeof n=="string"?{message:n}:n}function Pi(e,t={},n){return e?He.create().superRefine((r,i)=>{let a=e(r);if(a instanceof Promise)return a.then(o=>{if(!o){let s=Si(t,r),l=s.fatal??n??!0;i.addIssue({code:"custom",...s,fatal:l})}});if(!a){let o=Si(t,r),s=o.fatal??n??!0;i.addIssue({code:"custom",...o,fatal:s})}}):He.create()}var Ts={object:ie.lazycreate},_;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(_||(_={}));var As=(e,t={message:`Input not instance of ${e.name}`})=>Pi(n=>n instanceof e,t),Ii=Fe.create,Ei=tt.create,Ps=Dt.create,Is=nt.create,Ri=rt.create,Es=it.create,Rs=It.create,$s=at.create,Ds=ot.create,Ns=He.create,Ms=Ee.create,Ls=ge.create,Os=Et.create,js=Re.create,Us=ie.create,zs=ie.strictCreate,Fs=st.create,Hs=kn.create,Bs=lt.create,Ws=ve.create,Vs=wn.create,Js=Rt.create,qs=$t.create,Zs=vn.create,Gs=ct.create,Ks=dt.create,Ys=ut.create,Xs=pt.create,Qs=Be.create,el=me.create,tl=pe.create,nl=Se.create,rl=me.createWithPreprocess,il=rn.create,al=()=>Ii().optional(),ol=()=>Ei().optional(),sl=()=>Ri().optional(),ll={string:(e=>Fe.create({...e,coerce:!0})),number:(e=>tt.create({...e,coerce:!0})),boolean:(e=>rt.create({...e,coerce:!0})),bigint:(e=>nt.create({...e,coerce:!0})),date:(e=>it.create({...e,coerce:!0}))};var cl=S;var pr=c.object({id:c.string()}),dl=c.enum(["top","right","bottom","left","auto"]).default("auto"),hr=c.enum(["left","middle","right"]),ul=hr.default("left"),$i=c.object({label:c.string().optional(),hidden:c.boolean().default(!1)}),pl={background:c.string().optional(),textColor:c.string().optional(),borderRadius:c.string().optional(),textAlign:ul,anchor:dl,showNavigation:c.boolean().default(!0),prevButton:$i.optional(),nextButton:$i.optional()},hl=c.enum(["pointer","callout","area"]),ml=c.discriminatedUnion("type",[c.object({type:c.literal("html-element"),alphaId:c.string().min(1)})]),fl=pr.extend({type:c.literal("message"),variant:hl.default("callout"),x:c.number().min(0).max(1),y:c.number().min(0).max(1),w:c.number().min(0).max(1).optional(),h:c.number().min(0).max(1).optional(),text:c.string().optional(),target:ml.optional(),advancesStep:c.boolean().default(!0),...pl}),gl=pr.extend({type:c.literal("blur"),x:c.number().min(0).max(1),y:c.number().min(0).max(1),w:c.number().min(0).max(1),h:c.number().min(0).max(1),intensity:c.number().min(0).max(20).default(8)}),bl=pr.extend({type:c.literal("text"),x:c.number().min(0).max(1),y:c.number().min(0).max(1),text:c.string(),fontSize:c.number().positive().default(16),color:c.string().optional()}),Di=c.discriminatedUnion("type",[fl,gl,bl]),Ni=new Set(["message","blur","text"]),Mi=c.object({type:c.string()}).passthrough();function Li(e){return typeof e=="object"&&e!==null?e.type:void 0}var Oi=c.any().superRefine((e,t)=>{let i=(Ni.has(Li(e))?Di:Mi).safeParse(e);if(!i.success)for(let a of i.error.issues)t.addIssue(a)}).transform(e=>(Ni.has(Li(e))?Di:Mi).parse(e));var ji=c.object({label:c.string().min(1),href:c.string().refine(e=>/^(https?:|mailto:)/i.test(e),"href must be an http(s) or mailto URL")}),mr=c.object({logo:c.string().min(1).optional(),name:c.string().min(1).optional(),logoHref:c.string().refine(e=>/^(https?:|mailto:)/i.test(e),"logoHref must be an http(s) or mailto URL").optional(),favicon:c.string().min(1).optional(),cta:ji.optional(),secondaryCta:ji.optional(),watermark:c.boolean().optional()}),Ui=mr.omit({favicon:!0});var yl=c.object({type:c.literal("next")}),xl=c.object({type:c.literal("prev")}),kl=c.object({type:c.literal("step"),stepId:c.string().min(1)}),wl=c.object({type:c.literal("chapter"),chapterId:c.string().min(1)}),vl=c.object({type:c.literal("url"),href:c.string().min(1),target:c.enum(["_self","_blank"]).default("_blank")}),Sl=c.object({type:c.literal("restart")}),_l=c.discriminatedUnion("type",[yl,xl,kl,wl,vl,Sl]),Cl=c.enum(["shimmer"]),Sn=c.object({label:c.string().min(1),action:_l.default({type:"next"}),animation:Cl.optional(),background:c.string().optional(),textColor:c.string().optional()});var Tl="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",fr=/^[A-Za-z0-9_-]{12}$/;function Al(e){let t=globalThis.crypto;if(!t||typeof t.getRandomValues!="function")throw new Error("generateDemoId requires globalThis.crypto.getRandomValues (Node 19+, browsers, or edge runtime).");t.getRandomValues(e)}function ae(){let e=new Uint8Array(12);Al(e);let t="";for(let n of e)t+=Tl.charAt(n&63);return t}function _n(e){return typeof e=="string"&&fr.test(e)}function zi(e){return String(e+1).padStart(4,"0")}function Fi(e){return`snap-${e.toString().padStart(3,"0")}`}function Cn(e){let t=((e??"").toLowerCase().split(";")[0]??"").trim();return t.startsWith("image/")?"image":t.startsWith("video/")?"video":t.startsWith("audio/")?"audio":t.startsWith("font/")||t.includes("font")||t.includes("woff")?"font":"other"}function br(e){if(!e)return"";let t=e.replace(/^(?:tree\s*item|menu\s*item|menuitem|list\s*item|tab(?:\s*panel)?|button|link|option|region|combobox|radio|checkbox|switch|dialog|row|cell|columnheader|rowheader|navigation|article|banner|main|complementary|contentinfo)\s*:?\s+/i,"").trim();return(t.split(/\r?\n/).map(r=>r.trim()).find(Boolean)??t).replace(/\s+/g," ").trim().slice(0,48)}var Pl=1.35,gr=.35;function Il(e){return Math.max(0,Math.min(1,e))}function yr(e){let t=Il(e);if(t<gr){let n=t/gr;return t*n*n}return t>1-gr?1-yr(1-t):t}function xr(e){let{stepId:t,assetId:n,posterAssetId:r,kind:i,isLast:a}=e,o=`asset:${n}`,s=i==="video"?{type:"video",src:o,posterSrc:r?`asset:${r}`:void 0,naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight,alt:e.title,sourceUrl:e.sourceUrl??"",title:e.title,autoplay:!0,muted:!0,objectFit:"cover"}:{type:"image",src:o,naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight,alt:e.title,sourceUrl:e.sourceUrl??"",title:e.title,objectFit:"cover"},l=e.click,d=[];if(l){let h=br(l.label);d.push({id:`${t}_pointer`,type:"message",variant:"pointer",x:l.x,y:l.y,text:h?`Click on "${h}"`:"Continue",anchor:"auto",textAlign:"left",advancesStep:!0,showNavigation:!0})}else d.push({id:`${t}_callout`,type:"message",variant:"callout",x:.5,y:.5,text:a?"End of walkthrough":"Continue",anchor:"auto",textAlign:"left",advancesStep:!0,showNavigation:!0});let u=!!l&&!(l.x===0&&l.y===0),p=i==="image"&&e.autoApplyZoom===!0&&u?{zoom:Pl,x:Number(yr(l.x).toFixed(4)),y:Number(yr(l.y).toFixed(4))}:void 0;return{id:t,kind:"content",background:s,...p?{transform:p}:{},annotations:d,advance:{trigger:"click"}}}function Hi(e){let{stepId:t,htmlPath:n,click:r}=e,i=[];if(r?.alphaId)i.push({id:`${t}_area`,type:"message",variant:"area",x:Number((r.x??.5).toFixed(4)),y:Number((r.y??.5).toFixed(4)),w:0,h:0,text:br(r.label)||"Click here",target:{type:"html-element",alphaId:r.alphaId},anchor:"auto",textAlign:"left",advancesStep:!0,showNavigation:!0});else if(r){let a=br(r.label);i.push({id:`${t}_pointer`,type:"message",variant:"pointer",x:Number((r.x??.5).toFixed(4)),y:Number((r.y??.5).toFixed(4)),text:a?`Click on "${a}"`:"Continue",anchor:"auto",textAlign:"left",advancesStep:!0,showNavigation:!0})}return{id:t,kind:"content",background:{type:"html",path:n,naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight,zoom:1,scroll:e.scroll,sourceUrl:e.sourceUrl??"",title:e.sourceUrl??""},annotations:i,advance:{trigger:"click"}}}function El(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kr(e,t){let n=e;for(let[r,i]of t){let a=El(r);n=n.replace(new RegExp(`(?:\\.\\./)*assets/${a}`,"g"),i),n=n.replace(new RegExp(`assets/${a}`,"g"),i)}return n}function Rl(e){return`<script data-inkly-replay-scroll>(()=>{const c=${JSON.stringify(e).replace(/<\/(script)/gi,"<\\/$1")};function r(){const d=document.documentElement,b=document.body;const vw=innerWidth||d.clientWidth||0;const vh=innerHeight||d.clientHeight||0;const mx=Math.max(0,Math.max(d.scrollWidth,b?b.scrollWidth:0)-vw);const my=Math.max(0,Math.max(d.scrollHeight,b?b.scrollHeight:0)-vh);const x=c.maxX>0&&mx>0?c.x/c.maxX*mx:c.x;const y=c.maxY>0&&my>0?c.y/c.maxY*my:c.y;scrollTo(Math.max(0,x),Math.max(0,y));}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",r,{once:true});r();requestAnimationFrame(r);setTimeout(r,120);setTimeout(r,500);})();</script>`}function Bi(e,t){let n=Rl(t);return/<\/body\s*>/i.test(e)?e.replace(/<\/body\s*>/i,`${n}</body>`):`${e}${n}`}function Wi(e,t){if(!t||/data-inkly-document-css|document\.css/i.test(e))return e;let n='<link rel="stylesheet" href="./document.css?draft=1" data-inkly-document-css>';return/<\/head\s*>/i.test(e)?e.replace(/<\/head\s*>/i,`${n}</head>`):`${n}${e}`}var Vi=c.object({id:c.string(),text:c.string(),start:c.number().nonnegative().optional(),end:c.number().nonnegative().optional()});var $l=c.enum(["screenshot","image","video","audio","font","other"]),Dl=c.object({id:c.string().min(1),path:c.string().min(1).optional(),uri:c.string().min(1).optional(),sha256:c.string().regex(/^[0-9a-f]{64}$/),kind:$l,contentType:c.string().min(1).optional(),publicUrl:c.string().min(1).optional(),cdnPath:c.string().min(1).optional(),file:c.string().min(1).optional(),size:c.number().int().nonnegative().optional(),createdAt:c.string().min(1).optional(),updatedAt:c.string().min(1).optional(),viewport:c.object({w:c.number().int().positive(),h:c.number().int().positive()}).optional()}),Nt=c.object({version:c.literal(1),assets:c.array(Dl),screens:c.array(c.unknown()).optional()});var wr=c.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,{message:"must be a hex color like #5b3df5"}),Nl=c.enum(["color","image","glassmorphism"]),Ji=c.object({type:Nl,color:wr.optional(),from:wr.optional(),to:wr.optional(),src:c.string().min(1).optional(),alt:c.string().optional(),intensity:c.number().min(-5).max(48).optional()}).superRefine((e,t)=>{if(e.type==="color"){let n=!!e.color,r=!!e.from&&!!e.to;!n&&!r&&t.addIssue({code:c.ZodIssueCode.custom,path:["color"],message:"color backgrounds require color or from/to"}),!!e.from!=!!e.to&&t.addIssue({code:c.ZodIssueCode.custom,path:e.from?["to"]:["from"],message:"gradient backgrounds require both from and to"})}e.type==="image"&&!e.src&&t.addIssue({code:c.ZodIssueCode.custom,path:["src"],message:"image backgrounds require src"})}),qi=c.object({src:c.string(),alt:c.string().optional()});var vr=c.object({src:c.string().min(1),duration:c.number().positive().optional()});var Ml=c.enum(["text","dropdown"]),Ll=c.object({value:c.string().min(1),label:c.string().min(1)}),Ol=c.object({id:c.string(),label:c.string(),type:Ml.default("text"),placeholder:c.string().optional(),required:c.boolean().default(!1),options:c.array(Ll).optional()}).superRefine((e,t)=>{e.type==="dropdown"&&(!e.options||e.options.length===0)&&t.addIssue({code:c.ZodIssueCode.custom,message:"Dropdown field requires at least one option.",path:["options"]})}),Xi=c.object({src:c.string().min(1),alt:c.string().optional(),height:c.number().int().positive().optional()}),jl=c.enum(["left","right","top"]),Ul=c.enum(["standard","hero"]),Qi=c.object({src:c.string().min(1),alt:c.string().optional(),naturalWidth:c.number().positive().optional(),naturalHeight:c.number().positive().optional(),position:jl.default("right"),layout:Ul.default("hero")}),zl=c.object({type:c.literal("headline"),id:c.string(),logo:Xi.optional(),image:Qi.optional(),title:c.string(),titleColor:c.string().optional(),description:c.string().optional(),descriptionColor:c.string().optional(),textAlign:hr.optional(),cta:Sn.optional(),secondaryCta:Sn.optional()}),Fl=c.object({type:c.literal("form"),id:c.string(),logo:Xi.optional(),image:Qi.optional(),title:c.string().optional(),description:c.string().optional(),fields:c.array(Ol).min(1),submit:Sn.default({label:"Submit",action:{type:"next"}})}),Hl="allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-presentation",Bl="camera; microphone; fullscreen; payment; clipboard-write",Wl=c.object({type:c.literal("embed"),id:c.string(),src:c.string(),iframeTitle:c.string().optional(),sandbox:c.string().default(Hl),allow:c.string().default(Bl)}),Vl=c.object({type:c.literal("custom"),id:c.string(),name:c.string().min(1),data:c.record(c.unknown()).optional()}),Zi=c.discriminatedUnion("type",[zl,Fl,Wl,Vl]),Gi=new Set(["headline","form","embed","custom"]),Ki=c.object({type:c.string()}).passthrough();function Yi(e){return typeof e=="object"&&e!==null?e.type:void 0}var ea=c.any().superRefine((e,t)=>{let i=(Gi.has(Yi(e))?Zi:Ki).safeParse(e);if(!i.success)for(let a of i.error.issues)t.addIssue(a)}).transform(e=>(Gi.has(Yi(e))?Zi:Ki).parse(e));var ta=c.enum(["contain","cover","fill"]),na=c.enum(["left top","center top","right top","left center","center center","right center","left bottom","center bottom","right bottom"]),Jl=c.object({type:c.literal("image"),src:c.string().min(1),naturalWidth:c.number().positive(),naturalHeight:c.number().positive(),alt:c.string().optional(),sourceUrl:c.string().optional(),title:c.string().optional(),objectFit:ta.optional(),objectPosition:na.optional()}),ql=c.object({type:c.literal("video"),src:c.string().min(1),posterSrc:c.string().min(1).optional(),naturalWidth:c.number().positive(),naturalHeight:c.number().positive(),alt:c.string().optional(),sourceUrl:c.string().optional(),title:c.string().optional(),autoplay:c.boolean().default(!0),muted:c.boolean().default(!0),objectFit:ta.optional(),objectPosition:na.optional()}),Zl=c.object({x:c.number().nonnegative().default(0),y:c.number().nonnegative().default(0),maxX:c.number().nonnegative().default(0),maxY:c.number().nonnegative().default(0)}),Gl=c.object({type:c.literal("html"),path:c.string().min(1),naturalWidth:c.number().positive(),naturalHeight:c.number().positive(),zoom:c.number().positive().default(1),scroll:Zl.default({x:0,y:0,maxX:0,maxY:0}),sourceUrl:c.string().optional(),title:c.string().optional()}),Kl=c.discriminatedUnion("type",[Jl,ql,Gl]),Yl=c.object({zoom:c.number().min(1).default(1),x:c.number().min(0).max(1).default(.5),y:c.number().min(0).max(1).default(.5)}),Xl=c.object({trigger:c.enum(["auto","click"]).default("auto")}).default({trigger:"auto"}),Ql=c.object({kind:c.literal("content").default("content"),id:c.string(),label:c.string().optional(),duration:c.number().positive().optional(),background:Kl,script:c.string().optional(),voiceover:vr.optional(),transform:Yl.optional(),advance:Xl,annotations:c.array(Oi).default([]),captions:c.array(Vi).optional()}).passthrough(),ec=c.object({kind:c.literal("cover"),id:c.string(),label:c.string().optional(),widgets:c.array(ea).length(1),background:Ji.optional(),backgroundImage:qi.optional(),backgroundDim:c.number().min(0).max(1).optional(),script:c.string().optional(),voiceover:vr.optional(),duration:c.number().positive().optional(),advance:c.object({trigger:c.enum(["auto","click"]).default("click")}).default({trigger:"click"})}).passthrough(),ra=c.discriminatedUnion("kind",[Ql,ec]);var tc=/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,ia=c.string().regex(tc,"must be a hex color like #5b3df5"),Tn=c.object({primary:ia.optional(),secondary:ia.optional(),font:c.string().min(1).optional(),radius:c.string().min(1).optional()}).partial();var An=c.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,{message:"must be a hex color like #5b3df5"}),nc=c.object({id:c.string(),title:c.string(),stepIds:c.array(c.string()).min(1)}),rc=c.object({hideHeader:c.boolean().default(!1),hideControls:c.boolean().default(!1),controls:c.enum(["full","minimal","hidden"]).optional(),showHubBreadcrumb:c.boolean().default(!1),mobileFooterMessage:c.boolean().default(!0),autoplay:c.boolean().default(!1)}),ic=c.object({width:c.number().positive(),height:c.number().positive()}),ac=c.enum(["public","private"]),oc=c.enum(["none","color","image"]),sc=c.object({type:oc,color:An.optional(),from:An.optional(),to:An.optional(),src:c.string().min(1).optional(),alt:c.string().optional()}).superRefine((e,t)=>{if(e.type==="color"){let n=!!e.color,r=!!e.from&&!!e.to;!n&&!r&&t.addIssue({code:c.ZodIssueCode.custom,path:["color"],message:"color backgrounds require color or from/to"}),!!e.from!=!!e.to&&t.addIssue({code:c.ZodIssueCode.custom,path:e.from?["to"]:["from"],message:"gradient backgrounds require both from and to"})}e.type==="image"&&!e.src&&t.addIssue({code:c.ZodIssueCode.custom,path:["src"],message:"image backgrounds require src"})}),We=c.object({id:c.string().regex(fr,{message:"must be a 12-character URL-safe demo id (see generateDemoId)"}),version:c.number().int().min(1),title:c.string().optional(),subtitle:c.string().optional(),runtime:c.string().min(1).optional(),visibility:ac.default("public"),backgroundColor:An.optional(),background:sc.optional(),theme:c.object({preset:c.string().min(1).optional(),tokens:Tn.optional(),brand:Ui.optional()}).optional(),chrome:rc.default({}),aspectRatio:ic.optional(),chapters:c.array(nc).default([]),steps:c.array(ra).min(1)}).passthrough().superRefine((e,t)=>{let n=new Set(e.steps.map(i=>i.id)),r=new Set(e.chapters.map(i=>i.id));e.chapters.forEach((i,a)=>{i.stepIds.forEach(o=>{n.has(o)||t.addIssue({code:c.ZodIssueCode.custom,path:["chapters",a,"stepIds"],message:`Chapter "${i.id}" references unknown step "${o}"`})})}),e.steps.forEach((i,a)=>{i.kind==="cover"&&i.widgets.forEach((o,s)=>{o.type==="headline"&&["cta","secondaryCta"].forEach(l=>{let d=o[l]?.action;d&&(d.type==="step"&&!n.has(d.stepId)&&t.addIssue({code:c.ZodIssueCode.custom,path:["steps",a,"widgets",s,l,"action","stepId"],message:`Widget "${o.id}" CTA targets unknown step "${d.stepId}"`}),d.type==="chapter"&&!r.has(d.chapterId)&&t.addIssue({code:c.ZodIssueCode.custom,path:["steps",a,"widgets",s,l,"action","chapterId"],message:`Widget "${o.id}" CTA targets unknown chapter "${d.chapterId}"`}))})})})});function Pn(e){return We.parse(e)}function Mt(e){let t=typeof e=="object"&&e!==null?e:{},n=_n(t.id),r=n?t:{...t,id:ae()};return{config:We.parse(r),changed:!n}}function aa(e){let t=new Map;e.forEach((r,i)=>{let a=t.get(r.id);a?a.push({entry:r,index:i}):t.set(r.id,[{entry:r,index:i}])});let n=[];for(let r of t.values()){if(r.length<2)continue;let i=[...r].sort((o,s)=>o.entry.updatedAt!==s.entry.updatedAt?o.entry.updatedAt-s.entry.updatedAt:o.index-s.index),[,...a]=i;for(let{entry:o}of a)n.push({entry:o,newId:ae()})}return n}var Sr=c.enum(["sidebar","tabs"]),lc=c.object({name:c.string().min(1),description:c.string().min(1).optional(),icon:c.string().min(1).optional(),demos:c.array(c.string().min(1))}),_e=c.object({$schema:c.string().optional(),name:c.string().min(1),runtime:c.string().regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,"runtime must be an exact semver version"),runtimeRange:c.string().min(1).optional(),layout:Sr.optional(),theme:c.string().min(1).optional(),tokens:Tn.optional(),brand:mr.optional(),title:c.string().min(1).optional(),subtitle:c.string().min(1).optional(),collections:c.array(lc).optional()});function oa({slug:e,config:t,resolveAssetSrc:n}){let r=t.title??t.id??e;return{slug:e,title:r,description:cc(t,r),thumbnail:pc(t,r,n),visibility:t.visibility}}function In(e,t){return e.length<=t?e:`${e.slice(0,t-1).trimEnd()}\u2026`}function cc(e,t){if(e.subtitle?.trim())return In(e.subtitle.trim(),120);for(let n of e.steps){if(n.kind!=="content")continue;let r=n.captions?.[0]?.text;if(r&&r.trim())return In(r.trim(),120);break}for(let n of e.steps)if(n.kind==="cover"){for(let r of n.widgets)if(r.type==="headline"&&r.description&&r.description.trim())return In(r.description.trim(),120)}return In(`Explore the ${t} workflow.`,120)}function dc(e){return e.background?e.background.type==="image":e.backgroundImage?!0:e.widgets.some(t=>t.type==="headline"?!!t.title:t.type==="embed"?!!t.src:t.type==="form")}function _r(e,t){return e?t?t(e):e:null}function uc(e,t){if(!t)return e;let n=e.widgets.map(o=>{if((o.type==="headline"||o.type==="form")&&o.image?.src){let s=t(o.image.src);return s&&s!==o.image.src?{...o,image:{...o.image,src:s}}:o}return o}),r=e.backgroundImage,i=e.background;if(i?.type==="image"&&i.src){let o=t(i.src);o&&o!==i.src&&(i={...i,src:o})}if(r?.src){let o=t(r.src);o&&o!==r.src&&(r={...r,src:o})}return!n.some((o,s)=>o!==e.widgets[s])&&i===e.background&&r===e.backgroundImage?e:{...e,widgets:n,background:i,backgroundImage:r}}function pc(e,t,n){let r=e.steps[0];if(r){if(r.kind==="cover"&&dc(r))return{kind:"cover",cover:uc(r,n),themeTokens:e.theme?.tokens};if(r.kind==="content"){let i=r.background;if(i?.type==="image"){let a=_r(i.src,n);if(a)return{kind:"image",src:a}}else if(i?.type==="video"){let a=_r(i.posterSrc,n);if(a)return{kind:"image",src:a};let o=_r(i.src,n);if(o)return{kind:"video",src:o}}else if(i?.type==="html")return{kind:"html",path:i.path,naturalWidth:i.naturalWidth,naturalHeight:i.naturalHeight,zoom:i.zoom,scroll:i.scroll}}}return{kind:"placeholder",title:t}}function hc(e){return!e||e==="null"?"":e.replace(/\/+$/,"")}function mc(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Ve="/__inkly-capture-asset/",fc="../../public/";function En(e,t){let n=String(e||"");if(!n.includes(Ve))return n;let r=t||fc,i=r.endsWith("/")?r:`${r}/`;return n.split(Ve).join(i)}function gc(e){return String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"")}function Cr(e){let t=gc(e);return/\/index\.html$/i.test(t)||/^index\.html$/i.test(t)?t.replace(/index\.html$/i,"document.css"):/\.html?$/i.test(t)?t.replace(/\.html?$/i,".css"):null}function bc(e){return e.replace(/<meta\b(?=[^>]*\bhttp-equiv\s*=\s*["']?content-security-policy\b)[^>]*>/gi,"")}var yc=/\s+(?:href|xlink:href|target|rel|download|ping|referrerpolicy|data-inkly-href)(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s"'=<>`]+))?/gi;function an(e){return String(e||"").replace(/<(a|area)\b[^>]*>/gi,t=>t.replace(yc,""))}function gt(e,t={}){let n=hc(t.resourceOrigin),r=String(e||"");return n?r.replace(new RegExp(`(^|["'\\(\\s,=])${mc("/api/hubs/")}`,"g"),`$1${n}/api/hubs/`):r}function xc(e){return bc(e).replace(/<style\b(?=[^>]*\bdata-inkly-document-css\b)[\s\S]*?<\/style>/gi,"").replace(/<link\b(?=[^>]*\bdata-inkly-document-css\b)[^>]*>/gi,"").replace(/<link\b(?=[^>]*\brel\s*=\s*["']?stylesheet\b)(?=[^>]*\bhref\s*=\s*["']?[^"'\s>]*document\.css(?:\?draft=1)?)[^>]*>/gi,"")}function sa({htmlPath:e,html:t,css:n,cssHref:r,resourceOrigin:i,captureAssetBaseUrl:a}){let o=En(t,a),s=n==null?n:En(n,a),l=xc(an(o)),d=Cr(e)!=null,u=s?.trim()??"";if(d&&u){let h=`<style data-inkly-document-css>
3
+ ${gt(s??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
4
+ </style>`,m=/<\/head\s*>/i.test(l)?l.replace(/<\/head\s*>/i,`${h}</head>`):`${h}${l}`;return gt(m,{resourceOrigin:i})}if(d&&r){let h=`<link rel="stylesheet" href="${gt(r,{resourceOrigin:i})}" data-inkly-document-css>`,m=/<\/head\s*>/i.test(l)?l.replace(/<\/head\s*>/i,`${h}</head>`):`${h}${l}`;return gt(m,{resourceOrigin:i})}return gt(l,{resourceOrigin:i})}var on=c.string().regex(/^sha(?:256|384|512)-[A-Za-z0-9+/]+=*$/,{message:"must be an SRI string like sha384-<base64>"}),Rn=c.string().regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,{message:"must be an exact semver like 0.1.0"}),kc=c.object({version:Rn,url:c.string().url(),integrity:on}),$n=c.object({$schema:c.string().optional(),runtime:kc});var la=c.string().regex(/^[0-9a-f]{64}$/,{message:"must be lowercase sha-256 hex (64 chars)"}),Lt=c.object({version:Rn,externals:c.array(c.string().min(1)),jsHash:la,cssHash:la,jsBytes:c.number().int().nonnegative(),cssBytes:c.number().int().nonnegative(),integrity:on,cssIntegrity:on,minSchema:Rn,codemodsIntegrity:on.optional(),codemodsBytes:c.number().int().nonnegative().optional()});var bt=["__inkly","assets","api","c"],wc={__inkly:"'__inkly' is reserved for CLI internal endpoints",assets:"'assets' is reserved for hub static files",api:"'api' is reserved for future use",c:"'c' is reserved for future use"},vc=/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;function $e(e){return typeof e!="string"?{ok:!1,reason:"Name is required."}:e.length===0?{ok:!1,reason:"Name cannot be empty."}:/\s/.test(e)?{ok:!1,reason:"Name cannot contain spaces."}:e.includes("/")||e.includes("\\")?{ok:!1,reason:"Name cannot contain slashes."}:e.includes(".")?{ok:!1,reason:"Name cannot contain dots."}:bt.includes(e)?{ok:!1,reason:wc[e]}:e.startsWith("_")?{ok:!1,reason:"Name cannot start with '_' (reserved for internal use)."}:e!==e.toLowerCase()?{ok:!1,reason:'Name must be lowercase (e.g. "getting-started").'}:vc.test(e)?{ok:!0}:{ok:!1,reason:"Name must be kebab-case: lowercase letters, digits, and hyphens, starting and ending with a letter or digit."}}var Je={inkly:{primary:"#5b6cff",secondary:"#ebebeb",radius:"10px",font:"Geist, ui-sans-serif, system-ui, sans-serif"},editorial:{primary:"#d97757",secondary:"#f4f0e7",radius:"12px",font:"Inter, ui-sans-serif, system-ui, sans-serif"},mono:{primary:"#5b6cff",secondary:"#f5f5f5",radius:"10px",font:"Inter, ui-sans-serif, system-ui, sans-serif"},substack:{primary:"#ff6719",secondary:"#fdf1eb",radius:"4px",font:"Inter, ui-sans-serif, system-ui, sans-serif"}};var Sc=`
5
5
  /* \u2500\u2500 Editorial hub-index \u2014 designs 07 (sidebar) + 15 (top nav) \u2500\u2500\u2500\u2500\u2500\u2500
6
6
  Design 07 (ClaudeHub) is the source of truth for tokens: cream
7
7
  #FAF9F5 page, ink #1F1E1B, accent #D97757, sidebar #F4F0E7, hairline
@@ -1191,7 +1191,7 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
1191
1191
  0 1px 2px rgba(91,55,21,0.07),
1192
1192
  0 20px 40px -22px rgba(91,55,21,0.30);
1193
1193
  }
1194
- `,Qi={id:"editorial",label:"Editorial",theme:Be.editorial,css:cc};var dc=`
1194
+ `,ca={id:"editorial",label:"Editorial",theme:Je.editorial,css:Sc};var _c=`
1195
1195
  /* \u2500\u2500 Mono hub-index \u2014 designs 08 (sidebar) + 16 (top-nav filled pills) \u2500\u2500
1196
1196
  White paper #FFFFFF, ink #0D0D0D, muted #5D5D5D, dim #8E8E8E,
1197
1197
  hairline #ECECEC, sidebar bg #F9F9F9. CTAs use the primary token;
@@ -2333,7 +2333,7 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2333
2333
  border-radius: 10px;
2334
2334
  box-shadow: none;
2335
2335
  }
2336
- `,ea={id:"mono",label:"Mono",theme:Be.mono,css:dc};var uc=`
2336
+ `,da={id:"mono",label:"Mono",theme:Je.mono,css:_c};var Cc=`
2337
2337
  /* Newsreader 600 \u2014 the true semi-bold cut for the "Built with Inkly"
2338
2338
  wordmark. Self-hosted on the Inkly bundle CDN so the self-contained demo
2339
2339
  document loads it without a Google Fonts round-trip; Georgia is the
@@ -2354,6 +2354,20 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2354
2354
  src: url("https://www.cdn.inklyai.dev/fonts/newsreader/newsreader-latin-600-normal.woff2?v=1") format("woff2");
2355
2355
  }
2356
2356
 
2357
+ /* Fraunces 600 \u2014 the cover + hub display headline. Self-hosted on the Inkly
2358
+ CDN (same pattern as Newsreader) so exported self-contained demos render it
2359
+ without a Google Fonts round-trip; Georgia is the swap fallback. The
2360
+ fonts/fraunces path was probed (404) before the woff2 was uploaded, so
2361
+ ?v=1 gives a fresh cache key that sidesteps any stale negative cache.
2362
+ Bump on any future re-upload to this path. */
2363
+ @font-face {
2364
+ font-family: "Fraunces";
2365
+ font-style: normal;
2366
+ font-weight: 600;
2367
+ font-display: swap;
2368
+ src: url("https://www.cdn.inklyai.dev/fonts/fraunces/fraunces-latin-600-normal.woff2?v=1") format("woff2");
2369
+ }
2370
+
2357
2371
  /* \u2500\u2500 Inkly hub-index \u2014 designs 14 v2 (top nav) + 24 v3 (sidebar
2358
2372
  connected shell) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
2359
2373
  All sans (Geist), no italic, no serif. Dotted canvas backdrop, indigo
@@ -2412,10 +2426,10 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2412
2426
  background-color: var(--inkly-hub-canvas);
2413
2427
  background-image: radial-gradient(
2414
2428
  circle at 1px 1px,
2415
- var(--inkly-hub-dot) 1px,
2416
- transparent 1.6px
2429
+ var(--inkly-hub-dot) 0.5px,
2430
+ transparent 1px
2417
2431
  );
2418
- background-size: 14px 14px;
2432
+ background-size: 10px 10px;
2419
2433
  color: var(--inkly-hub-ink-strong);
2420
2434
  }
2421
2435
 
@@ -2625,10 +2639,10 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2625
2639
  background-color: var(--inkly-hub-canvas);
2626
2640
  background-image: radial-gradient(
2627
2641
  circle at 1px 1px,
2628
- var(--inkly-hub-dot) 1px,
2629
- transparent 1.6px
2642
+ var(--inkly-hub-dot) 0.5px,
2643
+ transparent 1px
2630
2644
  );
2631
- background-size: 14px 14px;
2645
+ background-size: 10px 10px;
2632
2646
  }
2633
2647
  .inkly-hub-pa-topbar {
2634
2648
  flex: 0 0 auto;
@@ -2687,12 +2701,19 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2687
2701
  }
2688
2702
  .inkly-hub-pa-title {
2689
2703
  margin: 0;
2704
+ /* Shares the cover-title font stack so the hub hero and the player
2705
+ headline read as one type voice \u2014 self-hosted Fraunces, with
2706
+ Newsreader then Georgia as fallbacks. */
2707
+ font-family: "Fraunces", "Newsreader", Georgia, serif;
2690
2708
  font-weight: 600;
2691
2709
  line-height: 1.08;
2692
2710
  letter-spacing: -0.5px;
2693
2711
  color: var(--inkly-hub-ink-strong);
2694
2712
  max-width: 820px;
2695
- font-size: 40px;
2713
+ /* Fluid against the hub container so the hero title scales smoothly
2714
+ with the subtitle (also fluid) rather than stepping at breakpoints \u2014
2715
+ this keeps the title:subtitle ratio locked, matching the cover. */
2716
+ font-size: clamp(30px, 3.6cqi, 40px);
2696
2717
  }
2697
2718
  .inkly-hub-pa-title em {
2698
2719
  font-style: normal;
@@ -2701,7 +2722,9 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2701
2722
  .inkly-hub-pa-subtitle {
2702
2723
  margin: 12px 0 0;
2703
2724
  max-width: 600px;
2704
- font-size: 16px;
2725
+ /* Fluid at the same proportion as the title (\u22482.4x) so the pair scales
2726
+ together. Floors at 14px / caps at 16.5px. */
2727
+ font-size: clamp(14px, 1.5cqi, 16.5px);
2705
2728
  color: var(--inkly-hub-ink-2);
2706
2729
  line-height: 1.55;
2707
2730
  }
@@ -2781,7 +2804,7 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2781
2804
  overflow: hidden;
2782
2805
  }
2783
2806
  .inkly-hub-pa-shell-header {
2784
- height: 60px;
2807
+ height: 52px;
2785
2808
  position: sticky;
2786
2809
  top: 0;
2787
2810
  z-index: 5;
@@ -2807,18 +2830,6 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2807
2830
  gap: 10px;
2808
2831
  padding: 0 24px 0 22px;
2809
2832
  }
2810
- .inkly-hub-pa-breadcrumb {
2811
- font-size: 13px;
2812
- color: var(--inkly-hub-ink-muted);
2813
- }
2814
- .inkly-hub-pa-breadcrumb-sep {
2815
- margin: 0 6px;
2816
- color: var(--inkly-hub-line-strong);
2817
- }
2818
- .inkly-hub-pa-breadcrumb strong {
2819
- color: var(--inkly-hub-ink-strong);
2820
- font-weight: 500;
2821
- }
2822
2833
  .inkly-hub-pa-shell-bar-end {
2823
2834
  margin-left: auto;
2824
2835
  display: flex;
@@ -2919,10 +2930,10 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2919
2930
  background-color: var(--inkly-hub-canvas);
2920
2931
  background-image: radial-gradient(
2921
2932
  circle at 1px 1px,
2922
- var(--inkly-hub-dot) 1px,
2923
- transparent 1.6px
2933
+ var(--inkly-hub-dot) 0.5px,
2934
+ transparent 1px
2924
2935
  );
2925
- background-size: 14px 14px;
2936
+ background-size: 10px 10px;
2926
2937
  border-top-left-radius: 8px;
2927
2938
  border-top: 1px solid var(--inkly-hub-line);
2928
2939
  border-left: 1px solid var(--inkly-hub-line);
@@ -2941,13 +2952,9 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
2941
2952
  .inkly-hub-pa-shell-hero {
2942
2953
  padding: 32px 32px 14px;
2943
2954
  }
2944
- .inkly-hub-pa-shell-hero .inkly-hub-pa-title {
2945
- font-size: 40px;
2946
- letter-spacing: -0.5px;
2947
- }
2948
- .inkly-hub-pa-shell-hero .inkly-hub-pa-subtitle {
2949
- font-size: 16px;
2950
- }
2955
+ /* Title + subtitle sizing now lives on the base .inkly-hub-pa-title /
2956
+ .inkly-hub-pa-subtitle rules (fluid clamps), shared by both the sidebar
2957
+ shell-hero and the tabs hero. */
2951
2958
 
2952
2959
  /* \u2500\u2500 Demo grid (both layouts) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2953
2960
 
@@ -3084,9 +3091,6 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
3084
3091
  .hub-index[data-theme="inkly"][data-layout="tabs"] .inkly-hub-demos-grid {
3085
3092
  grid-template-columns: repeat(3, minmax(0, 1fr));
3086
3093
  }
3087
- .hub-index[data-theme="inkly"][data-layout="tabs"] .inkly-hub-pa-title {
3088
- font-size: 34px;
3089
- }
3090
3094
  }
3091
3095
 
3092
3096
  @container hub-pa-tabs (max-width: 640px) {
@@ -3301,16 +3305,10 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
3301
3305
  .hub-index[data-theme="inkly"][data-layout="sidebar"] .inkly-hub-demos-grid {
3302
3306
  grid-template-columns: repeat(3, minmax(0, 1fr));
3303
3307
  }
3304
- .hub-index[data-theme="inkly"][data-layout="sidebar"] .inkly-hub-pa-shell-hero .inkly-hub-pa-title {
3305
- font-size: 34px;
3306
- }
3307
- /* Trim the header bar so breadcrumb + search + CTAs don't wrap. */
3308
+ /* Trim the header bar so search + CTAs don't wrap. */
3308
3309
  .hub-index[data-theme="inkly"][data-layout="sidebar"] .inkly-hub-pa-shell-bar-end .inkly-hub-pa-cta.is-secondary {
3309
3310
  display: none;
3310
3311
  }
3311
- .hub-index[data-theme="inkly"][data-layout="sidebar"] .inkly-hub-pa-breadcrumb {
3312
- display: none;
3313
- }
3314
3312
  }
3315
3313
 
3316
3314
  @container hub-pa-sidebar (max-width: 640px) {
@@ -3514,7 +3512,7 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
3514
3512
  /* Dotted backdrop on the content stage. */
3515
3513
  [data-demo-theme="inkly"] .demo-player-shell {
3516
3514
  background:
3517
- radial-gradient(circle at 1px 1px, rgba(0,0,0,0.10) 1px, transparent 1.6px) 0 0 / 14px 14px,
3515
+ radial-gradient(circle at 1px 1px, rgba(0,0,0,0.08) 0.5px, transparent 1px) 0 0 / 10px 10px,
3518
3516
  #f5f5f5;
3519
3517
  }
3520
3518
 
@@ -3523,17 +3521,30 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
3523
3521
  when authors want a unique cover image. */
3524
3522
  [data-demo-theme="inkly"] .demo-intro{
3525
3523
  background-color: #f5f5f5;
3526
- /* A translucent white wash layered over the watercolor pales it back a
3527
- touch so the near-black headline + muted description read with more
3528
- contrast against the sky. Gradient layer paints above the image. */
3524
+ }
3525
+ /* Watercolor backdrop lives on a ::before so it can be mirrored
3526
+ horizontally \u2014 the source image's dark pine sits bottom-LEFT, right where
3527
+ the left-aligned headline/description go. scaleX(-1) flips it to the
3528
+ right (empty) side without touching the text. The image is 16:9 inside a
3529
+ 16:9 cover, so background-position can't slide it; mirroring is the only
3530
+ way to move the pine off the copy without zooming or washing it out.
3531
+ z-index:-1 keeps it above the solid #f5f5f5 fill but below the (un-
3532
+ positioned) cover content, so the copy stays on top. A translucent white
3533
+ wash pales the watercolor back a touch for headline contrast. */
3534
+ [data-demo-theme="inkly"] .demo-intro::before{
3535
+ content: "";
3536
+ position: absolute;
3537
+ inset: 0;
3538
+ z-index: -1;
3539
+ border-radius: inherit;
3529
3540
  background-image:
3530
3541
  linear-gradient(rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.3)),
3531
3542
  url("https://www.cdn.inklyai.dev/backgrounds/watercolor-background.png");
3532
3543
  background-size: cover;
3533
- /* Nudge the image left + down so the bottom-left watercolor tree clears
3534
- the headline/description that sit on the left of the cover. */
3535
- background-position: 70% 30%;
3544
+ background-position: center;
3536
3545
  background-repeat: no-repeat;
3546
+ transform: scaleX(-1);
3547
+ pointer-events: none;
3537
3548
  }
3538
3549
 
3539
3550
  /* Header \u2014 design's macOS chrome: 52px tall, gradient surface, single
@@ -3721,11 +3732,15 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
3721
3732
  padding: clamp(40px, 6cqi, 72px);
3722
3733
  }
3723
3734
  [data-demo-theme="inkly"] .demo-intro-title{
3724
- font-family: var(--demo-font);
3735
+ /* Fraunces 600 \u2014 a high-contrast display serif, self-hosted on the Inkly
3736
+ CDN (see @font-face above) so it renders everywhere: preview, hosted
3737
+ hubs, and exported self-contained demos. Newsreader then Georgia are
3738
+ swap fallbacks. */
3739
+ font-family: "Fraunces", "Newsreader", Georgia, serif;
3725
3740
  font-weight: 600;
3726
- font-size: clamp(28px, 3.6cqi, 42px);
3727
- line-height: 1.05;
3728
- letter-spacing: -0.8px;
3741
+ font-size: clamp(30px, 3.8cqi, 44px);
3742
+ line-height: 1.08;
3743
+ letter-spacing: -1.5px;
3729
3744
  color: var(--demo-fg);
3730
3745
  text-wrap: balance;
3731
3746
  }
@@ -3735,8 +3750,11 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
3735
3750
  }
3736
3751
  [data-demo-theme="inkly"] .demo-intro-description{
3737
3752
  color: #5f5f5f;
3738
- font-size: 15px;
3739
- line-height: 1.55;
3753
+ /* Fluid like the title (3.8cqi) so the title:subtitle ratio stays a
3754
+ steady ~2.2\u20132.6x across player widths instead of drifting from 2x to
3755
+ ~2.9x when the title is fixed against a 15px subtitle. */
3756
+ font-size: clamp(14px, 1.5cqi, 17px);
3757
+ line-height: 1.5;
3740
3758
  max-width: 46ch;
3741
3759
  opacity: 1;
3742
3760
  }
@@ -3888,12 +3906,11 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
3888
3906
  gap: 4px;
3889
3907
  padding: 3px 6px 3px 5px;
3890
3908
  }
3891
- /* Editorial serif wordmark \u2014 a newsreader-class serif gives the watermark
3892
- a more crafted, magazine feel than the all-sans chrome. Newsreader is
3893
- used when a host loads it; Georgia is the dependable on-screen fallback
3894
- so the demo stays self-contained. */
3909
+ /* Wordmark shares the cover-title font stack so the watermark and the
3910
+ headline read as one type voice \u2014 self-hosted Fraunces, with Newsreader
3911
+ then Georgia as fallbacks. */
3895
3912
  [data-demo-theme="inkly"] .demo-builtwith-badge-text {
3896
- font-family: "Newsreader", Georgia, "Times New Roman", serif;
3913
+ font-family: "Fraunces", "Newsreader", Georgia, "Times New Roman", serif;
3897
3914
  font-size: 12px;
3898
3915
  font-weight: 600;
3899
3916
  letter-spacing: 0.2px;
@@ -4029,7 +4046,7 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
4029
4046
  line-height: 1.45;
4030
4047
  }
4031
4048
  }
4032
- `,ta={id:"inkly",label:"Inkly",theme:Be.inkly,css:uc};var pc=`
4049
+ `,ua={id:"inkly",label:"Inkly",theme:Je.inkly,css:Cc};var Tc=`
4033
4050
  .hub-index[data-theme="substack"] {
4034
4051
  background: #ffffff;
4035
4052
  color: #1a1a1a;
@@ -4960,131 +4977,151 @@ ${ft(n??"",{resourceOrigin:i}).replace(/<\/(style)/gi,"<\\/$1")}
4960
4977
  --demo-watermark-mark-radius: 3px;
4961
4978
  font-family: var(--demo-font);
4962
4979
  }
4963
- `,na={id:"substack",label:"Substack",theme:Be.substack,css:pc};var ra=[ta,Qi,ea,na],pe=Object.fromEntries(ra.map(e=>[e.id,e]));import{createHash as _c}from"crypto";import{mkdir as Cc,readFile as yr,rm as Nf,stat as Mf}from"fs/promises";import{homedir as Tc}from"os";import{join as We}from"path";import{fileURLToPath as Ac}from"url";import{access as hc,readFile as mc,readdir as fc,stat as gc}from"fs/promises";import{dirname as bc,join as Nt,resolve as yc,sep as xc}from"path";async function Z(e){return hc(e).then(()=>!0,()=>!1)}async function De(e){let t=yc(e);for(;;){if(await Z(Nt(t,"inkly.json")))return t;let n=bc(t);if(n===t)return null;t=n}}async function mr(e){let t=Nt(e,"demos");if(!await Z(t))return[];let n=[];async function r(i){let a;try{a=await fc(i,{withFileTypes:!0})}catch{return}if(a.some(o=>o.isFile()&&o.name==="demo.config.json")){let o=i===t?"":i.slice(t.length+1).split(xc).join("/");n.push({slug:o,dir:i,configPath:Nt(i,"demo.config.json")});return}for(let o of a)o.isDirectory()&&await r(Nt(i,o.name))}return await r(t),n.sort((i,a)=>i.slug.localeCompare(a.slug))}async function $e(e){let t=await mc(e,"utf8");return JSON.parse(t)}async function Mt(e){let t=await De(e);if(!t)throw new Error(`No inkly.json found in ${e} or any parent directory.`);let n=Nt(t,"inkly.json"),r=we.safeParse(await $e(n));if(!r.success)throw new Error(`inkly.json failed schema validation: ${r.error.message}`);let i=[];for(let a of await mr(t)){let o;try{o=$t(await $e(a.configPath)).config}catch(d){throw new Error(`demos/${a.slug}/demo.config.json failed schema validation: ${d.message}`)}let s=Nt(a.dir,"assets.json"),c=null;if(await Z(s)){let d=Rt.safeParse(await $e(s));if(!d.success)throw new Error(`demos/${a.slug}/assets.json failed schema validation: ${d.error.message}`);c=d.data}i.push({slug:a.slug,dir:a.dir,configPath:a.configPath,config:o,assetsPath:s,assets:c})}return{root:t,inklyPath:n,inkly:r.data,demos:i}}function fr(e){let t=e.split("/")[0]??e,n=Re(t);return n.ok?gt.includes(e)?`Demo folder "${e}" uses a reserved slug.`:null:n.reason}async function An(e){try{let t=await gc(e);return t.isFile()?t.size:null}catch{return null}}import{mkdir as kc,rename as wc,writeFile as vc}from"fs/promises";import{dirname as Sc}from"path";async function te(e,t,n){await kc(Sc(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await vc(r,t,n?.mode!=null?{mode:n.mode}:void 0),await wc(r,e)}var Pc="https://www.runtime.inklyai.dev";function yt(){let e=process.env.BUNDLES_R2_PUBLIC_BASE_URL;return typeof e=="string"&&e.length>0?e.replace(/\/+$/,""):Pc}function xr(e,t,n=yt()){return`${n}/runtime/${e}/${t}`}function Ic(e){return We(Tc(),".inkly","cache","runtime",e)}function Ec(e){let t=/^(sha(?:256|384|512))-([A-Za-z0-9+/]+=*)$/.exec(e);return t?{algorithm:t[1],expected:t[2]}:null}function Lt(e,t){let n=Ec(t);return n?_c(n.algorithm).update(e).digest("base64")===n.expected:!1}var Ot=class extends Error{constructor(n,r,i){super(`integrity mismatch for ${n}: expected ${r}`+(i?` (from ${i})`:"")+". The bundle does not match inkly.lock. Re-run `inkly lock` to refresh, or the CDN may have been tampered with.");this.file=n;this.expected=r;this.url=i;this.name="IntegrityMismatchError"}},bt=class extends Error{constructor(t){super(t),this.name="LockReadError"}};async function Rc(e){let t=We(e,"inkly.lock");if(!await Z(t))throw new bt(`no inkly.lock found in ${e}. Run \`inkly lock\` to generate one.`);let n;try{n=await $e(t)}catch(i){throw new bt(`failed to read ${t}: ${i.message}`)}let r=Tn.safeParse(n);if(!r.success)throw new bt(`${t} failed InklyLockSchema validation: ${r.error.message}`);return r.data}function $c(e,t){let n=e.lastIndexOf("/");return n===-1?e:`${e.slice(0,n+1)}${t}`}async function ia(e){try{return await yr(e)}catch{return null}}async function Dc(e){let t=We(e,"manifest.json");if(!await Z(t))return null;try{let n=JSON.parse(await yr(t,"utf8")),r=Dt.safeParse(n);return r.success?r.data:null}catch{return null}}async function gr(e,t){await te(e,t)}async function br(e,t){if(e.startsWith("file://"))try{return await yr(Ac(e))}catch(i){throw new Error(`failed to read ${e}: ${i.message}`)}let n;try{n=await t(e)}catch(i){throw new Error(`failed to fetch ${e}: ${i.message}`)}if(!n.ok)throw new Error(`fetch ${e} returned HTTP ${n.status}`);let r=await n.arrayBuffer();return Buffer.from(r)}async function kr(e){let t=e.fetchImpl??fetch,n=e.lock??await Rc(e.hubRoot),{version:r,url:i,integrity:a}=n.runtime,o=Ic(r),s=await ia(We(o,"runtime.js")),c=await ia(We(o,"runtime.css")),d=await Dc(o);if(s&&c&&d){let $=Lt(s,a),R=d.version===r,b=Lt(c,d.cssIntegrity);if($&&R&&b)return{version:r,cacheDir:o,manifest:d,fetched:!1,bytesFetched:0,lock:n}}let u=$=>{let R=e.urlOverrides?.[$];return R||($==="runtime.js"?i:$c(i,$))};await Cc(o,{recursive:!0});let p=u("manifest.json"),h=await br(p,t),f;try{let $=JSON.parse(h.toString("utf8")),R=Dt.safeParse($);if(!R.success)throw new Error(`manifest from ${p} failed schema validation: ${R.error.message}`);f=R.data}catch($){throw new Error(`manifest from ${p} is not valid JSON: ${$.message}`)}if(f.version!==r)throw new Error(`CDN manifest for ${p} reports version ${f.version} but inkly.lock pins ${r}. Re-run \`inkly lock\` to refresh.`);let w=u("runtime.js"),x=await br(w,t);if(!Lt(x,a))throw new Ot("runtime.js",a,w);let _=u("runtime.css"),I=await br(_,t);if(!Lt(I,f.cssIntegrity))throw new Ot("runtime.css",f.cssIntegrity,_);return await gr(We(o,"runtime.js"),x),await gr(We(o,"runtime.css"),I),await gr(We(o,"manifest.json"),h),{version:r,cacheDir:o,manifest:f,fetched:!0,bytesFetched:x.byteLength+I.byteLength+h.byteLength,lock:n}}import{readFile as oa,writeFile as Nc}from"fs/promises";import{dirname as wr,isAbsolute as Mc,join as jt,resolve as Lc}from"path";import{fileURLToPath as Oc,pathToFileURL as jc}from"url";function Ve(e,t,n){e.push({level:t,message:n})}async function zc(){let e=wr(Oc(import.meta.url));for(let t=0;t<10;t+=1){let n=jt(e,"node_modules","@inkly","runtime","dist","manifest.json");if(await Z(n))return n;let r=jt(e,"packages","inkly-runtime","dist","manifest.json");if(await Z(r))return r;let i=wr(e);if(i===e)break;e=i}return null}async function aa(e){let t=JSON.parse(await oa(e,"utf8")),n=Dt.safeParse(t);if(!n.success)throw new Error(`${e} failed RuntimeManifestSchema validation: ${n.error.message}`);return n.data}async function Uc(e,t){let n=yt(),r=xr(e,"manifest.json",n);try{let i=await t(r);if(!i.ok)return null;let a=JSON.parse(await i.text()),o=Dt.safeParse(a);return o.success?{manifest:o.data,url:r}:null}catch{return null}}async function Fc(e,t){if(t.manifestPath)return{manifest:await aa(t.manifestPath),source:"local",manifestPath:t.manifestPath};if(!t.localOnly){let r=t.fetchImpl??fetch,i=await Uc(e,r);if(i){if(i.manifest.version!==e)throw new Error(`CDN manifest at ${i.url} reports version ${i.manifest.version} but inkly.json pins ${e}. Wait for the publish workflow to upload the matching artifact, or update inkly.json#runtime to match.`);return{manifest:i.manifest,source:"cdn"}}}let n=await zc();if(!n)throw new Error(`Could not fetch runtime manifest for ${e} from ${yt()} and no local @inkly/runtime/dist/manifest.json was found. Either publish the runtime to R2, run \`npm run build:runtime\` in @inkly/runtime, or pass \`inkly lock --local <path-to-inkly-runtime>\`.`);return{manifest:await aa(n),source:"local",manifestPath:n}}async function Pn(e,t={}){let n=jt(e,"inkly.json"),r=await $e(n),i=typeof r.runtime=="string"?r.runtime:null;if(!i)throw new Error('inkly.json is missing a string "runtime" pin.');if(!/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(i))throw new Error(`inkly.json#runtime must be an exact semver (got "${i}"). Set runtime to an exact version and put your compatibility range in runtimeRange.`);let{manifest:a,source:o,manifestPath:s}=await Fc(i,t);if(a.version!==i)throw new Error(`Runtime manifest reports version ${a.version} but inkly.json pins ${i}. Build the matching Inkly runtime version (or upgrade the pin) and retry.`);return{lock:{$schema:"https://inklyai.dev/inkly.lock",runtime:{version:a.version,url:o==="local"&&s?jc(jt(wr(s),"runtime.js")).toString():xr(a.version,"runtime.js"),integrity:a.integrity}},manifest:a,source:o}}async function In(e){let t=[],n=await De(e.cwd);if(!n)return Ve(t,"error",`No inkly.json found in ${e.cwd} or any parent directory.`),ve({ok:!1,hubRoot:null,lockPath:null,lock:null,source:null,issues:t,drifted:!1,options:e});let r=jt(n,"inkly.lock"),i=e.manifestPath?Mc(e.manifestPath)?e.manifestPath:Lc(e.cwd,e.manifestPath):void 0;if(e.check){if(!await Z(r))return Ve(t,"error","inkly.lock is missing. Run `inkly lock` to create it."),ve({ok:!1,hubRoot:n,lockPath:r,lock:null,source:null,issues:t,drifted:!0,options:e});let a=await $e(r),o=Tn.safeParse(a);if(!o.success)return Ve(t,"error",`inkly.lock failed schema validation: ${o.error.message}`),ve({ok:!1,hubRoot:n,lockPath:r,lock:null,source:null,issues:t,drifted:!0,options:e});let s=jt(n,"inkly.json"),c=await $e(s),d=typeof c.runtime=="string"?c.runtime:null;if(!d)return Ve(t,"error",'inkly.json is missing a string "runtime" pin.'),ve({ok:!1,hubRoot:n,lockPath:r,lock:null,source:null,issues:t,drifted:!0,options:e});if(o.data.runtime.version!==d)return Ve(t,"error",`inkly.lock pins runtime ${o.data.runtime.version}, but inkly.json pins ${d}. Re-run \`inkly lock\` to refresh.`),ve({ok:!1,hubRoot:n,lockPath:r,lock:o.data,source:null,issues:t,drifted:!0,options:e});try{let u=await Pn(n,{manifestPath:i,localOnly:!!i||e.localOnly,fetchImpl:e.fetchImpl});return u.lock.runtime.integrity!==o.data.runtime.integrity?(Ve(t,"error",`inkly.lock integrity does not match what ${u.source==="cdn"?yt():"the local build"} serves for runtime ${d}. Re-run \`inkly lock\` to refresh, or someone tampered with the source.`),ve({ok:!1,hubRoot:n,lockPath:r,lock:o.data,source:u.source,issues:t,drifted:!0,options:e})):ve({ok:!0,hubRoot:n,lockPath:r,lock:o.data,source:u.source,issues:t,drifted:!1,options:e})}catch(u){return Ve(t,"error",u.message),ve({ok:!1,hubRoot:n,lockPath:r,lock:o.data,source:null,issues:t,drifted:!0,options:e})}}try{let{lock:a,source:o}=await Pn(n,{manifestPath:i,localOnly:!!i||e.localOnly,fetchImpl:e.fetchImpl}),s=JSON.stringify(a,null,2)+`
4964
- `,d=(await Z(r)?await oa(r,"utf8"):null)!==s;return d&&await Nc(r,s,"utf8"),ve({ok:!0,hubRoot:n,lockPath:r,lock:a,source:o,issues:t,drifted:d,options:e})}catch(a){return Ve(t,"error",a.message),ve({ok:!1,hubRoot:n,lockPath:r,lock:null,source:null,issues:t,drifted:!1,options:e})}}function ve(e){let{ok:t,hubRoot:n,lockPath:r,lock:i,source:a,issues:o,drifted:s,options:c}=e,d={ok:t,hubRoot:n,lockPath:r,lock:i,source:a,issues:o,drifted:s};if(!c.silent)if(c.json)process.stdout.write(JSON.stringify(d,null,2)+`
4965
- `);else if(t)c.check?process.stdout.write(`inkly lock --check: inkly.lock matches inkly.json (runtime ${i?.runtime.version}, source: ${a??"unknown"}).
4980
+ `,pa={id:"substack",label:"Substack",theme:Je.substack,css:Tc};var ha=[ua,ca,da,pa],fe=Object.fromEntries(ha.map(e=>[e.id,e]));import{createHash as jc}from"crypto";import{mkdir as Uc,readFile as Er,rm as tg,stat as ng}from"fs/promises";import{homedir as zc}from"os";import{join as qe}from"path";import{fileURLToPath as Fc}from"url";import{access as Ac,readFile as Pc,readdir as Ic,stat as Ec}from"fs/promises";import{dirname as Rc,join as Ot,resolve as $c,sep as Dc}from"path";async function Z(e){return Ac(e).then(()=>!0,()=>!1)}async function Ne(e){let t=$c(e);for(;;){if(await Z(Ot(t,"inkly.json")))return t;let n=Rc(t);if(n===t)return null;t=n}}async function Tr(e){let t=Ot(e,"demos");if(!await Z(t))return[];let n=[];async function r(i){let a;try{a=await Ic(i,{withFileTypes:!0})}catch{return}if(a.some(o=>o.isFile()&&o.name==="demo.config.json")){let o=i===t?"":i.slice(t.length+1).split(Dc).join("/");n.push({slug:o,dir:i,configPath:Ot(i,"demo.config.json")});return}for(let o of a)o.isDirectory()&&await r(Ot(i,o.name))}return await r(t),n.sort((i,a)=>i.slug.localeCompare(a.slug))}async function De(e){let t=await Pc(e,"utf8");return JSON.parse(t)}async function jt(e){let t=await Ne(e);if(!t)throw new Error(`No inkly.json found in ${e} or any parent directory.`);let n=Ot(t,"inkly.json"),r=_e.safeParse(await De(n));if(!r.success)throw new Error(`inkly.json failed schema validation: ${r.error.message}`);let i=[];for(let a of await Tr(t)){let o;try{o=Mt(await De(a.configPath)).config}catch(d){throw new Error(`demos/${a.slug}/demo.config.json failed schema validation: ${d.message}`)}let s=Ot(a.dir,"assets.json"),l=null;if(await Z(s)){let d=Nt.safeParse(await De(s));if(!d.success)throw new Error(`demos/${a.slug}/assets.json failed schema validation: ${d.error.message}`);l=d.data}i.push({slug:a.slug,dir:a.dir,configPath:a.configPath,config:o,assetsPath:s,assets:l})}return{root:t,inklyPath:n,inkly:r.data,demos:i}}function Ar(e){let t=e.split("/")[0]??e,n=$e(t);return n.ok?bt.includes(e)?`Demo folder "${e}" uses a reserved slug.`:null:n.reason}async function Dn(e){try{let t=await Ec(e);return t.isFile()?t.size:null}catch{return null}}import{mkdir as Nc,rename as Mc,writeFile as Lc}from"fs/promises";import{dirname as Oc}from"path";async function ee(e,t,n){await Nc(Oc(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await Lc(r,t,n?.mode!=null?{mode:n.mode}:void 0),await Mc(r,e)}var Hc="https://www.runtime.inklyai.dev";function xt(){let e=process.env.BUNDLES_R2_PUBLIC_BASE_URL;return typeof e=="string"&&e.length>0?e.replace(/\/+$/,""):Hc}function Rr(e,t,n=xt()){return`${n}/runtime/${e}/${t}`}function Bc(e){return qe(zc(),".inkly","cache","runtime",e)}function Wc(e){let t=/^(sha(?:256|384|512))-([A-Za-z0-9+/]+=*)$/.exec(e);return t?{algorithm:t[1],expected:t[2]}:null}function Ut(e,t){let n=Wc(t);return n?jc(n.algorithm).update(e).digest("base64")===n.expected:!1}var zt=class extends Error{constructor(n,r,i){super(`integrity mismatch for ${n}: expected ${r}`+(i?` (from ${i})`:"")+". The bundle does not match inkly.lock. Re-run `inkly lock` to refresh, or the CDN may have been tampered with.");this.file=n;this.expected=r;this.url=i;this.name="IntegrityMismatchError"}},yt=class extends Error{constructor(t){super(t),this.name="LockReadError"}};async function Vc(e){let t=qe(e,"inkly.lock");if(!await Z(t))throw new yt(`no inkly.lock found in ${e}. Run \`inkly lock\` to generate one.`);let n;try{n=await De(t)}catch(i){throw new yt(`failed to read ${t}: ${i.message}`)}let r=$n.safeParse(n);if(!r.success)throw new yt(`${t} failed InklyLockSchema validation: ${r.error.message}`);return r.data}function Jc(e,t){let n=e.lastIndexOf("/");return n===-1?e:`${e.slice(0,n+1)}${t}`}async function ma(e){try{return await Er(e)}catch{return null}}async function qc(e){let t=qe(e,"manifest.json");if(!await Z(t))return null;try{let n=JSON.parse(await Er(t,"utf8")),r=Lt.safeParse(n);return r.success?r.data:null}catch{return null}}async function Pr(e,t){await ee(e,t)}async function Ir(e,t){if(e.startsWith("file://"))try{return await Er(Fc(e))}catch(i){throw new Error(`failed to read ${e}: ${i.message}`)}let n;try{n=await t(e)}catch(i){throw new Error(`failed to fetch ${e}: ${i.message}`)}if(!n.ok)throw new Error(`fetch ${e} returned HTTP ${n.status}`);let r=await n.arrayBuffer();return Buffer.from(r)}async function $r(e){let t=e.fetchImpl??fetch,n=e.lock??await Vc(e.hubRoot),{version:r,url:i,integrity:a}=n.runtime,o=Bc(r),s=await ma(qe(o,"runtime.js")),l=await ma(qe(o,"runtime.css")),d=await qc(o);if(s&&l&&d){let I=Ut(s,a),R=d.version===r,k=Ut(l,d.cssIntegrity);if(I&&R&&k)return{version:r,cacheDir:o,manifest:d,fetched:!1,bytesFetched:0,lock:n}}let u=I=>{let R=e.urlOverrides?.[I];return R||(I==="runtime.js"?i:Jc(i,I))};await Uc(o,{recursive:!0});let p=u("manifest.json"),h=await Ir(p,t),m;try{let I=JSON.parse(h.toString("utf8")),R=Lt.safeParse(I);if(!R.success)throw new Error(`manifest from ${p} failed schema validation: ${R.error.message}`);m=R.data}catch(I){throw new Error(`manifest from ${p} is not valid JSON: ${I.message}`)}if(m.version!==r)throw new Error(`CDN manifest for ${p} reports version ${m.version} but inkly.lock pins ${r}. Re-run \`inkly lock\` to refresh.`);let x=u("runtime.js"),y=await Ir(x,t);if(!Ut(y,a))throw new zt("runtime.js",a,x);let w=u("runtime.css"),T=await Ir(w,t);if(!Ut(T,m.cssIntegrity))throw new zt("runtime.css",m.cssIntegrity,w);return await Pr(qe(o,"runtime.js"),y),await Pr(qe(o,"runtime.css"),T),await Pr(qe(o,"manifest.json"),h),{version:r,cacheDir:o,manifest:m,fetched:!0,bytesFetched:y.byteLength+T.byteLength+h.byteLength,lock:n}}import{readFile as ga,writeFile as Zc}from"fs/promises";import{dirname as Dr,isAbsolute as Gc,join as Ft,resolve as Kc}from"path";import{fileURLToPath as Yc,pathToFileURL as Xc}from"url";function Ze(e,t,n){e.push({level:t,message:n})}async function Qc(){let e=Dr(Yc(import.meta.url));for(let t=0;t<10;t+=1){let n=Ft(e,"node_modules","@inkly","runtime","dist","manifest.json");if(await Z(n))return n;let r=Ft(e,"packages","inkly-runtime","dist","manifest.json");if(await Z(r))return r;let i=Dr(e);if(i===e)break;e=i}return null}async function fa(e){let t=JSON.parse(await ga(e,"utf8")),n=Lt.safeParse(t);if(!n.success)throw new Error(`${e} failed RuntimeManifestSchema validation: ${n.error.message}`);return n.data}async function ed(e,t){let n=xt(),r=Rr(e,"manifest.json",n);try{let i=await t(r);if(!i.ok)return null;let a=JSON.parse(await i.text()),o=Lt.safeParse(a);return o.success?{manifest:o.data,url:r}:null}catch{return null}}async function td(e,t){if(t.manifestPath)return{manifest:await fa(t.manifestPath),source:"local",manifestPath:t.manifestPath};if(!t.localOnly){let r=t.fetchImpl??fetch,i=await ed(e,r);if(i){if(i.manifest.version!==e)throw new Error(`CDN manifest at ${i.url} reports version ${i.manifest.version} but inkly.json pins ${e}. Wait for the publish workflow to upload the matching artifact, or update inkly.json#runtime to match.`);return{manifest:i.manifest,source:"cdn"}}}let n=await Qc();if(!n)throw new Error(`Could not fetch runtime manifest for ${e} from ${xt()} and no local @inkly/runtime/dist/manifest.json was found. Either publish the runtime to R2, run \`npm run build:runtime\` in @inkly/runtime, or pass \`inkly lock --local <path-to-inkly-runtime>\`.`);return{manifest:await fa(n),source:"local",manifestPath:n}}async function Nn(e,t={}){let n=Ft(e,"inkly.json"),r=await De(n),i=typeof r.runtime=="string"?r.runtime:null;if(!i)throw new Error('inkly.json is missing a string "runtime" pin.');if(!/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(i))throw new Error(`inkly.json#runtime must be an exact semver (got "${i}"). Set runtime to an exact version and put your compatibility range in runtimeRange.`);let{manifest:a,source:o,manifestPath:s}=await td(i,t);if(a.version!==i)throw new Error(`Runtime manifest reports version ${a.version} but inkly.json pins ${i}. Build the matching Inkly runtime version (or upgrade the pin) and retry.`);return{lock:{$schema:"https://inklyai.dev/inkly.lock",runtime:{version:a.version,url:o==="local"&&s?Xc(Ft(Dr(s),"runtime.js")).toString():Rr(a.version,"runtime.js"),integrity:a.integrity}},manifest:a,source:o}}async function Mn(e){let t=[],n=await Ne(e.cwd);if(!n)return Ze(t,"error",`No inkly.json found in ${e.cwd} or any parent directory.`),Ce({ok:!1,hubRoot:null,lockPath:null,lock:null,source:null,issues:t,drifted:!1,options:e});let r=Ft(n,"inkly.lock"),i=e.manifestPath?Gc(e.manifestPath)?e.manifestPath:Kc(e.cwd,e.manifestPath):void 0;if(e.check){if(!await Z(r))return Ze(t,"error","inkly.lock is missing. Run `inkly lock` to create it."),Ce({ok:!1,hubRoot:n,lockPath:r,lock:null,source:null,issues:t,drifted:!0,options:e});let a=await De(r),o=$n.safeParse(a);if(!o.success)return Ze(t,"error",`inkly.lock failed schema validation: ${o.error.message}`),Ce({ok:!1,hubRoot:n,lockPath:r,lock:null,source:null,issues:t,drifted:!0,options:e});let s=Ft(n,"inkly.json"),l=await De(s),d=typeof l.runtime=="string"?l.runtime:null;if(!d)return Ze(t,"error",'inkly.json is missing a string "runtime" pin.'),Ce({ok:!1,hubRoot:n,lockPath:r,lock:null,source:null,issues:t,drifted:!0,options:e});if(o.data.runtime.version!==d)return Ze(t,"error",`inkly.lock pins runtime ${o.data.runtime.version}, but inkly.json pins ${d}. Re-run \`inkly lock\` to refresh.`),Ce({ok:!1,hubRoot:n,lockPath:r,lock:o.data,source:null,issues:t,drifted:!0,options:e});try{let u=await Nn(n,{manifestPath:i,localOnly:!!i||e.localOnly,fetchImpl:e.fetchImpl});return u.lock.runtime.integrity!==o.data.runtime.integrity?(Ze(t,"error",`inkly.lock integrity does not match what ${u.source==="cdn"?xt():"the local build"} serves for runtime ${d}. Re-run \`inkly lock\` to refresh, or someone tampered with the source.`),Ce({ok:!1,hubRoot:n,lockPath:r,lock:o.data,source:u.source,issues:t,drifted:!0,options:e})):Ce({ok:!0,hubRoot:n,lockPath:r,lock:o.data,source:u.source,issues:t,drifted:!1,options:e})}catch(u){return Ze(t,"error",u.message),Ce({ok:!1,hubRoot:n,lockPath:r,lock:o.data,source:null,issues:t,drifted:!0,options:e})}}try{let{lock:a,source:o}=await Nn(n,{manifestPath:i,localOnly:!!i||e.localOnly,fetchImpl:e.fetchImpl}),s=JSON.stringify(a,null,2)+`
4981
+ `,d=(await Z(r)?await ga(r,"utf8"):null)!==s;return d&&await Zc(r,s,"utf8"),Ce({ok:!0,hubRoot:n,lockPath:r,lock:a,source:o,issues:t,drifted:d,options:e})}catch(a){return Ze(t,"error",a.message),Ce({ok:!1,hubRoot:n,lockPath:r,lock:null,source:null,issues:t,drifted:!1,options:e})}}function Ce(e){let{ok:t,hubRoot:n,lockPath:r,lock:i,source:a,issues:o,drifted:s,options:l}=e,d={ok:t,hubRoot:n,lockPath:r,lock:i,source:a,issues:o,drifted:s};if(!l.silent)if(l.json)process.stdout.write(JSON.stringify(d,null,2)+`
4982
+ `);else if(t)l.check?process.stdout.write(`inkly lock --check: inkly.lock matches inkly.json (runtime ${i?.runtime.version}, source: ${a??"unknown"}).
4966
4983
  `):s?process.stdout.write(`inkly lock: wrote ${r} (runtime ${i?.runtime.version}, source: ${a??"unknown"}).
4967
4984
  `):process.stdout.write(`inkly lock: ${r} already up to date (runtime ${i?.runtime.version}, source: ${a??"unknown"}).
4968
4985
  `);else{for(let u of o)process.stdout.write(`${u.level.toUpperCase()} ${u.message}
4969
4986
  `);process.stdout.write(`inkly lock failed
4970
- `)}return d}function En(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function qc(e=yt()){return`${e}/runtime/latest.json`}function ca(e){return la==="/"?e:e.split("/").join(la)}function Gc(e){let t=e??globalThis.fetch;if(typeof t!="function")throw new Error("This Node runtime does not provide fetch; Node 20+ is required.");return t}async function da(e,t){let n=await t(e);if(!n.ok)throw new Error(`failed to fetch ${e}: HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`);let r=Hc.from(await n.arrayBuffer()),i;try{i=JSON.parse(r.toString("utf8"))}catch(a){throw new Error(`failed to parse JSON from ${e}: ${a.message}`)}return{json:i,bytes:r}}function Kc(e,t){if(!En(e))throw new Error(`${t} is not an object`);let n=e.version,r=e.hubSkeleton;if(typeof n!="string"||n.length===0)throw new Error(`${t} is missing version`);if(!En(r))throw new Error(`${t} is missing hubSkeleton`);if(typeof r.url!="string"||r.url.length===0)throw new Error(`${t} is missing hubSkeleton.url`);if(typeof r.integrity!="string"||r.integrity.length===0)throw new Error(`${t} is missing hubSkeleton.integrity`);if(typeof r.version!="number")throw new Error(`${t} is missing hubSkeleton.version`);let i=typeof r.bytes=="number"?r.bytes:void 0;return{version:n,hubSkeleton:{version:r.version,url:r.url,integrity:r.integrity,bytes:i}}}function Yc(e,t){if(!En(e))throw new Error(`${t} is not an object`);if(e.version!==1)throw new Error(`${t} has unsupported skeleton version`);if(typeof e.runtime!="string"||e.runtime.length===0)throw new Error(`${t} is missing runtime`);if(!Array.isArray(e.files))throw new Error(`${t} is missing files`);let n=e.files.map((r,i)=>{if(!En(r))throw new Error(`${t} files[${i}] is not an object`);if(typeof r.path!="string"||r.path.length===0)throw new Error(`${t} files[${i}].path is missing`);if(typeof r.contents!="string")throw new Error(`${t} files[${i}].contents is missing`);return{path:r.path,contents:r.contents}});return{version:1,runtime:e.runtime,files:n}}function Xc(e,t,n){return e.split(t).join(n)}function Qc(e){if(e.startsWith("/")||e.startsWith("\\")||/^[A-Za-z]:/.test(e)||e.includes("\\")||e.split("/").some(t=>t===".."||t.length===0))throw new Error(`Unsafe skeleton path from runtime manifest: ${e}`)}function ed(e,t){let n=e.runtime,r=oe(),i=[["{{hubName}}",t.hubName],["{{hubNameJson}}",JSON.stringify(t.hubName)],["{{runtimeVersionJson}}",JSON.stringify(n)],["{{layoutEntry}}",t.layout===void 0?"":` "layout": ${JSON.stringify(t.layout)},
4971
- `],["{{themeJson}}",JSON.stringify(t.theme??"inkly")],["{{starterDemoIdJson}}",JSON.stringify(r)]],a=e.files.map(u=>{Qc(u.path);let p=u.contents;for(let[h,f]of i)p=Xc(p,h,f);if(/\{\{[A-Za-z][A-Za-z0-9]*\}\}/.test(p))throw new Error(`Unresolved placeholder in runtime skeleton file: ${u.path}`);return{path:u.path,contents:p}}),o=a.find(u=>u.path==="inkly.json");if(!o)throw new Error("Runtime skeleton is missing inkly.json");let s=we.safeParse(JSON.parse(o.contents));if(!s.success)throw new Error(`Runtime skeleton inkly.json is invalid: ${s.error.message}`);let c=a.find(u=>u.path==="demos/getting-started/demo.config.json");if(!c)throw new Error("Runtime skeleton is missing demos/getting-started/demo.config.json");let d=mt.safeParse(JSON.parse(c.contents));if(!d.success)throw new Error(`Runtime skeleton starter demo is invalid: ${d.error.message}`);return a}async function td(e){let{latestUrl:t,fetchImpl:n}=e,r=await da(t,n),i=Kc(r.json,t),a=new URL(i.hubSkeleton.url,t).toString(),o=await da(a,n);if(!Lt(o.bytes,i.hubSkeleton.integrity))throw new Error(`integrity mismatch for hub-skeleton.json from ${a}`);if(typeof i.hubSkeleton.bytes=="number"&&o.bytes.byteLength!==i.hubSkeleton.bytes)throw new Error(`byte length mismatch for hub-skeleton.json from ${a}`);let s=Yc(o.json,a);if(s.runtime!==i.version)throw new Error(`runtime/latest.json points at ${i.version}, but hub-skeleton.json declares ${s.runtime}`);return s}async function ua(e){let{name:t,cwd:n,layout:r,theme:i,silent:a}=e,o=Re(t);if(!o.ok)throw new Error(o.reason);let s=r===void 0?void 0:ur.safeParse(r);if(s&&!s.success)throw new Error("Invalid layout. Expected one of: sidebar, tabs.");if(i!==void 0){if(i.length===0)throw new Error("Invalid theme. Expected a theme preset id.");if(!pe[i]){let f=Object.keys(pe).join(", ");throw new Error(`Invalid theme "${i}". Expected one of: ${f}.`)}}let c=Zc(n,t);if(await Wc(c).then(()=>!0,()=>!1))throw new Error(`Directory already exists: ${c}. Refusing to overwrite \u2014 choose a different name or remove it first.`);let u=await td({latestUrl:e.runtimeManifestUrl??qc(),fetchImpl:Gc(e.fetchImpl)}),p=ed(u,{hubName:t,layout:s?.data,theme:i});await sa(c,{recursive:!0}),await Promise.all(p.map(async f=>{let w=ca(f.path),x=Jc(c,w);await sa(Vc(x),{recursive:!0}),await Bc(x,f.contents,"utf8")}));let h=!1;try{let f=await In({cwd:c,silent:!0,fetchImpl:e.fetchImpl});h=f.ok&&f.lockPath!==null}catch{}return a||(process.stdout.write(`Scaffolded hub ${t} at ${c}
4987
+ `)}return d}function Ln(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ld(e=xt()){return`${e}/runtime/latest.json`}function xa(e){return ya==="/"?e:e.split("/").join(ya)}function cd(e){let t=e??globalThis.fetch;if(typeof t!="function")throw new Error("This Node runtime does not provide fetch; Node 20+ is required.");return t}async function ka(e,t){let n=await t(e);if(!n.ok)throw new Error(`failed to fetch ${e}: HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`);let r=nd.from(await n.arrayBuffer()),i;try{i=JSON.parse(r.toString("utf8"))}catch(a){throw new Error(`failed to parse JSON from ${e}: ${a.message}`)}return{json:i,bytes:r}}function dd(e,t){if(!Ln(e))throw new Error(`${t} is not an object`);let n=e.version,r=e.hubSkeleton;if(typeof n!="string"||n.length===0)throw new Error(`${t} is missing version`);if(!Ln(r))throw new Error(`${t} is missing hubSkeleton`);if(typeof r.url!="string"||r.url.length===0)throw new Error(`${t} is missing hubSkeleton.url`);if(typeof r.integrity!="string"||r.integrity.length===0)throw new Error(`${t} is missing hubSkeleton.integrity`);if(typeof r.version!="number")throw new Error(`${t} is missing hubSkeleton.version`);let i=typeof r.bytes=="number"?r.bytes:void 0;return{version:n,hubSkeleton:{version:r.version,url:r.url,integrity:r.integrity,bytes:i}}}function ud(e,t){if(!Ln(e))throw new Error(`${t} is not an object`);if(e.version!==1)throw new Error(`${t} has unsupported skeleton version`);if(typeof e.runtime!="string"||e.runtime.length===0)throw new Error(`${t} is missing runtime`);if(!Array.isArray(e.files))throw new Error(`${t} is missing files`);let n=e.files.map((r,i)=>{if(!Ln(r))throw new Error(`${t} files[${i}] is not an object`);if(typeof r.path!="string"||r.path.length===0)throw new Error(`${t} files[${i}].path is missing`);if(typeof r.contents!="string")throw new Error(`${t} files[${i}].contents is missing`);return{path:r.path,contents:r.contents}});return{version:1,runtime:e.runtime,files:n}}function pd(e,t,n){return e.split(t).join(n)}function hd(e){if(e.startsWith("/")||e.startsWith("\\")||/^[A-Za-z]:/.test(e)||e.includes("\\")||e.split("/").some(t=>t===".."||t.length===0))throw new Error(`Unsafe skeleton path from runtime manifest: ${e}`)}function md(e,t){let n=e.runtime,r=ae(),i=[["{{hubName}}",t.hubName],["{{hubNameJson}}",JSON.stringify(t.hubName)],["{{runtimeVersionJson}}",JSON.stringify(n)],["{{layoutEntry}}",t.layout===void 0?"":` "layout": ${JSON.stringify(t.layout)},
4988
+ `],["{{themeJson}}",JSON.stringify(t.theme??"inkly")],["{{starterDemoIdJson}}",JSON.stringify(r)]],a=e.files.map(u=>{hd(u.path);let p=u.contents;for(let[h,m]of i)p=pd(p,h,m);if(/\{\{[A-Za-z][A-Za-z0-9]*\}\}/.test(p))throw new Error(`Unresolved placeholder in runtime skeleton file: ${u.path}`);return{path:u.path,contents:p}}),o=a.find(u=>u.path==="inkly.json");if(!o)throw new Error("Runtime skeleton is missing inkly.json");let s=_e.safeParse(JSON.parse(o.contents));if(!s.success)throw new Error(`Runtime skeleton inkly.json is invalid: ${s.error.message}`);let l=a.find(u=>u.path==="demos/getting-started/demo.config.json");if(!l)throw new Error("Runtime skeleton is missing demos/getting-started/demo.config.json");let d=We.safeParse(JSON.parse(l.contents));if(!d.success)throw new Error(`Runtime skeleton starter demo is invalid: ${d.error.message}`);return a}async function fd(e){let{latestUrl:t,fetchImpl:n}=e,r=await ka(t,n),i=dd(r.json,t),a=new URL(i.hubSkeleton.url,t).toString(),o=await ka(a,n);if(!Ut(o.bytes,i.hubSkeleton.integrity))throw new Error(`integrity mismatch for hub-skeleton.json from ${a}`);if(typeof i.hubSkeleton.bytes=="number"&&o.bytes.byteLength!==i.hubSkeleton.bytes)throw new Error(`byte length mismatch for hub-skeleton.json from ${a}`);let s=ud(o.json,a);if(s.runtime!==i.version)throw new Error(`runtime/latest.json points at ${i.version}, but hub-skeleton.json declares ${s.runtime}`);return s}async function wa(e){let{name:t,cwd:n,layout:r,theme:i,silent:a}=e,o=$e(t);if(!o.ok)throw new Error(o.reason);let s=r===void 0?void 0:Sr.safeParse(r);if(s&&!s.success)throw new Error("Invalid layout. Expected one of: sidebar, tabs.");if(i!==void 0){if(i.length===0)throw new Error("Invalid theme. Expected a theme preset id.");if(!fe[i]){let m=Object.keys(fe).join(", ");throw new Error(`Invalid theme "${i}". Expected one of: ${m}.`)}}let l=sd(n,t);if(await id(l).then(()=>!0,()=>!1))throw new Error(`Directory already exists: ${l}. Refusing to overwrite \u2014 choose a different name or remove it first.`);let u=await fd({latestUrl:e.runtimeManifestUrl??ld(),fetchImpl:cd(e.fetchImpl)}),p=md(u,{hubName:t,layout:s?.data,theme:i});await ba(l,{recursive:!0}),await Promise.all(p.map(async m=>{let x=xa(m.path),y=od(l,x);await ba(ad(y),{recursive:!0}),await rd(y,m.contents,"utf8")}));let h=!1;try{let m=await Mn({cwd:l,silent:!0,fetchImpl:e.fetchImpl});h=m.ok&&m.lockPath!==null}catch{}return a||(process.stdout.write(`Scaffolded hub ${t} at ${l}
4972
4989
 
4973
4990
  Next steps:
4974
4991
  cd ${t}
4975
4992
  inkly dev
4976
4993
  open http://localhost:3000
4977
- `),h||process.stdout.write("\nNote: could not pin the runtime yet (inkly.lock not written). `inkly dev` will resolve it on first run; run `inkly lock` to pin it.\n")),{dir:c,files:p.map(f=>ca(f.path))}}import{createServer as id}from"vite";import ad from"chokidar";import{readFile as me,readdir as od,stat as nn,mkdtemp as sd,mkdir as ld,cp as cd,writeFile as dd,rm as ud}from"fs/promises";import{existsSync as xt,createReadStream as pd}from"fs";import{tmpdir as hd}from"os";import{basename as md,dirname as kt,extname as fd,join as j,relative as gd,resolve as Je,sep as Dn}from"path";import{fileURLToPath as ka}from"url";import{createRequire as bd}from"module";import{createConnection as yd,createServer as xd}from"net";import{readFile as pa,stat as nd}from"fs/promises";import{relative as rd}from"path";async function Rn(e){let t=await De(e);if(!t)throw new Error(`No inkly.json found in ${e} or any parent directory. Run \`inkly init <name>\` first or cd into your hub.`);let n=[],r=[],i=[],a=[];for(let s of await mr(t)){let c;try{c=await pa(s.configPath,"utf8")}catch(h){i.push({slug:s.slug,configPath:s.configPath,message:`failed to read demo.config.json (${h.message})`});continue}let d;try{d=JSON.parse(c)}catch(h){i.push({slug:s.slug,configPath:s.configPath,message:`demo.config.json is not valid JSON (${h.message})`});continue}let u;try{u=$t(d)}catch(h){i.push({slug:s.slug,configPath:s.configPath,message:`demo.config.json failed schema validation: ${h.message}`});continue}u.changed&&(await ha(s.configPath,u.config),n.push({slug:s.slug,configPath:s.configPath,reason:"heal"}));let p=(await nd(s.configPath)).mtimeMs;a.push({slug:s.slug,configPath:s.configPath,id:u.config.id,mtimeMs:p})}let o=Gi(a.map(s=>({...s,updatedAt:s.mtimeMs})));for(let{entry:s,newId:c}of o){let d=await pa(s.configPath,"utf8"),u=JSON.parse(d);u.id=c,await ha(s.configPath,u),r.push({slug:s.slug,configPath:s.configPath,reason:"remint"})}return{hubRoot:t,healed:n,reminted:r,skipped:i}}function en(e,t){return rd(e,t).split(/[\\/]/).join("/")}async function ha(e,t){await te(e,JSON.stringify(t,null,2)+`
4978
- `)}var kd=ka(import.meta.url),zt=kt(kd),Sr="127.0.0.1";function ma(e){let t=Je(zt,"template",e);return xt(t)?t:Je(zt,"..","..","template",e)}function wd(e){let t=[Je(zt,"..","vendor",e),Je(zt,"..","..","vendor",e),Je(zt,"..","..","..","public","__inkly","vendor",e)];for(let n of t)if(xt(n))return n;return null}function vd(e){try{let r=bd(j(e,"package.json")).resolve("@inkly/runtime/package.json");return Je(kt(r),"dist")}catch{}let t=zt;for(let n=0;n<8;n++){let r=j(t,"packages","inkly-runtime","dist");if(xt(r))return r;let i=kt(t);if(i===t)break;t=i}return null}function fa(e,t){if(!t)return e;let{integrity:n}=t.lock.runtime,r=t.manifest.cssIntegrity,i=e;i=i.replace(/<link rel="stylesheet" href="\/__inkly\/runtime\.css" \/>/,`<link rel="stylesheet" href="/__inkly/runtime.css" integrity="${r}" crossorigin="anonymous" />`);let a=`<link rel="modulepreload" href="/__inkly/runtime.js" integrity="${n}" crossorigin="anonymous" />`;return/<link rel="prefetch" href="\/__inkly\/runtime\.js"[^>]*\/>/.test(i)?i=i.replace(/<link rel="prefetch" href="\/__inkly\/runtime\.js"[^>]*\/>/,a):i=i.replace(/<link rel="stylesheet" href="\/__inkly\/runtime\.css"[^>]*\/>/,o=>`${o}
4979
- ${a}`),i}function H(e,t,n,r){e.statusCode=t,e.setHeader("content-type",n),e.setHeader("cache-control","no-store"),e.end(r)}function rn(e,t,n){e.statusCode=200,e.setHeader("content-type",n),e.setHeader("cache-control","no-store");let r=pd(t);r.on("error",i=>{e.statusCode=500,e.end(`Failed to read ${t}: ${i.message}`)}),r.pipe(e)}var ga=`Inkly runtime artifact not found. Run:
4994
+ `),h||process.stdout.write("\nNote: could not pin the runtime yet (inkly.lock not written). `inkly dev` will resolve it on first run; run `inkly lock` to pin it.\n")),{dir:l,files:p.map(m=>xa(m.path))}}import{createServer as xd}from"vite";import kd from"chokidar";import{readFile as be,readdir as wd,stat as Fn,mkdtemp as vd,mkdir as Sd,cp as _d,writeFile as Cd,rm as Td}from"fs/promises";import{existsSync as kt,createReadStream as Ad}from"fs";import{tmpdir as Pd}from"os";import{basename as Id,dirname as wt,extname as Ed,join as z,relative as Rd,resolve as Ge,sep as Hn}from"path";import{fileURLToPath as Ra}from"url";import{createRequire as $d}from"module";import{createConnection as Dd,createServer as Nd}from"net";import{readFile as va,stat as gd}from"fs/promises";import{relative as bd}from"path";async function On(e){let t=await Ne(e);if(!t)throw new Error(`No inkly.json found in ${e} or any parent directory. Run \`inkly init <name>\` first or cd into your hub.`);let n=[],r=[],i=[],a=[];for(let s of await Tr(t)){let l;try{l=await va(s.configPath,"utf8")}catch(h){i.push({slug:s.slug,configPath:s.configPath,message:`failed to read demo.config.json (${h.message})`});continue}let d;try{d=JSON.parse(l)}catch(h){i.push({slug:s.slug,configPath:s.configPath,message:`demo.config.json is not valid JSON (${h.message})`});continue}let u;try{u=Mt(d)}catch(h){i.push({slug:s.slug,configPath:s.configPath,message:`demo.config.json failed schema validation: ${h.message}`});continue}u.changed&&(await Sa(s.configPath,u.config),n.push({slug:s.slug,configPath:s.configPath,reason:"heal"}));let p=(await gd(s.configPath)).mtimeMs;a.push({slug:s.slug,configPath:s.configPath,id:u.config.id,mtimeMs:p})}let o=aa(a.map(s=>({...s,updatedAt:s.mtimeMs})));for(let{entry:s,newId:l}of o){let d=await va(s.configPath,"utf8"),u=JSON.parse(d);u.id=l,await Sa(s.configPath,u),r.push({slug:s.slug,configPath:s.configPath,reason:"remint"})}return{hubRoot:t,healed:n,reminted:r,skipped:i}}function sn(e,t){return bd(e,t).split(/[\\/]/).join("/")}async function Sa(e,t){await ee(e,JSON.stringify(t,null,2)+`
4995
+ `)}import{join as yd}from"path";function Nr(e,t){return t.file?yd(e,"public",t.file):null}async function _a(e,t){let n=Nr(e,t);return n?Z(n):!1}function jn(e){return typeof e?.publicUrl=="string"&&typeof e?.cdnPath=="string"}function Mr(e,t){return e.publicUrl&&/^(https?:)?\/\//i.test(e.publicUrl)?e.publicUrl:e.file?`/${t}/${e.file}`:e.publicUrl??null}var Md=Ra(import.meta.url),Ht=wt(Md),Or="127.0.0.1";function Ca(e){let t=Ge(Ht,"template",e);return kt(t)?t:Ge(Ht,"..","..","template",e)}function Ld(e){let t=[Ge(Ht,"..","vendor",e),Ge(Ht,"..","..","vendor",e),Ge(Ht,"..","..","..","public","__inkly","vendor",e)];for(let n of t)if(kt(n))return n;return null}function Od(e){try{let r=$d(z(e,"package.json")).resolve("@inkly/runtime/package.json");return Ge(wt(r),"dist")}catch{}let t=Ht;for(let n=0;n<8;n++){let r=z(t,"packages","inkly-runtime","dist");if(kt(r))return r;let i=wt(t);if(i===t)break;t=i}return null}function Ta(e,t){if(!t)return e;let{integrity:n}=t.lock.runtime,r=t.manifest.cssIntegrity,i=e;i=i.replace(/<link rel="stylesheet" href="\/__inkly\/runtime\.css" \/>/,`<link rel="stylesheet" href="/__inkly/runtime.css" integrity="${r}" crossorigin="anonymous" />`);let a=`<link rel="modulepreload" href="/__inkly/runtime.js" integrity="${n}" crossorigin="anonymous" />`;return/<link rel="prefetch" href="\/__inkly\/runtime\.js"[^>]*\/>/.test(i)?i=i.replace(/<link rel="prefetch" href="\/__inkly\/runtime\.js"[^>]*\/>/,a):i=i.replace(/<link rel="stylesheet" href="\/__inkly\/runtime\.css"[^>]*\/>/,o=>`${o}
4996
+ ${a}`),i}function B(e,t,n,r){e.statusCode=t,e.setHeader("content-type",n),e.setHeader("cache-control","no-store"),e.end(r)}function Bn(e,t,n){e.statusCode=200,e.setHeader("content-type",n),e.setHeader("cache-control","no-store");let r=Ad(t);r.on("error",i=>{e.statusCode=500,e.end(`Failed to read ${t}: ${i.message}`)}),r.pipe(e)}var Aa=`Inkly runtime artifact not found. Run:
4980
4997
  npm run build:runtime -w @inkly/runtime
4981
4998
  then restart \`inkly dev\`.
4982
- `;function Sd(e){let t=Je(e);for(;;){if(xt(j(t,"inkly.json")))return t;let n=kt(t);if(n===t)return null;t=n}}function ba(e){if(!e)return null;let t=e.trim();return t?/^(?:[a-z][a-z0-9+.-]*:|\/\/|#)/i.test(t)||t.startsWith("/")?t:t.startsWith("public/")?`/${t.slice(7)}`:`/${t.replace(/^\.\/+/,"")}`:null}function _r(e){return e.brand?{...e,brand:{...e.brand,...e.brand.logo?{logo:ba(e.brand.logo)??e.brand.logo}:{},...e.brand.favicon?{favicon:ba(e.brand.favicon)??e.brand.favicon}:{}}}:e}function wa(e,t){return e.publicUrl&&/^(https?:)?\/\//i.test(e.publicUrl)?e.publicUrl:e.file?`/${t}/${e.file}`:e.publicUrl??null}function _d(e){let t=new Map(e.assets.map(n=>[n.id,n]));return Ki({slug:e.slug,config:e.config,resolveAssetSrc:n=>{if(!n.startsWith("asset:"))return n;let r=t.get(n.slice(6));return r?wa(r,e.slug):null}})}async function Cd(e){let t=j(kt(e),"assets.json");try{let n=await me(t,"utf8"),r=JSON.parse(n);return Array.isArray(r.assets)?r.assets.filter(i=>{if(!i||typeof i!="object")return!1;let a=i;return typeof a.id=="string"&&a.id.length>0}):[]}catch{return[]}}async function Td(e){let t=j(e,"demos");if(!xt(t))return[];let n=[];async function r(i){let a;try{a=await od(i,{withFileTypes:!0})}catch{return}if(a.some(s=>s.isFile()&&s.name==="demo.config.json")){let s=gd(t,i).split(Dn).join("/");n.push({slug:s,configPath:j(i,"demo.config.json")});return}for(let s of a)s.isDirectory()&&await r(j(i,s.name))}return await r(t),n}async function ya(e,t){let n=j(e,"inkly.json"),r;try{r=await me(n,"utf8")}catch(p){throw new Error(`Failed to read inkly.json at ${n}: ${p.message}`)}let i;try{i=JSON.parse(r)}catch(p){throw new Error(`inkly.json is not valid JSON: ${p.message}`)}let a=we.safeParse(i);if(!a.success)throw new Error(`inkly.json failed schema validation:
4983
- ${a.error.message}`);let o=a.data,s=await Td(e);for(let p of s){let h=an(p.slug);if(!h.ok)throw new Error(`Demo folder "${p.slug}" has an invalid slug: ${h.reason}`);if(gt.includes(p.slug))throw new Error(`Demo folder "${p.slug}" uses a reserved slug.`)}let c=[];for(let p of s){let h;try{h=await me(p.configPath,"utf8")}catch(x){t(`Skipping ${p.slug}: failed to read demo.config.json (${x.message})`);continue}let f;try{f=JSON.parse(h)}catch(x){t(`Skipping ${p.slug}: demo.config.json is not valid JSON (${x.message})`);continue}let w;try{w=$t(f).config}catch(x){t(`Skipping ${p.slug}: demo.config.json failed schema validation: ${x.message}`);continue}c.push({slug:p.slug,configPath:p.configPath,config:w,assets:await Cd(p.configPath)})}let d=c.map(p=>_d(p)),u=new Map;for(let p of c)u.set(p.slug,p);return{hub:o,hubPath:n,demos:c,index:d,bySlug:u}}function $n(e,t,n){let r=JSON.stringify(n).replace(/<\/(script)/gi,"<\\/$1"),i=`<script id="${t}" type="application/json">${r}</script>`;return e.includes(`id="${t}"`)?e.replace(new RegExp(`<script id="${t}"[^>]*>[\\s\\S]*?</script>`),i):e.replace("</head>",`${i}
4984
- </head>`)}function Ad(e){let t=e.hub.theme??"inkly",n=pe[t];return{hub:_r(e.hub),demos:e.index,theme:{id:t,tokens:n?.theme??null,css:n?.css??""}}}var Pd={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".txt":"text/plain; charset=utf-8",".md":"text/markdown; charset=utf-8"};function tn(e){return Pd[fd(e).toLowerCase()]??"application/octet-stream"}function an(e){let t=e.split("/").filter(Boolean);if(t.length===0)return{ok:!1,reason:"Name cannot be empty."};for(let n of t){let r=Re(n);if(!r.ok)return r}return gt.includes(e)?{ok:!1,reason:`Demo folder "${e}" uses a reserved slug.`}:{ok:!0}}function xa(e,t){let n;try{n=decodeURIComponent(e)}catch{return null}let r=n.replace(/^\/+/,"").replace(/\/+$/,"");if(!r)return null;let i=r.split("/").filter(Boolean);for(let a=i.length;a>=1;a-=1){let o=i.slice(0,a).join("/");if(!an(o).ok)continue;let s=t.bySlug.get(o);if(s)return{slug:o,demo:s,rel:i.slice(a).join("/")}}return null}async function Id(e){return new Promise(t=>{let n=xd();n.once("error",()=>t(!1)),n.once("listening",()=>{n.close(()=>t(!0))}),n.listen(e,Sr)})}async function Ed(e,t){return new Promise(n=>{let r=!1,i=o=>{r||(r=!0,a.destroy(),n(o))},a=yd({port:e,host:t});a.setTimeout(250),a.once("connect",()=>i(!0)),a.once("timeout",()=>i(!1)),a.once("error",()=>i(!1))})}async function Rd(e){if(!await Id(e))return!1;for(let t of["localhost","127.0.0.1","::1"])if(await Ed(e,t))return!1;return!0}async function $d(e){if(e===0)return 0;if(!Number.isInteger(e)||e<0||e>65535)throw new Error(`invalid port: ${e}`);for(let t=e;t<=65535;t+=1)if(await Rd(t))return t;throw new Error(`No available port found at or above ${e}`)}function Dd(e,t){let n=e.httpServer?.address();return n&&typeof n=="object"?n.port:e.config.server.port??t}async function Nd(e){let t=md(e),n=/^[a-z0-9][a-z0-9-]*$/.test(t)&&!gt.includes(t)?t:"demo",r=await sd(j(hd(),"inkly-dev-"));await ld(j(r,"demos"),{recursive:!0}),await cd(e,j(r,"demos",n),{recursive:!0});let i=n;try{let o=JSON.parse(await me(j(e,"demo.config.json"),"utf8"));typeof o.title=="string"&&o.title.trim()&&(i=o.title.trim())}catch{}let a={$schema:"https://inklyai.dev/inkly.json",name:i,runtime:"0.6.1",theme:"inkly",collections:[{name:"Preview",demos:[n]}]};return await dd(j(r,"inkly.json"),`${JSON.stringify(a,null,2)}
4985
- `),{hubRoot:r,slug:n}}async function va(e){let{cwd:t,port:n=3e3,silent:r,skipRuntimeResolve:i}=e,a=L=>{r||process.stderr.write(`[inkly dev] ${L}
4986
- `)},o=e.path?Je(t,e.path):t,s=Sd(o),c=null;if(!s)if(xt(j(o,"demo.config.json"))){let L=await Nd(o);s=L.hubRoot,c=L.hubRoot,r||process.stdout.write(`[inkly dev] serving standalone demo "${L.slug}" via a temporary hub (no inkly.json required)
4987
- `)}else throw new Error(`No inkly.json found in ${o} or any parent directory. Run \`inkly init <name>\` first, cd into your hub, or point \`inkly dev\` at an exported demo folder (a directory containing demo.config.json).`);let d=await Rn(s);if(!r){for(let L of d.healed)process.stdout.write(`[inkly dev] healed missing id: ${en(d.hubRoot,L.configPath)}
4988
- `);for(let L of d.reminted)process.stdout.write(`[inkly dev] re-minted duplicate id: ${en(d.hubRoot,L.configPath)}
4989
- `)}let u=await ya(s,a),p=j(s,"inkly.lock"),h=xt(p),f=null;if(h&&!i)try{if(f=await kr({hubRoot:s}),!r)if(f.fetched){let L=(f.bytesFetched/1048576).toFixed(2);process.stdout.write(`[inkly dev] fetched runtime ${f.version} from ${f.lock.runtime.url} (${L} MiB)
4990
- `)}else process.stdout.write(`[inkly dev] runtime ${f.version} loaded from cache (${f.cacheDir})
4991
- `)}catch(L){throw L instanceof bt||L instanceof Ot?L:new Error(`Failed to resolve runtime via inkly.lock: ${L.message}`)}else if(!i)try{let{lock:L,source:K}=await Pn(s);if(f=await kr({hubRoot:s,lock:L}),!r){let ge=f.fetched?`fetched ${(f.bytesFetched/1048576).toFixed(2)} MiB`:"from cache";process.stdout.write(`[inkly dev] no inkly.lock \u2014 resolved runtime ${f.version} from ${K==="cdn"?"the CDN":"a local build"} (${ge}). Run \`inkly lock\` to pin this version.
4992
- `)}}catch(L){r||process.stdout.write(`[inkly dev] no inkly.lock and could not resolve a published runtime (${L.message}). Falling back to the in-workspace @inkly/runtime dist. Run \`inkly lock\` once a runtime is published to R2 to pin a version.
4993
- `)}let w=f?.cacheDir??vd(s),x=fa(await me(ma("hub-index.html"),"utf8"),f),_=fa(await me(ma("demo.html"),"utf8"),f),I=await $d(n),$=I,R=async()=>{},b=await id({root:s,server:{port:I,strictPort:!0,host:Sr,hmr:{host:Sr},fs:{allow:[s,ka(new URL("../",import.meta.url))]}},appType:"custom",clearScreen:!1,logLevel:r?"silent":"info",configFile:!1,plugins:[{name:"inkly-dev-endpoints",configureServer(L){let K=(ge,A,le)=>{let N=(ge.url??"").split("?")[0]??"";if(N==="/"||N==="/index.html"){let E=$n(x,"__inkly_hub_data",Ad(u));H(A,200,"text/html; charset=utf-8",E);return}if(N.startsWith("/__inkly/cache/")){let E=decodeURIComponent(N.slice(15));if(!E||E.includes("..")||E.includes("/")){H(A,400,"text/plain; charset=utf-8","Invalid cache path");return}let F=j(s,".inkly","cache",E);nn(F).then(M=>{if(!M.isFile()){H(A,404,"text/plain; charset=utf-8",`Capture not found: ${E}`);return}rn(A,F,tn(F))},()=>H(A,404,"text/plain; charset=utf-8",`Capture not found: ${E}`));return}if(N.startsWith("/__inkly/snapshot/")){let E=decodeURIComponent(N.slice(18)),M=E.indexOf("/snapshots/"),J=M>0?E.slice(0,M):"",ee=M>0?E.slice(M+1):"";if(!an(J).ok||!u.bySlug.has(J)||!ee||ee.includes("..")||ee.startsWith("/")){H(A,400,"text/plain; charset=utf-8","Invalid snapshot path");return}if(!ee.startsWith("snapshots/")){H(A,400,"text/plain; charset=utf-8","Invalid snapshot path");return}let Te=j(s,"demos",...J.split("/")),be=j(Te,ee);if(!be.startsWith(Te+Dn)&&be!==Te){H(A,400,"text/plain; charset=utf-8","Invalid snapshot path");return}nn(be).then(async Jt=>{if(!Jt.isFile()){H(A,404,"text/plain; charset=utf-8",`Snapshot not found: ${ee}`);return}if(!/\.html?$/i.test(ee)){let Uo=await me(be,"utf8");H(A,200,tn(be),ft(Uo));return}let ae=hr(ee),Zt=ae?j(Te,ae):null,[Xn,qt]=await Promise.all([me(be,"utf8"),Zt?me(Zt,"utf8").catch(()=>null):Promise.resolve(null)]),hn=Yi({htmlPath:ee,html:Xn,css:qt,cssHref:ae?`/__inkly/snapshot/${encodeURIComponent(J)}/${ae.split("/").map(encodeURIComponent).join("/")}`:null});H(A,200,tn(be),hn)},()=>H(A,404,"text/plain; charset=utf-8",`Snapshot not found: ${ee}`));return}if(N==="/__inkly/hub"){H(A,200,"application/json; charset=utf-8",JSON.stringify(_r(u.hub)));return}if(N==="/__inkly/demos"){H(A,200,"application/json; charset=utf-8",JSON.stringify(u.index));return}if(N.startsWith("/__inkly/demo/")){let E=decodeURIComponent(N.slice(14)),F=an(E);if(!F.ok){H(A,400,"text/plain; charset=utf-8",F.reason);return}let M=u.bySlug.get(E);if(!M){H(A,404,"text/plain; charset=utf-8",`No such demo: ${E}`);return}let J=j(kt(M.configPath),"assets.json");me(J,"utf8").then(ee=>{let Vt=[];try{let Te=JSON.parse(ee);Array.isArray(Te.assets)&&(Vt=Te.assets)}catch{}H(A,200,"application/json; charset=utf-8",JSON.stringify({demo:M.config,assets:Vt}))},()=>{H(A,200,"application/json; charset=utf-8",JSON.stringify({demo:M.config,assets:[]}))});return}if(N==="/__inkly/runtime.js"){vr(A,w,"runtime.js","text/javascript; charset=utf-8");return}if(N==="/__inkly/runtime.css"){vr(A,w,"runtime.css","text/css; charset=utf-8");return}if(N==="/__inkly/manifest.json"){vr(A,w,"manifest.json","application/json; charset=utf-8");return}if(N.startsWith("/__inkly/vendor/")){let E=decodeURIComponent(N.slice(16));if(!/^(react|react-dom|react-dom-client|react-jsx-runtime)\.mjs$/.test(E)){H(A,404,"text/plain; charset=utf-8",`No such vendor module: ${E}`);return}let F=wd(E);if(!F){H(A,503,"text/plain; charset=utf-8",`Runtime vendor module not found: ${E}`);return}rn(A,F,"text/javascript; charset=utf-8");return}if(N.startsWith("/__inkly/theme/")&&N.endsWith(".css")){let E=decodeURIComponent(N.slice(15,-4)),F=pe[E];if(!F){let M=Object.keys(pe).join(", ");H(A,404,"text/plain; charset=utf-8",`No such theme: "${E}". Known themes: ${M}
4994
- `);return}H(A,200,"text/css; charset=utf-8",F.css??"");return}let O=N.startsWith("/__inkly/")?null:xa(N,u);if(O&&O.rel){let{slug:E,rel:F}=O;if(F.includes("..")||F.startsWith("/")){H(A,400,"text/plain; charset=utf-8","Invalid path");return}let M=j(s,"demos",...E.split("/"),"public"),J=j(M,F);if(!J.startsWith(M+Dn)&&J!==M){H(A,400,"text/plain; charset=utf-8","Invalid path");return}nn(J).then(ee=>{if(!ee.isFile()){le();return}rn(A,J,tn(J))},()=>le());return}if(N.length>1&&!N.startsWith("/__inkly/")&&!N.endsWith("/")){let E=decodeURIComponent(N.slice(1)),F=j(s,"public"),M=j(F,E);if(!E.includes("..")&&(M.startsWith(F+Dn)||M===F)){nn(M).then(J=>{if(J.isFile()){rn(A,M,tn(M));return}vt()},()=>vt());return}}vt();function vt(){if(N.length>1&&!N.startsWith("/__inkly/")){let E=N.replace(/^\/+/,"").replace(/\/+$/,""),F=xa(N,u);if(F&&F.rel===""){let{slug:M,demo:J}=F;if(!an(M).ok){le();return}let Vt={hub:{name:u.hub.name,brand:_r(u.hub).brand??null,tokens:u.hub.tokens??null,theme:u.hub.theme??null,layout:u.hub.layout??null},demoSlug:M,demoTitle:J.config.title??J.config.id},Te=j(kt(J.configPath),"assets.json"),be=Jt=>{let ae=$n(_,"__inkly_hub_meta",Vt);ae=$n(ae,"__inkly_demo_config",J.config),ae=$n(ae,"__inkly_demo_assets",Jt),H(A,200,"text/html; charset=utf-8",ae)};me(Te,"utf8").then(Jt=>{let ae=[];try{let Zt=JSON.parse(Jt);Array.isArray(Zt.assets)&&(ae=Zt.assets.map(Xn=>{let qt=Xn,hn=wa(qt,M);return hn?{...qt,publicUrl:hn}:qt}))}catch{}be(ae)},()=>{be([])});return}if(E&&!E.includes("/")){if(!Re(E).ok){le();return}H(A,404,"text/plain; charset=utf-8",`No such demo: "${E}". Known demos: ${[...u.bySlug.keys()].join(", ")||"(none)"}
4995
- `);return}}le()}};L.middlewares.use(K)}}]});await b.listen(),$=Dd(b,I);let z=`http://127.0.0.1:${$}/`,U=`http://localhost:${$}/`,D=ad.watch([j(s,"inkly.json"),j(s,"demos/**/demo.config.json"),j(s,"demos/**/assets.json")],{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:60,pollInterval:20}}),V=!1,ne=async()=>{if(!V){V=!0;try{u=await ya(s,a);try{b.ws.send({type:"custom",event:"inkly:hub-changed"}),b.ws.send({type:"full-reload"})}catch{}}catch(L){a(`Reload failed: ${L.message}`)}finally{V=!1}}};if(R=ne,D.on("add",ne),D.on("change",ne),D.on("unlink",ne),!r){let L=u.hub.collections?.length??0,K=[...u.bySlug.keys()],ge=10,A=K.length>0?`
4999
+ `;function jd(e){let t=Ge(e);for(;;){if(kt(z(t,"inkly.json")))return t;let n=wt(t);if(n===t)return null;t=n}}function Pa(e){if(!e)return null;let t=e.trim();return t?/^(?:[a-z][a-z0-9+.-]*:|\/\/|#)/i.test(t)||t.startsWith("/")?t:t.startsWith("public/")?`/${t.slice(7)}`:`/${t.replace(/^\.\/+/,"")}`:null}function jr(e){return e.brand?{...e,brand:{...e.brand,...e.brand.logo?{logo:Pa(e.brand.logo)??e.brand.logo}:{},...e.brand.favicon?{favicon:Pa(e.brand.favicon)??e.brand.favicon}:{}}}:e}function Ud(e){let t=new Map(e.assets.map(n=>[n.id,n]));return oa({slug:e.slug,config:e.config,resolveAssetSrc:n=>{if(!n.startsWith("asset:"))return n;let r=t.get(n.slice(6));return r?Mr(r,e.slug):null}})}async function zd(e){let t=z(wt(e),"assets.json");try{let n=await be(t,"utf8"),r=JSON.parse(n);return Array.isArray(r.assets)?r.assets.filter(i=>{if(!i||typeof i!="object")return!1;let a=i;return typeof a.id=="string"&&a.id.length>0}):[]}catch{return[]}}async function Fd(e){let t=z(e,"demos");if(!kt(t))return[];let n=[];async function r(i){let a;try{a=await wd(i,{withFileTypes:!0})}catch{return}if(a.some(s=>s.isFile()&&s.name==="demo.config.json")){let s=Rd(t,i).split(Hn).join("/");n.push({slug:s,configPath:z(i,"demo.config.json")});return}for(let s of a)s.isDirectory()&&await r(z(i,s.name))}return await r(t),n}async function Ia(e,t){let n=z(e,"inkly.json"),r;try{r=await be(n,"utf8")}catch(p){throw new Error(`Failed to read inkly.json at ${n}: ${p.message}`)}let i;try{i=JSON.parse(r)}catch(p){throw new Error(`inkly.json is not valid JSON: ${p.message}`)}let a=_e.safeParse(i);if(!a.success)throw new Error(`inkly.json failed schema validation:
5000
+ ${a.error.message}`);let o=a.data,s=await Fd(e);for(let p of s){let h=ln(p.slug);if(!h.ok)throw new Error(`Demo folder "${p.slug}" has an invalid slug: ${h.reason}`);if(bt.includes(p.slug))throw new Error(`Demo folder "${p.slug}" uses a reserved slug.`)}let l=[];for(let p of s){let h;try{h=await be(p.configPath,"utf8")}catch(y){t(`Skipping ${p.slug}: failed to read demo.config.json (${y.message})`);continue}let m;try{m=JSON.parse(h)}catch(y){t(`Skipping ${p.slug}: demo.config.json is not valid JSON (${y.message})`);continue}let x;try{x=Mt(m).config}catch(y){t(`Skipping ${p.slug}: demo.config.json failed schema validation: ${y.message}`);continue}l.push({slug:p.slug,configPath:p.configPath,config:x,assets:await zd(p.configPath)})}let d=l.map(p=>Ud(p)),u=new Map;for(let p of l)u.set(p.slug,p);return{hub:o,hubPath:n,demos:l,index:d,bySlug:u}}function Un(e,t,n){let r=JSON.stringify(n).replace(/<\/(script)/gi,"<\\/$1"),i=`<script id="${t}" type="application/json">${r}</script>`;return e.includes(`id="${t}"`)?e.replace(new RegExp(`<script id="${t}"[^>]*>[\\s\\S]*?</script>`),i):e.replace("</head>",`${i}
5001
+ </head>`)}function Hd(e){let t=e.hub.theme??"inkly",n=fe[t];return{hub:jr(e.hub),demos:e.index,theme:{id:t,tokens:n?.theme??null,css:n?.css??""}}}var Bd={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".txt":"text/plain; charset=utf-8",".md":"text/markdown; charset=utf-8"};function zn(e){return Bd[Ed(e).toLowerCase()]??"application/octet-stream"}function ln(e){let t=e.split("/").filter(Boolean);if(t.length===0)return{ok:!1,reason:"Name cannot be empty."};for(let n of t){let r=$e(n);if(!r.ok)return r}return bt.includes(e)?{ok:!1,reason:`Demo folder "${e}" uses a reserved slug.`}:{ok:!0}}function Ea(e,t){let n;try{n=decodeURIComponent(e)}catch{return null}let r=n.replace(/^\/+/,"").replace(/\/+$/,"");if(!r)return null;let i=r.split("/").filter(Boolean);for(let a=i.length;a>=1;a-=1){let o=i.slice(0,a).join("/");if(!ln(o).ok)continue;let s=t.bySlug.get(o);if(s)return{slug:o,demo:s,rel:i.slice(a).join("/")}}return null}async function Wd(e){return new Promise(t=>{let n=Nd();n.once("error",()=>t(!1)),n.once("listening",()=>{n.close(()=>t(!0))}),n.listen(e,Or)})}async function Vd(e,t){return new Promise(n=>{let r=!1,i=o=>{r||(r=!0,a.destroy(),n(o))},a=Dd({port:e,host:t});a.setTimeout(250),a.once("connect",()=>i(!0)),a.once("timeout",()=>i(!1)),a.once("error",()=>i(!1))})}async function Jd(e){if(!await Wd(e))return!1;for(let t of["localhost","127.0.0.1","::1"])if(await Vd(e,t))return!1;return!0}async function qd(e){if(e===0)return 0;if(!Number.isInteger(e)||e<0||e>65535)throw new Error(`invalid port: ${e}`);for(let t=e;t<=65535;t+=1)if(await Jd(t))return t;throw new Error(`No available port found at or above ${e}`)}function Zd(e,t){let n=e.httpServer?.address();return n&&typeof n=="object"?n.port:e.config.server.port??t}async function Gd(e){let t=Id(e),n=/^[a-z0-9][a-z0-9-]*$/.test(t)&&!bt.includes(t)?t:"demo",r=await vd(z(Pd(),"inkly-dev-"));await Sd(z(r,"demos"),{recursive:!0}),await _d(e,z(r,"demos",n),{recursive:!0});let i=n;try{let o=JSON.parse(await be(z(e,"demo.config.json"),"utf8"));typeof o.title=="string"&&o.title.trim()&&(i=o.title.trim())}catch{}let a={$schema:"https://inklyai.dev/inkly.json",name:i,runtime:"0.6.2",theme:"inkly",collections:[{name:"Preview",demos:[n]}]};return await Cd(z(r,"inkly.json"),`${JSON.stringify(a,null,2)}
5002
+ `),{hubRoot:r,slug:n}}async function $a(e){let{cwd:t,port:n=3e3,silent:r,skipRuntimeResolve:i}=e,a=M=>{r||process.stderr.write(`[inkly dev] ${M}
5003
+ `)},o=e.path?Ge(t,e.path):t,s=jd(o),l=null;if(!s)if(kt(z(o,"demo.config.json"))){let M=await Gd(o);s=M.hubRoot,l=M.hubRoot,r||process.stdout.write(`[inkly dev] serving standalone demo "${M.slug}" via a temporary hub (no inkly.json required)
5004
+ `)}else throw new Error(`No inkly.json found in ${o} or any parent directory. Run \`inkly init <name>\` first, cd into your hub, or point \`inkly dev\` at an exported demo folder (a directory containing demo.config.json).`);let d=await On(s);if(!r){for(let M of d.healed)process.stdout.write(`[inkly dev] healed missing id: ${sn(d.hubRoot,M.configPath)}
5005
+ `);for(let M of d.reminted)process.stdout.write(`[inkly dev] re-minted duplicate id: ${sn(d.hubRoot,M.configPath)}
5006
+ `)}let u=await Ia(s,a),p=z(s,"inkly.lock"),h=kt(p),m=null;if(h&&!i)try{if(m=await $r({hubRoot:s}),!r)if(m.fetched){let M=(m.bytesFetched/1048576).toFixed(2);process.stdout.write(`[inkly dev] fetched runtime ${m.version} from ${m.lock.runtime.url} (${M} MiB)
5007
+ `)}else process.stdout.write(`[inkly dev] runtime ${m.version} loaded from cache (${m.cacheDir})
5008
+ `)}catch(M){throw M instanceof yt||M instanceof zt?M:new Error(`Failed to resolve runtime via inkly.lock: ${M.message}`)}else if(!i)try{let{lock:M,source:X}=await Nn(s);if(m=await $r({hubRoot:s,lock:M}),!r){let xe=m.fetched?`fetched ${(m.bytesFetched/1048576).toFixed(2)} MiB`:"from cache";process.stdout.write(`[inkly dev] no inkly.lock \u2014 resolved runtime ${m.version} from ${X==="cdn"?"the CDN":"a local build"} (${xe}). Run \`inkly lock\` to pin this version.
5009
+ `)}}catch(M){r||process.stdout.write(`[inkly dev] no inkly.lock and could not resolve a published runtime (${M.message}). Falling back to the in-workspace @inkly/runtime dist. Run \`inkly lock\` once a runtime is published to R2 to pin a version.
5010
+ `)}let x=m?.cacheDir??Od(s),y=Ta(await be(Ca("hub-index.html"),"utf8"),m),w=Ta(await be(Ca("demo.html"),"utf8"),m),T=await qd(n),I=T,R=async()=>{},k=await xd({root:s,server:{port:T,strictPort:!0,host:Or,hmr:{host:Or},fs:{allow:[s,Ra(new URL("../",import.meta.url))]}},appType:"custom",clearScreen:!1,logLevel:r?"silent":"info",configFile:!1,plugins:[{name:"inkly-dev-endpoints",configureServer(M){let X=(xe,N,ue)=>{let O=(xe.url??"").split("?")[0]??"";if(O==="/"||O==="/index.html"){let j=Un(y,"__inkly_hub_data",Hd(u));B(N,200,"text/html; charset=utf-8",j);return}if(O.startsWith("/__inkly/snapshot/")){let j=decodeURIComponent(O.slice(18)),U=j.indexOf("/snapshots/"),J=U>0?j.slice(0,U):"",ne=U>0?j.slice(U+1):"";if(!ln(J).ok||!u.bySlug.has(J)||!ne||ne.includes("..")||ne.startsWith("/")){B(N,400,"text/plain; charset=utf-8","Invalid snapshot path");return}if(!ne.startsWith("snapshots/")){B(N,400,"text/plain; charset=utf-8","Invalid snapshot path");return}let Ae=z(s,"demos",...J.split("/")),ke=z(Ae,ne);if(!ke.startsWith(Ae+Hn)&&ke!==Ae){B(N,400,"text/plain; charset=utf-8","Invalid snapshot path");return}Fn(ke).then(async Xt=>{if(!Xt.isFile()){B(N,404,"text/plain; charset=utf-8",`Snapshot not found: ${ne}`);return}if(!/\.html?$/i.test(ne)){let Yo=await be(ke,"utf8");B(N,200,zn(ke),En(gt(Yo),`/${J}/`));return}let le=Cr(ne),Qt=le?z(Ae,le):null,[lr,en]=await Promise.all([be(ke,"utf8"),Qt?be(Qt,"utf8").catch(()=>null):Promise.resolve(null)]),bn=sa({htmlPath:ne,html:lr,css:en,cssHref:le?`/__inkly/snapshot/${encodeURIComponent(J)}/${le.split("/").map(encodeURIComponent).join("/")}`:null,captureAssetBaseUrl:`/${J}/`});B(N,200,zn(ke),bn)},()=>B(N,404,"text/plain; charset=utf-8",`Snapshot not found: ${ne}`));return}if(O==="/__inkly/hub"){B(N,200,"application/json; charset=utf-8",JSON.stringify(jr(u.hub)));return}if(O==="/__inkly/demos"){B(N,200,"application/json; charset=utf-8",JSON.stringify(u.index));return}if(O.startsWith("/__inkly/demo/")){let j=decodeURIComponent(O.slice(14)),V=ln(j);if(!V.ok){B(N,400,"text/plain; charset=utf-8",V.reason);return}let U=u.bySlug.get(j);if(!U){B(N,404,"text/plain; charset=utf-8",`No such demo: ${j}`);return}let J=z(wt(U.configPath),"assets.json");be(J,"utf8").then(ne=>{let Yt=[];try{let Ae=JSON.parse(ne);Array.isArray(Ae.assets)&&(Yt=Ae.assets)}catch{}B(N,200,"application/json; charset=utf-8",JSON.stringify({demo:U.config,assets:Yt}))},()=>{B(N,200,"application/json; charset=utf-8",JSON.stringify({demo:U.config,assets:[]}))});return}if(O==="/__inkly/runtime.js"){Lr(N,x,"runtime.js","text/javascript; charset=utf-8");return}if(O==="/__inkly/runtime.css"){Lr(N,x,"runtime.css","text/css; charset=utf-8");return}if(O==="/__inkly/manifest.json"){Lr(N,x,"manifest.json","application/json; charset=utf-8");return}if(O.startsWith("/__inkly/vendor/")){let j=decodeURIComponent(O.slice(16));if(!/^(react|react-dom|react-dom-client|react-jsx-runtime)\.mjs$/.test(j)){B(N,404,"text/plain; charset=utf-8",`No such vendor module: ${j}`);return}let V=Ld(j);if(!V){B(N,503,"text/plain; charset=utf-8",`Runtime vendor module not found: ${j}`);return}Bn(N,V,"text/javascript; charset=utf-8");return}if(O.startsWith("/__inkly/theme/")&&O.endsWith(".css")){let j=decodeURIComponent(O.slice(15,-4)),V=fe[j];if(!V){let U=Object.keys(fe).join(", ");B(N,404,"text/plain; charset=utf-8",`No such theme: "${j}". Known themes: ${U}
5011
+ `);return}B(N,200,"text/css; charset=utf-8",V.css??"");return}let L=O.startsWith("/__inkly/")?null:Ea(O,u);if(L&&L.rel){let{slug:j,rel:V}=L;if(V.includes("..")||V.startsWith("/")){B(N,400,"text/plain; charset=utf-8","Invalid path");return}let U=z(s,"demos",...j.split("/"),"public"),J=z(U,V);if(!J.startsWith(U+Hn)&&J!==U){B(N,400,"text/plain; charset=utf-8","Invalid path");return}Fn(J).then(ne=>{if(!ne.isFile()){ue();return}Bn(N,J,zn(J))},()=>ue());return}if(O.length>1&&!O.startsWith("/__inkly/")&&!O.endsWith("/")){let j=decodeURIComponent(O.slice(1)),V=z(s,"public"),U=z(V,j);if(!j.includes("..")&&(U.startsWith(V+Hn)||U===V)){Fn(U).then(J=>{if(J.isFile()){Bn(N,U,zn(U));return}Ct()},()=>Ct());return}}Ct();function Ct(){if(O.length>1&&!O.startsWith("/__inkly/")){let j=O.replace(/^\/+/,"").replace(/\/+$/,""),V=Ea(O,u);if(V&&V.rel===""){let{slug:U,demo:J}=V;if(!ln(U).ok){ue();return}let Yt={hub:{name:u.hub.name,brand:jr(u.hub).brand??null,tokens:u.hub.tokens??null,theme:u.hub.theme??null,layout:u.hub.layout??null},demoSlug:U,demoTitle:J.config.title??J.config.id},Ae=z(wt(J.configPath),"assets.json"),ke=Xt=>{let le=Un(w,"__inkly_hub_meta",Yt);le=Un(le,"__inkly_demo_config",J.config),le=Un(le,"__inkly_demo_assets",Xt),B(N,200,"text/html; charset=utf-8",le)};be(Ae,"utf8").then(Xt=>{let le=[];try{let Qt=JSON.parse(Xt);Array.isArray(Qt.assets)&&(le=Qt.assets.map(lr=>{let en=lr,bn=Mr(en,U);return bn?{...en,publicUrl:bn}:en}))}catch{}ke(le)},()=>{ke([])});return}if(j&&!j.includes("/")){if(!$e(j).ok){ue();return}B(N,404,"text/plain; charset=utf-8",`No such demo: "${j}". Known demos: ${[...u.bySlug.keys()].join(", ")||"(none)"}
5012
+ `);return}}ue()}};M.middlewares.use(X)}}]});await k.listen(),I=Zd(k,T);let C=`http://127.0.0.1:${I}/`,D=`http://localhost:${I}/`,A=kd.watch([z(s,"inkly.json"),z(s,"demos/**/demo.config.json"),z(s,"demos/**/assets.json")],{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:60,pollInterval:20}}),W=!1,Y=async()=>{if(!W){W=!0;try{u=await Ia(s,a);try{k.ws.send({type:"custom",event:"inkly:hub-changed"}),k.ws.send({type:"full-reload"})}catch{}}catch(M){a(`Reload failed: ${M.message}`)}finally{W=!1}}};if(R=Y,A.on("add",Y),A.on("change",Y),A.on("unlink",Y),!r){let M=u.hub.collections?.length??0,X=[...u.bySlug.keys()],xe=10,N=X.length>0?`
4996
5013
  demos:
4997
- `+K.slice(0,ge).map(le=>` ${U}${le}`).join(`
4998
- `)+(K.length>ge?`
4999
- \u2026and ${K.length-ge} more`:""):"";process.stdout.write(`
5000
- inkly dev running at ${U}
5014
+ `+X.slice(0,xe).map(ue=>` ${D}${ue}`).join(`
5015
+ `)+(X.length>xe?`
5016
+ \u2026and ${X.length-xe} more`:""):"";process.stdout.write(`
5017
+ inkly dev running at ${D}
5001
5018
  hub: ${u.hub.name}
5002
- demos: ${u.demos.length} in ${L} collection(s)${A}
5019
+ demos: ${u.demos.length} in ${M} collection(s)${N}
5020
+ assets: demos/<slug>/public/<file> served at ${D}<slug>/<file>
5003
5021
  watching ${s}
5004
5022
 
5005
- `)}let Ce=!1;return{url:z,port:$,server:b,hubRoot:s,close:async()=>{Ce||(Ce=!0,await D.close(),await b.close(),c&&await ud(c,{recursive:!0,force:!0}).catch(()=>{}))}}}function vr(e,t,n,r){if(!t){H(e,503,"text/plain; charset=utf-8",ga);return}let i=j(t,n);nn(i).then(()=>rn(e,i,r),()=>H(e,503,"text/plain; charset=utf-8",`${ga}(missing: ${n})`))}import{mkdir as Md,access as _a,readFile as Ld}from"fs/promises";import{dirname as Od,join as Nn,resolve as jd}from"path";function Cr(e){return e.split("-").filter(t=>t.length>0).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function Sa(e,t){return{id:oe(),version:1,title:t??Cr(e),theme:{background:"#ffffff",foreground:"#0a0a0a",primary:"#5b6cff",primaryForeground:"#ffffff",secondary:"#f4f4f5",secondaryForeground:"#18181b",radius:"12px",font:"Inter, system-ui, sans-serif",fontSize:"14px"},chrome:{showHubBreadcrumb:!0},chapters:[{id:"create",title:"Create",stepIds:["s1"]},{id:"preview",title:"Preview",stepIds:["s2"]},{id:"ship",title:"Ship",stepIds:["s3"]}],steps:[{id:"intro",kind:"cover",widgets:[{type:"headline",id:"intro-headline",title:"Your demo in *60 seconds*.",description:"See how to spin up a sharable demo from a single prompt.",image:{src:"https://placehold.co/2800x1600/f8fafc/111827/png?text=Workspace&font=inter",alt:"Workspace preview",naturalWidth:2800,naturalHeight:1600,position:"right",layout:"hero"},cta:{label:"Get started",animation:"shimmer",action:{type:"next"}}}]},{id:"s1",kind:"content",background:{type:"image",src:"https://placehold.co/2800x1600/f8fafc/111827/png?text=Workspace&font=inter",naturalWidth:2800,naturalHeight:1600,alt:"Workspace overview"},annotations:[{id:"s1_pointer",type:"message",variant:"pointer",x:.28,y:.34,text:"Just **describe** the flow you want \u2014 the demo scaffolds the walkthrough in seconds.",anchor:"right",advancesStep:!0}]},{id:"s2",kind:"content",background:{type:"image",src:"https://placehold.co/2800x1600/ecfeff/111827/png?text=Live+Preview&font=inter",naturalWidth:2800,naturalHeight:1600,alt:"Live preview with editable files"},transform:{zoom:1.25,x:.62,y:.42},captions:[{id:"s2_caption",text:"See your changes come to life with our live preview."}],annotations:[{id:"s2_callout",type:"message",variant:"callout",x:.5,y:.5,text:"**Live preview that follows you.** Every edit lands in the preview *instantly* \u2014 tweak copy, swap assets, reorder steps, and watch the demo update **without a rebuild**.",advancesStep:!0}]},{id:"s3",kind:"content",background:{type:"image",src:"https://placehold.co/2800x1600/f0fdf4/111827/png?text=Export+and+Share&font=inter",naturalWidth:2800,naturalHeight:1600,alt:"Export and share demo"},captions:[{id:"s3_caption",text:"When you are ready, export your demo and share it with anyone."}],annotations:[{id:"s3_area",type:"message",variant:"area",x:.55,y:.45,w:.32,h:.22,text:"**Ready to share.** Export your demo as a **single sharable link** that runs anywhere \u2014 drop it in an email, embed it on your landing page, or paste it in Slack. Works in *any* browser, no install needed.",anchor:"top",advancesStep:!0}]}]}}async function zd(e){let t=jd(e);for(;;){let n=Nn(t,"inkly.json");if(await _a(n).then(()=>!0,()=>!1))return t;let i=Od(t);if(i===t)return null;t=i}}async function Ca(e){let{slug:t,cwd:n,collection:r,silent:i}=e,a=await zd(n);if(!a)throw new Error("Not inside a hub. Run `inkly init <name>` first.");let o=Re(t);if(!o.ok)throw new Error(o.reason);let s=Nn(a,"inkly.json"),c=await Ld(s,"utf8"),d;try{d=JSON.parse(c)}catch(b){throw new Error(`Failed to parse inkly.json: ${b.message}`)}let u=we.safeParse(d);if(!u.success)throw new Error(`Invalid inkly.json: ${u.error.issues.map(b=>`${b.path.join(".")||"<root>"}: ${b.message}`).join("; ")}`);let p=u.data,h=Nn(a,"demos",t);if(await _a(h).then(()=>!0,()=>!1))throw new Error(`Demo already exists: demos/${t}. Choose a different slug or remove it first.`);let w,x=p,_=p.collections??[];if(r){let b={...p,collections:_.map(U=>({...U,demos:[...U.demos]}))},z=b.collections.find(U=>U.name===r);z?z.demos.push(t):b.collections.push({name:r,demos:[t]}),x=b,w=r}if(w){let b=we.safeParse(x);if(!b.success)throw new Error(`Internal error: updated inkly.json failed schema validation. ${b.error.message}`)}let I=oe(),$={...Sa(t,Cr(t)),id:I},R=mt.safeParse($);if(!R.success)throw new Error(`Internal error: scaffolded demo failed schema validation. ${R.error.message}`);if(await Md(h,{recursive:!0}),await te(Nn(h,"demo.config.json"),JSON.stringify($,null,2)+`
5006
- `),w&&await te(s,JSON.stringify(x,null,2)+`
5007
- `),!i){let b=`Added ${h}
5008
- `;b+=` id: ${I}
5009
- `,w&&(b+=`Added to collection "${w}" in inkly.json
5010
- `),b+=`Next: inkly dev
5011
- `,process.stdout.write(b)}return{hubRoot:a,demoDir:h,collectionModified:w,id:I}}import{readdir as Ud}from"fs/promises";import{join as Fd}from"path";function Ne(e,t,n,r){e.push({level:t,file:n,message:r})}function Tr(e,t){if(typeof e=="string"){e.startsWith("asset:")&&t.add(e.slice(6));return}if(!(!e||typeof e!="object")){if(Array.isArray(e)){for(let n of e)Tr(n,t);return}for(let n of Object.values(e))Tr(n,t)}}async function Mn(e){let t=[],n=null;try{let o=await Mt(e.cwd);n=o.root,o.inkly.theme&&!pe[o.inkly.theme]&&Ne(t,"error","inkly.json",`Unknown theme "${o.inkly.theme}". Known themes: ${Object.keys(pe).join(", ")}.`);let s=new Set(o.demos.map(d=>d.slug)),c=new Map;for(let d of o.demos){let u=fr(d.slug);u&&Ne(t,"error",`demos/${d.slug}`,u);let p=c.get(d.config.id);p?p.push(d.slug):c.set(d.config.id,[d.slug]),d.config.theme?.preset&&!pe[d.config.theme.preset]&&Ne(t,"error",`demos/${d.slug}/demo.config.json`,`Unknown demo theme preset "${d.config.theme.preset}".`);let h=new Set;Tr(d.config,h);let f=new Set((d.assets?.assets??[]).map(w=>w.id));for(let w of h)f.has(w)||Ne(t,"error",`demos/${d.slug}/demo.config.json`,`References asset:${w}, but demos/${d.slug}/assets.json has no matching asset id.`);for(let w of d.assets?.assets??[])(await Hd(o.root,w.sha256)).length===0&&!Bd(w)&&Ne(t,"warning",`demos/${d.slug}/assets.json`,`Asset "${w.id}" has no local cache file and no CDN URL.`)}for(let[d,u]of c)if(!(u.length<2))for(let p of u)Ne(t,"warning",`demos/${p}/demo.config.json`,`Duplicate demo id "${d}" shared with ${u.filter(h=>h!==p).map(h=>`demos/${h}`).join(", ")}. Run \`inkly doctor\` to re-mint.`);for(let d of o.inkly.collections??[])for(let u of d.demos){let p=fr(u);if(p){Ne(t,"error","inkly.json",`Collection "${d.name}" references invalid slug "${u}": ${p}`);continue}s.has(u)||Ne(t,"warning","inkly.json",`Collection "${d.name}" references missing demo "${u}".`)}}catch(o){Ne(t,"error","hub",o.message)}let r=t.filter(o=>o.level==="error").length,i=t.filter(o=>o.level==="warning").length,a={ok:r===0&&(!e.strict||i===0),hubRoot:n,errors:r,warnings:i,issues:t};if(!e.silent)if(e.json)process.stdout.write(JSON.stringify(a,null,2)+`
5023
+ `)}let de=!1;return{url:C,port:I,server:k,hubRoot:s,close:async()=>{de||(de=!0,await A.close(),await k.close(),l&&await Td(l,{recursive:!0,force:!0}).catch(()=>{}))}}}function Lr(e,t,n,r){if(!t){B(e,503,"text/plain; charset=utf-8",Aa);return}let i=z(t,n);Fn(i).then(()=>Bn(e,i,r),()=>B(e,503,"text/plain; charset=utf-8",`${Aa}(missing: ${n})`))}import{mkdir as Kd,access as Na,cp as Yd,readFile as Ma}from"fs/promises";import{basename as Xd,dirname as Qd,join as Bt,resolve as La}from"path";function Ur(e){return e.split("-").filter(t=>t.length>0).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function Da(e,t){return{id:ae(),version:1,title:t??Ur(e),theme:{background:"#ffffff",foreground:"#0a0a0a",primary:"#5b6cff",primaryForeground:"#ffffff",secondary:"#f4f4f5",secondaryForeground:"#18181b",radius:"12px",font:"Inter, system-ui, sans-serif",fontSize:"14px"},chrome:{showHubBreadcrumb:!0},chapters:[{id:"create",title:"Create",stepIds:["s1"]},{id:"preview",title:"Preview",stepIds:["s2"]},{id:"ship",title:"Ship",stepIds:["s3"]}],steps:[{id:"intro",kind:"cover",widgets:[{type:"headline",id:"intro-headline",title:"Your demo in *60 seconds*.",description:"See how to spin up a sharable demo from a single prompt.",image:{src:"https://placehold.co/2800x1600/f8fafc/111827/png?text=Workspace&font=inter",alt:"Workspace preview",naturalWidth:2800,naturalHeight:1600,position:"right",layout:"hero"},cta:{label:"Get started",animation:"shimmer",action:{type:"next"}}}]},{id:"s1",kind:"content",background:{type:"image",src:"https://placehold.co/2800x1600/f8fafc/111827/png?text=Workspace&font=inter",naturalWidth:2800,naturalHeight:1600,alt:"Workspace overview"},annotations:[{id:"s1_pointer",type:"message",variant:"pointer",x:.28,y:.34,text:"Just **describe** the flow you want \u2014 the demo scaffolds the walkthrough in seconds.",anchor:"right",advancesStep:!0}]},{id:"s2",kind:"content",background:{type:"image",src:"https://placehold.co/2800x1600/ecfeff/111827/png?text=Live+Preview&font=inter",naturalWidth:2800,naturalHeight:1600,alt:"Live preview with editable files"},transform:{zoom:1.25,x:.62,y:.42},captions:[{id:"s2_caption",text:"See your changes come to life with our live preview."}],annotations:[{id:"s2_callout",type:"message",variant:"callout",x:.5,y:.5,text:"**Live preview that follows you.** Every edit lands in the preview *instantly* \u2014 tweak copy, swap assets, reorder steps, and watch the demo update **without a rebuild**.",advancesStep:!0}]},{id:"s3",kind:"content",background:{type:"image",src:"https://placehold.co/2800x1600/f0fdf4/111827/png?text=Export+and+Share&font=inter",naturalWidth:2800,naturalHeight:1600,alt:"Export and share demo"},captions:[{id:"s3_caption",text:"When you are ready, export your demo and share it with anyone."}],annotations:[{id:"s3_area",type:"message",variant:"area",x:.55,y:.45,w:.32,h:.22,text:"**Ready to share.** Export your demo as a **single sharable link** that runs anywhere \u2014 drop it in an email, embed it on your landing page, or paste it in Slack. Works in *any* browser, no install needed.",anchor:"top",advancesStep:!0}]}]}}async function eu(e){let t=La(e);for(;;){let n=Bt(t,"inkly.json");if(await Na(n).then(()=>!0,()=>!1))return t;let i=Qd(t);if(i===t)return null;t=i}}async function Oa(e){let{slug:t,cwd:n,collection:r,from:i,silent:a}=e,o=await eu(n);if(!o)throw new Error("Not inside a hub. Run `inkly init <name>` first.");let s=$e(t);if(!s.ok)throw new Error(s.reason);let l=Bt(o,"inkly.json"),d=await Ma(l,"utf8"),u;try{u=JSON.parse(d)}catch(C){throw new Error(`Failed to parse inkly.json: ${C.message}`)}let p=_e.safeParse(u);if(!p.success)throw new Error(`Invalid inkly.json: ${p.error.issues.map(C=>`${C.path.join(".")||"<root>"}: ${C.message}`).join("; ")}`);let h=p.data,m=Bt(o,"demos",t);if(await Na(m).then(()=>!0,()=>!1))throw new Error(`Demo already exists: demos/${t}. Choose a different slug or remove it first.`);let y,w=h,T=h.collections??[],I=r,R=!1;if(!I&&i&&T.length===1&&(I=T[0].name,R=!0),I){let C={...h,collections:T.map(A=>({...A,demos:[...A.demos]}))},D=C.collections.find(A=>A.name===I);D?D.demos.push(t):C.collections.push({name:I,demos:[t]}),w=C,y=I}if(y){let C=_e.safeParse(w);if(!C.success)throw new Error(`Internal error: updated inkly.json failed schema validation. ${C.error.message}`)}let k;if(i)k=await tu(La(n,i),m);else{k=ae();let C={...Da(t,Ur(t)),id:k},D=We.safeParse(C);if(!D.success)throw new Error(`Internal error: scaffolded demo failed schema validation. ${D.error.message}`);await Kd(m,{recursive:!0}),await ee(Bt(m,"demo.config.json"),JSON.stringify(C,null,2)+`
5024
+ `)}if(y&&await ee(l,JSON.stringify(w,null,2)+`
5025
+ `),!a){let C=`${i?"Imported":"Added"} ${m}
5026
+ `;C+=` id: ${k}
5027
+ `,y&&(C+=R?`Added to collection "${y}" in inkly.json (the hub's only collection \u2014 pass --collection to choose another, or remove it there to keep this demo off the index)
5028
+ `:`Added to collection "${y}" in inkly.json
5029
+ `),C+=`Next: inkly dev
5030
+ `,process.stdout.write(C)}return{hubRoot:o,demoDir:m,collectionModified:y,id:k}}async function tu(e,t){let n=Bt(e,"demo.config.json"),r;try{r=await Ma(n,"utf8")}catch{throw new Error(`No demo.config.json found in ${e} \u2014 that is not an Inkly demo folder.`)}let i;try{i=JSON.parse(r)}catch(u){throw new Error(`Failed to parse ${n}: ${u.message}`)}let a=i&&typeof i=="object"?i:{},o=typeof a.id=="string"?a.id:"",s=i,l=!1;_n(o)||(o=ae(),s={...a,id:o},l=!0);let d=We.safeParse(s);if(!d.success)throw new Error(`${n} is not a valid demo: ${d.error.issues.map(u=>`${u.path.join(".")||"<root>"}: ${u.message}`).join("; ")}`);return await Yd(e,t,{recursive:!0,filter:u=>{let p=Xd(u);return p!=="node_modules"&&p!==".inkly"&&p!==".git"}}),l&&await ee(Bt(t,"demo.config.json"),JSON.stringify(s,null,2)+`
5031
+ `),o}function Me(e,t,n,r){e.push({level:t,file:n,message:r})}function zr(e,t){if(typeof e=="string"){e.startsWith("asset:")&&t.add(e.slice(6));return}if(!(!e||typeof e!="object")){if(Array.isArray(e)){for(let n of e)zr(n,t);return}for(let n of Object.values(e))zr(n,t)}}async function Wn(e){let t=[],n=null;try{let o=await jt(e.cwd);n=o.root,o.inkly.theme&&!fe[o.inkly.theme]&&Me(t,"error","inkly.json",`Unknown theme "${o.inkly.theme}". Known themes: ${Object.keys(fe).join(", ")}.`);let s=new Set(o.demos.map(d=>d.slug)),l=new Map;for(let d of o.demos){let u=Ar(d.slug);u&&Me(t,"error",`demos/${d.slug}`,u);let p=l.get(d.config.id);p?p.push(d.slug):l.set(d.config.id,[d.slug]),d.config.theme?.preset&&!fe[d.config.theme.preset]&&Me(t,"error",`demos/${d.slug}/demo.config.json`,`Unknown demo theme preset "${d.config.theme.preset}".`);let h=new Set;zr(d.config,h);let m=new Set((d.assets?.assets??[]).map(x=>x.id));for(let x of h)m.has(x)||Me(t,"error",`demos/${d.slug}/demo.config.json`,`References asset:${x}, but demos/${d.slug}/assets.json has no matching asset id.`);for(let x of d.assets?.assets??[])await _a(d.dir,x)||jn(x)||Me(t,"warning",`demos/${d.slug}/assets.json`,`Asset "${x.id}" has no local file and no CDN URL.`)}for(let[d,u]of l)if(!(u.length<2))for(let p of u)Me(t,"warning",`demos/${p}/demo.config.json`,`Duplicate demo id "${d}" shared with ${u.filter(h=>h!==p).map(h=>`demos/${h}`).join(", ")}. Run \`inkly doctor\` to re-mint.`);for(let d of o.inkly.collections??[])for(let u of d.demos){let p=Ar(u);if(p){Me(t,"error","inkly.json",`Collection "${d.name}" references invalid slug "${u}": ${p}`);continue}s.has(u)||Me(t,"warning","inkly.json",`Collection "${d.name}" references missing demo "${u}".`)}}catch(o){Me(t,"error","hub",o.message)}let r=t.filter(o=>o.level==="error").length,i=t.filter(o=>o.level==="warning").length,a={ok:r===0&&(!e.strict||i===0),hubRoot:n,errors:r,warnings:i,issues:t};if(!e.silent)if(e.json)process.stdout.write(JSON.stringify(a,null,2)+`
5012
5032
  `);else if(a.ok)process.stdout.write(`inkly validate passed (${r} errors, ${i} warnings)
5013
5033
  `);else{for(let o of t)process.stdout.write(`${o.level.toUpperCase()} ${o.file}: ${o.message}
5014
5034
  `);process.stdout.write(`inkly validate failed (${r} errors, ${i} warnings)
5015
- `)}return a}async function Hd(e,t){let n=Fd(e,".inkly","cache");if(!await Z(n))return[];try{return(await Ud(n)).filter(i=>i.startsWith(`${t}.`))}catch{return[]}}function Bd(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.publicUrl=="string"||typeof t.cdnPath=="string"}import{readFile as Wd}from"fs/promises";import{existsSync as Vd}from"fs";import{dirname as Ar,join as Ta}from"path";import{fileURLToPath as Jd}from"url";async function Pr(){let e=Ar(Jd(import.meta.url));for(let t=0;t<5;t+=1){let n=Ta(e,"package.json");try{let i=JSON.parse(await Wd(n,"utf8"));if(typeof i.version=="string"){let a=Vd(Ta(Ar(n),"src"));return{version:i.version,packagePath:n,isLocalBuild:a}}}catch{}let r=Ar(e);if(r===e)break;e=r}return{version:"0.0.0-unknown",packagePath:null,isLocalBuild:!1}}async function Ir(e={}){let t=await Pr();if(!e.silent){let n=t.isLocalBuild?" (local build)":"";process.stdout.write(`${t.version}${n}
5016
- `)}return t}import{spawn as Zd}from"child_process";async function Aa(e={}){let t=e.packageName??"@inkly-org/cli@latest",n=process.env.npm_execpath?[process.execPath,process.env.npm_execpath,"install","-g",t]:["npm","install","-g",t];if(e.dryRun){e.silent||process.stdout.write(`${n.join(" ")}
5017
- `);return}await new Promise((r,i)=>{let a=Zd(n[0],n.slice(1),{stdio:"inherit"});a.on("error",i),a.on("exit",o=>{o===0?r():i(new Error(`Update failed with exit code ${o??"unknown"}`))})})}import{join as Ea}from"path";import{readFile as qd,rm as Gd}from"fs/promises";import{join as Kd}from"path";import{homedir as Yd}from"os";var Er="https://app.inklyai.dev",Pa="http://localhost:3000",Me=Kd(Yd(),".inkly","config.json");async function Ze(){try{let e=await qd(Me,"utf8"),t=JSON.parse(e);return{apiBase:typeof t.apiBase=="string"?t.apiBase:void 0,token:typeof t.token=="string"?t.token:void 0}}catch{return{}}}async function Rr(e){await te(Me,JSON.stringify(e,null,2)+`
5018
- `,{mode:384})}async function Ia(){await Gd(Me,{force:!0})}function qe(e){return(e||Er).replace(/\/+$/,"")}async function Ra(e){let t=[],n=await Pr();t.push({name:"cli-version",ok:n.version!=="0.0.0-unknown",message:n.version});let r=Number.parseInt(process.versions.node.split(".")[0]??"0",10);t.push({name:"node",ok:r>=20,message:process.version});let i=await De(e.cwd);t.push({name:"hub-root",ok:!!i,message:i??"No inkly.json found."});let a=await Ze();t.push({name:"login",ok:!!a.token,message:a.token?`Configured for ${a.apiBase??"(default API)"}`:"Not logged in."});let o=[],s=null;if(i){let d=await Rn(i);s={healed:d.healed.length,reminted:d.reminted.length,paths:[...d.healed,...d.reminted].map(f=>en(d.hubRoot,f.configPath))},t.push({name:"demo-ids",ok:!0,message:s.healed===0&&s.reminted===0?"all demos have a valid unique id":`healed ${s.healed}, re-minted ${s.reminted}`});let u=await Mn({cwd:i,silent:!0});o=u.issues,t.push({name:"schema",ok:u.ok,message:`${u.errors} errors, ${u.warnings} warnings`});let p=await Z(Ea(i,".inkly","cache"));t.push({name:"local-cache",ok:!0,message:p?".inkly/cache exists":".inkly/cache not present yet"});let h=await An(Ea(i,"node_modules","@inkly","runtime","dist","runtime.js"));h!==null&&t.push({name:"runtime-artifact",ok:!0,message:`${h} bytes`})}let c={ok:t.every(d=>d.ok||d.name==="login"),checks:t,validationIssues:o,demoIds:s};if(!e.silent)if(e.json)process.stdout.write(JSON.stringify(c,null,2)+`
5035
+ `)}return a}import{readFile as nu}from"fs/promises";import{existsSync as ru}from"fs";import{dirname as Fr,join as ja}from"path";import{fileURLToPath as iu}from"url";async function Hr(){let e=Fr(iu(import.meta.url));for(let t=0;t<5;t+=1){let n=ja(e,"package.json");try{let i=JSON.parse(await nu(n,"utf8"));if(typeof i.version=="string"){let a=ru(ja(Fr(n),"src"));return{version:i.version,packagePath:n,isLocalBuild:a}}}catch{}let r=Fr(e);if(r===e)break;e=r}return{version:"0.0.0-unknown",packagePath:null,isLocalBuild:!1}}async function Br(e={}){let t=await Hr();if(!e.silent){let n=t.isLocalBuild?" (local build)":"";process.stdout.write(`${t.version}${n}
5036
+ `)}return t}import{spawn as au}from"child_process";async function Ua(e={}){let t=e.packageName??"@inkly-org/cli@latest",n=process.env.npm_execpath?[process.execPath,process.env.npm_execpath,"install","-g",t]:["npm","install","-g",t];if(e.dryRun){e.silent||process.stdout.write(`${n.join(" ")}
5037
+ `);return}await new Promise((r,i)=>{let a=au(n[0],n.slice(1),{stdio:"inherit"});a.on("error",i),a.on("exit",o=>{o===0?r():i(new Error(`Update failed with exit code ${o??"unknown"}`))})})}import{join as du}from"path";import{readFile as ou,rm as su}from"fs/promises";import{join as lu}from"path";import{homedir as cu}from"os";var Wr="https://app.inklyai.dev",za="http://localhost:3000",Le=lu(cu(),".inkly","config.json");async function Ke(){try{let e=await ou(Le,"utf8"),t=JSON.parse(e);return{apiBase:typeof t.apiBase=="string"?t.apiBase:void 0,token:typeof t.token=="string"?t.token:void 0}}catch{return{}}}async function Vr(e){await ee(Le,JSON.stringify(e,null,2)+`
5038
+ `,{mode:384})}async function Fa(){await su(Le,{force:!0})}function Ye(e){return(e||Wr).replace(/\/+$/,"")}async function Ha(e){let t=[],n=await Hr();t.push({name:"cli-version",ok:n.version!=="0.0.0-unknown",message:n.version});let r=Number.parseInt(process.versions.node.split(".")[0]??"0",10);t.push({name:"node",ok:r>=20,message:process.version});let i=await Ne(e.cwd);t.push({name:"hub-root",ok:!!i,message:i??"No inkly.json found."});let a=await Ke();t.push({name:"login",ok:!!a.token,message:a.token?`Configured for ${a.apiBase??"(default API)"}`:"Not logged in."});let o=[],s=null;if(i){let d=await On(i);s={healed:d.healed.length,reminted:d.reminted.length,paths:[...d.healed,...d.reminted].map(h=>sn(d.hubRoot,h.configPath))},t.push({name:"demo-ids",ok:!0,message:s.healed===0&&s.reminted===0?"all demos have a valid unique id":`healed ${s.healed}, re-minted ${s.reminted}`});let u=await Wn({cwd:i,silent:!0});o=u.issues,t.push({name:"schema",ok:u.ok,message:`${u.errors} errors, ${u.warnings} warnings`});let p=await Dn(du(i,"node_modules","@inkly","runtime","dist","runtime.js"));p!==null&&t.push({name:"runtime-artifact",ok:!0,message:`${p} bytes`})}let l={ok:t.every(d=>d.ok||d.name==="login"),checks:t,validationIssues:o,demoIds:s};if(!e.silent)if(e.json)process.stdout.write(JSON.stringify(l,null,2)+`
5019
5039
  `);else{for(let d of t)process.stdout.write(`${d.ok?"OK":"WARN"} ${d.name}: ${d.message}
5020
5040
  `);if(s&&s.paths.length>0)for(let d of s.paths)process.stdout.write(` fixed id in ${d}
5021
5041
  `);if(o.length>0)for(let d of o)process.stdout.write(`${d.level.toUpperCase()} ${d.file}: ${d.message}
5022
- `)}return c}import{randomBytes as uu}from"crypto";import{createServer as pu}from"http";import{spawn as hu}from"child_process";import{randomUUID as Xd}from"crypto";import{mkdir as Qd,readFile as eu,writeFile as tu}from"fs/promises";import{dirname as nu,join as ru}from"path";import{homedir as iu}from"os";import{PostHog as au}from"posthog-node";var $a=process.env.NEXT_PUBLIC_POSTHOG_PROJECT_TOKEN??process.env.POSTHOG_PROJECT_TOKEN??"phc_Dmh4w8YFNosi3YHD4Sv7ShHX7ccS8kmtRcm8XSVmB5jT",ou=process.env.NEXT_PUBLIC_POSTHOG_HOST??process.env.POSTHOG_HOST??"https://us.i.posthog.com",su="@inkly-org/cli@0.5.1",$r=ru(iu(),".inkly","analytics.json"),On=null,Ln=null,Ut=null;function lu(){return!!$a&&process.env.INKLY_TELEMETRY_DISABLED!=="1"}function Da(){return lu()?(On??=new au($a,{host:ou,flushAt:1,flushInterval:0}),On):null}async function Dr(){try{let e=await eu($r,"utf8");return JSON.parse(e)}catch{return{}}}async function Nr(e){await Qd(nu($r),{recursive:!0}),await tu($r,JSON.stringify(e,null,2)+`
5023
- `,{encoding:"utf8",mode:384})}async function Na(){return Ln||(Ln=(async()=>{let e=await Dr();if(typeof e.platformUserId=="string"&&e.platformUserId&&(Ut=e.platformUserId),typeof e.distinctId=="string"&&e.distinctId)return e.distinctId;let t=`cli_${Xd()}`;return await Nr({...e,distinctId:t}),t})(),Ln)}async function cu(){let e=await Na();return Ut??e}async function Mr(e){if(!e||Ut===e){e&&(Ut=e);return}let t=Da();try{let n=await Na(),r=await Dr(),i=r.platformUserId!==e;Ut=e,i&&(await Nr({...r,platformUserId:e}),t?.alias({distinctId:e,alias:n}))}catch{}}async function Ma(){Ut=null;try{let e=await Dr();if(e.platformUserId){let{platformUserId:t,...n}=e;await Nr(n)}}catch{}}function du(){return{surface:"cli",release:process.env.POSTHOG_RELEASE??su,node_version:process.versions.node,platform:process.platform,arch:process.arch,ci:!!process.env.CI}}async function B(e,t={}){let n=Da();if(n)try{n.capture({distinctId:await cu(),event:e,properties:{...du(),...t}})}catch{}}async function Lr(){if(On)try{await On.shutdown(2e3)}catch{}}async function Oa(e){let t=qe(e.local?Pa:Er),n=e.token??process.env.INKLY_API_TOKEN;if(n){let a=await jr(t,n).catch(()=>({valid:!1,userId:null}));return await Rr({apiBase:t,token:n}),await La("token",a),e.silent||process.stdout.write(`Logged in to ${t}${a.valid?"":" (token saved without online verification)"}
5024
- `),{apiBase:t,configPath:Me,verified:a.valid,method:"token"}}let r=await mu({apiBase:t,shouldOpen:e.open!==!1,silent:e.silent});await Rr({apiBase:r.apiBase,token:r.apiToken});let i=await jr(r.apiBase,r.apiToken).catch(()=>({valid:!1,userId:null}));return await La("browser",i),e.silent||process.stdout.write(`Logged in to ${r.apiBase}
5025
- `),{apiBase:r.apiBase,configPath:Me,verified:i.valid,method:"browser"}}async function La(e,t){t.valid&&t.userId&&await Mr(t.userId),await B("inkly_cli_logged_in",{method:e,verified:t.valid})}async function ja(e={}){await B("inkly_cli_logged_out",{}),await Ma(),await Ia(),e.silent||process.stdout.write(`Removed ${Me}
5026
- `)}async function za(e){let t=await Ze(),n=t.apiBase?qe(t.apiBase):null,r=await De(e.cwd),i="skipped",a;if(n&&t.token)try{let s=await jr(n,t.token);i=s.valid?"ok":"failed",i==="failed"&&(a="Token was rejected by the platform."),s.valid&&s.userId&&await Mr(s.userId)}catch(s){i="failed",a=s.message}let o={configPath:Me,apiBase:n,loggedIn:!!t.token,hubRoot:r,online:i,message:a};return e.silent||(e.json?process.stdout.write(JSON.stringify(o,null,2)+`
5027
- `):(process.stdout.write(`Config: ${Me}
5042
+ `)}return l}import{randomBytes as _u}from"crypto";import{createServer as Cu}from"http";import{spawn as Tu}from"child_process";import{randomUUID as uu}from"crypto";import{mkdir as pu,readFile as hu,writeFile as mu}from"fs/promises";import{dirname as fu,join as gu}from"path";import{homedir as bu}from"os";import{PostHog as yu}from"posthog-node";var Ba=process.env.NEXT_PUBLIC_POSTHOG_PROJECT_TOKEN??process.env.POSTHOG_PROJECT_TOKEN??"phc_Dmh4w8YFNosi3YHD4Sv7ShHX7ccS8kmtRcm8XSVmB5jT",xu=process.env.NEXT_PUBLIC_POSTHOG_HOST??process.env.POSTHOG_HOST??"https://us.i.posthog.com",ku="@inkly-org/cli@0.5.1",Jr=gu(bu(),".inkly","analytics.json"),Jn=null,Vn=null,Wt=null;function wu(){return!!Ba&&process.env.INKLY_TELEMETRY_DISABLED!=="1"}function Wa(){return wu()?(Jn??=new yu(Ba,{host:xu,flushAt:1,flushInterval:0}),Jn):null}async function qr(){try{let e=await hu(Jr,"utf8");return JSON.parse(e)}catch{return{}}}async function Zr(e){await pu(fu(Jr),{recursive:!0}),await mu(Jr,JSON.stringify(e,null,2)+`
5043
+ `,{encoding:"utf8",mode:384})}async function Va(){return Vn||(Vn=(async()=>{let e=await qr();if(typeof e.platformUserId=="string"&&e.platformUserId&&(Wt=e.platformUserId),typeof e.distinctId=="string"&&e.distinctId)return e.distinctId;let t=`cli_${uu()}`;return await Zr({...e,distinctId:t}),t})(),Vn)}async function vu(){let e=await Va();return Wt??e}async function Gr(e){if(!e||Wt===e){e&&(Wt=e);return}let t=Wa();try{let n=await Va(),r=await qr(),i=r.platformUserId!==e;Wt=e,i&&(await Zr({...r,platformUserId:e}),t?.alias({distinctId:e,alias:n}))}catch{}}async function Ja(){Wt=null;try{let e=await qr();if(e.platformUserId){let{platformUserId:t,...n}=e;await Zr(n)}}catch{}}function Su(){return{surface:"cli",release:process.env.POSTHOG_RELEASE??ku,node_version:process.versions.node,platform:process.platform,arch:process.arch,ci:!!process.env.CI}}async function H(e,t={}){let n=Wa();if(n)try{n.capture({distinctId:await vu(),event:e,properties:{...Su(),...t}})}catch{}}async function Kr(){if(Jn)try{await Jn.shutdown(2e3)}catch{}}async function Za(e){let t=Ye(e.local?za:Wr),n=e.token??process.env.INKLY_API_TOKEN;if(n){let a=await Yr(t,n).catch(()=>({valid:!1,userId:null}));return await Vr({apiBase:t,token:n}),await qa("token",a),e.silent||process.stdout.write(`Logged in to ${t}${a.valid?"":" (token saved without online verification)"}
5044
+ `),{apiBase:t,configPath:Le,verified:a.valid,method:"token"}}let r=await Au({apiBase:t,shouldOpen:e.open!==!1,silent:e.silent});await Vr({apiBase:r.apiBase,token:r.apiToken});let i=await Yr(r.apiBase,r.apiToken).catch(()=>({valid:!1,userId:null}));return await qa("browser",i),e.silent||process.stdout.write(`Logged in to ${r.apiBase}
5045
+ `),{apiBase:r.apiBase,configPath:Le,verified:i.valid,method:"browser"}}async function qa(e,t){t.valid&&t.userId&&await Gr(t.userId),await H("inkly_cli_logged_in",{method:e,verified:t.valid})}async function Ga(e={}){await H("inkly_cli_logged_out",{}),await Ja(),await Fa(),e.silent||process.stdout.write(`Removed ${Le}
5046
+ `)}async function Ka(e){let t=await Ke(),n=t.apiBase?Ye(t.apiBase):null,r=await Ne(e.cwd),i="skipped",a;if(n&&t.token)try{let s=await Yr(n,t.token);i=s.valid?"ok":"failed",i==="failed"&&(a="Token was rejected by the platform."),s.valid&&s.userId&&await Gr(s.userId)}catch(s){i="failed",a=s.message}let o={configPath:Le,apiBase:n,loggedIn:!!t.token,hubRoot:r,online:i,message:a};return e.silent||(e.json?process.stdout.write(JSON.stringify(o,null,2)+`
5047
+ `):(process.stdout.write(`Config: ${Le}
5028
5048
  `),process.stdout.write(`Hub: ${r??"(not inside a hub)"}
5029
5049
  `),process.stdout.write(`API: ${n??"(not configured)"}
5030
5050
  `),process.stdout.write(`Login: ${o.loggedIn?"configured":"not configured"}
5031
5051
  `),process.stdout.write(`Online: ${i}${a?` (${a})`:""}
5032
- `))),o}async function jr(e,t){let n=await fetch(`${e}/api/captures/verify`,{method:"GET",headers:{authorization:`Bearer ${t}`}});if(!n.ok)return{valid:!1,userId:null};let r=null;try{let i=await n.json();typeof i.userId=="string"&&i.userId&&(r=i.userId)}catch{}return{valid:!0,userId:r}}async function mu(e){let t=uu(16).toString("hex"),n=pu(),r=await fu(n),i=new URL("/cli/login",e.apiBase);i.searchParams.set("callback",r.url),i.searchParams.set("state",t);let a=gu({server:n,state:t,apiBase:e.apiBase,timeoutMs:120*1e3});return e.silent||process.stdout.write(`Opening browser for Inkly login:
5052
+ `))),o}async function Yr(e,t){let n=await fetch(`${e}/api/captures/verify`,{method:"GET",headers:{authorization:`Bearer ${t}`}});if(!n.ok)return{valid:!1,userId:null};let r=null;try{let i=await n.json();typeof i.userId=="string"&&i.userId&&(r=i.userId)}catch{}return{valid:!0,userId:r}}async function Au(e){let t=_u(16).toString("hex"),n=Cu(),r=await Pu(n),i=new URL("/cli/login",e.apiBase);i.searchParams.set("callback",r.url),i.searchParams.set("state",t);let a=Iu({server:n,state:t,apiBase:e.apiBase,timeoutMs:120*1e3});return e.silent||process.stdout.write(`Opening browser for Inkly login:
5033
5053
  ${i.toString()}
5034
- `),e.shouldOpen&&yu(i.toString()),a}async function fu(e){await new Promise((n,r)=>{e.once("error",r),e.listen(0,"127.0.0.1",()=>n())});let t=e.address();if(!t||typeof t=="string")throw new Error("Could not start local login callback server.");return{url:`http://127.0.0.1:${t.port}/callback`}}async function gu(e){return new Promise((t,n)=>{let r=setTimeout(()=>{Or(e.server),n(new Error("Timed out waiting for browser login."))},e.timeoutMs);e.server.on("request",(i,a)=>{(async()=>{try{let o=new URL(i.url??"/","http://127.0.0.1");if(o.pathname!=="/callback"){jn(a,404,"Not found.");return}let s=o.searchParams.get("state"),c=o.searchParams.get("pairingToken");if(!c||s!==e.state){jn(a,400,"Invalid Inkly CLI login callback. You can close this tab.");return}let d=await bu(e.apiBase,c);clearTimeout(r),jn(a,200,"Inkly CLI is connected. You can close this tab."),Or(e.server),t(d)}catch(o){clearTimeout(r),jn(a,500,`Inkly CLI login failed: ${o.message}`),Or(e.server),n(o)}})()})})}async function bu(e,t){let n=await fetch(`${e}/api/cli/exchange`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pairingToken:t})}),r=await n.json().catch(()=>null);if(!n.ok||!r?.apiToken)throw new Error(r?.error??`Login exchange failed: HTTP ${n.status}`);return{apiToken:r.apiToken,apiBase:qe(r.apiBase??e)}}function yu(e){let t=process.platform,i=hu(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{stdio:"ignore",detached:!0});i.on("error",()=>{}),i.unref()}function jn(e,t,n){e.statusCode=t,e.setHeader("content-type","text/html; charset=utf-8"),e.end(`<!doctype html><meta charset="utf-8"><title>Inkly CLI</title><body style="font-family: system-ui, sans-serif; padding: 32px;">${xu(n)}</body>`)}function Or(e){try{e.close()}catch{}}function xu(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}import{readFile as Ha,readdir as Ba,writeFile as ku}from"fs/promises";import{join as on,extname as Wa}from"path";async function Un(e){let t=await Ze(),n=await Mt(e.cwd),r=e.demo?n.demos.filter(p=>p.slug===e.demo):n.demos;if(e.demo&&r.length===0)throw new Error(`No such demo: ${e.demo}`);let i=[],a=[];for(let p of r)for(let h of p.assets?.assets??[]){let f=await Su(n.root,h.sha256),w=_u(h);if(!f&&!w){a.push({demo:p.slug,id:h.id,sha256:h.sha256});continue}if(!f||w)continue;let x=await An(on(n.root,".inkly","cache",f));i.push({demo:p.slug,id:h.id,sha256:h.sha256,cacheFile:f,contentType:h.contentType??zn(f,h.kind),size:h.size??x??0,alreadyRemote:w})}let o={hubRoot:n.root,dryRun:!!e.dryRun,assets:i,unresolved:a,uploaded:0,updatedManifests:[]};if(e.dryRun||i.length===0)return e.silent||Ua(o,e.json),o;if(!t.token)throw new Error("Not logged in. Run `inkly login --token <token>` first.");let s=qe(t.apiBase??process.env.INKLY_API_BASE),c=await zr({apiBase:s,token:t.token,hubRoot:n.root,assets:i}),d=c.uploads,u=new Map(d.map(p=>[p.sha256,p]));for(let p of r){if(!p.assets)continue;let h=!1,f=p.assets.assets.map(x=>{let _=u.get(x.sha256);return _?(h=!0,{...x,contentType:x.contentType??zn(`${x.sha256}${_.ext}`,x.kind),publicUrl:_.publicUrl,cdnPath:_.cdnPath}):x});if(!h)continue;let w={...p.assets,assets:f};await te(p.assetsPath,JSON.stringify(w,null,2)+`
5035
- `),await Cu(p.dir,d),o.updatedManifests.push(`demos/${p.slug}/assets.json`)}return o.uploaded=c.uploaded,e.silent||Ua(o,e.json),o}async function zr(e){let t=await vu(e.apiBase,e.token,e.assets),n=new Map(t.uploads.map(a=>[a.sha256,a])),r=0;for(let a of e.assets){let o=n.get(a.sha256);if(!o)throw new Error(`Platform did not return upload metadata for ${a.sha256}.`);if(o.uploadUrl){let s=await Ha(on(e.hubRoot,".inkly","cache",a.cacheFile)),c=await fetch(o.uploadUrl,{method:"PUT",headers:o.uploadHeaders??{"content-type":a.contentType},body:s});if(!c.ok)throw new Error(`Asset upload failed for ${a.id}: HTTP ${c.status}`);r+=1}}return{uploads:(await wu(e.apiBase,e.token,e.assets,t.uploads)).uploads,uploaded:r}}async function wu(e,t,n,r){let i=new Map(r.map(s=>[s.sha256,s])),a=await fetch(`${e}/api/cli/sync-assets/complete`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify({assets:n.map(s=>{let c=i.get(s.sha256);if(!c)throw new Error(`Platform did not return upload metadata for ${s.sha256}.`);return{sha256:s.sha256,ext:c.ext,contentType:s.contentType,size:s.size,cdnPath:c.cdnPath}})})}),o=await a.json().catch(()=>null);if(!a.ok||!o||!Array.isArray(o.uploads))throw new Error(o?.error??`Sync completion failed: HTTP ${a.status}`);return{uploads:o.uploads}}async function vu(e,t,n){let r=await fetch(`${e}/api/cli/sync-assets`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify({assets:n.map(a=>({sha256:a.sha256,ext:Wa(a.cacheFile)||Ur(a.contentType),contentType:a.contentType,size:a.size}))})}),i=await r.json().catch(()=>null);if(!r.ok||!i||!Array.isArray(i.uploads))throw new Error(i?.error??`Sync endpoint failed: HTTP ${r.status}`);return{uploads:i.uploads}}async function Su(e,t){let n=on(e,".inkly","cache");return await Z(n)?(await Ba(n)).find(i=>i.startsWith(`${t}.`))??null:null}function _u(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.publicUrl=="string"&&typeof t.cdnPath=="string"}function zn(e,t){let n=Wa(e).toLowerCase();return n===".png"?"image/png":n===".jpg"||n===".jpeg"?"image/jpeg":n===".webp"?"image/webp":n===".gif"?"image/gif":n===".svg"?"image/svg+xml":n===".webm"?"video/webm":n===".mp4"?"video/mp4":n===".mp3"?"audio/mpeg":n===".wav"?"audio/wav":t==="font"?"font/woff2":"application/octet-stream"}function Ur(e){let t=e.toLowerCase().split(";")[0]?.trim();return t==="image/png"?".png":t==="image/jpeg"?".jpg":t==="image/webp"?".webp":t==="image/gif"?".gif":t==="image/svg+xml"?".svg":t==="video/webm"?".webm":t==="video/mp4"?".mp4":t==="audio/mpeg"?".mp3":t==="audio/wav"?".wav":t==="font/woff2"?".woff2":".bin"}async function Cu(e,t){let n=on(e,"snapshots");if(!await Z(n))return;let r=t.map(i=>({local:`/__inkly/cache/${`${i.sha256}${i.ext}`}`,remote:i.publicUrl}));await Va(n,r)}async function Va(e,t){for(let n of await Ba(e,{withFileTypes:!0})){let r=on(e,n.name);if(n.isDirectory())await Va(r,t);else if(n.isFile()&&/\.(html|css)$/i.test(n.name)){let i=await Ha(r,"utf8"),a=i;for(let o of t)i=i.split(o.local).join(o.remote);i!==a&&await ku(r,i,"utf8")}}}function Ua(e,t){if(t){process.stdout.write(JSON.stringify(e,null,2)+`
5054
+ `),e.shouldOpen&&Ru(i.toString()),a}async function Pu(e){await new Promise((n,r)=>{e.once("error",r),e.listen(0,"127.0.0.1",()=>n())});let t=e.address();if(!t||typeof t=="string")throw new Error("Could not start local login callback server.");return{url:`http://127.0.0.1:${t.port}/callback`}}async function Iu(e){return new Promise((t,n)=>{let r=setTimeout(()=>{cn(e.server),n(new Error("Timed out waiting for browser login."))},e.timeoutMs);e.server.on("request",(i,a)=>{(async()=>{try{let o=new URL(i.url??"/","http://127.0.0.1");if(o.pathname!=="/callback"){Vt(a,404,"Not found.");return}let s=o.searchParams.get("state"),l=o.searchParams.get("pairingToken"),d=o.searchParams.get("error");if(s!==e.state){Vt(a,400,"Invalid Inkly CLI login callback. You can close this tab.");return}if(d){clearTimeout(r),Vt(a,400,`Inkly CLI login failed: ${d}`),cn(e.server),n(new Error(d));return}if(!l){clearTimeout(r),Vt(a,400,"Invalid Inkly CLI login callback. You can close this tab."),cn(e.server),n(new Error("Invalid Inkly CLI login callback."));return}let u=await Eu(e.apiBase,l);clearTimeout(r),Vt(a,200,"Inkly CLI is connected. You can close this tab."),cn(e.server),t(u)}catch(o){clearTimeout(r),Vt(a,500,`Inkly CLI login failed: ${o.message}`),cn(e.server),n(o)}})()})})}async function Eu(e,t){let n=await fetch(`${e}/api/cli/exchange`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pairingToken:t})}),r=await n.json().catch(()=>null);if(!n.ok||!r?.apiToken)throw new Error(r?.error??`Login exchange failed: HTTP ${n.status}`);return{apiToken:r.apiToken,apiBase:Ye(r.apiBase??e)}}function Ru(e){let t=process.platform,i=Tu(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{stdio:"ignore",detached:!0});i.on("error",()=>{}),i.unref()}function Vt(e,t,n){e.statusCode=t,e.setHeader("content-type","text/html; charset=utf-8"),e.end(`<!doctype html><meta charset="utf-8"><title>Inkly CLI</title><body style="font-family: system-ui, sans-serif; padding: 32px;">${$u(n)}</body>`)}function cn(e){try{e.close()}catch{}}function $u(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}import{readFile as Du}from"fs/promises";import{extname as Qa}from"path";async function Zn(e){let t=await Ke(),n=await jt(e.cwd),r=e.demo?n.demos.filter(h=>h.slug===e.demo):n.demos;if(e.demo&&r.length===0)throw new Error(`No such demo: ${e.demo}`);let i=[],a=[];for(let h of r)for(let m of h.assets?.assets??[]){let x=Nr(h.dir,m),y=x?await Z(x):!1,w=jn(m);if(!y&&!w){a.push({demo:h.slug,id:m.id,sha256:m.sha256});continue}if(!y||w||!m.file||!x)continue;let T=await Dn(x);i.push({demo:h.slug,id:m.id,sha256:m.sha256,file:m.file,localPath:x,contentType:m.contentType??qn(m.file,m.kind),size:m.size??T??0,alreadyRemote:w})}let o=Array.from(new Map(i.map(h=>[h.sha256,h])).values()),s={hubRoot:n.root,dryRun:!!e.dryRun,assets:o,unresolved:a,uploaded:0,updatedManifests:[]};if(e.dryRun||o.length===0)return e.silent||Ya(s,e.json),s;if(!t.token)throw new Error("Not logged in. Run `inkly login --token <token>` first.");let l=Ye(t.apiBase??process.env.INKLY_API_BASE),d=await Xr({apiBase:l,token:t.token,assets:o}),u=d.uploads,p=new Map(u.map(h=>[h.sha256,h]));for(let h of r){if(!h.assets)continue;let m=!1,x=h.assets.assets.map(w=>{let T=p.get(w.sha256);return T?(m=!0,{...w,contentType:w.contentType??qn(`${w.sha256}${T.ext}`,w.kind),publicUrl:T.publicUrl,cdnPath:T.cdnPath}):w});if(!m)continue;let y={...h.assets,assets:x};await ee(h.assetsPath,JSON.stringify(y,null,2)+`
5055
+ `),s.updatedManifests.push(`demos/${h.slug}/assets.json`)}return s.uploaded=d.uploaded,e.silent||Ya(s,e.json),s}async function Xr(e){let t=await Mu(e.apiBase,e.token,e.assets),n=new Map(t.uploads.map(a=>[a.sha256,a])),r=0;for(let a of e.assets){let o=n.get(a.sha256);if(!o)throw new Error(`Platform did not return upload metadata for ${a.sha256}.`);if(o.uploadUrl){let s=await Du(a.localPath),l=await fetch(o.uploadUrl,{method:"PUT",headers:o.uploadHeaders??{"content-type":a.contentType},body:s});if(!l.ok)throw new Error(`Asset upload failed for ${a.id}: HTTP ${l.status}`);r+=1}}return{uploads:(await Nu(e.apiBase,e.token,e.assets,t.uploads)).uploads,uploaded:r}}async function Nu(e,t,n,r){let i=new Map(r.map(s=>[s.sha256,s])),a=await fetch(`${e}/api/cli/sync-assets/complete`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify({assets:n.map(s=>{let l=i.get(s.sha256);if(!l)throw new Error(`Platform did not return upload metadata for ${s.sha256}.`);return{sha256:s.sha256,ext:l.ext,contentType:s.contentType,size:s.size,cdnPath:l.cdnPath}})})}),o=await a.json().catch(()=>null);if(!a.ok||!o||!Array.isArray(o.uploads))throw new Error(o?.error??`Sync completion failed: HTTP ${a.status}`);return{uploads:o.uploads}}async function Mu(e,t,n){let r=await fetch(`${e}/api/cli/sync-assets`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify({assets:n.map(a=>({sha256:a.sha256,ext:Qa(a.file)||Lu(a.contentType),contentType:a.contentType,size:a.size}))})}),i=await r.json().catch(()=>null);if(!r.ok||!i||!Array.isArray(i.uploads))throw new Error(i?.error??`Sync endpoint failed: HTTP ${r.status}`);return{uploads:i.uploads}}function qn(e,t){let n=Qa(e).toLowerCase();return n===".png"?"image/png":n===".jpg"||n===".jpeg"?"image/jpeg":n===".webp"?"image/webp":n===".gif"?"image/gif":n===".svg"?"image/svg+xml":n===".webm"?"video/webm":n===".mp4"?"video/mp4":n===".mp3"?"audio/mpeg":n===".wav"?"audio/wav":t==="font"?"font/woff2":"application/octet-stream"}function Lu(e){let t=e.toLowerCase().split(";")[0]?.trim();return t==="image/png"?".png":t==="image/jpeg"?".jpg":t==="image/webp"?".webp":t==="image/gif"?".gif":t==="image/svg+xml"?".svg":t==="video/webm"?".webm":t==="video/mp4"?".mp4":t==="audio/mpeg"?".mp3":t==="audio/wav"?".wav":t==="font/woff2"?".woff2":".bin"}function Ya(e,t){if(t){process.stdout.write(JSON.stringify(e,null,2)+`
5036
5056
  `);return}if(e.dryRun){process.stdout.write(`inkly sync dry run: ${e.assets.length} asset(s) need upload
5037
- `),Fa(e);return}process.stdout.write(`inkly sync complete: ${e.uploaded} uploaded, ${e.updatedManifests.length} manifest(s) updated
5038
- `),Fa(e)}function Fa(e){if(e.unresolved.length!==0){process.stderr.write(`inkly sync warning: ${e.unresolved.length} asset(s) have no local cache file and are not on the CDN:
5057
+ `),Xa(e);return}process.stdout.write(`inkly sync complete: ${e.uploaded} uploaded, ${e.updatedManifests.length} manifest(s) updated
5058
+ `),Xa(e)}function Xa(e){if(e.unresolved.length!==0){process.stderr.write(`inkly sync warning: ${e.unresolved.length} asset(s) have no local bytes and are not on the CDN:
5039
5059
  `);for(let t of e.unresolved)process.stderr.write(` - demos/${t.demo} "${t.id}" (${t.sha256})
5040
- `)}}import{readdir as Tu,readFile as Au}from"fs/promises";import{extname as Hr,join as Ja,resolve as Za}from"path";function Fr(e,t){e||process.stdout.write(t)}function Pu(e,t){if(t.demo){let n=e.demos.find(r=>r.slug===t.demo);if(!n)throw new Error(`No such demo: ${t.demo}`);return n}if(t.path){let n=Za(t.cwd,t.path),r=e.demos.find(a=>Za(a.dir)===n);if(r)return r;let i=e.demos.find(a=>a.slug===t.path||a.slug===t.path?.replace(/^demos\//,""));if(i)return i;throw new Error(`No demo found at "${t.path}". Available demos: ${e.demos.map(a=>a.slug).join(", ")||"(none)"}`)}if(e.demos.length===1)return e.demos[0];throw new Error(`This hub has ${e.demos.length} demos \u2014 pass a demo path or --demo <slug>. Available: ${e.demos.map(n=>n.slug).join(", ")}`)}async function Iu(e,t=[]){let n=Ja(e,"snapshots");if(!await Z(n))return{};let r={};async function i(a){for(let o of await Tu(a,{withFileTypes:!0})){let s=Ja(a,o.name);if(o.isDirectory())await i(s);else if(o.isFile()&&/\.(html|css)$/i.test(o.name)){let c=s.slice(e.length+1).split(/[\\/]/).join("/");r[c]=Eu(await Au(s,"utf8"),t)}}}return await i(n),r}function Eu(e,t){let n=e;for(let r of t)n=n.split(r.local).join(r.remote);return n}function qa(e){if(!e)return null;try{let t=new URL(e);return Hr(t.pathname)||null}catch{return Hr(e)||null}}function Ru(e,t,n){let r=new Map,i=(o,s)=>{if(!s)return;let c=s.startsWith(".")?s:`.${s}`;r.has(o)||r.set(o,new Set),r.get(o).add(c)};for(let o of t)i(o.sha256,Hr(o.cacheFile));for(let o of n)i(o.sha256,o.ext);for(let o of e.assets)i(o.sha256,qa(o.cdnPath)),i(o.sha256,qa(o.publicUrl)),o.contentType&&i(o.sha256,Ur(o.contentType));let a=[];for(let o of e.assets)if(o.publicUrl)for(let s of r.get(o.sha256)??[])a.push({local:`/__inkly/cache/${o.sha256}${s}`,remote:o.publicUrl});return a}function $u(e,t,n){let r=e??{version:1,assets:[]},i=new Map(n.map(o=>[o.sha256,o])),a=new Map(t.map(o=>[o.sha256,o]));return{...r,assets:r.assets.map(o=>{let s=i.get(o.sha256);if(!s)return o;let c=a.get(o.sha256);return{...o,contentType:o.contentType??c?.contentType??zn(`${o.sha256}${s.ext}`,o.kind),publicUrl:s.publicUrl,cdnPath:s.cdnPath}})}}async function Ga(e){let t=await Ze();if(!t.token)throw new Error("Not logged in. Run `inkly login` first.");let n=qe(t.apiBase??process.env.INKLY_API_BASE),r=await Mt(e.cwd),i=Pu(r,e),a=await Un({cwd:r.root,demo:i.slug,dryRun:!0,silent:!0});if(a.unresolved.length>0)throw new Error(`${a.unresolved.length} asset(s) have no local bytes and are not on the CDN, so a hosted preview cannot be published:
5041
- `+a.unresolved.map(f=>` - ${f.id} (${f.sha256})`).join(`
5042
- `));let o=[];a.assets.length>0&&(Fr(e.silent,`Uploading ${a.assets.length} asset(s) to the CDN for this snapshot...
5043
- `),o=(await zr({apiBase:n,token:t.token,hubRoot:r.root,assets:a.assets})).uploads);let s=$u(i.assets,a.assets,o),c=await Iu(i.dir,Ru(s,a.assets,o)),d=await fetch(`${n}/api/previews`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t.token}`},body:JSON.stringify({demoSlug:i.slug,title:i.config.title??null,config:i.config,assets:s,hub:r.inkly,snapshots:c})}),u=await d.json().catch(()=>null);if(!d.ok||!u?.id)throw new Error(u?.error??`Snapshot publish failed: HTTP ${d.status}`);let p=u.url??`${n}${u.path??`/p/${u.id}`}`,h={hubRoot:r.root,slug:i.slug,id:u.id,url:p};return e.json?Fr(e.silent,JSON.stringify(h,null,2)+`
5044
- `):Fr(e.silent,`Snapshot published:
5045
- ${p}
5046
- `),h}import*as wt from"@sentry/node";var Du="https://b3450c6a8fdcd02b8aee3b9f2c8425eb@o4511498910433280.ingest.us.sentry.io/4511498940252160",Nu="@inkly-org/cli@0.5.1";function Ka(){wt.init({dsn:Du,release:process.env.SENTRY_RELEASE??Nu,environment:process.env.SENTRY_ENVIRONMENT??"production",enabled:process.env.INKLY_SENTRY_DISABLED!=="1",sendDefaultPii:!1,tracesSampleRate:0,beforeSend(e){return e.server_name=void 0,e}})}async function se(e,t){wt.captureException(t,{tags:{command:e,surface:"cli"}}),await wt.flush(2e3)}async function Ya(){await wt.flush(2e3)}import{spawn as uo,execFile as Pp}from"child_process";import{createHash as Ip,randomUUID as Ep}from"crypto";import{mkdir as Ht,mkdtemp as Rp,open as po,readFile as _e,readdir as ho,rm as fe,writeFile as mo}from"fs/promises";import{existsSync as je}from"fs";import{dirname as Zn,isAbsolute as fo,join as W,resolve as Wn,sep as $p}from"path";import{tmpdir as Dp,homedir as ti}from"os";import{fileURLToPath as go}from"url";import{unzipSync as Np,zipSync as Mp}from"fflate";import Lp from"ws";import Op from"sharp";import jp from"subset-font";var Mu=new Set(["area","base","br","col","embed","hr","img","input","link","meta","source","track","wbr"]),Lu=new Set(["a","button","input","select","textarea","label","p","h1","h2","h3","h4","h5","h6","img","li","nav","main","header","footer","section","article","aside","form","table","tr","td","th","ul","ol"]);function Ou(e){let t="";for(let n=0;n<e.length;n+=1)t+=(e[n]??0).toString(16).padStart(2,"0");return t}async function Fn(e,t=16){let n=new Uint8Array(e.byteLength);n.set(e);let r=await crypto.subtle.digest("SHA-256",n);return Ou(new Uint8Array(r)).slice(0,t)}function Zr(e){switch((e.toLowerCase().split(";")[0]??"").trim()){case"image/png":return".png";case"image/jpeg":case"image/jpg":return".jpg";case"image/webp":return".webp";case"image/gif":return".gif";case"image/svg+xml":return".svg";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";case"font/woff2":return".woff2";case"font/woff":return".woff";case"text/css":return".css";case"text/javascript":case"application/javascript":return".js";default:return".bin"}}function Br(e,t){let n=e.trim();if(!n||n.startsWith("data:")||n.startsWith("blob:")||n.startsWith("assets/")||n.startsWith("#"))return null;try{let r=new URL(n,t);return r.protocol!=="http:"&&r.protocol!=="https:"?null:r.href}catch{return null}}function no(e,t,n){if(t){let i=atob(n.replace(/\s+/g,"")),a=new Uint8Array(i.length);for(let o=0;o<i.length;o+=1)a[o]=i.charCodeAt(o);return a}let r=decodeURIComponent(n.replace(/\+/g,"%20"));return new TextEncoder().encode(r)}function ju(e){return/\s/.test(e)||e===")"||e==='"'||e==="<"||e===">"}function ro(e){return e.replace(/\\(?:\r\n|[\n\r\f])/g,"").replace(/\\([0-9a-fA-F]{1,6}\s?|[\s\S])/g,(t,n)=>{let r=n.match(/^([0-9a-fA-F]{1,6})\s?$/);if(r?.[1])try{return String.fromCodePoint(Number.parseInt(r[1],16))}catch{return""}return n})}function zu(e){let t=[],n=0;for(;n<e.length;){let r=e.toLowerCase().indexOf("data:",n);if(r<0)break;let i=r>0?e[r-1]:"",a=i==='"'||i==="'"?i:null,o=e.indexOf(",",r);if(o<0)break;let s=e.slice(r+5,o);if(!s||/[\s"'()<>]/.test(s)){n=r+5;continue}let c=o+1,d=!1;for(;c<e.length;){let x=e[c]??"";if(d){d=!1,c+=1;continue}if(x==="\\"){d=!0,c+=1;continue}if(a?x===a:ju(x))break;c+=1}let u=e.slice(r,c),p=ro(e.slice(o+1,c)),h=s.split(";"),f=h.shift()||"text/plain",w=h.some(x=>x.toLowerCase()==="base64");t.push({match:u,mime:f,isBase64:w,payload:p,index:r}),n=c}return t}function Uu(e){let t=e.trim();if(!t.toLowerCase().startsWith("data:"))return null;let n=t.indexOf(",");if(n<0)return null;let r=t.slice(5,n);if(!r||/[\s"'()<>]/.test(r))return null;let i=r.split(";"),a=i.shift()||"text/plain",o=i.some(s=>s.toLowerCase()==="base64");return{mime:a,isBase64:o,payload:ro(t.slice(n+1))}}async function Xa(e,t){let n=Uu(e);if(!n)return null;let r;try{r=no(n.mime,n.isBase64,n.payload)}catch{return null}let i=`${await Fn(r)}${Zr(n.mime)}`;return t.has(i)||t.set(i,{filename:i,bytes:r,contentType:n.mime||"application/octet-stream"}),`assets/${i}`}async function Wr(e,t,n){let r=n.get(e);if(r)return r;try{let i=await fetch(e,{cache:"force-cache",referrerPolicy:"strict-origin-when-cross-origin"});if(!i.ok)return null;let a=i.headers.get("content-type")?.split(";")[0]?.trim()||"application/octet-stream",o=new Uint8Array(await i.arrayBuffer());if(o.byteLength===0)return null;let s=`${await Fn(o)}${Zr(a)}`;t.has(s)||t.set(s,{filename:s,bytes:o,contentType:a});let c=`assets/${s}`;return n.set(e,c),c}catch{return null}}function Fu(e){let t=[],n=0,r=!1;for(let i=0;i<e.length;i+=1){if(e[i]!==",")continue;if(e.slice(n,i).trimStart().toLowerCase().startsWith("data:")&&!r){r=!0;continue}t.push(e.slice(n,i).trim()),n=i+1,r=!1}return t.push(e.slice(n).trim()),t.filter(Boolean).map(i=>{let a=i.match(/\s+(\d+(?:\.\d+)?[wx])$/);return a?.index?{url:i.slice(0,a.index).trim(),descriptor:a[1]??""}:{url:i,descriptor:""}}).filter(i=>i.url.length>0)}async function Hu(e,t,n,r){let i=Array.from(e.querySelectorAll("img[src],source[src],video[poster]"));for(let o of i){let s=o.hasAttribute("poster")?"poster":"src",c=o.getAttribute(s);if(!c)continue;let d=await Xa(c,n);if(d){o.setAttribute(s,d);continue}let u=Br(c,t);if(!u)continue;let p=await Wr(u,n,r);p&&o.setAttribute(s,p)}let a=Array.from(e.querySelectorAll("img[srcset],source[srcset]"));for(let o of a){let s=o.getAttribute("srcset");if(!s)continue;let c=[];for(let d of Fu(s)){let u=await Xa(d.url,n);if(u){c.push(`${u}${d.descriptor?` ${d.descriptor}`:""}`);continue}let p=Br(d.url,t),h=p?await Wr(p,n,r):null;c.push(`${h??d.url}${d.descriptor?` ${d.descriptor}`:""}`)}o.setAttribute("srcset",c.join(", "))}}async function Bu(e,t,n,r){let i=[],a=/url\(\s*(["']?)([^"')]+)\1\s*\)/gi,o;for(;o=a.exec(e);){let c=o[2]??"",d=Br(c,t);d&&i.push({raw:c,url:d})}let s=e;for(let c of i){let d=await Wr(c.url,n,r);d&&(s=s.split(c.raw).join(d))}return s}async function Wu(e){let t=new Map,n=zu(e),r=[];for(let o of n){let s;try{s=no(o.mime,o.isBase64,o.payload)}catch{continue}let c=`${await Fn(s)}${Zr(o.mime)}`;t.has(c)||t.set(c,{filename:c,bytes:s,contentType:o.mime||"application/octet-stream"}),r.push({match:o.match,replacement:`assets/${c}`})}let i=e,a=new Map;for(let o of r)a.set(o.match,o.replacement);for(let[o,s]of a)i=i.split(o).join(s);return{html:i,assets:t}}function Vu(e){return e.replace(/<script\b[\s\S]*?<\/script>/gi,"")}function Ju(e){return e.replace(/<script\b(?=[^>]*\bid=["']alpha-capture-index["'])[\s\S]*?<\/script>/i,"")}function Zu(e){return e.replace(/<link\b(?=[^>]*\brel=["'](?:preload|prefetch|preconnect|dns-prefetch|modulepreload|canonical|alternate)["'])[^>]*>/gi,"").replace(/<meta\b(?=[^>]*\b(?:property|name)=["'](?:og:[^"']+|twitter:[^"']+|description|keywords|robots|theme-color|generator)["'])[^>]*>/gi,"")}function qu(e){let t=1,n=e.createTreeWalker(e.documentElement,NodeFilter.SHOW_ELEMENT,null),r=e.documentElement;do{if(r&&r.nodeType===1){let i=r.tagName.toLowerCase();Lu.has(i)&&(r.setAttribute("data-inkly-id",String(t)),t+=1)}r=n.nextNode()}while(r)}function Gu(e){e.removeAttribute("href"),e.removeAttribute("xlink:href"),e.removeAttributeNS("http://www.w3.org/1999/xlink","href"),e.removeAttribute("target"),e.removeAttribute("rel"),e.removeAttribute("download"),e.removeAttribute("ping"),e.removeAttribute("referrerpolicy")}function Ku(e){for(let t of Array.from(e.querySelectorAll("*")))for(let n of Array.from(t.attributes))/^on/i.test(n.name)&&t.removeAttribute(n.name),/^formaction$/i.test(n.name)&&t.removeAttribute(n.name);for(let t of Array.from(e.querySelectorAll("base")))t.remove();for(let t of Array.from(e.querySelectorAll("link[href]")))(t.getAttribute("rel")??"").toLowerCase().split(/\s+/).filter(Boolean).includes("stylesheet")||t.remove();for(let t of Array.from(e.querySelectorAll("meta[http-equiv]")))(t.getAttribute("http-equiv")??"").toLowerCase()==="refresh"&&t.remove();for(let t of Array.from(e.querySelectorAll("a,area")))Gu(t),t.removeAttribute("data-inkly-href");for(let t of Array.from(e.querySelectorAll("form")))t.removeAttribute("action"),t.removeAttribute("method"),t.removeAttribute("target"),t.removeAttribute("data-inkly-action")}function Yu(e){let t=Array.from(e.querySelectorAll("style"));if(t.length===0)return"";let n=[],r=!0;for(let i of t){let a=i.textContent?.trim()??"",o=i.getAttribute("media")?.trim();if(o&&o.toLowerCase()!=="all"?n.push(`@media ${o} {${a}}`):n.push(a),r){let s=e.createElement("link");s.setAttribute("rel","stylesheet"),s.setAttribute("href","assets/document.css"),i.replaceWith(s),r=!1}else i.remove()}return n.join(`
5047
-
5048
- `)}function Xu(e){let t="",n=0,r="",i=!1,a=0,o=!0,s=()=>{o&&(t+=" ".repeat(n),o=!1)},c=()=>{t=t.replace(/[ \t]+$/,""),t+=`
5060
+ `)}}import{readdir as Ou,readFile as ju}from"fs/promises";import{join as eo,resolve as to}from"path";function Qr(e,t){e||process.stdout.write(t)}function Uu(e,t){if(t.demo){let n=e.demos.find(r=>r.slug===t.demo);if(!n)throw new Error(`No such demo: ${t.demo}`);return n}if(t.path){let n=to(t.cwd,t.path),r=e.demos.find(a=>to(a.dir)===n);if(r)return r;let i=e.demos.find(a=>a.slug===t.path||a.slug===t.path?.replace(/^demos\//,""));if(i)return i;throw new Error(`No demo found at "${t.path}". Available demos: ${e.demos.map(a=>a.slug).join(", ")||"(none)"}`)}if(e.demos.length===1)return e.demos[0];throw new Error(`This hub has ${e.demos.length} demos \u2014 pass a demo path or --demo <slug>. Available: ${e.demos.map(n=>n.slug).join(", ")}`)}async function zu(e,t=[]){let n=eo(e,"snapshots");if(!await Z(n))return{};let r={};async function i(a){for(let o of await Ou(a,{withFileTypes:!0})){let s=eo(a,o.name);if(o.isDirectory())await i(s);else if(o.isFile()&&/\.(html|css)$/i.test(o.name)){let l=s.slice(e.length+1).split(/[\\/]/).join("/");r[l]=Fu(await ju(s,"utf8"),t)}}}return await i(n),r}function Fu(e,t){let n=e;for(let r of t)n=n.split(r.local).join(r.remote);return n}function Hu(e){let t=[];for(let n of e.assets)!n.publicUrl||!n.file||t.push({local:`${Ve}${n.file}`,remote:n.publicUrl});return t}function Bu(e,t,n){let r=e??{version:1,assets:[]},i=new Map(n.map(o=>[o.sha256,o])),a=new Map(t.map(o=>[o.sha256,o]));return{...r,assets:r.assets.map(o=>{let s=i.get(o.sha256);if(!s)return o;let l=a.get(o.sha256);return{...o,contentType:o.contentType??l?.contentType??qn(`${o.sha256}${s.ext}`,o.kind),publicUrl:s.publicUrl,cdnPath:s.cdnPath}})}}async function no(e){let t=await Ke();if(!t.token)throw new Error("Not logged in. Run `inkly login` first.");let n=Ye(t.apiBase??process.env.INKLY_API_BASE),r=await jt(e.cwd),i=Uu(r,e),a=await Zn({cwd:r.root,demo:i.slug,dryRun:!0,silent:!0});if(a.unresolved.length>0)throw new Error(`${a.unresolved.length} asset(s) have no local bytes and are not on the CDN, so a hosted preview cannot be published:
5061
+ `+a.unresolved.map(x=>` - ${x.id} (${x.sha256})`).join(`
5062
+ `));let o=[];a.assets.length>0&&(Qr(e.silent,`Uploading ${a.assets.length} asset(s) to the CDN for this snapshot...
5063
+ `),o=(await Xr({apiBase:n,token:t.token,assets:a.assets})).uploads);let s=Bu(i.assets,a.assets,o),l=await zu(i.dir,Hu(s)),d=Object.keys(l).filter(x=>l[x].includes(Ve));if(d.length>0)throw new Error(`${d.length} snapshot file(s) still reference an un-synced capture asset (the ${Ve} placeholder was not resolved to a CDN URL), so the hosted snapshot would 404:
5064
+ `+d.map(x=>` - ${x}`).join(`
5065
+ `));let u=await fetch(`${n}/api/previews`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t.token}`},body:JSON.stringify({demoSlug:i.slug,title:i.config.title??null,config:i.config,assets:s,hub:r.inkly,snapshots:l})}),p=await u.json().catch(()=>null);if(!u.ok||!p?.id)throw new Error(p?.error??`Snapshot publish failed: HTTP ${u.status}`);let h=p.url??`${n}${p.path??`/p/${p.id}`}`,m={hubRoot:r.root,slug:i.slug,id:p.id,url:h};return e.json?Qr(e.silent,JSON.stringify(m,null,2)+`
5066
+ `):Qr(e.silent,`Snapshot published:
5067
+ ${h}
5068
+ `),m}import*as vt from"@sentry/node";var Wu="https://b3450c6a8fdcd02b8aee3b9f2c8425eb@o4511498910433280.ingest.us.sentry.io/4511498940252160",Vu="@inkly-org/cli@0.5.1";function ro(){vt.init({dsn:Wu,release:process.env.SENTRY_RELEASE??Vu,environment:process.env.SENTRY_ENVIRONMENT??"production",enabled:process.env.INKLY_SENTRY_DISABLED!=="1",sendDefaultPii:!1,tracesSampleRate:0,beforeSend(e){return e.server_name=void 0,e}})}async function oe(e,t){vt.captureException(t,{tags:{command:e,surface:"cli"}}),await vt.flush(2e3)}async function io(){await vt.flush(2e3)}import{spawn as ci,execFile as yo}from"child_process";import{createHash as Up,randomUUID as zp}from"crypto";import{mkdir as St,mkdtemp as Fp,open as di,readFile as Te,readdir as ui,rm as ce,writeFile as xo}from"fs/promises";import{existsSync as ye}from"fs";import{dirname as nr,isAbsolute as ko,join as F,resolve as Zt,sep as Hp}from"path";import{tmpdir as Bp,homedir as pi}from"os";import{fileURLToPath as wo}from"url";import{unzipSync as Wp,zipSync as Vp}from"fflate";import Jp from"ws";import qp from"sharp";import Zp from"subset-font";var Ju=new Set(["area","base","br","col","embed","hr","img","input","link","meta","source","track","wbr"]),qu=new Set(["a","button","input","select","textarea","label","p","h1","h2","h3","h4","h5","h6","img","li","nav","main","header","footer","section","article","aside","form","table","tr","td","th","ul","ol"]);function Zu(e){let t="";for(let n=0;n<e.length;n+=1)t+=(e[n]??0).toString(16).padStart(2,"0");return t}async function Gn(e,t=16){let n=new Uint8Array(e.byteLength);n.set(e);let r=await crypto.subtle.digest("SHA-256",n);return Zu(new Uint8Array(r)).slice(0,t)}function ii(e){switch((e.toLowerCase().split(";")[0]??"").trim()){case"image/png":return".png";case"image/jpeg":case"image/jpg":return".jpg";case"image/webp":return".webp";case"image/gif":return".gif";case"image/svg+xml":return".svg";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";case"font/woff2":return".woff2";case"font/woff":return".woff";case"text/css":return".css";case"text/javascript":case"application/javascript":return".js";default:return".bin"}}function ei(e,t){let n=e.trim();if(!n||n.startsWith("data:")||n.startsWith("blob:")||n.startsWith("assets/")||n.startsWith("#"))return null;try{let r=new URL(n,t);return r.protocol!=="http:"&&r.protocol!=="https:"?null:r.href}catch{return null}}function co(e,t,n){if(t){let i=atob(n.replace(/\s+/g,"")),a=new Uint8Array(i.length);for(let o=0;o<i.length;o+=1)a[o]=i.charCodeAt(o);return a}let r=decodeURIComponent(n.replace(/\+/g,"%20"));return new TextEncoder().encode(r)}function Gu(e){return/\s/.test(e)||e===")"||e==='"'||e==="<"||e===">"}function uo(e){return e.replace(/\\(?:\r\n|[\n\r\f])/g,"").replace(/\\([0-9a-fA-F]{1,6}\s?|[\s\S])/g,(t,n)=>{let r=n.match(/^([0-9a-fA-F]{1,6})\s?$/);if(r?.[1])try{return String.fromCodePoint(Number.parseInt(r[1],16))}catch{return""}return n})}function Ku(e){let t=[],n=0;for(;n<e.length;){let r=e.toLowerCase().indexOf("data:",n);if(r<0)break;let i=r>0?e[r-1]:"",a=i==='"'||i==="'"?i:null,o=e.indexOf(",",r);if(o<0)break;let s=e.slice(r+5,o);if(!s||/[\s"'()<>]/.test(s)){n=r+5;continue}let l=o+1,d=!1;for(;l<e.length;){let y=e[l]??"";if(d){d=!1,l+=1;continue}if(y==="\\"){d=!0,l+=1;continue}if(a?y===a:Gu(y))break;l+=1}let u=e.slice(r,l),p=uo(e.slice(o+1,l)),h=s.split(";"),m=h.shift()||"text/plain",x=h.some(y=>y.toLowerCase()==="base64");t.push({match:u,mime:m,isBase64:x,payload:p,index:r}),n=l}return t}function Yu(e){let t=e.trim();if(!t.toLowerCase().startsWith("data:"))return null;let n=t.indexOf(",");if(n<0)return null;let r=t.slice(5,n);if(!r||/[\s"'()<>]/.test(r))return null;let i=r.split(";"),a=i.shift()||"text/plain",o=i.some(s=>s.toLowerCase()==="base64");return{mime:a,isBase64:o,payload:uo(t.slice(n+1))}}async function ao(e,t){let n=Yu(e);if(!n)return null;let r;try{r=co(n.mime,n.isBase64,n.payload)}catch{return null}let i=`${await Gn(r)}${ii(n.mime)}`;return t.has(i)||t.set(i,{filename:i,bytes:r,contentType:n.mime||"application/octet-stream"}),`assets/${i}`}async function ti(e,t,n){let r=n.get(e);if(r)return r;try{let i=await fetch(e,{cache:"force-cache",referrerPolicy:"strict-origin-when-cross-origin"});if(!i.ok)return null;let a=i.headers.get("content-type")?.split(";")[0]?.trim()||"application/octet-stream",o=new Uint8Array(await i.arrayBuffer());if(o.byteLength===0)return null;let s=`${await Gn(o)}${ii(a)}`;t.has(s)||t.set(s,{filename:s,bytes:o,contentType:a});let l=`assets/${s}`;return n.set(e,l),l}catch{return null}}function Xu(e){let t=[],n=0,r=!1;for(let i=0;i<e.length;i+=1){if(e[i]!==",")continue;if(e.slice(n,i).trimStart().toLowerCase().startsWith("data:")&&!r){r=!0;continue}t.push(e.slice(n,i).trim()),n=i+1,r=!1}return t.push(e.slice(n).trim()),t.filter(Boolean).map(i=>{let a=i.match(/\s+(\d+(?:\.\d+)?[wx])$/);return a?.index?{url:i.slice(0,a.index).trim(),descriptor:a[1]??""}:{url:i,descriptor:""}}).filter(i=>i.url.length>0)}async function Qu(e,t,n,r){let i=Array.from(e.querySelectorAll("img[src],source[src],video[poster]"));for(let o of i){let s=o.hasAttribute("poster")?"poster":"src",l=o.getAttribute(s);if(!l)continue;let d=await ao(l,n);if(d){o.setAttribute(s,d);continue}let u=ei(l,t);if(!u)continue;let p=await ti(u,n,r);p&&o.setAttribute(s,p)}let a=Array.from(e.querySelectorAll("img[srcset],source[srcset]"));for(let o of a){let s=o.getAttribute("srcset");if(!s)continue;let l=[];for(let d of Xu(s)){let u=await ao(d.url,n);if(u){l.push(`${u}${d.descriptor?` ${d.descriptor}`:""}`);continue}let p=ei(d.url,t),h=p?await ti(p,n,r):null;l.push(`${h??d.url}${d.descriptor?` ${d.descriptor}`:""}`)}o.setAttribute("srcset",l.join(", "))}}async function ep(e,t,n,r){let i=[],a=/url\(\s*(["']?)([^"')]+)\1\s*\)/gi,o;for(;o=a.exec(e);){let l=o[2]??"",d=ei(l,t);d&&i.push({raw:l,url:d})}let s=e;for(let l of i){let d=await ti(l.url,n,r);d&&(s=s.split(l.raw).join(d))}return s}async function tp(e){let t=new Map,n=Ku(e),r=[];for(let o of n){let s;try{s=co(o.mime,o.isBase64,o.payload)}catch{continue}let l=`${await Gn(s)}${ii(o.mime)}`;t.has(l)||t.set(l,{filename:l,bytes:s,contentType:o.mime||"application/octet-stream"}),r.push({match:o.match,replacement:`assets/${l}`})}let i=e,a=new Map;for(let o of r)a.set(o.match,o.replacement);for(let[o,s]of a)i=i.split(o).join(s);return{html:i,assets:t}}function np(e){return e.replace(/<script\b[\s\S]*?<\/script>/gi,"")}function rp(e){return e.replace(/<script\b(?=[^>]*\bid=["']alpha-capture-index["'])[\s\S]*?<\/script>/i,"")}function ip(e){return e.replace(/<link\b(?=[^>]*\brel=["'](?:preload|prefetch|preconnect|dns-prefetch|modulepreload|canonical|alternate)["'])[^>]*>/gi,"").replace(/<meta\b(?=[^>]*\b(?:property|name)=["'](?:og:[^"']+|twitter:[^"']+|description|keywords|robots|theme-color|generator)["'])[^>]*>/gi,"")}function ap(e){let t=1,n=e.createTreeWalker(e.documentElement,NodeFilter.SHOW_ELEMENT,null),r=e.documentElement;do{if(r&&r.nodeType===1){let i=r.tagName.toLowerCase();qu.has(i)&&(r.hasAttribute("data-inkly-id")||(r.setAttribute("data-inkly-id",String(t)),t+=1))}r=n.nextNode()}while(r)}function op(e){e.removeAttribute("href"),e.removeAttribute("xlink:href"),e.removeAttributeNS("http://www.w3.org/1999/xlink","href"),e.removeAttribute("target"),e.removeAttribute("rel"),e.removeAttribute("download"),e.removeAttribute("ping"),e.removeAttribute("referrerpolicy")}function sp(e){for(let t of Array.from(e.querySelectorAll("*")))for(let n of Array.from(t.attributes))/^on/i.test(n.name)&&t.removeAttribute(n.name),/^formaction$/i.test(n.name)&&t.removeAttribute(n.name);for(let t of Array.from(e.querySelectorAll("base")))t.remove();for(let t of Array.from(e.querySelectorAll("link[href]")))(t.getAttribute("rel")??"").toLowerCase().split(/\s+/).filter(Boolean).includes("stylesheet")||t.remove();for(let t of Array.from(e.querySelectorAll("meta[http-equiv]")))(t.getAttribute("http-equiv")??"").toLowerCase()==="refresh"&&t.remove();for(let t of Array.from(e.querySelectorAll("a,area")))op(t),t.removeAttribute("data-inkly-href");for(let t of Array.from(e.querySelectorAll("form")))t.removeAttribute("action"),t.removeAttribute("method"),t.removeAttribute("target"),t.removeAttribute("data-inkly-action")}function lp(e){let t=Array.from(e.querySelectorAll("style"));if(t.length===0)return"";let n=[],r=!0;for(let i of t){let a=i.textContent?.trim()??"",o=i.getAttribute("media")?.trim();if(o&&o.toLowerCase()!=="all"?n.push(`@media ${o} {${a}}`):n.push(a),r){let s=e.createElement("link");s.setAttribute("rel","stylesheet"),s.setAttribute("href","assets/document.css"),i.replaceWith(s),r=!1}else i.remove()}return n.join(`
5069
+
5070
+ `)}function cp(e){let t="",n=0,r="",i=!1,a=0,o=!0,s=()=>{o&&(t+=" ".repeat(n),o=!1)},l=()=>{t=t.replace(/[ \t]+$/,""),t+=`
5049
5071
  `,o=!0};for(let d of e){if(r){s(),t+=d,i?i=!1:d==="\\"?i=!0:d===r&&(r="");continue}if(i){s(),t+=d,i=!1;continue}if(d==="\\"){s(),t+=d,i=!0;continue}if(d==='"'||d==="'"){s(),r=d,t+=d;continue}if(d==="("&&(a+=1),d===")"&&(a=Math.max(0,a-1)),d==="{"){s(),t=t.replace(/[ \t]+$/,""),t+=` {
5050
- `,n+=1,o=!0;continue}if(d==="}"){n=Math.max(0,n-1),c(),s(),t+="}",c();continue}if(d===";"&&a===0){s(),t+=";",c();continue}if(d===","&&a===0){s(),t+=",",c();continue}s(),t+=d}return`${t.trim()}
5051
- `}function Qa(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Vr(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function eo(e){return e==="id"?0:e==="data-inkly-id"?1:e==="class"?2:e==="href"?3:e==="src"?4:e==="srcset"?5:e==="alt"?6:e==="aria-label"?7:e==="role"?8:e==="type"?9:e==="style"?10:20}function Qu(e){return Array.from(e.attributes).sort((n,r)=>eo(n.name)-eo(r.name)||n.name.localeCompare(r.name))}function ep(e,t){let n=e.trim().split(/\s+/).filter(Boolean);if(n.length<=5&&e.length<=100)return`"${Vr(e)}"`;let r=" ".repeat(t+2);return`"${n.map(i=>`
5052
- ${r}${Vr(i)}`).join("")}
5053
- ${" ".repeat(t)}"`}function to(e,t){return e.name==="class"?`${e.name}=${ep(e.value,t+e.name.length+2)}`:`${e.name}="${Vr(e.value)}"`}function tp(e,t){let n=Qu(e),r=e.tagName.toLowerCase();if(n.length===0)return`<${r}>`;let i=`<${r} ${n.map(o=>to(o,t)).join(" ")}>`;if(i.length<=110&&!n.some(o=>o.name==="class"&&o.value.length>100))return i;let a=[`<${r}`];for(let o of n)a.push(`${" ".repeat(t+2)}${to(o,t+2)}`);return a.push(`${" ".repeat(t)}>`),a.join(`
5054
- `)}function np(e){let t=e.tagName.toLowerCase();if(t==="pre"||t==="code"||t==="textarea"||t==="style")return!0;let n=e.getAttribute("class")??"";if(/(^|\s)whitespace-(?:pre|pre-wrap|pre-line|break-spaces)(\s|$)/.test(n))return!0;let r=e.getAttribute("style")??"";return/(?:^|;)\s*white-space\s*:\s*(?:pre|pre-wrap|pre-line|break-spaces)\b/i.test(r)}function Jr(e,t){let n=" ".repeat(t*2);if(e.nodeType===Node.TEXT_NODE){let d=(e.nodeValue??"").replace(/\s+/g," ").trim();return d?`${n}${Qa(d)}`:""}if(e.nodeType===Node.COMMENT_NODE||e.nodeType!==Node.ELEMENT_NODE)return"";let r=e,i=r.tagName.toLowerCase(),a=`${n}${tp(r,n.length)}`;if(Mu.has(i))return a;if(i==="template"&&"content"in r){let d=r,u=[];for(let p of Array.from(d.content.childNodes)){let h=Jr(p,t+1);h&&u.push(h)}return u.length===0?`${a}</${i}>`:`${a}
5072
+ `,n+=1,o=!0;continue}if(d==="}"){n=Math.max(0,n-1),l(),s(),t+="}",l();continue}if(d===";"&&a===0){s(),t+=";",l();continue}if(d===","&&a===0){s(),t+=",",l();continue}s(),t+=d}return`${t.trim()}
5073
+ `}function oo(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ni(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function so(e){return e==="id"?0:e==="data-inkly-id"?1:e==="class"?2:e==="href"?3:e==="src"?4:e==="srcset"?5:e==="alt"?6:e==="aria-label"?7:e==="role"?8:e==="type"?9:e==="style"?10:20}function dp(e){return Array.from(e.attributes).sort((n,r)=>so(n.name)-so(r.name)||n.name.localeCompare(r.name))}function up(e,t){let n=e.trim().split(/\s+/).filter(Boolean);if(n.length<=5&&e.length<=100)return`"${ni(e)}"`;let r=" ".repeat(t+2);return`"${n.map(i=>`
5074
+ ${r}${ni(i)}`).join("")}
5075
+ ${" ".repeat(t)}"`}function lo(e,t){return e.name==="class"?`${e.name}=${up(e.value,t+e.name.length+2)}`:`${e.name}="${ni(e.value)}"`}function pp(e,t){let n=dp(e),r=e.tagName.toLowerCase();if(n.length===0)return`<${r}>`;let i=`<${r} ${n.map(o=>lo(o,t)).join(" ")}>`;if(i.length<=110&&!n.some(o=>o.name==="class"&&o.value.length>100))return i;let a=[`<${r}`];for(let o of n)a.push(`${" ".repeat(t+2)}${lo(o,t+2)}`);return a.push(`${" ".repeat(t)}>`),a.join(`
5076
+ `)}function hp(e){let t=e.tagName.toLowerCase();if(t==="pre"||t==="code"||t==="textarea"||t==="style")return!0;let n=e.getAttribute("class")??"";if(/(^|\s)whitespace-(?:pre|pre-wrap|pre-line|break-spaces)(\s|$)/.test(n))return!0;let r=e.getAttribute("style")??"";return/(?:^|;)\s*white-space\s*:\s*(?:pre|pre-wrap|pre-line|break-spaces)\b/i.test(r)}function ri(e,t){let n=" ".repeat(t*2);if(e.nodeType===Node.TEXT_NODE){let d=(e.nodeValue??"").replace(/\s+/g," ").trim();return d?`${n}${oo(d)}`:""}if(e.nodeType===Node.COMMENT_NODE||e.nodeType!==Node.ELEMENT_NODE)return"";let r=e,i=r.tagName.toLowerCase(),a=`${n}${pp(r,n.length)}`;if(Ju.has(i))return a;if(i==="template"&&"content"in r){let d=r,u=[];for(let p of Array.from(d.content.childNodes)){let h=ri(p,t+1);h&&u.push(h)}return u.length===0?`${a}</${i}>`:`${a}
5055
5077
  ${u.join(`
5056
5078
  `)}
5057
- ${n}</${i}>`}if(np(r))return`${n}${r.outerHTML}`;let o=Array.from(r.childNodes).filter(d=>d.nodeType!==Node.COMMENT_NODE&&!(d.nodeType===Node.TEXT_NODE&&(d.nodeValue??"").trim().length===0));if(o.length>0&&o.every(d=>d.nodeType===Node.TEXT_NODE)){let d=o.map(u=>u.nodeValue??"").join("").replace(/\s+/g," ").trim();return d?`${a}${Qa(d)}</${i}>`:`${a}</${i}>`}let s=[];for(let d of Array.from(r.childNodes)){let u=Jr(d,t+1);u&&s.push(u)}if(s.length===0)return`${a}</${i}>`;let c=s[0];return s.length===1&&c&&c.trim()&&!c.includes(`
5058
- `)&&a.length+c.trim().length<120?`${a}${c.trim()}</${i}>`:`${a}
5079
+ ${n}</${i}>`}if(hp(r))return`${n}${r.outerHTML}`;let o=Array.from(r.childNodes).filter(d=>d.nodeType!==Node.COMMENT_NODE&&!(d.nodeType===Node.TEXT_NODE&&(d.nodeValue??"").trim().length===0));if(o.length>0&&o.every(d=>d.nodeType===Node.TEXT_NODE)){let d=o.map(u=>u.nodeValue??"").join("").replace(/\s+/g," ").trim();return d?`${a}${oo(d)}</${i}>`:`${a}</${i}>`}let s=[];for(let d of Array.from(r.childNodes)){let u=ri(d,t+1);u&&s.push(u)}if(s.length===0)return`${a}</${i}>`;let l=s[0];return s.length===1&&l&&l.trim()&&!l.includes(`
5080
+ `)&&a.length+l.trim().length<120?`${a}${l.trim()}</${i}>`:`${a}
5059
5081
  ${s.join(`
5060
5082
  `)}
5061
- ${n}</${i}>`}function rp(e){let t=e.documentElement;return`<!doctype html>
5062
- ${Jr(t,0)}
5063
- `}var ip=.8,ap=1024;function op(e){let t=(e.toLowerCase().split(";")[0]??"").trim();return t==="image/png"||t==="image/jpeg"||t==="image/jpg"}async function sp(e,t){if(typeof createImageBitmap!="function"||typeof OffscreenCanvas!="function")return null;try{let n=e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength),r=await createImageBitmap(new Blob([n],{type:t}));try{let i=new OffscreenCanvas(r.width,r.height),a=i.getContext("2d");if(!a)return null;a.drawImage(r,0,0);let o=await i.convertToBlob({type:"image/webp",quality:ip});return o.type!=="image/webp"?null:new Uint8Array(await o.arrayBuffer())}finally{r.close()}}catch{return null}}async function lp(e,t,n){let r=new Map,i=new Map;for(let s of e.values()){if(!op(s.contentType)||s.bytes.byteLength<ap){i.set(s.filename,s);continue}let c=await sp(s.bytes,s.contentType);if(!c||c.byteLength>=s.bytes.byteLength){i.set(s.filename,s);continue}let d=`${await Fn(c)}.webp`;r.set(s.filename,d),i.has(d)||i.set(d,{filename:d,bytes:c,contentType:"image/webp"})}if(r.size===0)return{assets:[...e.values()],html:t,css:n};let a=t,o=n;for(let[s,c]of r)a=a.split(`assets/${s}`).join(`assets/${c}`),o=o.split(s).join(c);return{assets:[...i.values()],html:a,css:o}}async function io(e,t,n={}){let r=Vu(e);r=Ju(r),r=Zu(r);let i=await Wu(r);r=i.html;let a=cp(r);qu(a),Ku(a);let o=new Map;await Hu(a,t,i.assets,o);let s=(await Bu(Yu(a),t,i.assets,o)).replace(/url\((["']?)assets\//g,"url($1"),c=Xt(rp(a)),d=Xu(s);if(n.compressImages){let u=await lp(i.assets,c,d);return{html:u.html,css:u.css,assets:u.assets}}return{html:c,css:d,assets:[...i.assets.values()]}}function cp(e){let t=globalThis.DOMParser;if(!t)throw new Error("DOMParser is not available in this context. Run compactSnapshot in an offscreen document.");return new t().parseFromString(e,"text/html")}import{zipSync as dp}from"fflate";var up=/^(?:https?:)?\/\//i,pp=/^(?:#|data:|blob:|javascript:|mailto:|tel:|about:|chrome:|chrome-extension:)/i;function hp(e){return e.normalize("NFKD").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+/,"").slice(0,60).replace(/-+$/,"")||"demo"}function mp(e){let t="abcdefghijklmnopqrstuvwxyz0123456789",n=new Uint8Array(e);crypto.getRandomValues(n);let r="";for(let i=0;i<e;i+=1)r+=t[(n[i]??0)%t.length];return r}function fp(e){return`${hp(e)}-${mp(6)}`}function gp(e,t){return`# ${t}
5083
+ ${n}</${i}>`}function mp(e){let t=e.documentElement;return`<!doctype html>
5084
+ ${ri(t,0)}
5085
+ `}var fp=.8,gp=1024;function bp(e){let t=(e.toLowerCase().split(";")[0]??"").trim();return t==="image/png"||t==="image/jpeg"||t==="image/jpg"}async function yp(e,t){if(typeof createImageBitmap!="function"||typeof OffscreenCanvas!="function")return null;try{let n=e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength),r=await createImageBitmap(new Blob([n],{type:t}));try{let i=new OffscreenCanvas(r.width,r.height),a=i.getContext("2d");if(!a)return null;a.drawImage(r,0,0);let o=await i.convertToBlob({type:"image/webp",quality:fp});return o.type!=="image/webp"?null:new Uint8Array(await o.arrayBuffer())}finally{r.close()}}catch{return null}}async function xp(e,t,n){let r=new Map,i=new Map;for(let s of e.values()){if(!bp(s.contentType)||s.bytes.byteLength<gp){i.set(s.filename,s);continue}let l=await yp(s.bytes,s.contentType);if(!l||l.byteLength>=s.bytes.byteLength){i.set(s.filename,s);continue}let d=`${await Gn(l)}.webp`;r.set(s.filename,d),i.has(d)||i.set(d,{filename:d,bytes:l,contentType:"image/webp"})}if(r.size===0)return{assets:[...e.values()],html:t,css:n};let a=t,o=n;for(let[s,l]of r)a=a.split(`assets/${s}`).join(`assets/${l}`),o=o.split(s).join(l);return{assets:[...i.values()],html:a,css:o}}async function po(e,t,n={}){let r=np(e);r=rp(r),r=ip(r);let i=await tp(r);r=i.html;let a=kp(r);ap(a),sp(a);let o=new Map;await Qu(a,t,i.assets,o);let s=(await ep(lp(a),t,i.assets,o)).replace(/url\((["']?)assets\//g,"url($1"),l=an(mp(a)),d=cp(s);if(n.compressImages){let u=await xp(i.assets,l,d);return{html:u.html,css:u.css,assets:u.assets}}return{html:l,css:d,assets:[...i.assets.values()]}}function kp(e){let t=globalThis.DOMParser;if(!t)throw new Error("DOMParser is not available in this context. Run compactSnapshot in an offscreen document.");return new t().parseFromString(e,"text/html")}import{zipSync as wp}from"fflate";var vp=/^(?:https?:)?\/\//i,Sp=/^(?:#|data:|blob:|javascript:|mailto:|tel:|about:|chrome:|chrome-extension:)/i;function _p(e){return e.normalize("NFKD").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+/,"").slice(0,60).replace(/-+$/,"")||"demo"}function Cp(e){let t="abcdefghijklmnopqrstuvwxyz0123456789",n=new Uint8Array(e);crypto.getRandomValues(n);let r="";for(let i=0;i<e;i+=1)r+=t[(n[i]??0)%t.length];return r}function Tp(e){return`${_p(e)}-${Cp(6)}`}function Ap(e,t){return`# ${t}
5086
+
5087
+ This is a self-contained Inkly HTML capture. Everything it needs is in
5088
+ this folder \u2014 no hub and no upload required to preview it.
5089
+
5090
+ ## Preview it
5064
5091
 
5065
- This folder is a self-contained Inkly HTML capture. It works locally with
5066
- \`inkly-cli\` with no upload needed.
5092
+ Install the CLI once, then point \`inkly dev\` at this folder \u2014 no
5093
+ \`inkly init\` needed:
5067
5094
 
5068
- ## Use it
5095
+ \`\`\`bash
5096
+ npm install -g @inkly-org/cli
5097
+ inkly dev ${e}
5098
+ \`\`\`
5069
5099
 
5070
- 1. If you don't have a hub yet, create one:
5100
+ It serves at http://localhost:3000.
5071
5101
 
5072
- \`\`\`bash
5073
- npm install -g @inkly-org/cli
5074
- inkly init my-hub
5075
- cd my-hub
5076
- \`\`\`
5102
+ ## Host it in a hub
5077
5103
 
5078
- 2. Copy the \`${e}/\` folder from this zip into your hub's \`demos/\`
5079
- directory (so it lands at \`demos/${e}/\`).
5104
+ To keep all your demos together as a collection and sync them with the
5105
+ Inkly platform, scaffold a hub and import this demo into it. \`inkly add
5106
+ --from\` copies the folder into \`demos/\` and registers it in a collection
5107
+ (plain \`cp\` would leave it out of the hub index):
5080
5108
 
5081
- 3. Preview it:
5109
+ \`\`\`bash
5110
+ inkly init my-hub
5111
+ cd my-hub
5112
+ inkly add ${e} --from ../${e} --collection Main
5113
+ inkly login # connect your Inkly account
5114
+ inkly sync # upload assets to the CDN
5115
+ \`\`\`
5082
5116
 
5083
- \`\`\`bash
5084
- inkly dev
5085
- \`\`\`
5117
+ ## Publish a shareable link
5086
5118
 
5087
- The demo appears under the slug \`${e}\`.
5119
+ From inside the hub (and once logged in), freeze this demo to a
5120
+ standalone, hosted \`/p/<id>\` URL you can share with anyone:
5121
+
5122
+ \`\`\`bash
5123
+ inkly snapshot --demo ${e}
5124
+ \`\`\`
5088
5125
 
5089
5126
  ## What's inside
5090
5127
 
@@ -5093,12 +5130,12 @@ This folder is a self-contained Inkly HTML capture. It works locally with
5093
5130
  - \`${e}/capture-metadata.json\` - HTML export diagnostics.
5094
5131
  - \`${e}/public/<file>\` - captured HTML asset bytes.
5095
5132
  - \`${e}/snapshots/snap-NNN/index.html\` and \`document.css\` - replayable snapshots.
5096
- `}function bp(e){return e.trim().replace(/^['"]|['"]$/g,"")}function Hn(e,t){let n=bp(t.url);!n||pp.test(n)||!up.test(n)||e.set(`${t.stepId}\0${t.file}\0${t.kind}\0${n}`,{...t,url:n})}function yp(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]??"").filter(Boolean)}function xp(e,t){return e?.alphaId?t.includes(`data-inkly-id="${e.alphaId}"`)||t.includes(`data-inkly-id='${e.alphaId}'`)?e:{...e,alphaId:void 0}:e}function kp(e){let t=new Map,n=/\b(?:src|poster|data|action|formaction)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'<>`]+))/gi,r;for(;(r=n.exec(e.html))!==null;)Hn(t,{stepId:e.stepId,file:e.htmlPath,kind:"html-attribute",url:r[1]??r[2]??r[3]??""});let i=/<link\b(?=[^>]*\b(?:rel|as)\s*=\s*(?:"(?:stylesheet|preload|modulepreload|icon|apple-touch-icon|image_src)"|'(?:stylesheet|preload|modulepreload|icon|apple-touch-icon|image_src)'|[^\s"'<>`]*(?:stylesheet|preload|modulepreload|icon|apple-touch-icon|image_src)[^\s"'<>`]*))[^>]*\bhref\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'<>`]+))[^>]*>/gi,a;for(;(a=i.exec(e.html))!==null;)Hn(t,{stepId:e.stepId,file:e.htmlPath,kind:"html-attribute",url:a[1]??a[2]??a[3]??""});let o=/\b(?:srcset|imagesrcset)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'<>`]+))/gi,s;for(;(s=o.exec(e.html))!==null;){let u=s[1]??s[2]??s[3]??"";for(let p of yp(u))Hn(t,{stepId:e.stepId,file:e.htmlPath,kind:"html-srcset",url:p})}let c=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)"'\s]+))\s*\)/gi,d;for(;(d=c.exec(e.css))!==null;)Hn(t,{stepId:e.stepId,file:e.htmlPath.replace(/\/index\.html$/,"/document.css"),kind:"css-url",url:d[1]??d[2]??d[3]??""});return[...t.values()]}async function ao(e){let{name:t,steps:n,assets:r}=e;if(n.length===0)throw new Error("No HTML steps captured.");let i=fp(t),a=new Map;for(let _ of r)a.set(_.filename,`/${i}/${_.filename}`);let o={},s=[],c=[],d=new TextEncoder;for(let _=0;_<n.length;_+=1){let I=n[_];if(!I)continue;let $=`s${_+1}`,R=Ri(_+1),b=`snapshots/${R}/index.html`,z=lr(I.cssText??"",a),U=Di(Ni(Xt(lr(I.htmlText,a)),z.length>0),I.scroll);o[R]={"index.html":d.encode(U),"document.css":d.encode(z)},c.push(...kp({stepId:$,htmlPath:b,html:U,css:z})),s.push($i({stepId:$,htmlPath:b,naturalWidth:I.viewport.width,naturalHeight:I.viewport.height,scroll:I.scroll,sourceUrl:I.url||void 0,click:xp(I.click,U)}))}let u=r.map(_=>({id:_.filename,sha256:_.sha256,kind:kn(_.contentType),contentType:_.contentType,size:_.bytes.byteLength,publicUrl:`/${i}/${_.filename}`})),p=Sn({id:oe(),version:1,title:t,steps:s}),h=Rt.parse({version:1,assets:u,screens:[]}),f={version:1,kind:"html-capture",generatedAt:e.generatedAt??new Date().toISOString(),stepCount:n.length,assetCount:r.length,unresolvedExternalReferences:c},w={};for(let _ of r)w[_.filename]=_.bytes;let x={"README.md":d.encode(gp(i,t)),[i]:{"demo.config.json":d.encode(`${JSON.stringify(p,null,2)}
5133
+ `}function Pp(e){return e.trim().replace(/^['"]|['"]$/g,"")}function Kn(e,t){let n=Pp(t.url);!n||Sp.test(n)||!vp.test(n)||e.set(`${t.stepId}\0${t.file}\0${t.kind}\0${n}`,{...t,url:n})}function Ip(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]??"").filter(Boolean)}function Ep(e,t){return e?.alphaId?t.includes(`data-inkly-id="${e.alphaId}"`)||t.includes(`data-inkly-id='${e.alphaId}'`)?e:{...e,alphaId:void 0}:e}function Rp(e){let t=new Map,n=/\b(?:src|poster|data|action|formaction)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'<>`]+))/gi,r;for(;(r=n.exec(e.html))!==null;)Kn(t,{stepId:e.stepId,file:e.htmlPath,kind:"html-attribute",url:r[1]??r[2]??r[3]??""});let i=/<link\b(?=[^>]*\b(?:rel|as)\s*=\s*(?:"(?:stylesheet|preload|modulepreload|icon|apple-touch-icon|image_src)"|'(?:stylesheet|preload|modulepreload|icon|apple-touch-icon|image_src)'|[^\s"'<>`]*(?:stylesheet|preload|modulepreload|icon|apple-touch-icon|image_src)[^\s"'<>`]*))[^>]*\bhref\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'<>`]+))[^>]*>/gi,a;for(;(a=i.exec(e.html))!==null;)Kn(t,{stepId:e.stepId,file:e.htmlPath,kind:"html-attribute",url:a[1]??a[2]??a[3]??""});let o=/\b(?:srcset|imagesrcset)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'<>`]+))/gi,s;for(;(s=o.exec(e.html))!==null;){let u=s[1]??s[2]??s[3]??"";for(let p of Ip(u))Kn(t,{stepId:e.stepId,file:e.htmlPath,kind:"html-srcset",url:p})}let l=/url\(\s*(?:"([^"]*)"|'([^']*)'|([^)"'\s]+))\s*\)/gi,d;for(;(d=l.exec(e.css))!==null;)Kn(t,{stepId:e.stepId,file:e.htmlPath.replace(/\/index\.html$/,"/document.css"),kind:"css-url",url:d[1]??d[2]??d[3]??""});return[...t.values()]}async function ho(e){let{name:t,steps:n,assets:r}=e;if(n.length===0)throw new Error("No HTML steps captured.");let i=Tp(t),a=new Map;for(let w of r)a.set(w.filename,`${Ve}${w.filename}`);let o={},s=[],l=[],d=new TextEncoder;for(let w=0;w<n.length;w+=1){let T=n[w];if(!T)continue;let I=`s${w+1}`,R=Fi(w+1),k=`snapshots/${R}/index.html`,C=kr(T.cssText??"",a),D=Bi(Wi(an(kr(T.htmlText,a)),C.length>0),T.scroll);o[R]={"index.html":d.encode(D),"document.css":d.encode(C)},l.push(...Rp({stepId:I,htmlPath:k,html:D,css:C})),s.push(Hi({stepId:I,htmlPath:k,naturalWidth:T.viewport.width,naturalHeight:T.viewport.height,scroll:T.scroll,sourceUrl:T.url||void 0,click:Ep(T.click,D)}))}let u=r.map(w=>({id:w.filename,sha256:w.sha256,kind:Cn(w.contentType),contentType:w.contentType,size:w.bytes.byteLength,file:w.filename})),p=Pn({id:ae(),version:1,title:t,steps:s}),h=Nt.parse({version:1,assets:u,screens:[]}),m={version:1,kind:"html-capture",generatedAt:e.generatedAt??new Date().toISOString(),stepCount:n.length,assetCount:r.length,unresolvedExternalReferences:l},x={};for(let w of r)x[w.filename]=w.bytes;let y={"README.md":d.encode(Ap(i,t)),[i]:{"demo.config.json":d.encode(`${JSON.stringify(p,null,2)}
5097
5134
  `),"assets.json":d.encode(`${JSON.stringify(h,null,2)}
5098
- `),"capture-metadata.json":d.encode(`${JSON.stringify(f,null,2)}
5099
- `),snapshots:o,public:w}};return{bytes:dp(x,{level:6}),filename:`${i}.zip`,slug:i}}import{JSDOM as zp}from"jsdom";import{Stagehand as Vb}from"@browserbasehq/stagehand";import{NodeHtmlMarkdown as Zb}from"node-html-markdown";var wp=["button","link","textbox","searchbox","checkbox","radio","combobox","listbox","option","switch","slider","spinbutton","tab","menuitem","menuitemcheckbox","menuitemradio","treeitem"],vp=["navigation","main","banner","contentinfo","complementary","search","form","dialog","alertdialog","menu","menubar","tablist","region"],sn="^\\s*(?:\\[[\\w-]+]\\s*)?",Mb=new RegExp(`${sn}(?:${wp.join("|")})\\b`,"i"),Lb=new RegExp(`${sn}(?:${vp.join("|")})\\b`,"i"),Ob=new RegExp(`${sn}heading\\b`,"i"),jb=new RegExp(`${sn}StaticText\\b`,"i");var zb=new RegExp(`${sn}[\\w-]+(?:,[^:]*)?:\\s`,"i");import Sp from"net";import Qb from"readline";import{rm as ty}from"fs/promises";import{join as qr}from"path";import{homedir as _p}from"os";function Cp(){return qr(process.env.INKLY_CAPTURE_AGENT_HOME||qr(_p(),".inkly"),"capture-agent","sessions")}function Gr(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new Error(`invalid session id: ${e}`);return qr(Cp(),`${e}.nav.sock`)}async function G(e,t,n,r={}){let i=r.connectTimeoutMs??8e3,a=r.requestTimeoutMs??6e4,s={id:`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`,type:"command",command:t,params:n},c=await Tp(e,i);return new Promise((d,u)=>{let p="",h=!1,f=x=>{h||(h=!0,clearTimeout(w),x())},w=setTimeout(()=>{f(()=>{c.destroy(),u(new Error(`nav request "${t}" timed out`))})},a);c.on("data",x=>{p+=x.toString();let _=p.indexOf(`
5100
- `);if(_===-1)return;let I;try{I=JSON.parse(p.slice(0,_))}catch($){f(()=>{c.destroy(),u($ instanceof Error?$:new Error(String($)))});return}if(I.type==="error"){f(()=>{c.end(),u(new Error(I.error))});return}f(()=>{c.end(),d(I.data)})}),c.on("error",x=>{f(()=>u(x))}),c.on("close",()=>{f(()=>u(new Error("nav listener closed without a response")))}),c.write(`${JSON.stringify(s)}
5101
- `)})}async function Tp(e,t){let n=Date.now(),r=null;for(;Date.now()-n<t;)try{return await Ap(e)}catch(i){r=i instanceof Error?i:new Error(String(i)),await new Promise(a=>setTimeout(a,150))}throw new Error(`could not reach the capture listener nav socket at ${e}`+(r?` (${r.message})`:"")+". Is the session started and is its listener ready?")}function Ap(e){return new Promise((t,n)=>{let r=Sp.createConnection(e),i=a=>{r.destroy(),n(a)};r.once("error",i),r.once("connect",()=>{r.off("error",i),t(r)})})}var oo=!1;function Up(){if(oo)return;let{window:e}=new zp("<!doctype html><html></html>"),t=globalThis;t.DOMParser??=e.DOMParser,t.Node??=e.Node,t.NodeFilter??=e.NodeFilter,t.Element??=e.Element,t.HTMLImageElement??=e.HTMLImageElement,oo=!0}var bo=`Options:
5135
+ `),"capture-metadata.json":d.encode(`${JSON.stringify(m,null,2)}
5136
+ `),snapshots:o,public:x}};return{bytes:wp(y,{level:6}),filename:`${i}.zip`,slug:i}}import{JSDOM as Gp}from"jsdom";import{Stagehand as by}from"@browserbasehq/stagehand";import{NodeHtmlMarkdown as xy}from"node-html-markdown";var $p=["button","link","textbox","searchbox","checkbox","radio","combobox","listbox","option","switch","slider","spinbutton","tab","menuitem","menuitemcheckbox","menuitemradio","treeitem"],Dp=["navigation","main","banner","contentinfo","complementary","search","form","dialog","alertdialog","menu","menubar","tablist","region"],dn="^\\s*(?:\\[[\\w-]+]\\s*)?",sy=new RegExp(`${dn}(?:${$p.join("|")})\\b`,"i"),ly=new RegExp(`${dn}(?:${Dp.join("|")})\\b`,"i"),cy=new RegExp(`${dn}heading\\b`,"i"),dy=new RegExp(`${dn}StaticText\\b`,"i");var uy=new RegExp(`${dn}[\\w-]+(?:,[^:]*)?:\\s`,"i");import Np from"net";import Cy from"readline";import{rm as Ay}from"fs/promises";import{join as ai}from"path";import{homedir as Mp}from"os";function Lp(){return ai(process.env.INKLY_CAPTURE_AGENT_HOME||ai(Mp(),".inkly"),"capture-agent","sessions")}function oi(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new Error(`invalid session id: ${e}`);return ai(Lp(),`${e}.nav.sock`)}async function G(e,t,n,r={}){let i=r.connectTimeoutMs??8e3,a=r.requestTimeoutMs??6e4,s={id:`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`,type:"command",command:t,params:n},l=await Op(e,i);return new Promise((d,u)=>{let p="",h=!1,m=y=>{h||(h=!0,clearTimeout(x),y())},x=setTimeout(()=>{m(()=>{l.destroy(),u(new Error(`nav request "${t}" timed out`))})},a);l.on("data",y=>{p+=y.toString();let w=p.indexOf(`
5137
+ `);if(w===-1)return;let T;try{T=JSON.parse(p.slice(0,w))}catch(I){m(()=>{l.destroy(),u(I instanceof Error?I:new Error(String(I)))});return}if(T.type==="error"){m(()=>{l.end(),u(new Error(T.error))});return}m(()=>{l.end(),d(T.data)})}),l.on("error",y=>{m(()=>u(y))}),l.on("close",()=>{m(()=>u(new Error("nav listener closed without a response")))}),l.write(`${JSON.stringify(s)}
5138
+ `)})}async function Op(e,t){let n=Date.now(),r=null;for(;Date.now()-n<t;)try{return await jp(e)}catch(i){r=i instanceof Error?i:new Error(String(i)),await new Promise(a=>setTimeout(a,150))}throw new Error(`could not reach the capture listener nav socket at ${e}`+(r?` (${r.message})`:"")+". Is the session started and is its listener ready?")}function jp(e){return new Promise((t,n)=>{let r=Np.createConnection(e),i=a=>{r.destroy(),n(a)};r.once("error",i),r.once("connect",()=>{r.off("error",i),t(r)})})}var mo=!1;function Kp(){if(mo)return;let{window:e}=new Gp("<!doctype html><html></html>"),t=globalThis;t.DOMParser??=e.DOMParser,t.Node??=e.Node,t.NodeFilter??=e.NodeFilter,t.Element??=e.Element,t.HTMLImageElement??=e.HTMLImageElement,mo=!0}var vo=`Options:
5102
5139
  --url <url> URL to open and arm for recording.
5103
5140
  --name <name> Demo name written into the exported ZIP.
5104
5141
  --session <id> Session id printed by start.
@@ -5118,7 +5155,7 @@ This folder is a self-contained Inkly HTML capture. It works locally with
5118
5155
  done once in this profile survives, so later captures of the same site need
5119
5156
  no re-login. Implies --keep-profile. Run --headed the first time so the user
5120
5157
  can sign in; reuse can run headless.
5121
- --no-unpack On stop, write only the ZIP.`,dn=`inkly capture - capture an image/video walkthrough for an external browser agent
5158
+ --no-unpack On stop, write only the ZIP.`,hn=`inkly capture - capture an image/video walkthrough for an external browser agent
5122
5159
 
5123
5160
  Usage:
5124
5161
  inkly capture start --url <url> --name <name>
@@ -5128,8 +5165,9 @@ Usage:
5128
5165
  inkly capture undo --session <id>
5129
5166
  inkly capture nav <verb> --session <id> (snapshot|click|fill|type|press|select|upload|get|is|wait|back|forward|reload|refs|mouse)
5130
5167
  inkly capture profiles
5168
+ inkly capture ask-user-to-log-in --profile <name> [--url <login-url>]
5131
5169
 
5132
- ${bo}
5170
+ ${vo}
5133
5171
  --video, --record-video Record motion segments. Enabled by default; use --no-video to disable.
5134
5172
  --zoom Apply click zoom/pan to screenshot steps. Enabled by default; use --no-zoom to disable.
5135
5173
  --compress-images Re-encode captured PNG/JPEG screenshots to WebP (smaller, near-lossless).
@@ -5138,7 +5176,7 @@ ${bo}
5138
5176
  Output:
5139
5177
  Every subcommand prints JSON. This command does not accept prompts and does not plan or drive the page.
5140
5178
  For self-contained HTML snapshot capture, use \`inkly capture-html\`.
5141
- `,un=`inkly capture-html - capture a self-contained HTML walkthrough for an external browser agent
5179
+ `,mn=`inkly capture-html - capture a self-contained HTML walkthrough for an external browser agent
5142
5180
 
5143
5181
  Usage:
5144
5182
  inkly capture-html start --url <url> --name <name>
@@ -5148,48 +5186,73 @@ Usage:
5148
5186
  inkly capture-html undo --session <id>
5149
5187
  inkly capture-html nav <verb> --session <id> (snapshot|click|fill|type|press|select|upload|get|is|wait|back|forward|reload|refs|mouse)
5150
5188
  inkly capture-html profiles
5189
+ inkly capture-html ask-user-to-log-in --profile <name> [--url <login-url>]
5151
5190
 
5152
- ${bo}
5191
+ ${vo}
5153
5192
  --block-videos Replace <video> with its poster frame instead of inlining the video.
5154
5193
 
5155
5194
  Output:
5156
5195
  Every subcommand prints JSON. This command does not accept prompts and does not plan or drive the page.
5157
- `,Fp=Zn(go(import.meta.url)),Hp=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/opt/google/chrome/chrome"],Bp=1440,Wp=900,Vp=12e4;var Jp=720,Zp=60,Ay=Math.round(Jp/Zp);function Bt(e){return new Promise(t=>setTimeout(t,e))}function Q(e){process.stdout.write(`${JSON.stringify(e,null,2)}
5158
- `)}function Se(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))return;let n=e[t];return typeof n=="string"?n:""}function Kr(e,t,n){let r=e[t];return typeof r=="number"?r:typeof r=="string"&&r.trim()?Number(r):n}function Ft(e,t,n){for(let r of t)if(Object.prototype.hasOwnProperty.call(e,r))return e[r]!==!1;return n}function qp(e){if(!e)return null;let t=/^\s*(\d+)\s*[x,]\s*(\d+)\s*$/i.exec(e);if(!t)throw new Error("--window-size must look like 1440x900");return{width:Number(t[1]),height:Number(t[2])}}function Ge(e,t,n){let r=Se(e,t);if(!r)throw new Error(`missing --${t} <value>
5196
+ `,Yp=nr(wo(import.meta.url)),Xp=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/opt/google/chrome/chrome"],So=1440,_o=900,Qp=12e4;var eh=720,th=60,Qy=Math.round(eh/th);function _t(e){return new Promise(t=>setTimeout(t,e))}function K(e){process.stdout.write(`${JSON.stringify(e,null,2)}
5197
+ `)}function se(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))return;let n=e[t];return typeof n=="string"?n:""}function qt(e,t,n){let r=e[t];return typeof r=="number"?r:typeof r=="string"&&r.trim()?Number(r):n}function Jt(e,t,n){for(let r of t)if(Object.prototype.hasOwnProperty.call(e,r))return e[r]!==!1;return n}function Co(e){if(!e)return null;let t=/^\s*(\d+)\s*[x,]\s*(\d+)\s*$/i.exec(e);if(!t)throw new Error("--window-size must look like 1440x900");return{width:Number(t[1]),height:Number(t[2])}}function Xe(e,t,n){let r=se(e,t);if(!r)throw new Error(`missing --${t} <value>
5159
5198
 
5160
- ${n}`);return r}function Gp(e){return Se(e,"connect-to-browser")??process.env.INKLY_CAPTURE_BROWSER_URL}function Kp(e){if(Object.prototype.hasOwnProperty.call(e,"prompt"))throw new Error("inkly capture does not accept --prompt. The external agent owns planning.")}function qn(e,t){return fo(t)?t:Wn(e,t)}function yo(){return W(ti(),".inkly","capture-agent","profiles")}function Yp(e,t){if(t.includes("/")||fo(t))return qn(e,t);let n=t.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64);return W(yo(),n||"default")}function so(e,t){let n=Wn(e);for(;;){let r=W(n,t);if(je(r))return r;let i=Zn(n);if(i===n)return null;n=i}}async function lo(e){let t=[e];for(;t.length>0;){let n=t.pop();if(!n)continue;let r=await ho(n,{withFileTypes:!0}).catch(()=>[]);for(let i of r){let a=W(n,i.name);if(i.isDirectory()){t.push(a);continue}if(i.name==="Google Chrome for Testing"&&a.includes("Google Chrome for Testing.app/Contents/MacOS"))return a}}return null}async function Xp(e,t){if(t){let s=qn(e,t);if(je(s))return s;throw new Error(`Chrome binary does not exist: ${s}`)}let n=process.env.CHROME_PATH;if(n&&je(n))return n;let r=Hp.find(s=>je(s));if(r)return r;let i=so(e,"chrome");if(i){let s=await lo(i);if(s)return s}let a=so(Fp,"chrome");if(a&&a!==i){let s=await lo(a);if(s)return s}let o=["/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Chromium.app/Contents/MacOS/Chromium","/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"];for(let s of o)if(je(s))return s;throw new Error("No Chrome binary found. Pass --browser /path/to/chrome.")}var Vn=class{constructor(t){this.nextId=1;this.pending=new Map;this.listeners=new Map;this.ws=new Lp(t,{perMessageDeflate:!1,maxPayload:512*1024*1024}),this.ready=new Promise((n,r)=>{this.ws.once("open",()=>n()),this.ws.once("error",i=>r(i))}),this.ws.on("message",n=>{let r=JSON.parse(n.toString());if(typeof r.id=="number"&&this.pending.has(r.id)){let a=this.pending.get(r.id);if(this.pending.delete(r.id),!a)return;r.error?a.reject(new Error(`${r.error.message??"CDP error"}: ${JSON.stringify(r.error.data??"")}`)):a.resolve(r.result??{});return}if(!r.method)return;let i=this.listeners.get(r.method);if(i)for(let a of i)a(r.params,r.sessionId)})}async send(t,n={},r){await this.ready;let i=this.nextId;this.nextId+=1;let a={id:i,method:t,params:n};return r&&(a.sessionId=r),new Promise((o,s)=>{this.pending.set(i,{resolve:o,reject:s}),this.ws.send(JSON.stringify(a),c=>{c&&(this.pending.delete(i),s(c))})})}on(t,n){let r=this.listeners.get(t)??new Set;return r.add(n),this.listeners.set(t,r),()=>r.delete(n)}close(){try{this.ws.close()}catch{}}};async function xo(e,t,n,r=3e4){let i=await e.send("Runtime.evaluate",{expression:n,awaitPromise:!0,returnByValue:!0,timeout:r,userGesture:!0},t);if(i.exceptionDetails)throw new Error(`Runtime.evaluate failed: ${JSON.stringify(i.exceptionDetails)}`);return i.result?.value}async function Qp(e,t){let r=(await e.send("Target.attachToTarget",{targetId:t,flatten:!0})).sessionId;if(typeof r!="string")throw new Error("Target.attachToTarget returned no sessionId");return r}async function eh(e){let t=e.userDataDir?(await Ht(e.userDataDir,{recursive:!0}),e.userDataDir):await Rp(W(Dp(),"inkly-capture-agent-")),n=W(t,"chrome.log"),r=await po(n,"a"),i=["--remote-debugging-port=0",`--user-data-dir=${t}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-default-apps","--disable-background-networking","--disable-features=Translate,AutofillServerCommunication","--use-mock-keychain","--hide-scrollbars","--hide-crash-restore-bubble"];e.headless&&i.unshift("--headless=new");for(let p of["DevToolsActivePort","SingletonLock","SingletonCookie","SingletonSocket"])await fe(W(t,p),{force:!0}).catch(()=>{});let a=uo(e.browser,i,{detached:!0,stdio:["ignore",r.fd,r.fd]});a.unref(),await r.close();let o=W(t,"DevToolsActivePort"),s=Date.now(),c;a.once("exit",p=>{c=p});let d=!e.userDataDir,u=async p=>{let h=await _e(n,"utf8").then(f=>f.split(`
5199
+ ${n}`);return r}function To(e){return se(e,"connect-to-browser")??process.env.INKLY_CAPTURE_BROWSER_URL}function nh(e){if(Object.prototype.hasOwnProperty.call(e,"prompt"))throw new Error("inkly capture does not accept --prompt. The external agent owns planning.")}function rr(e,t){return ko(t)?t:Zt(e,t)}function Ao(){return F(pi(),".inkly","capture-agent","profiles")}function Po(e,t){if(t.includes("/")||ko(t))return rr(e,t);let n=t.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64);return F(Ao(),n||"default")}function fo(e,t){let n=Zt(e);for(;;){let r=F(n,t);if(ye(r))return r;let i=nr(n);if(i===n)return null;n=i}}async function go(e){let t=[e];for(;t.length>0;){let n=t.pop();if(!n)continue;let r=await ui(n,{withFileTypes:!0}).catch(()=>[]);for(let i of r){let a=F(n,i.name);if(i.isDirectory()){t.push(a);continue}if(i.name==="Google Chrome for Testing"&&a.includes("Google Chrome for Testing.app/Contents/MacOS"))return a}}return null}async function Io(e,t){if(t){let s=rr(e,t);if(ye(s))return s;throw new Error(`Chrome binary does not exist: ${s}`)}let n=process.env.CHROME_PATH;if(n&&ye(n))return n;let r=Xp.find(s=>ye(s));if(r)return r;let i=fo(e,"chrome");if(i){let s=await go(i);if(s)return s}let a=fo(Yp,"chrome");if(a&&a!==i){let s=await go(a);if(s)return s}let o=["/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Chromium.app/Contents/MacOS/Chromium","/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"];for(let s of o)if(ye(s))return s;throw new Error("No Chrome binary found. Pass --browser /path/to/chrome.")}var Xn=class{constructor(t){this.nextId=1;this.pending=new Map;this.listeners=new Map;this.ws=new Jp(t,{perMessageDeflate:!1,maxPayload:512*1024*1024}),this.ready=new Promise((n,r)=>{this.ws.once("open",()=>n()),this.ws.once("error",i=>r(i))}),this.ws.on("message",n=>{let r=JSON.parse(n.toString());if(typeof r.id=="number"&&this.pending.has(r.id)){let a=this.pending.get(r.id);if(this.pending.delete(r.id),!a)return;r.error?a.reject(new Error(`${r.error.message??"CDP error"}: ${JSON.stringify(r.error.data??"")}`)):a.resolve(r.result??{});return}if(!r.method)return;let i=this.listeners.get(r.method);if(i)for(let a of i)a(r.params,r.sessionId)})}async send(t,n={},r){await this.ready;let i=this.nextId;this.nextId+=1;let a={id:i,method:t,params:n};return r&&(a.sessionId=r),new Promise((o,s)=>{this.pending.set(i,{resolve:o,reject:s}),this.ws.send(JSON.stringify(a),l=>{l&&(this.pending.delete(i),s(l))})})}on(t,n){let r=this.listeners.get(t)??new Set;return r.add(n),this.listeners.set(t,r),()=>r.delete(n)}close(){try{this.ws.close()}catch{}}};async function Eo(e,t,n,r=3e4){let i=await e.send("Runtime.evaluate",{expression:n,awaitPromise:!0,returnByValue:!0,timeout:r,userGesture:!0},t);if(i.exceptionDetails)throw new Error(`Runtime.evaluate failed: ${JSON.stringify(i.exceptionDetails)}`);return i.result?.value}async function rh(e,t){let r=(await e.send("Target.attachToTarget",{targetId:t,flatten:!0})).sessionId;if(typeof r!="string")throw new Error("Target.attachToTarget returned no sessionId");return r}async function ih(e){let t=e.userDataDir?(await St(e.userDataDir,{recursive:!0}),e.userDataDir):await Fp(F(Bp(),"inkly-capture-agent-")),n=F(t,"chrome.log"),r=await di(n,"a"),i=["--remote-debugging-port=0",`--user-data-dir=${t}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-default-apps","--disable-background-networking","--disable-features=Translate,AutofillServerCommunication","--use-mock-keychain","--hide-scrollbars","--hide-crash-restore-bubble"];e.headless&&i.unshift("--headless=new");for(let p of["DevToolsActivePort","SingletonLock","SingletonCookie","SingletonSocket"])await ce(F(t,p),{force:!0}).catch(()=>{});let a=ci(e.browser,i,{detached:!0,stdio:["ignore",r.fd,r.fd]});a.unref(),await r.close();let o=F(t,"DevToolsActivePort"),s=Date.now(),l;a.once("exit",p=>{l=p});let d=!e.userDataDir,u=async p=>{let h=await Te(n,"utf8").then(m=>m.split(`
5161
5200
  `).filter(Boolean).slice(-10).join(`
5162
- `)).catch(()=>"");throw a.pid&&await Xr(a.pid).catch(()=>{}),await wo(t).catch(()=>{}),d&&await fe(t,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),new Error(`${p} Chrome log (${n}):
5163
- ${h||"(empty \u2014 Chrome wrote nothing)"}`)};for(;Date.now()-s<2e4;){if(c!==void 0)return u("Chrome exited before DevTools was ready.");let p=await _e(o,"utf8").catch(()=>null);if(p){let h=p.trim().split(/\r?\n/),f=h[0],w=h[1];if(f&&w)return{pid:a.pid??null,profileDir:t,wsUrl:`ws://127.0.0.1:${f}${w}`,debuggingUrl:`http://127.0.0.1:${f}`,logPath:n}}await Bt(100)}return u("Timed out waiting for Chrome DevTools.")}async function th(e){if(e.startsWith("ws://")||e.startsWith("wss://")){let i=new URL(e);return{wsUrl:e,debuggingUrl:`${i.protocol==="wss:"?"https":"http"}://${i.host}`}}let t=new URL(e),n=await fetch(new URL("/json/version",t));if(!n.ok)throw new Error(`could not read Chrome DevTools metadata from ${t.toString()}: ${n.status}`);let r=await n.json();if(typeof r.webSocketDebuggerUrl!="string")throw new Error("Chrome DevTools metadata did not include webSocketDebuggerUrl");return{wsUrl:r.webSocketDebuggerUrl,debuggingUrl:`${t.protocol}//${t.host}`}}async function nh(e,t,n,r,i){let o=(await e.send("Target.createTarget",{url:"about:blank"})).targetId;if(typeof o!="string")throw new Error("Target.createTarget returned no targetId");let s=await Qp(e,o);await e.send("Page.enable",{},s),await e.send("Runtime.enable",{},s),await ih(e,s,o,n,r);let c=!1,d=e.on("Page.loadEventFired",(p,h)=>{h===s&&(c=!0)});await e.send("Page.navigate",{url:t},s);let u=Date.now();for(;!c&&Date.now()-u<i;)await Bt(100);return d(),await Bt(1e3),{targetId:o,sessionId:s}}async function rh(e,t){let n=await xo(e,t,`JSON.stringify({
5201
+ `)).catch(()=>"");throw a.pid&&await pn(a.pid).catch(()=>{}),await er(t).catch(()=>{}),d&&await ce(t,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),new Error(`${p} Chrome log (${n}):
5202
+ ${h||"(empty \u2014 Chrome wrote nothing)"}`)};for(;Date.now()-s<2e4;){if(l!==void 0)return u("Chrome exited before DevTools was ready.");let p=await Te(o,"utf8").catch(()=>null);if(p){let h=p.trim().split(/\r?\n/),m=h[0],x=h[1];if(m&&x)return{pid:a.pid??null,profileDir:t,wsUrl:`ws://127.0.0.1:${m}${x}`,debuggingUrl:`http://127.0.0.1:${m}`,logPath:n}}await _t(100)}return u("Timed out waiting for Chrome DevTools.")}async function ah(e){if(e.startsWith("ws://")||e.startsWith("wss://")){let i=new URL(e);return{wsUrl:e,debuggingUrl:`${i.protocol==="wss:"?"https":"http"}://${i.host}`}}let t=new URL(e),n=await fetch(new URL("/json/version",t));if(!n.ok)throw new Error(`could not read Chrome DevTools metadata from ${t.toString()}: ${n.status}`);let r=await n.json();if(typeof r.webSocketDebuggerUrl!="string")throw new Error("Chrome DevTools metadata did not include webSocketDebuggerUrl");return{wsUrl:r.webSocketDebuggerUrl,debuggingUrl:`${t.protocol}//${t.host}`}}async function oh(e,t,n,r,i){let o=(await e.send("Target.createTarget",{url:"about:blank"})).targetId;if(typeof o!="string")throw new Error("Target.createTarget returned no targetId");let s=await rh(e,o);await e.send("Page.enable",{},s),await e.send("Runtime.enable",{},s),await lh(e,s,o,n,r);let l=!1,d=e.on("Page.loadEventFired",(p,h)=>{h===s&&(l=!0)});await e.send("Page.navigate",{url:t},s);let u=Date.now();for(;!l&&Date.now()-u<i;)await _t(100);return d(),await _t(1e3),{targetId:o,sessionId:s}}async function sh(e,t){let n=await Eo(e,t,`JSON.stringify({
5164
5203
  innerWidth: window.innerWidth,
5165
5204
  innerHeight: window.innerHeight,
5166
5205
  outerWidth: window.outerWidth,
5167
5206
  outerHeight: window.outerHeight
5168
- })`,5e3),r=JSON.parse(String(n)),i={innerWidth:Number(r.innerWidth),innerHeight:Number(r.innerHeight),outerWidth:Number(r.outerWidth),outerHeight:Number(r.outerHeight)};if(!Number.isFinite(i.innerWidth)||!Number.isFinite(i.innerHeight)||!Number.isFinite(i.outerWidth)||!Number.isFinite(i.outerHeight))throw new Error(`could not measure Chrome viewport: ${JSON.stringify(r)}`);return i}async function ih(e,t,n,r,i){try{let o=(await e.send("Browser.getWindowForTarget",{targetId:n})).windowId;if(typeof o!="number")throw new Error("Browser.getWindowForTarget returned no windowId");for(let s=0;s<4;s+=1){let c=await rh(e,t),d=Math.max(0,c.outerWidth-c.innerWidth),u=Math.max(0,c.outerHeight-c.innerHeight),p=r+d,h=i+u;if(Math.abs(c.innerWidth-r)<=1&&Math.abs(c.innerHeight-i)<=1)return;await e.send("Browser.setWindowBounds",{windowId:o,bounds:{windowState:"normal",width:p,height:h}}),await Bt(250)}}catch{}await e.send("Emulation.setDeviceMetricsOverride",{width:r,height:i,deviceScaleFactor:1,mobile:!1},t).catch(()=>{}),await Bt(100)}function ah(e){return e.toLowerCase().replace(/['"]/g,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"captured-demo"}function oh(e){return`${ah(e)}-${Math.random().toString(36).slice(2,8)}`}function ni(e){return Ip("sha256").update(e).digest("hex")}function sh(e,t){return`# ${t}
5207
+ })`,5e3),r=JSON.parse(String(n)),i={innerWidth:Number(r.innerWidth),innerHeight:Number(r.innerHeight),outerWidth:Number(r.outerWidth),outerHeight:Number(r.outerHeight)};if(!Number.isFinite(i.innerWidth)||!Number.isFinite(i.innerHeight)||!Number.isFinite(i.outerWidth)||!Number.isFinite(i.outerHeight))throw new Error(`could not measure Chrome viewport: ${JSON.stringify(r)}`);return i}async function lh(e,t,n,r,i){try{let o=(await e.send("Browser.getWindowForTarget",{targetId:n})).windowId;if(typeof o!="number")throw new Error("Browser.getWindowForTarget returned no windowId");for(let s=0;s<4;s+=1){let l=await sh(e,t),d=Math.max(0,l.outerWidth-l.innerWidth),u=Math.max(0,l.outerHeight-l.innerHeight),p=r+d,h=i+u;if(Math.abs(l.innerWidth-r)<=1&&Math.abs(l.innerHeight-i)<=1)return;await e.send("Browser.setWindowBounds",{windowId:o,bounds:{windowState:"normal",width:p,height:h}}),await _t(250)}}catch{}await e.send("Emulation.setDeviceMetricsOverride",{width:r,height:i,deviceScaleFactor:1,mobile:!1},t).catch(()=>{}),await _t(100)}function ch(e){return e.toLowerCase().replace(/['"]/g,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"captured-demo"}function dh(e){return`${ch(e)}-${Math.random().toString(36).slice(2,8)}`}function hi(e){return Up("sha256").update(e).digest("hex")}function uh(e,t){return`# ${t}
5208
+
5209
+ This is a self-contained Inkly demo. Everything it needs is in this
5210
+ folder \u2014 no hub and no upload required to preview it.
5211
+
5212
+ ## Preview it
5213
+
5214
+ Install the CLI once, then point \`inkly dev\` at this folder \u2014 no
5215
+ \`inkly init\` needed:
5169
5216
 
5170
- This folder is a self-contained Inkly demo captured with the Inkly CLI
5171
- agent runtime. It works locally with \`inkly-cli\` \u2014 no upload needed.
5217
+ \`\`\`bash
5218
+ npm install -g @inkly-org/cli
5219
+ inkly dev ${e}
5220
+ \`\`\`
5172
5221
 
5173
- ## Use it
5222
+ It serves at http://localhost:3000.
5174
5223
 
5175
- 1. Copy the \`${e}/\` folder from this zip into your hub's \`demos/\`
5176
- directory.
5224
+ ## Host it in a hub
5177
5225
 
5178
- 2. Preview it:
5226
+ To keep all your demos together as a collection and sync them with the
5227
+ Inkly platform, scaffold a hub and import this demo into it. \`inkly add
5228
+ --from\` copies the folder into \`demos/\` and registers it in a collection
5229
+ (plain \`cp\` would leave it out of the hub index):
5179
5230
 
5180
- \`\`\`bash
5181
- inkly dev
5182
- \`\`\`
5231
+ \`\`\`bash
5232
+ inkly init my-hub
5233
+ cd my-hub
5234
+ inkly add ${e} --from ../${e} --collection Main
5235
+ inkly login # connect your Inkly account
5236
+ inkly sync # upload assets to the CDN
5237
+ \`\`\`
5238
+
5239
+ ## Publish a shareable link
5240
+
5241
+ From inside the hub (and once logged in), freeze this demo to a
5242
+ standalone, hosted \`/p/<id>\` URL you can share with anyone:
5243
+
5244
+ \`\`\`bash
5245
+ inkly snapshot --demo ${e}
5246
+ \`\`\`
5183
5247
 
5184
5248
  ## What's inside
5185
5249
 
5186
5250
  - \`${e}/demo.config.json\` \u2014 the demo definition.
5187
5251
  - \`${e}/assets.json\` \u2014 maps each \`asset:<id>\` to a file in \`public/\`.
5188
5252
  - \`${e}/public/<file>\` \u2014 captured image/video bytes.
5189
- - \`${e}/snapshots/snap-NNN/index.html\` \u2014 captured HTML snapshots, when present.
5190
- `}function lh(e){switch(e.toLowerCase().split(";")[0]?.trim()){case"image/png":return"png";case"image/jpeg":case"image/jpg":return"jpg";case"image/webp":return"webp";case"image/gif":return"gif";case"image/svg+xml":return"svg";case"image/avif":return"avif";case"image/x-icon":case"image/vnd.microsoft.icon":return"ico";case"font/woff":return"woff";case"font/woff2":return"woff2";case"font/ttf":case"application/x-font-ttf":return"ttf";case"video/webm":return"webm";case"video/mp4":return"mp4";case"audio/mpeg":return"mp3";case"text/html":return"html";case"text/css":return"css";case"text/javascript":case"application/javascript":case"application/x-javascript":return"js";default:return"bin"}}async function ch(e,t,n,r,i){let a=new TextDecoder,o=new TextEncoder,s=new Map,c=0,d=0,u=0,p=" ";if(i.subsetFonts){let h=new Set;for(let f of Object.values(r)){let w=f["index.html"];if(!w)continue;let x=a.decode(w).replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<[^>]+>/g," ");for(let _ of x)h.add(_)}for(let f of" 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.,:;!?@#$%&*()-_=+[]{}/\\|<>'\"`~\u2019\u201C\u201D\u2014\u2013\u2026\u2022\u2192")h.add(f);p=Array.from(h).join("")}for(let h of t){let f=h.publicUrl;if(!f)continue;let w=f.split("/").pop();if(!w)continue;let x=n[w];if(!x)continue;let _=null,I="",$="",R=(h.contentType??"").toLowerCase();try{if(i.compressImages&&h.kind==="image"&&/^image\/(png|jpe?g)$/.test(R)){let V=await Op(Buffer.from(x)).webp({quality:80}).toBuffer();V.length<x.byteLength&&(_=V,I="webp",$="image/webp")}else if(i.subsetFonts&&h.kind==="font"){let V=await jp(Buffer.from(x),p,{targetFormat:"woff2"});V.length<x.byteLength&&(_=V,I="woff2",$="font/woff2")}}catch{_=null}if(!_)continue;let b=new Uint8Array(_),z=ni(b),U=`${z.slice(0,16)}.${I}`,D=`/${e}/${U}`;u+=x.byteLength-b.byteLength,h.kind==="image"?c+=1:d+=1,delete n[w],n[U]=b,h.id===w&&(h.id=U),s.set(f,D),h.sha256=z,h.size=b.byteLength,h.contentType=$,h.publicUrl=D}if(s.size)for(let h of Object.values(r)){let f=h;for(let w of Object.keys(f)){let x=a.decode(f[w]);for(let[_,I]of s)x=x.split(_).join(I);f[w]=o.encode(x)}}return{images:c,fonts:d,savedBytes:u}}async function dh(e){let{name:t,screens:n,autoApplyZoom:r=!0,compressImages:i=!1,subsetFonts:a=!1}=e;if(n.length===0)throw new Error("No screens captured.");let o=oh(t),s=[],c=[],d={},u={},p=[],h=[],f=new TextEncoder,w=0;async function x(R,b,z,U,D){let V=ni(R),ne=D??`${V}.${lh(b)}`;d[ne]=R,w+=1;let Ce=z==="other"?ne:`cap-${String(w).padStart(3,"0")}`;return s.push({id:Ce,sha256:V,kind:z==="other"?kn(b):z,contentType:b,size:R.byteLength,viewport:U?{w:U.width,h:U.height}:void 0,file:ne}),Ce}for(let[R,b]of n.entries()){let z=`s${R+1}`,U=null;if(b.kind!=="html"){if(b.kind==="video"&&b.videoPath){let D=new Uint8Array(await _e(b.videoPath));U=await x(D,"video/webm","video",b.viewport);let V;if(b.posterPngPath){let ne=new Uint8Array(await _e(b.posterPngPath));V=await x(ne,"image/png","image",b.viewport)}p.push(sr({stepId:z,kind:"video",assetId:U,posterAssetId:V,naturalWidth:b.naturalSize.width,naturalHeight:b.naturalSize.height,sourceUrl:b.sourceUrl||void 0,title:b.title||void 0,click:b.click,autoApplyZoom:r,isLast:R===n.length-1})),h.push(b.click?.label||b.title||`Step ${R+1}`)}else{if(!b.pngPath)continue;let D=new Uint8Array(await _e(b.pngPath));U=await x(D,"image/png","image",b.viewport),p.push(sr({stepId:z,kind:"image",assetId:U,naturalWidth:b.naturalSize.width,naturalHeight:b.naturalSize.height,sourceUrl:b.sourceUrl||void 0,title:b.title||void 0,click:b.click,autoApplyZoom:r,isLast:R===n.length-1})),h.push(b.click?.label||b.title||`Step ${R+1}`)}c.push({index:R,id:Ei(R),assetId:U,sourceUrl:b.sourceUrl,capturedAt:b.capturedAt,naturalWidth:b.naturalSize.width,naturalHeight:b.naturalSize.height,precedingClick:b.click})}}if(p.length===0)throw new Error("No usable screens captured.");(i||a)&&await ch(o,s,d,u,{compressImages:i,subsetFonts:a});let _=Sn({id:oe(),version:1,title:t,steps:p}),I=Rt.parse({version:1,assets:s,screens:c}),$={"README.md":f.encode(sh(o,t)),[o]:{"demo.config.json":f.encode(`${JSON.stringify(_,null,2)}
5191
- `),"assets.json":f.encode(`${JSON.stringify(I,null,2)}
5192
- `),public:d,snapshots:u}};return{bytes:Mp($,{level:6}),filename:`${o}.zip`,slug:o,stepCount:n.length,labels:h}}function uh(e){return e?{x:e.x,y:e.y,alphaId:e.alphaId??void 0,label:e.label}:null}async function ph(e){let{name:t,screens:n}=e,r=n.filter(c=>c.kind==="html"&&c.htmlPath);if(r.length===0)throw new Error("No HTML screens captured.");let i=r.map((c,d)=>c.click?.label||c.title||`Step ${d+1}`);Up();let a=[],o=new Map;for(let c of r){let d=await _e(c.htmlPath,"utf8"),u=await io(d,c.sourceUrl||"");for(let p of u.assets)o.has(p.filename)||o.set(p.filename,{filename:p.filename,sha256:ni(p.bytes),contentType:p.contentType,bytes:p.bytes});a.push({htmlText:u.html,cssText:u.css,viewport:{width:c.naturalSize.width,height:c.naturalSize.height},scroll:c.scroll??{x:0,y:0,maxX:0,maxY:0},url:c.sourceUrl||"",click:uh(c.click)})}return{...await ao({name:t,steps:a,assets:[...o.values()]}),stepCount:r.length,labels:i}}var co=`(() => {
5253
+ `}function ph(e){switch(e.toLowerCase().split(";")[0]?.trim()){case"image/png":return"png";case"image/jpeg":case"image/jpg":return"jpg";case"image/webp":return"webp";case"image/gif":return"gif";case"image/svg+xml":return"svg";case"image/avif":return"avif";case"image/x-icon":case"image/vnd.microsoft.icon":return"ico";case"font/woff":return"woff";case"font/woff2":return"woff2";case"font/ttf":case"application/x-font-ttf":return"ttf";case"video/webm":return"webm";case"video/mp4":return"mp4";case"audio/mpeg":return"mp3";case"text/html":return"html";case"text/css":return"css";case"text/javascript":case"application/javascript":case"application/x-javascript":return"js";default:return"bin"}}async function hh(e,t,n,r,i){let a=new TextDecoder,o=new TextEncoder,s=new Map,l=0,d=0,u=0,p=" ";if(i.subsetFonts){let h=new Set;for(let m of Object.values(r)){let x=m["index.html"];if(!x)continue;let y=a.decode(x).replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<[^>]+>/g," ");for(let w of y)h.add(w)}for(let m of" 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.,:;!?@#$%&*()-_=+[]{}/\\|<>'\"`~\u2019\u201C\u201D\u2014\u2013\u2026\u2022\u2192")h.add(m);p=Array.from(h).join("")}for(let h of t){let m=h.publicUrl;if(!m)continue;let x=m.split("/").pop();if(!x)continue;let y=n[x];if(!y)continue;let w=null,T="",I="",R=(h.contentType??"").toLowerCase();try{if(i.compressImages&&h.kind==="image"&&/^image\/(png|jpe?g)$/.test(R)){let W=await qp(Buffer.from(y)).webp({quality:80}).toBuffer();W.length<y.byteLength&&(w=W,T="webp",I="image/webp")}else if(i.subsetFonts&&h.kind==="font"){let W=await Zp(Buffer.from(y),p,{targetFormat:"woff2"});W.length<y.byteLength&&(w=W,T="woff2",I="font/woff2")}}catch{w=null}if(!w)continue;let k=new Uint8Array(w),C=hi(k),D=`${C.slice(0,16)}.${T}`,A=`/${e}/${D}`;u+=y.byteLength-k.byteLength,h.kind==="image"?l+=1:d+=1,delete n[x],n[D]=k,h.id===x&&(h.id=D),s.set(m,A),h.sha256=C,h.size=k.byteLength,h.contentType=I,h.publicUrl=A}if(s.size)for(let h of Object.values(r)){let m=h;for(let x of Object.keys(m)){let y=a.decode(m[x]);for(let[w,T]of s)y=y.split(w).join(T);m[x]=o.encode(y)}}return{images:l,fonts:d,savedBytes:u}}async function mh(e){let{name:t,screens:n,autoApplyZoom:r=!0,compressImages:i=!1,subsetFonts:a=!1}=e;if(n.length===0)throw new Error("No screens captured.");let o=dh(t),s=[],l=[],d={},u={},p=[],h=[],m=new TextEncoder,x=0;async function y(R,k,C,D,A){let W=hi(R),Y=A??`${W}.${ph(k)}`;d[Y]=R,x+=1;let de=C==="other"?Y:`cap-${String(x).padStart(3,"0")}`;return s.push({id:de,sha256:W,kind:C==="other"?Cn(k):C,contentType:k,size:R.byteLength,viewport:D?{w:D.width,h:D.height}:void 0,file:Y}),de}for(let[R,k]of n.entries()){let C=`s${R+1}`,D=null;if(k.kind!=="html"){if(k.kind==="video"&&k.videoPath){let A=new Uint8Array(await Te(k.videoPath));D=await y(A,"video/webm","video",k.viewport);let W;if(k.posterPngPath){let Y=new Uint8Array(await Te(k.posterPngPath));W=await y(Y,"image/png","image",k.viewport)}p.push(xr({stepId:C,kind:"video",assetId:D,posterAssetId:W,naturalWidth:k.naturalSize.width,naturalHeight:k.naturalSize.height,sourceUrl:k.sourceUrl||void 0,title:k.title||void 0,click:k.click,autoApplyZoom:r,isLast:R===n.length-1})),h.push(k.click?.label||k.title||`Step ${R+1}`)}else{if(!k.pngPath)continue;let A=new Uint8Array(await Te(k.pngPath));D=await y(A,"image/png","image",k.viewport),p.push(xr({stepId:C,kind:"image",assetId:D,naturalWidth:k.naturalSize.width,naturalHeight:k.naturalSize.height,sourceUrl:k.sourceUrl||void 0,title:k.title||void 0,click:k.click,autoApplyZoom:r,isLast:R===n.length-1})),h.push(k.click?.label||k.title||`Step ${R+1}`)}l.push({index:R,id:zi(R),assetId:D,sourceUrl:k.sourceUrl,capturedAt:k.capturedAt,naturalWidth:k.naturalSize.width,naturalHeight:k.naturalSize.height,precedingClick:k.click})}}if(p.length===0)throw new Error("No usable screens captured.");(i||a)&&await hh(o,s,d,u,{compressImages:i,subsetFonts:a});let w=Pn({id:ae(),version:1,title:t,steps:p}),T=Nt.parse({version:1,assets:s,screens:l}),I={"README.md":m.encode(uh(o,t)),[o]:{"demo.config.json":m.encode(`${JSON.stringify(w,null,2)}
5254
+ `),"assets.json":m.encode(`${JSON.stringify(T,null,2)}
5255
+ `),public:d,snapshots:u}};return{bytes:Vp(I,{level:6}),filename:`${o}.zip`,slug:o,stepCount:n.length,labels:h}}function fh(e){return e?{x:e.x,y:e.y,alphaId:e.alphaId??void 0,label:e.label}:null}async function gh(e){let{name:t,screens:n}=e,r=n.filter(l=>l.kind==="html"&&l.htmlPath);if(r.length===0)throw new Error("No HTML screens captured.");let i=r.map((l,d)=>l.click?.label||l.title||`Step ${d+1}`);Kp();let a=[],o=new Map;for(let l of r){let d=await Te(l.htmlPath,"utf8"),u=await po(d,l.sourceUrl||"");for(let p of u.assets)o.has(p.filename)||o.set(p.filename,{filename:p.filename,sha256:hi(p.bytes),contentType:p.contentType,bytes:p.bytes});a.push({htmlText:u.html,cssText:u.css,viewport:{width:l.naturalSize.width,height:l.naturalSize.height},scroll:l.scroll??{x:0,y:0,maxX:0,maxY:0},url:l.sourceUrl||"",click:fh(l.click)})}return{...await ho({name:t,steps:a,assets:[...o.values()]}),stepCount:r.length,labels:i}}var bo=`(() => {
5193
5256
  if (window.__inklyCliRecorderInstalled) return;
5194
5257
  window.__inklyCliRecorderInstalled = true;
5195
5258
  window.__inklyCliLastClick = null;
@@ -5373,7 +5436,7 @@ function selectorFor(el) {
5373
5436
  window.addEventListener("scroll", onMotionScroll, true);
5374
5437
  window.addEventListener("wheel", onMotionScroll, true);
5375
5438
  window.addEventListener("touchmove", onMotionScroll, true);
5376
- })();`;async function hh(e,t,n=!1){n&&(await e.send("Runtime.addBinding",{name:"__inklyCliCaptureEvent"},t).catch(()=>{}),await e.send("Runtime.addBinding",{name:"__inklyCliCaptureClick"},t).catch(()=>{})),await e.send("Page.addScriptToEvaluateOnNewDocument",{source:co},t),await xo(e,t,co,5e3).catch(()=>{})}var mh="__inklySingleFileFetch",Py=`(() => {
5439
+ })();`;async function bh(e,t,n=!1){n&&(await e.send("Runtime.addBinding",{name:"__inklyCliCaptureEvent"},t).catch(()=>{}),await e.send("Runtime.addBinding",{name:"__inklyCliCaptureClick"},t).catch(()=>{})),await e.send("Page.addScriptToEvaluateOnNewDocument",{source:bo},t),await Eo(e,t,bo,5e3).catch(()=>{})}var yh="__inklySingleFileFetch",ex=`(() => {
5377
5440
  if (globalThis.__inklyFetchInstalled) return;
5378
5441
  globalThis.__inklyFetchInstalled = true;
5379
5442
  const pending = new Map();
@@ -5393,7 +5456,7 @@ function selectorFor(el) {
5393
5456
  const id = nextId++;
5394
5457
  pending.set(id, { resolve, reject });
5395
5458
  try {
5396
- globalThis.${mh}(JSON.stringify({
5459
+ globalThis.${yh}(JSON.stringify({
5397
5460
  id,
5398
5461
  url: String(url),
5399
5462
  options: {
@@ -5416,17 +5479,18 @@ function selectorFor(el) {
5416
5479
  return viaNode(url, options);
5417
5480
  }
5418
5481
  };
5419
- })();`;var Iy=Math.max(6e4,Number(process.env.INKLY_CAPTURE_TIMEOUT_MS)||24e4);function ri(){return W(process.env.INKLY_CAPTURE_AGENT_HOME||W(ti(),".inkly"),"capture-agent","sessions")}function fh(e){return W(process.env.INKLY_CAPTURE_AGENT_HOME||W(ti(),".inkly"),"capture-agent","captures",e)}async function gh(e,t){await Ht(t,{recursive:!0});let n=W(t,"listener.log"),r=await po(n,"a"),i=go(import.meta.url),a=W(Zn(i),"capture-listener.js"),o=uo(process.execPath,[a,"--session",e],{detached:!0,stdio:["ignore",r.fd,r.fd]});return o.unref(),await r.close(),{pid:o.pid??null,logPath:n}}async function bh(e,t){let n=Date.now();for(;Date.now()-n<t;){let r=await Ke(e).catch(()=>null);if(r?.cliListenerReadyAt)return r;await Bt(100)}return Ke(e)}function Gn(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new Error(`invalid session id: ${e}`);return W(ri(),`${e}.json`)}function ii(e){return W(ri(),`${e}.listener.json`)}async function yh(e,t){await te(ii(e),`${JSON.stringify(t,null,2)}
5420
- `)}async function xh(e){try{let t=await _e(ii(e),"utf8");return JSON.parse(t)}catch{return null}}async function kh(e){await te(Gn(e.id),`${JSON.stringify(e,null,2)}
5421
- `)}async function Ke(e){let t=await _e(Gn(e),"utf8");return JSON.parse(t)}async function Yr(e){await fe(Gn(e),{force:!0}),await fe(ii(e),{force:!0}),await fe(Gr(e),{force:!0}).catch(()=>{}),await fe(Kn(e),{force:!0}).catch(()=>{})}function ko(e){try{return process.kill(e,0),!0}catch{return!1}}async function Xr(e){let t=(n,r)=>{try{process.kill(n,r)}catch{}};t(-e,"SIGTERM"),t(e,"SIGTERM");for(let n=0;n<8&&ko(e);n+=1)await new Promise(r=>setTimeout(r,100));t(-e,"SIGKILL"),t(e,"SIGKILL")}async function wo(e){if(!e||!e.includes("inkly"))return;let t=await new Promise(n=>{Pp("pgrep",["-f","--",e],{timeout:4e3},(r,i)=>{let a=String(i||"").split(`
5422
- `).map(o=>Number(o.trim())).filter(o=>Number.isInteger(o)&&o>0&&o!==process.pid);n(a)})});for(let n of t)try{process.kill(n,"SIGKILL")}catch{}}async function wh(e){if(!e)return;let t=null;try{t=new Vn(e),await Promise.race([t.send("Browser.close"),new Promise((n,r)=>setTimeout(()=>r(new Error("Browser.close timed out")),2e3))])}catch{}finally{t?.close()}}async function cn(e){let t=e.cliListenerPid??null;!t&&e.id&&(t=(await xh(e.id))?.cliListenerPid??null),t&&await Xr(t),!e.attached&&(await wh(e.browserWsUrl),e.chromePid&&await Xr(e.chromePid),await wo(e.profileDir),e.keepProfile||e.profileDir&&await fe(e.profileDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}))}async function vh(e,t,n,r){let i=Ge(t,"url",r),a=Ge(t,"name",r);new URL(i);let o=qp(Se(t,"window-size")),s=o?.width??Kr(t,"width",Bp),c=o?.height??Kr(t,"height",Wp),d=Kr(t,"timeout",Vp),u=Gp(t),p=Se(t,"runtime");if(p&&p!=="cli")throw new Error("--runtime must be cli");let h=n,f=Ft(t,["zoom","auto-apply-zoom"],!0),x=Ft(t,["record-video","video"],!0)&&h!=="html",_=Ft(t,["block-videos","block-video"],!1),I=Ft(t,["compress-images","compress-image"],!1),$=Ft(t,["subset-fonts","subset-font"],!1),R=Ft(t,["headless"],!0)&&t.headed!==!0,b=Se(t,"profile"),z=!u&&b?Yp(e,b):null,U=z!=null&&je(W(z,"Default"));if(!Number.isInteger(s)||s<320)throw new Error("--width must be an integer >= 320");if(!Number.isInteger(c)||c<240)throw new Error("--height must be an integer >= 240");if(!Number.isInteger(d)||d<1e3)throw new Error("--timeout must be an integer >= 1000");let D=u?{pid:null,profileDir:null,...await th(u),logPath:null}:await(async()=>{let K=await Xp(e,Se(t,"browser"));return eh({browser:K,width:s,height:c,headless:R,timeoutMs:d,userDataDir:z})})(),V=new Vn(D.wsUrl),ne=null,Ce=!1,Wt=()=>{cn({id:"",runtime:"cli",createdAt:"",url:i,name:a,chromePid:D.pid,profileDir:D.profileDir,keepProfile:z!=null||!!u,browserWsUrl:D.wsUrl,browserDebuggingUrl:D.debuggingUrl,chromeLogPath:D.logPath,attached:!!u,tabId:0,tabUrl:"",targetId:"",width:s,height:c,cliScreens:[],captureDir:null,cliListenerPid:ne,cliListenerLogPath:null,cliListenerReadyAt:null}).finally(()=>{process.exit(130)})};process.on("SIGINT",Wt),process.on("SIGTERM",Wt),Ce=!0;let L=()=>{Ce&&(process.removeListener("SIGINT",Wt),process.removeListener("SIGTERM",Wt),Ce=!1)};try{await V.send("Target.setDiscoverTargets",{discover:!0}).catch(()=>{});let K=await nh(V,i,s,c,d);await V.send("Target.activateTarget",{targetId:K.targetId}).catch(()=>{});let ge=Ep();await hh(V,K.sessionId);let A=fh(ge),le={id:ge,runtime:"cli",createdAt:new Date().toISOString(),url:i,name:a,chromePid:D.pid,profileDir:D.profileDir,keepProfile:u?!0:z!=null||t["keep-profile"]===!0,browserWsUrl:D.wsUrl,browserDebuggingUrl:D.debuggingUrl,chromeLogPath:D.logPath,attached:!!u,tabId:0,tabUrl:i,targetId:K.targetId,width:s,height:c,cliScreens:[],cliCaptureKind:h,cliRecordVideo:x,cliHeadless:u?!1:R,cliBlockVideos:h==="html"?_:!1,cliCompressImages:h==="image"?I:!1,cliSubsetFonts:h==="image"?$:!1,autoApplyZoom:f,captureDir:A,cliListenerPid:null,cliListenerLogPath:null,cliListenerReadyAt:null};await Ht(A,{recursive:!0}),await kh(le);let Ye=await gh(le.id,A);ne=Ye.pid,await yh(le.id,{cliListenerPid:Ye.pid,cliListenerLogPath:Ye.logPath});let N=15e3,O=await bh(le.id,N);if(!O.cliListenerReadyAt){let vt=async M=>M?_e(M,"utf8").then(J=>J.split(`
5482
+ })();`;var tx=Math.max(6e4,Number(process.env.INKLY_CAPTURE_TIMEOUT_MS)||24e4);function ir(){return F(process.env.INKLY_CAPTURE_AGENT_HOME||F(pi(),".inkly"),"capture-agent","sessions")}function xh(e){return F(process.env.INKLY_CAPTURE_AGENT_HOME||F(pi(),".inkly"),"capture-agent","captures",e)}async function kh(e,t){await St(t,{recursive:!0});let n=F(t,"listener.log"),r=await di(n,"a"),i=wo(import.meta.url),a=F(nr(i),"capture-listener.js"),o=ci(process.execPath,[a,"--session",e],{detached:!0,stdio:["ignore",r.fd,r.fd]});return o.unref(),await r.close(),{pid:o.pid??null,logPath:n}}async function wh(e,t){let n=Date.now();for(;Date.now()-n<t;){let r=await Ue(e).catch(()=>null);if(r?.cliListenerReadyAt)return r;await _t(100)}return Ue(e)}function ar(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new Error(`invalid session id: ${e}`);return F(ir(),`${e}.json`)}function mi(e){return F(ir(),`${e}.listener.json`)}async function vh(e,t){await ee(mi(e),`${JSON.stringify(t,null,2)}
5483
+ `)}async function Sh(e){try{let t=await Te(mi(e),"utf8");return JSON.parse(t)}catch{return null}}async function _h(e){await ee(ar(e.id),`${JSON.stringify(e,null,2)}
5484
+ `)}async function Ue(e){let t=await Te(ar(e),"utf8");return JSON.parse(t)}async function Qn(e){await ce(ar(e),{force:!0}),await ce(mi(e),{force:!0}),await ce(oi(e),{force:!0}).catch(()=>{}),await ce(or(e),{force:!0}).catch(()=>{})}function fi(e){try{return process.kill(e,0),!0}catch{return!1}}async function pn(e){let t=(n,r)=>{try{process.kill(n,r)}catch{}};t(-e,"SIGTERM"),t(e,"SIGTERM");for(let n=0;n<8&&fi(e);n+=1)await new Promise(r=>setTimeout(r,100));t(-e,"SIGKILL"),t(e,"SIGKILL")}async function er(e){if(!e||!e.includes("inkly"))return;let t=await new Promise(n=>{yo("pgrep",["-f","--",e],{timeout:4e3},(r,i)=>{let a=String(i||"").split(`
5485
+ `).map(o=>Number(o.trim())).filter(o=>Number.isInteger(o)&&o>0&&o!==process.pid);n(a)})});for(let n of t)try{process.kill(n,"SIGKILL")}catch{}}async function Ch(e){let t=await new Promise(s=>{yo("ps",["-axo","pid=,ppid=,command="],{timeout:4e3,maxBuffer:16777216},(l,d)=>s(l&&!d?null:String(d||"")))});if(t==null)return null;let n=new Map,r=new Map;for(let s of t.split(`
5486
+ `)){let l=s.match(/^\s*(\d+)\s+(\d+)\s+(.*)$/);if(!l)continue;let d=Number(l[1]),u=Number(l[2]);r.set(d,l[3]??""),n.has(u)||n.set(u,[]),n.get(u).push(d)}let i=0,a=new Set,o=[e];for(;o.length>0;){let s=o.pop();if(!a.has(s)){a.add(s);for(let l of n.get(s)??[])o.push(l);s!==e&&(r.get(s)??"").includes("--type=renderer")&&(i+=1)}}return i}async function Th(e){if(!e)return;let t=null;try{t=new Xn(e),await Promise.race([t.send("Browser.close"),new Promise((n,r)=>setTimeout(()=>r(new Error("Browser.close timed out")),2e3))])}catch{}finally{t?.close()}}async function Gt(e){let t=e.cliListenerPid??null;!t&&e.id&&(t=(await Sh(e.id))?.cliListenerPid??null),t&&await pn(t),!e.attached&&(await Th(e.browserWsUrl),e.chromePid&&await pn(e.chromePid),await er(e.profileDir),e.keepProfile||e.profileDir&&await ce(e.profileDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}))}async function Ah(e,t,n,r){let i=Xe(t,"url",r),a=Xe(t,"name",r);new URL(i);let o=Co(se(t,"window-size")),s=o?.width??qt(t,"width",So),l=o?.height??qt(t,"height",_o),d=qt(t,"timeout",Qp),u=To(t),p=se(t,"runtime");if(p&&p!=="cli")throw new Error("--runtime must be cli");let h=n,m=Jt(t,["zoom","auto-apply-zoom"],!0),y=Jt(t,["record-video","video"],!0)&&h!=="html",w=Jt(t,["block-videos","block-video"],!1),T=Jt(t,["compress-images","compress-image"],!1),I=Jt(t,["subset-fonts","subset-font"],!1),R=Jt(t,["headless"],!0)&&t.headed!==!0,k=se(t,"profile"),C=!u&&k?Po(e,k):null,D=C!=null&&ye(F(C,"Default"));if(!Number.isInteger(s)||s<320)throw new Error("--width must be an integer >= 320");if(!Number.isInteger(l)||l<240)throw new Error("--height must be an integer >= 240");if(!Number.isInteger(d)||d<1e3)throw new Error("--timeout must be an integer >= 1000");let A=u?{pid:null,profileDir:null,...await ah(u),logPath:null}:await(async()=>{let X=await Io(e,se(t,"browser"));return ih({browser:X,width:s,height:l,headless:R,timeoutMs:d,userDataDir:C})})(),W=new Xn(A.wsUrl),Y=null,de=!1,Kt=()=>{Gt({id:"",runtime:"cli",createdAt:"",url:i,name:a,chromePid:A.pid,profileDir:A.profileDir,keepProfile:C!=null||!!u,browserWsUrl:A.wsUrl,browserDebuggingUrl:A.debuggingUrl,chromeLogPath:A.logPath,attached:!!u,tabId:0,tabUrl:"",targetId:"",width:s,height:l,cliScreens:[],captureDir:null,cliListenerPid:Y,cliListenerLogPath:null,cliListenerReadyAt:null}).finally(()=>{process.exit(130)})};process.on("SIGINT",Kt),process.on("SIGTERM",Kt),de=!0;let M=()=>{de&&(process.removeListener("SIGINT",Kt),process.removeListener("SIGTERM",Kt),de=!1)};try{await W.send("Target.setDiscoverTargets",{discover:!0}).catch(()=>{});let X=await oh(W,i,s,l,d);await W.send("Target.activateTarget",{targetId:X.targetId}).catch(()=>{});let xe=zp();await bh(W,X.sessionId);let N=xh(xe),ue={id:xe,runtime:"cli",createdAt:new Date().toISOString(),url:i,name:a,chromePid:A.pid,profileDir:A.profileDir,keepProfile:u?!0:C!=null||t["keep-profile"]===!0,browserWsUrl:A.wsUrl,browserDebuggingUrl:A.debuggingUrl,chromeLogPath:A.logPath,attached:!!u,tabId:0,tabUrl:i,targetId:X.targetId,width:s,height:l,cliScreens:[],cliCaptureKind:h,cliRecordVideo:y,cliHeadless:u?!1:R,cliBlockVideos:h==="html"?w:!1,cliCompressImages:h==="image"?T:!1,cliSubsetFonts:h==="image"?I:!1,autoApplyZoom:m,captureDir:N,cliListenerPid:null,cliListenerLogPath:null,cliListenerReadyAt:null};await St(N,{recursive:!0}),await _h(ue);let Qe=await kh(ue.id,N);Y=Qe.pid,await vh(ue.id,{cliListenerPid:Qe.pid,cliListenerLogPath:Qe.logPath});let O=15e3,L=await wh(ue.id,O);if(!L.cliListenerReadyAt){let Ct=async U=>U?Te(U,"utf8").then(J=>J.split(`
5423
5487
  `).filter(Boolean).slice(-12).join(`
5424
- `)).catch(()=>""):"",E=await vt(Ye.logPath),F=await vt(O.chromeLogPath??D.logPath);throw new Error(`capture recorder failed to arm within ${N/1e3}s (listenerReadyAt is null). Every click would be silently dropped, so this session is unusable.
5425
- Listener log (${Ye.logPath}):
5426
- ${E||"(empty)"}
5427
- Chrome log (${O.chromeLogPath??D.logPath}):
5428
- ${F||"(empty)"}`)}return await B("inkly_cli_capture_session_started",{runtime:"cli",capture_kind:O.cliCaptureKind??h,record_video:O.cliRecordVideo===!0,auto_apply_zoom:O.autoApplyZoom!==!1,window_width:O.width,window_height:O.height,headless:u?null:R,attached:O.attached,persistent_profile:z!=null,profile_reused:U,connect_to_browser:!!u}),L(),Q({ok:!0,mode:"cli",session:{id:O.id,stateFile:Gn(O.id),createdAt:O.createdAt},browser:{pid:O.chromePid,debuggingUrl:O.browserDebuggingUrl,webSocketDebuggerUrl:O.browserWsUrl,headless:u?null:R,attached:O.attached,profile:z?{dir:z,persistent:!0,reused:U}:null},tab:{targetId:O.targetId,url:O.tabUrl},capture:{kind:O.cliCaptureKind??"image",video:O.cliRecordVideo===!0,recordVideo:O.cliRecordVideo===!0,autoApplyZoom:O.autoApplyZoom!==!1,window:{width:O.width,height:O.height},stepCount:0,automatic:!0,listenerPid:O.cliListenerPid??Ye.pid,listenerReadyAt:O.cliListenerReadyAt}}),0}catch(K){throw await cn({id:"",runtime:"cli",createdAt:"",url:i,name:a,chromePid:D.pid,profileDir:D.profileDir,keepProfile:z!=null||!!u,browserWsUrl:D.wsUrl,browserDebuggingUrl:D.debuggingUrl,chromeLogPath:D.logPath,attached:!!u,tabId:0,tabUrl:"",targetId:"",width:s,height:c,cliScreens:[],captureDir:null,cliListenerPid:ne,cliListenerLogPath:null,cliListenerReadyAt:null}),K}finally{L(),V.close()}}async function Sh(e,t){let n=Np(new Uint8Array(e)),r=Wn(t);await Ht(r,{recursive:!0});for(let[i,a]of Object.entries(n)){let o=i.replace(/\\/g,"/");if(!o||o.endsWith("/"))continue;let s=Wn(r,o);if(s!==r&&!s.startsWith(r+$p))throw new Error(`Unsafe zip entry: ${i}`);await Ht(Zn(s),{recursive:!0}),await mo(s,Buffer.from(a))}}async function _h(e,t,n){let r=Ge(t,"session",n),i=Ge(t,"out",n),a=qn(e,i),o=await Ke(r),s=await ai(r),c=Jn(o.cliScreens??[],s);if(c.length===0)return await cn(o),o.captureDir&&await fe(o.captureDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),await Yr(o.id),await Qr(o.id),await B("inkly_cli_capture_session_stopped",{runtime:"cli",capture_kind:o.cliCaptureKind??"image",step_count:0,output_bytes:0,unpacked:!1,record_video:o.cliRecordVideo===!0,auto_apply_zoom:o.autoApplyZoom!==!1}),Q({ok:!1,mode:"cli",session:{id:o.id},error:"No steps captured \u2014 nothing to export. Each step comes from a click driven over CDP; the initial page load is not a step. The session has been cleaned up, so no `cancel` is needed.",output:{zipPath:null,demoDir:null,bytes:0,stepCount:0}}),1;let u=o.cliCaptureKind==="html"?await ph({name:o.name,screens:c}):await dh({name:o.name,screens:c,autoApplyZoom:o.autoApplyZoom!==!1,compressImages:o.cliCompressImages===!0,subsetFonts:o.cliSubsetFonts===!0});await Ht(a,{recursive:!0});let p=Buffer.from(u.bytes),h=W(a,u.filename);await mo(h,p);let f=null;return t["no-unpack"]!==!0&&(await Sh(p,a),f=W(a,u.slug)),await cn(o),o.captureDir&&await fe(o.captureDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),await Yr(o.id),await Qr(o.id),await B("inkly_cli_capture_session_stopped",{runtime:"cli",capture_kind:o.cliCaptureKind??"image",step_count:u.stepCount,output_bytes:p.byteLength,unpacked:t["no-unpack"]!==!0,record_video:o.cliRecordVideo===!0,auto_apply_zoom:o.autoApplyZoom!==!1}),Q({ok:!0,mode:"cli",session:{id:o.id},output:{zipPath:h,demoDir:f,bytes:p.byteLength,stepCount:u.stepCount,stepLabels:u.labels}}),0}async function Ch(e,t){let n=Ge(e,"session",t),r=await Ke(n);return await cn(r),r.captureDir&&await fe(r.captureDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),await Yr(r.id),await Qr(r.id),await B("inkly_cli_capture_session_cancelled",{runtime:"cli",capture_kind:r.cliCaptureKind??"image",step_count:r.cliScreens?.length??0,record_video:r.cliRecordVideo===!0,auto_apply_zoom:r.autoApplyZoom!==!1}),Q({ok:!0,mode:"cli",session:{id:r.id}}),0}function vo(e){return e.pngPath||e.videoPath||e.htmlPath||e.posterPngPath||`t:${e.capturedAt??""}`}function Kn(e){return W(ri(),`${e}.undo.json`)}async function ai(e){try{let t=JSON.parse(await _e(Kn(e),"utf8"));return Array.isArray(t.droppedKeys)?t.droppedKeys.filter(n=>typeof n=="string"):[]}catch{return[]}}function Jn(e,t){if(t.length===0)return e;let n=new Set(t);return e.filter(r=>!n.has(vo(r)))}async function Qr(e){await fe(Kn(e),{force:!0}).catch(()=>{})}function ei(e,t){return e.click?.label||e.title||`Step ${t+1}`}async function Th(e,t){let n=Ge(e,"session",t),r=await Ke(n),i=await ai(n),a=Jn(r.cliScreens??[],i);if(a.length===0)return Q({ok:!1,mode:"cli",session:{id:r.id},error:"No recorded step to undo.",capture:{stepCount:0}}),1;let o=a[a.length-1],s=ei(o,a.length-1);i.push(vo(o)),await te(Kn(n),`${JSON.stringify({droppedKeys:i},null,2)}
5429
- `);let c=Jn(r.cliScreens??[],i);return Q({ok:!0,mode:"cli",session:{id:r.id},capture:{undone:s,stepCount:c.length,stepLabels:c.map((d,u)=>ei(d,u))}}),0}async function Ah(e,t){let n=Ge(e,"session",t),r=await Ke(n),i=await ai(n),a=Jn(r.cliScreens??[],i),o=a.map((c,d)=>ei(c,d)),s=a.map((c,d)=>({index:d+1,label:o[d],url:c.sourceUrl||null,kind:c.kind??"image"}));return Q({ok:!0,mode:"cli",session:{id:r.id},capture:{kind:r.cliCaptureKind??"image",ready:!!r.cliListenerReadyAt,browserAlive:r.attached?null:!!(r.chromePid&&ko(r.chromePid)),listenerReadyAt:r.cliListenerReadyAt??null,stepCount:a.length,stepLabels:o,lastLabel:o[o.length-1]??null,steps:s}}),0}async function Yn(e){let{cwd:t,subcommand:n,args:r,kind:i,usage:a}=e;switch(Kp(r),await B("inkly_cli_capture_command_invoked",{capture_kind:i,subcommand:n??"(none)"}),n){case"start":return vh(t,r,i,a);case"stop":return _h(t,r,a);case"cancel":return Ch(r,a);case"status":return Ah(r,a);case"undo":return Th(r,a);case"profiles":return $h();case"nav":return Eh(r);default:return process.stdout.write(a),1}}var X=`inkly capture nav - drive the captured browser (Stagehand)
5488
+ `)).catch(()=>""):"",j=await Ct(Qe.logPath),V=await Ct(L.chromeLogPath??A.logPath);throw new Error(`capture recorder failed to arm within ${O/1e3}s (listenerReadyAt is null). Every click would be silently dropped, so this session is unusable.
5489
+ Listener log (${Qe.logPath}):
5490
+ ${j||"(empty)"}
5491
+ Chrome log (${L.chromeLogPath??A.logPath}):
5492
+ ${V||"(empty)"}`)}return await H("inkly_cli_capture_session_started",{runtime:"cli",capture_kind:L.cliCaptureKind??h,record_video:L.cliRecordVideo===!0,auto_apply_zoom:L.autoApplyZoom!==!1,window_width:L.width,window_height:L.height,headless:u?null:R,attached:L.attached,persistent_profile:C!=null,profile_reused:D,connect_to_browser:!!u}),M(),K({ok:!0,mode:"cli",session:{id:L.id,stateFile:ar(L.id),createdAt:L.createdAt},browser:{pid:L.chromePid,debuggingUrl:L.browserDebuggingUrl,webSocketDebuggerUrl:L.browserWsUrl,headless:u?null:R,attached:L.attached,profile:C?{dir:C,persistent:!0,reused:D}:null},tab:{targetId:L.targetId,url:L.tabUrl},capture:{kind:L.cliCaptureKind??"image",video:L.cliRecordVideo===!0,recordVideo:L.cliRecordVideo===!0,autoApplyZoom:L.autoApplyZoom!==!1,window:{width:L.width,height:L.height},stepCount:0,automatic:!0,listenerPid:L.cliListenerPid??Qe.pid,listenerReadyAt:L.cliListenerReadyAt}}),0}catch(X){throw await Gt({id:"",runtime:"cli",createdAt:"",url:i,name:a,chromePid:A.pid,profileDir:A.profileDir,keepProfile:C!=null||!!u,browserWsUrl:A.wsUrl,browserDebuggingUrl:A.debuggingUrl,chromeLogPath:A.logPath,attached:!!u,tabId:0,tabUrl:"",targetId:"",width:s,height:l,cliScreens:[],captureDir:null,cliListenerPid:Y,cliListenerLogPath:null,cliListenerReadyAt:null}),X}finally{M(),W.close()}}async function Ph(e,t){let n=Wp(new Uint8Array(e)),r=Zt(t);await St(r,{recursive:!0});for(let[i,a]of Object.entries(n)){let o=i.replace(/\\/g,"/");if(!o||o.endsWith("/"))continue;let s=Zt(r,o);if(s!==r&&!s.startsWith(r+Hp))throw new Error(`Unsafe zip entry: ${i}`);await St(nr(s),{recursive:!0}),await xo(s,Buffer.from(a))}}async function Ih(e,t,n){let r=Xe(t,"session",n),i=Xe(t,"out",n),a=rr(e,i),o=await Ue(r),s=await gi(r),l=tr(o.cliScreens??[],s);if(l.length===0)return await Gt(o),o.captureDir&&await ce(o.captureDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),await Qn(o.id),await si(o.id),await H("inkly_cli_capture_session_stopped",{runtime:"cli",capture_kind:o.cliCaptureKind??"image",step_count:0,output_bytes:0,unpacked:!1,record_video:o.cliRecordVideo===!0,auto_apply_zoom:o.autoApplyZoom!==!1}),K({ok:!1,mode:"cli",session:{id:o.id},error:"No steps captured \u2014 nothing to export. Each step comes from a click driven over CDP; the initial page load is not a step. The session has been cleaned up, so no `cancel` is needed.",output:{zipPath:null,demoDir:null,bytes:0,stepCount:0}}),1;let u=o.cliCaptureKind==="html"?await gh({name:o.name,screens:l}):await mh({name:o.name,screens:l,autoApplyZoom:o.autoApplyZoom!==!1,compressImages:o.cliCompressImages===!0,subsetFonts:o.cliSubsetFonts===!0});await St(a,{recursive:!0});let p=Buffer.from(u.bytes),h=F(a,u.filename);await xo(h,p);let m=null;return t["no-unpack"]!==!0&&(await Ph(p,a),m=F(a,u.slug)),await Gt(o),o.captureDir&&await ce(o.captureDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),await Qn(o.id),await si(o.id),await H("inkly_cli_capture_session_stopped",{runtime:"cli",capture_kind:o.cliCaptureKind??"image",step_count:u.stepCount,output_bytes:p.byteLength,unpacked:t["no-unpack"]!==!0,record_video:o.cliRecordVideo===!0,auto_apply_zoom:o.autoApplyZoom!==!1}),K({ok:!0,mode:"cli",session:{id:o.id},output:{zipPath:h,demoDir:m,bytes:p.byteLength,stepCount:u.stepCount,stepLabels:u.labels}}),0}async function Eh(e,t){let n=Xe(e,"session",t),r=await Ue(n);return await Gt(r),r.captureDir&&await ce(r.captureDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),await Qn(r.id),await si(r.id),await H("inkly_cli_capture_session_cancelled",{runtime:"cli",capture_kind:r.cliCaptureKind??"image",step_count:r.cliScreens?.length??0,record_video:r.cliRecordVideo===!0,auto_apply_zoom:r.autoApplyZoom!==!1}),K({ok:!0,mode:"cli",session:{id:r.id}}),0}function Ro(e){return e.pngPath||e.videoPath||e.htmlPath||e.posterPngPath||`t:${e.capturedAt??""}`}function or(e){return F(ir(),`${e}.undo.json`)}async function gi(e){try{let t=JSON.parse(await Te(or(e),"utf8"));return Array.isArray(t.droppedKeys)?t.droppedKeys.filter(n=>typeof n=="string"):[]}catch{return[]}}function tr(e,t){if(t.length===0)return e;let n=new Set(t);return e.filter(r=>!n.has(Ro(r)))}async function si(e){await ce(or(e),{force:!0}).catch(()=>{})}function li(e,t){return e.click?.label||e.title||`Step ${t+1}`}async function Rh(e,t){let n=Xe(e,"session",t),r=await Ue(n),i=await gi(n),a=tr(r.cliScreens??[],i);if(a.length===0)return K({ok:!1,mode:"cli",session:{id:r.id},error:"No recorded step to undo.",capture:{stepCount:0}}),1;let o=a[a.length-1],s=li(o,a.length-1);i.push(Ro(o)),await ee(or(n),`${JSON.stringify({droppedKeys:i},null,2)}
5493
+ `);let l=tr(r.cliScreens??[],i);return K({ok:!0,mode:"cli",session:{id:r.id},capture:{undone:s,stepCount:l.length,stepLabels:l.map((d,u)=>li(d,u))}}),0}async function $h(e,t){let n=Xe(e,"session",t),r=await Ue(n),i=await gi(n),a=tr(r.cliScreens??[],i),o=a.map((l,d)=>li(l,d)),s=a.map((l,d)=>({index:d+1,label:o[d],url:l.sourceUrl||null,kind:l.kind??"image"}));return K({ok:!0,mode:"cli",session:{id:r.id},capture:{kind:r.cliCaptureKind??"image",ready:!!r.cliListenerReadyAt,browserAlive:r.attached?null:!!(r.chromePid&&fi(r.chromePid)),listenerReadyAt:r.cliListenerReadyAt??null,stepCount:a.length,stepLabels:o,lastLabel:o[o.length-1]??null,steps:s}}),0}async function sr(e){let{cwd:t,subcommand:n,args:r,kind:i,usage:a}=e;switch(nh(r),await H("inkly_cli_capture_command_invoked",{capture_kind:i,subcommand:n??"(none)"}),n){case"start":return Ah(t,r,i,a);case"stop":return Ih(t,r,a);case"cancel":return Eh(r,a);case"status":return $h(r,a);case"undo":return Rh(r,a);case"profiles":return Oh();case"ask-user-to-log-in":return Fh(t,r,a);case"nav":return Mh(r);default:return process.stdout.write(a),1}}var te=`inkly capture nav - drive the captured browser (Stagehand)
5430
5494
 
5431
5495
  Usage:
5432
5496
  inkly capture nav snapshot --session <id> [--full] [--filter <t|/re/>] [--max-depth <n>] [--json]
@@ -5464,41 +5528,59 @@ Output:
5464
5528
  tree, and \`--json\` for the structured object (with urlMap/xpathMap on snapshot).
5465
5529
  A driving verb fires real browser input, which the recorder captures as a step \u2014
5466
5530
  nav never writes steps.
5467
- `;async function Ph(e){let n=(await Ke(e).catch(()=>null))?.cliScreens??[],r=n[n.length-1];return{steps:n.length,lastLabel:r&&(r.click?.label||r.title)||null,lastKind:r?.kind??null}}function oi(e){return e.json===!0}function Le(e){return e["no-snapshot"]===!0||e.snapshot===!1}function Ih(e,t){if(oi(t)){Q({ok:!0,...e});return}let n=typeof e.tree=="string"?e.tree:"";process.stdout.write(`${n}
5468
- `)}async function Oe(e,t,n){if(oi(t)){Q({ok:!0,...e});return}let r=e,i=r.steps!==void 0?{steps:r.steps,lastLabel:r.lastLabel??null}:await Ph(n),a=r.snapshot?.url??"",o=["ok"];a&&o.push(`url=${a}`),i.steps!==null&&o.push(`steps=${i.steps}`),i.lastLabel&&o.push(i.lastLabel),process.stdout.write(`${o.join(" | ")}
5531
+ `;async function Dh(e){let n=(await Ue(e).catch(()=>null))?.cliScreens??[],r=n[n.length-1];return{steps:n.length,lastLabel:r&&(r.click?.label||r.title)||null,lastKind:r?.kind??null}}function bi(e){return e.json===!0}function Oe(e){return e["no-snapshot"]===!0||e.snapshot===!1}function Nh(e,t){if(bi(t)){K({ok:!0,...e});return}let n=typeof e.tree=="string"?e.tree:"";process.stdout.write(`${n}
5532
+ `)}async function je(e,t,n){if(bi(t)){K({ok:!0,...e});return}let r=e,i=r.steps!==void 0?{steps:r.steps,lastLabel:r.lastLabel??null}:await Dh(n),a=r.snapshot?.url??"",o=["ok"];a&&o.push(`url=${a}`),i.steps!==null&&o.push(`steps=${i.steps}`),i.lastLabel&&o.push(i.lastLabel),process.stdout.write(`${o.join(" | ")}
5469
5533
  `);let s=r.snapshot?.tree;typeof s=="string"&&s.length>0&&process.stdout.write(`${s}
5470
- `)}async function Eh(e){let t=typeof e._[2]=="string"?e._[2]:void 0;if(!t)return process.stdout.write(X),1;let n=Ge(e,"session",X),r=await Ke(n).catch(()=>null);if(!r)throw new Error(`no capture session "${n}" \u2014 run \`inkly capture start\` first`);if(r.runtime!=="cli")throw new Error("nav is only available for cli runtime sessions");let i=Gr(n);switch(t){case"snapshot":{let a=await G(i,"snapshot",{full:e.full===!0,json:oi(e),filter:Se(e,"filter"),maxDepth:Bn(e,"max-depth")});return Ih(a,e),0}case"refs":{let a=await G(i,"refs",{});return Q({ok:!0,...a}),0}case"click":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(!a)throw new Error(`nav click requires a <selector>
5534
+ `)}async function Mh(e){let t=typeof e._[2]=="string"?e._[2]:void 0;if(!t)return process.stdout.write(te),1;let n=Xe(e,"session",te),r=await Ue(n).catch(()=>null);if(!r)throw new Error(`no capture session "${n}" \u2014 run \`inkly capture start\` first`);if(r.runtime!=="cli")throw new Error("nav is only available for cli runtime sessions");let i=oi(n);switch(t){case"snapshot":{let a=await G(i,"snapshot",{full:e.full===!0,json:bi(e),filter:se(e,"filter"),maxDepth:Yn(e,"max-depth")});return Nh(a,e),0}case"refs":{let a=await G(i,"refs",{});return K({ok:!0,...a}),0}case"click":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(!a)throw new Error(`nav click requires a <selector>
5535
+
5536
+ `+te);let o=await G(i,"click",{selector:a,noSnapshot:Oe(e)});return await je(o,e,n),0}case"fill":{let a=typeof e._[3]=="string"?e._[3]:void 0,o=typeof e._[4]=="string"?e._[4]:void 0;if(!a||o===void 0)throw new Error(`nav fill requires <selector> <value>
5471
5537
 
5472
- `+X);let o=await G(i,"click",{selector:a,noSnapshot:Le(e)});return await Oe(o,e,n),0}case"fill":{let a=typeof e._[3]=="string"?e._[3]:void 0,o=typeof e._[4]=="string"?e._[4]:void 0;if(!a||o===void 0)throw new Error(`nav fill requires <selector> <value>
5538
+ `+te);let s=await G(i,"fill",{selector:a,value:o,pressEnter:e.enter===!0,noSnapshot:Oe(e)});return await je(s,e,n),0}case"type":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(a===void 0)throw new Error(`nav type requires <text>
5473
5539
 
5474
- `+X);let s=await G(i,"fill",{selector:a,value:o,pressEnter:e.enter===!0,noSnapshot:Le(e)});return await Oe(s,e,n),0}case"type":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(a===void 0)throw new Error(`nav type requires <text>
5540
+ `+te);let o=await G(i,"type",{text:a,delay:Yn(e,"delay"),noSnapshot:Oe(e)});return await je(o,e,n),0}case"press":case"key":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(!a)throw new Error(`nav press requires a <key>
5475
5541
 
5476
- `+X);let o=await G(i,"type",{text:a,delay:Bn(e,"delay"),noSnapshot:Le(e)});return await Oe(o,e,n),0}case"press":case"key":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(!a)throw new Error(`nav press requires a <key>
5542
+ `+te);let o=await G(i,"key",{key:a,noSnapshot:Oe(e)});return await je(o,e,n),0}case"scroll":{let o=(typeof e._[3]=="string"?e._[3]:void 0)==="up"?"up":"down",s=un(e._[4]),l=await G(i,"scroll",{direction:o,amount:s!==void 0&&s>0?s:void 0,noSnapshot:Oe(e)});return await je(l,e,n),0}case"select":{let a=typeof e._[3]=="string"?e._[3]:void 0,o=e._.slice(4).filter(l=>typeof l=="string");if(!a||o.length===0)throw new Error(`nav select requires <selector> <value...>
5477
5543
 
5478
- `+X);let o=await G(i,"key",{key:a,noSnapshot:Le(e)});return await Oe(o,e,n),0}case"scroll":{let o=(typeof e._[3]=="string"?e._[3]:void 0)==="up"?"up":"down",s=ln(e._[4]),c=await G(i,"scroll",{direction:o,amount:s!==void 0&&s>0?s:void 0,noSnapshot:Le(e)});return await Oe(c,e,n),0}case"select":{let a=typeof e._[3]=="string"?e._[3]:void 0,o=e._.slice(4).filter(c=>typeof c=="string");if(!a||o.length===0)throw new Error(`nav select requires <selector> <value...>
5544
+ `+te);let s=await G(i,"select",{selector:a,values:o,noSnapshot:Oe(e)});return await je(s,e,n),0}case"upload":{let a=typeof e._[3]=="string"?e._[3]:void 0,o=e._.slice(4).filter(l=>typeof l=="string").map(l=>rr(process.cwd(),l));if(!a||o.length===0)throw new Error(`nav upload requires <selector> <file...>
5479
5545
 
5480
- `+X);let s=await G(i,"select",{selector:a,values:o,noSnapshot:Le(e)});return await Oe(s,e,n),0}case"upload":{let a=typeof e._[3]=="string"?e._[3]:void 0,o=e._.slice(4).filter(c=>typeof c=="string").map(c=>qn(process.cwd(),c));if(!a||o.length===0)throw new Error(`nav upload requires <selector> <file...>
5546
+ `+te);let s=await G(i,"upload",{selector:a,files:o});return K({ok:!0,...s}),0}case"get":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(!a)throw new Error(`nav get requires a target
5481
5547
 
5482
- `+X);let s=await G(i,"upload",{selector:a,files:o});return Q({ok:!0,...s}),0}case"get":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(!a)throw new Error(`nav get requires a target
5548
+ `+te);let o=typeof e._[4]=="string"?e._[4]:void 0,s=await G(i,"get",{what:a,selector:o});return K({ok:!0,...s}),0}case"is":{let a=typeof e._[3]=="string"?e._[3]:void 0,o=typeof e._[4]=="string"?e._[4]:void 0;if(!a||!o)throw new Error(`nav is requires <visible|checked> <selector>
5483
5549
 
5484
- `+X);let o=typeof e._[4]=="string"?e._[4]:void 0,s=await G(i,"get",{what:a,selector:o});return Q({ok:!0,...s}),0}case"is":{let a=typeof e._[3]=="string"?e._[3]:void 0,o=typeof e._[4]=="string"?e._[4]:void 0;if(!a||!o)throw new Error(`nav is requires <visible|checked> <selector>
5550
+ `+te);let s=await G(i,"is",{check:a,selector:o});return K({ok:!0,...s}),0}case"wait":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(!a)throw new Error(`nav wait requires <load|selector|timeout>
5485
5551
 
5486
- `+X);let s=await G(i,"is",{check:a,selector:o});return Q({ok:!0,...s}),0}case"wait":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(!a)throw new Error(`nav wait requires <load|selector|timeout>
5552
+ `+te);let o=/^\d+$/.test(a),s=o?"timeout":a,l=o?a:typeof e._[4]=="string"?e._[4]:void 0,d=await G(i,"wait",{type:s,arg:l,state:se(e,"state"),timeoutMs:Yn(e,"timeout")});return K({ok:!0,...d}),0}case"back":case"forward":case"reload":{let a=await G(i,t,{waitUntil:se(e,"wait"),timeoutMs:Yn(e,"timeout"),noSnapshot:Oe(e)});return await je(a,e,n),0}case"mouse":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(a==="click"){let o=un(e._[4]),s=un(e._[5]);if(o===void 0||s===void 0)throw new Error(`nav mouse click requires <x> <y>
5487
5553
 
5488
- `+X);let o=/^\d+$/.test(a),s=o?"timeout":a,c=o?a:typeof e._[4]=="string"?e._[4]:void 0,d=await G(i,"wait",{type:s,arg:c,state:Se(e,"state"),timeoutMs:Bn(e,"timeout")});return Q({ok:!0,...d}),0}case"back":case"forward":case"reload":{let a=await G(i,t,{waitUntil:Se(e,"wait"),timeoutMs:Bn(e,"timeout"),noSnapshot:Le(e)});return await Oe(a,e,n),0}case"mouse":{let a=typeof e._[3]=="string"?e._[3]:void 0;if(a==="click"){let o=ln(e._[4]),s=ln(e._[5]);if(o===void 0||s===void 0)throw new Error(`nav mouse click requires <x> <y>
5554
+ `+te);let l=await G(i,"mouse.click",{x:o,y:s,button:se(e,"button"),noSnapshot:Oe(e)});return await je(l,e,n),0}if(a==="hover"){let o=un(e._[4]),s=un(e._[5]);if(o===void 0||s===void 0)throw new Error(`nav mouse hover requires <x> <y>
5489
5555
 
5490
- `+X);let c=await G(i,"mouse.click",{x:o,y:s,button:Se(e,"button"),noSnapshot:Le(e)});return await Oe(c,e,n),0}if(a==="hover"){let o=ln(e._[4]),s=ln(e._[5]);if(o===void 0||s===void 0)throw new Error(`nav mouse hover requires <x> <y>
5556
+ `+te);let l=await G(i,"mouse.hover",{x:o,y:s});return K({ok:!0,...l}),0}if(a==="scroll"){let o=Lh(),s=o[0],l=o[1],d=o[2],u=o[3];if(s===void 0||l===void 0||d===void 0||u===void 0)throw new Error(`nav mouse scroll requires <x> <y> <deltaX> <deltaY>
5491
5557
 
5492
- `+X);let c=await G(i,"mouse.hover",{x:o,y:s});return Q({ok:!0,...c}),0}if(a==="scroll"){let o=Rh(),s=o[0],c=o[1],d=o[2],u=o[3];if(s===void 0||c===void 0||d===void 0||u===void 0)throw new Error(`nav mouse scroll requires <x> <y> <deltaX> <deltaY>
5558
+ `+te);let p=await G(i,"mouse.scroll",{x:s,y:l,deltaX:d,deltaY:u,noSnapshot:Oe(e)});return await je(p,e,n),0}throw new Error(`nav mouse requires <click|hover|scroll>
5493
5559
 
5494
- `+X);let p=await G(i,"mouse.scroll",{x:s,y:c,deltaX:d,deltaY:u,noSnapshot:Le(e)});return await Oe(p,e,n),0}throw new Error(`nav mouse requires <click|hover|scroll>
5560
+ `+te)}default:return process.stdout.write(te),1}}function un(e){if(typeof e=="number")return e;if(typeof e=="string"&&e.trim()){let t=Number(e);return Number.isFinite(t)?t:void 0}}function Lh(){let e=process.argv.slice(2),t=e.findIndex(r=>r==="scroll"),n=[];if(t!==-1)for(let r=t+1;r<e.length&&n.length<4;r+=1){let i=e[r];if(i.startsWith("--"))break;/^-?\d+(\.\d+)?$/.test(i)&&n.push(Number(i))}return[n[0],n[1],n[2],n[3]]}function Yn(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))return;let n=e[t],r=typeof n=="number"?n:Number(n);return Number.isFinite(r)?r:void 0}async function Oh(){let e=Ao(),t=await ui(e,{withFileTypes:!0}).catch(()=>[]),n=[];for(let r of t){if(!r.isDirectory())continue;let i=F(e,r.name),a=ye(F(i,"Default")),o=ye(F(i,"Default","Network","Cookies"))||ye(F(i,"Default","Cookies"));n.push({name:r.name,dir:i,initialized:a,hasCookies:o})}return await H("inkly_cli_capture_profiles_listed",{profile_count:n.length,initialized_count:n.filter(r=>r.initialized).length,cookie_count:n.filter(r=>r.hasCookies).length}),K({ok:!0,profilesDir:e,profiles:n}),0}var jh=20*6e4;async function Uh(){let e=ir(),t=await ui(e).catch(()=>[]),n=[];for(let r of t){if(!r.endsWith(".json")||r.endsWith(".listener.json")||r.endsWith(".undo.json"))continue;let i=r.slice(0,-5),a=await Ue(i).catch(()=>null);a&&n.push(a)}return n}async function zh(e){let t=Zt(e),n=[];for(let r of await Uh())!r.profileDir||Zt(r.profileDir)!==t||(await Gt({...r,keepProfile:!0}),r.captureDir&&await ce(r.captureDir,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{}),await Qn(r.id),n.push(r.id));return n}async function Fh(e,t,n){if(To(t))throw new Error("ask-user-to-log-in manages a persistent --profile and cannot be combined with --connect-to-browser (an attached browser owns its own profile).");let r=se(t,"profile");if(!r)throw new Error("ask-user-to-log-in requires --profile <name>: the sign-in is saved into that profile, then reused by `capture start --profile <name>`.");let i=Po(e,r),a=se(t,"url")??null;a&&new URL(a);let o=Co(se(t,"window-size")),s=o?.width??qt(t,"width",So),l=o?.height??qt(t,"height",_o),d=qt(t,"timeout",jh),u=await zh(i);await er(i),await St(i,{recursive:!0});for(let I of["DevToolsActivePort","SingletonLock","SingletonCookie","SingletonSocket"])await ce(F(i,I),{force:!0}).catch(()=>{});let p=await Io(e,se(t,"browser")),h=F(i,"login.log"),m=await di(h,"a"),x=[`--user-data-dir=${i}`,`--window-size=${s},${l}`,"--no-first-run","--no-default-browser-check","--disable-default-apps","--use-mock-keychain","--hide-crash-restore-bubble"];a&&x.push(a);let y=ci(p,x,{detached:!1,stdio:["ignore",m.fd,m.fd]});await m.close(),process.stderr.write(`
5561
+ A Chrome window opened for sign-in (profile "${r}"${a?` at ${a}`:""}).
5562
+ Tell the user to sign in there \u2014 "Sign in with Google/GitHub" works in this window \u2014 then CLOSE it.
5563
+ This command is WAITING; it returns once the window is closed.
5495
5564
 
5496
- `+X)}default:return process.stdout.write(X),1}}function ln(e){if(typeof e=="number")return e;if(typeof e=="string"&&e.trim()){let t=Number(e);return Number.isFinite(t)?t:void 0}}function Rh(){let e=process.argv.slice(2),t=e.findIndex(r=>r==="scroll"),n=[];if(t!==-1)for(let r=t+1;r<e.length&&n.length<4;r+=1){let i=e[r];if(i.startsWith("--"))break;/^-?\d+(\.\d+)?$/.test(i)&&n.push(Number(i))}return[n[0],n[1],n[2],n[3]]}function Bn(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))return;let n=e[t],r=typeof n=="number"?n:Number(n);return Number.isFinite(r)?r:void 0}async function $h(){let e=yo(),t=await ho(e,{withFileTypes:!0}).catch(()=>[]),n=[];for(let r of t){if(!r.isDirectory())continue;let i=W(e,r.name),a=je(W(i,"Default")),o=je(W(i,"Default","Network","Cookies"))||je(W(i,"Default","Cookies"));n.push({name:r.name,dir:i,initialized:a,hasCookies:o})}return await B("inkly_cli_capture_profiles_listed",{profile_count:n.length,initialized_count:n.filter(r=>r.initialized).length,cookie_count:n.filter(r=>r.hasCookies).length}),Q({ok:!0,profilesDir:e,profiles:n}),0}async function So(e){let{cwd:t,subcommand:n,args:r}=e;if(r.html===!0)throw new Error("inkly capture is image/video only. For HTML snapshot capture use `inkly capture-html`.");for(let i of["block-videos","block-video","compress-images","compress-image","subset-fonts","subset-font"])if(Object.prototype.hasOwnProperty.call(r,i))throw new Error(`--${i} only applies to HTML capture. Use \`inkly capture-html --${i}\`.`);return Yn({cwd:t,subcommand:n,args:r,kind:"image",usage:dn})}async function _o(e){let{cwd:t,subcommand:n,args:r}=e;return Yn({cwd:t,subcommand:n,args:r,kind:"html",usage:un})}var To=`inkly \u2014 Inkly CLI
5565
+ `);let w=!1;await new Promise(I=>{let R=!1,k=!1,C=!1,D=0,A=()=>{R||(R=!0,clearInterval(Y),I())};y.once("exit",A),y.once("error",A);let W=Date.now(),Y=setInterval(()=>{R||k||(k=!0,(async()=>{try{if(Date.now()-W>d)return w=!0,y.pid&&await pn(y.pid),A();if(!y.pid||!fi(y.pid))return A();let de=await Ch(y.pid);if(de===null)return;if(de>0){C=!0,D=0;return}if(!C)return;if(D+=1,D>=3)return y.pid&&await pn(y.pid),A()}finally{k=!1}})())},500)}),await _t(400),await er(i);let T=ye(F(i,"Default","Network","Cookies"))||ye(F(i,"Default","Cookies"));return await H("inkly_cli_capture_login_handoff",{closed_sessions:u.length,timed_out:w,has_cookies:T}),K({ok:!w,mode:"cli",action:"ask-user-to-log-in",profile:{name:r,dir:i,hasCookies:T},closedSessions:u,timedOut:w,next:w?"Timed out waiting for the sign-in window to close. Re-run ask-user-to-log-in (or if the user already finished, start the capture).":`Window closed. Start the capture: inkly capture start --profile ${r} --url <app-url> --window-size ${s}x${l}. Then verify sign-in FROM THE PAGE (account menu / app URL), not from hasCookies.`}),w?1:0}async function $o(e){let{cwd:t,subcommand:n,args:r}=e;if(r.html===!0)throw new Error("inkly capture is image/video only. For HTML snapshot capture use `inkly capture-html`.");for(let i of["block-videos","block-video","compress-images","compress-image","subset-fonts","subset-font"])if(Object.prototype.hasOwnProperty.call(r,i))throw new Error(`--${i} only applies to HTML capture. Use \`inkly capture-html --${i}\`.`);return sr({cwd:t,subcommand:n,args:r,kind:"image",usage:hn})}async function Do(e){let{cwd:t,subcommand:n,args:r}=e;return sr({cwd:t,subcommand:n,args:r,kind:"html",usage:mn})}import{spawn as Hh}from"child_process";import{access as Bh,constants as Wh}from"fs/promises";import{delimiter as Vh,dirname as Jh,join as No}from"path";import{fileURLToPath as qh}from"url";var fn=`inkly skills \u2014 install the bundled Inkly CLI skill
5566
+
5567
+ Usage:
5568
+ inkly skills install
5569
+
5570
+ Installs the Inkly CLI agent skill into every AI coding agent detected on this
5571
+ machine (Claude Code, Cursor, Codex, and others) via the open \`skills\`
5572
+ ecosystem. Re-run any time to refresh the skill after a CLI upgrade.
5573
+
5574
+ Commands:
5575
+ install Install or refresh the bundled Inkly CLI skill.
5576
+ `;function Zh(){return No(Jh(qh(import.meta.url)),"skills","inkly")}async function Gh(e){let t=process.env.PATH;if(!t)return null;let n=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let r of t.split(Vh))for(let i of n){let a=No(r,`${e}${i.toLowerCase()}`);try{return await Bh(a,Wh.X_OK),a}catch{}}return null}function Kh(e){return process.platform==="win32"&&/\.(?:bat|cmd)$/i.test(e)}async function Yh(e,t){return await new Promise((n,r)=>{let i=Hh(e,t,{stdio:"inherit",shell:Kh(e)});i.on("error",r),i.on("close",(a,o)=>{if(o){n(1);return}n(a??0)})})}async function Xh(){let e=await Gh("npx");return e?await Yh(e,["--yes","skills","add",Zh(),"--yes","--global","--agent","*"]):(process.stderr.write("`npx` is not installed. Install Node.js from https://nodejs.org, then rerun `inkly skills install`.\n"),1)}async function Mo(e){return e.help||!e.subcommand?(process.stdout.write(fn),e.help?0:1):e.subcommand==="install"?await Xh():(process.stderr.write(`inkly skills: unknown command "${e.subcommand}"
5577
+
5578
+ ${fn}`),1)}var Oo=`inkly \u2014 Inkly CLI
5497
5579
 
5498
5580
  Usage:
5499
5581
  inkly init <name> [--layout <layout>] Scaffold a new demo hub.
5500
- inkly add <name> [--collection <name>] Scaffold a new demo in the current hub.
5501
- inkly demo <slug> [--collection <name>] Alias of \`inkly add\`.
5582
+ inkly add <name> [--from <dir>] Scaffold or import a demo in the hub.
5583
+ inkly demo <slug> [--from <dir>] Alias of \`inkly add\`.
5502
5584
  inkly dev [--port <n>] Start a local preview server for
5503
5585
  the hub in the current directory.
5504
5586
  inkly validate [--json] [--strict] Validate hub and demo files.
@@ -5512,10 +5594,11 @@ Usage:
5512
5594
  inkly snapshot <demo> Publish a standalone snapshot of one demo.
5513
5595
  inkly capture <command> Capture an image/video walkthrough for an agent.
5514
5596
  inkly capture-html <command> Capture a self-contained HTML walkthrough.
5597
+ inkly skills install Install the Inkly CLI agent skill.
5515
5598
  inkly help [command] Show CLI help.
5516
5599
 
5517
5600
  Run \`inkly <command> --help\` for more.
5518
- `,li=`inkly init \u2014 scaffold a new demo hub
5601
+ `,xi=`inkly init \u2014 scaffold a new demo hub
5519
5602
 
5520
5603
  Usage:
5521
5604
  inkly init <name> [--layout <layout>]
@@ -5526,33 +5609,46 @@ Arguments:
5526
5609
  Options:
5527
5610
  --layout <layout> Hub index layout to write to inkly.json.
5528
5611
  One of: sidebar, tabs.
5529
- `,Ao=`inkly add \u2014 scaffold a new demo in the current hub
5612
+ `,jo=`inkly add \u2014 scaffold or import a demo in the current hub
5530
5613
 
5531
5614
  Usage:
5532
5615
  inkly add <name> [--collection <name>]
5616
+ inkly add [<name>] --from <dir> [--collection <name>]
5533
5617
 
5534
5618
  Arguments:
5535
- <name> Folder name for the new demo (kebab-case). The
5536
- demo gets a fresh, permanent, opaque id minted
5537
- into its demo.config.json.
5619
+ <name> Folder name for the demo (kebab-case). The scaffold
5620
+ form mints a fresh opaque id; the --from form keeps
5621
+ the imported demo's id. Optional with --from (defaults
5622
+ to the source folder's name).
5538
5623
 
5539
5624
  Options:
5625
+ --from <dir> Import an existing demo folder (one with a
5626
+ demo.config.json, e.g. an \`inkly capture\` export) into
5627
+ demos/<name>/ instead of scaffolding. Copies the
5628
+ config, assets.json, public/ bytes, and snapshots/.
5629
+ When the hub has a single collection and --collection
5630
+ is omitted, the imported demo joins it automatically so
5631
+ it shows up in the hub index.
5540
5632
  --collection <name> Add the demo to this collection in inkly.json.
5541
5633
  Creates the collection if it doesn't exist. When
5542
- omitted, the demo is not added to any collection.
5543
- `,Po=`inkly demo \u2014 alias of \`inkly add\`
5634
+ omitted, a scaffolded demo joins no collection.
5635
+ `,Uo=`inkly demo \u2014 alias of \`inkly add\`
5544
5636
 
5545
5637
  Usage:
5546
5638
  inkly demo <slug> [--collection <name>]
5639
+ inkly demo [<slug>] --from <dir> [--collection <name>]
5547
5640
 
5548
5641
  Arguments:
5549
- <slug> Folder name for the new demo (kebab-case).
5642
+ <slug> Folder name for the demo (kebab-case). Optional with
5643
+ --from (defaults to the source folder's name).
5550
5644
 
5551
5645
  Options:
5646
+ --from <dir> Import an existing demo folder into demos/<slug>/
5647
+ instead of scaffolding.
5552
5648
  --collection <name> Add the demo to this collection in inkly.json.
5553
5649
  Creates the collection if it doesn't exist. When
5554
5650
  omitted, the demo is not added to any collection.
5555
- `,Io=`inkly validate \u2014 validate a demo hub
5651
+ `,zo=`inkly validate \u2014 validate a demo hub
5556
5652
 
5557
5653
  Usage:
5558
5654
  inkly validate [--json] [--strict]
@@ -5560,7 +5656,7 @@ Usage:
5560
5656
  Options:
5561
5657
  --json Print machine-readable JSON.
5562
5658
  --strict Treat warnings as failures.
5563
- `,Eo=`inkly lock \u2014 pin the runtime via inkly.lock
5659
+ `,Fo=`inkly lock \u2014 pin the runtime via inkly.lock
5564
5660
 
5565
5661
  Usage:
5566
5662
  inkly lock [--json] [--local <path>]
@@ -5581,7 +5677,7 @@ Environment:
5581
5677
  BUNDLES_R2_PUBLIC_BASE_URL
5582
5678
  Override the bundles bucket's public base URL
5583
5679
  (default https://www.runtime.inklyai.dev). Useful for staging.
5584
- `,Ro=`inkly login \u2014 connect to the hosted app
5680
+ `,Ho=`inkly login \u2014 connect to the hosted app
5585
5681
 
5586
5682
  Usage:
5587
5683
  inkly login [--no-open]
@@ -5593,11 +5689,11 @@ overridden on the command line.
5593
5689
  Options:
5594
5690
  --no-open Print the grant URL without opening a browser.
5595
5691
  --token <token> Automation fallback: save an existing API token.
5596
- `,$o=`inkly logout \u2014 remove saved platform API credentials
5692
+ `,Bo=`inkly logout \u2014 remove saved platform API credentials
5597
5693
 
5598
5694
  Usage:
5599
5695
  inkly logout
5600
- `,Do=`inkly sync \u2014 upload local capture blobs to CDN
5696
+ `,Wo=`inkly sync \u2014 upload local capture blobs to CDN
5601
5697
 
5602
5698
  Usage:
5603
5699
  inkly sync [--demo <slug>] [--dry-run] [--json]
@@ -5606,7 +5702,7 @@ Options:
5606
5702
  --demo <slug> Sync one demo instead of every demo.
5607
5703
  --dry-run Report pending uploads without changing files.
5608
5704
  --json Print machine-readable JSON.
5609
- `,No=`inkly snapshot \u2014 publish a standalone snapshot of one demo
5705
+ `,Vo=`inkly snapshot \u2014 publish a standalone snapshot of one demo
5610
5706
 
5611
5707
  Usage:
5612
5708
  inkly snapshot <demo-path> [--json]
@@ -5623,7 +5719,7 @@ Arguments:
5623
5719
  Options:
5624
5720
  --demo <slug> Select the demo by slug instead of by path.
5625
5721
  --json Print machine-readable JSON.
5626
- `,Mo=`inkly dev \u2014 start the local preview server
5722
+ `,Jo=`inkly dev \u2014 start the local preview server
5627
5723
 
5628
5724
  Usage:
5629
5725
  inkly dev [<path>] [--port <n>]
@@ -5639,33 +5735,33 @@ Arguments:
5639
5735
  Options:
5640
5736
  --port <n> Preferred port. Defaults to 3000; if taken, the CLI
5641
5737
  tries the next available port. Must be 1-65535.
5642
- `,Lo=`inkly update \u2014 update the globally installed CLI
5738
+ `,qo=`inkly update \u2014 update the globally installed CLI
5643
5739
 
5644
5740
  Usage:
5645
5741
  inkly update [--dry-run]
5646
5742
 
5647
5743
  Options:
5648
5744
  --dry-run Print the update command without running it.
5649
- `,Oo=`inkly doctor \u2014 run local diagnostics
5745
+ `,Zo=`inkly doctor \u2014 run local diagnostics
5650
5746
 
5651
5747
  Usage:
5652
5748
  inkly doctor [--json]
5653
5749
 
5654
5750
  Options:
5655
5751
  --json Print machine-readable JSON.
5656
- `,jo=`inkly status \u2014 show local CLI status
5752
+ `,Go=`inkly status \u2014 show local CLI status
5657
5753
 
5658
5754
  Usage:
5659
5755
  inkly status [--json]
5660
5756
 
5661
5757
  Options:
5662
5758
  --json Print machine-readable JSON.
5663
- `,zo=`inkly version \u2014 print the CLI version
5759
+ `,Ko=`inkly version \u2014 print the CLI version
5664
5760
 
5665
5761
  Usage:
5666
5762
  inkly version
5667
5763
  inkly --version
5668
- `,ci=`inkly help \u2014 show command help
5764
+ `,ki=`inkly help \u2014 show command help
5669
5765
 
5670
5766
  Usage:
5671
5767
  inkly help [command]
@@ -5689,25 +5785,27 @@ Commands:
5689
5785
  capture Capture an image/video walkthrough for an agent.
5690
5786
  capture-html
5691
5787
  Capture a self-contained HTML walkthrough for an agent.
5692
- `,Oh={add:Ao,demo:Po,dev:Mo,doctor:Oo,capture:dn,"capture-html":un,help:ci,init:li,lock:Eo,login:Ro,logout:$o,snapshot:No,status:jo,sync:Do,update:Lo,validate:Io,version:zo};function jh(e,t){let n=Mh(e)?e:Lh(t,e);if(si(n))try{if(Nh(n).isFile())return n;let i=Co(n,"manifest.json");if(si(i))return i;let a=Co(n,"dist","manifest.json");if(si(a))return a}catch{}return n}function pn(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))return;let n=e[t];return typeof n=="string"?n:""}function zh(e){let t=new Set(["_","api-base","token","url","name","out","session"]);return Object.keys(e).filter(n=>!t.has(n)).filter(n=>e[n]!==!1&&e[n]!==void 0).sort()}async function Uh(e){let t=Dh(e,{alias:{h:"help",p:"port",v:"version"},boolean:["auto-apply-zoom","block-videos","check","compress-images","dry-run","enter","full","headed","headless","html","help","json","keep-profile","no-open","no-snapshot","no-unpack","record-video","strict","subset-fonts","version","video","zoom"],string:["browser","collection","connect-to-browser","demo","height","layout","local","name","out","port","profile","runtime","session","timeout","token","url","width","window-size"]}),[n,...r]=t._,i=n??(t.version?"version":t.help?"help":"(none)");if(await B("inkly_cli_invoked",{command:i,subcommand:typeof r[0]=="string"?r[0]:void 0,option_keys:zh(t),json:!!t.json,help:!!t.help}),t.version&&!n)return await Ir(),0;if(!n||t.help&&!n)return process.stdout.write(To),t.help?0:1;switch(n){case"help":{let a=r[0];if(!a)return process.stdout.write(ci),0;let o=Oh[a];return o?(process.stdout.write(o),0):(process.stderr.write(`inkly help: unknown command "${a}"
5693
-
5694
- ${ci}`),1)}case"init":{if(t.help)return process.stdout.write(li),0;let a=r[0];if(!a)return process.stderr.write(`inkly init: missing <name> argument
5695
-
5696
- `+li),1;let o=pn(t,"layout");try{return await ua({name:a,cwd:process.cwd(),layout:o}),0}catch(s){return process.stderr.write(`inkly init failed: ${s.message}
5697
- `),await B("inkly_cli_failed",{command:"init"}),await se("init",s),1}}case"add":case"demo":{let a=n==="add"?Ao:Po;if(t.help)return process.stdout.write(a),0;let o=r[0];if(!o)return process.stderr.write(`inkly ${n}: missing <name> argument
5698
-
5699
- `+a),1;let s=typeof t.collection=="string"&&t.collection.length>0?t.collection:void 0;try{return await Ca({slug:o,cwd:process.cwd(),collection:s}),0}catch(c){return process.stderr.write(`inkly ${n} failed: ${c.message}
5700
- `),await B("inkly_cli_failed",{command:n}),await se(n,c),1}}case"validate":return t.help?(process.stdout.write(Io),0):(await Mn({cwd:process.cwd(),json:!!t.json,strict:!!t.strict})).ok?0:1;case"lock":{if(t.help)return process.stdout.write(Eo),0;try{let a=pn(t,"local");return(await In({cwd:process.cwd(),check:!!t.check,json:!!t.json,manifestPath:a?jh(a,process.cwd()):void 0})).ok?0:1}catch(a){return process.stderr.write(`inkly lock failed: ${a.message}
5701
- `),await B("inkly_cli_failed",{command:"lock"}),await se("lock",a),1}}case"version":return t.help?(process.stdout.write(zo),0):(await Ir(),0);case"update":{if(t.help)return process.stdout.write(Lo),0;try{return await Aa({dryRun:!!t["dry-run"]}),0}catch(a){return process.stderr.write(`inkly update failed: ${a.message}
5702
- `),await B("inkly_cli_failed",{command:"update"}),await se("update",a),1}}case"doctor":return t.help?(process.stdout.write(Oo),0):(await Ra({cwd:process.cwd(),json:!!t.json})).ok?0:1;case"login":{if(t.help)return process.stdout.write(Ro),0;try{return await Oa({cwd:process.cwd(),local:process.env.INKLY_LOCAL==="1",token:pn(t,"token"),open:!t["no-open"]}),0}catch(a){return process.stderr.write(`inkly login failed: ${a.message}
5703
- `),await B("inkly_cli_failed",{command:"login"}),await se("login",a),1}}case"logout":return t.help?(process.stdout.write($o),0):(await ja(),0);case"status":return t.help?(process.stdout.write(jo),0):(await za({cwd:process.cwd(),json:!!t.json})).loggedIn?0:1;case"sync":{if(t.help)return process.stdout.write(Do),0;try{return await Un({cwd:process.cwd(),demo:pn(t,"demo"),dryRun:!!t["dry-run"],json:!!t.json}),0}catch(a){return process.stderr.write(`inkly sync failed: ${a.message}
5704
- `),await B("inkly_cli_failed",{command:"sync"}),await se("sync",a),1}}case"snapshot":{if(t.help)return process.stdout.write(No),0;try{return await Ga({cwd:process.cwd(),path:r[0],demo:pn(t,"demo"),json:!!t.json}),0}catch(a){return process.stderr.write(`inkly snapshot failed: ${a.message}
5705
- `),await B("inkly_cli_failed",{command:"snapshot"}),await se("snapshot",a),1}}case"capture":{if(t.help)return process.stdout.write(dn),0;try{return await So({cwd:process.cwd(),subcommand:r[0],args:t})}catch(a){return process.stderr.write(`inkly capture failed: ${a.message}
5706
- `),await B("inkly_cli_failed",{command:"capture",subcommand:r[0]}),await se("capture",a),1}}case"capture-html":{if(t.help)return process.stdout.write(un),0;try{return await _o({cwd:process.cwd(),subcommand:r[0],args:t})}catch(a){return process.stderr.write(`inkly capture-html failed: ${a.message}
5707
- `),await B("inkly_cli_failed",{command:"capture-html",subcommand:r[0]}),await se("capture-html",a),1}}case"dev":{if(t.help)return process.stdout.write(Mo),0;let a=t.port,o=typeof a=="number"?a:typeof a=="string"?Number(a):3e3;if(!Number.isInteger(o)||o<1||o>65535)return process.stderr.write(`inkly dev: invalid --port value; expected an integer from 1 to 65535
5708
- `),1;try{let s=await va({cwd:process.cwd(),port:o,path:r[0]});return await new Promise(c=>{let d=()=>{s.close().catch(u=>{process.stderr.write(`inkly dev: error during shutdown: ${u.message}
5709
- `),B("inkly_cli_failed",{command:"dev.shutdown"}),se("dev.shutdown",u)}).finally(()=>c())};process.once("SIGINT",d),process.once("SIGTERM",d)}),0}catch(s){return process.stderr.write(`inkly dev failed: ${s.message}
5710
- `),await B("inkly_cli_failed",{command:"dev"}),await se("dev",s),1}}default:return process.stderr.write(`inkly: unknown command "${n}"
5711
-
5712
- ${To}`),1}}Ka();Uh(process.argv.slice(2)).then(async e=>{await B("inkly_cli_exited",{command:process.argv[2]??"(none)",exit_code:e}),await Lr(),await Ya(),process.exit(e)},async e=>{process.stderr.write(`inkly: ${e.message}
5713
- `),await B("inkly_cli_failed",{command:"main"}),await se("main",e),await Lr(),process.exit(1)});
5788
+ skills Install the Inkly CLI agent skill.
5789
+ `,im={add:jo,demo:Uo,dev:Jo,doctor:Zo,capture:hn,"capture-html":mn,help:ki,init:xi,lock:Fo,login:Ho,logout:Bo,skills:fn,snapshot:Vo,status:Go,sync:Wo,update:qo,validate:zo,version:Ko};function am(e,t){let n=nm(e)?e:rm(t,e);if(yi(n))try{if(em(n).isFile())return n;let i=Lo(n,"manifest.json");if(yi(i))return i;let a=Lo(n,"dist","manifest.json");if(yi(a))return a}catch{}return n}function gn(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))return;let n=e[t];return typeof n=="string"?n:""}function om(e){let t=new Set(["_","api-base","token","url","name","out","session"]);return Object.keys(e).filter(n=>!t.has(n)).filter(n=>e[n]!==!1&&e[n]!==void 0).sort()}async function sm(e){let t=Qh(e,{alias:{h:"help",p:"port",v:"version"},boolean:["auto-apply-zoom","block-videos","check","compress-images","dry-run","enter","full","headed","headless","html","help","json","keep-profile","no-open","no-snapshot","no-unpack","record-video","strict","subset-fonts","version","video","zoom"],string:["browser","collection","connect-to-browser","demo","height","layout","local","name","out","port","profile","runtime","session","timeout","token","url","width","window-size"]}),[n,...r]=t._,i=n??(t.version?"version":t.help?"help":"(none)");if(await H("inkly_cli_invoked",{command:i,subcommand:typeof r[0]=="string"?r[0]:void 0,option_keys:om(t),json:!!t.json,help:!!t.help}),t.version&&!n)return await Br(),0;if(!n||t.help&&!n)return process.stdout.write(Oo),t.help?0:1;switch(n){case"help":{let a=r[0];if(!a)return process.stdout.write(ki),0;let o=im[a];return o?(process.stdout.write(o),0):(process.stderr.write(`inkly help: unknown command "${a}"
5790
+
5791
+ ${ki}`),1)}case"init":{if(t.help)return process.stdout.write(xi),0;let a=r[0];if(!a)return process.stderr.write(`inkly init: missing <name> argument
5792
+
5793
+ `+xi),1;let o=gn(t,"layout");try{return await wa({name:a,cwd:process.cwd(),layout:o}),0}catch(s){return process.stderr.write(`inkly init failed: ${s.message}
5794
+ `),await H("inkly_cli_failed",{command:"init"}),await oe("init",s),1}}case"add":case"demo":{let a=n==="add"?jo:Uo;if(t.help)return process.stdout.write(a),0;let o=typeof t.from=="string"&&t.from.length>0?t.from:void 0,s=r[0]??(o?tm(o.replace(/[/\\]+$/,"")):void 0);if(!s)return process.stderr.write(`inkly ${n}: missing <name> argument
5795
+
5796
+ `+a),1;let l=typeof t.collection=="string"&&t.collection.length>0?t.collection:void 0;try{return await Oa({slug:s,cwd:process.cwd(),collection:l,from:o}),0}catch(d){return process.stderr.write(`inkly ${n} failed: ${d.message}
5797
+ `),await H("inkly_cli_failed",{command:n}),await oe(n,d),1}}case"validate":return t.help?(process.stdout.write(zo),0):(await Wn({cwd:process.cwd(),json:!!t.json,strict:!!t.strict})).ok?0:1;case"lock":{if(t.help)return process.stdout.write(Fo),0;try{let a=gn(t,"local");return(await Mn({cwd:process.cwd(),check:!!t.check,json:!!t.json,manifestPath:a?am(a,process.cwd()):void 0})).ok?0:1}catch(a){return process.stderr.write(`inkly lock failed: ${a.message}
5798
+ `),await H("inkly_cli_failed",{command:"lock"}),await oe("lock",a),1}}case"version":return t.help?(process.stdout.write(Ko),0):(await Br(),0);case"update":{if(t.help)return process.stdout.write(qo),0;try{return await Ua({dryRun:!!t["dry-run"]}),0}catch(a){return process.stderr.write(`inkly update failed: ${a.message}
5799
+ `),await H("inkly_cli_failed",{command:"update"}),await oe("update",a),1}}case"doctor":return t.help?(process.stdout.write(Zo),0):(await Ha({cwd:process.cwd(),json:!!t.json})).ok?0:1;case"login":{if(t.help)return process.stdout.write(Ho),0;try{return await Za({cwd:process.cwd(),local:process.env.INKLY_LOCAL==="1",token:gn(t,"token"),open:!t["no-open"]}),0}catch(a){return process.stderr.write(`inkly login failed: ${a.message}
5800
+ `),await H("inkly_cli_failed",{command:"login"}),await oe("login",a),1}}case"logout":return t.help?(process.stdout.write(Bo),0):(await Ga(),0);case"status":return t.help?(process.stdout.write(Go),0):(await Ka({cwd:process.cwd(),json:!!t.json})).loggedIn?0:1;case"sync":{if(t.help)return process.stdout.write(Wo),0;try{return await Zn({cwd:process.cwd(),demo:gn(t,"demo"),dryRun:!!t["dry-run"],json:!!t.json}),0}catch(a){return process.stderr.write(`inkly sync failed: ${a.message}
5801
+ `),await H("inkly_cli_failed",{command:"sync"}),await oe("sync",a),1}}case"snapshot":{if(t.help)return process.stdout.write(Vo),0;try{return await no({cwd:process.cwd(),path:r[0],demo:gn(t,"demo"),json:!!t.json}),0}catch(a){return process.stderr.write(`inkly snapshot failed: ${a.message}
5802
+ `),await H("inkly_cli_failed",{command:"snapshot"}),await oe("snapshot",a),1}}case"capture":{if(t.help)return process.stdout.write(hn),0;try{return await $o({cwd:process.cwd(),subcommand:r[0],args:t})}catch(a){return process.stderr.write(`inkly capture failed: ${a.message}
5803
+ `),await H("inkly_cli_failed",{command:"capture",subcommand:r[0]}),await oe("capture",a),1}}case"capture-html":{if(t.help)return process.stdout.write(mn),0;try{return await Do({cwd:process.cwd(),subcommand:r[0],args:t})}catch(a){return process.stderr.write(`inkly capture-html failed: ${a.message}
5804
+ `),await H("inkly_cli_failed",{command:"capture-html",subcommand:r[0]}),await oe("capture-html",a),1}}case"skills":{if(t.help&&!r[0])return process.stdout.write(fn),0;try{return await Mo({subcommand:r[0],help:!!t.help})}catch(a){return process.stderr.write(`inkly skills failed: ${a.message}
5805
+ `),await H("inkly_cli_failed",{command:"skills",subcommand:r[0]}),await oe("skills",a),1}}case"dev":{if(t.help)return process.stdout.write(Jo),0;let a=t.port,o=typeof a=="number"?a:typeof a=="string"?Number(a):3e3;if(!Number.isInteger(o)||o<1||o>65535)return process.stderr.write(`inkly dev: invalid --port value; expected an integer from 1 to 65535
5806
+ `),1;try{let s=await $a({cwd:process.cwd(),port:o,path:r[0]});return await new Promise(l=>{let d=()=>{s.close().catch(u=>{process.stderr.write(`inkly dev: error during shutdown: ${u.message}
5807
+ `),H("inkly_cli_failed",{command:"dev.shutdown"}),oe("dev.shutdown",u)}).finally(()=>l())};process.once("SIGINT",d),process.once("SIGTERM",d)}),0}catch(s){return process.stderr.write(`inkly dev failed: ${s.message}
5808
+ `),await H("inkly_cli_failed",{command:"dev"}),await oe("dev",s),1}}default:return process.stderr.write(`inkly: unknown command "${n}"
5809
+
5810
+ ${Oo}`),1}}ro();sm(process.argv.slice(2)).then(async e=>{await H("inkly_cli_exited",{command:process.argv[2]??"(none)",exit_code:e}),await Kr(),await io(),process.exit(e)},async e=>{process.stderr.write(`inkly: ${e.message}
5811
+ `),await H("inkly_cli_failed",{command:"main"}),await oe("main",e),await Kr(),process.exit(1)});