@automagik/genie 4.260508.2 → 4.260508.4
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/genie.js
CHANGED
|
@@ -148,7 +148,7 @@ Expecting one of '${allowedValues.join("', '")}'`);let helpEvent=`${position}Hel
|
|
|
148
148
|
COUNT(*) FILTER (WHERE entity_type = 'otel_tool')::int AS tool_calls,
|
|
149
149
|
COUNT(*) FILTER (WHERE entity_type = 'otel_api')::int AS api_requests
|
|
150
150
|
FROM audit_events
|
|
151
|
-
WHERE created_at >= $1::timestamptz`,[sinceTs]))[0]??{};return{agents_spawned:r.agents_spawned??0,tasks_moved:r.tasks_moved??0,total_cost:r.total_cost??0,error_count:r.error_count??0,total_events:r.total_events??0,tool_calls:r.tool_calls??0,api_requests:r.api_requests??0}}function generateTraceId(){return crypto.randomUUID()}var DEFAULT_TIMELINE_LIMIT=200,MAX_TIMELINE_LIMIT=2000,DEFAULT_TIMELINE_SINCE_MS=86400000;var init_audit=__esm(()=>{init_db()});import{readFile,unlink,writeFile}from"fs/promises";function lockPath(filePath){return`${filePath}.lock`}function isPidAlive(pid){try{return process.kill(pid,0),!0}catch{return!1}}async function acquireLock(path){let lock=lockPath(path),deadline=Date.now()+LOCK_TIMEOUT_MS;while(Date.now()<deadline)try{await writeFile(lock,String(process.pid),{flag:"wx"});return}catch{try{let content=await readFile(lock,"utf-8"),holderPid=Number.parseInt(content.trim(),10);if(!Number.isNaN(holderPid)&&!isPidAlive(holderPid)){try{await unlink(lock)}catch{}continue}}catch{continue}let jitter=Math.floor(Math.random()*LOCK_POLL_MS);await new Promise((r)=>setTimeout(r,LOCK_POLL_MS+jitter))}console.warn(`[lockfile] Force-acquiring stale lock: ${lock}`),await writeFile(lock,String(process.pid))}async function releaseLock(path){try{await unlink(lockPath(path))}catch{}}var LOCK_TIMEOUT_MS=5000,LOCK_POLL_MS=50;var init_lockfile=()=>{};var util,objectUtil,ZodParsedType,getParsedType=(data)=>{switch(typeof data){case"undefined":return ZodParsedType.undefined;case"string":return ZodParsedType.string;case"number":return Number.isNaN(data)?ZodParsedType.nan:ZodParsedType.number;case"boolean":return ZodParsedType.boolean;case"function":return ZodParsedType.function;case"bigint":return ZodParsedType.bigint;case"symbol":return ZodParsedType.symbol;case"object":if(Array.isArray(data))return ZodParsedType.array;if(data===null)return ZodParsedType.null;if(data.then&&typeof data.then==="function"&&data.catch&&typeof data.catch==="function")return ZodParsedType.promise;if(typeof Map<"u"&&data instanceof Map)return ZodParsedType.map;if(typeof Set<"u"&&data instanceof Set)return ZodParsedType.set;if(typeof Date<"u"&&data instanceof Date)return ZodParsedType.date;return ZodParsedType.object;default:return ZodParsedType.unknown}};var init_util=__esm(()=>{(function(util2){util2.assertEqual=(_)=>{};function assertIs(_arg){}util2.assertIs=assertIs;function assertNever(_x){throw Error()}util2.assertNever=assertNever,util2.arrayToEnum=(items)=>{let obj={};for(let item of items)obj[item]=item;return obj},util2.getValidEnumValues=(obj)=>{let validKeys=util2.objectKeys(obj).filter((k)=>typeof obj[obj[k]]!=="number"),filtered={};for(let k of validKeys)filtered[k]=obj[k];return util2.objectValues(filtered)},util2.objectValues=(obj)=>{return util2.objectKeys(obj).map(function(e){return obj[e]})},util2.objectKeys=typeof Object.keys==="function"?(obj)=>Object.keys(obj):(object)=>{let keys=[];for(let key in object)if(Object.prototype.hasOwnProperty.call(object,key))keys.push(key);return keys},util2.find=(arr,checker)=>{for(let item of arr)if(checker(item))return item;return},util2.isInteger=typeof Number.isInteger==="function"?(val)=>Number.isInteger(val):(val)=>typeof val==="number"&&Number.isFinite(val)&&Math.floor(val)===val;function joinValues(array,separator=" | "){return array.map((val)=>typeof val==="string"?`'${val}'`:val).join(separator)}util2.joinValues=joinValues,util2.jsonStringifyReplacer=(_,value)=>{if(typeof value==="bigint")return value.toString();return value}})(util||(util={}));(function(objectUtil2){objectUtil2.mergeShapes=(first,second)=>{return{...first,...second}}})(objectUtil||(objectUtil={}));ZodParsedType=util.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"])});var ZodIssueCode,quotelessJson=(obj)=>{return JSON.stringify(obj,null,2).replace(/"([^"]+)":/g,"$1:")},ZodError;var init_ZodError=__esm(()=>{init_util();ZodIssueCode=util.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"]);ZodError=class ZodError extends Error{get errors(){return this.issues}constructor(issues){super();this.issues=[],this.addIssue=(sub)=>{this.issues=[...this.issues,sub]},this.addIssues=(subs=[])=>{this.issues=[...this.issues,...subs]};let actualProto=new.target.prototype;if(Object.setPrototypeOf)Object.setPrototypeOf(this,actualProto);else this.__proto__=actualProto;this.name="ZodError",this.issues=issues}format(_mapper){let mapper=_mapper||function(issue){return issue.message},fieldErrors={_errors:[]},processError=(error)=>{for(let issue of error.issues)if(issue.code==="invalid_union")issue.unionErrors.map(processError);else if(issue.code==="invalid_return_type")processError(issue.returnTypeError);else if(issue.code==="invalid_arguments")processError(issue.argumentsError);else if(issue.path.length===0)fieldErrors._errors.push(mapper(issue));else{let curr=fieldErrors,i=0;while(i<issue.path.length){let el=issue.path[i];if(i!==issue.path.length-1)curr[el]=curr[el]||{_errors:[]};else curr[el]=curr[el]||{_errors:[]},curr[el]._errors.push(mapper(issue));curr=curr[el],i++}}};return processError(this),fieldErrors}static assert(value){if(!(value instanceof ZodError))throw Error(`Not a ZodError: ${value}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,util.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(mapper=(issue)=>issue.message){let fieldErrors={},formErrors=[];for(let sub of this.issues)if(sub.path.length>0){let firstEl=sub.path[0];fieldErrors[firstEl]=fieldErrors[firstEl]||[],fieldErrors[firstEl].push(mapper(sub))}else formErrors.push(mapper(sub));return{formErrors,fieldErrors}}get formErrors(){return this.flatten()}};ZodError.create=(issues)=>{return new ZodError(issues)}});var errorMap=(issue,_ctx)=>{let message;switch(issue.code){case ZodIssueCode.invalid_type:if(issue.received===ZodParsedType.undefined)message="Required";else message=`Expected ${issue.expected}, received ${issue.received}`;break;case ZodIssueCode.invalid_literal:message=`Invalid literal value, expected ${JSON.stringify(issue.expected,util.jsonStringifyReplacer)}`;break;case ZodIssueCode.unrecognized_keys:message=`Unrecognized key(s) in object: ${util.joinValues(issue.keys,", ")}`;break;case ZodIssueCode.invalid_union:message="Invalid input";break;case ZodIssueCode.invalid_union_discriminator:message=`Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;break;case ZodIssueCode.invalid_enum_value:message=`Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;break;case ZodIssueCode.invalid_arguments:message="Invalid function arguments";break;case ZodIssueCode.invalid_return_type:message="Invalid function return type";break;case ZodIssueCode.invalid_date:message="Invalid date";break;case ZodIssueCode.invalid_string:if(typeof issue.validation==="object")if("includes"in issue.validation){if(message=`Invalid input: must include "${issue.validation.includes}"`,typeof issue.validation.position==="number")message=`${message} at one or more positions greater than or equal to ${issue.validation.position}`}else if("startsWith"in issue.validation)message=`Invalid input: must start with "${issue.validation.startsWith}"`;else if("endsWith"in issue.validation)message=`Invalid input: must end with "${issue.validation.endsWith}"`;else util.assertNever(issue.validation);else if(issue.validation!=="regex")message=`Invalid ${issue.validation}`;else message="Invalid";break;case ZodIssueCode.too_small:if(issue.type==="array")message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at least":"more than"} ${issue.minimum} element(s)`;else if(issue.type==="string")message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at least":"over"} ${issue.minimum} character(s)`;else if(issue.type==="number")message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`;else if(issue.type==="bigint")message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`;else if(issue.type==="date")message=`Date must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(issue.minimum))}`;else message="Invalid input";break;case ZodIssueCode.too_big:if(issue.type==="array")message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at most":"less than"} ${issue.maximum} element(s)`;else if(issue.type==="string")message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at most":"under"} ${issue.maximum} character(s)`;else if(issue.type==="number")message=`Number must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`;else if(issue.type==="bigint")message=`BigInt must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`;else if(issue.type==="date")message=`Date must be ${issue.exact?"exactly":issue.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(issue.maximum))}`;else message="Invalid input";break;case ZodIssueCode.custom:message="Invalid input";break;case ZodIssueCode.invalid_intersection_types:message="Intersection results could not be merged";break;case ZodIssueCode.not_multiple_of:message=`Number must be a multiple of ${issue.multipleOf}`;break;case ZodIssueCode.not_finite:message="Number must be finite";break;default:message=_ctx.defaultError,util.assertNever(issue)}return{message}},en_default;var init_en=__esm(()=>{init_ZodError();init_util();en_default=errorMap});function setErrorMap(map){overrideErrorMap=map}function getErrorMap(){return overrideErrorMap}var overrideErrorMap;var init_errors=__esm(()=>{init_en();overrideErrorMap=en_default});function addIssueToContext(ctx,issueData){let overrideMap=getErrorMap(),issue=makeIssue({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default?void 0:en_default].filter((x)=>!!x)});ctx.common.issues.push(issue)}class ParseStatus{constructor(){this.value="valid"}dirty(){if(this.value==="valid")this.value="dirty"}abort(){if(this.value!=="aborted")this.value="aborted"}static mergeArray(status,results){let arrayValue=[];for(let s of results){if(s.status==="aborted")return INVALID;if(s.status==="dirty")status.dirty();arrayValue.push(s.value)}return{status:status.value,value:arrayValue}}static async mergeObjectAsync(status,pairs){let syncPairs=[];for(let pair of pairs){let key=await pair.key,value=await pair.value;syncPairs.push({key,value})}return ParseStatus.mergeObjectSync(status,syncPairs)}static mergeObjectSync(status,pairs){let finalObject={};for(let pair of pairs){let{key,value}=pair;if(key.status==="aborted")return INVALID;if(value.status==="aborted")return INVALID;if(key.status==="dirty")status.dirty();if(value.status==="dirty")status.dirty();if(key.value!=="__proto__"&&(typeof value.value<"u"||pair.alwaysSet))finalObject[key.value]=value.value}return{status:status.value,value:finalObject}}}var makeIssue=(params)=>{let{data,path,errorMaps,issueData}=params,fullPath=[...path,...issueData.path||[]],fullIssue={...issueData,path:fullPath};if(issueData.message!==void 0)return{...issueData,path:fullPath,message:issueData.message};let errorMessage="",maps=errorMaps.filter((m)=>!!m).slice().reverse();for(let map of maps)errorMessage=map(fullIssue,{data,defaultError:errorMessage}).message;return{...issueData,path:fullPath,message:errorMessage}},EMPTY_PATH,INVALID,DIRTY=(value)=>({status:"dirty",value}),OK=(value)=>({status:"valid",value}),isAborted=(x)=>x.status==="aborted",isDirty=(x)=>x.status==="dirty",isValid=(x)=>x.status==="valid",isAsync=(x)=>typeof Promise<"u"&&x instanceof Promise;var init_parseUtil=__esm(()=>{init_errors();init_en();EMPTY_PATH=[];INVALID=Object.freeze({status:"aborted"})});var init_typeAliases=()=>{};var errorUtil;var init_errorUtil=__esm(()=>{(function(errorUtil2){errorUtil2.errToObj=(message)=>typeof message==="string"?{message}:message||{},errorUtil2.toString=(message)=>typeof message==="string"?message:message?.message})(errorUtil||(errorUtil={}))});class ParseInputLazyPath{constructor(parent,value,path,key){this._cachedPath=[],this.parent=parent,this.data=value,this._path=path,this._key=key}get path(){if(!this._cachedPath.length)if(Array.isArray(this._key))this._cachedPath.push(...this._path,...this._key);else this._cachedPath.push(...this._path,this._key);return this._cachedPath}}function processCreateParams(params){if(!params)return{};let{errorMap:errorMap2,invalid_type_error,required_error,description}=params;if(errorMap2&&(invalid_type_error||required_error))throw Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);if(errorMap2)return{errorMap:errorMap2,description};return{errorMap:(iss,ctx)=>{let{message}=params;if(iss.code==="invalid_enum_value")return{message:message??ctx.defaultError};if(typeof ctx.data>"u")return{message:message??required_error??ctx.defaultError};if(iss.code!=="invalid_type")return{message:ctx.defaultError};return{message:message??invalid_type_error??ctx.defaultError}},description}}class ZodType{get description(){return this._def.description}_getType(input){return getParsedType(input.data)}_getOrReturnCtx(input,ctx){return ctx||{common:input.parent.common,data:input.data,parsedType:getParsedType(input.data),schemaErrorMap:this._def.errorMap,path:input.path,parent:input.parent}}_processInputParams(input){return{status:new ParseStatus,ctx:{common:input.parent.common,data:input.data,parsedType:getParsedType(input.data),schemaErrorMap:this._def.errorMap,path:input.path,parent:input.parent}}}_parseSync(input){let result2=this._parse(input);if(isAsync(result2))throw Error("Synchronous parse encountered promise.");return result2}_parseAsync(input){let result2=this._parse(input);return Promise.resolve(result2)}parse(data,params){let result2=this.safeParse(data,params);if(result2.success)return result2.data;throw result2.error}safeParse(data,params){let ctx={common:{issues:[],async:params?.async??!1,contextualErrorMap:params?.errorMap},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType(data)},result2=this._parseSync({data,path:ctx.path,parent:ctx});return handleResult(ctx,result2)}"~validate"(data){let ctx={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType(data)};if(!this["~standard"].async)try{let result2=this._parseSync({data,path:[],parent:ctx});return isValid(result2)?{value:result2.value}:{issues:ctx.common.issues}}catch(err){if(err?.message?.toLowerCase()?.includes("encountered"))this["~standard"].async=!0;ctx.common={issues:[],async:!0}}return this._parseAsync({data,path:[],parent:ctx}).then((result2)=>isValid(result2)?{value:result2.value}:{issues:ctx.common.issues})}async parseAsync(data,params){let result2=await this.safeParseAsync(data,params);if(result2.success)return result2.data;throw result2.error}async safeParseAsync(data,params){let ctx={common:{issues:[],contextualErrorMap:params?.errorMap,async:!0},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType(data)},maybeAsyncResult=this._parse({data,path:ctx.path,parent:ctx}),result2=await(isAsync(maybeAsyncResult)?maybeAsyncResult:Promise.resolve(maybeAsyncResult));return handleResult(ctx,result2)}refine(check,message){let getIssueProperties=(val)=>{if(typeof message==="string"||typeof message>"u")return{message};else if(typeof message==="function")return message(val);else return message};return this._refinement((val,ctx)=>{let result2=check(val),setError=()=>ctx.addIssue({code:ZodIssueCode.custom,...getIssueProperties(val)});if(typeof Promise<"u"&&result2 instanceof Promise)return result2.then((data)=>{if(!data)return setError(),!1;else return!0});if(!result2)return setError(),!1;else return!0})}refinement(check,refinementData){return this._refinement((val,ctx)=>{if(!check(val))return ctx.addIssue(typeof refinementData==="function"?refinementData(val,ctx):refinementData),!1;else return!0})}_refinement(refinement){return new ZodEffects({schema:this,typeName:ZodFirstPartyTypeKind.ZodEffects,effect:{type:"refinement",refinement}})}superRefine(refinement){return this._refinement(refinement)}constructor(def){this.spa=this.safeParseAsync,this._def=def,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:(data)=>this["~validate"](data)}}optional(){return ZodOptional.create(this,this._def)}nullable(){return ZodNullable.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ZodArray.create(this)}promise(){return ZodPromise.create(this,this._def)}or(option){return ZodUnion.create([this,option],this._def)}and(incoming){return ZodIntersection.create(this,incoming,this._def)}transform(transform){return new ZodEffects({...processCreateParams(this._def),schema:this,typeName:ZodFirstPartyTypeKind.ZodEffects,effect:{type:"transform",transform}})}default(def){let defaultValueFunc=typeof def==="function"?def:()=>def;return new ZodDefault({...processCreateParams(this._def),innerType:this,defaultValue:defaultValueFunc,typeName:ZodFirstPartyTypeKind.ZodDefault})}brand(){return new ZodBranded({typeName:ZodFirstPartyTypeKind.ZodBranded,type:this,...processCreateParams(this._def)})}catch(def){let catchValueFunc=typeof def==="function"?def:()=>def;return new ZodCatch({...processCreateParams(this._def),innerType:this,catchValue:catchValueFunc,typeName:ZodFirstPartyTypeKind.ZodCatch})}describe(description){return new this.constructor({...this._def,description})}pipe(target){return ZodPipeline.create(this,target)}readonly(){return ZodReadonly.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}function timeRegexSource(args){let secondsRegexSource="[0-5]\\d";if(args.precision)secondsRegexSource=`${secondsRegexSource}\\.\\d{${args.precision}}`;else if(args.precision==null)secondsRegexSource=`${secondsRegexSource}(\\.\\d+)?`;let secondsQuantifier=args.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`}function timeRegex(args){return new RegExp(`^${timeRegexSource(args)}$`)}function datetimeRegex(args){let regex=`${dateRegexSource}T${timeRegexSource(args)}`,opts=[];if(opts.push(args.local?"Z?":"Z"),args.offset)opts.push("([+-]\\d{2}:?\\d{2})");return regex=`${regex}(${opts.join("|")})`,new RegExp(`^${regex}$`)}function isValidIP(ip,version){if((version==="v4"||!version)&&ipv4Regex.test(ip))return!0;if((version==="v6"||!version)&&ipv6Regex.test(ip))return!0;return!1}function isValidJWT(jwt,alg){if(!jwtRegex.test(jwt))return!1;try{let[header]=jwt.split(".");if(!header)return!1;let base64=header.replace(/-/g,"+").replace(/_/g,"/").padEnd(header.length+(4-header.length%4)%4,"="),decoded=JSON.parse(atob(base64));if(typeof decoded!=="object"||decoded===null)return!1;if("typ"in decoded&&decoded?.typ!=="JWT")return!1;if(!decoded.alg)return!1;if(alg&&decoded.alg!==alg)return!1;return!0}catch{return!1}}function isValidCidr(ip,version){if((version==="v4"||!version)&&ipv4CidrRegex.test(ip))return!0;if((version==="v6"||!version)&&ipv6CidrRegex.test(ip))return!0;return!1}function floatSafeRemainder(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepDecCount=(step.toString().split(".")[1]||"").length,decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}function deepPartialify(schema){if(schema instanceof ZodObject){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional.create(deepPartialify(fieldSchema))}return new ZodObject({...schema._def,shape:()=>newShape})}else if(schema instanceof ZodArray)return new ZodArray({...schema._def,type:deepPartialify(schema.element)});else if(schema instanceof ZodOptional)return ZodOptional.create(deepPartialify(schema.unwrap()));else if(schema instanceof ZodNullable)return ZodNullable.create(deepPartialify(schema.unwrap()));else if(schema instanceof ZodTuple)return ZodTuple.create(schema.items.map((item)=>deepPartialify(item)));else return schema}function mergeValues(a,b){let aType=getParsedType(a),bType=getParsedType(b);if(a===b)return{valid:!0,data:a};else if(aType===ZodParsedType.object&&bType===ZodParsedType.object){let bKeys=util.objectKeys(b),sharedKeys=util.objectKeys(a).filter((key)=>bKeys.indexOf(key)!==-1),newObj={...a,...b};for(let key of sharedKeys){let sharedValue=mergeValues(a[key],b[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType.array&&bType===ZodParsedType.array){if(a.length!==b.length)return{valid:!1};let newArray=[];for(let index=0;index<a.length;index++){let itemA=a[index],itemB=b[index],sharedValue=mergeValues(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else if(aType===ZodParsedType.date&&bType===ZodParsedType.date&&+a===+b)return{valid:!0,data:a};else return{valid:!1}}function createZodEnum(values,params){return new ZodEnum({values,typeName:ZodFirstPartyTypeKind.ZodEnum,...processCreateParams(params)})}function cleanParams(params,data){let p=typeof params==="function"?params(data):typeof params==="string"?{message:params}:params;return typeof p==="string"?{message:p}:p}function custom(check,_params={},fatal){if(check)return ZodAny.create().superRefine((data,ctx)=>{let r=check(data);if(r instanceof Promise)return r.then((r2)=>{if(!r2){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}return});return ZodAny.create()}var handleResult=(ctx,result2)=>{if(isValid(result2))return{success:!0,data:result2.value};else{if(!ctx.common.issues.length)throw Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let error=new ZodError(ctx.common.issues);return this._error=error,this._error}}}},cuidRegex,cuid2Regex,ulidRegex,uuidRegex,nanoidRegex,jwtRegex,durationRegex,emailRegex,_emojiRegex="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",emojiRegex,ipv4Regex,ipv4CidrRegex,ipv6Regex,ipv6CidrRegex,base64Regex,base64urlRegex,dateRegexSource="((\\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])))",dateRegex,ZodString,ZodNumber,ZodBigInt,ZodBoolean,ZodDate,ZodSymbol,ZodUndefined,ZodNull,ZodAny,ZodUnknown,ZodNever,ZodVoid,ZodArray,ZodObject,ZodUnion,getDiscriminator=(type)=>{if(type instanceof ZodLazy)return getDiscriminator(type.schema);else if(type instanceof ZodEffects)return getDiscriminator(type.innerType());else if(type instanceof ZodLiteral)return[type.value];else if(type instanceof ZodEnum)return type.options;else if(type instanceof ZodNativeEnum)return util.objectValues(type.enum);else if(type instanceof ZodDefault)return getDiscriminator(type._def.innerType);else if(type instanceof ZodUndefined)return[void 0];else if(type instanceof ZodNull)return[null];else if(type instanceof ZodOptional)return[void 0,...getDiscriminator(type.unwrap())];else if(type instanceof ZodNullable)return[null,...getDiscriminator(type.unwrap())];else if(type instanceof ZodBranded)return getDiscriminator(type.unwrap());else if(type instanceof ZodReadonly)return getDiscriminator(type.unwrap());else if(type instanceof ZodCatch)return getDiscriminator(type._def.innerType);else return[]},ZodDiscriminatedUnion,ZodIntersection,ZodTuple,ZodRecord,ZodMap,ZodSet,ZodFunction,ZodLazy,ZodLiteral,ZodEnum,ZodNativeEnum,ZodPromise,ZodEffects,ZodOptional,ZodNullable,ZodDefault,ZodCatch,ZodNaN,BRAND,ZodBranded,ZodPipeline,ZodReadonly,late,ZodFirstPartyTypeKind,instanceOfType=(cls,params={message:`Input not instance of ${cls.name}`})=>custom((data)=>data instanceof cls,params),stringType,numberType,nanType,bigIntType,booleanType,dateType,symbolType,undefinedType,nullType,anyType,unknownType,neverType,voidType,arrayType,objectType,strictObjectType,unionType,discriminatedUnionType,intersectionType,tupleType,recordType,mapType,setType,functionType,lazyType,literalType,enumType,nativeEnumType,promiseType,effectsType,optionalType,nullableType,preprocessType,pipelineType,ostring=()=>stringType().optional(),onumber=()=>numberType().optional(),oboolean=()=>booleanType().optional(),coerce,NEVER;var init_types=__esm(()=>{init_ZodError();init_errors();init_errorUtil();init_parseUtil();init_util();cuidRegex=/^c[^\s-]{8,}$/i,cuid2Regex=/^[0-9a-z]+$/,ulidRegex=/^[0-9A-HJKMNP-TV-Z]{26}$/i,uuidRegex=/^[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,nanoidRegex=/^[a-z0-9_-]{21}$/i,jwtRegex=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,durationRegex=/^[-+]?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)?)??$/,emailRegex=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,ipv4Regex=/^(?:(?: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])$/,ipv4CidrRegex=/^(?:(?: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])$/,ipv6Regex=/^(([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]))$/,ipv6CidrRegex=/^(([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])$/,base64Regex=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64urlRegex=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,dateRegex=new RegExp(`^${dateRegexSource}$`);ZodString=class ZodString extends ZodType{_parse(input){if(this._def.coerce)input.data=String(input.data);if(this._getType(input)!==ZodParsedType.string){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.string,received:ctx2.parsedType}),INVALID}let status=new ParseStatus,ctx=void 0;for(let check of this._def.checks)if(check.kind==="min"){if(input.data.length<check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty()}else if(check.kind==="max"){if(input.data.length>check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty()}else if(check.kind==="length"){let tooBig=input.data.length>check.value,tooSmall=input.data.length<check.value;if(tooBig||tooSmall){if(ctx=this._getOrReturnCtx(input,ctx),tooBig)addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message});else if(tooSmall)addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message});status.dirty()}}else if(check.kind==="email"){if(!emailRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"email",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="emoji"){if(!emojiRegex)emojiRegex=new RegExp(_emojiRegex,"u");if(!emojiRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"emoji",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="uuid"){if(!uuidRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"uuid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="nanoid"){if(!nanoidRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"nanoid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="cuid"){if(!cuidRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"cuid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="cuid2"){if(!cuid2Regex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"cuid2",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="ulid"){if(!ulidRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"ulid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="url")try{new URL(input.data)}catch{ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"url",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="regex"){if(check.regex.lastIndex=0,!check.regex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"regex",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="trim")input.data=input.data.trim();else if(check.kind==="includes"){if(!input.data.includes(check.value,check.position))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{includes:check.value,position:check.position},message:check.message}),status.dirty()}else if(check.kind==="toLowerCase")input.data=input.data.toLowerCase();else if(check.kind==="toUpperCase")input.data=input.data.toUpperCase();else if(check.kind==="startsWith"){if(!input.data.startsWith(check.value))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{startsWith:check.value},message:check.message}),status.dirty()}else if(check.kind==="endsWith"){if(!input.data.endsWith(check.value))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{endsWith:check.value},message:check.message}),status.dirty()}else if(check.kind==="datetime"){if(!datetimeRegex(check).test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"datetime",message:check.message}),status.dirty()}else if(check.kind==="date"){if(!dateRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"date",message:check.message}),status.dirty()}else if(check.kind==="time"){if(!timeRegex(check).test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"time",message:check.message}),status.dirty()}else if(check.kind==="duration"){if(!durationRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"duration",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="ip"){if(!isValidIP(input.data,check.version))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"ip",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="jwt"){if(!isValidJWT(input.data,check.alg))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"jwt",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="cidr"){if(!isValidCidr(input.data,check.version))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"cidr",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="base64"){if(!base64Regex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"base64",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="base64url"){if(!base64urlRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"base64url",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else util.assertNever(check);return{status:status.value,value:input.data}}_regex(regex,validation,message){return this.refinement((data)=>regex.test(data),{validation,code:ZodIssueCode.invalid_string,...errorUtil.errToObj(message)})}_addCheck(check){return new ZodString({...this._def,checks:[...this._def.checks,check]})}email(message){return this._addCheck({kind:"email",...errorUtil.errToObj(message)})}url(message){return this._addCheck({kind:"url",...errorUtil.errToObj(message)})}emoji(message){return this._addCheck({kind:"emoji",...errorUtil.errToObj(message)})}uuid(message){return this._addCheck({kind:"uuid",...errorUtil.errToObj(message)})}nanoid(message){return this._addCheck({kind:"nanoid",...errorUtil.errToObj(message)})}cuid(message){return this._addCheck({kind:"cuid",...errorUtil.errToObj(message)})}cuid2(message){return this._addCheck({kind:"cuid2",...errorUtil.errToObj(message)})}ulid(message){return this._addCheck({kind:"ulid",...errorUtil.errToObj(message)})}base64(message){return this._addCheck({kind:"base64",...errorUtil.errToObj(message)})}base64url(message){return this._addCheck({kind:"base64url",...errorUtil.errToObj(message)})}jwt(options){return this._addCheck({kind:"jwt",...errorUtil.errToObj(options)})}ip(options){return this._addCheck({kind:"ip",...errorUtil.errToObj(options)})}cidr(options){return this._addCheck({kind:"cidr",...errorUtil.errToObj(options)})}datetime(options){if(typeof options==="string")return this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:options});return this._addCheck({kind:"datetime",precision:typeof options?.precision>"u"?null:options?.precision,offset:options?.offset??!1,local:options?.local??!1,...errorUtil.errToObj(options?.message)})}date(message){return this._addCheck({kind:"date",message})}time(options){if(typeof options==="string")return this._addCheck({kind:"time",precision:null,message:options});return this._addCheck({kind:"time",precision:typeof options?.precision>"u"?null:options?.precision,...errorUtil.errToObj(options?.message)})}duration(message){return this._addCheck({kind:"duration",...errorUtil.errToObj(message)})}regex(regex,message){return this._addCheck({kind:"regex",regex,...errorUtil.errToObj(message)})}includes(value,options){return this._addCheck({kind:"includes",value,position:options?.position,...errorUtil.errToObj(options?.message)})}startsWith(value,message){return this._addCheck({kind:"startsWith",value,...errorUtil.errToObj(message)})}endsWith(value,message){return this._addCheck({kind:"endsWith",value,...errorUtil.errToObj(message)})}min(minLength,message){return this._addCheck({kind:"min",value:minLength,...errorUtil.errToObj(message)})}max(maxLength,message){return this._addCheck({kind:"max",value:maxLength,...errorUtil.errToObj(message)})}length(len,message){return this._addCheck({kind:"length",value:len,...errorUtil.errToObj(message)})}nonempty(message){return this.min(1,errorUtil.errToObj(message))}trim(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find((ch)=>ch.kind==="datetime")}get isDate(){return!!this._def.checks.find((ch)=>ch.kind==="date")}get isTime(){return!!this._def.checks.find((ch)=>ch.kind==="time")}get isDuration(){return!!this._def.checks.find((ch)=>ch.kind==="duration")}get isEmail(){return!!this._def.checks.find((ch)=>ch.kind==="email")}get isURL(){return!!this._def.checks.find((ch)=>ch.kind==="url")}get isEmoji(){return!!this._def.checks.find((ch)=>ch.kind==="emoji")}get isUUID(){return!!this._def.checks.find((ch)=>ch.kind==="uuid")}get isNANOID(){return!!this._def.checks.find((ch)=>ch.kind==="nanoid")}get isCUID(){return!!this._def.checks.find((ch)=>ch.kind==="cuid")}get isCUID2(){return!!this._def.checks.find((ch)=>ch.kind==="cuid2")}get isULID(){return!!this._def.checks.find((ch)=>ch.kind==="ulid")}get isIP(){return!!this._def.checks.find((ch)=>ch.kind==="ip")}get isCIDR(){return!!this._def.checks.find((ch)=>ch.kind==="cidr")}get isBase64(){return!!this._def.checks.find((ch)=>ch.kind==="base64")}get isBase64url(){return!!this._def.checks.find((ch)=>ch.kind==="base64url")}get minLength(){let min=null;for(let ch of this._def.checks)if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}return min}get maxLength(){let max=null;for(let ch of this._def.checks)if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return max}};ZodString.create=(params)=>{return new ZodString({checks:[],typeName:ZodFirstPartyTypeKind.ZodString,coerce:params?.coerce??!1,...processCreateParams(params)})};ZodNumber=class ZodNumber extends ZodType{constructor(){super(...arguments);this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(input){if(this._def.coerce)input.data=Number(input.data);if(this._getType(input)!==ZodParsedType.number){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.number,received:ctx2.parsedType}),INVALID}let ctx=void 0,status=new ParseStatus;for(let check of this._def.checks)if(check.kind==="int"){if(!util.isInteger(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:"integer",received:"float",message:check.message}),status.dirty()}else if(check.kind==="min"){if(check.inclusive?input.data<check.value:input.data<=check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()}else if(check.kind==="max"){if(check.inclusive?input.data>check.value:input.data>=check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()}else if(check.kind==="multipleOf"){if(floatSafeRemainder(input.data,check.value)!==0)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()}else if(check.kind==="finite"){if(!Number.isFinite(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_finite,message:check.message}),status.dirty()}else util.assertNever(check);return{status:status.value,value:input.data}}gte(value,message){return this.setLimit("min",value,!0,errorUtil.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil.toString(message))}setLimit(kind,value,inclusive,message){return new ZodNumber({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil.toString(message)}]})}_addCheck(check){return new ZodNumber({...this._def,checks:[...this._def.checks,check]})}int(message){return this._addCheck({kind:"int",message:errorUtil.toString(message)})}positive(message){return this._addCheck({kind:"min",value:0,inclusive:!1,message:errorUtil.toString(message)})}negative(message){return this._addCheck({kind:"max",value:0,inclusive:!1,message:errorUtil.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:0,inclusive:!0,message:errorUtil.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:0,inclusive:!0,message:errorUtil.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil.toString(message)})}finite(message){return this._addCheck({kind:"finite",message:errorUtil.toString(message)})}safe(message){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:errorUtil.toString(message)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:errorUtil.toString(message)})}get minValue(){let min=null;for(let ch of this._def.checks)if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}return min}get maxValue(){let max=null;for(let ch of this._def.checks)if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return max}get isInt(){return!!this._def.checks.find((ch)=>ch.kind==="int"||ch.kind==="multipleOf"&&util.isInteger(ch.value))}get isFinite(){let max=null,min=null;for(let ch of this._def.checks)if(ch.kind==="finite"||ch.kind==="int"||ch.kind==="multipleOf")return!0;else if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}else if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return Number.isFinite(min)&&Number.isFinite(max)}};ZodNumber.create=(params)=>{return new ZodNumber({checks:[],typeName:ZodFirstPartyTypeKind.ZodNumber,coerce:params?.coerce||!1,...processCreateParams(params)})};ZodBigInt=class ZodBigInt extends ZodType{constructor(){super(...arguments);this.min=this.gte,this.max=this.lte}_parse(input){if(this._def.coerce)try{input.data=BigInt(input.data)}catch{return this._getInvalidInput(input)}if(this._getType(input)!==ZodParsedType.bigint)return this._getInvalidInput(input);let ctx=void 0,status=new ParseStatus;for(let check of this._def.checks)if(check.kind==="min"){if(check.inclusive?input.data<check.value:input.data<=check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_small,type:"bigint",minimum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()}else if(check.kind==="max"){if(check.inclusive?input.data>check.value:input.data>=check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_big,type:"bigint",maximum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()}else if(check.kind==="multipleOf"){if(input.data%check.value!==BigInt(0))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()}else util.assertNever(check);return{status:status.value,value:input.data}}_getInvalidInput(input){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.bigint,received:ctx.parsedType}),INVALID}gte(value,message){return this.setLimit("min",value,!0,errorUtil.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil.toString(message))}setLimit(kind,value,inclusive,message){return new ZodBigInt({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil.toString(message)}]})}_addCheck(check){return new ZodBigInt({...this._def,checks:[...this._def.checks,check]})}positive(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:errorUtil.toString(message)})}negative(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:errorUtil.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:errorUtil.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:errorUtil.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil.toString(message)})}get minValue(){let min=null;for(let ch of this._def.checks)if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}return min}get maxValue(){let max=null;for(let ch of this._def.checks)if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return max}};ZodBigInt.create=(params)=>{return new ZodBigInt({checks:[],typeName:ZodFirstPartyTypeKind.ZodBigInt,coerce:params?.coerce??!1,...processCreateParams(params)})};ZodBoolean=class ZodBoolean extends ZodType{_parse(input){if(this._def.coerce)input.data=Boolean(input.data);if(this._getType(input)!==ZodParsedType.boolean){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.boolean,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodBoolean.create=(params)=>{return new ZodBoolean({typeName:ZodFirstPartyTypeKind.ZodBoolean,coerce:params?.coerce||!1,...processCreateParams(params)})};ZodDate=class ZodDate extends ZodType{_parse(input){if(this._def.coerce)input.data=new Date(input.data);if(this._getType(input)!==ZodParsedType.date){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.date,received:ctx2.parsedType}),INVALID}if(Number.isNaN(input.data.getTime())){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_date}),INVALID}let status=new ParseStatus,ctx=void 0;for(let check of this._def.checks)if(check.kind==="min"){if(input.data.getTime()<check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_small,message:check.message,inclusive:!0,exact:!1,minimum:check.value,type:"date"}),status.dirty()}else if(check.kind==="max"){if(input.data.getTime()>check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_big,message:check.message,inclusive:!0,exact:!1,maximum:check.value,type:"date"}),status.dirty()}else util.assertNever(check);return{status:status.value,value:new Date(input.data.getTime())}}_addCheck(check){return new ZodDate({...this._def,checks:[...this._def.checks,check]})}min(minDate,message){return this._addCheck({kind:"min",value:minDate.getTime(),message:errorUtil.toString(message)})}max(maxDate,message){return this._addCheck({kind:"max",value:maxDate.getTime(),message:errorUtil.toString(message)})}get minDate(){let min=null;for(let ch of this._def.checks)if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}return min!=null?new Date(min):null}get maxDate(){let max=null;for(let ch of this._def.checks)if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return max!=null?new Date(max):null}};ZodDate.create=(params)=>{return new ZodDate({checks:[],coerce:params?.coerce||!1,typeName:ZodFirstPartyTypeKind.ZodDate,...processCreateParams(params)})};ZodSymbol=class ZodSymbol extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.symbol){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.symbol,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodSymbol.create=(params)=>{return new ZodSymbol({typeName:ZodFirstPartyTypeKind.ZodSymbol,...processCreateParams(params)})};ZodUndefined=class ZodUndefined extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.undefined){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.undefined,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodUndefined.create=(params)=>{return new ZodUndefined({typeName:ZodFirstPartyTypeKind.ZodUndefined,...processCreateParams(params)})};ZodNull=class ZodNull extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.null){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.null,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodNull.create=(params)=>{return new ZodNull({typeName:ZodFirstPartyTypeKind.ZodNull,...processCreateParams(params)})};ZodAny=class ZodAny extends ZodType{constructor(){super(...arguments);this._any=!0}_parse(input){return OK(input.data)}};ZodAny.create=(params)=>{return new ZodAny({typeName:ZodFirstPartyTypeKind.ZodAny,...processCreateParams(params)})};ZodUnknown=class ZodUnknown extends ZodType{constructor(){super(...arguments);this._unknown=!0}_parse(input){return OK(input.data)}};ZodUnknown.create=(params)=>{return new ZodUnknown({typeName:ZodFirstPartyTypeKind.ZodUnknown,...processCreateParams(params)})};ZodNever=class ZodNever extends ZodType{_parse(input){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.never,received:ctx.parsedType}),INVALID}};ZodNever.create=(params)=>{return new ZodNever({typeName:ZodFirstPartyTypeKind.ZodNever,...processCreateParams(params)})};ZodVoid=class ZodVoid extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.undefined){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.void,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodVoid.create=(params)=>{return new ZodVoid({typeName:ZodFirstPartyTypeKind.ZodVoid,...processCreateParams(params)})};ZodArray=class ZodArray extends ZodType{_parse(input){let{ctx,status}=this._processInputParams(input),def=this._def;if(ctx.parsedType!==ZodParsedType.array)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.array,received:ctx.parsedType}),INVALID;if(def.exactLength!==null){let tooBig=ctx.data.length>def.exactLength.value,tooSmall=ctx.data.length<def.exactLength.value;if(tooBig||tooSmall)addIssueToContext(ctx,{code:tooBig?ZodIssueCode.too_big:ZodIssueCode.too_small,minimum:tooSmall?def.exactLength.value:void 0,maximum:tooBig?def.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:def.exactLength.message}),status.dirty()}if(def.minLength!==null){if(ctx.data.length<def.minLength.value)addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:def.minLength.value,type:"array",inclusive:!0,exact:!1,message:def.minLength.message}),status.dirty()}if(def.maxLength!==null){if(ctx.data.length>def.maxLength.value)addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:def.maxLength.value,type:"array",inclusive:!0,exact:!1,message:def.maxLength.message}),status.dirty()}if(ctx.common.async)return Promise.all([...ctx.data].map((item,i)=>{return def.type._parseAsync(new ParseInputLazyPath(ctx,item,ctx.path,i))})).then((result3)=>{return ParseStatus.mergeArray(status,result3)});let result2=[...ctx.data].map((item,i)=>{return def.type._parseSync(new ParseInputLazyPath(ctx,item,ctx.path,i))});return ParseStatus.mergeArray(status,result2)}get element(){return this._def.type}min(minLength,message){return new ZodArray({...this._def,minLength:{value:minLength,message:errorUtil.toString(message)}})}max(maxLength,message){return new ZodArray({...this._def,maxLength:{value:maxLength,message:errorUtil.toString(message)}})}length(len,message){return new ZodArray({...this._def,exactLength:{value:len,message:errorUtil.toString(message)}})}nonempty(message){return this.min(1,message)}};ZodArray.create=(schema,params)=>{return new ZodArray({type:schema,minLength:null,maxLength:null,exactLength:null,typeName:ZodFirstPartyTypeKind.ZodArray,...processCreateParams(params)})};ZodObject=class ZodObject extends ZodType{constructor(){super(...arguments);this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let shape=this._def.shape(),keys=util.objectKeys(shape);return this._cached={shape,keys},this._cached}_parse(input){if(this._getType(input)!==ZodParsedType.object){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx2.parsedType}),INVALID}let{status,ctx}=this._processInputParams(input),{shape,keys:shapeKeys}=this._getCached(),extraKeys=[];if(!(this._def.catchall instanceof ZodNever&&this._def.unknownKeys==="strip")){for(let key in ctx.data)if(!shapeKeys.includes(key))extraKeys.push(key)}let pairs=[];for(let key of shapeKeys){let keyValidator=shape[key],value=ctx.data[key];pairs.push({key:{status:"valid",value:key},value:keyValidator._parse(new ParseInputLazyPath(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}if(this._def.catchall instanceof ZodNever){let unknownKeys=this._def.unknownKeys;if(unknownKeys==="passthrough")for(let key of extraKeys)pairs.push({key:{status:"valid",value:key},value:{status:"valid",value:ctx.data[key]}});else if(unknownKeys==="strict"){if(extraKeys.length>0)addIssueToContext(ctx,{code:ZodIssueCode.unrecognized_keys,keys:extraKeys}),status.dirty()}else if(unknownKeys==="strip");else throw Error("Internal ZodObject error: invalid unknownKeys value.")}else{let catchall=this._def.catchall;for(let key of extraKeys){let value=ctx.data[key];pairs.push({key:{status:"valid",value:key},value:catchall._parse(new ParseInputLazyPath(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}}if(ctx.common.async)return Promise.resolve().then(async()=>{let syncPairs=[];for(let pair of pairs){let key=await pair.key,value=await pair.value;syncPairs.push({key,value,alwaysSet:pair.alwaysSet})}return syncPairs}).then((syncPairs)=>{return ParseStatus.mergeObjectSync(status,syncPairs)});else return ParseStatus.mergeObjectSync(status,pairs)}get shape(){return this._def.shape()}strict(message){return errorUtil.errToObj,new ZodObject({...this._def,unknownKeys:"strict",...message!==void 0?{errorMap:(issue,ctx)=>{let defaultError=this._def.errorMap?.(issue,ctx).message??ctx.defaultError;if(issue.code==="unrecognized_keys")return{message:errorUtil.errToObj(message).message??defaultError};return{message:defaultError}}}:{}})}strip(){return new ZodObject({...this._def,unknownKeys:"strip"})}passthrough(){return new ZodObject({...this._def,unknownKeys:"passthrough"})}extend(augmentation){return new ZodObject({...this._def,shape:()=>({...this._def.shape(),...augmentation})})}merge(merging){return new ZodObject({unknownKeys:merging._def.unknownKeys,catchall:merging._def.catchall,shape:()=>({...this._def.shape(),...merging._def.shape()}),typeName:ZodFirstPartyTypeKind.ZodObject})}setKey(key,schema){return this.augment({[key]:schema})}catchall(index){return new ZodObject({...this._def,catchall:index})}pick(mask){let shape={};for(let key of util.objectKeys(mask))if(mask[key]&&this.shape[key])shape[key]=this.shape[key];return new ZodObject({...this._def,shape:()=>shape})}omit(mask){let shape={};for(let key of util.objectKeys(this.shape))if(!mask[key])shape[key]=this.shape[key];return new ZodObject({...this._def,shape:()=>shape})}deepPartial(){return deepPartialify(this)}partial(mask){let newShape={};for(let key of util.objectKeys(this.shape)){let fieldSchema=this.shape[key];if(mask&&!mask[key])newShape[key]=fieldSchema;else newShape[key]=fieldSchema.optional()}return new ZodObject({...this._def,shape:()=>newShape})}required(mask){let newShape={};for(let key of util.objectKeys(this.shape))if(mask&&!mask[key])newShape[key]=this.shape[key];else{let newField=this.shape[key];while(newField instanceof ZodOptional)newField=newField._def.innerType;newShape[key]=newField}return new ZodObject({...this._def,shape:()=>newShape})}keyof(){return createZodEnum(util.objectKeys(this.shape))}};ZodObject.create=(shape,params)=>{return new ZodObject({shape:()=>shape,unknownKeys:"strip",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)})};ZodObject.strictCreate=(shape,params)=>{return new ZodObject({shape:()=>shape,unknownKeys:"strict",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)})};ZodObject.lazycreate=(shape,params)=>{return new ZodObject({shape,unknownKeys:"strip",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)})};ZodUnion=class ZodUnion extends ZodType{_parse(input){let{ctx}=this._processInputParams(input),options=this._def.options;function handleResults(results){for(let result2 of results)if(result2.result.status==="valid")return result2.result;for(let result2 of results)if(result2.result.status==="dirty")return ctx.common.issues.push(...result2.ctx.common.issues),result2.result;let unionErrors=results.map((result2)=>new ZodError(result2.ctx.common.issues));return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union,unionErrors}),INVALID}if(ctx.common.async)return Promise.all(options.map(async(option)=>{let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null};return{result:await option._parseAsync({data:ctx.data,path:ctx.path,parent:childCtx}),ctx:childCtx}})).then(handleResults);else{let dirty=void 0,issues=[];for(let option of options){let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null},result2=option._parseSync({data:ctx.data,path:ctx.path,parent:childCtx});if(result2.status==="valid")return result2;else if(result2.status==="dirty"&&!dirty)dirty={result:result2,ctx:childCtx};if(childCtx.common.issues.length)issues.push(childCtx.common.issues)}if(dirty)return ctx.common.issues.push(...dirty.ctx.common.issues),dirty.result;let unionErrors=issues.map((issues2)=>new ZodError(issues2));return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union,unionErrors}),INVALID}}get options(){return this._def.options}};ZodUnion.create=(types,params)=>{return new ZodUnion({options:types,typeName:ZodFirstPartyTypeKind.ZodUnion,...processCreateParams(params)})};ZodDiscriminatedUnion=class ZodDiscriminatedUnion extends ZodType{_parse(input){let{ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.object)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx.parsedType}),INVALID;let discriminator=this.discriminator,discriminatorValue=ctx.data[discriminator],option=this.optionsMap.get(discriminatorValue);if(!option)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[discriminator]}),INVALID;if(ctx.common.async)return option._parseAsync({data:ctx.data,path:ctx.path,parent:ctx});else return option._parseSync({data:ctx.data,path:ctx.path,parent:ctx})}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(discriminator,options,params){let optionsMap=new Map;for(let type of options){let discriminatorValues=getDiscriminator(type.shape[discriminator]);if(!discriminatorValues.length)throw Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`);for(let value of discriminatorValues){if(optionsMap.has(value))throw Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);optionsMap.set(value,type)}}return new ZodDiscriminatedUnion({typeName:ZodFirstPartyTypeKind.ZodDiscriminatedUnion,discriminator,options,optionsMap,...processCreateParams(params)})}};ZodIntersection=class ZodIntersection extends ZodType{_parse(input){let{status,ctx}=this._processInputParams(input),handleParsed=(parsedLeft,parsedRight)=>{if(isAborted(parsedLeft)||isAborted(parsedRight))return INVALID;let merged=mergeValues(parsedLeft.value,parsedRight.value);if(!merged.valid)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_intersection_types}),INVALID;if(isDirty(parsedLeft)||isDirty(parsedRight))status.dirty();return{status:status.value,value:merged.data}};if(ctx.common.async)return Promise.all([this._def.left._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseAsync({data:ctx.data,path:ctx.path,parent:ctx})]).then(([left,right])=>handleParsed(left,right));else return handleParsed(this._def.left._parseSync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseSync({data:ctx.data,path:ctx.path,parent:ctx}))}};ZodIntersection.create=(left,right,params)=>{return new ZodIntersection({left,right,typeName:ZodFirstPartyTypeKind.ZodIntersection,...processCreateParams(params)})};ZodTuple=class ZodTuple extends ZodType{_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.array)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.array,received:ctx.parsedType}),INVALID;if(ctx.data.length<this._def.items.length)return addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),INVALID;if(!this._def.rest&&ctx.data.length>this._def.items.length)addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),status.dirty();let items=[...ctx.data].map((item,itemIndex)=>{let schema=this._def.items[itemIndex]||this._def.rest;if(!schema)return null;return schema._parse(new ParseInputLazyPath(ctx,item,ctx.path,itemIndex))}).filter((x)=>!!x);if(ctx.common.async)return Promise.all(items).then((results)=>{return ParseStatus.mergeArray(status,results)});else return ParseStatus.mergeArray(status,items)}get items(){return this._def.items}rest(rest){return new ZodTuple({...this._def,rest})}};ZodTuple.create=(schemas,params)=>{if(!Array.isArray(schemas))throw Error("You must pass an array of schemas to z.tuple([ ... ])");return new ZodTuple({items:schemas,typeName:ZodFirstPartyTypeKind.ZodTuple,rest:null,...processCreateParams(params)})};ZodRecord=class ZodRecord extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.object)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx.parsedType}),INVALID;let pairs=[],keyType=this._def.keyType,valueType=this._def.valueType;for(let key in ctx.data)pairs.push({key:keyType._parse(new ParseInputLazyPath(ctx,key,ctx.path,key)),value:valueType._parse(new ParseInputLazyPath(ctx,ctx.data[key],ctx.path,key)),alwaysSet:key in ctx.data});if(ctx.common.async)return ParseStatus.mergeObjectAsync(status,pairs);else return ParseStatus.mergeObjectSync(status,pairs)}get element(){return this._def.valueType}static create(first,second,third){if(second instanceof ZodType)return new ZodRecord({keyType:first,valueType:second,typeName:ZodFirstPartyTypeKind.ZodRecord,...processCreateParams(third)});return new ZodRecord({keyType:ZodString.create(),valueType:first,typeName:ZodFirstPartyTypeKind.ZodRecord,...processCreateParams(second)})}};ZodMap=class ZodMap extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.map)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.map,received:ctx.parsedType}),INVALID;let keyType=this._def.keyType,valueType=this._def.valueType,pairs=[...ctx.data.entries()].map(([key,value],index)=>{return{key:keyType._parse(new ParseInputLazyPath(ctx,key,ctx.path,[index,"key"])),value:valueType._parse(new ParseInputLazyPath(ctx,value,ctx.path,[index,"value"]))}});if(ctx.common.async){let finalMap=new Map;return Promise.resolve().then(async()=>{for(let pair of pairs){let key=await pair.key,value=await pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID;if(key.status==="dirty"||value.status==="dirty")status.dirty();finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}})}else{let finalMap=new Map;for(let pair of pairs){let{key,value}=pair;if(key.status==="aborted"||value.status==="aborted")return INVALID;if(key.status==="dirty"||value.status==="dirty")status.dirty();finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}}}};ZodMap.create=(keyType,valueType,params)=>{return new ZodMap({valueType,keyType,typeName:ZodFirstPartyTypeKind.ZodMap,...processCreateParams(params)})};ZodSet=class ZodSet extends ZodType{_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.set)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.set,received:ctx.parsedType}),INVALID;let def=this._def;if(def.minSize!==null){if(ctx.data.size<def.minSize.value)addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:def.minSize.value,type:"set",inclusive:!0,exact:!1,message:def.minSize.message}),status.dirty()}if(def.maxSize!==null){if(ctx.data.size>def.maxSize.value)addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:def.maxSize.value,type:"set",inclusive:!0,exact:!1,message:def.maxSize.message}),status.dirty()}let valueType=this._def.valueType;function finalizeSet(elements2){let parsedSet=new Set;for(let element of elements2){if(element.status==="aborted")return INVALID;if(element.status==="dirty")status.dirty();parsedSet.add(element.value)}return{status:status.value,value:parsedSet}}let elements=[...ctx.data.values()].map((item,i)=>valueType._parse(new ParseInputLazyPath(ctx,item,ctx.path,i)));if(ctx.common.async)return Promise.all(elements).then((elements2)=>finalizeSet(elements2));else return finalizeSet(elements)}min(minSize,message){return new ZodSet({...this._def,minSize:{value:minSize,message:errorUtil.toString(message)}})}max(maxSize,message){return new ZodSet({...this._def,maxSize:{value:maxSize,message:errorUtil.toString(message)}})}size(size,message){return this.min(size,message).max(size,message)}nonempty(message){return this.min(1,message)}};ZodSet.create=(valueType,params)=>{return new ZodSet({valueType,minSize:null,maxSize:null,typeName:ZodFirstPartyTypeKind.ZodSet,...processCreateParams(params)})};ZodFunction=class ZodFunction extends ZodType{constructor(){super(...arguments);this.validate=this.implement}_parse(input){let{ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.function)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.function,received:ctx.parsedType}),INVALID;function makeArgsIssue(args,error){return makeIssue({data:args,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap(),en_default].filter((x)=>!!x),issueData:{code:ZodIssueCode.invalid_arguments,argumentsError:error}})}function makeReturnsIssue(returns,error){return makeIssue({data:returns,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap(),en_default].filter((x)=>!!x),issueData:{code:ZodIssueCode.invalid_return_type,returnTypeError:error}})}let params={errorMap:ctx.common.contextualErrorMap},fn=ctx.data;if(this._def.returns instanceof ZodPromise){let me=this;return OK(async function(...args){let error=new ZodError([]),parsedArgs=await me._def.args.parseAsync(args,params).catch((e)=>{throw error.addIssue(makeArgsIssue(args,e)),error}),result2=await Reflect.apply(fn,this,parsedArgs);return await me._def.returns._def.type.parseAsync(result2,params).catch((e)=>{throw error.addIssue(makeReturnsIssue(result2,e)),error})})}else{let me=this;return OK(function(...args){let parsedArgs=me._def.args.safeParse(args,params);if(!parsedArgs.success)throw new ZodError([makeArgsIssue(args,parsedArgs.error)]);let result2=Reflect.apply(fn,this,parsedArgs.data),parsedReturns=me._def.returns.safeParse(result2,params);if(!parsedReturns.success)throw new ZodError([makeReturnsIssue(result2,parsedReturns.error)]);return parsedReturns.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...items){return new ZodFunction({...this._def,args:ZodTuple.create(items).rest(ZodUnknown.create())})}returns(returnType){return new ZodFunction({...this._def,returns:returnType})}implement(func){return this.parse(func)}strictImplement(func){return this.parse(func)}static create(args,returns,params){return new ZodFunction({args:args?args:ZodTuple.create([]).rest(ZodUnknown.create()),returns:returns||ZodUnknown.create(),typeName:ZodFirstPartyTypeKind.ZodFunction,...processCreateParams(params)})}};ZodLazy=class ZodLazy extends ZodType{get schema(){return this._def.getter()}_parse(input){let{ctx}=this._processInputParams(input);return this._def.getter()._parse({data:ctx.data,path:ctx.path,parent:ctx})}};ZodLazy.create=(getter,params)=>{return new ZodLazy({getter,typeName:ZodFirstPartyTypeKind.ZodLazy,...processCreateParams(params)})};ZodLiteral=class ZodLiteral extends ZodType{_parse(input){if(input.data!==this._def.value){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_literal,expected:this._def.value}),INVALID}return{status:"valid",value:input.data}}get value(){return this._def.value}};ZodLiteral.create=(value,params)=>{return new ZodLiteral({value,typeName:ZodFirstPartyTypeKind.ZodLiteral,...processCreateParams(params)})};ZodEnum=class ZodEnum extends ZodType{_parse(input){if(typeof input.data!=="string"){let ctx=this._getOrReturnCtx(input),expectedValues=this._def.values;return addIssueToContext(ctx,{expected:util.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode.invalid_type}),INVALID}if(!this._cache)this._cache=new Set(this._def.values);if(!this._cache.has(input.data)){let ctx=this._getOrReturnCtx(input),expectedValues=this._def.values;return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_enum_value,options:expectedValues}),INVALID}return OK(input.data)}get options(){return this._def.values}get enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Values(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}extract(values,newDef=this._def){return ZodEnum.create(values,{...this._def,...newDef})}exclude(values,newDef=this._def){return ZodEnum.create(this.options.filter((opt)=>!values.includes(opt)),{...this._def,...newDef})}};ZodEnum.create=createZodEnum;ZodNativeEnum=class ZodNativeEnum extends ZodType{_parse(input){let nativeEnumValues=util.getValidEnumValues(this._def.values),ctx=this._getOrReturnCtx(input);if(ctx.parsedType!==ZodParsedType.string&&ctx.parsedType!==ZodParsedType.number){let expectedValues=util.objectValues(nativeEnumValues);return addIssueToContext(ctx,{expected:util.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode.invalid_type}),INVALID}if(!this._cache)this._cache=new Set(util.getValidEnumValues(this._def.values));if(!this._cache.has(input.data)){let expectedValues=util.objectValues(nativeEnumValues);return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_enum_value,options:expectedValues}),INVALID}return OK(input.data)}get enum(){return this._def.values}};ZodNativeEnum.create=(values,params)=>{return new ZodNativeEnum({values,typeName:ZodFirstPartyTypeKind.ZodNativeEnum,...processCreateParams(params)})};ZodPromise=class ZodPromise extends ZodType{unwrap(){return this._def.type}_parse(input){let{ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.promise&&ctx.common.async===!1)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.promise,received:ctx.parsedType}),INVALID;let promisified=ctx.parsedType===ZodParsedType.promise?ctx.data:Promise.resolve(ctx.data);return OK(promisified.then((data)=>{return this._def.type.parseAsync(data,{path:ctx.path,errorMap:ctx.common.contextualErrorMap})}))}};ZodPromise.create=(schema,params)=>{return new ZodPromise({type:schema,typeName:ZodFirstPartyTypeKind.ZodPromise,...processCreateParams(params)})};ZodEffects=class ZodEffects extends ZodType{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ZodFirstPartyTypeKind.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(input){let{status,ctx}=this._processInputParams(input),effect=this._def.effect||null,checkCtx={addIssue:(arg)=>{if(addIssueToContext(ctx,arg),arg.fatal)status.abort();else status.dirty()},get path(){return ctx.path}};if(checkCtx.addIssue=checkCtx.addIssue.bind(checkCtx),effect.type==="preprocess"){let processed=effect.transform(ctx.data,checkCtx);if(ctx.common.async)return Promise.resolve(processed).then(async(processed2)=>{if(status.value==="aborted")return INVALID;let result2=await this._def.schema._parseAsync({data:processed2,path:ctx.path,parent:ctx});if(result2.status==="aborted")return INVALID;if(result2.status==="dirty")return DIRTY(result2.value);if(status.value==="dirty")return DIRTY(result2.value);return result2});else{if(status.value==="aborted")return INVALID;let result2=this._def.schema._parseSync({data:processed,path:ctx.path,parent:ctx});if(result2.status==="aborted")return INVALID;if(result2.status==="dirty")return DIRTY(result2.value);if(status.value==="dirty")return DIRTY(result2.value);return result2}}if(effect.type==="refinement"){let executeRefinement=(acc)=>{let result2=effect.refinement(acc,checkCtx);if(ctx.common.async)return Promise.resolve(result2);if(result2 instanceof Promise)throw Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return acc};if(ctx.common.async===!1){let inner=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(inner.status==="aborted")return INVALID;if(inner.status==="dirty")status.dirty();return executeRefinement(inner.value),{status:status.value,value:inner.value}}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then((inner)=>{if(inner.status==="aborted")return INVALID;if(inner.status==="dirty")status.dirty();return executeRefinement(inner.value).then(()=>{return{status:status.value,value:inner.value}})})}if(effect.type==="transform")if(ctx.common.async===!1){let base=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(!isValid(base))return INVALID;let result2=effect.transform(base.value,checkCtx);if(result2 instanceof Promise)throw Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:status.value,value:result2}}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then((base)=>{if(!isValid(base))return INVALID;return Promise.resolve(effect.transform(base.value,checkCtx)).then((result2)=>({status:status.value,value:result2}))});util.assertNever(effect)}};ZodEffects.create=(schema,effect,params)=>{return new ZodEffects({schema,typeName:ZodFirstPartyTypeKind.ZodEffects,effect,...processCreateParams(params)})};ZodEffects.createWithPreprocess=(preprocess,schema,params)=>{return new ZodEffects({schema,effect:{type:"preprocess",transform:preprocess},typeName:ZodFirstPartyTypeKind.ZodEffects,...processCreateParams(params)})};ZodOptional=class ZodOptional extends ZodType{_parse(input){if(this._getType(input)===ZodParsedType.undefined)return OK(void 0);return this._def.innerType._parse(input)}unwrap(){return this._def.innerType}};ZodOptional.create=(type,params)=>{return new ZodOptional({innerType:type,typeName:ZodFirstPartyTypeKind.ZodOptional,...processCreateParams(params)})};ZodNullable=class ZodNullable extends ZodType{_parse(input){if(this._getType(input)===ZodParsedType.null)return OK(null);return this._def.innerType._parse(input)}unwrap(){return this._def.innerType}};ZodNullable.create=(type,params)=>{return new ZodNullable({innerType:type,typeName:ZodFirstPartyTypeKind.ZodNullable,...processCreateParams(params)})};ZodDefault=class ZodDefault extends ZodType{_parse(input){let{ctx}=this._processInputParams(input),data=ctx.data;if(ctx.parsedType===ZodParsedType.undefined)data=this._def.defaultValue();return this._def.innerType._parse({data,path:ctx.path,parent:ctx})}removeDefault(){return this._def.innerType}};ZodDefault.create=(type,params)=>{return new ZodDefault({innerType:type,typeName:ZodFirstPartyTypeKind.ZodDefault,defaultValue:typeof params.default==="function"?params.default:()=>params.default,...processCreateParams(params)})};ZodCatch=class ZodCatch extends ZodType{_parse(input){let{ctx}=this._processInputParams(input),newCtx={...ctx,common:{...ctx.common,issues:[]}},result2=this._def.innerType._parse({data:newCtx.data,path:newCtx.path,parent:{...newCtx}});if(isAsync(result2))return result2.then((result3)=>{return{status:"valid",value:result3.status==="valid"?result3.value:this._def.catchValue({get error(){return new ZodError(newCtx.common.issues)},input:newCtx.data})}});else return{status:"valid",value:result2.status==="valid"?result2.value:this._def.catchValue({get error(){return new ZodError(newCtx.common.issues)},input:newCtx.data})}}removeCatch(){return this._def.innerType}};ZodCatch.create=(type,params)=>{return new ZodCatch({innerType:type,typeName:ZodFirstPartyTypeKind.ZodCatch,catchValue:typeof params.catch==="function"?params.catch:()=>params.catch,...processCreateParams(params)})};ZodNaN=class ZodNaN extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.nan){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.nan,received:ctx.parsedType}),INVALID}return{status:"valid",value:input.data}}};ZodNaN.create=(params)=>{return new ZodNaN({typeName:ZodFirstPartyTypeKind.ZodNaN,...processCreateParams(params)})};BRAND=Symbol("zod_brand");ZodBranded=class ZodBranded extends ZodType{_parse(input){let{ctx}=this._processInputParams(input),data=ctx.data;return this._def.type._parse({data,path:ctx.path,parent:ctx})}unwrap(){return this._def.type}};ZodPipeline=class ZodPipeline extends ZodType{_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.common.async)return(async()=>{let inResult=await this._def.in._parseAsync({data:ctx.data,path:ctx.path,parent:ctx});if(inResult.status==="aborted")return INVALID;if(inResult.status==="dirty")return status.dirty(),DIRTY(inResult.value);else return this._def.out._parseAsync({data:inResult.value,path:ctx.path,parent:ctx})})();else{let inResult=this._def.in._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(inResult.status==="aborted")return INVALID;if(inResult.status==="dirty")return status.dirty(),{status:"dirty",value:inResult.value};else return this._def.out._parseSync({data:inResult.value,path:ctx.path,parent:ctx})}}static create(a,b){return new ZodPipeline({in:a,out:b,typeName:ZodFirstPartyTypeKind.ZodPipeline})}};ZodReadonly=class ZodReadonly extends ZodType{_parse(input){let result2=this._def.innerType._parse(input),freeze=(data)=>{if(isValid(data))data.value=Object.freeze(data.value);return data};return isAsync(result2)?result2.then((data)=>freeze(data)):freeze(result2)}unwrap(){return this._def.innerType}};ZodReadonly.create=(type,params)=>{return new ZodReadonly({innerType:type,typeName:ZodFirstPartyTypeKind.ZodReadonly,...processCreateParams(params)})};late={object:ZodObject.lazycreate};(function(ZodFirstPartyTypeKind2){ZodFirstPartyTypeKind2.ZodString="ZodString",ZodFirstPartyTypeKind2.ZodNumber="ZodNumber",ZodFirstPartyTypeKind2.ZodNaN="ZodNaN",ZodFirstPartyTypeKind2.ZodBigInt="ZodBigInt",ZodFirstPartyTypeKind2.ZodBoolean="ZodBoolean",ZodFirstPartyTypeKind2.ZodDate="ZodDate",ZodFirstPartyTypeKind2.ZodSymbol="ZodSymbol",ZodFirstPartyTypeKind2.ZodUndefined="ZodUndefined",ZodFirstPartyTypeKind2.ZodNull="ZodNull",ZodFirstPartyTypeKind2.ZodAny="ZodAny",ZodFirstPartyTypeKind2.ZodUnknown="ZodUnknown",ZodFirstPartyTypeKind2.ZodNever="ZodNever",ZodFirstPartyTypeKind2.ZodVoid="ZodVoid",ZodFirstPartyTypeKind2.ZodArray="ZodArray",ZodFirstPartyTypeKind2.ZodObject="ZodObject",ZodFirstPartyTypeKind2.ZodUnion="ZodUnion",ZodFirstPartyTypeKind2.ZodDiscriminatedUnion="ZodDiscriminatedUnion",ZodFirstPartyTypeKind2.ZodIntersection="ZodIntersection",ZodFirstPartyTypeKind2.ZodTuple="ZodTuple",ZodFirstPartyTypeKind2.ZodRecord="ZodRecord",ZodFirstPartyTypeKind2.ZodMap="ZodMap",ZodFirstPartyTypeKind2.ZodSet="ZodSet",ZodFirstPartyTypeKind2.ZodFunction="ZodFunction",ZodFirstPartyTypeKind2.ZodLazy="ZodLazy",ZodFirstPartyTypeKind2.ZodLiteral="ZodLiteral",ZodFirstPartyTypeKind2.ZodEnum="ZodEnum",ZodFirstPartyTypeKind2.ZodEffects="ZodEffects",ZodFirstPartyTypeKind2.ZodNativeEnum="ZodNativeEnum",ZodFirstPartyTypeKind2.ZodOptional="ZodOptional",ZodFirstPartyTypeKind2.ZodNullable="ZodNullable",ZodFirstPartyTypeKind2.ZodDefault="ZodDefault",ZodFirstPartyTypeKind2.ZodCatch="ZodCatch",ZodFirstPartyTypeKind2.ZodPromise="ZodPromise",ZodFirstPartyTypeKind2.ZodBranded="ZodBranded",ZodFirstPartyTypeKind2.ZodPipeline="ZodPipeline",ZodFirstPartyTypeKind2.ZodReadonly="ZodReadonly"})(ZodFirstPartyTypeKind||(ZodFirstPartyTypeKind={}));stringType=ZodString.create,numberType=ZodNumber.create,nanType=ZodNaN.create,bigIntType=ZodBigInt.create,booleanType=ZodBoolean.create,dateType=ZodDate.create,symbolType=ZodSymbol.create,undefinedType=ZodUndefined.create,nullType=ZodNull.create,anyType=ZodAny.create,unknownType=ZodUnknown.create,neverType=ZodNever.create,voidType=ZodVoid.create,arrayType=ZodArray.create,objectType=ZodObject.create,strictObjectType=ZodObject.strictCreate,unionType=ZodUnion.create,discriminatedUnionType=ZodDiscriminatedUnion.create,intersectionType=ZodIntersection.create,tupleType=ZodTuple.create,recordType=ZodRecord.create,mapType=ZodMap.create,setType=ZodSet.create,functionType=ZodFunction.create,lazyType=ZodLazy.create,literalType=ZodLiteral.create,enumType=ZodEnum.create,nativeEnumType=ZodNativeEnum.create,promiseType=ZodPromise.create,effectsType=ZodEffects.create,optionalType=ZodOptional.create,nullableType=ZodNullable.create,preprocessType=ZodEffects.createWithPreprocess,pipelineType=ZodPipeline.create,coerce={string:(arg)=>ZodString.create({...arg,coerce:!0}),number:(arg)=>ZodNumber.create({...arg,coerce:!0}),boolean:(arg)=>ZodBoolean.create({...arg,coerce:!0}),bigint:(arg)=>ZodBigInt.create({...arg,coerce:!0}),date:(arg)=>ZodDate.create({...arg,coerce:!0})},NEVER=INVALID});var exports_external={};__export(exports_external,{void:()=>voidType,util:()=>util,unknown:()=>unknownType,union:()=>unionType,undefined:()=>undefinedType,tuple:()=>tupleType,transformer:()=>effectsType,symbol:()=>symbolType,string:()=>stringType,strictObject:()=>strictObjectType,setErrorMap:()=>setErrorMap,set:()=>setType,record:()=>recordType,quotelessJson:()=>quotelessJson,promise:()=>promiseType,preprocess:()=>preprocessType,pipeline:()=>pipelineType,ostring:()=>ostring,optional:()=>optionalType,onumber:()=>onumber,oboolean:()=>oboolean,objectUtil:()=>objectUtil,object:()=>objectType,number:()=>numberType,nullable:()=>nullableType,null:()=>nullType,never:()=>neverType,nativeEnum:()=>nativeEnumType,nan:()=>nanType,map:()=>mapType,makeIssue:()=>makeIssue,literal:()=>literalType,lazy:()=>lazyType,late:()=>late,isValid:()=>isValid,isDirty:()=>isDirty,isAsync:()=>isAsync,isAborted:()=>isAborted,intersection:()=>intersectionType,instanceof:()=>instanceOfType,getParsedType:()=>getParsedType,getErrorMap:()=>getErrorMap,function:()=>functionType,enum:()=>enumType,effect:()=>effectsType,discriminatedUnion:()=>discriminatedUnionType,defaultErrorMap:()=>en_default,datetimeRegex:()=>datetimeRegex,date:()=>dateType,custom:()=>custom,coerce:()=>coerce,boolean:()=>booleanType,bigint:()=>bigIntType,array:()=>arrayType,any:()=>anyType,addIssueToContext:()=>addIssueToContext,ZodVoid:()=>ZodVoid,ZodUnknown:()=>ZodUnknown,ZodUnion:()=>ZodUnion,ZodUndefined:()=>ZodUndefined,ZodType:()=>ZodType,ZodTuple:()=>ZodTuple,ZodTransformer:()=>ZodEffects,ZodSymbol:()=>ZodSymbol,ZodString:()=>ZodString,ZodSet:()=>ZodSet,ZodSchema:()=>ZodType,ZodRecord:()=>ZodRecord,ZodReadonly:()=>ZodReadonly,ZodPromise:()=>ZodPromise,ZodPipeline:()=>ZodPipeline,ZodParsedType:()=>ZodParsedType,ZodOptional:()=>ZodOptional,ZodObject:()=>ZodObject,ZodNumber:()=>ZodNumber,ZodNullable:()=>ZodNullable,ZodNull:()=>ZodNull,ZodNever:()=>ZodNever,ZodNativeEnum:()=>ZodNativeEnum,ZodNaN:()=>ZodNaN,ZodMap:()=>ZodMap,ZodLiteral:()=>ZodLiteral,ZodLazy:()=>ZodLazy,ZodIssueCode:()=>ZodIssueCode,ZodIntersection:()=>ZodIntersection,ZodFunction:()=>ZodFunction,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind,ZodError:()=>ZodError,ZodEnum:()=>ZodEnum,ZodEffects:()=>ZodEffects,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion,ZodDefault:()=>ZodDefault,ZodDate:()=>ZodDate,ZodCatch:()=>ZodCatch,ZodBranded:()=>ZodBranded,ZodBoolean:()=>ZodBoolean,ZodBigInt:()=>ZodBigInt,ZodArray:()=>ZodArray,ZodAny:()=>ZodAny,Schema:()=>ZodType,ParseStatus:()=>ParseStatus,OK:()=>OK,NEVER:()=>NEVER,INVALID:()=>INVALID,EMPTY_PATH:()=>EMPTY_PATH,DIRTY:()=>DIRTY,BRAND:()=>BRAND});var init_external=__esm(()=>{init_errors();init_parseUtil();init_typeAliases();init_util();init_types();init_ZodError()});var init_zod=__esm(()=>{init_external();init_external()});var exports_types={};__export(exports_types,{isBlockingEvent:()=>isBlockingEvent,DISPATCHED_EVENT_MATCHERS:()=>DISPATCHED_EVENT_MATCHERS,DISPATCHED_EVENTS:()=>DISPATCHED_EVENTS,CODEX_DISPATCHED_EVENT_MATCHERS:()=>CODEX_DISPATCHED_EVENT_MATCHERS});function isBlockingEvent(event){return BLOCKING_EVENTS.has(event)}var DISPATCHED_EVENT_MATCHERS,CODEX_DISPATCHED_EVENT_MATCHERS,DISPATCHED_EVENTS,BLOCKING_EVENTS;var init_types2=__esm(()=>{DISPATCHED_EVENT_MATCHERS={PreToolUse:"*",PostToolUse:"SendMessage"},CODEX_DISPATCHED_EVENT_MATCHERS={PreToolUse:"*",PostToolUse:"SendMessage",UserPromptSubmit:"*",Stop:"*"},DISPATCHED_EVENTS=Object.keys(DISPATCHED_EVENT_MATCHERS),BLOCKING_EVENTS=new Set(["PreToolUse","UserPromptSubmit","TeammateIdle","TaskCompleted","PermissionRequest"])});var exports_inject={};__export(exports_inject,{isTeamHooked:()=>isTeamHooked,injectTeamHooks:()=>injectTeamHooks,buildDispatchCommand:()=>buildDispatchCommand});import{existsSync as existsSync2}from"fs";import{mkdir,readFile as readFile2,writeFile as writeFile2}from"fs/promises";import{homedir as homedir2}from"os";import{join as join3}from"path";import{fileURLToPath}from"url";function escapeShellArg(arg){return`'${arg.replace(/'/g,"'\\''")}'`}function compiledBinaryCandidates(){let candidates=[];if(process.env.GENIE_HOOK_BIN)candidates.push(process.env.GENIE_HOOK_BIN);let home=process.env.GENIE_HOME??join3(homedir2(),".genie");candidates.push(join3(home,"bin","genie-hook"));try{let repoBin=fileURLToPath(new URL("../../dist/genie-hook",import.meta.url));candidates.push(repoBin)}catch{}return candidates}function buildDispatchCommand(){for(let candidate of compiledBinaryCandidates())if(existsSync2(candidate))return escapeShellArg(candidate);let entrypoint=fileURLToPath(new URL("../genie.ts",import.meta.url));if(!existsSync2(entrypoint))return"genie hook dispatch";let bun=process.execPath||"bun";return`${escapeShellArg(bun)} run ${escapeShellArg(entrypoint)} hook dispatch`}function isGenieDispatchCommand(command){return typeof command==="string"&&/(?:^|\s)hook\s+dispatch(?:\s|$)/.test(command)}function claudeConfigDir(){return process.env.CLAUDE_CONFIG_DIR??join3(homedir2(),".claude")}function teamSettingsPath(teamName){let sanitized=teamName.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase();return join3(claudeConfigDir(),"teams",sanitized,"settings.json")}function buildHooksConfig(){let hooks={},dispatchCommand=buildDispatchCommand();for(let[event,matcher]of Object.entries(DISPATCHED_EVENT_MATCHERS))hooks[event]=[{matcher,hooks:[{type:"command",command:dispatchCommand,timeout:DISPATCH_TIMEOUT}]}];return hooks}async function readSettings(settingsPath){if(!existsSync2(settingsPath))return{};try{return JSON.parse(await readFile2(settingsPath,"utf-8"))}catch{return{}}}function allEventsAlreadyInjected(existingHooks,hooksConfig){return DISPATCHED_EVENTS.every((event)=>{let existing=existingHooks[event],desiredCommand=hooksConfig[event][0].hooks[0].command,desiredMatcher=hooksConfig[event][0].matcher;return existing?.some((m)=>m.matcher===desiredMatcher&&m.hooks?.some((h)=>h.command===desiredCommand))})}function hasNoObsoleteGenieEntries(existingHooks){return Object.keys(existingHooks).every((event)=>{if(DISPATCHED_EVENTS.includes(event))return!0;return!existingHooks[event]?.some((m)=>m.hooks?.some((h)=>isGenieDispatchCommand(h.command)))})}function pruneObsoleteGenieEntries(mergedHooks){for(let event of Object.keys(mergedHooks)){if(DISPATCHED_EVENTS.includes(event))continue;let cleaned=(mergedHooks[event]??[]).map((matcher)=>({...matcher,hooks:matcher.hooks?.filter((hook)=>!isGenieDispatchCommand(hook.command))})).filter((matcher)=>(matcher.hooks?.length??0)>0);if(cleaned.length===0)delete mergedHooks[event];else mergedHooks[event]=cleaned}}function refreshMatcherEntries(entries,genieEntry){return entries.map((matcher)=>{let hasGenieHook=matcher.hooks?.some((h)=>isGenieDispatchCommand(h.command));return{...matcher,matcher:hasGenieHook?genieEntry.matcher:matcher.matcher,hooks:matcher.hooks?.map((hook)=>isGenieDispatchCommand(hook.command)?{...hook,command:genieEntry.hooks[0].command,timeout:DISPATCH_TIMEOUT}:hook)}})}function upsertGenieEntry(mergedHooks,event,genieEntry){let existingEntries=refreshMatcherEntries(mergedHooks[event]??[],genieEntry),alreadyPresent=existingEntries.some((m)=>m.hooks?.some((h)=>isGenieDispatchCommand(h.command)));mergedHooks[event]=alreadyPresent?existingEntries:[...existingEntries,genieEntry]}async function injectIntoFile(settingsPath){let settings=await readSettings(settingsPath),hooksConfig=buildHooksConfig(),existingHooks=settings.hooks;if(existingHooks&&allEventsAlreadyInjected(existingHooks,hooksConfig)&&hasNoObsoleteGenieEntries(existingHooks))return!1;let mergedHooks=existingHooks?{...existingHooks}:{};pruneObsoleteGenieEntries(mergedHooks);for(let event of DISPATCHED_EVENTS)upsertGenieEntry(mergedHooks,event,hooksConfig[event][0]);settings.hooks=mergedHooks;let dir=join3(settingsPath,"..");return await mkdir(dir,{recursive:!0}),await writeFile2(settingsPath,JSON.stringify(settings,null,2)),!0}async function injectTeamHooks(teamName){let path=teamSettingsPath(teamName);return injectIntoFile(path)}async function isTeamHooked(teamName){let path=teamSettingsPath(teamName);if(!existsSync2(path))return!1;try{let content=await readFile2(path,"utf-8"),hooks=JSON.parse(content).hooks;if(!hooks)return!1;return DISPATCHED_EVENTS.every((event)=>{return hooks[event]?.some((m)=>m.hooks?.some((h)=>isGenieDispatchCommand(h.command)))})}catch{return!1}}var DISPATCH_TIMEOUT=15;var init_inject=__esm(()=>{init_types2()});function normalizeValue(v){if(v===void 0||v===null)return;if(v==="")return;if(v==="inherit")return;return v}function resolveField(agent,field,ctx){return resolveFieldWithSource(agent,field,ctx).value}function resolveFieldWithSource(agent,field,ctx){let agentVal=normalizeValue(agent[field]);if(agentVal!==void 0)return{value:agentVal,source:"explicit"};if(ctx.parent){let parentVal=normalizeValue(ctx.parent.fields[field]);if(parentVal!==void 0)return{value:parentVal,source:`parent:${ctx.parent.name}`}}if(ctx.workspaceDefaults){let wsVal=normalizeValue(ctx.workspaceDefaults[field]);if(wsVal!==void 0)return{value:wsVal,source:"workspace"}}return{value:BUILTIN_DEFAULTS[field],source:"built-in"}}function computeEffectiveDefaults(workspaceDefaults){if(!workspaceDefaults)return{...BUILTIN_DEFAULTS};let result2={...BUILTIN_DEFAULTS};for(let key of Object.keys(BUILTIN_DEFAULTS)){let wsVal=normalizeValue(workspaceDefaults[key]);if(wsVal!==void 0)result2[key]=wsVal}return result2}var BUILTIN_DEFAULTS,RESOLVED_FIELDS;var init_defaults=__esm(()=>{BUILTIN_DEFAULTS={model:"opus",promptMode:"append",color:"blue",effort:"high",thinking:"enabled",permissionMode:"auto"},RESOLVED_FIELDS=["model"]});var exports_js_yaml={};__export(exports_js_yaml,{types:()=>types2,safeLoadAll:()=>safeLoadAll,safeLoad:()=>safeLoad,safeDump:()=>safeDump,loadAll:()=>loadAll,load:()=>load,dump:()=>dump,default:()=>jsYaml,YAMLException:()=>YAMLException,Type:()=>Type,Schema:()=>Schema,JSON_SCHEMA:()=>JSON_SCHEMA,FAILSAFE_SCHEMA:()=>FAILSAFE_SCHEMA,DEFAULT_SCHEMA:()=>DEFAULT_SCHEMA,CORE_SCHEMA:()=>CORE_SCHEMA});function isNothing(subject){return typeof subject>"u"||subject===null}function isObject(subject){return typeof subject==="object"&&subject!==null}function toArray(sequence){if(Array.isArray(sequence))return sequence;else if(isNothing(sequence))return[];return[sequence]}function extend(target,source){var index,length,key,sourceKeys;if(source){sourceKeys=Object.keys(source);for(index=0,length=sourceKeys.length;index<length;index+=1)key=sourceKeys[index],target[key]=source[key]}return target}function repeat(string,count){var result2="",cycle;for(cycle=0;cycle<count;cycle+=1)result2+=string;return result2}function isNegativeZero(number){return number===0&&Number.NEGATIVE_INFINITY===1/number}function formatError(exception,compact){var where="",message=exception.reason||"(unknown reason)";if(!exception.mark)return message;if(exception.mark.name)where+='in "'+exception.mark.name+'" ';if(where+="("+(exception.mark.line+1)+":"+(exception.mark.column+1)+")",!compact&&exception.mark.snippet)where+=`
|
|
151
|
+
WHERE created_at >= $1::timestamptz`,[sinceTs]))[0]??{};return{agents_spawned:r.agents_spawned??0,tasks_moved:r.tasks_moved??0,total_cost:r.total_cost??0,error_count:r.error_count??0,total_events:r.total_events??0,tool_calls:r.tool_calls??0,api_requests:r.api_requests??0}}function generateTraceId(){return crypto.randomUUID()}var DEFAULT_TIMELINE_LIMIT=200,MAX_TIMELINE_LIMIT=2000,DEFAULT_TIMELINE_SINCE_MS=86400000;var init_audit=__esm(()=>{init_db()});import{readFile,unlink,writeFile}from"fs/promises";function lockPath(filePath){return`${filePath}.lock`}function isPidAlive(pid){try{return process.kill(pid,0),!0}catch{return!1}}async function acquireLock(path){let lock=lockPath(path),deadline=Date.now()+LOCK_TIMEOUT_MS;while(Date.now()<deadline)try{await writeFile(lock,String(process.pid),{flag:"wx"});return}catch{try{let content=await readFile(lock,"utf-8"),holderPid=Number.parseInt(content.trim(),10);if(!Number.isNaN(holderPid)&&!isPidAlive(holderPid)){try{await unlink(lock)}catch{}continue}}catch{continue}let jitter=Math.floor(Math.random()*LOCK_POLL_MS);await new Promise((r)=>setTimeout(r,LOCK_POLL_MS+jitter))}console.warn(`[lockfile] Force-acquiring stale lock: ${lock}`),await writeFile(lock,String(process.pid))}async function releaseLock(path){try{await unlink(lockPath(path))}catch{}}var LOCK_TIMEOUT_MS=5000,LOCK_POLL_MS=50;var init_lockfile=()=>{};var util,objectUtil,ZodParsedType,getParsedType=(data)=>{switch(typeof data){case"undefined":return ZodParsedType.undefined;case"string":return ZodParsedType.string;case"number":return Number.isNaN(data)?ZodParsedType.nan:ZodParsedType.number;case"boolean":return ZodParsedType.boolean;case"function":return ZodParsedType.function;case"bigint":return ZodParsedType.bigint;case"symbol":return ZodParsedType.symbol;case"object":if(Array.isArray(data))return ZodParsedType.array;if(data===null)return ZodParsedType.null;if(data.then&&typeof data.then==="function"&&data.catch&&typeof data.catch==="function")return ZodParsedType.promise;if(typeof Map<"u"&&data instanceof Map)return ZodParsedType.map;if(typeof Set<"u"&&data instanceof Set)return ZodParsedType.set;if(typeof Date<"u"&&data instanceof Date)return ZodParsedType.date;return ZodParsedType.object;default:return ZodParsedType.unknown}};var init_util=__esm(()=>{(function(util2){util2.assertEqual=(_)=>{};function assertIs(_arg){}util2.assertIs=assertIs;function assertNever(_x){throw Error()}util2.assertNever=assertNever,util2.arrayToEnum=(items)=>{let obj={};for(let item of items)obj[item]=item;return obj},util2.getValidEnumValues=(obj)=>{let validKeys=util2.objectKeys(obj).filter((k)=>typeof obj[obj[k]]!=="number"),filtered={};for(let k of validKeys)filtered[k]=obj[k];return util2.objectValues(filtered)},util2.objectValues=(obj)=>{return util2.objectKeys(obj).map(function(e){return obj[e]})},util2.objectKeys=typeof Object.keys==="function"?(obj)=>Object.keys(obj):(object)=>{let keys=[];for(let key in object)if(Object.prototype.hasOwnProperty.call(object,key))keys.push(key);return keys},util2.find=(arr,checker)=>{for(let item of arr)if(checker(item))return item;return},util2.isInteger=typeof Number.isInteger==="function"?(val)=>Number.isInteger(val):(val)=>typeof val==="number"&&Number.isFinite(val)&&Math.floor(val)===val;function joinValues(array,separator=" | "){return array.map((val)=>typeof val==="string"?`'${val}'`:val).join(separator)}util2.joinValues=joinValues,util2.jsonStringifyReplacer=(_,value)=>{if(typeof value==="bigint")return value.toString();return value}})(util||(util={}));(function(objectUtil2){objectUtil2.mergeShapes=(first,second)=>{return{...first,...second}}})(objectUtil||(objectUtil={}));ZodParsedType=util.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"])});var ZodIssueCode,quotelessJson=(obj)=>{return JSON.stringify(obj,null,2).replace(/"([^"]+)":/g,"$1:")},ZodError;var init_ZodError=__esm(()=>{init_util();ZodIssueCode=util.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"]);ZodError=class ZodError extends Error{get errors(){return this.issues}constructor(issues){super();this.issues=[],this.addIssue=(sub)=>{this.issues=[...this.issues,sub]},this.addIssues=(subs=[])=>{this.issues=[...this.issues,...subs]};let actualProto=new.target.prototype;if(Object.setPrototypeOf)Object.setPrototypeOf(this,actualProto);else this.__proto__=actualProto;this.name="ZodError",this.issues=issues}format(_mapper){let mapper=_mapper||function(issue){return issue.message},fieldErrors={_errors:[]},processError=(error)=>{for(let issue of error.issues)if(issue.code==="invalid_union")issue.unionErrors.map(processError);else if(issue.code==="invalid_return_type")processError(issue.returnTypeError);else if(issue.code==="invalid_arguments")processError(issue.argumentsError);else if(issue.path.length===0)fieldErrors._errors.push(mapper(issue));else{let curr=fieldErrors,i=0;while(i<issue.path.length){let el=issue.path[i];if(i!==issue.path.length-1)curr[el]=curr[el]||{_errors:[]};else curr[el]=curr[el]||{_errors:[]},curr[el]._errors.push(mapper(issue));curr=curr[el],i++}}};return processError(this),fieldErrors}static assert(value){if(!(value instanceof ZodError))throw Error(`Not a ZodError: ${value}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,util.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(mapper=(issue)=>issue.message){let fieldErrors={},formErrors=[];for(let sub of this.issues)if(sub.path.length>0){let firstEl=sub.path[0];fieldErrors[firstEl]=fieldErrors[firstEl]||[],fieldErrors[firstEl].push(mapper(sub))}else formErrors.push(mapper(sub));return{formErrors,fieldErrors}}get formErrors(){return this.flatten()}};ZodError.create=(issues)=>{return new ZodError(issues)}});var errorMap=(issue,_ctx)=>{let message;switch(issue.code){case ZodIssueCode.invalid_type:if(issue.received===ZodParsedType.undefined)message="Required";else message=`Expected ${issue.expected}, received ${issue.received}`;break;case ZodIssueCode.invalid_literal:message=`Invalid literal value, expected ${JSON.stringify(issue.expected,util.jsonStringifyReplacer)}`;break;case ZodIssueCode.unrecognized_keys:message=`Unrecognized key(s) in object: ${util.joinValues(issue.keys,", ")}`;break;case ZodIssueCode.invalid_union:message="Invalid input";break;case ZodIssueCode.invalid_union_discriminator:message=`Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;break;case ZodIssueCode.invalid_enum_value:message=`Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;break;case ZodIssueCode.invalid_arguments:message="Invalid function arguments";break;case ZodIssueCode.invalid_return_type:message="Invalid function return type";break;case ZodIssueCode.invalid_date:message="Invalid date";break;case ZodIssueCode.invalid_string:if(typeof issue.validation==="object")if("includes"in issue.validation){if(message=`Invalid input: must include "${issue.validation.includes}"`,typeof issue.validation.position==="number")message=`${message} at one or more positions greater than or equal to ${issue.validation.position}`}else if("startsWith"in issue.validation)message=`Invalid input: must start with "${issue.validation.startsWith}"`;else if("endsWith"in issue.validation)message=`Invalid input: must end with "${issue.validation.endsWith}"`;else util.assertNever(issue.validation);else if(issue.validation!=="regex")message=`Invalid ${issue.validation}`;else message="Invalid";break;case ZodIssueCode.too_small:if(issue.type==="array")message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at least":"more than"} ${issue.minimum} element(s)`;else if(issue.type==="string")message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at least":"over"} ${issue.minimum} character(s)`;else if(issue.type==="number")message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`;else if(issue.type==="bigint")message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`;else if(issue.type==="date")message=`Date must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(issue.minimum))}`;else message="Invalid input";break;case ZodIssueCode.too_big:if(issue.type==="array")message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at most":"less than"} ${issue.maximum} element(s)`;else if(issue.type==="string")message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at most":"under"} ${issue.maximum} character(s)`;else if(issue.type==="number")message=`Number must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`;else if(issue.type==="bigint")message=`BigInt must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`;else if(issue.type==="date")message=`Date must be ${issue.exact?"exactly":issue.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(issue.maximum))}`;else message="Invalid input";break;case ZodIssueCode.custom:message="Invalid input";break;case ZodIssueCode.invalid_intersection_types:message="Intersection results could not be merged";break;case ZodIssueCode.not_multiple_of:message=`Number must be a multiple of ${issue.multipleOf}`;break;case ZodIssueCode.not_finite:message="Number must be finite";break;default:message=_ctx.defaultError,util.assertNever(issue)}return{message}},en_default;var init_en=__esm(()=>{init_ZodError();init_util();en_default=errorMap});function setErrorMap(map){overrideErrorMap=map}function getErrorMap(){return overrideErrorMap}var overrideErrorMap;var init_errors=__esm(()=>{init_en();overrideErrorMap=en_default});function addIssueToContext(ctx,issueData){let overrideMap=getErrorMap(),issue=makeIssue({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default?void 0:en_default].filter((x)=>!!x)});ctx.common.issues.push(issue)}class ParseStatus{constructor(){this.value="valid"}dirty(){if(this.value==="valid")this.value="dirty"}abort(){if(this.value!=="aborted")this.value="aborted"}static mergeArray(status,results){let arrayValue=[];for(let s of results){if(s.status==="aborted")return INVALID;if(s.status==="dirty")status.dirty();arrayValue.push(s.value)}return{status:status.value,value:arrayValue}}static async mergeObjectAsync(status,pairs){let syncPairs=[];for(let pair of pairs){let key=await pair.key,value=await pair.value;syncPairs.push({key,value})}return ParseStatus.mergeObjectSync(status,syncPairs)}static mergeObjectSync(status,pairs){let finalObject={};for(let pair of pairs){let{key,value}=pair;if(key.status==="aborted")return INVALID;if(value.status==="aborted")return INVALID;if(key.status==="dirty")status.dirty();if(value.status==="dirty")status.dirty();if(key.value!=="__proto__"&&(typeof value.value<"u"||pair.alwaysSet))finalObject[key.value]=value.value}return{status:status.value,value:finalObject}}}var makeIssue=(params)=>{let{data,path,errorMaps,issueData}=params,fullPath=[...path,...issueData.path||[]],fullIssue={...issueData,path:fullPath};if(issueData.message!==void 0)return{...issueData,path:fullPath,message:issueData.message};let errorMessage="",maps=errorMaps.filter((m)=>!!m).slice().reverse();for(let map of maps)errorMessage=map(fullIssue,{data,defaultError:errorMessage}).message;return{...issueData,path:fullPath,message:errorMessage}},EMPTY_PATH,INVALID,DIRTY=(value)=>({status:"dirty",value}),OK=(value)=>({status:"valid",value}),isAborted=(x)=>x.status==="aborted",isDirty=(x)=>x.status==="dirty",isValid=(x)=>x.status==="valid",isAsync=(x)=>typeof Promise<"u"&&x instanceof Promise;var init_parseUtil=__esm(()=>{init_errors();init_en();EMPTY_PATH=[];INVALID=Object.freeze({status:"aborted"})});var init_typeAliases=()=>{};var errorUtil;var init_errorUtil=__esm(()=>{(function(errorUtil2){errorUtil2.errToObj=(message)=>typeof message==="string"?{message}:message||{},errorUtil2.toString=(message)=>typeof message==="string"?message:message?.message})(errorUtil||(errorUtil={}))});class ParseInputLazyPath{constructor(parent,value,path,key){this._cachedPath=[],this.parent=parent,this.data=value,this._path=path,this._key=key}get path(){if(!this._cachedPath.length)if(Array.isArray(this._key))this._cachedPath.push(...this._path,...this._key);else this._cachedPath.push(...this._path,this._key);return this._cachedPath}}function processCreateParams(params){if(!params)return{};let{errorMap:errorMap2,invalid_type_error,required_error,description}=params;if(errorMap2&&(invalid_type_error||required_error))throw Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);if(errorMap2)return{errorMap:errorMap2,description};return{errorMap:(iss,ctx)=>{let{message}=params;if(iss.code==="invalid_enum_value")return{message:message??ctx.defaultError};if(typeof ctx.data>"u")return{message:message??required_error??ctx.defaultError};if(iss.code!=="invalid_type")return{message:ctx.defaultError};return{message:message??invalid_type_error??ctx.defaultError}},description}}class ZodType{get description(){return this._def.description}_getType(input){return getParsedType(input.data)}_getOrReturnCtx(input,ctx){return ctx||{common:input.parent.common,data:input.data,parsedType:getParsedType(input.data),schemaErrorMap:this._def.errorMap,path:input.path,parent:input.parent}}_processInputParams(input){return{status:new ParseStatus,ctx:{common:input.parent.common,data:input.data,parsedType:getParsedType(input.data),schemaErrorMap:this._def.errorMap,path:input.path,parent:input.parent}}}_parseSync(input){let result2=this._parse(input);if(isAsync(result2))throw Error("Synchronous parse encountered promise.");return result2}_parseAsync(input){let result2=this._parse(input);return Promise.resolve(result2)}parse(data,params){let result2=this.safeParse(data,params);if(result2.success)return result2.data;throw result2.error}safeParse(data,params){let ctx={common:{issues:[],async:params?.async??!1,contextualErrorMap:params?.errorMap},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType(data)},result2=this._parseSync({data,path:ctx.path,parent:ctx});return handleResult(ctx,result2)}"~validate"(data){let ctx={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType(data)};if(!this["~standard"].async)try{let result2=this._parseSync({data,path:[],parent:ctx});return isValid(result2)?{value:result2.value}:{issues:ctx.common.issues}}catch(err){if(err?.message?.toLowerCase()?.includes("encountered"))this["~standard"].async=!0;ctx.common={issues:[],async:!0}}return this._parseAsync({data,path:[],parent:ctx}).then((result2)=>isValid(result2)?{value:result2.value}:{issues:ctx.common.issues})}async parseAsync(data,params){let result2=await this.safeParseAsync(data,params);if(result2.success)return result2.data;throw result2.error}async safeParseAsync(data,params){let ctx={common:{issues:[],contextualErrorMap:params?.errorMap,async:!0},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType(data)},maybeAsyncResult=this._parse({data,path:ctx.path,parent:ctx}),result2=await(isAsync(maybeAsyncResult)?maybeAsyncResult:Promise.resolve(maybeAsyncResult));return handleResult(ctx,result2)}refine(check,message){let getIssueProperties=(val)=>{if(typeof message==="string"||typeof message>"u")return{message};else if(typeof message==="function")return message(val);else return message};return this._refinement((val,ctx)=>{let result2=check(val),setError=()=>ctx.addIssue({code:ZodIssueCode.custom,...getIssueProperties(val)});if(typeof Promise<"u"&&result2 instanceof Promise)return result2.then((data)=>{if(!data)return setError(),!1;else return!0});if(!result2)return setError(),!1;else return!0})}refinement(check,refinementData){return this._refinement((val,ctx)=>{if(!check(val))return ctx.addIssue(typeof refinementData==="function"?refinementData(val,ctx):refinementData),!1;else return!0})}_refinement(refinement){return new ZodEffects({schema:this,typeName:ZodFirstPartyTypeKind.ZodEffects,effect:{type:"refinement",refinement}})}superRefine(refinement){return this._refinement(refinement)}constructor(def){this.spa=this.safeParseAsync,this._def=def,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:(data)=>this["~validate"](data)}}optional(){return ZodOptional.create(this,this._def)}nullable(){return ZodNullable.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ZodArray.create(this)}promise(){return ZodPromise.create(this,this._def)}or(option){return ZodUnion.create([this,option],this._def)}and(incoming){return ZodIntersection.create(this,incoming,this._def)}transform(transform){return new ZodEffects({...processCreateParams(this._def),schema:this,typeName:ZodFirstPartyTypeKind.ZodEffects,effect:{type:"transform",transform}})}default(def){let defaultValueFunc=typeof def==="function"?def:()=>def;return new ZodDefault({...processCreateParams(this._def),innerType:this,defaultValue:defaultValueFunc,typeName:ZodFirstPartyTypeKind.ZodDefault})}brand(){return new ZodBranded({typeName:ZodFirstPartyTypeKind.ZodBranded,type:this,...processCreateParams(this._def)})}catch(def){let catchValueFunc=typeof def==="function"?def:()=>def;return new ZodCatch({...processCreateParams(this._def),innerType:this,catchValue:catchValueFunc,typeName:ZodFirstPartyTypeKind.ZodCatch})}describe(description){return new this.constructor({...this._def,description})}pipe(target){return ZodPipeline.create(this,target)}readonly(){return ZodReadonly.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}function timeRegexSource(args){let secondsRegexSource="[0-5]\\d";if(args.precision)secondsRegexSource=`${secondsRegexSource}\\.\\d{${args.precision}}`;else if(args.precision==null)secondsRegexSource=`${secondsRegexSource}(\\.\\d+)?`;let secondsQuantifier=args.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`}function timeRegex(args){return new RegExp(`^${timeRegexSource(args)}$`)}function datetimeRegex(args){let regex=`${dateRegexSource}T${timeRegexSource(args)}`,opts=[];if(opts.push(args.local?"Z?":"Z"),args.offset)opts.push("([+-]\\d{2}:?\\d{2})");return regex=`${regex}(${opts.join("|")})`,new RegExp(`^${regex}$`)}function isValidIP(ip,version){if((version==="v4"||!version)&&ipv4Regex.test(ip))return!0;if((version==="v6"||!version)&&ipv6Regex.test(ip))return!0;return!1}function isValidJWT(jwt,alg){if(!jwtRegex.test(jwt))return!1;try{let[header]=jwt.split(".");if(!header)return!1;let base64=header.replace(/-/g,"+").replace(/_/g,"/").padEnd(header.length+(4-header.length%4)%4,"="),decoded=JSON.parse(atob(base64));if(typeof decoded!=="object"||decoded===null)return!1;if("typ"in decoded&&decoded?.typ!=="JWT")return!1;if(!decoded.alg)return!1;if(alg&&decoded.alg!==alg)return!1;return!0}catch{return!1}}function isValidCidr(ip,version){if((version==="v4"||!version)&&ipv4CidrRegex.test(ip))return!0;if((version==="v6"||!version)&&ipv6CidrRegex.test(ip))return!0;return!1}function floatSafeRemainder(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepDecCount=(step.toString().split(".")[1]||"").length,decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}function deepPartialify(schema){if(schema instanceof ZodObject){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional.create(deepPartialify(fieldSchema))}return new ZodObject({...schema._def,shape:()=>newShape})}else if(schema instanceof ZodArray)return new ZodArray({...schema._def,type:deepPartialify(schema.element)});else if(schema instanceof ZodOptional)return ZodOptional.create(deepPartialify(schema.unwrap()));else if(schema instanceof ZodNullable)return ZodNullable.create(deepPartialify(schema.unwrap()));else if(schema instanceof ZodTuple)return ZodTuple.create(schema.items.map((item)=>deepPartialify(item)));else return schema}function mergeValues(a,b){let aType=getParsedType(a),bType=getParsedType(b);if(a===b)return{valid:!0,data:a};else if(aType===ZodParsedType.object&&bType===ZodParsedType.object){let bKeys=util.objectKeys(b),sharedKeys=util.objectKeys(a).filter((key)=>bKeys.indexOf(key)!==-1),newObj={...a,...b};for(let key of sharedKeys){let sharedValue=mergeValues(a[key],b[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType.array&&bType===ZodParsedType.array){if(a.length!==b.length)return{valid:!1};let newArray=[];for(let index=0;index<a.length;index++){let itemA=a[index],itemB=b[index],sharedValue=mergeValues(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else if(aType===ZodParsedType.date&&bType===ZodParsedType.date&&+a===+b)return{valid:!0,data:a};else return{valid:!1}}function createZodEnum(values,params){return new ZodEnum({values,typeName:ZodFirstPartyTypeKind.ZodEnum,...processCreateParams(params)})}function cleanParams(params,data){let p=typeof params==="function"?params(data):typeof params==="string"?{message:params}:params;return typeof p==="string"?{message:p}:p}function custom(check,_params={},fatal){if(check)return ZodAny.create().superRefine((data,ctx)=>{let r=check(data);if(r instanceof Promise)return r.then((r2)=>{if(!r2){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}return});return ZodAny.create()}var handleResult=(ctx,result2)=>{if(isValid(result2))return{success:!0,data:result2.value};else{if(!ctx.common.issues.length)throw Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let error=new ZodError(ctx.common.issues);return this._error=error,this._error}}}},cuidRegex,cuid2Regex,ulidRegex,uuidRegex,nanoidRegex,jwtRegex,durationRegex,emailRegex,_emojiRegex="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",emojiRegex,ipv4Regex,ipv4CidrRegex,ipv6Regex,ipv6CidrRegex,base64Regex,base64urlRegex,dateRegexSource="((\\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])))",dateRegex,ZodString,ZodNumber,ZodBigInt,ZodBoolean,ZodDate,ZodSymbol,ZodUndefined,ZodNull,ZodAny,ZodUnknown,ZodNever,ZodVoid,ZodArray,ZodObject,ZodUnion,getDiscriminator=(type)=>{if(type instanceof ZodLazy)return getDiscriminator(type.schema);else if(type instanceof ZodEffects)return getDiscriminator(type.innerType());else if(type instanceof ZodLiteral)return[type.value];else if(type instanceof ZodEnum)return type.options;else if(type instanceof ZodNativeEnum)return util.objectValues(type.enum);else if(type instanceof ZodDefault)return getDiscriminator(type._def.innerType);else if(type instanceof ZodUndefined)return[void 0];else if(type instanceof ZodNull)return[null];else if(type instanceof ZodOptional)return[void 0,...getDiscriminator(type.unwrap())];else if(type instanceof ZodNullable)return[null,...getDiscriminator(type.unwrap())];else if(type instanceof ZodBranded)return getDiscriminator(type.unwrap());else if(type instanceof ZodReadonly)return getDiscriminator(type.unwrap());else if(type instanceof ZodCatch)return getDiscriminator(type._def.innerType);else return[]},ZodDiscriminatedUnion,ZodIntersection,ZodTuple,ZodRecord,ZodMap,ZodSet,ZodFunction,ZodLazy,ZodLiteral,ZodEnum,ZodNativeEnum,ZodPromise,ZodEffects,ZodOptional,ZodNullable,ZodDefault,ZodCatch,ZodNaN,BRAND,ZodBranded,ZodPipeline,ZodReadonly,late,ZodFirstPartyTypeKind,instanceOfType=(cls,params={message:`Input not instance of ${cls.name}`})=>custom((data)=>data instanceof cls,params),stringType,numberType,nanType,bigIntType,booleanType,dateType,symbolType,undefinedType,nullType,anyType,unknownType,neverType,voidType,arrayType,objectType,strictObjectType,unionType,discriminatedUnionType,intersectionType,tupleType,recordType,mapType,setType,functionType,lazyType,literalType,enumType,nativeEnumType,promiseType,effectsType,optionalType,nullableType,preprocessType,pipelineType,ostring=()=>stringType().optional(),onumber=()=>numberType().optional(),oboolean=()=>booleanType().optional(),coerce,NEVER;var init_types=__esm(()=>{init_ZodError();init_errors();init_errorUtil();init_parseUtil();init_util();cuidRegex=/^c[^\s-]{8,}$/i,cuid2Regex=/^[0-9a-z]+$/,ulidRegex=/^[0-9A-HJKMNP-TV-Z]{26}$/i,uuidRegex=/^[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,nanoidRegex=/^[a-z0-9_-]{21}$/i,jwtRegex=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,durationRegex=/^[-+]?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)?)??$/,emailRegex=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,ipv4Regex=/^(?:(?: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])$/,ipv4CidrRegex=/^(?:(?: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])$/,ipv6Regex=/^(([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]))$/,ipv6CidrRegex=/^(([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])$/,base64Regex=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64urlRegex=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,dateRegex=new RegExp(`^${dateRegexSource}$`);ZodString=class ZodString extends ZodType{_parse(input){if(this._def.coerce)input.data=String(input.data);if(this._getType(input)!==ZodParsedType.string){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.string,received:ctx2.parsedType}),INVALID}let status=new ParseStatus,ctx=void 0;for(let check of this._def.checks)if(check.kind==="min"){if(input.data.length<check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty()}else if(check.kind==="max"){if(input.data.length>check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty()}else if(check.kind==="length"){let tooBig=input.data.length>check.value,tooSmall=input.data.length<check.value;if(tooBig||tooSmall){if(ctx=this._getOrReturnCtx(input,ctx),tooBig)addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message});else if(tooSmall)addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message});status.dirty()}}else if(check.kind==="email"){if(!emailRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"email",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="emoji"){if(!emojiRegex)emojiRegex=new RegExp(_emojiRegex,"u");if(!emojiRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"emoji",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="uuid"){if(!uuidRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"uuid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="nanoid"){if(!nanoidRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"nanoid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="cuid"){if(!cuidRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"cuid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="cuid2"){if(!cuid2Regex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"cuid2",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="ulid"){if(!ulidRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"ulid",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="url")try{new URL(input.data)}catch{ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"url",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="regex"){if(check.regex.lastIndex=0,!check.regex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"regex",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="trim")input.data=input.data.trim();else if(check.kind==="includes"){if(!input.data.includes(check.value,check.position))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{includes:check.value,position:check.position},message:check.message}),status.dirty()}else if(check.kind==="toLowerCase")input.data=input.data.toLowerCase();else if(check.kind==="toUpperCase")input.data=input.data.toUpperCase();else if(check.kind==="startsWith"){if(!input.data.startsWith(check.value))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{startsWith:check.value},message:check.message}),status.dirty()}else if(check.kind==="endsWith"){if(!input.data.endsWith(check.value))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:{endsWith:check.value},message:check.message}),status.dirty()}else if(check.kind==="datetime"){if(!datetimeRegex(check).test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"datetime",message:check.message}),status.dirty()}else if(check.kind==="date"){if(!dateRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"date",message:check.message}),status.dirty()}else if(check.kind==="time"){if(!timeRegex(check).test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_string,validation:"time",message:check.message}),status.dirty()}else if(check.kind==="duration"){if(!durationRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"duration",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="ip"){if(!isValidIP(input.data,check.version))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"ip",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="jwt"){if(!isValidJWT(input.data,check.alg))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"jwt",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="cidr"){if(!isValidCidr(input.data,check.version))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"cidr",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="base64"){if(!base64Regex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"base64",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else if(check.kind==="base64url"){if(!base64urlRegex.test(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{validation:"base64url",code:ZodIssueCode.invalid_string,message:check.message}),status.dirty()}else util.assertNever(check);return{status:status.value,value:input.data}}_regex(regex,validation,message){return this.refinement((data)=>regex.test(data),{validation,code:ZodIssueCode.invalid_string,...errorUtil.errToObj(message)})}_addCheck(check){return new ZodString({...this._def,checks:[...this._def.checks,check]})}email(message){return this._addCheck({kind:"email",...errorUtil.errToObj(message)})}url(message){return this._addCheck({kind:"url",...errorUtil.errToObj(message)})}emoji(message){return this._addCheck({kind:"emoji",...errorUtil.errToObj(message)})}uuid(message){return this._addCheck({kind:"uuid",...errorUtil.errToObj(message)})}nanoid(message){return this._addCheck({kind:"nanoid",...errorUtil.errToObj(message)})}cuid(message){return this._addCheck({kind:"cuid",...errorUtil.errToObj(message)})}cuid2(message){return this._addCheck({kind:"cuid2",...errorUtil.errToObj(message)})}ulid(message){return this._addCheck({kind:"ulid",...errorUtil.errToObj(message)})}base64(message){return this._addCheck({kind:"base64",...errorUtil.errToObj(message)})}base64url(message){return this._addCheck({kind:"base64url",...errorUtil.errToObj(message)})}jwt(options){return this._addCheck({kind:"jwt",...errorUtil.errToObj(options)})}ip(options){return this._addCheck({kind:"ip",...errorUtil.errToObj(options)})}cidr(options){return this._addCheck({kind:"cidr",...errorUtil.errToObj(options)})}datetime(options){if(typeof options==="string")return this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:options});return this._addCheck({kind:"datetime",precision:typeof options?.precision>"u"?null:options?.precision,offset:options?.offset??!1,local:options?.local??!1,...errorUtil.errToObj(options?.message)})}date(message){return this._addCheck({kind:"date",message})}time(options){if(typeof options==="string")return this._addCheck({kind:"time",precision:null,message:options});return this._addCheck({kind:"time",precision:typeof options?.precision>"u"?null:options?.precision,...errorUtil.errToObj(options?.message)})}duration(message){return this._addCheck({kind:"duration",...errorUtil.errToObj(message)})}regex(regex,message){return this._addCheck({kind:"regex",regex,...errorUtil.errToObj(message)})}includes(value,options){return this._addCheck({kind:"includes",value,position:options?.position,...errorUtil.errToObj(options?.message)})}startsWith(value,message){return this._addCheck({kind:"startsWith",value,...errorUtil.errToObj(message)})}endsWith(value,message){return this._addCheck({kind:"endsWith",value,...errorUtil.errToObj(message)})}min(minLength,message){return this._addCheck({kind:"min",value:minLength,...errorUtil.errToObj(message)})}max(maxLength,message){return this._addCheck({kind:"max",value:maxLength,...errorUtil.errToObj(message)})}length(len,message){return this._addCheck({kind:"length",value:len,...errorUtil.errToObj(message)})}nonempty(message){return this.min(1,errorUtil.errToObj(message))}trim(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find((ch)=>ch.kind==="datetime")}get isDate(){return!!this._def.checks.find((ch)=>ch.kind==="date")}get isTime(){return!!this._def.checks.find((ch)=>ch.kind==="time")}get isDuration(){return!!this._def.checks.find((ch)=>ch.kind==="duration")}get isEmail(){return!!this._def.checks.find((ch)=>ch.kind==="email")}get isURL(){return!!this._def.checks.find((ch)=>ch.kind==="url")}get isEmoji(){return!!this._def.checks.find((ch)=>ch.kind==="emoji")}get isUUID(){return!!this._def.checks.find((ch)=>ch.kind==="uuid")}get isNANOID(){return!!this._def.checks.find((ch)=>ch.kind==="nanoid")}get isCUID(){return!!this._def.checks.find((ch)=>ch.kind==="cuid")}get isCUID2(){return!!this._def.checks.find((ch)=>ch.kind==="cuid2")}get isULID(){return!!this._def.checks.find((ch)=>ch.kind==="ulid")}get isIP(){return!!this._def.checks.find((ch)=>ch.kind==="ip")}get isCIDR(){return!!this._def.checks.find((ch)=>ch.kind==="cidr")}get isBase64(){return!!this._def.checks.find((ch)=>ch.kind==="base64")}get isBase64url(){return!!this._def.checks.find((ch)=>ch.kind==="base64url")}get minLength(){let min=null;for(let ch of this._def.checks)if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}return min}get maxLength(){let max=null;for(let ch of this._def.checks)if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return max}};ZodString.create=(params)=>{return new ZodString({checks:[],typeName:ZodFirstPartyTypeKind.ZodString,coerce:params?.coerce??!1,...processCreateParams(params)})};ZodNumber=class ZodNumber extends ZodType{constructor(){super(...arguments);this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(input){if(this._def.coerce)input.data=Number(input.data);if(this._getType(input)!==ZodParsedType.number){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.number,received:ctx2.parsedType}),INVALID}let ctx=void 0,status=new ParseStatus;for(let check of this._def.checks)if(check.kind==="int"){if(!util.isInteger(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:"integer",received:"float",message:check.message}),status.dirty()}else if(check.kind==="min"){if(check.inclusive?input.data<check.value:input.data<=check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()}else if(check.kind==="max"){if(check.inclusive?input.data>check.value:input.data>=check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()}else if(check.kind==="multipleOf"){if(floatSafeRemainder(input.data,check.value)!==0)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()}else if(check.kind==="finite"){if(!Number.isFinite(input.data))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_finite,message:check.message}),status.dirty()}else util.assertNever(check);return{status:status.value,value:input.data}}gte(value,message){return this.setLimit("min",value,!0,errorUtil.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil.toString(message))}setLimit(kind,value,inclusive,message){return new ZodNumber({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil.toString(message)}]})}_addCheck(check){return new ZodNumber({...this._def,checks:[...this._def.checks,check]})}int(message){return this._addCheck({kind:"int",message:errorUtil.toString(message)})}positive(message){return this._addCheck({kind:"min",value:0,inclusive:!1,message:errorUtil.toString(message)})}negative(message){return this._addCheck({kind:"max",value:0,inclusive:!1,message:errorUtil.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:0,inclusive:!0,message:errorUtil.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:0,inclusive:!0,message:errorUtil.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil.toString(message)})}finite(message){return this._addCheck({kind:"finite",message:errorUtil.toString(message)})}safe(message){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:errorUtil.toString(message)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:errorUtil.toString(message)})}get minValue(){let min=null;for(let ch of this._def.checks)if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}return min}get maxValue(){let max=null;for(let ch of this._def.checks)if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return max}get isInt(){return!!this._def.checks.find((ch)=>ch.kind==="int"||ch.kind==="multipleOf"&&util.isInteger(ch.value))}get isFinite(){let max=null,min=null;for(let ch of this._def.checks)if(ch.kind==="finite"||ch.kind==="int"||ch.kind==="multipleOf")return!0;else if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}else if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return Number.isFinite(min)&&Number.isFinite(max)}};ZodNumber.create=(params)=>{return new ZodNumber({checks:[],typeName:ZodFirstPartyTypeKind.ZodNumber,coerce:params?.coerce||!1,...processCreateParams(params)})};ZodBigInt=class ZodBigInt extends ZodType{constructor(){super(...arguments);this.min=this.gte,this.max=this.lte}_parse(input){if(this._def.coerce)try{input.data=BigInt(input.data)}catch{return this._getInvalidInput(input)}if(this._getType(input)!==ZodParsedType.bigint)return this._getInvalidInput(input);let ctx=void 0,status=new ParseStatus;for(let check of this._def.checks)if(check.kind==="min"){if(check.inclusive?input.data<check.value:input.data<=check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_small,type:"bigint",minimum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()}else if(check.kind==="max"){if(check.inclusive?input.data>check.value:input.data>=check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_big,type:"bigint",maximum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()}else if(check.kind==="multipleOf"){if(input.data%check.value!==BigInt(0))ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()}else util.assertNever(check);return{status:status.value,value:input.data}}_getInvalidInput(input){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.bigint,received:ctx.parsedType}),INVALID}gte(value,message){return this.setLimit("min",value,!0,errorUtil.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil.toString(message))}setLimit(kind,value,inclusive,message){return new ZodBigInt({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil.toString(message)}]})}_addCheck(check){return new ZodBigInt({...this._def,checks:[...this._def.checks,check]})}positive(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:errorUtil.toString(message)})}negative(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:errorUtil.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:errorUtil.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:errorUtil.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil.toString(message)})}get minValue(){let min=null;for(let ch of this._def.checks)if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}return min}get maxValue(){let max=null;for(let ch of this._def.checks)if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return max}};ZodBigInt.create=(params)=>{return new ZodBigInt({checks:[],typeName:ZodFirstPartyTypeKind.ZodBigInt,coerce:params?.coerce??!1,...processCreateParams(params)})};ZodBoolean=class ZodBoolean extends ZodType{_parse(input){if(this._def.coerce)input.data=Boolean(input.data);if(this._getType(input)!==ZodParsedType.boolean){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.boolean,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodBoolean.create=(params)=>{return new ZodBoolean({typeName:ZodFirstPartyTypeKind.ZodBoolean,coerce:params?.coerce||!1,...processCreateParams(params)})};ZodDate=class ZodDate extends ZodType{_parse(input){if(this._def.coerce)input.data=new Date(input.data);if(this._getType(input)!==ZodParsedType.date){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.date,received:ctx2.parsedType}),INVALID}if(Number.isNaN(input.data.getTime())){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_date}),INVALID}let status=new ParseStatus,ctx=void 0;for(let check of this._def.checks)if(check.kind==="min"){if(input.data.getTime()<check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_small,message:check.message,inclusive:!0,exact:!1,minimum:check.value,type:"date"}),status.dirty()}else if(check.kind==="max"){if(input.data.getTime()>check.value)ctx=this._getOrReturnCtx(input,ctx),addIssueToContext(ctx,{code:ZodIssueCode.too_big,message:check.message,inclusive:!0,exact:!1,maximum:check.value,type:"date"}),status.dirty()}else util.assertNever(check);return{status:status.value,value:new Date(input.data.getTime())}}_addCheck(check){return new ZodDate({...this._def,checks:[...this._def.checks,check]})}min(minDate,message){return this._addCheck({kind:"min",value:minDate.getTime(),message:errorUtil.toString(message)})}max(maxDate,message){return this._addCheck({kind:"max",value:maxDate.getTime(),message:errorUtil.toString(message)})}get minDate(){let min=null;for(let ch of this._def.checks)if(ch.kind==="min"){if(min===null||ch.value>min)min=ch.value}return min!=null?new Date(min):null}get maxDate(){let max=null;for(let ch of this._def.checks)if(ch.kind==="max"){if(max===null||ch.value<max)max=ch.value}return max!=null?new Date(max):null}};ZodDate.create=(params)=>{return new ZodDate({checks:[],coerce:params?.coerce||!1,typeName:ZodFirstPartyTypeKind.ZodDate,...processCreateParams(params)})};ZodSymbol=class ZodSymbol extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.symbol){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.symbol,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodSymbol.create=(params)=>{return new ZodSymbol({typeName:ZodFirstPartyTypeKind.ZodSymbol,...processCreateParams(params)})};ZodUndefined=class ZodUndefined extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.undefined){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.undefined,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodUndefined.create=(params)=>{return new ZodUndefined({typeName:ZodFirstPartyTypeKind.ZodUndefined,...processCreateParams(params)})};ZodNull=class ZodNull extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.null){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.null,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodNull.create=(params)=>{return new ZodNull({typeName:ZodFirstPartyTypeKind.ZodNull,...processCreateParams(params)})};ZodAny=class ZodAny extends ZodType{constructor(){super(...arguments);this._any=!0}_parse(input){return OK(input.data)}};ZodAny.create=(params)=>{return new ZodAny({typeName:ZodFirstPartyTypeKind.ZodAny,...processCreateParams(params)})};ZodUnknown=class ZodUnknown extends ZodType{constructor(){super(...arguments);this._unknown=!0}_parse(input){return OK(input.data)}};ZodUnknown.create=(params)=>{return new ZodUnknown({typeName:ZodFirstPartyTypeKind.ZodUnknown,...processCreateParams(params)})};ZodNever=class ZodNever extends ZodType{_parse(input){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.never,received:ctx.parsedType}),INVALID}};ZodNever.create=(params)=>{return new ZodNever({typeName:ZodFirstPartyTypeKind.ZodNever,...processCreateParams(params)})};ZodVoid=class ZodVoid extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.undefined){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.void,received:ctx.parsedType}),INVALID}return OK(input.data)}};ZodVoid.create=(params)=>{return new ZodVoid({typeName:ZodFirstPartyTypeKind.ZodVoid,...processCreateParams(params)})};ZodArray=class ZodArray extends ZodType{_parse(input){let{ctx,status}=this._processInputParams(input),def=this._def;if(ctx.parsedType!==ZodParsedType.array)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.array,received:ctx.parsedType}),INVALID;if(def.exactLength!==null){let tooBig=ctx.data.length>def.exactLength.value,tooSmall=ctx.data.length<def.exactLength.value;if(tooBig||tooSmall)addIssueToContext(ctx,{code:tooBig?ZodIssueCode.too_big:ZodIssueCode.too_small,minimum:tooSmall?def.exactLength.value:void 0,maximum:tooBig?def.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:def.exactLength.message}),status.dirty()}if(def.minLength!==null){if(ctx.data.length<def.minLength.value)addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:def.minLength.value,type:"array",inclusive:!0,exact:!1,message:def.minLength.message}),status.dirty()}if(def.maxLength!==null){if(ctx.data.length>def.maxLength.value)addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:def.maxLength.value,type:"array",inclusive:!0,exact:!1,message:def.maxLength.message}),status.dirty()}if(ctx.common.async)return Promise.all([...ctx.data].map((item,i)=>{return def.type._parseAsync(new ParseInputLazyPath(ctx,item,ctx.path,i))})).then((result3)=>{return ParseStatus.mergeArray(status,result3)});let result2=[...ctx.data].map((item,i)=>{return def.type._parseSync(new ParseInputLazyPath(ctx,item,ctx.path,i))});return ParseStatus.mergeArray(status,result2)}get element(){return this._def.type}min(minLength,message){return new ZodArray({...this._def,minLength:{value:minLength,message:errorUtil.toString(message)}})}max(maxLength,message){return new ZodArray({...this._def,maxLength:{value:maxLength,message:errorUtil.toString(message)}})}length(len,message){return new ZodArray({...this._def,exactLength:{value:len,message:errorUtil.toString(message)}})}nonempty(message){return this.min(1,message)}};ZodArray.create=(schema,params)=>{return new ZodArray({type:schema,minLength:null,maxLength:null,exactLength:null,typeName:ZodFirstPartyTypeKind.ZodArray,...processCreateParams(params)})};ZodObject=class ZodObject extends ZodType{constructor(){super(...arguments);this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let shape=this._def.shape(),keys=util.objectKeys(shape);return this._cached={shape,keys},this._cached}_parse(input){if(this._getType(input)!==ZodParsedType.object){let ctx2=this._getOrReturnCtx(input);return addIssueToContext(ctx2,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx2.parsedType}),INVALID}let{status,ctx}=this._processInputParams(input),{shape,keys:shapeKeys}=this._getCached(),extraKeys=[];if(!(this._def.catchall instanceof ZodNever&&this._def.unknownKeys==="strip")){for(let key in ctx.data)if(!shapeKeys.includes(key))extraKeys.push(key)}let pairs=[];for(let key of shapeKeys){let keyValidator=shape[key],value=ctx.data[key];pairs.push({key:{status:"valid",value:key},value:keyValidator._parse(new ParseInputLazyPath(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}if(this._def.catchall instanceof ZodNever){let unknownKeys=this._def.unknownKeys;if(unknownKeys==="passthrough")for(let key of extraKeys)pairs.push({key:{status:"valid",value:key},value:{status:"valid",value:ctx.data[key]}});else if(unknownKeys==="strict"){if(extraKeys.length>0)addIssueToContext(ctx,{code:ZodIssueCode.unrecognized_keys,keys:extraKeys}),status.dirty()}else if(unknownKeys==="strip");else throw Error("Internal ZodObject error: invalid unknownKeys value.")}else{let catchall=this._def.catchall;for(let key of extraKeys){let value=ctx.data[key];pairs.push({key:{status:"valid",value:key},value:catchall._parse(new ParseInputLazyPath(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}}if(ctx.common.async)return Promise.resolve().then(async()=>{let syncPairs=[];for(let pair of pairs){let key=await pair.key,value=await pair.value;syncPairs.push({key,value,alwaysSet:pair.alwaysSet})}return syncPairs}).then((syncPairs)=>{return ParseStatus.mergeObjectSync(status,syncPairs)});else return ParseStatus.mergeObjectSync(status,pairs)}get shape(){return this._def.shape()}strict(message){return errorUtil.errToObj,new ZodObject({...this._def,unknownKeys:"strict",...message!==void 0?{errorMap:(issue,ctx)=>{let defaultError=this._def.errorMap?.(issue,ctx).message??ctx.defaultError;if(issue.code==="unrecognized_keys")return{message:errorUtil.errToObj(message).message??defaultError};return{message:defaultError}}}:{}})}strip(){return new ZodObject({...this._def,unknownKeys:"strip"})}passthrough(){return new ZodObject({...this._def,unknownKeys:"passthrough"})}extend(augmentation){return new ZodObject({...this._def,shape:()=>({...this._def.shape(),...augmentation})})}merge(merging){return new ZodObject({unknownKeys:merging._def.unknownKeys,catchall:merging._def.catchall,shape:()=>({...this._def.shape(),...merging._def.shape()}),typeName:ZodFirstPartyTypeKind.ZodObject})}setKey(key,schema){return this.augment({[key]:schema})}catchall(index){return new ZodObject({...this._def,catchall:index})}pick(mask){let shape={};for(let key of util.objectKeys(mask))if(mask[key]&&this.shape[key])shape[key]=this.shape[key];return new ZodObject({...this._def,shape:()=>shape})}omit(mask){let shape={};for(let key of util.objectKeys(this.shape))if(!mask[key])shape[key]=this.shape[key];return new ZodObject({...this._def,shape:()=>shape})}deepPartial(){return deepPartialify(this)}partial(mask){let newShape={};for(let key of util.objectKeys(this.shape)){let fieldSchema=this.shape[key];if(mask&&!mask[key])newShape[key]=fieldSchema;else newShape[key]=fieldSchema.optional()}return new ZodObject({...this._def,shape:()=>newShape})}required(mask){let newShape={};for(let key of util.objectKeys(this.shape))if(mask&&!mask[key])newShape[key]=this.shape[key];else{let newField=this.shape[key];while(newField instanceof ZodOptional)newField=newField._def.innerType;newShape[key]=newField}return new ZodObject({...this._def,shape:()=>newShape})}keyof(){return createZodEnum(util.objectKeys(this.shape))}};ZodObject.create=(shape,params)=>{return new ZodObject({shape:()=>shape,unknownKeys:"strip",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)})};ZodObject.strictCreate=(shape,params)=>{return new ZodObject({shape:()=>shape,unknownKeys:"strict",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)})};ZodObject.lazycreate=(shape,params)=>{return new ZodObject({shape,unknownKeys:"strip",catchall:ZodNever.create(),typeName:ZodFirstPartyTypeKind.ZodObject,...processCreateParams(params)})};ZodUnion=class ZodUnion extends ZodType{_parse(input){let{ctx}=this._processInputParams(input),options=this._def.options;function handleResults(results){for(let result2 of results)if(result2.result.status==="valid")return result2.result;for(let result2 of results)if(result2.result.status==="dirty")return ctx.common.issues.push(...result2.ctx.common.issues),result2.result;let unionErrors=results.map((result2)=>new ZodError(result2.ctx.common.issues));return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union,unionErrors}),INVALID}if(ctx.common.async)return Promise.all(options.map(async(option)=>{let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null};return{result:await option._parseAsync({data:ctx.data,path:ctx.path,parent:childCtx}),ctx:childCtx}})).then(handleResults);else{let dirty=void 0,issues=[];for(let option of options){let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null},result2=option._parseSync({data:ctx.data,path:ctx.path,parent:childCtx});if(result2.status==="valid")return result2;else if(result2.status==="dirty"&&!dirty)dirty={result:result2,ctx:childCtx};if(childCtx.common.issues.length)issues.push(childCtx.common.issues)}if(dirty)return ctx.common.issues.push(...dirty.ctx.common.issues),dirty.result;let unionErrors=issues.map((issues2)=>new ZodError(issues2));return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union,unionErrors}),INVALID}}get options(){return this._def.options}};ZodUnion.create=(types,params)=>{return new ZodUnion({options:types,typeName:ZodFirstPartyTypeKind.ZodUnion,...processCreateParams(params)})};ZodDiscriminatedUnion=class ZodDiscriminatedUnion extends ZodType{_parse(input){let{ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.object)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx.parsedType}),INVALID;let discriminator=this.discriminator,discriminatorValue=ctx.data[discriminator],option=this.optionsMap.get(discriminatorValue);if(!option)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[discriminator]}),INVALID;if(ctx.common.async)return option._parseAsync({data:ctx.data,path:ctx.path,parent:ctx});else return option._parseSync({data:ctx.data,path:ctx.path,parent:ctx})}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(discriminator,options,params){let optionsMap=new Map;for(let type of options){let discriminatorValues=getDiscriminator(type.shape[discriminator]);if(!discriminatorValues.length)throw Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`);for(let value of discriminatorValues){if(optionsMap.has(value))throw Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);optionsMap.set(value,type)}}return new ZodDiscriminatedUnion({typeName:ZodFirstPartyTypeKind.ZodDiscriminatedUnion,discriminator,options,optionsMap,...processCreateParams(params)})}};ZodIntersection=class ZodIntersection extends ZodType{_parse(input){let{status,ctx}=this._processInputParams(input),handleParsed=(parsedLeft,parsedRight)=>{if(isAborted(parsedLeft)||isAborted(parsedRight))return INVALID;let merged=mergeValues(parsedLeft.value,parsedRight.value);if(!merged.valid)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_intersection_types}),INVALID;if(isDirty(parsedLeft)||isDirty(parsedRight))status.dirty();return{status:status.value,value:merged.data}};if(ctx.common.async)return Promise.all([this._def.left._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseAsync({data:ctx.data,path:ctx.path,parent:ctx})]).then(([left,right])=>handleParsed(left,right));else return handleParsed(this._def.left._parseSync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseSync({data:ctx.data,path:ctx.path,parent:ctx}))}};ZodIntersection.create=(left,right,params)=>{return new ZodIntersection({left,right,typeName:ZodFirstPartyTypeKind.ZodIntersection,...processCreateParams(params)})};ZodTuple=class ZodTuple extends ZodType{_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.array)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.array,received:ctx.parsedType}),INVALID;if(ctx.data.length<this._def.items.length)return addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),INVALID;if(!this._def.rest&&ctx.data.length>this._def.items.length)addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),status.dirty();let items=[...ctx.data].map((item,itemIndex)=>{let schema=this._def.items[itemIndex]||this._def.rest;if(!schema)return null;return schema._parse(new ParseInputLazyPath(ctx,item,ctx.path,itemIndex))}).filter((x)=>!!x);if(ctx.common.async)return Promise.all(items).then((results)=>{return ParseStatus.mergeArray(status,results)});else return ParseStatus.mergeArray(status,items)}get items(){return this._def.items}rest(rest){return new ZodTuple({...this._def,rest})}};ZodTuple.create=(schemas,params)=>{if(!Array.isArray(schemas))throw Error("You must pass an array of schemas to z.tuple([ ... ])");return new ZodTuple({items:schemas,typeName:ZodFirstPartyTypeKind.ZodTuple,rest:null,...processCreateParams(params)})};ZodRecord=class ZodRecord extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.object)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.object,received:ctx.parsedType}),INVALID;let pairs=[],keyType=this._def.keyType,valueType=this._def.valueType;for(let key in ctx.data)pairs.push({key:keyType._parse(new ParseInputLazyPath(ctx,key,ctx.path,key)),value:valueType._parse(new ParseInputLazyPath(ctx,ctx.data[key],ctx.path,key)),alwaysSet:key in ctx.data});if(ctx.common.async)return ParseStatus.mergeObjectAsync(status,pairs);else return ParseStatus.mergeObjectSync(status,pairs)}get element(){return this._def.valueType}static create(first,second,third){if(second instanceof ZodType)return new ZodRecord({keyType:first,valueType:second,typeName:ZodFirstPartyTypeKind.ZodRecord,...processCreateParams(third)});return new ZodRecord({keyType:ZodString.create(),valueType:first,typeName:ZodFirstPartyTypeKind.ZodRecord,...processCreateParams(second)})}};ZodMap=class ZodMap extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.map)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.map,received:ctx.parsedType}),INVALID;let keyType=this._def.keyType,valueType=this._def.valueType,pairs=[...ctx.data.entries()].map(([key,value],index)=>{return{key:keyType._parse(new ParseInputLazyPath(ctx,key,ctx.path,[index,"key"])),value:valueType._parse(new ParseInputLazyPath(ctx,value,ctx.path,[index,"value"]))}});if(ctx.common.async){let finalMap=new Map;return Promise.resolve().then(async()=>{for(let pair of pairs){let key=await pair.key,value=await pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID;if(key.status==="dirty"||value.status==="dirty")status.dirty();finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}})}else{let finalMap=new Map;for(let pair of pairs){let{key,value}=pair;if(key.status==="aborted"||value.status==="aborted")return INVALID;if(key.status==="dirty"||value.status==="dirty")status.dirty();finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}}}};ZodMap.create=(keyType,valueType,params)=>{return new ZodMap({valueType,keyType,typeName:ZodFirstPartyTypeKind.ZodMap,...processCreateParams(params)})};ZodSet=class ZodSet extends ZodType{_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.set)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.set,received:ctx.parsedType}),INVALID;let def=this._def;if(def.minSize!==null){if(ctx.data.size<def.minSize.value)addIssueToContext(ctx,{code:ZodIssueCode.too_small,minimum:def.minSize.value,type:"set",inclusive:!0,exact:!1,message:def.minSize.message}),status.dirty()}if(def.maxSize!==null){if(ctx.data.size>def.maxSize.value)addIssueToContext(ctx,{code:ZodIssueCode.too_big,maximum:def.maxSize.value,type:"set",inclusive:!0,exact:!1,message:def.maxSize.message}),status.dirty()}let valueType=this._def.valueType;function finalizeSet(elements2){let parsedSet=new Set;for(let element of elements2){if(element.status==="aborted")return INVALID;if(element.status==="dirty")status.dirty();parsedSet.add(element.value)}return{status:status.value,value:parsedSet}}let elements=[...ctx.data.values()].map((item,i)=>valueType._parse(new ParseInputLazyPath(ctx,item,ctx.path,i)));if(ctx.common.async)return Promise.all(elements).then((elements2)=>finalizeSet(elements2));else return finalizeSet(elements)}min(minSize,message){return new ZodSet({...this._def,minSize:{value:minSize,message:errorUtil.toString(message)}})}max(maxSize,message){return new ZodSet({...this._def,maxSize:{value:maxSize,message:errorUtil.toString(message)}})}size(size,message){return this.min(size,message).max(size,message)}nonempty(message){return this.min(1,message)}};ZodSet.create=(valueType,params)=>{return new ZodSet({valueType,minSize:null,maxSize:null,typeName:ZodFirstPartyTypeKind.ZodSet,...processCreateParams(params)})};ZodFunction=class ZodFunction extends ZodType{constructor(){super(...arguments);this.validate=this.implement}_parse(input){let{ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.function)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.function,received:ctx.parsedType}),INVALID;function makeArgsIssue(args,error){return makeIssue({data:args,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap(),en_default].filter((x)=>!!x),issueData:{code:ZodIssueCode.invalid_arguments,argumentsError:error}})}function makeReturnsIssue(returns,error){return makeIssue({data:returns,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap(),en_default].filter((x)=>!!x),issueData:{code:ZodIssueCode.invalid_return_type,returnTypeError:error}})}let params={errorMap:ctx.common.contextualErrorMap},fn=ctx.data;if(this._def.returns instanceof ZodPromise){let me=this;return OK(async function(...args){let error=new ZodError([]),parsedArgs=await me._def.args.parseAsync(args,params).catch((e)=>{throw error.addIssue(makeArgsIssue(args,e)),error}),result2=await Reflect.apply(fn,this,parsedArgs);return await me._def.returns._def.type.parseAsync(result2,params).catch((e)=>{throw error.addIssue(makeReturnsIssue(result2,e)),error})})}else{let me=this;return OK(function(...args){let parsedArgs=me._def.args.safeParse(args,params);if(!parsedArgs.success)throw new ZodError([makeArgsIssue(args,parsedArgs.error)]);let result2=Reflect.apply(fn,this,parsedArgs.data),parsedReturns=me._def.returns.safeParse(result2,params);if(!parsedReturns.success)throw new ZodError([makeReturnsIssue(result2,parsedReturns.error)]);return parsedReturns.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...items){return new ZodFunction({...this._def,args:ZodTuple.create(items).rest(ZodUnknown.create())})}returns(returnType){return new ZodFunction({...this._def,returns:returnType})}implement(func){return this.parse(func)}strictImplement(func){return this.parse(func)}static create(args,returns,params){return new ZodFunction({args:args?args:ZodTuple.create([]).rest(ZodUnknown.create()),returns:returns||ZodUnknown.create(),typeName:ZodFirstPartyTypeKind.ZodFunction,...processCreateParams(params)})}};ZodLazy=class ZodLazy extends ZodType{get schema(){return this._def.getter()}_parse(input){let{ctx}=this._processInputParams(input);return this._def.getter()._parse({data:ctx.data,path:ctx.path,parent:ctx})}};ZodLazy.create=(getter,params)=>{return new ZodLazy({getter,typeName:ZodFirstPartyTypeKind.ZodLazy,...processCreateParams(params)})};ZodLiteral=class ZodLiteral extends ZodType{_parse(input){if(input.data!==this._def.value){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_literal,expected:this._def.value}),INVALID}return{status:"valid",value:input.data}}get value(){return this._def.value}};ZodLiteral.create=(value,params)=>{return new ZodLiteral({value,typeName:ZodFirstPartyTypeKind.ZodLiteral,...processCreateParams(params)})};ZodEnum=class ZodEnum extends ZodType{_parse(input){if(typeof input.data!=="string"){let ctx=this._getOrReturnCtx(input),expectedValues=this._def.values;return addIssueToContext(ctx,{expected:util.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode.invalid_type}),INVALID}if(!this._cache)this._cache=new Set(this._def.values);if(!this._cache.has(input.data)){let ctx=this._getOrReturnCtx(input),expectedValues=this._def.values;return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_enum_value,options:expectedValues}),INVALID}return OK(input.data)}get options(){return this._def.values}get enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Values(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}extract(values,newDef=this._def){return ZodEnum.create(values,{...this._def,...newDef})}exclude(values,newDef=this._def){return ZodEnum.create(this.options.filter((opt)=>!values.includes(opt)),{...this._def,...newDef})}};ZodEnum.create=createZodEnum;ZodNativeEnum=class ZodNativeEnum extends ZodType{_parse(input){let nativeEnumValues=util.getValidEnumValues(this._def.values),ctx=this._getOrReturnCtx(input);if(ctx.parsedType!==ZodParsedType.string&&ctx.parsedType!==ZodParsedType.number){let expectedValues=util.objectValues(nativeEnumValues);return addIssueToContext(ctx,{expected:util.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode.invalid_type}),INVALID}if(!this._cache)this._cache=new Set(util.getValidEnumValues(this._def.values));if(!this._cache.has(input.data)){let expectedValues=util.objectValues(nativeEnumValues);return addIssueToContext(ctx,{received:ctx.data,code:ZodIssueCode.invalid_enum_value,options:expectedValues}),INVALID}return OK(input.data)}get enum(){return this._def.values}};ZodNativeEnum.create=(values,params)=>{return new ZodNativeEnum({values,typeName:ZodFirstPartyTypeKind.ZodNativeEnum,...processCreateParams(params)})};ZodPromise=class ZodPromise extends ZodType{unwrap(){return this._def.type}_parse(input){let{ctx}=this._processInputParams(input);if(ctx.parsedType!==ZodParsedType.promise&&ctx.common.async===!1)return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.promise,received:ctx.parsedType}),INVALID;let promisified=ctx.parsedType===ZodParsedType.promise?ctx.data:Promise.resolve(ctx.data);return OK(promisified.then((data)=>{return this._def.type.parseAsync(data,{path:ctx.path,errorMap:ctx.common.contextualErrorMap})}))}};ZodPromise.create=(schema,params)=>{return new ZodPromise({type:schema,typeName:ZodFirstPartyTypeKind.ZodPromise,...processCreateParams(params)})};ZodEffects=class ZodEffects extends ZodType{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ZodFirstPartyTypeKind.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(input){let{status,ctx}=this._processInputParams(input),effect=this._def.effect||null,checkCtx={addIssue:(arg)=>{if(addIssueToContext(ctx,arg),arg.fatal)status.abort();else status.dirty()},get path(){return ctx.path}};if(checkCtx.addIssue=checkCtx.addIssue.bind(checkCtx),effect.type==="preprocess"){let processed=effect.transform(ctx.data,checkCtx);if(ctx.common.async)return Promise.resolve(processed).then(async(processed2)=>{if(status.value==="aborted")return INVALID;let result2=await this._def.schema._parseAsync({data:processed2,path:ctx.path,parent:ctx});if(result2.status==="aborted")return INVALID;if(result2.status==="dirty")return DIRTY(result2.value);if(status.value==="dirty")return DIRTY(result2.value);return result2});else{if(status.value==="aborted")return INVALID;let result2=this._def.schema._parseSync({data:processed,path:ctx.path,parent:ctx});if(result2.status==="aborted")return INVALID;if(result2.status==="dirty")return DIRTY(result2.value);if(status.value==="dirty")return DIRTY(result2.value);return result2}}if(effect.type==="refinement"){let executeRefinement=(acc)=>{let result2=effect.refinement(acc,checkCtx);if(ctx.common.async)return Promise.resolve(result2);if(result2 instanceof Promise)throw Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return acc};if(ctx.common.async===!1){let inner=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(inner.status==="aborted")return INVALID;if(inner.status==="dirty")status.dirty();return executeRefinement(inner.value),{status:status.value,value:inner.value}}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then((inner)=>{if(inner.status==="aborted")return INVALID;if(inner.status==="dirty")status.dirty();return executeRefinement(inner.value).then(()=>{return{status:status.value,value:inner.value}})})}if(effect.type==="transform")if(ctx.common.async===!1){let base=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(!isValid(base))return INVALID;let result2=effect.transform(base.value,checkCtx);if(result2 instanceof Promise)throw Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:status.value,value:result2}}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then((base)=>{if(!isValid(base))return INVALID;return Promise.resolve(effect.transform(base.value,checkCtx)).then((result2)=>({status:status.value,value:result2}))});util.assertNever(effect)}};ZodEffects.create=(schema,effect,params)=>{return new ZodEffects({schema,typeName:ZodFirstPartyTypeKind.ZodEffects,effect,...processCreateParams(params)})};ZodEffects.createWithPreprocess=(preprocess,schema,params)=>{return new ZodEffects({schema,effect:{type:"preprocess",transform:preprocess},typeName:ZodFirstPartyTypeKind.ZodEffects,...processCreateParams(params)})};ZodOptional=class ZodOptional extends ZodType{_parse(input){if(this._getType(input)===ZodParsedType.undefined)return OK(void 0);return this._def.innerType._parse(input)}unwrap(){return this._def.innerType}};ZodOptional.create=(type,params)=>{return new ZodOptional({innerType:type,typeName:ZodFirstPartyTypeKind.ZodOptional,...processCreateParams(params)})};ZodNullable=class ZodNullable extends ZodType{_parse(input){if(this._getType(input)===ZodParsedType.null)return OK(null);return this._def.innerType._parse(input)}unwrap(){return this._def.innerType}};ZodNullable.create=(type,params)=>{return new ZodNullable({innerType:type,typeName:ZodFirstPartyTypeKind.ZodNullable,...processCreateParams(params)})};ZodDefault=class ZodDefault extends ZodType{_parse(input){let{ctx}=this._processInputParams(input),data=ctx.data;if(ctx.parsedType===ZodParsedType.undefined)data=this._def.defaultValue();return this._def.innerType._parse({data,path:ctx.path,parent:ctx})}removeDefault(){return this._def.innerType}};ZodDefault.create=(type,params)=>{return new ZodDefault({innerType:type,typeName:ZodFirstPartyTypeKind.ZodDefault,defaultValue:typeof params.default==="function"?params.default:()=>params.default,...processCreateParams(params)})};ZodCatch=class ZodCatch extends ZodType{_parse(input){let{ctx}=this._processInputParams(input),newCtx={...ctx,common:{...ctx.common,issues:[]}},result2=this._def.innerType._parse({data:newCtx.data,path:newCtx.path,parent:{...newCtx}});if(isAsync(result2))return result2.then((result3)=>{return{status:"valid",value:result3.status==="valid"?result3.value:this._def.catchValue({get error(){return new ZodError(newCtx.common.issues)},input:newCtx.data})}});else return{status:"valid",value:result2.status==="valid"?result2.value:this._def.catchValue({get error(){return new ZodError(newCtx.common.issues)},input:newCtx.data})}}removeCatch(){return this._def.innerType}};ZodCatch.create=(type,params)=>{return new ZodCatch({innerType:type,typeName:ZodFirstPartyTypeKind.ZodCatch,catchValue:typeof params.catch==="function"?params.catch:()=>params.catch,...processCreateParams(params)})};ZodNaN=class ZodNaN extends ZodType{_parse(input){if(this._getType(input)!==ZodParsedType.nan){let ctx=this._getOrReturnCtx(input);return addIssueToContext(ctx,{code:ZodIssueCode.invalid_type,expected:ZodParsedType.nan,received:ctx.parsedType}),INVALID}return{status:"valid",value:input.data}}};ZodNaN.create=(params)=>{return new ZodNaN({typeName:ZodFirstPartyTypeKind.ZodNaN,...processCreateParams(params)})};BRAND=Symbol("zod_brand");ZodBranded=class ZodBranded extends ZodType{_parse(input){let{ctx}=this._processInputParams(input),data=ctx.data;return this._def.type._parse({data,path:ctx.path,parent:ctx})}unwrap(){return this._def.type}};ZodPipeline=class ZodPipeline extends ZodType{_parse(input){let{status,ctx}=this._processInputParams(input);if(ctx.common.async)return(async()=>{let inResult=await this._def.in._parseAsync({data:ctx.data,path:ctx.path,parent:ctx});if(inResult.status==="aborted")return INVALID;if(inResult.status==="dirty")return status.dirty(),DIRTY(inResult.value);else return this._def.out._parseAsync({data:inResult.value,path:ctx.path,parent:ctx})})();else{let inResult=this._def.in._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(inResult.status==="aborted")return INVALID;if(inResult.status==="dirty")return status.dirty(),{status:"dirty",value:inResult.value};else return this._def.out._parseSync({data:inResult.value,path:ctx.path,parent:ctx})}}static create(a,b){return new ZodPipeline({in:a,out:b,typeName:ZodFirstPartyTypeKind.ZodPipeline})}};ZodReadonly=class ZodReadonly extends ZodType{_parse(input){let result2=this._def.innerType._parse(input),freeze=(data)=>{if(isValid(data))data.value=Object.freeze(data.value);return data};return isAsync(result2)?result2.then((data)=>freeze(data)):freeze(result2)}unwrap(){return this._def.innerType}};ZodReadonly.create=(type,params)=>{return new ZodReadonly({innerType:type,typeName:ZodFirstPartyTypeKind.ZodReadonly,...processCreateParams(params)})};late={object:ZodObject.lazycreate};(function(ZodFirstPartyTypeKind2){ZodFirstPartyTypeKind2.ZodString="ZodString",ZodFirstPartyTypeKind2.ZodNumber="ZodNumber",ZodFirstPartyTypeKind2.ZodNaN="ZodNaN",ZodFirstPartyTypeKind2.ZodBigInt="ZodBigInt",ZodFirstPartyTypeKind2.ZodBoolean="ZodBoolean",ZodFirstPartyTypeKind2.ZodDate="ZodDate",ZodFirstPartyTypeKind2.ZodSymbol="ZodSymbol",ZodFirstPartyTypeKind2.ZodUndefined="ZodUndefined",ZodFirstPartyTypeKind2.ZodNull="ZodNull",ZodFirstPartyTypeKind2.ZodAny="ZodAny",ZodFirstPartyTypeKind2.ZodUnknown="ZodUnknown",ZodFirstPartyTypeKind2.ZodNever="ZodNever",ZodFirstPartyTypeKind2.ZodVoid="ZodVoid",ZodFirstPartyTypeKind2.ZodArray="ZodArray",ZodFirstPartyTypeKind2.ZodObject="ZodObject",ZodFirstPartyTypeKind2.ZodUnion="ZodUnion",ZodFirstPartyTypeKind2.ZodDiscriminatedUnion="ZodDiscriminatedUnion",ZodFirstPartyTypeKind2.ZodIntersection="ZodIntersection",ZodFirstPartyTypeKind2.ZodTuple="ZodTuple",ZodFirstPartyTypeKind2.ZodRecord="ZodRecord",ZodFirstPartyTypeKind2.ZodMap="ZodMap",ZodFirstPartyTypeKind2.ZodSet="ZodSet",ZodFirstPartyTypeKind2.ZodFunction="ZodFunction",ZodFirstPartyTypeKind2.ZodLazy="ZodLazy",ZodFirstPartyTypeKind2.ZodLiteral="ZodLiteral",ZodFirstPartyTypeKind2.ZodEnum="ZodEnum",ZodFirstPartyTypeKind2.ZodEffects="ZodEffects",ZodFirstPartyTypeKind2.ZodNativeEnum="ZodNativeEnum",ZodFirstPartyTypeKind2.ZodOptional="ZodOptional",ZodFirstPartyTypeKind2.ZodNullable="ZodNullable",ZodFirstPartyTypeKind2.ZodDefault="ZodDefault",ZodFirstPartyTypeKind2.ZodCatch="ZodCatch",ZodFirstPartyTypeKind2.ZodPromise="ZodPromise",ZodFirstPartyTypeKind2.ZodBranded="ZodBranded",ZodFirstPartyTypeKind2.ZodPipeline="ZodPipeline",ZodFirstPartyTypeKind2.ZodReadonly="ZodReadonly"})(ZodFirstPartyTypeKind||(ZodFirstPartyTypeKind={}));stringType=ZodString.create,numberType=ZodNumber.create,nanType=ZodNaN.create,bigIntType=ZodBigInt.create,booleanType=ZodBoolean.create,dateType=ZodDate.create,symbolType=ZodSymbol.create,undefinedType=ZodUndefined.create,nullType=ZodNull.create,anyType=ZodAny.create,unknownType=ZodUnknown.create,neverType=ZodNever.create,voidType=ZodVoid.create,arrayType=ZodArray.create,objectType=ZodObject.create,strictObjectType=ZodObject.strictCreate,unionType=ZodUnion.create,discriminatedUnionType=ZodDiscriminatedUnion.create,intersectionType=ZodIntersection.create,tupleType=ZodTuple.create,recordType=ZodRecord.create,mapType=ZodMap.create,setType=ZodSet.create,functionType=ZodFunction.create,lazyType=ZodLazy.create,literalType=ZodLiteral.create,enumType=ZodEnum.create,nativeEnumType=ZodNativeEnum.create,promiseType=ZodPromise.create,effectsType=ZodEffects.create,optionalType=ZodOptional.create,nullableType=ZodNullable.create,preprocessType=ZodEffects.createWithPreprocess,pipelineType=ZodPipeline.create,coerce={string:(arg)=>ZodString.create({...arg,coerce:!0}),number:(arg)=>ZodNumber.create({...arg,coerce:!0}),boolean:(arg)=>ZodBoolean.create({...arg,coerce:!0}),bigint:(arg)=>ZodBigInt.create({...arg,coerce:!0}),date:(arg)=>ZodDate.create({...arg,coerce:!0})},NEVER=INVALID});var exports_external={};__export(exports_external,{void:()=>voidType,util:()=>util,unknown:()=>unknownType,union:()=>unionType,undefined:()=>undefinedType,tuple:()=>tupleType,transformer:()=>effectsType,symbol:()=>symbolType,string:()=>stringType,strictObject:()=>strictObjectType,setErrorMap:()=>setErrorMap,set:()=>setType,record:()=>recordType,quotelessJson:()=>quotelessJson,promise:()=>promiseType,preprocess:()=>preprocessType,pipeline:()=>pipelineType,ostring:()=>ostring,optional:()=>optionalType,onumber:()=>onumber,oboolean:()=>oboolean,objectUtil:()=>objectUtil,object:()=>objectType,number:()=>numberType,nullable:()=>nullableType,null:()=>nullType,never:()=>neverType,nativeEnum:()=>nativeEnumType,nan:()=>nanType,map:()=>mapType,makeIssue:()=>makeIssue,literal:()=>literalType,lazy:()=>lazyType,late:()=>late,isValid:()=>isValid,isDirty:()=>isDirty,isAsync:()=>isAsync,isAborted:()=>isAborted,intersection:()=>intersectionType,instanceof:()=>instanceOfType,getParsedType:()=>getParsedType,getErrorMap:()=>getErrorMap,function:()=>functionType,enum:()=>enumType,effect:()=>effectsType,discriminatedUnion:()=>discriminatedUnionType,defaultErrorMap:()=>en_default,datetimeRegex:()=>datetimeRegex,date:()=>dateType,custom:()=>custom,coerce:()=>coerce,boolean:()=>booleanType,bigint:()=>bigIntType,array:()=>arrayType,any:()=>anyType,addIssueToContext:()=>addIssueToContext,ZodVoid:()=>ZodVoid,ZodUnknown:()=>ZodUnknown,ZodUnion:()=>ZodUnion,ZodUndefined:()=>ZodUndefined,ZodType:()=>ZodType,ZodTuple:()=>ZodTuple,ZodTransformer:()=>ZodEffects,ZodSymbol:()=>ZodSymbol,ZodString:()=>ZodString,ZodSet:()=>ZodSet,ZodSchema:()=>ZodType,ZodRecord:()=>ZodRecord,ZodReadonly:()=>ZodReadonly,ZodPromise:()=>ZodPromise,ZodPipeline:()=>ZodPipeline,ZodParsedType:()=>ZodParsedType,ZodOptional:()=>ZodOptional,ZodObject:()=>ZodObject,ZodNumber:()=>ZodNumber,ZodNullable:()=>ZodNullable,ZodNull:()=>ZodNull,ZodNever:()=>ZodNever,ZodNativeEnum:()=>ZodNativeEnum,ZodNaN:()=>ZodNaN,ZodMap:()=>ZodMap,ZodLiteral:()=>ZodLiteral,ZodLazy:()=>ZodLazy,ZodIssueCode:()=>ZodIssueCode,ZodIntersection:()=>ZodIntersection,ZodFunction:()=>ZodFunction,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind,ZodError:()=>ZodError,ZodEnum:()=>ZodEnum,ZodEffects:()=>ZodEffects,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion,ZodDefault:()=>ZodDefault,ZodDate:()=>ZodDate,ZodCatch:()=>ZodCatch,ZodBranded:()=>ZodBranded,ZodBoolean:()=>ZodBoolean,ZodBigInt:()=>ZodBigInt,ZodArray:()=>ZodArray,ZodAny:()=>ZodAny,Schema:()=>ZodType,ParseStatus:()=>ParseStatus,OK:()=>OK,NEVER:()=>NEVER,INVALID:()=>INVALID,EMPTY_PATH:()=>EMPTY_PATH,DIRTY:()=>DIRTY,BRAND:()=>BRAND});var init_external=__esm(()=>{init_errors();init_parseUtil();init_typeAliases();init_util();init_types();init_ZodError()});var init_zod=__esm(()=>{init_external();init_external()});var exports_types={};__export(exports_types,{isBlockingEvent:()=>isBlockingEvent,DISPATCHED_EVENT_MATCHERS:()=>DISPATCHED_EVENT_MATCHERS,DISPATCHED_EVENTS:()=>DISPATCHED_EVENTS,CODEX_DISPATCHED_EVENT_MATCHERS:()=>CODEX_DISPATCHED_EVENT_MATCHERS});function isBlockingEvent(event){return BLOCKING_EVENTS.has(event)}var DISPATCHED_EVENT_MATCHERS,CODEX_DISPATCHED_EVENT_MATCHERS,DISPATCHED_EVENTS,BLOCKING_EVENTS;var init_types2=__esm(()=>{DISPATCHED_EVENT_MATCHERS={PreToolUse:"*",PostToolUse:"SendMessage"},CODEX_DISPATCHED_EVENT_MATCHERS={PreToolUse:"*",PostToolUse:"SendMessage",UserPromptSubmit:"*",Stop:"*"},DISPATCHED_EVENTS=Object.keys(DISPATCHED_EVENT_MATCHERS),BLOCKING_EVENTS=new Set(["PreToolUse","UserPromptSubmit","TeammateIdle","TaskCompleted","PermissionRequest"])});var exports_inject={};__export(exports_inject,{isTeamHooked:()=>isTeamHooked,injectTeamHooks:()=>injectTeamHooks,buildDispatchCommand:()=>buildDispatchCommand});import{existsSync as existsSync2}from"fs";import{mkdir,readFile as readFile2,writeFile as writeFile2}from"fs/promises";import{homedir as homedir2}from"os";import{join as join3}from"path";import{fileURLToPath}from"url";function escapeShellArg(arg){return`'${arg.replace(/'/g,"'\\''")}'`}function compiledBinaryCandidates(){let candidates=[];if(process.env.GENIE_HOOK_BIN)candidates.push(process.env.GENIE_HOOK_BIN);let home=process.env.GENIE_HOME??join3(homedir2(),".genie");candidates.push(join3(home,"bin","genie-hook"));try{let repoBin=fileURLToPath(new URL("../../dist/genie-hook",import.meta.url));candidates.push(repoBin)}catch{}return candidates}function buildDispatchCommand(){for(let candidate of compiledBinaryCandidates())if(existsSync2(candidate))return escapeShellArg(candidate);let entrypoint=fileURLToPath(new URL("../genie.ts",import.meta.url));if(!existsSync2(entrypoint))return"genie hook dispatch";let bun=process.execPath||"bun";return`${escapeShellArg(bun)} run ${escapeShellArg(entrypoint)} hook dispatch`}function isGenieDispatchCommand(command){if(typeof command!=="string")return!1;if(/(?:^|\s)hook\s+dispatch(?:\s|$)/.test(command))return!0;if(/(?:^|[/\\'"])genie-hook(?:['"]|\s|$)/.test(command))return!0;return!1}function claudeConfigDir(){return process.env.CLAUDE_CONFIG_DIR??join3(homedir2(),".claude")}function teamSettingsPath(teamName){let sanitized=teamName.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase();return join3(claudeConfigDir(),"teams",sanitized,"settings.json")}function buildHooksConfig(){let hooks={},dispatchCommand=buildDispatchCommand();for(let[event,matcher]of Object.entries(DISPATCHED_EVENT_MATCHERS))hooks[event]=[{matcher,hooks:[{type:"command",command:dispatchCommand,timeout:DISPATCH_TIMEOUT}]}];return hooks}async function readSettings(settingsPath){if(!existsSync2(settingsPath))return{};try{return JSON.parse(await readFile2(settingsPath,"utf-8"))}catch{return{}}}function allEventsAlreadyInjected(existingHooks,hooksConfig){return DISPATCHED_EVENTS.every((event)=>{let existing=existingHooks[event],desiredCommand=hooksConfig[event][0].hooks[0].command,desiredMatcher=hooksConfig[event][0].matcher;return existing?.some((m)=>m.matcher===desiredMatcher&&m.hooks?.some((h)=>h.command===desiredCommand))})}function hasNoObsoleteGenieEntries(existingHooks){return Object.keys(existingHooks).every((event)=>{if(DISPATCHED_EVENTS.includes(event))return!0;return!existingHooks[event]?.some((m)=>m.hooks?.some((h)=>isGenieDispatchCommand(h.command)))})}function pruneObsoleteGenieEntries(mergedHooks){for(let event of Object.keys(mergedHooks)){if(DISPATCHED_EVENTS.includes(event))continue;let cleaned=(mergedHooks[event]??[]).map((matcher)=>({...matcher,hooks:matcher.hooks?.filter((hook)=>!isGenieDispatchCommand(hook.command))})).filter((matcher)=>(matcher.hooks?.length??0)>0);if(cleaned.length===0)delete mergedHooks[event];else mergedHooks[event]=cleaned}}function refreshMatcherEntries(entries,genieEntry){return entries.map((matcher)=>{let hasGenieHook=matcher.hooks?.some((h)=>isGenieDispatchCommand(h.command));return{...matcher,matcher:hasGenieHook?genieEntry.matcher:matcher.matcher,hooks:matcher.hooks?.map((hook)=>isGenieDispatchCommand(hook.command)?{...hook,command:genieEntry.hooks[0].command,timeout:DISPATCH_TIMEOUT}:hook)}})}function upsertGenieEntry(mergedHooks,event,genieEntry){let existingEntries=refreshMatcherEntries(mergedHooks[event]??[],genieEntry),alreadyPresent=existingEntries.some((m)=>m.hooks?.some((h)=>isGenieDispatchCommand(h.command)));mergedHooks[event]=alreadyPresent?existingEntries:[...existingEntries,genieEntry]}async function injectIntoFile(settingsPath){let settings=await readSettings(settingsPath),hooksConfig=buildHooksConfig(),existingHooks=settings.hooks,hooksAlreadyClean=!!existingHooks&&allEventsAlreadyInjected(existingHooks,hooksConfig)&&hasNoObsoleteGenieEntries(existingHooks),permissionsChanged=ensureBaselineAllowedTools(settings);if(hooksAlreadyClean&&!permissionsChanged)return!1;if(!hooksAlreadyClean){let mergedHooks=existingHooks?{...existingHooks}:{};pruneObsoleteGenieEntries(mergedHooks);for(let event of DISPATCHED_EVENTS)upsertGenieEntry(mergedHooks,event,hooksConfig[event][0]);settings.hooks=mergedHooks}let dir=join3(settingsPath,"..");return await mkdir(dir,{recursive:!0}),await writeFile2(settingsPath,JSON.stringify(settings,null,2)),!0}async function injectTeamHooks(teamName){let path=teamSettingsPath(teamName);return injectIntoFile(path)}async function isTeamHooked(teamName){let path=teamSettingsPath(teamName);if(!existsSync2(path))return!1;try{let content=await readFile2(path,"utf-8"),hooks=JSON.parse(content).hooks;if(!hooks)return!1;return DISPATCHED_EVENTS.every((event)=>{return hooks[event]?.some((m)=>m.hooks?.some((h)=>isGenieDispatchCommand(h.command)))})}catch{return!1}}var DISPATCH_TIMEOUT=15;var init_inject=__esm(()=>{init_claude_settings();init_types2()});function normalizeValue(v){if(v===void 0||v===null)return;if(v==="")return;if(v==="inherit")return;return v}function resolveField(agent,field,ctx){return resolveFieldWithSource(agent,field,ctx).value}function resolveFieldWithSource(agent,field,ctx){let agentVal=normalizeValue(agent[field]);if(agentVal!==void 0)return{value:agentVal,source:"explicit"};if(ctx.parent){let parentVal=normalizeValue(ctx.parent.fields[field]);if(parentVal!==void 0)return{value:parentVal,source:`parent:${ctx.parent.name}`}}if(ctx.workspaceDefaults){let wsVal=normalizeValue(ctx.workspaceDefaults[field]);if(wsVal!==void 0)return{value:wsVal,source:"workspace"}}return{value:BUILTIN_DEFAULTS[field],source:"built-in"}}function computeEffectiveDefaults(workspaceDefaults){if(!workspaceDefaults)return{...BUILTIN_DEFAULTS};let result2={...BUILTIN_DEFAULTS};for(let key of Object.keys(BUILTIN_DEFAULTS)){let wsVal=normalizeValue(workspaceDefaults[key]);if(wsVal!==void 0)result2[key]=wsVal}return result2}var BUILTIN_DEFAULTS,RESOLVED_FIELDS;var init_defaults=__esm(()=>{BUILTIN_DEFAULTS={model:"opus",promptMode:"append",color:"blue",effort:"high",thinking:"enabled",permissionMode:"auto"},RESOLVED_FIELDS=["model"]});var exports_js_yaml={};__export(exports_js_yaml,{types:()=>types2,safeLoadAll:()=>safeLoadAll,safeLoad:()=>safeLoad,safeDump:()=>safeDump,loadAll:()=>loadAll,load:()=>load,dump:()=>dump,default:()=>jsYaml,YAMLException:()=>YAMLException,Type:()=>Type,Schema:()=>Schema,JSON_SCHEMA:()=>JSON_SCHEMA,FAILSAFE_SCHEMA:()=>FAILSAFE_SCHEMA,DEFAULT_SCHEMA:()=>DEFAULT_SCHEMA,CORE_SCHEMA:()=>CORE_SCHEMA});function isNothing(subject){return typeof subject>"u"||subject===null}function isObject(subject){return typeof subject==="object"&&subject!==null}function toArray(sequence){if(Array.isArray(sequence))return sequence;else if(isNothing(sequence))return[];return[sequence]}function extend(target,source){var index,length,key,sourceKeys;if(source){sourceKeys=Object.keys(source);for(index=0,length=sourceKeys.length;index<length;index+=1)key=sourceKeys[index],target[key]=source[key]}return target}function repeat(string,count){var result2="",cycle;for(cycle=0;cycle<count;cycle+=1)result2+=string;return result2}function isNegativeZero(number){return number===0&&Number.NEGATIVE_INFINITY===1/number}function formatError(exception,compact){var where="",message=exception.reason||"(unknown reason)";if(!exception.mark)return message;if(exception.mark.name)where+='in "'+exception.mark.name+'" ';if(where+="("+(exception.mark.line+1)+":"+(exception.mark.column+1)+")",!compact&&exception.mark.snippet)where+=`
|
|
152
152
|
|
|
153
153
|
`+exception.mark.snippet;return message+" "+where}function YAMLException$1(reason,mark){if(Error.call(this),this.name="YAMLException",this.reason=reason,this.mark=mark,this.message=formatError(this,!1),Error.captureStackTrace)Error.captureStackTrace(this,this.constructor);else this.stack=Error().stack||""}function getLine(buffer,lineStart,lineEnd,position,maxLineLength){var head="",tail="",maxHalfLength=Math.floor(maxLineLength/2)-1;if(position-lineStart>maxHalfLength)head=" ... ",lineStart=position-maxHalfLength+head.length;if(lineEnd-position>maxHalfLength)tail=" ...",lineEnd=position+maxHalfLength-tail.length;return{str:head+buffer.slice(lineStart,lineEnd).replace(/\t/g,"\u2192")+tail,pos:position-lineStart+head.length}}function padStart(string,max){return common.repeat(" ",max-string.length)+string}function makeSnippet(mark,options){if(options=Object.create(options||null),!mark.buffer)return null;if(!options.maxLength)options.maxLength=79;if(typeof options.indent!=="number")options.indent=1;if(typeof options.linesBefore!=="number")options.linesBefore=3;if(typeof options.linesAfter!=="number")options.linesAfter=2;var re=/\r?\n|\r|\0/g,lineStarts=[0],lineEnds=[],match,foundLineNo=-1;while(match=re.exec(mark.buffer))if(lineEnds.push(match.index),lineStarts.push(match.index+match[0].length),mark.position<=match.index&&foundLineNo<0)foundLineNo=lineStarts.length-2;if(foundLineNo<0)foundLineNo=lineStarts.length-1;var result2="",i,line,lineNoLength=Math.min(mark.line+options.linesAfter,lineEnds.length).toString().length,maxLineLength=options.maxLength-(options.indent+lineNoLength+3);for(i=1;i<=options.linesBefore;i++){if(foundLineNo-i<0)break;line=getLine(mark.buffer,lineStarts[foundLineNo-i],lineEnds[foundLineNo-i],mark.position-(lineStarts[foundLineNo]-lineStarts[foundLineNo-i]),maxLineLength),result2=common.repeat(" ",options.indent)+padStart((mark.line-i+1).toString(),lineNoLength)+" | "+line.str+`
|
|
154
154
|
`+result2}line=getLine(mark.buffer,lineStarts[foundLineNo],lineEnds[foundLineNo],mark.position,maxLineLength),result2+=common.repeat(" ",options.indent)+padStart((mark.line+1).toString(),lineNoLength)+" | "+line.str+`
|
|
@@ -319,7 +319,7 @@ ${bin} set-option -w pane-active-border-style "fg=$COLOR"
|
|
|
319
319
|
LIMIT 1
|
|
320
320
|
`;return rows.length>0?rowToAgentIdentity(rows[0]):null}function getAgentResolverCounters(){return{...resolverCounters}}function _resetAgentResolverCountersForTests(){resolverCounters.uuid=0,resolverCounters.dir=0,resolverCounters.customName=0,resolverCounters.role=0,resolverCounters.miss=0}function emitAgentResolved(resolvedId,tier,team){recordAuditEvent("agent",resolvedId,"agent_resolved",process.env.GENIE_AGENT_NAME??"resolver",{matched_tier:tier,team:team??null}).catch(()=>{})}function emitAgentResolvedAmbiguous(tier,candidateIds,team){recordAuditEvent("agent",candidateIds[0],"agent_resolved_ambiguous",process.env.GENIE_AGENT_NAME??"resolver",{matched_tier:tier,candidate_ids:candidateIds,team:team??null}).catch(()=>{})}function emitAgentNotResolved(team){recordAuditEvent("agent","unresolved","agent_not_resolved",process.env.GENIE_AGENT_NAME??"resolver",{team:team??null}).catch(()=>{})}async function resolveAgentId(nameOrId,team){if(!nameOrId)return null;let sql;try{sql=await getConnection()}catch{return null}let exactRows=await sql`SELECT id FROM agents WHERE id = ${nameOrId} LIMIT 1`;if(exactRows.length>0){let id=exactRows[0].id,tier=id.startsWith("dir:")?"dir":"uuid";if(tier==="dir")resolverCounters.dir++;else resolverCounters.uuid++;return emitAgentResolved(id,tier,team),id}let dirId=`dir:${nameOrId}`,dirRows=await sql`SELECT id FROM agents WHERE id = ${dirId} LIMIT 1`;if(dirRows.length>0)return resolverCounters.dir++,emitAgentResolved(dirRows[0].id,"dir",team),dirRows[0].id;if(team){let cnRows=await sql`
|
|
321
321
|
SELECT id FROM agents WHERE custom_name = ${nameOrId} AND team = ${team} LIMIT 2
|
|
322
|
-
`;if(cnRows.length===1)return resolverCounters.customName++,emitAgentResolved(cnRows[0].id,"customName",team),cnRows[0].id;if(cnRows.length>1)return emitAgentResolvedAmbiguous("customName",cnRows.map((r)=>r.id),team),resolverCounters.miss++,null}let roleRows=await sql`SELECT id FROM agents WHERE role = ${nameOrId} LIMIT 2`;if(roleRows.length===1)return resolverCounters.role++,emitAgentResolved(roleRows[0].id,"role",team),roleRows[0].id;if(roleRows.length>1)return emitAgentResolvedAmbiguous("role",roleRows.map((r)=>r.id),team),resolverCounters.miss++,null;return resolverCounters.miss++,emitAgentNotResolved(team),null}async function resolveAgentIdStrict(nameOrId,team){let id=await resolveAgentId(nameOrId,team);if(id)return id;let teamHint=team?` (team scope: ${team})`:" (no team scope \u2014 pass --team to disambiguate)";throw Error(`No agent matches "${
|
|
322
|
+
`;if(cnRows.length===1)return resolverCounters.customName++,emitAgentResolved(cnRows[0].id,"customName",team),cnRows[0].id;if(cnRows.length>1)return emitAgentResolvedAmbiguous("customName",cnRows.map((r)=>r.id),team),resolverCounters.miss++,null}let roleRows=await sql`SELECT id FROM agents WHERE role = ${nameOrId} LIMIT 2`;if(roleRows.length===1)return resolverCounters.role++,emitAgentResolved(roleRows[0].id,"role",team),roleRows[0].id;if(roleRows.length>1)return emitAgentResolvedAmbiguous("role",roleRows.map((r)=>r.id),team),resolverCounters.miss++,null;return resolverCounters.miss++,emitAgentNotResolved(team),null}async function resolveAgentIdStrict(nameOrId,team,displayInput=nameOrId){let id=await resolveAgentId(nameOrId,team);if(id)return id;let teamHint=team?` (team scope: ${team})`:" (no team scope \u2014 pass --team to disambiguate)";throw Error(`No agent matches "${displayInput}"${teamHint}. Resolution checked: exact id, dir:${nameOrId}, custom_name+team, role. Run \`genie ls\` to see live agents.`)}async function setCurrentExecutor(agentId,executorId){await(await getConnection())`UPDATE agents SET current_executor_id = ${executorId} WHERE id = ${agentId}`}async function getAgentEffectiveState(agentId){let rows=await(await getConnection())`
|
|
323
323
|
SELECT e.state FROM executors e
|
|
324
324
|
JOIN agents a ON a.current_executor_id = e.id
|
|
325
325
|
WHERE a.id = ${agentId}
|
|
@@ -418,7 +418,7 @@ ${bin} set-option -w pane-active-border-style "fg=$COLOR"
|
|
|
418
418
|
WHERE a.id = ${agentId}
|
|
419
419
|
AND e.state IN ('spawning', 'running', 'working', 'idle', 'permission', 'question')
|
|
420
420
|
LIMIT 1
|
|
421
|
-
`;return rows.length>0?rows[0].state:null}async function isExecutorAlive(agentId){return await getLiveExecutorState(agentId)!==null}async function resolveWorkerLivenessByTransport(worker,opts){if(/^%\d+$/.test(worker.paneId))return(opts?.isPaneAliveFn??(async(pane)=>{let{isPaneAlive:isPaneAlive2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux));return isPaneAlive2(pane)}))(worker.paneId);return(opts?.isExecutorAliveFn??isExecutorAlive)(worker.id)}var STAT_CONCURRENCY_CAP=32,_resumeJsonlScannerDeps;var init_executor_registry=__esm(()=>{init_audit();init_db();_resumeJsonlScannerDeps={scanForSession:null}});var exports_team_manager={};__export(exports_team_manager,{validateBranchName:()=>validateBranchName,updateTeamConfig:()=>updateTeamConfig,unarchiveTeam:()=>unarchiveTeam,setTeamStatus:()=>setTeamStatus,resolveLeaderName:()=>resolveLeaderName,listTeams:()=>listTeams,listMembers:()=>listMembers,killTeamMembers:()=>killTeamMembers,hireAgent:()=>hireAgent,getTeam:()=>getTeam,fireAgent:()=>fireAgent,ensureTeamRow:()=>ensureTeamRow,disbandTeam:()=>disbandTeam,createTeam:()=>createTeam,archiveTeam:()=>archiveTeam});import{existsSync as existsSync8}from"fs";import{mkdir as mkdir2,symlink}from"fs/promises";import{homedir as homedir7}from"os";import path,{join as join11}from"path";var{$}=globalThis.Bun;function parseMembers(raw){if(Array.isArray(raw))return raw;if(typeof raw==="string")try{let parsed=JSON.parse(raw);return Array.isArray(parsed)?parsed:[]}catch{return[]}return[]}function rowToTeamConfig(row){let config={name:row.name,repo:row.repo,baseBranch:row.base_branch,worktreePath:row.worktree_path,members:parseMembers(row.members),status:row.status,createdAt:row.created_at instanceof Date?row.created_at.toISOString():String(row.created_at)};if(row.leader)config.leader=row.leader;if(row.native_team_parent_session_id)config.nativeTeamParentSessionId=row.native_team_parent_session_id;if(row.native_teams_enabled)config.nativeTeamsEnabled=row.native_teams_enabled;if(row.tmux_session_name)config.tmuxSessionName=row.tmux_session_name;if(row.wish_slug)config.wishSlug=row.wish_slug;if(row.spawner)config.spawner=row.spawner;if(row.archived_at)config.archivedAt=row.archived_at instanceof Date?row.archived_at.toISOString():String(row.archived_at);if(row.parent_team)config.parentTeam=row.parent_team;let allow=parseAllowChildReachback(row.allow_child_reachback);if(allow.length>0)config.allowChildReachback=allow;return config}function parseAllowChildReachback(raw){if(Array.isArray(raw))return raw.filter((x)=>typeof x==="string");if(typeof raw==="string")try{let parsed=JSON.parse(raw);return Array.isArray(parsed)?parsed.filter((x)=>typeof x==="string"):[]}catch{return[]}return[]}function getGenieDir2(){return process.env.GENIE_HOME??join11(homedir7(),".genie")}function getWorktreeBase(repoPath){let base=loadGenieConfigSync().terminal?.worktreeBase;if(base&&base!==".worktrees"){if(path.isAbsolute(base))return base;return join11(repoPath,base)}let projectName=path.basename(repoPath);return join11(getGenieDir2(),"worktrees",projectName)}function validateBranchName(name){let errors2=[];if(/\s/.test(name))errors2.push("contains spaces");if(name.includes(".."))errors2.push('contains ".."');if(name.includes("~"))errors2.push('contains "~"');if(name.includes("^"))errors2.push('contains "^"');if(name.includes(":"))errors2.push('contains ":"');if(name.includes("?"))errors2.push('contains "?"');if(name.includes("*"))errors2.push('contains "*"');if(name.includes("["))errors2.push('contains "["');if(name.includes("\\"))errors2.push('contains "\\"');if(/[\x00-\x1f\x7f]/.test(name))errors2.push("contains control characters");if(name.endsWith(".lock"))errors2.push('ends with ".lock"');if(name.endsWith("/"))errors2.push('ends with "/"');if(name.endsWith("."))errors2.push('ends with "."');if(name.startsWith("-"))errors2.push('starts with "-"');if(errors2.length>0)throw Error(`Invalid team name '${name}': must be a valid git branch name (${errors2.join(", ")})`)}async function killWorkersByName(agentName,teamName){let matches=(await list()).filter((w)=>(w.role===agentName||w.id===agentName)&&(!teamName||w.team===teamName));for(let w of matches){if(w.currentExecutorId)try{await terminateExecutor(w.currentExecutorId),await setCurrentExecutor(w.id,null)}catch{}try{if(w.paneId&&w.paneId!=="inline"){let{execSync:execSync2}=__require("child_process"),{genieTmuxCmd:genieTmuxCmd2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper));execSync2(genieTmuxCmd2(`kill-pane -t ${w.paneId}`),{stdio:"ignore"})}}catch{}await unregister(w.id)}}async function postCloneInit(repoPath,worktreePath){let parentNodeModules=join11(repoPath,"node_modules"),worktreeNodeModules=join11(worktreePath,"node_modules");if(existsSync8(parentNodeModules)&&!existsSync8(worktreeNodeModules))try{await symlink(parentNodeModules,worktreeNodeModules,"dir")}catch{}let initScript=join11(repoPath,".genie","init.sh");if(existsSync8(initScript))try{await $`bash ${initScript}`.cwd(worktreePath).quiet()}catch{}}async function ensureWorktree(repoPath,branchName,worktreePath,baseBranch){try{await $`git -C ${repoPath} fetch origin ${baseBranch}`.quiet()}catch{}if(await mkdir2(path.dirname(worktreePath),{recursive:!0}),existsSync8(worktreePath))return;let branchExists=!1;try{await $`git -C ${repoPath} rev-parse --verify ${branchName}`.quiet(),branchExists=!0}catch{if(!branchExists)try{await $`git -C ${repoPath} branch ${branchName} origin/${baseBranch}`.quiet()}catch{try{await $`git -C ${repoPath} branch ${branchName} ${baseBranch}`.quiet()}catch{await $`git -C ${repoPath} branch ${branchName}`.quiet()}}}await $`git clone --shared --branch ${branchName} ${repoPath} ${worktreePath}`.quiet();try{let userName=(await $`git -C ${repoPath} config user.name`.quiet()).text().trim(),userEmail=(await $`git -C ${repoPath} config user.email`.quiet()).text().trim();if(userName)await $`git -C ${worktreePath} config user.name ${userName}`.quiet();if(userEmail)await $`git -C ${worktreePath} config user.email ${userEmail}`.quiet()}catch{}await postCloneInit(repoPath,worktreePath)}async function detectSpawnerParentTeam(newTeamName){let envTeam=process.env.GENIE_TEAM,spawnerName=process.env.GENIE_AGENT_NAME;if(!envTeam||!spawnerName)return null;if(spawnerName==="cli")return null;if(envTeam===newTeamName)return null;try{return await getTeam(envTeam)?envTeam:null}catch{return null}}async function createTeam(name,repo,baseBranch="dev"){validateBranchName(name);let repoPath=path.resolve(repo),existing=await getTeam(name);if(existing)return existing;let worktreeBase=getWorktreeBase(repoPath),worktreePath=join11(worktreeBase,name);await ensureWorktree(repoPath,name,worktreePath,baseBranch);let now=new Date().toISOString(),config={name,repo:repoPath,baseBranch,worktreePath,members:[],status:"in_progress",createdAt:now},promoted=await detectSpawnerParentTeam(name);if(promoted)config.parentTeam=promoted;if(isInsideClaudeCode()){config.nativeTeamsEnabled=!0;try{let result2=await registerAsTeamLead(name);config.nativeTeamParentSessionId=result2.sessionId}catch{}}let sql=await getConnection();return await sql`
|
|
421
|
+
`;return rows.length>0?rows[0].state:null}async function isExecutorAlive(agentId){return await getLiveExecutorState(agentId)!==null}async function resolveWorkerLivenessByTransport(worker,opts){if(/^%\d+$/.test(worker.paneId))return(opts?.isPaneAliveFn??(async(pane)=>{let{isPaneAlive:isPaneAlive2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux));return isPaneAlive2(pane)}))(worker.paneId);return(opts?.isExecutorAliveFn??isExecutorAlive)(worker.id)}var STAT_CONCURRENCY_CAP=32,_resumeJsonlScannerDeps;var init_executor_registry=__esm(()=>{init_audit();init_db();_resumeJsonlScannerDeps={scanForSession:null}});var exports_team_manager={};__export(exports_team_manager,{validateBranchName:()=>validateBranchName,updateTeamConfig:()=>updateTeamConfig,unarchiveTeam:()=>unarchiveTeam,setTeamStatus:()=>setTeamStatus,resolveLeaderName:()=>resolveLeaderName,listTeams:()=>listTeams,listMembers:()=>listMembers,killTeamMembers:()=>killTeamMembers,hireAgent:()=>hireAgent,getTeam:()=>getTeam,fireAgent:()=>fireAgent,ensureTeamRow:()=>ensureTeamRow,disbandTeam:()=>disbandTeam,createTeam:()=>createTeam,archiveTeam:()=>archiveTeam});import{existsSync as existsSync8}from"fs";import{mkdir as mkdir2,symlink}from"fs/promises";import{homedir as homedir7}from"os";import path,{join as join11}from"path";var{$}=globalThis.Bun;function isValidTeamMemberId(member){return AGENT_ID_RE.test(member)||member.startsWith("dir:")}function sanitizeMembersForWrite(teamName,members){let kept=members.filter(isValidTeamMemberId);if(kept.length!==members.length)recordAuditEvent("team",teamName,"members_sanitized",getActor(),{dropped:members.filter((member)=>!isValidTeamMemberId(member)),reason:"teams_members_uuid_check"}).catch(()=>{});return kept}function parseMembers(raw){if(Array.isArray(raw))return raw;if(typeof raw==="string")try{let parsed=JSON.parse(raw);return Array.isArray(parsed)?parsed:[]}catch{return[]}return[]}function rowToTeamConfig(row){let config={name:row.name,repo:row.repo,baseBranch:row.base_branch,worktreePath:row.worktree_path,members:parseMembers(row.members),status:row.status,createdAt:row.created_at instanceof Date?row.created_at.toISOString():String(row.created_at)};if(row.leader)config.leader=row.leader;if(row.native_team_parent_session_id)config.nativeTeamParentSessionId=row.native_team_parent_session_id;if(row.native_teams_enabled)config.nativeTeamsEnabled=row.native_teams_enabled;if(row.tmux_session_name)config.tmuxSessionName=row.tmux_session_name;if(row.wish_slug)config.wishSlug=row.wish_slug;if(row.spawner)config.spawner=row.spawner;if(row.archived_at)config.archivedAt=row.archived_at instanceof Date?row.archived_at.toISOString():String(row.archived_at);if(row.parent_team)config.parentTeam=row.parent_team;let allow=parseAllowChildReachback(row.allow_child_reachback);if(allow.length>0)config.allowChildReachback=allow;return config}function parseAllowChildReachback(raw){if(Array.isArray(raw))return raw.filter((x)=>typeof x==="string");if(typeof raw==="string")try{let parsed=JSON.parse(raw);return Array.isArray(parsed)?parsed.filter((x)=>typeof x==="string"):[]}catch{return[]}return[]}function getGenieDir2(){return process.env.GENIE_HOME??join11(homedir7(),".genie")}function getWorktreeBase(repoPath){let base=loadGenieConfigSync().terminal?.worktreeBase;if(base&&base!==".worktrees"){if(path.isAbsolute(base))return base;return join11(repoPath,base)}let projectName=path.basename(repoPath);return join11(getGenieDir2(),"worktrees",projectName)}function validateBranchName(name){let errors2=[];if(/\s/.test(name))errors2.push("contains spaces");if(name.includes(".."))errors2.push('contains ".."');if(name.includes("~"))errors2.push('contains "~"');if(name.includes("^"))errors2.push('contains "^"');if(name.includes(":"))errors2.push('contains ":"');if(name.includes("?"))errors2.push('contains "?"');if(name.includes("*"))errors2.push('contains "*"');if(name.includes("["))errors2.push('contains "["');if(name.includes("\\"))errors2.push('contains "\\"');if(/[\x00-\x1f\x7f]/.test(name))errors2.push("contains control characters");if(name.endsWith(".lock"))errors2.push('ends with ".lock"');if(name.endsWith("/"))errors2.push('ends with "/"');if(name.endsWith("."))errors2.push('ends with "."');if(name.startsWith("-"))errors2.push('starts with "-"');if(errors2.length>0)throw Error(`Invalid team name '${name}': must be a valid git branch name (${errors2.join(", ")})`)}async function killWorkersByName(agentName,teamName){let matches=(await list()).filter((w)=>(w.role===agentName||w.id===agentName)&&(!teamName||w.team===teamName));for(let w of matches){if(w.currentExecutorId)try{await terminateExecutor(w.currentExecutorId),await setCurrentExecutor(w.id,null)}catch{}try{if(w.paneId&&w.paneId!=="inline"){let{execSync:execSync2}=__require("child_process"),{genieTmuxCmd:genieTmuxCmd2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper));execSync2(genieTmuxCmd2(`kill-pane -t ${w.paneId}`),{stdio:"ignore"})}}catch{}await unregister(w.id)}}async function postCloneInit(repoPath,worktreePath){let parentNodeModules=join11(repoPath,"node_modules"),worktreeNodeModules=join11(worktreePath,"node_modules");if(existsSync8(parentNodeModules)&&!existsSync8(worktreeNodeModules))try{await symlink(parentNodeModules,worktreeNodeModules,"dir")}catch{}let initScript=join11(repoPath,".genie","init.sh");if(existsSync8(initScript))try{await $`bash ${initScript}`.cwd(worktreePath).quiet()}catch{}}async function ensureWorktree(repoPath,branchName,worktreePath,baseBranch){try{await $`git -C ${repoPath} fetch origin ${baseBranch}`.quiet()}catch{}if(await mkdir2(path.dirname(worktreePath),{recursive:!0}),existsSync8(worktreePath))return;let branchExists=!1;try{await $`git -C ${repoPath} rev-parse --verify ${branchName}`.quiet(),branchExists=!0}catch{if(!branchExists)try{await $`git -C ${repoPath} branch ${branchName} origin/${baseBranch}`.quiet()}catch{try{await $`git -C ${repoPath} branch ${branchName} ${baseBranch}`.quiet()}catch{await $`git -C ${repoPath} branch ${branchName}`.quiet()}}}await $`git clone --shared --branch ${branchName} ${repoPath} ${worktreePath}`.quiet();try{let userName=(await $`git -C ${repoPath} config user.name`.quiet()).text().trim(),userEmail=(await $`git -C ${repoPath} config user.email`.quiet()).text().trim();if(userName)await $`git -C ${worktreePath} config user.name ${userName}`.quiet();if(userEmail)await $`git -C ${worktreePath} config user.email ${userEmail}`.quiet()}catch{}await postCloneInit(repoPath,worktreePath)}async function detectSpawnerParentTeam(newTeamName){let envTeam=process.env.GENIE_TEAM,spawnerName=process.env.GENIE_AGENT_NAME;if(!envTeam||!spawnerName)return null;if(spawnerName==="cli")return null;if(envTeam===newTeamName)return null;try{return await getTeam(envTeam)?envTeam:null}catch{return null}}async function createTeam(name,repo,baseBranch="dev"){validateBranchName(name);let repoPath=path.resolve(repo),existing=await getTeam(name);if(existing)return existing;let worktreeBase=getWorktreeBase(repoPath),worktreePath=join11(worktreeBase,name);await ensureWorktree(repoPath,name,worktreePath,baseBranch);let now=new Date().toISOString(),config={name,repo:repoPath,baseBranch,worktreePath,members:[],status:"in_progress",createdAt:now},promoted=await detectSpawnerParentTeam(name);if(promoted)config.parentTeam=promoted;if(isInsideClaudeCode()){config.nativeTeamsEnabled=!0;try{let result2=await registerAsTeamLead(name);config.nativeTeamParentSessionId=result2.sessionId}catch{}}let sql=await getConnection();return await sql`
|
|
422
422
|
INSERT INTO teams (
|
|
423
423
|
name, repo, base_branch, worktree_path, leader,
|
|
424
424
|
members, status, native_team_parent_session_id,
|
|
@@ -435,7 +435,7 @@ ${bin} set-option -w pane-active-border-style "fg=$COLOR"
|
|
|
435
435
|
${config.parentTeam??null},
|
|
436
436
|
${config.allowChildReachback?sql.json(config.allowChildReachback):null}
|
|
437
437
|
) ON CONFLICT (name) DO NOTHING
|
|
438
|
-
`,recordAuditEvent("team",name,"created",getActor(),{repo:repoPath,baseBranch}).catch(()=>{}),config}function buildConfigFromNative(name,nativeConfig,optsRepo){let leader=deriveBareLeaderName(nativeConfig.leadAgentId),memberNames=(nativeConfig.members??[]).map((m)=>m.name).filter((n)=>typeof n==="string"&&n.length>0),repoPath=path.resolve(nativeConfig.repo??optsRepo??process.cwd());return{name,repo:repoPath,baseBranch:nativeConfig.baseBranch??"dev",worktreePath:nativeConfig.worktreePath??repoPath,leader:leader??void 0,members:memberNames,status:nativeConfig.status??"in_progress",createdAt:new Date(nativeConfig.createdAt??Date.now()).toISOString(),nativeTeamsEnabled:nativeConfig.nativeTeamsEnabled??!0,tmuxSessionName:nativeConfig.tmuxSessionName,nativeTeamParentSessionId:nativeConfig.nativeTeamParentSessionId,wishSlug:nativeConfig.wishSlug}}function buildFallbackConfig(name,optsRepo){return{name,repo:path.resolve(optsRepo??process.cwd()),baseBranch:"dev",worktreePath:path.resolve(optsRepo??process.cwd()),members:[],status:"in_progress",createdAt:new Date().toISOString(),nativeTeamsEnabled:!0}}async function insertTeamRow(config,source){try{let sql=await getConnection();return await sql`
|
|
438
|
+
`,recordAuditEvent("team",name,"created",getActor(),{repo:repoPath,baseBranch}).catch(()=>{}),config}function buildConfigFromNative(name,nativeConfig,optsRepo){let leader=deriveBareLeaderName(nativeConfig.leadAgentId),memberNames=(nativeConfig.members??[]).map((m)=>m.name).filter((n)=>typeof n==="string"&&n.length>0),repoPath=path.resolve(nativeConfig.repo??optsRepo??process.cwd());return{name,repo:repoPath,baseBranch:nativeConfig.baseBranch??"dev",worktreePath:nativeConfig.worktreePath??repoPath,leader:leader??void 0,members:memberNames,status:nativeConfig.status??"in_progress",createdAt:new Date(nativeConfig.createdAt??Date.now()).toISOString(),nativeTeamsEnabled:nativeConfig.nativeTeamsEnabled??!0,tmuxSessionName:nativeConfig.tmuxSessionName,nativeTeamParentSessionId:nativeConfig.nativeTeamParentSessionId,wishSlug:nativeConfig.wishSlug}}function buildFallbackConfig(name,optsRepo){return{name,repo:path.resolve(optsRepo??process.cwd()),baseBranch:"dev",worktreePath:path.resolve(optsRepo??process.cwd()),members:[],status:"in_progress",createdAt:new Date().toISOString(),nativeTeamsEnabled:!0}}async function insertTeamRow(config,source){try{let sql=await getConnection(),safeMembers=sanitizeMembersForWrite(config.name,config.members);return await sql`
|
|
439
439
|
INSERT INTO teams (
|
|
440
440
|
name, repo, base_branch, worktree_path, leader,
|
|
441
441
|
members, status, native_teams_enabled, created_at,
|
|
@@ -443,16 +443,16 @@ ${bin} set-option -w pane-active-border-style "fg=$COLOR"
|
|
|
443
443
|
) VALUES (
|
|
444
444
|
${config.name}, ${config.repo}, ${config.baseBranch},
|
|
445
445
|
${config.worktreePath}, ${config.leader??null},
|
|
446
|
-
${sql.json(
|
|
446
|
+
${sql.json(safeMembers)}, ${config.status},
|
|
447
447
|
${config.nativeTeamsEnabled??!1}, ${config.createdAt},
|
|
448
448
|
${config.tmuxSessionName??null},
|
|
449
449
|
${config.nativeTeamParentSessionId??null},
|
|
450
450
|
${config.wishSlug??null}
|
|
451
451
|
) ON CONFLICT (name) DO NOTHING
|
|
452
|
-
`,recordAuditEvent("team",config.name,"backfilled",getActor(),{repo:config.repo,source,member_count:config.members.length}).catch(()=>{}),await getTeam(config.name)??config}catch{return null}}async function ensureTeamRow(name,opts){try{validateBranchName(name)}catch{return null}let existing=await getTeam(name);if(existing)return existing;let nativeConfig=opts?.nativeConfig??await loadNativeTeamConfig(name),config=nativeConfig?buildConfigFromNative(name,nativeConfig,opts?.repo):buildFallbackConfig(name,opts?.repo);return insertTeamRow(config,nativeConfig?"native-config":"cwd-fallback")}function deriveBareLeaderName(leadAgentId){if(!leadAgentId)return null;let at=leadAgentId.indexOf("@");return at===-1?leadAgentId:leadAgentId.slice(0,at)}async function hireAgent(teamName,agentName){let config=await getTeam(teamName);if(!config)throw Error(`Team "${teamName}" not found.`);let added;if(agentName==="council")
|
|
452
|
+
`,recordAuditEvent("team",config.name,"backfilled",getActor(),{repo:config.repo,source,member_count:config.members.length}).catch(()=>{}),await getTeam(config.name)??config}catch{return null}}async function ensureTeamRow(name,opts){try{validateBranchName(name)}catch{return null}let existing=await getTeam(name);if(existing)return existing;let nativeConfig=opts?.nativeConfig??await loadNativeTeamConfig(name),config=nativeConfig?buildConfigFromNative(name,nativeConfig,opts?.repo):buildFallbackConfig(name,opts?.repo);return insertTeamRow(config,nativeConfig?"native-config":"cwd-fallback")}function deriveBareLeaderName(leadAgentId){if(!leadAgentId)return null;let at=leadAgentId.indexOf("@");return at===-1?leadAgentId:leadAgentId.slice(0,at)}async function hireAgent(teamName,agentName){let config=await getTeam(teamName);if(!config)throw Error(`Team "${teamName}" not found.`);let added;if(agentName==="council"){let councilNames=BUILTIN_COUNCIL_MEMBERS.map((m)=>m.name),addedTargets=(await Promise.all(councilNames.map((name)=>resolveTeamMemberId(teamName,name)))).filter((target)=>!config.members.includes(target.id));config.members.push(...addedTargets.map((target)=>target.id)),added=addedTargets.map((target)=>target.name)}else{let target=await resolveTeamMemberId(teamName,agentName);if(config.members.includes(target.id))return[];config.members.push(target.id),added=[agentName]}let sql=await getConnection();return await sql`
|
|
453
453
|
UPDATE teams SET members = ${sql.json(config.members)}
|
|
454
454
|
WHERE name = ${teamName}
|
|
455
|
-
`,added}async function fireAgent(teamName,agentName){let config=await getTeam(teamName);if(!config)throw Error(`Team "${teamName}" not found.`);let idx=config.members.indexOf(agentName);if(idx===-1)return!1;config.members.splice(idx,1);let sql=await getConnection();await sql`
|
|
455
|
+
`,added}async function resolveTeamMemberId(teamName,agentName){if(isValidTeamMemberId(agentName))return{name:agentName,id:agentName};let resolved=await resolveAgentId(agentName,teamName);if(resolved)return{name:agentName,id:resolved};let identity=await findOrCreateAgent(agentName,teamName,agentName);return{name:agentName,id:identity.id}}async function fireAgent(teamName,agentName){let config=await getTeam(teamName);if(!config)throw Error(`Team "${teamName}" not found.`);let resolved=isValidTeamMemberId(agentName)?agentName:await resolveAgentId(agentName,teamName),idx=resolved?config.members.indexOf(resolved):-1;if(idx===-1)idx=config.members.indexOf(agentName);if(idx===-1)return!1;config.members.splice(idx,1);let sql=await getConnection();await sql`
|
|
456
456
|
UPDATE teams SET members = ${sql.json(config.members)}
|
|
457
457
|
WHERE name = ${teamName}
|
|
458
458
|
`;try{await killWorkersByName(agentName)}catch{}return!0}async function cleanupTeamGitArtifacts(config){if(config.worktreePath)try{await $`git -C ${config.repo} worktree remove --force ${config.worktreePath}`.quiet()}catch{try{await $`rm -rf ${config.worktreePath}`.quiet()}catch{}}try{let branchTip=(await $`git -C ${config.repo} rev-parse ${config.name}`.quiet()).text().trim(),baseTip="";try{baseTip=(await $`git -C ${config.repo} rev-parse origin/${config.baseBranch}`.quiet()).text().trim()}catch{try{baseTip=(await $`git -C ${config.repo} rev-parse ${config.baseBranch}`.quiet()).text().trim()}catch{return}}if(branchTip&&baseTip&&branchTip===baseTip)await $`git -C ${config.repo} branch -D ${config.name}`.quiet()}catch{}}async function cleanupTeamTmuxSession(tmuxSessionName,teamName){if(!tmuxSessionName)return;try{if(!await findSessionByName(tmuxSessionName))return;let windows=await listWindows(tmuxSessionName),teamWindow=await findWindowByName(tmuxSessionName,teamName);if(tmuxSessionName===teamName||windows.length===1&&windows[0]?.name===teamName)await killSession(tmuxSessionName);else if(teamWindow)await executeTmux2(`kill-window -t '${teamWindow.id}'`)}catch{}}async function archiveTeam(teamName){let config=await getTeam(teamName);if(!config)return!1;let killResults=await Promise.allSettled(config.members.map((member)=>killWorkersByName(member,teamName)));for(let i2=0;i2<killResults.length;i2++)if(killResults[i2].status==="rejected")console.error(` Failed to kill member "${config.members[i2]}": ${killResults[i2].reason}`);await cleanupTeamTmuxSession(config.tmuxSessionName??teamName,teamName),await cleanupTeamGitArtifacts(config);let sql=await getConnection(),archivedAgents=0,updated=!1;if(await sql.begin(async(tx)=>{if((await tx`
|
|
@@ -476,13 +476,13 @@ ${bin} set-option -w pane-active-border-style "fg=$COLOR"
|
|
|
476
476
|
`).count>0,disbanded)await tx`
|
|
477
477
|
UPDATE agents SET state = 'archived', updated_at = now()
|
|
478
478
|
WHERE team = ${teamName} AND state IS DISTINCT FROM 'archived'
|
|
479
|
-
`}),!disbanded)return!1;return recordAuditEvent("team",teamName,"disbanded",getActor(),{repo:config.repo}).catch(()=>{}),await pruneStaleWorktrees(config.repo),!0}async function pruneStaleWorktrees(_repoPath){let sql=await getConnection(),rows=await sql`SELECT name, worktree_path FROM teams`;for(let row of rows)if(row.worktree_path&&!existsSync8(row.worktree_path)){try{await deleteNativeTeam(row.name)}catch{}await sql`DELETE FROM teams WHERE name = ${row.name}`}}function sanitizeLeaderForWrite(teamName,leader){if(leader==null||leader==="")return null;if(LEADER_ID_RE.test(leader)||leader.startsWith("dir:"))return leader;return recordAuditEvent("team",teamName,"leader_sanitized",getActor(),{dropped:leader,reason:"fk_teams_leader_check"}).catch(()=>{}),null}async function updateTeamConfig(name,config){let sql=await getConnection(),safeLeader=sanitizeLeaderForWrite(name,config.leader);await sql`
|
|
479
|
+
`}),!disbanded)return!1;return recordAuditEvent("team",teamName,"disbanded",getActor(),{repo:config.repo}).catch(()=>{}),await pruneStaleWorktrees(config.repo),!0}async function pruneStaleWorktrees(_repoPath){let sql=await getConnection(),rows=await sql`SELECT name, worktree_path FROM teams`;for(let row of rows)if(row.worktree_path&&!existsSync8(row.worktree_path)){try{await deleteNativeTeam(row.name)}catch{}await sql`DELETE FROM teams WHERE name = ${row.name}`}}function sanitizeLeaderForWrite(teamName,leader){if(leader==null||leader==="")return null;if(LEADER_ID_RE.test(leader)||leader.startsWith("dir:"))return leader;return recordAuditEvent("team",teamName,"leader_sanitized",getActor(),{dropped:leader,reason:"fk_teams_leader_check"}).catch(()=>{}),null}async function updateTeamConfig(name,config){let sql=await getConnection(),safeLeader=sanitizeLeaderForWrite(name,config.leader),safeMembers=sanitizeMembersForWrite(name,config.members);await sql`
|
|
480
480
|
UPDATE teams SET
|
|
481
481
|
repo = ${config.repo},
|
|
482
482
|
base_branch = ${config.baseBranch},
|
|
483
483
|
worktree_path = ${config.worktreePath},
|
|
484
484
|
leader = ${safeLeader},
|
|
485
|
-
members = ${sql.json(
|
|
485
|
+
members = ${sql.json(safeMembers)},
|
|
486
486
|
status = ${config.status},
|
|
487
487
|
native_team_parent_session_id = ${config.nativeTeamParentSessionId??null},
|
|
488
488
|
native_teams_enabled = ${config.nativeTeamsEnabled??!1},
|
|
@@ -492,10 +492,10 @@ ${bin} set-option -w pane-active-border-style "fg=$COLOR"
|
|
|
492
492
|
parent_team = ${config.parentTeam??null},
|
|
493
493
|
allow_child_reachback = ${config.allowChildReachback?sql.json(config.allowChildReachback):null}
|
|
494
494
|
WHERE name = ${name}
|
|
495
|
-
`}async function getTeam(name){try{let rows=await(await getConnection())`SELECT * FROM teams WHERE name = ${name}`;if(rows.length===0)return null;return rowToTeamConfig(rows[0])}catch{return null}}async function listTeams(includeArchived=!1){try{let sql=await getConnection();if(includeArchived)return(await sql`SELECT * FROM teams ORDER BY created_at DESC`).map(rowToTeamConfig);return(await sql`SELECT * FROM teams WHERE status != 'archived' ORDER BY created_at DESC`).map(rowToTeamConfig)}catch{return[]}}async function listMembers(teamName){let config=await getTeam(teamName);if(!config)return null;return config.members}async function killTeamMembers(teamName){let config=await getTeam(teamName);if(!config)return;for(let member of config.members)try{await killWorkersByName(member,teamName)}catch{}}async function resolveLeaderName(teamName){try{let config=await getTeam(teamName);if(config?.leader&&config.leader!=="team-lead")return config.leader}catch{}return
|
|
495
|
+
`}async function getTeam(name){try{let rows=await(await getConnection())`SELECT * FROM teams WHERE name = ${name}`;if(rows.length===0)return null;return rowToTeamConfig(rows[0])}catch{return null}}async function listTeams(includeArchived=!1){try{let sql=await getConnection();if(includeArchived)return(await sql`SELECT * FROM teams ORDER BY created_at DESC`).map(rowToTeamConfig);return(await sql`SELECT * FROM teams WHERE status != 'archived' ORDER BY created_at DESC`).map(rowToTeamConfig)}catch{return[]}}async function listMembers(teamName){let config=await getTeam(teamName);if(!config)return null;return config.members}async function killTeamMembers(teamName){let config=await getTeam(teamName);if(!config)return;for(let member of config.members)try{await killWorkersByName(member,teamName)}catch{}}async function resolveLeaderName(teamName){try{let config=await getTeam(teamName);if(config?.leader&&config.leader!=="team-lead")return config.leader}catch{}return null}async function setTeamStatus(teamName,status){if(status==="done"||status==="archived"){let config=await getTeam(teamName);if(config)await Promise.allSettled(config.members.map((member)=>killWorkersByName(member,teamName))),await cleanupTeamTmuxSession(config.tmuxSessionName??teamName,teamName),await cleanupTeamGitArtifacts(config)}if((await(await getConnection())`
|
|
496
496
|
UPDATE teams SET status = ${status}
|
|
497
497
|
WHERE name = ${teamName}
|
|
498
|
-
`).count===0)throw Error(`Team "${teamName}" not found.`)}var LEADER_ID_RE;var init_team_manager=__esm(()=>{init_agent_registry();init_audit();init_builtin_agents();init_claude_native_teams();init_db();init_executor_registry();init_genie_config2();init_tmux();LEADER_ID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i});var exports_claude_native_teams={};__export(exports_claude_native_teams,{writeNativeInbox:()=>writeNativeInbox,unregisterNativeMember:()=>unregisterNativeMember,sanitizeTeamName:()=>sanitizeTeamName,resolveNativeMemberName:()=>resolveNativeMemberName,registerNativeMember:()=>registerNativeMember,registerAsTeamLead:()=>registerAsTeamLead,loadNativeTeamConfig:()=>loadNativeTeamConfig,loadConfig:()=>loadConfig,loadAllNativeTeamConfigs:()=>loadAllNativeTeamConfigs,listTeamsWithUnreadInbox:()=>listTeamsWithUnreadInbox,listTeams:()=>listTeams2,isInsideClaudeCode:()=>isInsideClaudeCode,findTeamsContainingAgent:()=>findTeamsContainingAgent,ensureNativeTeamWithSessionId:()=>ensureNativeTeamWithSessionId,ensureNativeTeam:()=>ensureNativeTeam,discoverTeamName:()=>discoverTeamName,discoverClaudeParentSessionId:()=>discoverClaudeParentSessionId,deleteNativeTeam:()=>deleteNativeTeam,clearNativeInbox:()=>clearNativeInbox,assignColor:()=>assignColor});import{existsSync as existsSync9}from"fs";import{mkdir as mkdir3,open as open2,readFile as readFile3,readdir as readdir2,rm,stat as stat2,writeFile as writeFile3}from"fs/promises";import{homedir as homedir8}from"os";import{join as join12}from"path";function claudeConfigDir2(){return process.env.CLAUDE_CONFIG_DIR??join12(homedir8(),".claude")}function teamsBaseDir(){return join12(claudeConfigDir2(),"teams")}function sanitizeTeamName(name){return name.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase()}async function listTeams2(){try{return(await readdir2(teamsBaseDir())).filter((e)=>!e.startsWith("."))}catch{return[]}}function teamDir(teamName){return join12(teamsBaseDir(),sanitizeTeamName(teamName))}function configPath(teamName){return join12(teamDir(teamName),"config.json")}function inboxesDir(teamName){return join12(teamDir(teamName),"inboxes")}function inboxPath(teamName,agentName){return join12(inboxesDir(teamName),`${sanitizeTeamName(agentName)}.json`)}async function loadConfig(teamName){try{let content=await readFile3(configPath(teamName),"utf-8");return JSON.parse(content)}catch(err){if(err instanceof Error&&"code"in err&&err.code==="ENOENT")return null;let message=err instanceof Error?err.message:String(err);return console.warn(`[claude-native-teams] Failed to load config for "${teamName}": ${message}`),null}}async function loadNativeTeamConfig(teamName){return loadConfig(teamName)}async function loadAllNativeTeamConfigs(){let teamNames=await listTeams2(),configs=[];for(let name of teamNames){let cfg=await loadConfig(name);if(cfg)configs.push(cfg)}return configs}async function findTeamsContainingAgent(agentName){let teams=await listTeams2(),matches=[];for(let teamName of teams){let config=await loadConfig(teamName);if(!config)continue;if(config.members.some((m)=>m.name===agentName||m.agentType===agentName))matches.push(teamName)}return matches}async function saveConfig(teamName,config){await writeFile3(configPath(teamName),JSON.stringify(config,null,2))}async function countLeadSessionRefs(){let counts=new Map,teams=await listTeams2();for(let team of teams){let leadSessionId=(await loadConfig(team))?.leadSessionId;if(!leadSessionId)continue;counts.set(leadSessionId,(counts.get(leadSessionId)??0)+1)}return counts}async function ensureNativeTeam(teamName,description,leadSessionId,leaderName){let dir=teamDir(teamName),inboxDir=inboxesDir(teamName);await mkdir3(dir,{recursive:!0}),await mkdir3(inboxDir,{recursive:!0}),ensureClaudeSettingsSafe();let existing=await loadConfig(teamName);if(existing)return await backfillTeamRow(sanitizeTeamName(teamName),existing),existing;let sanitized=sanitizeTeamName(teamName),resolvedLeader=sanitizeTeamName(leaderName??teamName),config={name:sanitized,description,createdAt:Date.now(),leadAgentId:`${resolvedLeader}@${sanitized}`,leadSessionId,members:[]};return await saveConfig(teamName,config),await backfillTeamRow(sanitized,config),config}async function backfillTeamRow(name,nativeConfig){try{let{ensureTeamRow:ensureTeamRow2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));await ensureTeamRow2(name,{nativeConfig})}catch{}}function isHealthyLeadSessionId(id){if(typeof id!=="string"||id.length===0)return!1;return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)}async function ensureNativeTeamWithSessionId(teamName,description,sessionId,leaderName){let config=await ensureNativeTeam(teamName,description,sessionId,leaderName);if(config.leadSessionId===sessionId)return config;if(isHealthyLeadSessionId(config.leadSessionId))return config;return config.leadSessionId=sessionId,await saveConfig(teamName,config),config}async function registerNativeMember(teamName,member){let config=await loadConfig(teamName);if(!config)throw Error(`Native team "${teamName}" not found`);let sanitized=sanitizeTeamName(teamName),agentId=`${sanitizeTeamName(member.agentName)}@${sanitized}`;config.members=config.members.filter((m)=>m.agentId!==agentId),config.members.push({agentId,name:sanitizeTeamName(member.agentName),agentType:member.agentType??"general-purpose",joinedAt:Date.now(),tmuxPaneId:member.tmuxPaneId,cwd:member.cwd??process.cwd(),backendType:"tmux",color:member.color,planModeRequired:member.planModeRequired??!1,isActive:!0}),await saveConfig(teamName,config);let inbox=inboxPath(teamName,member.agentName);if(!existsSync9(inbox))await writeFile3(inbox,"[]")}async function unregisterNativeMember(teamName,agentName){let config=await loadConfig(teamName);if(!config)return;let sanitized=sanitizeTeamName(teamName),agentId=`${sanitizeTeamName(agentName)}@${sanitized}`,before=config.members.length;if(config.members=config.members.filter((m)=>m.agentId!==agentId),config.members.length===before)return;await saveConfig(teamName,config)}async function writeNativeInbox(teamName,agentName,message){let path2=inboxPath(teamName,agentName);await mkdir3(inboxesDir(teamName),{recursive:!0}),await acquireLock(path2);try{let messages=[];try{let content=await readFile3(path2,"utf-8");messages=JSON.parse(content)}catch{}messages.push(message),await writeFile3(path2,JSON.stringify(messages,null,2))}finally{await releaseLock(path2)}}async function resolveNativeMemberName(teamName,genieWorkerId){let config=await loadConfig(teamName);if(!config||config.members.length===0)return null;let sanitizedId=sanitizeTeamName(genieWorkerId),sanitizedTeam=sanitizeTeamName(teamName),exactMatch=config.members.find((m)=>m.name===sanitizedId&&m.isActive);if(exactMatch)return exactMatch.name;let agentIdMatch=config.members.find((m)=>m.agentId===`${sanitizedId}@${sanitizedTeam}`&&m.isActive);if(agentIdMatch)return agentIdMatch.name;let teamPrefix=`${sanitizedTeam}-`;if(sanitizedId.startsWith(teamPrefix)){let stripped=sanitizedId.slice(teamPrefix.length),prefixMatch=config.members.find((m)=>m.name===stripped&&m.isActive);if(prefixMatch)return prefixMatch.name}let inactiveMatch=config.members.find((m)=>m.name===sanitizedId);if(inactiveMatch)return inactiveMatch.name;return null}async function assignColor(teamName){let config=await loadConfig(teamName);if(!config)return CLAUDE_TEAM_COLORS[0];let usedColors=new Set(config.members.map((m)=>m.color));for(let color of CLAUDE_TEAM_COLORS)if(!usedColors.has(color))return color;return CLAUDE_TEAM_COLORS[config.members.length%CLAUDE_TEAM_COLORS.length]}async function clearNativeInbox(teamName,agentName){let path2=inboxPath(teamName,agentName);await acquireLock(path2);try{await writeFile3(path2,"[]")}finally{await releaseLock(path2)}}async function deleteNativeTeam(teamName){let dir=teamDir(teamName);if(!existsSync9(dir))return!1;return await rm(dir,{recursive:!0,force:!0}),!0}function extractLeaderInboxName(config,teamName){if(!config?.leadAgentId)return teamName??"unknown";let atIdx=config.leadAgentId.indexOf("@");return atIdx>0?config.leadAgentId.slice(0,atIdx):teamName??"unknown"}function resolveLeadWorkingDir(config,leaderInboxName){let leadMember=config.members.find((m)=>m.agentId===config.leadAgentId||m.name===leaderInboxName);if(leadMember?.cwd)return leadMember.cwd;if(config.worktreePath)return config.worktreePath;if(config.repo)return config.repo;return config.members.find((m)=>m.cwd)?.cwd??null}async function scanTeamInbox(base,name){let config=null;try{let cfgContent=await readFile3(join12(base,name,"config.json"),"utf-8");config=JSON.parse(cfgContent)}catch{}let leaderInboxName=extractLeaderInboxName(config,name),inboxFile=join12(base,name,"inboxes",`${leaderInboxName}.json`),messages;try{let content=await readFile3(inboxFile,"utf-8");messages=JSON.parse(content)}catch{return null}if(!Array.isArray(messages))return null;let unread=messages.filter((m)=>m.read===!1);if(unread.length===0)return null;let workingDir=config?resolveLeadWorkingDir(config,leaderInboxName):null;return{teamName:name,unreadCount:unread.length,workingDir,firstUnreadText:unread[0]?.text??null}}async function listTeamsWithUnreadInbox(){let base=teamsBaseDir(),teamDirs;try{teamDirs=await readdir2(base)}catch{return[]}let results=[];for(let name of teamDirs){let entry=await scanTeamInbox(base,name);if(entry)results.push(entry)}return results}function sanitizePath(p){return p.replace(/[^a-zA-Z0-9]/g,"-")}async function discoverClaudeSessionId(cwd){let envSessionId=process.env.CLAUDE_CODE_SESSION_ID;if(envSessionId)return envSessionId;let projectDir=join12(claudeConfigDir2(),"projects",sanitizePath(cwd??process.cwd()));try{let jsonls=(await readdir2(projectDir)).filter((e)=>e.endsWith(".jsonl"));if(jsonls.length===0)return null;let newest=null;for(let name of jsonls){let s=await stat2(join12(projectDir,name));if(!newest||s.mtimeMs>newest.mtime)newest={name,mtime:s.mtimeMs}}if(!newest)return null;return newest.name.replace(".jsonl","")}catch{return null}}async function readSessionMetadata(filePath){let handle=null;try{handle=await open2(filePath,"r");let buffer=Buffer.alloc(8192),{bytesRead}=await handle.read(buffer,0,buffer.length,0),head=buffer.toString("utf-8",0,bytesRead);for(let line of head.split(`
|
|
498
|
+
`).count===0)throw Error(`Team "${teamName}" not found.`)}var AGENT_ID_RE,LEADER_ID_RE;var init_team_manager=__esm(()=>{init_agent_registry();init_audit();init_builtin_agents();init_claude_native_teams();init_db();init_executor_registry();init_genie_config2();init_tmux();AGENT_ID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;LEADER_ID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i});var exports_claude_native_teams={};__export(exports_claude_native_teams,{writeNativeInbox:()=>writeNativeInbox,unregisterNativeMember:()=>unregisterNativeMember,sanitizeTeamName:()=>sanitizeTeamName,resolveNativeMemberName:()=>resolveNativeMemberName,registerNativeMember:()=>registerNativeMember,registerAsTeamLead:()=>registerAsTeamLead,loadNativeTeamConfig:()=>loadNativeTeamConfig,loadConfig:()=>loadConfig,loadAllNativeTeamConfigs:()=>loadAllNativeTeamConfigs,listTeamsWithUnreadInbox:()=>listTeamsWithUnreadInbox,listTeams:()=>listTeams2,isInsideClaudeCode:()=>isInsideClaudeCode,findTeamsContainingAgent:()=>findTeamsContainingAgent,ensureNativeTeamWithSessionId:()=>ensureNativeTeamWithSessionId,ensureNativeTeam:()=>ensureNativeTeam,discoverTeamName:()=>discoverTeamName,discoverClaudeParentSessionId:()=>discoverClaudeParentSessionId,deleteNativeTeam:()=>deleteNativeTeam,clearNativeInbox:()=>clearNativeInbox,assignColor:()=>assignColor});import{existsSync as existsSync9}from"fs";import{mkdir as mkdir3,open as open2,readFile as readFile3,readdir as readdir2,rm,stat as stat2,writeFile as writeFile3}from"fs/promises";import{homedir as homedir8}from"os";import{join as join12}from"path";function claudeConfigDir2(){return process.env.CLAUDE_CONFIG_DIR??join12(homedir8(),".claude")}function teamsBaseDir(){return join12(claudeConfigDir2(),"teams")}function sanitizeTeamName(name){return name.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase()}async function listTeams2(){try{return(await readdir2(teamsBaseDir())).filter((e)=>!e.startsWith("."))}catch{return[]}}function teamDir(teamName){return join12(teamsBaseDir(),sanitizeTeamName(teamName))}function configPath(teamName){return join12(teamDir(teamName),"config.json")}function inboxesDir(teamName){return join12(teamDir(teamName),"inboxes")}function inboxPath(teamName,agentName){return join12(inboxesDir(teamName),`${sanitizeTeamName(agentName)}.json`)}async function loadConfig(teamName){try{let content=await readFile3(configPath(teamName),"utf-8");return JSON.parse(content)}catch(err){if(err instanceof Error&&"code"in err&&err.code==="ENOENT")return null;let message=err instanceof Error?err.message:String(err);return console.warn(`[claude-native-teams] Failed to load config for "${teamName}": ${message}`),null}}async function loadNativeTeamConfig(teamName){return loadConfig(teamName)}async function loadAllNativeTeamConfigs(){let teamNames=await listTeams2(),configs=[];for(let name of teamNames){let cfg=await loadConfig(name);if(cfg)configs.push(cfg)}return configs}async function findTeamsContainingAgent(agentName){let teams=await listTeams2(),matches=[];for(let teamName of teams){let config=await loadConfig(teamName);if(!config)continue;if(config.members.some((m)=>m.name===agentName||m.agentType===agentName))matches.push(teamName)}return matches}async function saveConfig(teamName,config){await writeFile3(configPath(teamName),JSON.stringify(config,null,2))}async function countLeadSessionRefs(){let counts=new Map,teams=await listTeams2();for(let team of teams){let leadSessionId=(await loadConfig(team))?.leadSessionId;if(!leadSessionId)continue;counts.set(leadSessionId,(counts.get(leadSessionId)??0)+1)}return counts}async function ensureNativeTeam(teamName,description,leadSessionId,leaderName){let dir=teamDir(teamName),inboxDir=inboxesDir(teamName);await mkdir3(dir,{recursive:!0}),await mkdir3(inboxDir,{recursive:!0}),ensureClaudeSettingsSafe();let existing=await loadConfig(teamName);if(existing)return await backfillTeamRow(sanitizeTeamName(teamName),existing),existing;let sanitized=sanitizeTeamName(teamName),resolvedLeader=sanitizeTeamName(leaderName??teamName),config={name:sanitized,description,createdAt:Date.now(),leadAgentId:`${resolvedLeader}@${sanitized}`,leadSessionId,members:[]};return await saveConfig(teamName,config),await backfillTeamRow(sanitized,config),config}async function backfillTeamRow(name,nativeConfig){try{let{ensureTeamRow:ensureTeamRow2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));await ensureTeamRow2(name,{nativeConfig})}catch{}}function isHealthyLeadSessionId(id){if(typeof id!=="string"||id.length===0)return!1;return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)}async function ensureNativeTeamWithSessionId(teamName,description,sessionId,leaderName){let config=await ensureNativeTeam(teamName,description,sessionId,leaderName);if(config.leadSessionId===sessionId)return config;if(isHealthyLeadSessionId(config.leadSessionId))return config;return config.leadSessionId=sessionId,await saveConfig(teamName,config),config}async function registerNativeMember(teamName,member){let config=await loadConfig(teamName);if(!config)throw Error(`Native team "${teamName}" not found`);let sanitized=sanitizeTeamName(teamName),agentId=`${sanitizeTeamName(member.agentName)}@${sanitized}`;config.members=config.members.filter((m)=>m.agentId!==agentId),config.members.push({agentId,name:sanitizeTeamName(member.agentName),agentType:member.agentType??"general-purpose",joinedAt:Date.now(),tmuxPaneId:member.tmuxPaneId,cwd:member.cwd??process.cwd(),backendType:"tmux",color:member.color,planModeRequired:member.planModeRequired??!1,isActive:!0}),await saveConfig(teamName,config);let inbox=inboxPath(teamName,member.agentName);if(!existsSync9(inbox))await writeFile3(inbox,"[]")}async function unregisterNativeMember(teamName,agentName){let config=await loadConfig(teamName);if(!config)return;let sanitized=sanitizeTeamName(teamName),agentId=`${sanitizeTeamName(agentName)}@${sanitized}`,before=config.members.length;if(config.members=config.members.filter((m)=>m.agentId!==agentId),config.members.length===before)return;await saveConfig(teamName,config)}async function writeNativeInbox(teamName,agentName,message){let path2=inboxPath(teamName,agentName);await mkdir3(inboxesDir(teamName),{recursive:!0}),await acquireLock(path2);try{let messages=[];try{let content=await readFile3(path2,"utf-8");messages=JSON.parse(content)}catch{}messages.push(message),await writeFile3(path2,JSON.stringify(messages,null,2))}finally{await releaseLock(path2)}}async function resolveNativeMemberName(teamName,genieWorkerId){let config=await loadConfig(teamName);if(!config||config.members.length===0)return null;let sanitizedId=sanitizeTeamName(genieWorkerId),sanitizedTeam=sanitizeTeamName(teamName),exactMatch=config.members.find((m)=>m.name===sanitizedId&&m.isActive);if(exactMatch)return exactMatch.name;let agentIdMatch=config.members.find((m)=>m.agentId===`${sanitizedId}@${sanitizedTeam}`&&m.isActive);if(agentIdMatch)return agentIdMatch.name;let teamPrefix=`${sanitizedTeam}-`;if(sanitizedId.startsWith(teamPrefix)){let stripped=sanitizedId.slice(teamPrefix.length),prefixMatch=config.members.find((m)=>m.name===stripped&&m.isActive);if(prefixMatch)return prefixMatch.name}let inactiveMatch=config.members.find((m)=>m.name===sanitizedId);if(inactiveMatch)return inactiveMatch.name;return null}async function assignColor(teamName){let config=await loadConfig(teamName);if(!config)return CLAUDE_TEAM_COLORS[0];let usedColors=new Set(config.members.map((m)=>m.color));for(let color of CLAUDE_TEAM_COLORS)if(!usedColors.has(color))return color;return CLAUDE_TEAM_COLORS[config.members.length%CLAUDE_TEAM_COLORS.length]}async function clearNativeInbox(teamName,agentName){let path2=inboxPath(teamName,agentName);await acquireLock(path2);try{await writeFile3(path2,"[]")}finally{await releaseLock(path2)}}async function deleteNativeTeam(teamName){let dir=teamDir(teamName);if(!existsSync9(dir))return!1;return await rm(dir,{recursive:!0,force:!0}),!0}function extractLeaderInboxName(config,teamName){if(!config?.leadAgentId)return teamName??"unknown";let atIdx=config.leadAgentId.indexOf("@");return atIdx>0?config.leadAgentId.slice(0,atIdx):teamName??"unknown"}function resolveLeadWorkingDir(config,leaderInboxName){let leadMember=config.members.find((m)=>m.agentId===config.leadAgentId||m.name===leaderInboxName);if(leadMember?.cwd)return leadMember.cwd;if(config.worktreePath)return config.worktreePath;if(config.repo)return config.repo;return config.members.find((m)=>m.cwd)?.cwd??null}async function scanTeamInbox(base,name){let config=null;try{let cfgContent=await readFile3(join12(base,name,"config.json"),"utf-8");config=JSON.parse(cfgContent)}catch{}let leaderInboxName=extractLeaderInboxName(config,name),inboxFile=join12(base,name,"inboxes",`${leaderInboxName}.json`),messages;try{let content=await readFile3(inboxFile,"utf-8");messages=JSON.parse(content)}catch{return null}if(!Array.isArray(messages))return null;let unread=messages.filter((m)=>m.read===!1);if(unread.length===0)return null;let workingDir=config?resolveLeadWorkingDir(config,leaderInboxName):null;return{teamName:name,unreadCount:unread.length,workingDir,firstUnreadText:unread[0]?.text??null}}async function listTeamsWithUnreadInbox(){let base=teamsBaseDir(),teamDirs;try{teamDirs=await readdir2(base)}catch{return[]}let results=[];for(let name of teamDirs){let entry=await scanTeamInbox(base,name);if(entry)results.push(entry)}return results}function sanitizePath(p){return p.replace(/[^a-zA-Z0-9]/g,"-")}async function discoverClaudeSessionId(cwd){let envSessionId=process.env.CLAUDE_CODE_SESSION_ID;if(envSessionId)return envSessionId;let projectDir=join12(claudeConfigDir2(),"projects",sanitizePath(cwd??process.cwd()));try{let jsonls=(await readdir2(projectDir)).filter((e)=>e.endsWith(".jsonl"));if(jsonls.length===0)return null;let newest=null;for(let name of jsonls){let s=await stat2(join12(projectDir,name));if(!newest||s.mtimeMs>newest.mtime)newest={name,mtime:s.mtimeMs}}if(!newest)return null;return newest.name.replace(".jsonl","")}catch{return null}}async function readSessionMetadata(filePath){let handle=null;try{handle=await open2(filePath,"r");let buffer=Buffer.alloc(8192),{bytesRead}=await handle.read(buffer,0,buffer.length,0),head=buffer.toString("utf-8",0,bytesRead);for(let line of head.split(`
|
|
499
499
|
`).slice(0,20)){let trimmed=line.trim();if(!trimmed)continue;try{let entry=JSON.parse(trimmed),teamName=typeof entry.teamName==="string"?entry.teamName:void 0,agentName=typeof entry.agentName==="string"?entry.agentName:void 0;if(teamName||agentName)return{teamName,agentName}}catch{}}}catch{return{}}finally{await handle?.close().catch(()=>{})}return{}}function rootScore(metadata){if(!metadata.teamName&&!metadata.agentName)return 2;if(metadata.teamName&&!metadata.agentName)return 1;return 0}function compareSessionRanking(a,b,leadRefs){let aLeadRefs=leadRefs.get(a.name.replace(".jsonl",""))??0,bLeadRefs=leadRefs.get(b.name.replace(".jsonl",""))??0;if(aLeadRefs!==bLeadRefs)return bLeadRefs-aLeadRefs;let aRoot=rootScore(a.metadata),bRoot=rootScore(b.metadata);if(aRoot!==bRoot)return bRoot-aRoot;return b.mtime-a.mtime}async function discoverClaudeParentSessionId(cwd){let envSessionId=process.env.CLAUDE_CODE_SESSION_ID;if(envSessionId)return envSessionId;let projectDir=join12(claudeConfigDir2(),"projects",sanitizePath(cwd??process.cwd()));try{let jsonls=(await readdir2(projectDir)).filter((e)=>e.endsWith(".jsonl"));if(jsonls.length===0)return null;let ranked=await Promise.all(jsonls.map(async(name)=>{let filePath=join12(projectDir,name),s=await stat2(filePath),metadata=await readSessionMetadata(filePath);return{name,mtime:s.mtimeMs,metadata}})),leadRefs=await countLeadSessionRefs();return ranked.sort((a,b)=>compareSessionRanking(a,b,leadRefs)),ranked[0]?.name.replace(".jsonl","")??null}catch{return null}}function isInsideClaudeCode(){return process.env.CLAUDECODE==="1"}async function discoverTeamName(cwd){let envTeam=process.env.GENIE_TEAM;if(envTeam)return envTeam;let base=teamsBaseDir(),sessionId=await discoverClaudeSessionId(cwd);if(sessionId)try{let teams=await readdir2(base);for(let name of teams){let cfgPath=join12(base,name,"config.json");try{let content=await readFile3(cfgPath,"utf-8"),config=JSON.parse(content);if(config.leadSessionId===sessionId)return config.name}catch{}}}catch{}let tmuxSessionName=await currentTmuxSessionName();if(tmuxSessionName){let cfgPath=join12(base,tmuxSessionName,"config.json");try{let content=await readFile3(cfgPath,"utf-8");return JSON.parse(content).name}catch{}}return null}async function currentTmuxSessionName(){if(!process.env.TMUX)return null;try{let{getCurrentSessionName:getCurrentSessionName2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux));return await getCurrentSessionName2()}catch{return null}}async function registerAsTeamLead(teamName,opts){let sessionId=await discoverClaudeSessionId(opts?.cwd);if(!sessionId)throw Error("Could not discover Claude Code session ID. Are you running inside Claude Code with CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1?");let resolvedLeaderName=opts?.leaderName??teamName,config=await ensureNativeTeam(teamName,`Genie team: ${teamName}`,sessionId,resolvedLeaderName);if(config.leadSessionId!==sessionId)config.leadSessionId=sessionId,await saveConfig(teamName,config);let sanitized=sanitizeTeamName(teamName),leadAgentId=`${sanitizeTeamName(resolvedLeaderName)}@${sanitized}`,existingLead=config.members.find((m)=>m.agentId===leadAgentId),resolvedPaneId=opts?.tmuxPaneId??process.env.TMUX_PANE;if(!existingLead||!existingLead.isActive)await registerNativeMember(teamName,{agentName:resolvedLeaderName,agentType:"general-purpose",color:opts?.color??"blue",tmuxPaneId:resolvedPaneId,cwd:opts?.cwd??process.cwd()});else if(resolvedPaneId&&existingLead.tmuxPaneId!==resolvedPaneId)existingLead.tmuxPaneId=resolvedPaneId,await saveConfig(teamName,config);let inbox=inboxPath(teamName,resolvedLeaderName);if(!existsSync9(inbox))await writeFile3(inbox,"[]");let finalConfig=await loadConfig(teamName);if(!finalConfig)throw Error(`Failed to load config for team "${teamName}" after creation`);return{sessionId,config:finalConfig}}var init_claude_native_teams=__esm(()=>{init_claude_settings();init_lockfile();init_provider_adapters()});import{existsSync as existsSync10,readFileSync as readFileSync5,statSync}from"fs";import{mkdir as mkdir4,readFile as readFile4,readdir as readdir3,rename,writeFile as writeFile4}from"fs/promises";import{homedir as homedir9}from"os";import{join as join13}from"path";function getGenieHome(){return process.env.GENIE_HOME??join13(homedir9(),".genie")}function workersJsonPath(){return join13(getGenieHome(),"workers.json")}function claudeTeamsDirPath(){return join13(process.env.CLAUDE_CONFIG_DIR??join13(homedir9(),".claude"),"teams")}function teamsSeedMarkerPath(){return join13(getGenieHome(),"state","teams-seed-marker")}function teamsDirMtime(claudeTeamsDir){try{return String(statSync(claudeTeamsDir).mtimeMs)}catch{return null}}function readFreshTeamsSeedMarker(claudeTeamsDir){let mtimeMs=teamsDirMtime(claudeTeamsDir);if(!mtimeMs)return null;try{let marker=JSON.parse(readFileSync5(teamsSeedMarkerPath(),"utf-8"));if(marker.teamsDir!==claudeTeamsDir||marker.mtimeMs!==mtimeMs||!Array.isArray(marker.teamNames))return null;return{teamsDir:marker.teamsDir,mtimeMs:marker.mtimeMs,teamNames:marker.teamNames.filter((name)=>typeof name==="string"&&name.length>0)}}catch{return null}}function hasFreshTeamsSeedMarker(claudeTeamsDir){return readFreshTeamsSeedMarker(claudeTeamsDir)!==null}async function writeTeamsSeedMarker(teamNames){let claudeTeamsDir=claudeTeamsDirPath(),mtimeMs=teamsDirMtime(claudeTeamsDir);if(!mtimeMs)return;let markerPath=teamsSeedMarkerPath(),marker={teamsDir:claudeTeamsDir,mtimeMs,teamNames:[...new Set(teamNames)].sort()};await mkdir4(join13(getGenieHome(),"state"),{recursive:!0}),await writeFile4(markerPath,`${JSON.stringify(marker)}
|
|
500
500
|
`,"utf-8")}function needsMigration(filePath){return existsSync10(filePath)&&!existsSync10(`${filePath}.migrated`)}async function readJson(filePath){try{let content=await readFile4(filePath,"utf-8");return JSON.parse(content)}catch{return null}}async function renameMatchingFiles(dir,filter){if(!existsSync10(dir))return;try{let files=await readdir3(dir);for(let f of files){if(!filter(f))continue;let fp=join13(dir,f);if(needsMigration(fp))await rename(fp,`${fp}.migrated`)}}catch{}}function needsSeed(){if(needsMigration(workersJsonPath()))return!0;let claudeTeamsDir=claudeTeamsDirPath();if(!existsSync10(claudeTeamsDir))return!1;if(hasFreshTeamsSeedMarker(claudeTeamsDir))return!1;try{return __require("fs").readdirSync(claudeTeamsDir).some((e)=>!e.startsWith("."))}catch{return!1}}async function needsSeededTeams(sql){let marker=readFreshTeamsSeedMarker(claudeTeamsDirPath());if(!marker||marker.teamNames.length===0)return!1;try{return(await sql`
|
|
501
501
|
SELECT name FROM teams WHERE name = ANY(${marker.teamNames})
|
|
@@ -1320,7 +1320,7 @@ Run 'genie agent list' to list agents.`)}async function resolveTarget(target,opt
|
|
|
1320
1320
|
`)}var STATE_ICONS;var init_brief=__esm(()=>{init_db();init_mailbox();init_runtime_events();init_team_manager();STATE_ICONS={working:"\u25CF",idle:"\u25CB",error:"\u2718"}});import{readFile as readFile5,rename as rename2,writeFile as writeFile5}from"fs/promises";function stripDerivedFields(config){let out={...config};for(let key of DERIVED_KEYS)delete out[key];return out}async function parseAgentYaml(path3){let raw;try{raw=await readFile5(path3,"utf-8")}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`Failed to read agent.yaml at ${path3}: ${message}`)}let parsed;try{parsed=load(raw)}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`Malformed YAML in ${path3}: ${message}`)}let input=parsed===null||parsed===void 0?{}:parsed;if(typeof input!=="object"||Array.isArray(input))throw Error(`agent.yaml at ${path3} must be a YAML mapping, got ${Array.isArray(input)?"array":typeof input}`);let result2=AgentConfigSchema.safeParse(input);if(!result2.success)throw Error(`Invalid agent.yaml at ${path3}: ${formatZodError(result2.error)}`);return result2.data}function formatZodError(error2){return error2.issues.map((issue)=>{let path3=issue.path.length>0?issue.path.join("."):"(root)";if(issue.code==="unrecognized_keys"){let keys=issue.keys.join(", ");return`unknown field(s) at ${path3}: ${keys}`}return`${path3}: ${issue.message}`}).join("; ")}async function writeAgentYaml(path3,config){let stripped=stripDerivedFields(config),yamlStr=dump(stripped,{lineWidth:-1,noRefs:!0,sortKeys:!1,quotingType:'"'});await acquireLock(path3);try{let tmpPath=`${path3}.tmp`;await writeFile5(tmpPath,yamlStr,"utf-8"),await rename2(tmpPath,path3)}finally{await releaseLock(path3)}}function extractFrontmatterFromAgentsMd(content){if(!content.startsWith(`---
|
|
1321
1321
|
`))return{frontmatter:null,body:content};let after=content.slice(4),frontmatter,afterClose;if(after.startsWith("---"))frontmatter="",afterClose=after.slice(3);else{let closeIdx=after.indexOf(`
|
|
1322
1322
|
---`);if(closeIdx===-1)return{frontmatter:null,body:content};frontmatter=after.slice(0,closeIdx),afterClose=after.slice(closeIdx+4)}let body=afterClose.startsWith(`
|
|
1323
|
-
`)?afterClose.slice(1):afterClose;return{frontmatter,body}}var SdkPermissionModeSchema,SdkEffortLevelSchema,SdkThinkingConfigSchema,SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema,SdkMcpServerConfigSchema,SdkSubagentConfigSchema,SdkCustomToolConfigSchema,SdkOutputFormatSchema,SdkPluginConfigSchema,SdkSandboxConfigSchema,SdkHookMatcherConfigSchema,SdkHookEventSchema,SdkBetaSchema,SdkSystemPromptSchema,SdkDirectoryConfigSchema,AgentConfigSchema,DERIVED_KEYS;var init_agent_yaml=__esm(()=>{init_js_yaml();init_zod();init_lockfile();SdkPermissionModeSchema=exports_external.enum(["default","acceptEdits","bypassPermissions","plan","dontAsk","auto","remoteApproval"]),SdkEffortLevelSchema=exports_external.union([exports_external.enum(["low","medium","high","max"]),exports_external.number()]),SdkThinkingConfigSchema=exports_external.union([exports_external.object({type:exports_external.literal("adaptive")}).strict(),exports_external.object({type:exports_external.literal("enabled"),budgetTokens:exports_external.number().optional()}).strict(),exports_external.object({type:exports_external.literal("disabled")}).strict()]),SdkMcpStdioServerConfigSchema=exports_external.object({type:exports_external.literal("stdio").optional(),command:exports_external.string(),args:exports_external.array(exports_external.string()).optional(),env:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpSSEServerConfigSchema=exports_external.object({type:exports_external.literal("sse"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpHttpServerConfigSchema=exports_external.object({type:exports_external.literal("http"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpServerConfigSchema=exports_external.union([SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema]),SdkSubagentConfigSchema=exports_external.object({description:exports_external.string(),prompt:exports_external.string(),tools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),model:exports_external.string().optional(),mcpServers:exports_external.array(exports_external.union([exports_external.string(),exports_external.record(SdkMcpStdioServerConfigSchema)])).optional(),skills:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),background:exports_external.boolean().optional(),memory:exports_external.enum(["user","project","local"]).optional(),effort:SdkEffortLevelSchema.optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict(),SdkCustomToolConfigSchema=exports_external.object({name:exports_external.string(),description:exports_external.string(),inputSchema:exports_external.record(exports_external.unknown()),handler:exports_external.string().optional()}).strict(),SdkOutputFormatSchema=exports_external.object({type:exports_external.literal("json_schema"),schema:exports_external.record(exports_external.unknown())}).strict(),SdkPluginConfigSchema=exports_external.object({type:exports_external.literal("local"),path:exports_external.string()}).strict(),SdkSandboxConfigSchema=exports_external.object({enabled:exports_external.boolean().optional(),autoAllowBashIfSandboxed:exports_external.boolean().optional(),failIfUnavailable:exports_external.boolean().optional(),network:exports_external.object({allowLocalBinding:exports_external.boolean().optional(),allowUnixSockets:exports_external.array(exports_external.string()).optional()}).strict().optional()}).strict(),SdkHookMatcherConfigSchema=exports_external.object({toolName:exports_external.string().optional(),agentName:exports_external.string().optional()}).strict(),SdkHookEventSchema=exports_external.enum(["PreToolUse","PostToolUse","PostToolUseFailure","Notification","UserPromptSubmit","SessionStart","SessionEnd","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact","PermissionRequest","PermissionDenied","Setup","TeammateIdle","TaskCreated","TaskCompleted","Elicitation","ElicitationResult","ConfigChange","WorktreeCreate","WorktreeRemove","InstructionsLoaded","CwdChanged","FileChanged"]),SdkBetaSchema=exports_external.enum(["context-1m-2025-08-07"]),SdkSystemPromptSchema=exports_external.union([exports_external.string(),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code"),append:exports_external.string().optional()}).strict()]),SdkDirectoryConfigSchema=exports_external.object({permissionMode:SdkPermissionModeSchema.optional(),tools:exports_external.union([exports_external.array(exports_external.string()),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code")}).strict()]).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),maxBudgetUsd:exports_external.number().optional(),effort:SdkEffortLevelSchema.optional(),thinking:SdkThinkingConfigSchema.optional(),agent:exports_external.string().optional(),agents:exports_external.record(SdkSubagentConfigSchema).optional(),mcpServers:exports_external.record(SdkMcpServerConfigSchema).optional(),plugins:exports_external.array(SdkPluginConfigSchema).optional(),customTools:exports_external.array(SdkCustomToolConfigSchema).optional(),persistSession:exports_external.boolean().optional(),enableFileCheckpointing:exports_external.boolean().optional(),outputFormat:SdkOutputFormatSchema.optional(),includePartialMessages:exports_external.boolean().optional(),includeHookEvents:exports_external.boolean().optional(),promptSuggestions:exports_external.boolean().optional(),agentProgressSummaries:exports_external.boolean().optional(),systemPrompt:SdkSystemPromptSchema.optional(),sandbox:SdkSandboxConfigSchema.optional(),betas:exports_external.array(SdkBetaSchema).optional(),settingSources:exports_external.array(exports_external.enum(["user","project","local"])).optional(),settings:exports_external.union([exports_external.string(),exports_external.record(exports_external.unknown())]).optional(),hooks:exports_external.record(SdkHookEventSchema,exports_external.array(SdkHookMatcherConfigSchema)).optional()}).strict(),AgentConfigSchema=exports_external.object({name:exports_external.string().optional(),dir:exports_external.string().optional(),repo:exports_external.string().optional(),team:exports_external.string().optional(),promptMode:exports_external.enum(["system","append"]).optional(),model:exports_external.string().optional(),roles:exports_external.array(exports_external.string()).optional(),omniAgentId:exports_external.string().optional(),registeredAt:exports_external.string().optional(),description:exports_external.string().optional(),color:exports_external.string().optional(),provider:exports_external.string().optional(),permissions:exports_external.object({preset:exports_external.string().optional(),allow:exports_external.array(exports_external.string()).optional(),deny:exports_external.array(exports_external.string()).optional(),bashAllowPatterns:exports_external.array(exports_external.string()).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict().optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),omniScopes:exports_external.array(exports_external.string()).optional(),hooks:exports_external.record(exports_external.unknown()).optional(),sdk:SdkDirectoryConfigSchema.optional(),bridgeTmuxSession:exports_external.string().optional()}).strict(),DERIVED_KEYS=["name","dir","registeredAt"]});import{existsSync as existsSync37}from"fs";import{copyFile as copyFile2,readFile as readFile6,writeFile as writeFile6}from"fs/promises";import{join as join43}from"path";async function migrateAgentToYaml(agentDir,dbRow){let yamlPath=join43(agentDir,"agent.yaml"),agentsMdPath=join43(agentDir,"AGENTS.md"),bakPath=`${agentsMdPath}.bak`;if(existsSync37(yamlPath))return{migrated:!1,reason:"already-migrated",yamlPath};let agentsMdRaw=await readFile6(agentsMdPath,"utf-8"),{frontmatter,body}=extractFrontmatterFromAgentsMd(agentsMdRaw);if(frontmatter===null)return{migrated:!1,reason:"no-frontmatter",yamlPath};let fmParsed=parseFrontmatter2(frontmatter,agentsMdPath),fmClean=pickYamlFields(fmParsed),merged={...dbRow?pickYamlFields(dbRow):{},...fmClean},config=AgentConfigSchema.parse(merged);return await writeAgentYaml(yamlPath,config),await copyFile2(agentsMdPath,bakPath),await writeFile6(agentsMdPath,body),{migrated:!0,yamlPath,bakPath}}function parseFrontmatter2(frontmatter,sourcePath){let raw;try{raw=load(frontmatter)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Malformed frontmatter in ${sourcePath}: ${msg}`)}if(raw===null||typeof raw!=="object"||Array.isArray(raw))throw Error(`Malformed frontmatter in ${sourcePath}: expected a YAML mapping at the top level`);return raw}function pickYamlFields(source){let out={};for(let[k,v]of Object.entries(source))if(YAML_ALLOWED_KEYS.has(k)&&v!==null&&v!==void 0)out[k]=v;return out}var YAML_ALLOWED_KEYS;var init_agent_migrate=__esm(()=>{init_js_yaml();init_agent_yaml();YAML_ALLOWED_KEYS=(()=>{let shape=AgentConfigSchema._def.shape(),keys=new Set(Object.keys(shape));return keys.delete("name"),keys.delete("dir"),keys.delete("registeredAt"),keys})()});var exports_agent_sync={};__export(exports_agent_sync,{watchAgentDirectory:()=>watchAgentDirectory,syncSingleAgentByName:()=>syncSingleAgentByName,syncAgentDirectory:()=>syncAgentDirectory,printSyncResult:()=>printSyncResult,healAgentFile:()=>healAgentFile});import{execSync as execSync7}from"child_process";import{existsSync as existsSync38,watch as fsWatch,readFileSync as readFileSync27,readdirSync as readdirSync11,realpathSync as realpathSync4,writeFileSync as writeFileSync16}from"fs";import{join as join44}from"path";function getGitRemoteUrl(dir){try{return execSync7(`git -C "${dir}" config --get remote.origin.url`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}}function extractOrgRepo(remoteUrl){let sshMatch=remoteUrl.match(/[^/:]+\/[^/]+?(?:\.git)?$/);if(sshMatch)return sshMatch[0].replace(/\.git$/,"");return null}function getRepoPathForAgent(agentDir){let reposLink=join44(agentDir,"repos");try{if(!existsSync38(reposLink))return null;let target=realpathSync4(reposLink);if(!existsSync38(target))return null;return target}catch{return null}}function discoverAgents(workspaceRoot){let agentsDir=join44(workspaceRoot,"agents");if(!existsSync38(agentsDir))return[];let agents=[];try{let entries=readdirSync11(agentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let agentDir=join44(agentsDir,entry2.name);if(!existsSync38(join44(agentDir,"AGENTS.md")))continue;agents.push({name:entry2.name,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}),discoverSubAgents(agentDir,entry2.name,agents)}}catch{}return agents}function discoverSubAgents(parentDir,parentName,agents){let subAgentsDir=join44(parentDir,".genie","agents");if(!existsSync38(subAgentsDir))return;try{let entries=readdirSync11(subAgentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let subDir=join44(subAgentsDir,entry2.name);if(!existsSync38(join44(subDir,"AGENTS.md")))continue;agents.push({name:`${parentName}/${entry2.name}`,dir:subDir,repoUrl:getGitRemoteUrl(parentDir),productRepo:getRepoPathForAgent(parentDir)})}}catch{}}function discoverSingleAgent(workspaceRoot,agentName){let agentDir=join44(workspaceRoot,"agents",agentName);if(!existsSync38(join44(agentDir,"AGENTS.md")))return null;return{name:agentName,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}}function healAgentFile(agentsMdPath,agentName,healResult){let content=readFileSync27(agentsMdPath,"utf-8"),fmMatch=content.match(/^(---\n)([\s\S]*?)(\n---)/);if(!fmMatch)return!1;let prefix=fmMatch[1],fmBlock=fmMatch[2],suffix=fmMatch[3],rest=content.slice(fmMatch[0].length),modified=!1,healedBlock=fmBlock;for(let{field,value}of INVALID_LITERALS)if(new RegExp(`^${field}:\\s*${value}\\s*$`,"m").test(healedBlock))healedBlock=healedBlock.replace(new RegExp(`${field}:\\s*${value}\\s*\\n?`,"m"),""),healResult.healed.push({agent:agentName,field,value}),modified=!0;if(!modified)return!1;let newContent=prefix+healedBlock+suffix+rest,tmpPath=`${agentsMdPath}.tmp.${Date.now()}`;writeFileSync16(tmpPath,newContent,"utf-8");let{renameSync:renameSync8}=__require("fs");return renameSync8(tmpPath,agentsMdPath),!0}function buildResolveContext(workspaceRoot,agentName){let workspaceDefaults;try{workspaceDefaults=getWorkspaceConfig(workspaceRoot).agents?.defaults}catch{}let parent;if(agentName.includes("/")){let parentName=agentName.split("/")[0],parentAgentsMd=join44(workspaceRoot,"agents",parentName,"AGENTS.md");if(existsSync38(parentAgentsMd)){let parentContent=readFileSync27(parentAgentsMd,"utf-8"),parentFm=parseFrontmatter(parentContent);parent={name:parentName,fields:parentFm}}}return{workspaceDefaults,parent}}function computeResolvedMetadata(fm,ctx){let declared={},resolved={};for(let field of Object.keys(BUILTIN_DEFAULTS)){let fmValue=fm[field];if(fmValue!==void 0&&fmValue!==null&&fmValue!==""&&fmValue!=="inherit")declared[field]=fmValue;let result2=resolveFieldWithSource(fm,field,ctx);resolved[field]={value:result2.value,source:result2.source}}return{declared,resolved}}async function syncAgentDirectory(workspaceRoot){let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]},agents=discoverAgents(workspaceRoot),discoveredNames=new Set(agents.map((a)=>a.name)),healResult={healed:[]};for(let agent of agents){let agentsMdPath=join44(agent.dir,"AGENTS.md");try{healAgentFile(agentsMdPath,agent.name,healResult)}catch{}}result2.healed=healResult.healed;for(let h of healResult.healed)console.log(`[sync] healed ${h.agent}/AGENTS.md: removed invalid '${h.field}: ${h.value}' line`);for(let agent of agents)try{await syncSingleAgent(agent,result2,workspaceRoot)}catch(err){result2.errors.push({name:agent.name,error:err instanceof Error?err.message:String(err)})}return await removeMissingAgents(discoveredNames,result2),result2}function printSyncResult(result2){if(result2.healed.length>0)console.log(` Healed: ${result2.healed.length} invalid literal(s) removed`);if(result2.migrated.length>0)console.log(` Migrated: ${result2.migrated.join(", ")} (AGENTS.md frontmatter \u2192 agent.yaml)`);if(result2.registered.length>0)console.log(` Registered: ${result2.registered.join(", ")}`);if(result2.updated.length>0)console.log(` Updated: ${result2.updated.join(", ")}`);if(result2.reactivated.length>0)console.log(` Reactivated: ${result2.reactivated.join(", ")}`);if(result2.archived.length>0)console.log(` Removed: ${result2.archived.join(", ")}`);for(let err of result2.errors)console.error(` Error (${err.name}): ${err.error}`);let total=result2.registered.length+result2.updated.length+result2.reactivated.length;console.log(`
|
|
1323
|
+
`)?afterClose.slice(1):afterClose;return{frontmatter,body}}var SdkPermissionModeSchema,SdkEffortLevelSchema,SdkThinkingConfigSchema,SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema,SdkMcpServerConfigSchema,SdkSubagentConfigSchema,SdkCustomToolConfigSchema,SdkOutputFormatSchema,SdkPluginConfigSchema,SdkSandboxConfigSchema,SdkHookMatcherConfigSchema,SdkHookEventSchema,SdkBetaSchema,SdkSystemPromptSchema,SdkDirectoryConfigSchema,AgentConfigSchema,DERIVED_KEYS;var init_agent_yaml=__esm(()=>{init_js_yaml();init_zod();init_lockfile();SdkPermissionModeSchema=exports_external.enum(["default","acceptEdits","bypassPermissions","plan","dontAsk","auto","remoteApproval"]),SdkEffortLevelSchema=exports_external.union([exports_external.enum(["low","medium","high","max"]),exports_external.number()]),SdkThinkingConfigSchema=exports_external.union([exports_external.object({type:exports_external.literal("adaptive")}).strict(),exports_external.object({type:exports_external.literal("enabled"),budgetTokens:exports_external.number().optional()}).strict(),exports_external.object({type:exports_external.literal("disabled")}).strict()]),SdkMcpStdioServerConfigSchema=exports_external.object({type:exports_external.literal("stdio").optional(),command:exports_external.string(),args:exports_external.array(exports_external.string()).optional(),env:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpSSEServerConfigSchema=exports_external.object({type:exports_external.literal("sse"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpHttpServerConfigSchema=exports_external.object({type:exports_external.literal("http"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpServerConfigSchema=exports_external.union([SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema]),SdkSubagentConfigSchema=exports_external.object({description:exports_external.string(),prompt:exports_external.string(),tools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),model:exports_external.string().optional(),mcpServers:exports_external.array(exports_external.union([exports_external.string(),exports_external.record(SdkMcpStdioServerConfigSchema)])).optional(),skills:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),background:exports_external.boolean().optional(),memory:exports_external.enum(["user","project","local"]).optional(),effort:SdkEffortLevelSchema.optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict(),SdkCustomToolConfigSchema=exports_external.object({name:exports_external.string(),description:exports_external.string(),inputSchema:exports_external.record(exports_external.unknown()),handler:exports_external.string().optional()}).strict(),SdkOutputFormatSchema=exports_external.object({type:exports_external.literal("json_schema"),schema:exports_external.record(exports_external.unknown())}).strict(),SdkPluginConfigSchema=exports_external.object({type:exports_external.literal("local"),path:exports_external.string()}).strict(),SdkSandboxConfigSchema=exports_external.object({enabled:exports_external.boolean().optional(),autoAllowBashIfSandboxed:exports_external.boolean().optional(),failIfUnavailable:exports_external.boolean().optional(),network:exports_external.object({allowLocalBinding:exports_external.boolean().optional(),allowUnixSockets:exports_external.array(exports_external.string()).optional()}).strict().optional()}).strict(),SdkHookMatcherConfigSchema=exports_external.object({toolName:exports_external.string().optional(),agentName:exports_external.string().optional()}).strict(),SdkHookEventSchema=exports_external.enum(["PreToolUse","PostToolUse","PostToolUseFailure","Notification","UserPromptSubmit","SessionStart","SessionEnd","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact","PermissionRequest","PermissionDenied","Setup","TeammateIdle","TaskCreated","TaskCompleted","Elicitation","ElicitationResult","ConfigChange","WorktreeCreate","WorktreeRemove","InstructionsLoaded","CwdChanged","FileChanged"]),SdkBetaSchema=exports_external.enum(["context-1m-2025-08-07"]),SdkSystemPromptSchema=exports_external.union([exports_external.string(),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code"),append:exports_external.string().optional()}).strict()]),SdkDirectoryConfigSchema=exports_external.object({permissionMode:SdkPermissionModeSchema.optional(),tools:exports_external.union([exports_external.array(exports_external.string()),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code")}).strict()]).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),maxBudgetUsd:exports_external.number().optional(),effort:SdkEffortLevelSchema.optional(),thinking:SdkThinkingConfigSchema.optional(),agent:exports_external.string().optional(),agents:exports_external.record(SdkSubagentConfigSchema).optional(),mcpServers:exports_external.record(SdkMcpServerConfigSchema).optional(),plugins:exports_external.array(SdkPluginConfigSchema).optional(),customTools:exports_external.array(SdkCustomToolConfigSchema).optional(),persistSession:exports_external.boolean().optional(),enableFileCheckpointing:exports_external.boolean().optional(),outputFormat:SdkOutputFormatSchema.optional(),includePartialMessages:exports_external.boolean().optional(),includeHookEvents:exports_external.boolean().optional(),promptSuggestions:exports_external.boolean().optional(),agentProgressSummaries:exports_external.boolean().optional(),systemPrompt:SdkSystemPromptSchema.optional(),sandbox:SdkSandboxConfigSchema.optional(),betas:exports_external.array(SdkBetaSchema).optional(),settingSources:exports_external.array(exports_external.enum(["user","project","local"])).optional(),settings:exports_external.union([exports_external.string(),exports_external.record(exports_external.unknown())]).optional(),hooks:exports_external.record(SdkHookEventSchema,exports_external.array(SdkHookMatcherConfigSchema)).optional()}).strict(),AgentConfigSchema=exports_external.object({name:exports_external.string().optional(),dir:exports_external.string().optional(),repo:exports_external.string().optional(),team:exports_external.string().optional(),promptMode:exports_external.enum(["system","append"]).optional(),model:exports_external.string().optional(),roles:exports_external.array(exports_external.string()).optional(),omniAgentId:exports_external.string().optional(),registeredAt:exports_external.string().optional(),description:exports_external.string().optional(),color:exports_external.string().optional(),provider:exports_external.string().optional(),permissions:exports_external.object({preset:exports_external.string().optional(),allow:exports_external.array(exports_external.string()).optional(),deny:exports_external.array(exports_external.string()).optional(),bashAllowPatterns:exports_external.array(exports_external.string()).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict().optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),omniScopes:exports_external.array(exports_external.string()).optional(),hooks:exports_external.record(exports_external.unknown()).optional(),sdk:SdkDirectoryConfigSchema.optional(),bridgeTmuxSession:exports_external.string().optional()}).strict(),DERIVED_KEYS=["name","dir","registeredAt"]});import{existsSync as existsSync37}from"fs";import{copyFile as copyFile2,readFile as readFile6,writeFile as writeFile6}from"fs/promises";import{join as join43}from"path";async function migrateAgentToYaml(agentDir,dbRow){let yamlPath=join43(agentDir,"agent.yaml"),agentsMdPath=join43(agentDir,"AGENTS.md"),bakPath=`${agentsMdPath}.bak`;if(existsSync37(yamlPath))return{migrated:!1,reason:"already-migrated",yamlPath};let agentsMdRaw=await readFile6(agentsMdPath,"utf-8"),{frontmatter,body}=extractFrontmatterFromAgentsMd(agentsMdRaw);if(frontmatter===null)return{migrated:!1,reason:"no-frontmatter",yamlPath};let fmParsed=parseFrontmatter2(frontmatter,agentsMdPath),fmClean=pickYamlFields(fmParsed),merged={...dbRow?pickYamlFields(dbRow):{},...fmClean},config=AgentConfigSchema.parse(merged);return await writeAgentYaml(yamlPath,config),await copyFile2(agentsMdPath,bakPath),await writeFile6(agentsMdPath,body),{migrated:!0,yamlPath,bakPath}}function parseFrontmatter2(frontmatter,sourcePath){let raw;try{raw=load(frontmatter)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Malformed frontmatter in ${sourcePath}: ${msg}`)}if(raw===null||typeof raw!=="object"||Array.isArray(raw))throw Error(`Malformed frontmatter in ${sourcePath}: expected a YAML mapping at the top level`);return raw}function pickYamlFields(source){let out={};for(let[k,v]of Object.entries(source))if(YAML_ALLOWED_KEYS.has(k)&&v!==null&&v!==void 0)out[k]=v;return out}var YAML_ALLOWED_KEYS;var init_agent_migrate=__esm(()=>{init_js_yaml();init_agent_yaml();YAML_ALLOWED_KEYS=(()=>{let shape=AgentConfigSchema._def.shape(),keys=new Set(Object.keys(shape));return keys.delete("name"),keys.delete("dir"),keys.delete("registeredAt"),keys})()});var exports_agent_sync={};__export(exports_agent_sync,{watchAgentDirectory:()=>watchAgentDirectory,syncSingleAgentByName:()=>syncSingleAgentByName,syncAgentDirectory:()=>syncAgentDirectory,printSyncResult:()=>printSyncResult,healAgentFile:()=>healAgentFile});import{execSync as execSync7}from"child_process";import{existsSync as existsSync38,watch as fsWatch,readFileSync as readFileSync27,readdirSync as readdirSync11,realpathSync as realpathSync4,writeFileSync as writeFileSync16}from"fs";import{join as join44}from"path";function getGitRemoteUrl(dir){try{return execSync7(`git -C "${dir}" config --get remote.origin.url`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}}function extractOrgRepo(remoteUrl){let sshMatch=remoteUrl.match(/[^/:]+\/[^/]+?(?:\.git)?$/);if(sshMatch)return sshMatch[0].replace(/\.git$/,"");return null}function getRepoPathForAgent(agentDir){let reposLink=join44(agentDir,"repos");try{if(!existsSync38(reposLink))return null;let target=realpathSync4(reposLink);if(!existsSync38(target))return null;return target}catch{return null}}function discoverAgents(workspaceRoot){let agentsDir=join44(workspaceRoot,"agents");if(!existsSync38(agentsDir))return[];let agents=[];try{let entries=readdirSync11(agentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let agentDir=join44(agentsDir,entry2.name);if(!existsSync38(join44(agentDir,"AGENTS.md")))continue;agents.push({name:entry2.name,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}),discoverSubAgents(agentDir,entry2.name,agents)}}catch{}return agents}function discoverSubAgents(parentDir,parentName,agents){let subAgentsDir=join44(parentDir,".genie","agents");if(!existsSync38(subAgentsDir))return;try{let entries=readdirSync11(subAgentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let subDir=join44(subAgentsDir,entry2.name);if(!existsSync38(join44(subDir,"AGENTS.md")))continue;agents.push({name:`${parentName}/${entry2.name}`,dir:subDir,repoUrl:getGitRemoteUrl(parentDir),productRepo:getRepoPathForAgent(parentDir)})}}catch{}}function isSafeAgentName(name){let parts=name.split("/");return parts.length>0&&parts.length<=2&&parts.every((part)=>part!==""&&part!=="."&&part!=="..")}function discoverSingleAgent(workspaceRoot,agentName){if(!isSafeAgentName(agentName))return null;let parts=agentName.split("/");if(parts.length===2){let[parentName,subName]=parts,parentDir=join44(workspaceRoot,"agents",parentName),subDir=join44(parentDir,".genie","agents",subName);if(!existsSync38(join44(subDir,"AGENTS.md")))return null;return{name:agentName,dir:subDir,repoUrl:getGitRemoteUrl(parentDir),productRepo:getRepoPathForAgent(parentDir)}}let agentDir=join44(workspaceRoot,"agents",agentName);if(!existsSync38(join44(agentDir,"AGENTS.md")))return null;return{name:agentName,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}}function healAgentFile(agentsMdPath,agentName,healResult){let content=readFileSync27(agentsMdPath,"utf-8"),fmMatch=content.match(/^(---\n)([\s\S]*?)(\n---)/);if(!fmMatch)return!1;let prefix=fmMatch[1],fmBlock=fmMatch[2],suffix=fmMatch[3],rest=content.slice(fmMatch[0].length),modified=!1,healedBlock=fmBlock;for(let{field,value}of INVALID_LITERALS)if(new RegExp(`^${field}:\\s*${value}\\s*$`,"m").test(healedBlock))healedBlock=healedBlock.replace(new RegExp(`${field}:\\s*${value}\\s*\\n?`,"m"),""),healResult.healed.push({agent:agentName,field,value}),modified=!0;if(!modified)return!1;let newContent=prefix+healedBlock+suffix+rest,tmpPath=`${agentsMdPath}.tmp.${Date.now()}`;writeFileSync16(tmpPath,newContent,"utf-8");let{renameSync:renameSync8}=__require("fs");return renameSync8(tmpPath,agentsMdPath),!0}function buildResolveContext(workspaceRoot,agentName){let workspaceDefaults;try{workspaceDefaults=getWorkspaceConfig(workspaceRoot).agents?.defaults}catch{}let parent;if(agentName.includes("/")){let parentName=agentName.split("/")[0],parentAgentsMd=join44(workspaceRoot,"agents",parentName,"AGENTS.md");if(existsSync38(parentAgentsMd)){let parentContent=readFileSync27(parentAgentsMd,"utf-8"),parentFm=parseFrontmatter(parentContent);parent={name:parentName,fields:parentFm}}}return{workspaceDefaults,parent}}function computeResolvedMetadata(fm,ctx){let declared={},resolved={};for(let field of Object.keys(BUILTIN_DEFAULTS)){let fmValue=fm[field];if(fmValue!==void 0&&fmValue!==null&&fmValue!==""&&fmValue!=="inherit")declared[field]=fmValue;let result2=resolveFieldWithSource(fm,field,ctx);resolved[field]={value:result2.value,source:result2.source}}return{declared,resolved}}async function syncAgentDirectory(workspaceRoot){let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]},agents=discoverAgents(workspaceRoot),discoveredNames=new Set(agents.map((a)=>a.name)),healResult={healed:[]};for(let agent of agents){let agentsMdPath=join44(agent.dir,"AGENTS.md");try{healAgentFile(agentsMdPath,agent.name,healResult)}catch{}}result2.healed=healResult.healed;for(let h of healResult.healed)console.log(`[sync] healed ${h.agent}/AGENTS.md: removed invalid '${h.field}: ${h.value}' line`);for(let agent of agents)try{await syncSingleAgent(agent,result2,workspaceRoot)}catch(err){result2.errors.push({name:agent.name,error:err instanceof Error?err.message:String(err)})}return await removeMissingAgents(discoveredNames,result2),result2}function printSyncResult(result2){if(result2.healed.length>0)console.log(` Healed: ${result2.healed.length} invalid literal(s) removed`);if(result2.migrated.length>0)console.log(` Migrated: ${result2.migrated.join(", ")} (AGENTS.md frontmatter \u2192 agent.yaml)`);if(result2.registered.length>0)console.log(` Registered: ${result2.registered.join(", ")}`);if(result2.updated.length>0)console.log(` Updated: ${result2.updated.join(", ")}`);if(result2.reactivated.length>0)console.log(` Reactivated: ${result2.reactivated.join(", ")}`);if(result2.archived.length>0)console.log(` Removed: ${result2.archived.join(", ")}`);for(let err of result2.errors)console.error(` Error (${err.name}): ${err.error}`);let total=result2.registered.length+result2.updated.length+result2.reactivated.length;console.log(`
|
|
1324
1324
|
Synced: ${total} agent(s), ${result2.archived.length} removed.`)}async function removeMissingAgents(discoveredNames,result2){try{let entries=await ls();for(let entry2 of entries){if(discoveredNames.has(entry2.name))continue;if(entry2.scope==="built-in")continue;if(!entry2.dir||!entry2.dir.includes("/agents/"))continue;let{removed}=await rm2(entry2.name);if(removed)result2.archived.push(entry2.name)}}catch{}}async function maybeMigrateFrontmatter(agent,result2){let yamlPath=join44(agent.dir,"agent.yaml"),agentsMdPath=join44(agent.dir,"AGENTS.md");if(existsSync38(yamlPath)||!existsSync38(agentsMdPath))return;let{frontmatter}=extractFrontmatterFromAgentsMd(readFileSync27(agentsMdPath,"utf-8"));if(frontmatter===null)return;let existingEntry=await resolve7(agent.name),dbRow=existingEntry&&!existingEntry.builtin?dbRowFromEntry(existingEntry.entry):void 0;if((await migrateAgentToYaml(agent.dir,dbRow)).migrated)result2.migrated.push(agent.name)}function buildDirectoryPayload(dir,repoPath,cf){return{dir,repo:repoPath,promptMode:cf.promptMode,model:cf.model,description:cf.description,color:cf.color,provider:cf.provider,roles:cf.roles,permissions:cf.permissions,disallowedTools:cf.disallowedTools,omniScopes:cf.omniScopes,hooks:cf.hooks,sdk:cf.sdk,bridgeTmuxSession:cf.bridgeTmuxSession}}async function syncSingleAgent(agent,result2,workspaceRoot){let repoPath=(agent.repoUrl?extractOrgRepo(agent.repoUrl):null)??agent.repoUrl??agent.dir,yamlPath=join44(agent.dir,"agent.yaml"),agentsMdPath=join44(agent.dir,"AGENTS.md");await maybeMigrateFrontmatter(agent,result2);let configFields=existsSync38(yamlPath)?await readYamlAsConfigFields(yamlPath):readFrontmatterAsConfigFields(agentsMdPath);if(workspaceRoot){let ctx=buildResolveContext(workspaceRoot,agent.name);computeResolvedMetadata(configFields.rawForResolution,ctx)}let resolved=await resolve7(agent.name),existing=resolved&&!resolved.builtin?resolved.entry:null,payload=buildDirectoryPayload(agent.dir,repoPath,configFields);if(!existing){await add({name:agent.name,...payload}),result2.registered.push(agent.name);return}await edit(agent.name,payload),result2.updated.push(agent.name)}async function readYamlAsConfigFields(yamlPath){let cfg=await parseAgentYaml(yamlPath);return{promptMode:cfg.promptMode??"append",model:cfg.model,description:cfg.description,color:cfg.color,provider:cfg.provider,roles:cfg.roles,permissions:cfg.permissions,disallowedTools:cfg.disallowedTools,omniScopes:cfg.omniScopes,hooks:cfg.hooks,sdk:cfg.sdk,bridgeTmuxSession:cfg.bridgeTmuxSession,rawForResolution:cfg}}function readFrontmatterAsConfigFields(agentsMdPath){let content=existsSync38(agentsMdPath)?readFileSync27(agentsMdPath,"utf-8"):"",fm=parseFrontmatter(content);return{promptMode:fm.promptMode??"append",model:fm.model,description:fm.description,color:fm.color,provider:fm.provider,roles:fm.roles,permissions:fm.permissions,disallowedTools:fm.disallowedTools,omniScopes:fm.omniScopes,hooks:fm.hooks,sdk:fm.sdk,bridgeTmuxSession:fm.bridgeTmuxSession,rawForResolution:fm}}function dbRowFromEntry(entry2){return{team:entry2.team,model:entry2.model,description:entry2.description,color:entry2.color,provider:entry2.provider,promptMode:entry2.promptMode,permissions:entry2.permissions,disallowedTools:entry2.disallowedTools,omniScopes:entry2.omniScopes,hooks:entry2.hooks,sdk:entry2.sdk,bridgeTmuxSession:entry2.bridgeTmuxSession}}async function syncSingleAgentByName(workspaceRoot,agentName){let agent=discoverSingleAgent(workspaceRoot,agentName);if(!agent)return"not-found";let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]};if(await syncSingleAgent(agent,result2,workspaceRoot),result2.registered.length>0)return"registered";if(result2.migrated.length>0)return"migrated";if(result2.updated.length>0)return"updated";return"synced"}function watchAgentDirectory(workspaceRoot,options){let agentsDir=join44(workspaceRoot,"agents");if(!existsSync38(agentsDir))return null;let debounceTimer=null,pendingChanges=new Set,processChanges=async()=>{let names=[...pendingChanges];pendingChanges.clear();for(let name of names)try{let action=await processWatchedAgent(workspaceRoot,agentsDir,name);if(action)options?.onSync?.(name,action)}catch{}},watcher=fsWatch(agentsDir,{persistent:!1},(_event,filename)=>{if(!filename)return;let name=filename.split("/")[0];if(!name||name.startsWith("."))return;if(pendingChanges.add(name),debounceTimer)clearTimeout(debounceTimer);debounceTimer=setTimeout(processChanges,2000)});return{close:()=>{if(debounceTimer)clearTimeout(debounceTimer);watcher.close()}}}async function processWatchedAgent(workspaceRoot,agentsDir,name){let agentDir=join44(agentsDir,name);if(existsSync38(agentDir)&&existsSync38(join44(agentDir,"AGENTS.md"))){let action=await syncSingleAgentByName(workspaceRoot,name);return action!=="synced"&&action!=="not-found"?action:null}if(!existsSync38(agentDir)){let{removed}=await rm2(name);if(removed)return"removed"}return null}var INVALID_LITERALS;var init_agent_sync=__esm(()=>{init_agent_directory();init_agent_migrate();init_agent_yaml();init_defaults();init_frontmatter();init_workspace();INVALID_LITERALS=[{field:"model",value:"inherit"}]});var exports_term_format={};__export(exports_term_format,{truncate:()=>truncate2,stripAnsi:()=>stripAnsi2,padRight:()=>padRight,formatTimestamp:()=>formatTimestamp,formatTime:()=>formatTime,formatRelativeTimestamp:()=>formatRelativeTimestamp,formatDate:()=>formatDate,color:()=>color});function padRight(str2,len){return str2.length>=len?str2:str2+" ".repeat(len-str2.length)}function truncate2(str2,len){return str2.length<=len?str2:`${str2.slice(0,len-1)}\u2026`}function formatDate(iso){if(!iso)return"-";return new Date(iso).toLocaleDateString("en-US",{month:"short",day:"numeric"})}function formatRelativeTimestamp(ts3){let d=new Date(ts3),diffMs=Date.now()-d.getTime();if(diffMs<60000)return`${Math.floor(diffMs/1000)}s ago`;if(diffMs<3600000)return`${Math.floor(diffMs/60000)}m ago`;if(diffMs<86400000)return`${Math.floor(diffMs/3600000)}h ago`;return d.toISOString().replace("T"," ").slice(0,19)}function formatTimestamp(iso,opts){if(!iso)return opts?.fallback??"-";let d=iso instanceof Date?iso:new Date(iso),fmt={month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1};if(opts?.seconds)fmt.second="2-digit";return d.toLocaleString("en-US",fmt)}function formatTime(iso,opts){try{let date=new Date(iso),fmt={hour:"2-digit",minute:"2-digit",hour12:!1};if(opts?.seconds)fmt.second="2-digit";return date.toLocaleTimeString("en-US",fmt)}catch{return opts?.fallback??"??:??"}}function color(name,text){return isTTY?`${ANSI[name]}${text}${ANSI.reset}`:text}function stripAnsi2(str2){return str2.replace(ANSI_REGEX,"")}var ANSI,isTTY,ANSI_REGEX;var init_term_format=__esm(()=>{ANSI={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightCyan:"\x1B[96m"},isTTY=process.stdout.isTTY&&!process.env.NO_COLOR;ANSI_REGEX=/\x1b\[[0-9;]*m/g});var exports_task_service={};__export(exports_task_service,{updateTask:()=>updateTask,updateMessage:()=>updateMessage,untagTask:()=>untagTask,unblockTask:()=>unblockTask,unarchiveTask:()=>unarchiveTask,unarchiveProject:()=>unarchiveProject,tagTask:()=>tagTask,setRelease:()=>setRelease,setPreference:()=>setPreference,sendMessage:()=>sendMessage,resolveTaskId:()=>resolveTaskId,resolveChannels:()=>resolveChannels,removeMember:()=>removeMember,removeDependency:()=>removeDependency,removeActor:()=>removeActor,releaseTask:()=>releaseTask,moveTask:()=>moveTask,markDone:()=>markDone,listTypes:()=>listTypes,listTasksForActor:()=>listTasksForActor,listTasks:()=>listTasks,listTags:()=>listTags,listReleases:()=>listReleases,listProjectsFiltered:()=>listProjectsFiltered,listProjects:()=>listProjects,listConversations:()=>listConversations,linkTask:()=>linkTask,getType:()=>getType,getTaskTags:()=>getTaskTags,getTaskActors:()=>getTaskActors,getTask:()=>getTask,getStageLog:()=>getStageLog,getProjectByRepoPath:()=>getProjectByRepoPath,getProjectByName:()=>getProjectByName,getPreferences:()=>getPreferences,getMessages:()=>getMessages,getMessage:()=>getMessage,getMembers:()=>getMembers,getDependents:()=>getDependents,getConversation:()=>getConversation,getCheckoutOwner:()=>getCheckoutOwner,getBlockingDependencies:()=>getBlockingDependencies,getBlockers:()=>getBlockers,forceUnlockTask:()=>forceUnlockTask,findOrCreateConversation:()=>findOrCreateConversation,expireStaleCheckouts:()=>expireStaleCheckouts,ensureProject:()=>ensureProject,deletePreference:()=>deletePreference,createType:()=>createType,createTask:()=>createTask,createTag:()=>createTag,createProject:()=>createProject,commentOnTask:()=>commentOnTask,checkoutTask:()=>checkoutTask,blockTask:()=>blockTask,assignTask:()=>assignTask,archiveTask:()=>archiveTask,archiveProject:()=>archiveProject,archiveBoard:()=>archiveBoard,addMember:()=>addMember,addDependency:()=>addDependency});import{execSync as execSync8}from"child_process";function str2(v){return v!=null?String(v):null}function strOrDefault(v,def){return v!=null?String(v):def}function mapTask(row){return{id:row.id,seq:row.seq,parentId:str2(row.parent_id),repoPath:row.repo_path,projectId:str2(row.project_id),genieOsFolderId:str2(row.genie_os_folder_id),wishFile:str2(row.wish_file),groupName:str2(row.group_name),title:row.title,description:str2(row.description),acceptanceCriteria:str2(row.acceptance_criteria),typeId:row.type_id,stage:row.stage,status:row.status,priority:row.priority,startDate:str2(row.start_date),dueDate:str2(row.due_date),estimatedEffort:str2(row.estimated_effort),startedAt:str2(row.started_at),endedAt:str2(row.ended_at),blockedReason:str2(row.blocked_reason),releaseId:str2(row.release_id),checkoutRunId:str2(row.checkout_run_id),executionLockedAt:str2(row.execution_locked_at),checkoutTimeoutMs:row.checkout_timeout_ms??600000,sessionId:str2(row.session_id),paneId:str2(row.pane_id),traceId:str2(row.trace_id),boardId:str2(row.board_id),columnId:str2(row.column_id),externalId:str2(row.external_id),externalUrl:str2(row.external_url),archivedAt:str2(row.archived_at),metadata:row.metadata??{},createdAt:strOrDefault(row.created_at,""),updatedAt:strOrDefault(row.updated_at,"")}}function mapConversation(row){return{id:row.id,parentMessageId:row.parent_message_id!=null?Number(row.parent_message_id):null,name:row.name??null,type:row.type,linkedEntity:row.linked_entity??null,linkedEntityId:row.linked_entity_id??null,createdByType:row.created_by_type??null,createdById:row.created_by_id??null,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapMessage(row){return{id:Number(row.id),conversationId:row.conversation_id,replyToId:row.reply_to_id!=null?Number(row.reply_to_id):null,senderType:row.sender_type,senderId:row.sender_id,body:row.body,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapTaskActor(row){return{taskId:row.task_id,actorType:row.actor_type,actorId:row.actor_id,role:row.role,permissions:row.permissions??{},createdAt:String(row.created_at)}}function mapDependency(row){return{taskId:row.task_id,dependsOnId:row.depends_on_id,depType:row.dep_type,createdAt:String(row.created_at)}}function mapTag(row){return{id:row.id,name:row.name,color:row.color??palette.textDim,typeId:row.type_id??null,createdAt:String(row.created_at)}}function mapTaskType(row){return{id:row.id,name:row.name,description:row.description??null,icon:row.icon??null,stages:row.stages,isBuiltin:row.is_builtin,createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapNotificationPref(row){return{actorType:row.actor_type,actorId:row.actor_id,channel:row.channel,priorityThreshold:row.priority_threshold,isDefault:row.is_default,enabled:row.enabled,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapStageLog(row){return{id:Number(row.id),taskId:row.task_id,fromStage:row.from_stage??null,toStage:row.to_stage,actorType:row.actor_type??null,actorId:row.actor_id??null,runId:row.run_id??null,gateType:row.gate_type??null,createdAt:String(row.created_at)}}function mapConversationMember(row){return{conversationId:row.conversation_id,actorType:row.actor_type,actorId:row.actor_id,role:row.role,joinedAt:String(row.joined_at)}}function mapProject(row){return{id:row.id,name:row.name,repoPath:str2(row.repo_path),description:str2(row.description),leaderAgent:str2(row.leader_agent),tmuxSession:str2(row.tmux_session),status:strOrDefault(row.status,"active"),archivedAt:str2(row.archived_at),createdAt:String(row.created_at)}}function getRepoPath(){try{return execSync8("git rev-parse --show-toplevel",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return process.cwd()}}async function resolveTaskId(idOrSeq,repoPath){let sql=await getConnection(),repo=repoPath??getRepoPath(),projectSeqMatch=idOrSeq.match(/^([^#]+)#(\d+)$/);if(projectSeqMatch&&!idOrSeq.startsWith("#")){let[,projectName,seqStr]=projectSeqMatch,seq2=Number.parseInt(seqStr,10);if(Number.isNaN(seq2))return null;let rows2=await sql`
|
|
1325
1325
|
SELECT t.id FROM tasks t
|
|
1326
1326
|
JOIN projects p ON t.project_id = p.id
|
|
@@ -1629,7 +1629,7 @@ Synced: ${total} agent(s), ${result2.archived.length} removed.`)}async function
|
|
|
1629
1629
|
AND actor_id = ${actor.actorId}
|
|
1630
1630
|
AND channel = ${channel}
|
|
1631
1631
|
`).count>0}async function listTasksForActor(actor,filters={}){let sql=await getConnection(),conditions=[],values2=[],paramIdx=1;if(filters.projectName)conditions.push(`t.project_id = (SELECT id FROM projects WHERE name = $${paramIdx++})`),values2.push(filters.projectName);else if(filters.allProjects);else conditions.push(`t.repo_path = $${paramIdx++}`),values2.push(filters.repoPath??getRepoPath());if(conditions.push(`ta.actor_type = $${paramIdx++}`),values2.push(actor.actorType),conditions.push(`ta.actor_id = $${paramIdx++}`),values2.push(actor.actorId),filters.stage)conditions.push(`t.stage = $${paramIdx++}`),values2.push(filters.stage);if(filters.status)conditions.push(`t.status = $${paramIdx++}`),values2.push(filters.status);else if(!filters.includeArchived)conditions.push("t.status != 'archived'");if(filters.priority)conditions.push(`t.priority = $${paramIdx++}`),values2.push(filters.priority);let limit=filters.limit??100,offset=filters.offset??0;values2.push(limit,offset);let query=`SELECT DISTINCT t.* FROM tasks t JOIN task_actors ta ON ta.task_id = t.id WHERE ${conditions.join(" AND ")} ORDER BY t.created_at DESC LIMIT $${paramIdx++} OFFSET $${paramIdx++}`;return(await sql.unsafe(query,values2)).map(mapTask)}var init_task_service=__esm(()=>{init_genie_tokens();init_audit();init_db()});import{createHash as createHash4}from"crypto";function parseRoutingHeader(text){if(!text)return null;let match=text.split(`
|
|
1632
|
-
`)[0].trim().match(/^\[(.+)\]$/);if(!match)return null;let pairs2=match[1].split(/\s+/),fields={};for(let pair of pairs2){let colonIdx=pair.indexOf(":");if(colonIdx<=0)continue;let key=pair.slice(0,colonIdx),value=pair.slice(colonIdx+1);if(key&&value)fields[key]=value}for(let field of REQUIRED_FIELDS)if(!fields[field])return null;if(fields.type!=="dm"&&fields.type!=="group")return null;return{channel:fields.channel,instance:fields.instance,chat:fields.chat,msg:fields.msg,from:fields.from,type:fields.type,thread:fields.thread,replyTo:fields.replyTo}}function shortHash(input){return createHash4("sha256").update(input).digest("hex").slice(0,8)}function resolveSessionKey(agentName,header){let chatId=shortHash(`${header.channel}-${header.instance}-${header.chat}`),base=`${agentName}-${chatId}`;if(header.thread)return`${base}-${header.thread}`;return base}var REQUIRED_FIELDS;var init_routing_header=__esm(()=>{REQUIRED_FIELDS=["channel","instance","chat","msg","from","type"]});var exports_session={};__export(exports_session,{sessionCommand:()=>sessionCommand,sanitizeWindowName:()=>sanitizeWindowName,registerSessionInRegistry:()=>registerSessionInRegistry,getAgentsFilePath:()=>getAgentsFilePath,buildClaudeCommand:()=>buildClaudeCommand2,_deps:()=>_deps3});import{spawnSync as spawnSync5}from"child_process";import{createHash as createHash5,randomUUID as randomUUID5}from"crypto";import{existsSync as existsSync39}from"fs";import{basename as basename5,join as join45}from"path";function shortPathHash(p){return createHash5("md5").update(p).digest("hex").slice(0,4)}function getAgentsFilePath(){let agentsPath=join45(process.cwd(),"AGENTS.md");if(existsSync39(agentsPath))return agentsPath;return null}async function resolveSessionLeaderName(teamName){try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return await resolveLeaderName2(teamName)}catch{return teamName}}async function ensureNativeTeamForLeader(teamName,cwd,sessionId){let leaderName=await resolveSessionLeaderName(teamName);await ensureNativeTeamWithSessionId(teamName,`Genie team: ${teamName}`,sessionId,leaderName),await registerNativeMember(teamName,{agentName:basename5(cwd),agentType:leaderName,color:"blue",cwd})}function buildClaudeCommand2(teamName,systemPromptFile,leaderName,sessionId,resume){return buildTeamLeadCommand(teamName,{systemPromptFile,leaderName,sessionId,resume})}async function registerSessionInRegistry(sessionName,windowName,workspaceDir,sessionId){try{let target=`${sessionName}:${windowName}`,paneId=(await _deps3.executeTmux(`display -t ${shellQuote(target)} -p '#{pane_id}'`)).trim(),now=new Date().toISOString(),sanitized=sanitizeTeamName(windowName),leaderName=await _deps3.resolveLeaderName(windowName),sanitizedLeader=sanitizeTeamName(leaderName),agentIdentity=await _deps3.findOrCreateAgent(leaderName,sanitized,leaderName);await _deps3.registerWorker({id:agentIdentity.id,paneId,session:sessionName,team:windowName,role:leaderName,customName:`${sanitized}-${sanitizedLeader}`,worktree:null,startedAt:now,state:"working",lastStateChange:now,repoPath:workspaceDir,provider:"claude",transport:"tmux",nativeTeamEnabled:!0,nativeAgentId:`${sanitizedLeader}@${sanitized}`});let pid=null;try{let pidStr=(await _deps3.executeTmux(`display -t ${shellQuote(target)} -p '#{pane_pid}'`)).trim(),parsed=Number.parseInt(pidStr,10);if(parsed>0)pid=parsed}catch{}await _deps3.createAndLinkExecutor(agentIdentity.id,"claude","tmux",{pid,tmuxSession:sessionName,tmuxPaneId:paneId,tmuxWindow:windowName,claudeSessionId:sessionId??null,state:"running",repoPath:workspaceDir})}catch{}}async function resolveWindowName(sessionName,cwd){let baseName=sanitizeWindowName(basename5(cwd));if(!await findWindowByName(sessionName,baseName))return baseName;if(await getWindowEnv(`${sessionName}:${baseName}`,"GENIE_CWD")===cwd)return baseName;return`${baseName}-${shortPathHash(cwd)}`}async function createSession2(sessionName,windowName,workspaceDir,systemPromptFile,leaderName){let sessionId=randomUUID5(),shouldResume=!1;if(await ensureNativeTeamForLeader(windowName,workspaceDir,sessionId),console.log(`Native team "${windowName}" ready at ~/.claude/teams/${sanitizeTeamName(windowName)}/`),console.log(`Creating session "${sessionName}"...`),!await createSession(sessionName))console.error(`Failed to create session "${sessionName}"`),process.exit(1);let firstWindow=(await listWindows(sessionName))[0];if(!firstWindow)console.error(`Failed to find initial window in session "${sessionName}"`),process.exit(1);await executeTmux2(`rename-window -t ${shellQuote(firstWindow.id)} ${shellQuote(windowName)}`),await executeTmux2(`set-window-option -t ${shellQuote(firstWindow.id)} automatic-rename off`),await setWindowEnv(`${sessionName}:${windowName}`,"GENIE_CWD",workspaceDir);let target=`${sessionName}:${windowName}`,cdCmd=`cd ${shellQuote(workspaceDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`);let agentName=basename5(workspaceDir),cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,leaderName,sessionId,!1);await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),console.log(`Started Claude Code as ${agentName} in ${workspaceDir}`);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workspaceDir,sessionId)}async function launchWithContinueFallback(target,windowName,workspaceDir,systemPromptFile,leaderName,sessionId,shouldResume){let cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,leaderName,sessionId,shouldResume);if(await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),shouldResume){await new Promise((r)=>setTimeout(r,3000));let afterCmd=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_current_command}'`)).trim();if(["bash","zsh","sh","fish"].includes(afterCmd)){console.log("Resume failed unexpectedly, starting fresh session...");let freshId=randomUUID5();await ensureNativeTeamForLeader(windowName,workspaceDir,freshId);let freshCmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,leaderName,freshId,!1);await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(freshCmd)} Enter`)}}}async function focusTeamWindow(sessionName,windowName,workingDir,systemPromptFile,leaderName){if((await ensureTeamWindow(sessionName,windowName,workingDir)).created){console.log(`Created team window "${windowName}"`),await setWindowEnv(`${sessionName}:${windowName}`,"GENIE_CWD",workingDir);let sessionId=randomUUID5(),shouldResume=!1;await ensureNativeTeamForLeader(windowName,workingDir,sessionId);let target=`${sessionName}:${windowName}`,cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`),await launchWithContinueFallback(target,windowName,workingDir,systemPromptFile,leaderName,sessionId,shouldResume),console.log(`Started Claude Code as ${basename5(workingDir)}@${sanitizeTeamName(windowName)} in ${workingDir}`);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workingDir,sessionId)}else{let target=`${sessionName}:${windowName}`,currentCmd=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_current_command}'`)).trim();if(["bash","zsh","sh","fish"].includes(currentCmd)){console.log(`Claude Code not running in "${windowName}", relaunching...`);let sessionId=randomUUID5(),shouldResume=!1;await ensureNativeTeamForLeader(windowName,workingDir,sessionId);let cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`),await launchWithContinueFallback(target,windowName,workingDir,systemPromptFile,leaderName,sessionId,shouldResume);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workingDir,sessionId)}}await executeTmux2(`select-window -t ${shellQuote(`${sessionName}:${windowName}`)}`),console.log(`Focused team window "${windowName}"`)}function sanitizeWindowName(name){return name.replace(/\./g,"-")}async function deriveWindowName(sessionName,workspaceDir,team){if(team)return sanitizeWindowName(team);if(await findSessionByName(sessionName))return sanitizeWindowName(await resolveWindowName(sessionName,workspaceDir));return sanitizeWindowName(basename5(workspaceDir))}async function handleReset(sessionName,windowName){let existing=await findSessionByName(sessionName);if(existing){let windows=await listWindows(existing.id);console.log(`Resetting session "${sessionName}"...`),await killSession(existing.id),await Promise.all(windows.map((w)=>deleteNativeTeam(w.name)))}else await deleteNativeTeam(windowName)}function attachToWindow(sessionName,windowName){console.log("Attaching...");let target=`${sessionName}:${windowName}`,cmd=process.env.TMUX?"switch-client":"attach",{genieTmuxPrefix:genieTmuxPrefix2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper)),{tmuxBin:tmuxBin2}=(init_ensure_tmux(),__toCommonJS(exports_ensure_tmux));spawnSync5(tmuxBin2(),[...genieTmuxPrefix2(),cmd,"-t",target],{stdio:"inherit"})}async function reconcileLeaderConfigs(){try{let{readdirSync:readdirSync12,readFileSync:readFileSync28,writeFileSync:writeFileSync17}=await import("fs"),{join:join46}=await import("path"),{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),teamsDir=join46(process.env.HOME??"/root",".claude","teams"),teams=readdirSync12(teamsDir);for(let team of teams)try{let configPath2=join46(teamsDir,team,"config.json"),raw=readFileSync28(configPath2,"utf-8"),config=JSON.parse(raw);if(config.leadAgentId?.startsWith("team-lead@")){let actualLeader=await resolveLeaderName2(team),sanitized=sanitizeTeamName(team);config.leadAgentId=`${sanitizeTeamName(actualLeader)}@${sanitized}`,writeFileSync17(configPath2,JSON.stringify(config,null,2)),console.log(`[reconcile] Updated leadAgentId for team "${team}": ${config.leadAgentId}`)}}catch{}}catch{}}async function launchInsideTmux(windowName,workspaceDir,systemPromptFile,leaderName){let sessionId=randomUUID5(),suffix=Date.now().toString(36).slice(-4),currentWindowName=`${windowName}-${suffix}`;await executeTmux2(`rename-window ${shellQuote(currentWindowName)}`),await ensureNativeTeamForLeader(currentWindowName,workspaceDir,sessionId);let cmd=buildClaudeCommand2(currentWindowName,systemPromptFile||void 0,leaderName,sessionId,!1),{execSync:execSyncCmd}=__require("child_process");execSyncCmd(cmd,{stdio:"inherit",cwd:workspaceDir})}async function sessionCommand(options={}){await reconcileStaleSpawns(),await reconcileLeaderConfigs();let workspaceDir=options.dir??process.cwd(),sessionName=options.name??sanitizeWindowName(basename5(workspaceDir));try{let windowName=await deriveWindowName(sessionName,workspaceDir,options.team),leaderName=await resolveSessionLeaderName(windowName);if(options.reset)await handleReset(sessionName,windowName);let session=await findSessionByName(sessionName),systemPromptFile=getAgentsFilePath();if(!systemPromptFile)if(await esm_default4({message:"No agent found in this directory. Scaffold one?",default:!0}))scaffoldAgentFiles(workspaceDir),systemPromptFile=join45(workspaceDir,"AGENTS.md"),console.log("Created SOUL.md, HEARTBEAT.md, and AGENTS.md");else console.error("AGENTS.md required. Run `genie` again to scaffold."),process.exit(1);if(!session)await createSession2(sessionName,windowName,workspaceDir,systemPromptFile,leaderName),attachToWindow(sessionName,windowName);else if(process.env.TMUX)await launchInsideTmux(windowName,workspaceDir,systemPromptFile,leaderName);else console.log(`Session "${sessionName}" already exists`),await focusTeamWindow(sessionName,windowName,workspaceDir,systemPromptFile,leaderName),attachToWindow(sessionName,windowName)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}var _deps3;var init_session=__esm(()=>{init_esm14();init_agent_registry();init_agent_registry();init_claude_native_teams();init_executor_registry();init_team_lead_command();init_tmux();init_templates();_deps3={executeTmux:executeTmux2,registerWorker:register,findOrCreateAgent,createAndLinkExecutor,resolveLeaderName:resolveSessionLeaderName}});var exports_should_resume={};__export(exports_should_resume,{shouldResume:()=>shouldResume,emitBootPassEvent:()=>emitBootPassEvent,classifyBootPass:()=>classifyBootPass,bootPassEventType:()=>bootPassEventType,bootPassDecisions:()=>bootPassDecisions,BOOT_PASS_CONCURRENCY_CAP:()=>BOOT_PASS_CONCURRENCY_CAP});async function readAgentResumeRow(agentId){return(await(await getConnection())`
|
|
1632
|
+
`)[0].trim().match(/^\[(.+)\]$/);if(!match)return null;let pairs2=match[1].split(/\s+/),fields={};for(let pair of pairs2){let colonIdx=pair.indexOf(":");if(colonIdx<=0)continue;let key=pair.slice(0,colonIdx),value=pair.slice(colonIdx+1);if(key&&value)fields[key]=value}for(let field of REQUIRED_FIELDS)if(!fields[field])return null;if(fields.type!=="dm"&&fields.type!=="group")return null;return{channel:fields.channel,instance:fields.instance,chat:fields.chat,msg:fields.msg,from:fields.from,type:fields.type,thread:fields.thread,replyTo:fields.replyTo}}function shortHash(input){return createHash4("sha256").update(input).digest("hex").slice(0,8)}function resolveSessionKey(agentName,header){let chatId=shortHash(`${header.channel}-${header.instance}-${header.chat}`),base=`${agentName}-${chatId}`;if(header.thread)return`${base}-${header.thread}`;return base}var REQUIRED_FIELDS;var init_routing_header=__esm(()=>{REQUIRED_FIELDS=["channel","instance","chat","msg","from","type"]});var exports_session={};__export(exports_session,{sessionCommand:()=>sessionCommand,sanitizeWindowName:()=>sanitizeWindowName,registerSessionInRegistry:()=>registerSessionInRegistry,getAgentsFilePath:()=>getAgentsFilePath,buildClaudeCommand:()=>buildClaudeCommand2,_deps:()=>_deps3});import{spawnSync as spawnSync5}from"child_process";import{createHash as createHash5,randomUUID as randomUUID5}from"crypto";import{existsSync as existsSync39}from"fs";import{basename as basename5,join as join45}from"path";function shortPathHash(p){return createHash5("md5").update(p).digest("hex").slice(0,4)}function getAgentsFilePath(){let agentsPath=join45(process.cwd(),"AGENTS.md");if(existsSync39(agentsPath))return agentsPath;return null}async function resolveSessionLeaderName(teamName){try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return await resolveLeaderName2(teamName)??teamName}catch{return teamName}}async function ensureNativeTeamForLeader(teamName,cwd,sessionId){let leaderName=await resolveSessionLeaderName(teamName);await ensureNativeTeamWithSessionId(teamName,`Genie team: ${teamName}`,sessionId,leaderName),await registerNativeMember(teamName,{agentName:basename5(cwd),agentType:leaderName,color:"blue",cwd})}function buildClaudeCommand2(teamName,systemPromptFile,leaderName,sessionId,resume){return buildTeamLeadCommand(teamName,{systemPromptFile,leaderName,sessionId,resume})}async function registerSessionInRegistry(sessionName,windowName,workspaceDir,sessionId){try{let target=`${sessionName}:${windowName}`,paneId=(await _deps3.executeTmux(`display -t ${shellQuote(target)} -p '#{pane_id}'`)).trim(),now=new Date().toISOString(),sanitized=sanitizeTeamName(windowName),leaderName=await _deps3.resolveLeaderName(windowName)??windowName,sanitizedLeader=sanitizeTeamName(leaderName),agentIdentity=await _deps3.findOrCreateAgent(leaderName,sanitized,leaderName);await _deps3.registerWorker({id:agentIdentity.id,paneId,session:sessionName,team:windowName,role:leaderName,customName:`${sanitized}-${sanitizedLeader}`,worktree:null,startedAt:now,state:"working",lastStateChange:now,repoPath:workspaceDir,provider:"claude",transport:"tmux",nativeTeamEnabled:!0,nativeAgentId:`${sanitizedLeader}@${sanitized}`});let pid=null;try{let pidStr=(await _deps3.executeTmux(`display -t ${shellQuote(target)} -p '#{pane_pid}'`)).trim(),parsed=Number.parseInt(pidStr,10);if(parsed>0)pid=parsed}catch{}await _deps3.createAndLinkExecutor(agentIdentity.id,"claude","tmux",{pid,tmuxSession:sessionName,tmuxPaneId:paneId,tmuxWindow:windowName,claudeSessionId:sessionId??null,state:"running",repoPath:workspaceDir})}catch{}}async function resolveWindowName(sessionName,cwd){let baseName=sanitizeWindowName(basename5(cwd));if(!await findWindowByName(sessionName,baseName))return baseName;if(await getWindowEnv(`${sessionName}:${baseName}`,"GENIE_CWD")===cwd)return baseName;return`${baseName}-${shortPathHash(cwd)}`}async function createSession2(sessionName,windowName,workspaceDir,systemPromptFile,leaderName){let sessionId=randomUUID5(),shouldResume=!1;if(await ensureNativeTeamForLeader(windowName,workspaceDir,sessionId),console.log(`Native team "${windowName}" ready at ~/.claude/teams/${sanitizeTeamName(windowName)}/`),console.log(`Creating session "${sessionName}"...`),!await createSession(sessionName))console.error(`Failed to create session "${sessionName}"`),process.exit(1);let firstWindow=(await listWindows(sessionName))[0];if(!firstWindow)console.error(`Failed to find initial window in session "${sessionName}"`),process.exit(1);await executeTmux2(`rename-window -t ${shellQuote(firstWindow.id)} ${shellQuote(windowName)}`),await executeTmux2(`set-window-option -t ${shellQuote(firstWindow.id)} automatic-rename off`),await setWindowEnv(`${sessionName}:${windowName}`,"GENIE_CWD",workspaceDir);let target=`${sessionName}:${windowName}`,cdCmd=`cd ${shellQuote(workspaceDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`);let agentName=basename5(workspaceDir),cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,leaderName,sessionId,!1);await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),console.log(`Started Claude Code as ${agentName} in ${workspaceDir}`);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workspaceDir,sessionId)}async function launchWithContinueFallback(target,windowName,workspaceDir,systemPromptFile,leaderName,sessionId,shouldResume){let cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,leaderName,sessionId,shouldResume);if(await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),shouldResume){await new Promise((r)=>setTimeout(r,3000));let afterCmd=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_current_command}'`)).trim();if(["bash","zsh","sh","fish"].includes(afterCmd)){console.log("Resume failed unexpectedly, starting fresh session...");let freshId=randomUUID5();await ensureNativeTeamForLeader(windowName,workspaceDir,freshId);let freshCmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,leaderName,freshId,!1);await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(freshCmd)} Enter`)}}}async function focusTeamWindow(sessionName,windowName,workingDir,systemPromptFile,leaderName){if((await ensureTeamWindow(sessionName,windowName,workingDir)).created){console.log(`Created team window "${windowName}"`),await setWindowEnv(`${sessionName}:${windowName}`,"GENIE_CWD",workingDir);let sessionId=randomUUID5(),shouldResume=!1;await ensureNativeTeamForLeader(windowName,workingDir,sessionId);let target=`${sessionName}:${windowName}`,cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`),await launchWithContinueFallback(target,windowName,workingDir,systemPromptFile,leaderName,sessionId,shouldResume),console.log(`Started Claude Code as ${basename5(workingDir)}@${sanitizeTeamName(windowName)} in ${workingDir}`);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workingDir,sessionId)}else{let target=`${sessionName}:${windowName}`,currentCmd=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_current_command}'`)).trim();if(["bash","zsh","sh","fish"].includes(currentCmd)){console.log(`Claude Code not running in "${windowName}", relaunching...`);let sessionId=randomUUID5(),shouldResume=!1;await ensureNativeTeamForLeader(windowName,workingDir,sessionId);let cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`),await launchWithContinueFallback(target,windowName,workingDir,systemPromptFile,leaderName,sessionId,shouldResume);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workingDir,sessionId)}}await executeTmux2(`select-window -t ${shellQuote(`${sessionName}:${windowName}`)}`),console.log(`Focused team window "${windowName}"`)}function sanitizeWindowName(name){return name.replace(/\./g,"-")}async function deriveWindowName(sessionName,workspaceDir,team){if(team)return sanitizeWindowName(team);if(await findSessionByName(sessionName))return sanitizeWindowName(await resolveWindowName(sessionName,workspaceDir));return sanitizeWindowName(basename5(workspaceDir))}async function handleReset(sessionName,windowName){let existing=await findSessionByName(sessionName);if(existing){let windows=await listWindows(existing.id);console.log(`Resetting session "${sessionName}"...`),await killSession(existing.id),await Promise.all(windows.map((w)=>deleteNativeTeam(w.name)))}else await deleteNativeTeam(windowName)}function attachToWindow(sessionName,windowName){console.log("Attaching...");let target=`${sessionName}:${windowName}`,cmd=process.env.TMUX?"switch-client":"attach",{genieTmuxPrefix:genieTmuxPrefix2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper)),{tmuxBin:tmuxBin2}=(init_ensure_tmux(),__toCommonJS(exports_ensure_tmux));spawnSync5(tmuxBin2(),[...genieTmuxPrefix2(),cmd,"-t",target],{stdio:"inherit"})}async function reconcileLeaderConfigs(){try{let{readdirSync:readdirSync12,readFileSync:readFileSync28,writeFileSync:writeFileSync17}=await import("fs"),{join:join46}=await import("path"),{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),teamsDir=join46(process.env.HOME??"/root",".claude","teams"),teams=readdirSync12(teamsDir);for(let team of teams)try{let configPath2=join46(teamsDir,team,"config.json"),raw=readFileSync28(configPath2,"utf-8"),config=JSON.parse(raw);if(config.leadAgentId?.startsWith("team-lead@")){let actualLeader=await resolveLeaderName2(team)??team,sanitized=sanitizeTeamName(team);config.leadAgentId=`${sanitizeTeamName(actualLeader)}@${sanitized}`,writeFileSync17(configPath2,JSON.stringify(config,null,2)),console.log(`[reconcile] Updated leadAgentId for team "${team}": ${config.leadAgentId}`)}}catch{}}catch{}}async function launchInsideTmux(windowName,workspaceDir,systemPromptFile,leaderName){let sessionId=randomUUID5(),suffix=Date.now().toString(36).slice(-4),currentWindowName=`${windowName}-${suffix}`;await executeTmux2(`rename-window ${shellQuote(currentWindowName)}`),await ensureNativeTeamForLeader(currentWindowName,workspaceDir,sessionId);let cmd=buildClaudeCommand2(currentWindowName,systemPromptFile||void 0,leaderName,sessionId,!1),{execSync:execSyncCmd}=__require("child_process");execSyncCmd(cmd,{stdio:"inherit",cwd:workspaceDir})}async function sessionCommand(options={}){await reconcileStaleSpawns(),await reconcileLeaderConfigs();let workspaceDir=options.dir??process.cwd(),sessionName=options.name??sanitizeWindowName(basename5(workspaceDir));try{let windowName=await deriveWindowName(sessionName,workspaceDir,options.team),leaderName=await resolveSessionLeaderName(windowName);if(options.reset)await handleReset(sessionName,windowName);let session=await findSessionByName(sessionName),systemPromptFile=getAgentsFilePath();if(!systemPromptFile)if(await esm_default4({message:"No agent found in this directory. Scaffold one?",default:!0}))scaffoldAgentFiles(workspaceDir),systemPromptFile=join45(workspaceDir,"AGENTS.md"),console.log("Created SOUL.md, HEARTBEAT.md, and AGENTS.md");else console.error("AGENTS.md required. Run `genie` again to scaffold."),process.exit(1);if(!session)await createSession2(sessionName,windowName,workspaceDir,systemPromptFile,leaderName),attachToWindow(sessionName,windowName);else if(process.env.TMUX)await launchInsideTmux(windowName,workspaceDir,systemPromptFile,leaderName);else console.log(`Session "${sessionName}" already exists`),await focusTeamWindow(sessionName,windowName,workspaceDir,systemPromptFile,leaderName),attachToWindow(sessionName,windowName)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}var _deps3;var init_session=__esm(()=>{init_esm14();init_agent_registry();init_agent_registry();init_claude_native_teams();init_executor_registry();init_team_lead_command();init_tmux();init_templates();_deps3={executeTmux:executeTmux2,registerWorker:register,findOrCreateAgent,createAndLinkExecutor,resolveLeaderName:resolveSessionLeaderName}});var exports_should_resume={};__export(exports_should_resume,{shouldResume:()=>shouldResume,emitBootPassEvent:()=>emitBootPassEvent,classifyBootPass:()=>classifyBootPass,bootPassEventType:()=>bootPassEventType,bootPassDecisions:()=>bootPassDecisions,BOOT_PASS_CONCURRENCY_CAP:()=>BOOT_PASS_CONCURRENCY_CAP});async function readAgentResumeRow(agentId){return(await(await getConnection())`
|
|
1633
1633
|
SELECT
|
|
1634
1634
|
a.id,
|
|
1635
1635
|
a.auto_resume,
|
|
@@ -1650,8 +1650,8 @@ Synced: ${total} agent(s), ${result2.archived.length} removed.`)}async function
|
|
|
1650
1650
|
) AS latest_assignment_outcome
|
|
1651
1651
|
FROM agents a
|
|
1652
1652
|
WHERE a.id = ${agentId}
|
|
1653
|
-
`)[0]??null}function isPermanent(row){return row.kind==="permanent"}async function shouldResume(agentId){let row=await readAgentResumeRow(agentId);if(!row)return{resume:!1,reason:"unknown_agent",rehydrate:"lazy"};let rehydrate=isPermanent(row)?"eager":"lazy";if(row.auto_resume===!1){let sessionId2=await getResumeSessionId(agentId).catch(()=>null),result2={resume:!1,reason:"auto_resume_disabled",rehydrate};if(sessionId2)result2.sessionId=sessionId2;return result2}if(row.latest_assignment_outcome!==null){let sessionId2=await getResumeSessionId(agentId).catch(()=>null),result2={resume:!1,reason:"assignment_closed",rehydrate};if(sessionId2)result2.sessionId=sessionId2;return result2}let sessionId=await getResumeSessionId(agentId).catch(()=>null);if(!sessionId)return{resume:!1,reason:"no_session_id",rehydrate};return{resume:!0,reason:"ok",sessionId,rehydrate}}function classifyBootPass(agentId,decision){if(!decision.resume)return{agentId,decision,action:"skip"};if(decision.rehydrate==="eager")return{agentId,decision,action:"eager_invoke"};return{agentId,decision,action:"lazy_surface"}}function bootPassEventType(action,decision){if(action==="eager_invoke")return"agent.boot_pass.eager_invoked";if(action==="lazy_surface")return"agent.boot_pass.lazy_pending";if(decision.reason==="assignment_closed")return"agent.boot_pass.skipped_task_done";return"agent.boot_pass.rehydrated"}async function bootPassDecisions(agentIds){let cap=Math.min(BOOT_PASS_CONCURRENCY_CAP,Math.max(1,agentIds.length)),results=Array(agentIds.length),cursor=0,workers=Array.from({length:cap},async()=>{while(cursor<agentIds.length){let i2=cursor++;if(i2>=agentIds.length)return;let agentId=agentIds[i2];try{let decision=await shouldResume(agentId);results[i2]=classifyBootPass(agentId,decision)}catch{let decision={resume:!1,reason:"no_session_id",rehydrate:"lazy"};results[i2]=classifyBootPass(agentId,decision)}}});return await Promise.all(workers),results}async function emitBootPassEvent(decision,actor=process.env.GENIE_AGENT_NAME??"scheduler"){let eventType=bootPassEventType(decision.action,decision.decision),details={action:decision.action,reason:decision.decision.reason,rehydrate:decision.decision.rehydrate};if(decision.decision.sessionId)details.sessionId=decision.decision.sessionId;await recordAuditEvent("agent",decision.agentId,eventType,actor,details)}var BOOT_PASS_CONCURRENCY_CAP=32;var init_should_resume=__esm(()=>{init_audit();init_db();init_executor_registry()});var exports_team_auto_spawn={};__export(exports_team_auto_spawn,{isTeamActive:()=>isTeamActive,isAgentAlive:()=>isAgentAlive,ensureTeamLead:()=>ensureTeamLead});import{randomUUID as randomUUID6}from"crypto";import{existsSync as existsSync40}from"fs";import{join as join46}from"path";function getSystemPromptFile(workingDir){let agentsPath=join46(workingDir,"AGENTS.md");if(existsSync40(agentsPath))return agentsPath;return null}async function ensureSession2(teamName){let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),teamConfig=await getTeam2(teamName);if(teamConfig?.tmuxSessionName){if(await findSessionByName(teamConfig.tmuxSessionName))return teamConfig.tmuxSessionName}if(!teamConfig){let current=await getCurrentSessionName();if(current)return current}let sessionName=teamConfig?.tmuxSessionName??sanitizeTeamName(teamName);try{await createSession(sessionName)}catch(error2){if(!(error2 instanceof Error?error2.message:String(error2)).includes("duplicate session"))throw error2}return sessionName}async function isTeamActive(teamName){if(!await loadConfig(teamName))return!1;let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),sessionName=(await getTeam2(teamName))?.tmuxSessionName??await getCurrentSessionName()??sanitizeTeamName(teamName);if(!await findSessionByName(sessionName))return!1;try{let windows=await listWindows(sessionName),sanitized=sanitizeTeamName(teamName);return windows.some((w)=>w.name===sanitized||w.name===teamName)}catch{return!1}}async function isAgentAlive(agentName){try{let{list:list2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),match=(await list2()).find((a)=>a.id===agentName||a.role===agentName);if(!match?.paneId)return!1;return resolveWorkerLivenessByTransport(match)}catch{return!1}}async function ensureTeamLead(teamName,workingDir){let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),targetSession=(await getTeam2(teamName))?.tmuxSessionName??await getCurrentSessionName()??sanitizeTeamName(teamName);if(await isTeamActive(teamName))return{created:!1,session:targetSession,window:sanitizeWindowName(teamName)};let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leaderName=await resolveLeaderName2(teamName),sanitized=sanitizeTeamName(teamName),leaderAgent=await findOrCreateAgent(leaderName,sanitized,leaderName),priorSessionId=(await shouldResume(leaderAgent.id).catch(()=>null))?.sessionId??null;if(priorSessionId!==null)priorSessionId=await acquireResumeSessionForAttempt(leaderAgent.id).catch(()=>null)??priorSessionId;let sessionId=priorSessionId??randomUUID6(),resumeLeader=priorSessionId!==null;await ensureNativeTeamWithSessionId(teamName,`Genie team: ${teamName}`,sessionId,leaderName),await registerNativeMember(teamName,{agentName:leaderName,agentType:"general-purpose",color:"blue",cwd:workingDir});let session=await ensureSession2(teamName),windowName=sanitizeWindowName(teamName),teamWindow=await ensureTeamWindow(session,windowName,workingDir);if(teamWindow.created){let systemPromptFile=getSystemPromptFile(workingDir),target=`${session}:${windowName}`,cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`);let cmd=buildTeamLeadCommand(teamName,{systemPromptFile:systemPromptFile??void 0,leaderName,sessionId,resume:resumeLeader});await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),await recordTeamLeadExecutor({agentId:leaderAgent.id,session,windowName,windowId:teamWindow.windowId,paneId:teamWindow.paneId,sessionId,workingDir}).catch(()=>{})}return{created:teamWindow.created,session,window:windowName}}async function recordTeamLeadExecutor(opts){await terminateActiveExecutor(opts.agentId);let pid=null;try{let target=`${opts.session}:${opts.windowName}`,pidStr=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_pid}'`)).trim(),parsed=Number.parseInt(pidStr,10);if(parsed>0)pid=parsed}catch{}await createAndLinkExecutor(opts.agentId,"claude","tmux",{pid,tmuxSession:opts.session,tmuxPaneId:opts.paneId,tmuxWindow:opts.windowName,tmuxWindowId:opts.windowId??null,claudeSessionId:opts.sessionId,state:"spawning",repoPath:opts.workingDir})}var init_team_auto_spawn=__esm(()=>{init_session();init_agent_registry();init_claude_native_teams();init_executor_registry();init_should_resume();init_team_lead_command();init_tmux()});var exports_inbox_watcher={};__export(exports_inbox_watcher,{stopInboxWatcher:()=>stopInboxWatcher,startInboxWatcher:()=>startInboxWatcher,resetSpawnFailures:()=>resetSpawnFailures,resetNoWorkingDirWarned:()=>resetNoWorkingDirWarned,getInboxPollIntervalMs:()=>getInboxPollIntervalMs,checkInboxes:()=>checkInboxes});function getInboxPollIntervalMs(){let env=process.env.GENIE_INBOX_POLL_MS;if(env!==void 0){if(env==="")return INBOX_POLL_INTERVAL_MS;let parsed=Number(env);if(!Number.isNaN(parsed)&&parsed>=0)return parsed}return INBOX_POLL_INTERVAL_MS}function resetSpawnFailures(){spawnFailures.clear()}function resetNoWorkingDirWarned(){noWorkingDirWarned.clear()}function resolveSessionKeyFromMessage(teamName,firstUnreadText){if(!firstUnreadText)return teamName;let header=parseRoutingHeader(firstUnreadText);return header?resolveSessionKey(teamName,header):teamName}function shouldWarnMissingWorkingDir(teamName){let now=Date.now(),lastWarned=noWorkingDirWarned.get(teamName)??0;if(now-lastWarned<NO_WORKING_DIR_RECHECK_MS)return!1;return noWorkingDirWarned.set(teamName,now),!0}async function attemptSpawn(deps,teamName,workingDir,sessionKey2,currentFailures){try{return await deps.ensureTeamLead(teamName,workingDir),spawnFailures.set(sessionKey2,0),!0}catch(err){let newCount=currentFailures+1;spawnFailures.set(sessionKey2,newCount);let message=err instanceof Error?err.message:String(err);if(deps.warn(`[inbox-watcher] Failed to spawn team-lead for "${teamName}" (attempt ${newCount}/${MAX_SPAWN_FAILURES}): ${message}`),newCount===MAX_SPAWN_FAILURES)deps.emitDeadInbox({team_name:teamName,session_key:sessionKey2,failure_count:newCount,last_error_message:message.length>2048?`${message.slice(0,2045)}...`:message});return!1}}async function checkInboxes(deps=defaultDeps2){if(getInboxPollIntervalMs()===0)return[];let teamsWithUnread=await deps.listTeamsWithUnreadInbox(),spawned=[];for(let{teamName,workingDir,firstUnreadText}of teamsWithUnread){let sessionKey2=resolveSessionKeyFromMessage(teamName,firstUnreadText),failures=spawnFailures.get(sessionKey2)??0;if(failures>=MAX_SPAWN_FAILURES){deps.warn(`[inbox-watcher] Skipping "${sessionKey2}" \u2014 ${failures} consecutive spawn failures`);continue}if(await deps.isTeamActive(teamName))continue;if(!workingDir){if(shouldWarnMissingWorkingDir(teamName))deps.warn(`[inbox-watcher] Cannot spawn team-lead for "${teamName}" \u2014 no workingDir in config`);continue}if(noWorkingDirWarned.delete(teamName),await attemptSpawn(deps,teamName,workingDir,sessionKey2,failures))spawned.push(teamName)}return spawned}function startInboxWatcher(deps=defaultDeps2){return setInterval(()=>{checkInboxes(deps).catch((err)=>{let message=err instanceof Error?err.message:String(err);deps.warn(`[inbox-watcher] Poll error: ${message}`)})},getInboxPollIntervalMs())}function stopInboxWatcher(handle){clearInterval(handle)}var defaultDeps2,INBOX_POLL_INTERVAL_MS=30000,MAX_SPAWN_FAILURES=3,NO_WORKING_DIR_RECHECK_MS=3600000,spawnFailures,noWorkingDirWarned;var init_inbox_watcher=__esm(()=>{init_claude_native_teams();init_emit();init_routing_header();init_team_auto_spawn();defaultDeps2={listTeamsWithUnreadInbox,isTeamActive:(teamName)=>isTeamActive(teamName),isAgentAlive:(agentName)=>isAgentAlive(agentName),ensureTeamLead:(teamName,workingDir)=>ensureTeamLead(teamName,workingDir),warn:(msg)=>console.warn(msg),emitDeadInbox:(payload)=>{try{emitEvent("rot.inbox-watcher-spawn-loop.detected",payload)}catch{}}};spawnFailures=new Map,noWorkingDirWarned=new Map});var exports_msg={};__export(exports_msg,{suggestRelayLeader:()=>suggestRelayLeader,resolveSenderTeams:()=>resolveSenderTeams,registerSendInboxCommands:()=>registerSendInboxCommands,printBridgeSuggestion:()=>printBridgeSuggestion,parseAtSyntax:()=>parseAtSyntax,isCliSender:()=>isCliSender,handleBroadcast:()=>handleBroadcast,fanoutBroadcastToNativeInboxes:()=>fanoutBroadcastToNativeInboxes,detectSenderIdentity:()=>detectSenderIdentity,checkSendScope:()=>checkSendScope});import{readFile as readFile7}from"fs/promises";import{homedir as homedir33}from"os";import{join as join47}from"path";async function getRegistry2(){if(!_registry)_registry=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));return _registry}async function getTaskService(){if(!_taskService)_taskService=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService}async function getTeamManager(){if(!_teamManager)_teamManager=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return _teamManager}async function getMailbox(){if(!_mailbox)_mailbox=await Promise.resolve().then(() => (init_mailbox(),exports_mailbox));return _mailbox}function isCliSender(sender){return sender==="cli"||sender.startsWith("cli:")}async function detectSenderIdentity(teamName){let envId=process.env.GENIE_AGENT_ID;if(envId&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(envId))return envId;let envName=process.env.GENIE_AGENT_NAME;if(envName)return envName;let paneId=process.env.TMUX_PANE;if(!paneId)return"cli";let registry=await getRegistry2(),worker=typeof registry.findByPane==="function"?await registry.findByPane(paneId):null;if(worker)return worker.role??worker.id;let resolvedTeam=teamName??process.env.GENIE_TEAM;if(resolvedTeam){let memberName=await findMemberByPane(resolvedTeam,paneId);if(memberName)return memberName}return"cli"}async function findMemberByPane(teamName,paneId){let configDir=process.env.CLAUDE_CONFIG_DIR??join47(homedir33(),".claude"),sanitized=teamName.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase(),cfgPath=join47(configDir,"teams",sanitized,"config.json");try{let raw=await readFile7(cfgPath,"utf-8");return(JSON.parse(raw).members??[]).find((m)=>m.tmuxPaneId===paneId)?.name??null}catch{return null}}function parseAtSyntax(recipient,defaultTeam){let atIdx=recipient.indexOf("@");if(atIdx===-1)return{recipient,team:defaultTeam};let role=recipient.slice(0,atIdx),team=recipient.slice(atIdx+1);if(!role||!team)return{recipient,team:defaultTeam};return{recipient:role,team}}async function resolveLeaderAlias(recipient,teamContext){if(recipient!=="team-lead")return recipient;let teamName=teamContext??process.env.GENIE_TEAM;if(teamName)return(await getTeamManager()).resolveLeaderName(teamName);return recipient}async function checkSendScope(_repoPath,sender,recipient){if(isCliSender(sender))return null;let teams=await(await getTeamManager()).listTeams(),senderTeams=resolveSenderTeams(teams,sender);if(senderTeams.length===0)return null;for(let team of senderTeams)if(isRecipientInTeam(team,recipient))return null;let reachableChildren=resolveReachableChildren(teams,senderTeams);for(let child of reachableChildren){if(recipient===child.name)return null;if(isRecipientInTeam(child,recipient))return null}let teamNames=senderTeams.map((t)=>t.name).join(", ");return`Scope violation: "${recipient}" is not in sender's team(s): ${teamNames}`}function childReachbackAllowed(child,parent){if(parent.allowChildReachback?.some((prefix)=>child.name.startsWith(prefix)))return!0;return DEFAULT_REACHBACK_PREFIXES.some((prefix)=>child.name.startsWith(prefix))}function walkParentChain(teams,start,visited,out){let current=start,depth=0;while(current.parentTeam&&depth<PARENT_CHAIN_MAX_DEPTH){if(visited.has(current.parentTeam))return;let parent=teams.find((t)=>t.name===current.parentTeam);if(!parent)return;if(!childReachbackAllowed(current,parent))return;out.push(parent),visited.add(parent.name),current=parent,depth++}}function walkChildTeams(teams,parent,visited,out,depth){if(depth>=PARENT_CHAIN_MAX_DEPTH)return;for(let child of teams){if(visited.has(child.name))continue;if(child.parentTeam!==parent.name)continue;if(!childReachbackAllowed(child,parent))continue;out.push(child),visited.add(child.name),walkChildTeams(teams,child,visited,out,depth+1)}}function resolveReachableChildren(teams,senderTeams){let visited=new Set(senderTeams.map((t)=>t.name)),result2=[];for(let team of senderTeams)walkChildTeams(teams,team,visited,result2,0);return result2}function resolveSenderTeams(teams,sender){let direct=teams.filter((t)=>t.members.includes(sender)),visited=new Set(direct.map((t)=>t.name)),result2=[...direct];for(let team of direct)walkParentChain(teams,team,visited,result2);if(teams.some((t)=>t.leader===sender)||sender==="team-lead"){let envTeam=process.env.GENIE_TEAM;if(envTeam){let leaderTeam=teams.find((t)=>t.name===envTeam);if(leaderTeam&&!visited.has(leaderTeam.name))result2.push(leaderTeam),visited.add(leaderTeam.name),walkParentChain(teams,leaderTeam,visited,result2)}}return result2}async function suggestRelayLeader(sender){if(isCliSender(sender))return null;let teams=await(await getTeamManager()).listTeams(),reachable=resolveSenderTeams(teams,sender);if(reachable.length===0)return null;let target=reachable[0];return{leader:target.leader??target.name,team:target.name}}function isRecipientInTeam(team,recipient){if(team.members.includes(recipient)||recipient===team.leader||recipient==="team-lead")return!0;if(recipient.startsWith(`${team.name}-`)){let roleOnly=recipient.slice(team.name.length+1);if(team.members.includes(roleOnly))return!0}return!1}async function findAgentTeam(_repoPath,agentName){let teams=await(await getTeamManager()).listTeams(),memberTeam=teams.find((t)=>t.members.includes(agentName));if(memberTeam)return memberTeam;if(agentName==="team-lead"||teams.some((t)=>t.leader===agentName)){let envTeam=process.env.GENIE_TEAM;if(envTeam)return teams.find((t)=>t.name===envTeam)??null;let leaderTeam=teams.find((t)=>t.leader===agentName);if(leaderTeam)return leaderTeam}return null}function localActor(name){return{actorType:"local",actorId:name}}async function resolveTeamName2(explicit,repoPath,from){if(explicit)return explicit;let name=(await findAgentTeam(repoPath,from))?.name??process.env.GENIE_TEAM;if(!name)console.error("Error: Could not auto-detect team. Use --team <name>."),process.exit(1);return name}async function handleInbox(agent,options){let ts3=await getTaskService(),resolvedAgent=agent??await detectSenderIdentity(),actor=localActor(resolvedAgent),conversations=await ts3.listConversations(actor);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log(`No conversations for "${resolvedAgent}".`);return}console.log(""),console.log(`INBOX: ${resolvedAgent}`),console.log("\u2500".repeat(60));for(let conv of conversations)await printConversationSummary(ts3,conv)}async function printConversationSummary(ts3,conv){let messages2=await ts3.getMessages(conv.id,{limit:1}),lastMsg=messages2.length>0?messages2[messages2.length-1]:null,name=conv.name??conv.id,type2=conv.type==="dm"?"DM":"Group",linked=conv.linkedEntity?` [${conv.linkedEntity}:${conv.linkedEntityId}]`:"",preview=lastMsg?truncate2(lastMsg.body,50):"(no messages)",time=lastMsg?formatTime(lastMsg.createdAt):"";if(console.log(` ${padRight(name,30)} ${padRight(type2,6)}${linked}`),lastMsg)console.log(` ${time} ${lastMsg.senderId}: ${preview}`);console.log("")}async function handleChatThread(messageId,options){let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),parentMsgId=Number(messageId),parentMsg=await ts3.getMessage(parentMsgId);if(!parentMsg)console.error(`Error: Message not found: ${messageId}`),process.exit(1);let conv=await ts3.findOrCreateConversation({type:"group",name:options.name??`Thread on message #${parentMsgId}`,parentMessageId:parentMsgId,createdBy:actor,members:[actor]});console.log(`Thread created: ${conv.id}`),console.log(` Parent message: #${parentMsgId} in ${parentMsg.conversationId}`),console.log(` Name: ${conv.name??"(unnamed)"}`)}function printConversationTable(conversations){console.log(` ${padRight("ID",20)} ${padRight("NAME",25)} ${padRight("TYPE",8)} ${padRight("LINKED",20)} UPDATED`),console.log(` ${"\u2500".repeat(80)}`);for(let c of conversations){let name=truncate2(c.name??"(unnamed)",23),linked=c.linkedEntity?`${c.linkedEntity}:${c.linkedEntityId}`:"-",updated=formatTime(c.updatedAt);console.log(` ${padRight(c.id,20)} ${padRight(name,25)} ${padRight(c.type,8)} ${padRight(linked,20)} ${updated}`)}console.log(`
|
|
1654
|
-
${conversations.length} conversation${conversations.length===1?"":"s"}`)}async function handleChatList(options){let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),conversations=await ts3.listConversations(actor);if(options.type)conversations=conversations.filter((c)=>c.type===options.type);if(options.linked)conversations=conversations.filter((c)=>c.linkedEntity===options.linked);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log("No conversations found.");return}printConversationTable(conversations)}async function handleChatRead(conversationId,options){let ts3=await getTaskService(),conv=await ts3.getConversation(conversationId);if(!conv)console.error(`Error: Conversation not found: ${conversationId}`),process.exit(1);let messages2=await ts3.getMessages(conversationId,{since:options.since,limit:Number(options.limit)||50});if(options.json){console.log(JSON.stringify(messages2,null,2));return}let name=conv.name??conversationId;if(messages2.length===0){console.log(`No messages in "${name}".`);return}console.log(""),console.log(`CHAT: ${name}`),console.log("\u2500".repeat(60));for(let msg of messages2){let time=formatTime(msg.createdAt),reply=msg.replyToId?` (reply to #${msg.replyToId})`:"";console.log(` [${time}] ${msg.senderId}: ${msg.body}${reply}`)}console.log("")}async function discoverCurrentTeam(nativeTeams,from,explicitTeam){if(explicitTeam)return explicitTeam;let discovered=await nativeTeams.discoverTeamName().catch(()=>null);if(discovered)return discovered;let registryMod=await getRegistry2(),senderId=await registryMod.resolveAgentId(from);if(!senderId)return null;return(await registryMod.get(senderId))?.team??null}async function deliverToTeam(nativeTeams,team,recipient,msg){let nativeName=await nativeTeams.resolveNativeMemberName(team,recipient);if(!nativeName)return!1;return await nativeTeams.writeNativeInbox(team,nativeName,msg),!0}async function bridgeToNativeInbox(from,recipient,body,explicitTeam){if(from===recipient)return!1;let nativeTeams=await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams)),nativeMsg={from,text:body,summary:body.length>50?`${body.substring(0,50)}...`:body,timestamp:new Date().toISOString(),color:"blue",read:!1},currentTeam=await discoverCurrentTeam(nativeTeams,from,explicitTeam);if(currentTeam&&await deliverToTeam(nativeTeams,currentTeam,recipient,nativeMsg))return!0;let allTeams=await nativeTeams.listTeams().catch(()=>[]);for(let team of allTeams){if(team===currentTeam)continue;if(await deliverToTeam(nativeTeams,team,recipient,nativeMsg))return!0}return console.warn(`[genie send] Native inbox bridge: could not find native team member for "${recipient}"`),!1}function quoteForShell(value){return`'${value.replace(/'/g,"'\\''")}'`}async function printBridgeSuggestion(sender,recipient,body,scopeError){let suggestion=await suggestRelayLeader(sender);if(console.error(`Scope violation: ${scopeError}`),!suggestion){console.error("No reachable leader found \u2014 sender is not bound to any team.");return}if(suggestion.leader===sender){console.error(`You are already the nearest reachable leader (${suggestion.leader}@${suggestion.team}) \u2014 no external relay path available.`);return}console.error(`Nearest reachable leader: ${suggestion.leader}@${suggestion.team}`),console.error("Relay manually via:"),console.error(` genie send ${quoteForShell(`[relay to ${recipient}] ${body}`)} --to ${suggestion.leader} --team ${suggestion.team}`)}function broadcastAgentName(agent){return agent.customName??agent.role??agent.id}function mergeBroadcastRosterEntry(bySanitized,sanitized,patch){if(!sanitized)return;let existing=bySanitized.get(sanitized);bySanitized.set(sanitized,{agent:existing?.agent??patch.agent,sanitized,inboxName:patch.inboxName??existing?.inboxName??sanitized,agentId:existing?.agentId??patch.agentId,nativeColor:existing?.nativeColor??patch.nativeColor,nativeActive:existing?.nativeActive??patch.nativeActive})}async function resolveBroadcastRoster(teamName,deps){let[agents,nativeConfig]=await Promise.all([deps.listAgents({team:teamName}).catch(()=>[]),deps.loadConfig(teamName).catch(()=>null)]),bySanitized=new Map;for(let agent of agents){let name=broadcastAgentName(agent),sanitized=deps.sanitizeTeamName(name);mergeBroadcastRosterEntry(bySanitized,sanitized,{agent:name,inboxName:sanitized,agentId:agent.id,nativeColor:agent.nativeColor})}for(let member of nativeConfig?.members??[]){let sanitized=deps.sanitizeTeamName(member.name);mergeBroadcastRosterEntry(bySanitized,sanitized,{agent:member.name,inboxName:member.name,nativeColor:member.color,nativeActive:member.isActive})}return[...bySanitized.values()]}function makeBroadcastNativeMessage(from,body,timestamp2,color2){return{from,text:body,summary:body.length>50?`${body.substring(0,50)}...`:body,timestamp:timestamp2,color:color2,read:!1}}async function broadcastSkipReason(entry2,deps){if(entry2.nativeActive===!1)return"offline";if(!entry2.agentId)return null;let state=await deps.getAgentEffectiveState(entry2.agentId).catch(()=>"offline");if(state==="offline")return"offline";if(state==="terminated")return"terminated";if(state==="error")return"dead";if(state==="done")return"done";return null}async function fanoutBroadcastToNativeInboxes(teamName,from,body,deps){let sender=deps.sanitizeTeamName(from),roster=await resolveBroadcastRoster(teamName,deps),timestamp2=(deps.now??(()=>new Date))().toISOString(),recipients=[];for(let entry2 of roster){if(entry2.sanitized===sender)continue;let skipReason=await broadcastSkipReason(entry2,deps);if(skipReason){recipients.push({agent:entry2.agent,delivered:!1,reason:skipReason});continue}try{await deps.writeNativeInbox(teamName,entry2.inboxName,makeBroadcastNativeMessage(from,body,timestamp2,entry2.nativeColor??"blue")),recipients.push({agent:entry2.agent,delivered:!0})}catch(err){recipients.push({agent:entry2.agent,delivered:!1,reason:err instanceof Error?err.message:String(err)})}}return recipients}async function handleBroadcast(body,options,deps={}){let ts3=deps.taskService??await getTaskService(),registry=deps.registry??await getRegistry2(),nativeTeams=deps.nativeTeams??await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams)),repoPath=deps.repoPath??process.cwd(),from=options.from??await detectSenderIdentity(options.team),teamName=await resolveTeamName2(options.team,repoPath,from),senderActor=localActor(from),conv=await ts3.findOrCreateConversation({type:"group",name:`Team: ${teamName}`,linkedEntity:"team",linkedEntityId:teamName,createdBy:senderActor,members:[senderActor]});await ts3.addMember(conv.id,senderActor);let msg=await ts3.sendMessage(conv.id,senderActor,body),recipients=await fanoutBroadcastToNativeInboxes(teamName,from,body,{listAgents:registry.listAgents,getAgentEffectiveState:registry.getAgentEffectiveState,loadConfig:nativeTeams.loadConfig,sanitizeTeamName:nativeTeams.sanitizeTeamName,writeNativeInbox:nativeTeams.writeNativeInbox,now:deps.now});try{await(deps.publishSubjectEvent??(await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events))).publishSubjectEvent)(repoPath,"genie.msg.broadcast",{kind:"message",agent:from,team:teamName,direction:"out",peer:teamName,text:body,data:{messageId:msg.id,conversationId:conv.id,from,team:teamName,recipients},source:"mailbox"})}catch{}let deliveredCount=recipients.filter((r)=>r.delivered).length;console.log(`Broadcast sent to team "${teamName}" (delivered to ${deliveredCount} of ${recipients.length} members).`),console.log(` Message ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`);for(let recipient of recipients)if(!recipient.delivered)console.log(` ${recipient.agent}: ${recipient.reason??"delivery failed"}`);return{messageId:msg.id,conversationId:conv.id,team:teamName,recipients}}async function handleSend(body,options){let ts3=await getTaskService(),mailbox=await getMailbox(),repoPath=process.cwd(),from=options.from??await detectSenderIdentity(options.team),parsed=parseAtSyntax(options.to,options.team),to=await resolveLeaderAlias(parsed.recipient,parsed.team),scopeError=await checkSendScope(repoPath,from,to);if(scopeError){if(options.bridge){await printBridgeSuggestion(from,to,body,scopeError);return}console.error(`Error: ${scopeError}`),process.exit(1)}let registryMod=await getRegistry2(),teamScope=parsed.team??options.team??process.env.GENIE_TEAM,toAgentId=await registryMod.resolveAgentIdStrict(to,teamScope),senderActor=localActor(from),recipientActor=localActor(toAgentId),conv=await ts3.findOrCreateConversation({type:"dm",members:[senderActor,recipientActor],createdBy:senderActor});await ts3.addMember(conv.id,senderActor),await ts3.addMember(conv.id,recipientActor);let mailboxMessage=await mailbox.send(repoPath,from,toAgentId,body),msg=await ts3.sendMessage(conv.id,senderActor,body);try{let{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,`genie.msg.${to}`,{kind:"message",agent:from,direction:"out",peer:to,text:body,data:{messageId:msg.id,conversationId:conv.id,from,to},source:"mailbox"})}catch{}if(await bridgeToNativeInbox(from,to,body,teamScope).catch((err)=>{let reason=err instanceof Error?err.message:String(err);return console.warn(`[genie send] Native inbox bridge failed: ${reason}`),!1}))await mailbox.markDelivered(repoPath,toAgentId,mailboxMessage.id).catch(()=>{});console.log(`Message sent to "${to}".`),console.log(` ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`)}function registerSendInboxCommands(program2){program2.command("send <body>").description("Send a direct message to an agent (PG-backed)").option("--to <agent>","Recipient agent name (default: team leader)","team-lead").option("--from <sender>","Sender ID (auto-detected from context)").option("--team <name>","Explicit team context for sender/recipient resolution").option("--bridge","On scope violation, print an advisory + relay command instead of failing (exit 0)").addHelpText("after",`
|
|
1653
|
+
`)[0]??null}function isPermanent(row){return row.kind==="permanent"}async function shouldResume(agentId){let row=await readAgentResumeRow(agentId);if(!row)return{resume:!1,reason:"unknown_agent",rehydrate:"lazy"};let rehydrate=isPermanent(row)?"eager":"lazy";if(row.auto_resume===!1){let sessionId2=await getResumeSessionId(agentId).catch(()=>null),result2={resume:!1,reason:"auto_resume_disabled",rehydrate};if(sessionId2)result2.sessionId=sessionId2;return result2}if(row.latest_assignment_outcome!==null){let sessionId2=await getResumeSessionId(agentId).catch(()=>null),result2={resume:!1,reason:"assignment_closed",rehydrate};if(sessionId2)result2.sessionId=sessionId2;return result2}let sessionId=await getResumeSessionId(agentId).catch(()=>null);if(!sessionId)return{resume:!1,reason:"no_session_id",rehydrate};return{resume:!0,reason:"ok",sessionId,rehydrate}}function classifyBootPass(agentId,decision){if(!decision.resume)return{agentId,decision,action:"skip"};if(decision.rehydrate==="eager")return{agentId,decision,action:"eager_invoke"};return{agentId,decision,action:"lazy_surface"}}function bootPassEventType(action,decision){if(action==="eager_invoke")return"agent.boot_pass.eager_invoked";if(action==="lazy_surface")return"agent.boot_pass.lazy_pending";if(decision.reason==="assignment_closed")return"agent.boot_pass.skipped_task_done";return"agent.boot_pass.rehydrated"}async function bootPassDecisions(agentIds){let cap=Math.min(BOOT_PASS_CONCURRENCY_CAP,Math.max(1,agentIds.length)),results=Array(agentIds.length),cursor=0,workers=Array.from({length:cap},async()=>{while(cursor<agentIds.length){let i2=cursor++;if(i2>=agentIds.length)return;let agentId=agentIds[i2];try{let decision=await shouldResume(agentId);results[i2]=classifyBootPass(agentId,decision)}catch{let decision={resume:!1,reason:"no_session_id",rehydrate:"lazy"};results[i2]=classifyBootPass(agentId,decision)}}});return await Promise.all(workers),results}async function emitBootPassEvent(decision,actor=process.env.GENIE_AGENT_NAME??"scheduler"){let eventType=bootPassEventType(decision.action,decision.decision),details={action:decision.action,reason:decision.decision.reason,rehydrate:decision.decision.rehydrate};if(decision.decision.sessionId)details.sessionId=decision.decision.sessionId;await recordAuditEvent("agent",decision.agentId,eventType,actor,details)}var BOOT_PASS_CONCURRENCY_CAP=32;var init_should_resume=__esm(()=>{init_audit();init_db();init_executor_registry()});var exports_team_auto_spawn={};__export(exports_team_auto_spawn,{isTeamActive:()=>isTeamActive,isAgentAlive:()=>isAgentAlive,ensureTeamLead:()=>ensureTeamLead});import{randomUUID as randomUUID6}from"crypto";import{existsSync as existsSync40}from"fs";import{join as join46}from"path";function getSystemPromptFile(workingDir){let agentsPath=join46(workingDir,"AGENTS.md");if(existsSync40(agentsPath))return agentsPath;return null}async function ensureSession2(teamName){let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),teamConfig=await getTeam2(teamName);if(teamConfig?.tmuxSessionName){if(await findSessionByName(teamConfig.tmuxSessionName))return teamConfig.tmuxSessionName}if(!teamConfig){let current=await getCurrentSessionName();if(current)return current}let sessionName=teamConfig?.tmuxSessionName??sanitizeTeamName(teamName);try{await createSession(sessionName)}catch(error2){if(!(error2 instanceof Error?error2.message:String(error2)).includes("duplicate session"))throw error2}return sessionName}async function isTeamActive(teamName){if(!await loadConfig(teamName))return!1;let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),sessionName=(await getTeam2(teamName))?.tmuxSessionName??await getCurrentSessionName()??sanitizeTeamName(teamName);if(!await findSessionByName(sessionName))return!1;try{let windows=await listWindows(sessionName),sanitized=sanitizeTeamName(teamName);return windows.some((w)=>w.name===sanitized||w.name===teamName)}catch{return!1}}async function isAgentAlive(agentName){try{let{list:list2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),match=(await list2()).find((a)=>a.id===agentName||a.role===agentName);if(!match?.paneId)return!1;return resolveWorkerLivenessByTransport(match)}catch{return!1}}async function ensureTeamLead(teamName,workingDir){let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),targetSession=(await getTeam2(teamName))?.tmuxSessionName??await getCurrentSessionName()??sanitizeTeamName(teamName);if(await isTeamActive(teamName))return{created:!1,session:targetSession,window:sanitizeWindowName(teamName)};let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leaderName=await resolveLeaderName2(teamName)??teamName,sanitized=sanitizeTeamName(teamName),leaderAgent=await findOrCreateAgent(leaderName,sanitized,leaderName),priorSessionId=(await shouldResume(leaderAgent.id).catch(()=>null))?.sessionId??null;if(priorSessionId!==null)priorSessionId=await acquireResumeSessionForAttempt(leaderAgent.id).catch(()=>null)??priorSessionId;let sessionId=priorSessionId??randomUUID6(),resumeLeader=priorSessionId!==null;await ensureNativeTeamWithSessionId(teamName,`Genie team: ${teamName}`,sessionId,leaderName),await registerNativeMember(teamName,{agentName:leaderName,agentType:"general-purpose",color:"blue",cwd:workingDir});let session=await ensureSession2(teamName),windowName=sanitizeWindowName(teamName),teamWindow=await ensureTeamWindow(session,windowName,workingDir);if(teamWindow.created){let systemPromptFile=getSystemPromptFile(workingDir),target=`${session}:${windowName}`,cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`);let cmd=buildTeamLeadCommand(teamName,{systemPromptFile:systemPromptFile??void 0,leaderName,sessionId,resume:resumeLeader});await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),await recordTeamLeadExecutor({agentId:leaderAgent.id,session,windowName,windowId:teamWindow.windowId,paneId:teamWindow.paneId,sessionId,workingDir}).catch(()=>{})}return{created:teamWindow.created,session,window:windowName}}async function recordTeamLeadExecutor(opts){await terminateActiveExecutor(opts.agentId);let pid=null;try{let target=`${opts.session}:${opts.windowName}`,pidStr=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_pid}'`)).trim(),parsed=Number.parseInt(pidStr,10);if(parsed>0)pid=parsed}catch{}await createAndLinkExecutor(opts.agentId,"claude","tmux",{pid,tmuxSession:opts.session,tmuxPaneId:opts.paneId,tmuxWindow:opts.windowName,tmuxWindowId:opts.windowId??null,claudeSessionId:opts.sessionId,state:"spawning",repoPath:opts.workingDir})}var init_team_auto_spawn=__esm(()=>{init_session();init_agent_registry();init_claude_native_teams();init_executor_registry();init_should_resume();init_team_lead_command();init_tmux()});var exports_inbox_watcher={};__export(exports_inbox_watcher,{stopInboxWatcher:()=>stopInboxWatcher,startInboxWatcher:()=>startInboxWatcher,resetSpawnFailures:()=>resetSpawnFailures,resetNoWorkingDirWarned:()=>resetNoWorkingDirWarned,getInboxPollIntervalMs:()=>getInboxPollIntervalMs,checkInboxes:()=>checkInboxes});function getInboxPollIntervalMs(){let env=process.env.GENIE_INBOX_POLL_MS;if(env!==void 0){if(env==="")return INBOX_POLL_INTERVAL_MS;let parsed=Number(env);if(!Number.isNaN(parsed)&&parsed>=0)return parsed}return INBOX_POLL_INTERVAL_MS}function resetSpawnFailures(){spawnFailures.clear()}function resetNoWorkingDirWarned(){noWorkingDirWarned.clear()}function resolveSessionKeyFromMessage(teamName,firstUnreadText){if(!firstUnreadText)return teamName;let header=parseRoutingHeader(firstUnreadText);return header?resolveSessionKey(teamName,header):teamName}function shouldWarnMissingWorkingDir(teamName){let now=Date.now(),lastWarned=noWorkingDirWarned.get(teamName)??0;if(now-lastWarned<NO_WORKING_DIR_RECHECK_MS)return!1;return noWorkingDirWarned.set(teamName,now),!0}async function attemptSpawn(deps,teamName,workingDir,sessionKey2,currentFailures){try{return await deps.ensureTeamLead(teamName,workingDir),spawnFailures.set(sessionKey2,0),!0}catch(err){let newCount=currentFailures+1;spawnFailures.set(sessionKey2,newCount);let message=err instanceof Error?err.message:String(err);if(deps.warn(`[inbox-watcher] Failed to spawn team-lead for "${teamName}" (attempt ${newCount}/${MAX_SPAWN_FAILURES}): ${message}`),newCount===MAX_SPAWN_FAILURES)deps.emitDeadInbox({team_name:teamName,session_key:sessionKey2,failure_count:newCount,last_error_message:message.length>2048?`${message.slice(0,2045)}...`:message});return!1}}async function checkInboxes(deps=defaultDeps2){if(getInboxPollIntervalMs()===0)return[];let teamsWithUnread=await deps.listTeamsWithUnreadInbox(),spawned=[];for(let{teamName,workingDir,firstUnreadText}of teamsWithUnread){let sessionKey2=resolveSessionKeyFromMessage(teamName,firstUnreadText),failures=spawnFailures.get(sessionKey2)??0;if(failures>=MAX_SPAWN_FAILURES){deps.warn(`[inbox-watcher] Skipping "${sessionKey2}" \u2014 ${failures} consecutive spawn failures`);continue}if(await deps.isTeamActive(teamName))continue;if(!workingDir){if(shouldWarnMissingWorkingDir(teamName))deps.warn(`[inbox-watcher] Cannot spawn team-lead for "${teamName}" \u2014 no workingDir in config`);continue}if(noWorkingDirWarned.delete(teamName),await attemptSpawn(deps,teamName,workingDir,sessionKey2,failures))spawned.push(teamName)}return spawned}function startInboxWatcher(deps=defaultDeps2){return setInterval(()=>{checkInboxes(deps).catch((err)=>{let message=err instanceof Error?err.message:String(err);deps.warn(`[inbox-watcher] Poll error: ${message}`)})},getInboxPollIntervalMs())}function stopInboxWatcher(handle){clearInterval(handle)}var defaultDeps2,INBOX_POLL_INTERVAL_MS=30000,MAX_SPAWN_FAILURES=3,NO_WORKING_DIR_RECHECK_MS=3600000,spawnFailures,noWorkingDirWarned;var init_inbox_watcher=__esm(()=>{init_claude_native_teams();init_emit();init_routing_header();init_team_auto_spawn();defaultDeps2={listTeamsWithUnreadInbox,isTeamActive:(teamName)=>isTeamActive(teamName),isAgentAlive:(agentName)=>isAgentAlive(agentName),ensureTeamLead:(teamName,workingDir)=>ensureTeamLead(teamName,workingDir),warn:(msg)=>console.warn(msg),emitDeadInbox:(payload)=>{try{emitEvent("rot.inbox-watcher-spawn-loop.detected",payload)}catch{}}};spawnFailures=new Map,noWorkingDirWarned=new Map});var exports_msg={};__export(exports_msg,{suggestRelayLeader:()=>suggestRelayLeader,resolveSenderTeams:()=>resolveSenderTeams,resolveLeaderAlias:()=>resolveLeaderAlias,registerSendInboxCommands:()=>registerSendInboxCommands,printBridgeSuggestion:()=>printBridgeSuggestion,parseAtSyntax:()=>parseAtSyntax,isCliSender:()=>isCliSender,handleBroadcast:()=>handleBroadcast,fanoutBroadcastToNativeInboxes:()=>fanoutBroadcastToNativeInboxes,detectSenderIdentity:()=>detectSenderIdentity,checkSendScope:()=>checkSendScope});import{readFile as readFile7}from"fs/promises";import{homedir as homedir33}from"os";import{join as join47}from"path";async function getRegistry2(){if(!_registry)_registry=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));return _registry}async function getTaskService(){if(!_taskService)_taskService=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService}async function getTeamManager(){if(!_teamManager)_teamManager=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return _teamManager}async function getMailbox(){if(!_mailbox)_mailbox=await Promise.resolve().then(() => (init_mailbox(),exports_mailbox));return _mailbox}function isCliSender(sender){return sender==="cli"||sender.startsWith("cli:")}async function detectSenderIdentity(teamName){let envId=process.env.GENIE_AGENT_ID;if(envId&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(envId))return envId;let envName=process.env.GENIE_AGENT_NAME;if(envName)return envName;let paneId=process.env.TMUX_PANE;if(!paneId)return"cli";let registry=await getRegistry2(),worker=typeof registry.findByPane==="function"?await registry.findByPane(paneId):null;if(worker)return worker.role??worker.id;let resolvedTeam=teamName??process.env.GENIE_TEAM;if(resolvedTeam){let memberName=await findMemberByPane(resolvedTeam,paneId);if(memberName)return memberName}return"cli"}async function findMemberByPane(teamName,paneId){let configDir=process.env.CLAUDE_CONFIG_DIR??join47(homedir33(),".claude"),sanitized=teamName.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase(),cfgPath=join47(configDir,"teams",sanitized,"config.json");try{let raw=await readFile7(cfgPath,"utf-8");return(JSON.parse(raw).members??[]).find((m)=>m.tmuxPaneId===paneId)?.name??null}catch{return null}}function parseAtSyntax(recipient,defaultTeam){let atIdx=recipient.indexOf("@");if(atIdx===-1)return{recipient,team:defaultTeam};let role=recipient.slice(0,atIdx),team=recipient.slice(atIdx+1);if(!role||!team)return{recipient,team:defaultTeam};return{recipient:role,team}}async function resolveLeaderAlias(recipient,teamContext){if(recipient!=="team-lead")return recipient;if(!teamContext)return recipient;let leader=await(await getTeamManager()).resolveLeaderName(teamContext);if(!leader)throw Error(`Team "${teamContext}" has no leader; cannot resolve "team-lead". Use an explicit agent id or spawn the team leader first.`);return leader}async function checkSendScope(_repoPath,sender,recipient){if(isCliSender(sender))return null;let teams=await(await getTeamManager()).listTeams(),senderTeams=resolveSenderTeams(teams,sender);if(senderTeams.length===0)return null;for(let team of senderTeams)if(isRecipientInTeam(team,recipient))return null;let reachableChildren=resolveReachableChildren(teams,senderTeams);for(let child of reachableChildren){if(recipient===child.name)return null;if(isRecipientInTeam(child,recipient))return null}let teamNames=senderTeams.map((t)=>t.name).join(", ");return`Scope violation: "${recipient}" is not in sender's team(s): ${teamNames}`}function childReachbackAllowed(child,parent){if(parent.allowChildReachback?.some((prefix)=>child.name.startsWith(prefix)))return!0;return DEFAULT_REACHBACK_PREFIXES.some((prefix)=>child.name.startsWith(prefix))}function walkParentChain(teams,start,visited,out){let current=start,depth=0;while(current.parentTeam&&depth<PARENT_CHAIN_MAX_DEPTH){if(visited.has(current.parentTeam))return;let parent=teams.find((t)=>t.name===current.parentTeam);if(!parent)return;if(!childReachbackAllowed(current,parent))return;out.push(parent),visited.add(parent.name),current=parent,depth++}}function walkChildTeams(teams,parent,visited,out,depth){if(depth>=PARENT_CHAIN_MAX_DEPTH)return;for(let child of teams){if(visited.has(child.name))continue;if(child.parentTeam!==parent.name)continue;if(!childReachbackAllowed(child,parent))continue;out.push(child),visited.add(child.name),walkChildTeams(teams,child,visited,out,depth+1)}}function resolveReachableChildren(teams,senderTeams){let visited=new Set(senderTeams.map((t)=>t.name)),result2=[];for(let team of senderTeams)walkChildTeams(teams,team,visited,result2,0);return result2}function resolveSenderTeams(teams,sender){let direct=teams.filter((t)=>t.members.includes(sender)),visited=new Set(direct.map((t)=>t.name)),result2=[...direct];for(let team of direct)walkParentChain(teams,team,visited,result2);if(teams.some((t)=>t.leader===sender)){let envTeam=process.env.GENIE_TEAM;if(envTeam){let leaderTeam=teams.find((t)=>t.name===envTeam);if(leaderTeam&&!visited.has(leaderTeam.name))result2.push(leaderTeam),visited.add(leaderTeam.name),walkParentChain(teams,leaderTeam,visited,result2)}}return result2}async function suggestRelayLeader(sender){if(isCliSender(sender))return null;let teams=await(await getTeamManager()).listTeams(),reachable=resolveSenderTeams(teams,sender);if(reachable.length===0)return null;let target=reachable[0];return{leader:target.leader??target.name,team:target.name}}function isRecipientInTeam(team,recipient){if(team.members.includes(recipient)||recipient===team.leader)return!0;if(recipient.startsWith(`${team.name}-`)){let roleOnly=recipient.slice(team.name.length+1);if(team.members.includes(roleOnly))return!0}return!1}async function findAgentTeam(_repoPath,agentName){let teams=await(await getTeamManager()).listTeams(),memberTeam=teams.find((t)=>t.members.includes(agentName));if(memberTeam)return memberTeam;if(teams.some((t)=>t.leader===agentName)){let envTeam=process.env.GENIE_TEAM;if(envTeam)return teams.find((t)=>t.name===envTeam)??null;let leaderTeam=teams.find((t)=>t.leader===agentName);if(leaderTeam)return leaderTeam}return null}function localActor(name){return{actorType:"local",actorId:name}}async function resolveTeamName2(explicit,repoPath,from){if(explicit)return explicit;let name=(await findAgentTeam(repoPath,from))?.name??process.env.GENIE_TEAM;if(!name)console.error("Error: Could not auto-detect team. Use --team <name>."),process.exit(1);return name}async function handleInbox(agent,options){let ts3=await getTaskService(),resolvedAgent=agent??await detectSenderIdentity(),actor=localActor(resolvedAgent),conversations=await ts3.listConversations(actor);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log(`No conversations for "${resolvedAgent}".`);return}console.log(""),console.log(`INBOX: ${resolvedAgent}`),console.log("\u2500".repeat(60));for(let conv of conversations)await printConversationSummary(ts3,conv)}async function printConversationSummary(ts3,conv){let messages2=await ts3.getMessages(conv.id,{limit:1}),lastMsg=messages2.length>0?messages2[messages2.length-1]:null,name=conv.name??conv.id,type2=conv.type==="dm"?"DM":"Group",linked=conv.linkedEntity?` [${conv.linkedEntity}:${conv.linkedEntityId}]`:"",preview=lastMsg?truncate2(lastMsg.body,50):"(no messages)",time=lastMsg?formatTime(lastMsg.createdAt):"";if(console.log(` ${padRight(name,30)} ${padRight(type2,6)}${linked}`),lastMsg)console.log(` ${time} ${lastMsg.senderId}: ${preview}`);console.log("")}async function handleChatThread(messageId,options){let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),parentMsgId=Number(messageId),parentMsg=await ts3.getMessage(parentMsgId);if(!parentMsg)console.error(`Error: Message not found: ${messageId}`),process.exit(1);let conv=await ts3.findOrCreateConversation({type:"group",name:options.name??`Thread on message #${parentMsgId}`,parentMessageId:parentMsgId,createdBy:actor,members:[actor]});console.log(`Thread created: ${conv.id}`),console.log(` Parent message: #${parentMsgId} in ${parentMsg.conversationId}`),console.log(` Name: ${conv.name??"(unnamed)"}`)}function printConversationTable(conversations){console.log(` ${padRight("ID",20)} ${padRight("NAME",25)} ${padRight("TYPE",8)} ${padRight("LINKED",20)} UPDATED`),console.log(` ${"\u2500".repeat(80)}`);for(let c of conversations){let name=truncate2(c.name??"(unnamed)",23),linked=c.linkedEntity?`${c.linkedEntity}:${c.linkedEntityId}`:"-",updated=formatTime(c.updatedAt);console.log(` ${padRight(c.id,20)} ${padRight(name,25)} ${padRight(c.type,8)} ${padRight(linked,20)} ${updated}`)}console.log(`
|
|
1654
|
+
${conversations.length} conversation${conversations.length===1?"":"s"}`)}async function handleChatList(options){let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),conversations=await ts3.listConversations(actor);if(options.type)conversations=conversations.filter((c)=>c.type===options.type);if(options.linked)conversations=conversations.filter((c)=>c.linkedEntity===options.linked);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log("No conversations found.");return}printConversationTable(conversations)}async function handleChatRead(conversationId,options){let ts3=await getTaskService(),conv=await ts3.getConversation(conversationId);if(!conv)console.error(`Error: Conversation not found: ${conversationId}`),process.exit(1);let messages2=await ts3.getMessages(conversationId,{since:options.since,limit:Number(options.limit)||50});if(options.json){console.log(JSON.stringify(messages2,null,2));return}let name=conv.name??conversationId;if(messages2.length===0){console.log(`No messages in "${name}".`);return}console.log(""),console.log(`CHAT: ${name}`),console.log("\u2500".repeat(60));for(let msg of messages2){let time=formatTime(msg.createdAt),reply=msg.replyToId?` (reply to #${msg.replyToId})`:"";console.log(` [${time}] ${msg.senderId}: ${msg.body}${reply}`)}console.log("")}async function discoverCurrentTeam(nativeTeams,from,explicitTeam){if(explicitTeam)return explicitTeam;let discovered=await nativeTeams.discoverTeamName().catch(()=>null);if(discovered)return discovered;let registryMod=await getRegistry2(),senderId=await registryMod.resolveAgentId(from);if(!senderId)return null;return(await registryMod.get(senderId))?.team??null}async function deliverToTeam(nativeTeams,team,recipient,msg){let nativeName=await nativeTeams.resolveNativeMemberName(team,recipient);if(!nativeName)return!1;return await nativeTeams.writeNativeInbox(team,nativeName,msg),!0}async function bridgeToNativeInbox(from,recipient,body,explicitTeam){if(from===recipient)return!1;let nativeTeams=await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams)),nativeMsg={from,text:body,summary:body.length>50?`${body.substring(0,50)}...`:body,timestamp:new Date().toISOString(),color:"blue",read:!1},currentTeam=await discoverCurrentTeam(nativeTeams,from,explicitTeam);if(currentTeam&&await deliverToTeam(nativeTeams,currentTeam,recipient,nativeMsg))return!0;let allTeams=await nativeTeams.listTeams().catch(()=>[]);for(let team of allTeams){if(team===currentTeam)continue;if(await deliverToTeam(nativeTeams,team,recipient,nativeMsg))return!0}return console.warn(`[genie send] Native inbox bridge: could not find native team member for "${recipient}"`),!1}function quoteForShell(value){return`'${value.replace(/'/g,"'\\''")}'`}async function printBridgeSuggestion(sender,recipient,body,scopeError){let suggestion=await suggestRelayLeader(sender);if(console.error(`Scope violation: ${scopeError}`),!suggestion){console.error("No reachable leader found \u2014 sender is not bound to any team.");return}if(suggestion.leader===sender){console.error(`You are already the nearest reachable leader (${suggestion.leader}@${suggestion.team}) \u2014 no external relay path available.`);return}console.error(`Nearest reachable leader: ${suggestion.leader}@${suggestion.team}`),console.error("Relay manually via:"),console.error(` genie send ${quoteForShell(`[relay to ${recipient}] ${body}`)} --to ${suggestion.leader} --team ${suggestion.team}`)}function broadcastAgentName(agent){return agent.customName??agent.role??agent.id}function mergeBroadcastRosterEntry(bySanitized,sanitized,patch){if(!sanitized)return;let existing=bySanitized.get(sanitized);bySanitized.set(sanitized,{agent:existing?.agent??patch.agent,sanitized,inboxName:patch.inboxName??existing?.inboxName??sanitized,agentId:existing?.agentId??patch.agentId,nativeColor:existing?.nativeColor??patch.nativeColor,nativeActive:existing?.nativeActive??patch.nativeActive})}async function resolveBroadcastRoster(teamName,deps){let[agents,nativeConfig]=await Promise.all([deps.listAgents({team:teamName}).catch(()=>[]),deps.loadConfig(teamName).catch(()=>null)]),bySanitized=new Map;for(let agent of agents){let name=broadcastAgentName(agent),sanitized=deps.sanitizeTeamName(name);mergeBroadcastRosterEntry(bySanitized,sanitized,{agent:name,inboxName:sanitized,agentId:agent.id,nativeColor:agent.nativeColor})}for(let member of nativeConfig?.members??[]){let sanitized=deps.sanitizeTeamName(member.name);mergeBroadcastRosterEntry(bySanitized,sanitized,{agent:member.name,inboxName:member.name,nativeColor:member.color,nativeActive:member.isActive})}return[...bySanitized.values()]}function makeBroadcastNativeMessage(from,body,timestamp2,color2){return{from,text:body,summary:body.length>50?`${body.substring(0,50)}...`:body,timestamp:timestamp2,color:color2,read:!1}}async function broadcastSkipReason(entry2,deps){if(entry2.nativeActive===!1)return"offline";if(!entry2.agentId)return null;let state=await deps.getAgentEffectiveState(entry2.agentId).catch(()=>"offline");if(state==="offline")return"offline";if(state==="terminated")return"terminated";if(state==="error")return"dead";if(state==="done")return"done";return null}async function fanoutBroadcastToNativeInboxes(teamName,from,body,deps){let sender=deps.sanitizeTeamName(from),roster=await resolveBroadcastRoster(teamName,deps),timestamp2=(deps.now??(()=>new Date))().toISOString(),recipients=[];for(let entry2 of roster){if(entry2.sanitized===sender)continue;let skipReason=await broadcastSkipReason(entry2,deps);if(skipReason){recipients.push({agent:entry2.agent,delivered:!1,reason:skipReason});continue}try{await deps.writeNativeInbox(teamName,entry2.inboxName,makeBroadcastNativeMessage(from,body,timestamp2,entry2.nativeColor??"blue")),recipients.push({agent:entry2.agent,delivered:!0})}catch(err){recipients.push({agent:entry2.agent,delivered:!1,reason:err instanceof Error?err.message:String(err)})}}return recipients}async function handleBroadcast(body,options,deps={}){let ts3=deps.taskService??await getTaskService(),registry=deps.registry??await getRegistry2(),nativeTeams=deps.nativeTeams??await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams)),repoPath=deps.repoPath??process.cwd(),from=options.from??await detectSenderIdentity(options.team),teamName=await resolveTeamName2(options.team,repoPath,from),senderActor=localActor(from),conv=await ts3.findOrCreateConversation({type:"group",name:`Team: ${teamName}`,linkedEntity:"team",linkedEntityId:teamName,createdBy:senderActor,members:[senderActor]});await ts3.addMember(conv.id,senderActor);let msg=await ts3.sendMessage(conv.id,senderActor,body),recipients=await fanoutBroadcastToNativeInboxes(teamName,from,body,{listAgents:registry.listAgents,getAgentEffectiveState:registry.getAgentEffectiveState,loadConfig:nativeTeams.loadConfig,sanitizeTeamName:nativeTeams.sanitizeTeamName,writeNativeInbox:nativeTeams.writeNativeInbox,now:deps.now});try{await(deps.publishSubjectEvent??(await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events))).publishSubjectEvent)(repoPath,"genie.msg.broadcast",{kind:"message",agent:from,team:teamName,direction:"out",peer:teamName,text:body,data:{messageId:msg.id,conversationId:conv.id,from,team:teamName,recipients},source:"mailbox"})}catch{}let deliveredCount=recipients.filter((r)=>r.delivered).length;console.log(`Broadcast sent to team "${teamName}" (delivered to ${deliveredCount} of ${recipients.length} members).`),console.log(` Message ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`);for(let recipient of recipients)if(!recipient.delivered)console.log(` ${recipient.agent}: ${recipient.reason??"delivery failed"}`);return{messageId:msg.id,conversationId:conv.id,team:teamName,recipients}}async function handleSend(body,options){let ts3=await getTaskService(),mailbox=await getMailbox(),repoPath=process.cwd(),from=options.from??await detectSenderIdentity(options.team),parsed=parseAtSyntax(options.to,options.team);if(parsed.recipient==="team-lead"&&!parsed.team)console.error('Error: "team-lead" requires an explicit team scope. Use "team-lead@<team>" or --team <team>.'),process.exit(1);let to=await resolveLeaderAlias(parsed.recipient,parsed.team),registryMod=await getRegistry2(),teamScope=parsed.team??options.team??process.env.GENIE_TEAM,toAgentId=await registryMod.resolveAgentIdStrict(to,teamScope,options.to),scopeError=await checkSendScope(repoPath,from,toAgentId);if(scopeError){if(options.bridge){await printBridgeSuggestion(from,toAgentId,body,scopeError);return}console.error(`Error: ${scopeError}`),process.exit(1)}let senderActor=localActor(from),recipientActor=localActor(toAgentId),conv=await ts3.findOrCreateConversation({type:"dm",members:[senderActor,recipientActor],createdBy:senderActor});await ts3.addMember(conv.id,senderActor),await ts3.addMember(conv.id,recipientActor);let mailboxMessage=await mailbox.send(repoPath,from,toAgentId,body),msg=await ts3.sendMessage(conv.id,senderActor,body);try{let{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,`genie.msg.${to}`,{kind:"message",agent:from,direction:"out",peer:to,text:body,data:{messageId:msg.id,conversationId:conv.id,from,to},source:"mailbox"})}catch{}if(await bridgeToNativeInbox(from,to,body,teamScope).catch((err)=>{let reason=err instanceof Error?err.message:String(err);return console.warn(`[genie send] Native inbox bridge failed: ${reason}`),!1}))await mailbox.markDelivered(repoPath,toAgentId,mailboxMessage.id).catch(()=>{});console.log(`Message sent to "${to}".`),console.log(` ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`)}function registerSendInboxCommands(program2){program2.command("send <body>").description("Send a direct message to an agent (PG-backed)").option("--to <agent>","Recipient agent name (default: team leader)","team-lead").option("--from <sender>","Sender ID (auto-detected from context)").option("--team <name>","Explicit team context for sender/recipient resolution").option("--bridge","On scope violation, print an advisory + relay command instead of failing (exit 0)").addHelpText("after",`
|
|
1655
1655
|
Examples:
|
|
1656
1656
|
genie send 'start task #3' --to engineer # Message a specific agent
|
|
1657
1657
|
genie send 'status update' --to team-lead # Report to team lead
|
|
@@ -1817,7 +1817,7 @@ ${otherList}
|
|
|
1817
1817
|
`,await sql`
|
|
1818
1818
|
DELETE FROM task_actors WHERE task_id = ANY(${ids}) AND role = 'assignee'
|
|
1819
1819
|
`,ids.length}var GroupStatusSchema,GroupStateSchema,WishStateSchema,WishStateMismatchError;var init_wish_state=__esm(()=>{init_zod();init_db();GroupStatusSchema=exports_external.enum(["blocked","ready","in_progress","done"]),GroupStateSchema=exports_external.object({status:GroupStatusSchema,assignee:exports_external.string().optional(),dependsOn:exports_external.array(exports_external.string()).default([]),startedAt:exports_external.string().optional(),completedAt:exports_external.string().optional()}),WishStateSchema=exports_external.object({wish:exports_external.string(),groups:exports_external.record(exports_external.string(),GroupStateSchema),createdAt:exports_external.string(),updatedAt:exports_external.string()});WishStateMismatchError=class WishStateMismatchError extends Error{slug;added;removed;changed;constructor(slug,added,removed,changed){let lines=[`Wish "${slug}" group structure has changed since state was created.`];if(added.length>0)lines.push(` + added: ${added.join(", ")}`);if(removed.length>0)lines.push(` - removed: ${removed.join(", ")}`);if(changed.length>0)lines.push(` ~ changed deps: ${changed.join(", ")}`);lines.push(""),lines.push(`Run \`genie reset ${slug}\` to recreate state from the current WISH.md.`);super(lines.join(`
|
|
1820
|
-
`));this.name="WishStateMismatchError",this.slug=slug,this.added=added,this.removed=removed,this.changed=changed}}});var exports_protocol_router_spawn={};__export(exports_protocol_router_spawn,{spawnWorkerFromTemplate:()=>spawnWorkerFromTemplate,injectResumeContext:()=>injectResumeContext,_deps:()=>_deps4});import{exec as exec2}from"child_process";import{readFile as readFile9}from"fs/promises";import{join as join49}from"path";import{promisify as promisify2}from"util";async function resolveParentSession(_repoPath,team){let leaderName=await resolveLeaderName(team),sanitized=sanitizeTeamName(team),leaderAgent=await getAgentByName(leaderName,sanitized).catch(()=>null);if(leaderAgent){let decision=await shouldResume(leaderAgent.id).catch(()=>null);if(decision?.sessionId)return decision.sessionId}return await discoverClaudeParentSessionId()??`genie-${team}`}function buildSpawnParams(template,parentSessionId,spawnColor,resumeSessionId){let isClaude=template.provider==="claude"||template.provider==="claude-sdk",sessionName=template.role?`${template.team}-${template.role}`:void 0,newSessionId=isClaude&&!resumeSessionId?crypto.randomUUID():void 0,params={provider:template.provider,team:template.team,role:template.role,skill:template.skill,extraArgs:template.extraArgs,sessionId:newSessionId,resume:isClaude?resumeSessionId:void 0,name:sessionName};if(isClaude)params.nativeTeam={enabled:!0,parentSessionId,color:spawnColor,agentType:template.role??"general-purpose",agentName:template.role};return params}function buildFullCommand(launch){if(launch.env&&Object.keys(launch.env).length>0)return`env ${Object.entries(launch.env).map(([k,v])=>`${k}=${v}`).join(" ")} ${launch.command}`;return launch.command}async function generateWorkerId(team,role){let base=role?`${team}-${role}`:team;return(await list()).some((w)=>w.id===base)?`${base}-${crypto.randomUUID().slice(0,8)}`:base}async function terminateActiveExecutorIfRunning(agentId){let currentExec=await getCurrentExecutor(agentId);if(!currentExec||currentExec.state==="terminated"||currentExec.state==="done")return;let liveStates=new Set(["running","idle","working","permission","question"]);if(currentExec.tmuxPaneId&&liveStates.has(currentExec.state)&&await isPaneAlive(currentExec.tmuxPaneId)){recordAuditEvent("executor",currentExec.id,"tried_to_kill_live_executor",process.env.GENIE_AGENT_NAME??"cli",{agent_id:agentId,state:currentExec.state,pane_id:currentExec.tmuxPaneId,reason:"live_pane_guard"}).catch(()=>{});return}let providerImpl=getProvider(currentExec.provider);if(providerImpl)try{await providerImpl.terminate(currentExec)}catch{}await terminateActiveExecutor(agentId)}async function capturePanePid(paneId){try{let{stdout:pidOut}=await execAsync(genieTmuxCmd(`display -t '${paneId}' -p '#{pane_pid}'`)),parsed=Number.parseInt(pidOut.trim(),10);return parsed>0?parsed:null}catch{return null}}function resolveExecutorTransport(provider){if(provider==="codex")return"api";if(provider==="claude-sdk")return"process";return"tmux"}async function createExecutorForAutoSpawn(template,paneId,session,repoPath,effectiveSessionId,spawnColor,teamWindow){let agentName=template.role??"worker",agentIdentity=await findOrCreateAgent(agentName,template.team,template.role);await(await getConnection()).begin(async(tx)=>{await tx`SELECT pg_advisory_xact_lock(hashtext(${agentIdentity.id}))`,await terminateActiveExecutorIfRunning(agentIdentity.id);let pid=await capturePanePid(paneId),executor=await createExecutor(agentIdentity.id,template.provider,resolveExecutorTransport(template.provider),{pid,tmuxSession:session,tmuxPaneId:paneId,tmuxWindow:teamWindow?.windowName??null,tmuxWindowId:teamWindow?.windowId??null,claudeSessionId:effectiveSessionId??null,state:"spawning",repoPath,paneColor:spawnColor??null});await setCurrentExecutor(agentIdentity.id,executor.id)})}async function spawnPaneInSession(session,team,repoPath,fullCommand){let teamWindow=null;try{teamWindow=await ensureTeamWindow(session,team,repoPath)}catch{}let splitTarget=teamWindow?`-t '${teamWindow.windowId}'`:"",escapedCmd=fullCommand.replace(/'/g,"'\\''"),{stdout}=await execAsync(genieTmuxCmd(`split-window -d ${splitTarget} -P -F '#{pane_id}' '${escapedCmd}'`)),paneId=stdout.trim(),layoutTarget=`${session}:${teamWindow?.windowName??""}`;if(!teamWindow){let wins=await listWindows(session);layoutTarget=wins[0]?wins[0].id:`${session}:`}try{await execAsync(genieTmuxCmd(buildLayoutCommand(layoutTarget,resolveLayoutMode())))}catch{}return{paneId,teamWindow}}async function registerNativeTeamMember(team,agentName,template,paneId,repoPath,spawnColor,resumeSessionId){let now=new Date().toISOString();await registerNativeMember(team,{agentName,agentType:template.role??"general-purpose",color:spawnColor??"blue",tmuxPaneId:paneId,cwd:repoPath});let leaderInboxTarget;try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));leaderInboxTarget=await resolveLeaderName2(team)}catch{leaderInboxTarget=team}try{await _deps4.writeNativeInbox(team,leaderInboxTarget,{from:agentName,text:`Worker ${agentName} (${template.provider}) auto-spawned${resumeSessionId?" with --resume":""}. Ready for tasks.`,summary:`${agentName} auto-spawned`,timestamp:now,color:spawnColor??"blue",read:!1})}catch(err){let msg=err instanceof Error?err.message:String(err);console.warn(`[protocol-router] Native inbox write failed for team="${team}" target="${leaderInboxTarget}": ${msg}`)}}async function tryAutoBrain(workerId,repoPath){try{let brain=await import("@khal-os/brain");if(brain.autoBrain)await brain.autoBrain({agentId:workerId,workdir:repoPath})}catch{}}async function spawnWorkerFromTemplate(template,resumeSessionId){let repoPath=template.cwd??process.cwd(),team=template.team,parentSessionId=await resolveParentSession(repoPath,team);await ensureNativeTeam(team,`Genie team: ${team}`,parentSessionId);let spawnColor=await assignColor(team),params=buildSpawnParams(template,parentSessionId,spawnColor,resumeSessionId),launch=buildLaunchCommand(validateSpawnParams(params)),fullCommand=buildFullCommand(launch),workerId=await generateWorkerId(team,template.role),teamConfig=await getTeam(team),session=(Boolean(process.env.TMUX)?await getCurrentSessionName():null)??teamConfig?.tmuxSessionName??team,{paneId,teamWindow}=await spawnPaneInSession(session,team,repoPath,fullCommand),now=new Date().toISOString(),agentName=template.role??"worker",isClaude=template.provider==="claude"||template.provider==="claude-sdk",effectiveSessionId=resumeSessionId??params.sessionId,autoSpawnIdentity=await findOrCreateAgent(agentName,team,template.role),workerEntry={id:autoSpawnIdentity.id,paneId,session,provider:template.provider,transport:"tmux",role:template.role,skill:template.skill,team,customName:workerId,worktree:null,startedAt:now,state:"spawning",lastStateChange:now,repoPath,nativeTeamEnabled:isClaude,nativeAgentId:`${agentName}@${team}`,nativeColor:spawnColor,parentSessionId,window:teamWindow?.windowName,windowName:teamWindow?.windowName,windowId:teamWindow?.windowId};await register(workerEntry);try{await createExecutorForAutoSpawn(template,paneId,session,repoPath,effectiveSessionId,spawnColor,teamWindow)}catch{}if(await registerNativeTeamMember(team,agentName,template,paneId,repoPath,spawnColor,resumeSessionId),spawnColor)await applyPaneColor(paneId,spawnColor,teamWindow?.windowId);return await injectResumeContext(repoPath,autoSpawnIdentity.id,workerId,agentName,team),await tryAutoBrain(workerId,repoPath),{worker:workerEntry,paneId,workerId}}function extractGroupSection(content,groupName){let escaped=groupName.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),pattern=new RegExp(`^### Group ${escaped}:`,"m"),match=content.match(pattern);if(!match||match.index===void 0)return null;let start=match.index,nextBoundary=content.slice(start).slice(1).search(/^### Group \d|^---$/m),end=nextBoundary!==-1?start+1+nextBoundary:content.length;return content.slice(start,end).trim()}async function getRecentGitLog(repoPath,count=3){try{let{stdout}=await execAsync(`git -C '${repoPath}' log --oneline -${count} 2>/dev/null`);return stdout.trim()}catch{return""}}async function getGitStatus(repoPath){try{let{stdout}=await execAsync(`git -C '${repoPath}' status --short 2>/dev/null`);return stdout.trim()}catch{return""}}async function injectResumeContext(repoPath,agentId,workerId,agentName,_team){try{let match=await _deps4.findAnyGroupByAssignee(agentId,repoPath)??await _deps4.findAnyGroupByAssignee(workerId,repoPath)??await _deps4.findAnyGroupByAssignee(agentName,repoPath);if(!match)return;let{slug,groupName,group}=match,wishPath=join49(repoPath,".genie","wishes",slug,"WISH.md"),groupSection="";try{let wishContent=await readFile9(wishPath,"utf-8");groupSection=extractGroupSection(wishContent,groupName)??""}catch{}let gitLog=await getRecentGitLog(repoPath),gitStatus=await getGitStatus(repoPath),resumePrompt=[`RESUME CONTEXT: You were working on wish "${slug}", group "${groupName}".`,`Status: ${group.status}. Started at: ${group.startedAt??"unknown"}.`,`Wish file: .genie/wishes/${slug}/WISH.md`,"",groupSection?`Group section:
|
|
1820
|
+
`));this.name="WishStateMismatchError",this.slug=slug,this.added=added,this.removed=removed,this.changed=changed}}});var exports_protocol_router_spawn={};__export(exports_protocol_router_spawn,{spawnWorkerFromTemplate:()=>spawnWorkerFromTemplate,injectResumeContext:()=>injectResumeContext,_deps:()=>_deps4});import{exec as exec2}from"child_process";import{readFile as readFile9}from"fs/promises";import{join as join49}from"path";import{promisify as promisify2}from"util";async function resolveParentSession(_repoPath,team){let leaderName=await resolveLeaderName(team),sanitized=sanitizeTeamName(team),leaderAgent=leaderName?await getAgent(leaderName).catch(()=>null)??await getAgentByName(leaderName,sanitized).catch(()=>null):null;if(leaderAgent){let decision=await shouldResume(leaderAgent.id).catch(()=>null);if(decision?.sessionId)return decision.sessionId}return await discoverClaudeParentSessionId()??`genie-${team}`}function buildSpawnParams(template,parentSessionId,spawnColor,resumeSessionId){let isClaude=template.provider==="claude"||template.provider==="claude-sdk",sessionName=template.role?`${template.team}-${template.role}`:void 0,newSessionId=isClaude&&!resumeSessionId?crypto.randomUUID():void 0,params={provider:template.provider,team:template.team,role:template.role,skill:template.skill,extraArgs:template.extraArgs,sessionId:newSessionId,resume:isClaude?resumeSessionId:void 0,name:sessionName};if(isClaude)params.nativeTeam={enabled:!0,parentSessionId,color:spawnColor,agentType:template.role??"general-purpose",agentName:template.role};return params}function buildFullCommand(launch){if(launch.env&&Object.keys(launch.env).length>0)return`env ${Object.entries(launch.env).map(([k,v])=>`${k}=${v}`).join(" ")} ${launch.command}`;return launch.command}async function generateWorkerId(team,role){let base=role?`${team}-${role}`:team;return(await list()).some((w)=>w.id===base)?`${base}-${crypto.randomUUID().slice(0,8)}`:base}async function terminateActiveExecutorIfRunning(agentId){let currentExec=await getCurrentExecutor(agentId);if(!currentExec||currentExec.state==="terminated"||currentExec.state==="done")return;let liveStates=new Set(["running","idle","working","permission","question"]);if(currentExec.tmuxPaneId&&liveStates.has(currentExec.state)&&await isPaneAlive(currentExec.tmuxPaneId)){recordAuditEvent("executor",currentExec.id,"tried_to_kill_live_executor",process.env.GENIE_AGENT_NAME??"cli",{agent_id:agentId,state:currentExec.state,pane_id:currentExec.tmuxPaneId,reason:"live_pane_guard"}).catch(()=>{});return}let providerImpl=getProvider(currentExec.provider);if(providerImpl)try{await providerImpl.terminate(currentExec)}catch{}await terminateActiveExecutor(agentId)}async function capturePanePid(paneId){try{let{stdout:pidOut}=await execAsync(genieTmuxCmd(`display -t '${paneId}' -p '#{pane_pid}'`)),parsed=Number.parseInt(pidOut.trim(),10);return parsed>0?parsed:null}catch{return null}}function resolveExecutorTransport(provider){if(provider==="codex")return"api";if(provider==="claude-sdk")return"process";return"tmux"}async function createExecutorForAutoSpawn(template,paneId,session,repoPath,effectiveSessionId,spawnColor,teamWindow){let agentName=template.role??"worker",agentIdentity=await findOrCreateAgent(agentName,template.team,template.role);await(await getConnection()).begin(async(tx)=>{await tx`SELECT pg_advisory_xact_lock(hashtext(${agentIdentity.id}))`,await terminateActiveExecutorIfRunning(agentIdentity.id);let pid=await capturePanePid(paneId),executor=await createExecutor(agentIdentity.id,template.provider,resolveExecutorTransport(template.provider),{pid,tmuxSession:session,tmuxPaneId:paneId,tmuxWindow:teamWindow?.windowName??null,tmuxWindowId:teamWindow?.windowId??null,claudeSessionId:effectiveSessionId??null,state:"spawning",repoPath,paneColor:spawnColor??null});await setCurrentExecutor(agentIdentity.id,executor.id)})}async function spawnPaneInSession(session,team,repoPath,fullCommand){let teamWindow=null;try{teamWindow=await ensureTeamWindow(session,team,repoPath)}catch{}let splitTarget=teamWindow?`-t '${teamWindow.windowId}'`:"",escapedCmd=fullCommand.replace(/'/g,"'\\''"),{stdout}=await execAsync(genieTmuxCmd(`split-window -d ${splitTarget} -P -F '#{pane_id}' '${escapedCmd}'`)),paneId=stdout.trim(),layoutTarget=`${session}:${teamWindow?.windowName??""}`;if(!teamWindow){let wins=await listWindows(session);layoutTarget=wins[0]?wins[0].id:`${session}:`}try{await execAsync(genieTmuxCmd(buildLayoutCommand(layoutTarget,resolveLayoutMode())))}catch{}return{paneId,teamWindow}}async function registerNativeTeamMember(team,agentName,template,paneId,repoPath,spawnColor,resumeSessionId){let now=new Date().toISOString();await registerNativeMember(team,{agentName,agentType:template.role??"general-purpose",color:spawnColor??"blue",tmuxPaneId:paneId,cwd:repoPath});let leaderInboxTarget;try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));leaderInboxTarget=await resolveLeaderName2(team)??team}catch{leaderInboxTarget=team}try{await _deps4.writeNativeInbox(team,leaderInboxTarget,{from:agentName,text:`Worker ${agentName} (${template.provider}) auto-spawned${resumeSessionId?" with --resume":""}. Ready for tasks.`,summary:`${agentName} auto-spawned`,timestamp:now,color:spawnColor??"blue",read:!1})}catch(err){let msg=err instanceof Error?err.message:String(err);console.warn(`[protocol-router] Native inbox write failed for team="${team}" target="${leaderInboxTarget}": ${msg}`)}}async function tryAutoBrain(workerId,repoPath){try{let brain=await import("@khal-os/brain");if(brain.autoBrain)await brain.autoBrain({agentId:workerId,workdir:repoPath})}catch{}}async function spawnWorkerFromTemplate(template,resumeSessionId){let repoPath=template.cwd??process.cwd(),team=template.team,parentSessionId=await resolveParentSession(repoPath,team);await ensureNativeTeam(team,`Genie team: ${team}`,parentSessionId);let spawnColor=await assignColor(team),params=buildSpawnParams(template,parentSessionId,spawnColor,resumeSessionId),launch=buildLaunchCommand(validateSpawnParams(params)),fullCommand=buildFullCommand(launch),workerId=await generateWorkerId(team,template.role),teamConfig=await getTeam(team),session=(Boolean(process.env.TMUX)?await getCurrentSessionName():null)??teamConfig?.tmuxSessionName??team,{paneId,teamWindow}=await spawnPaneInSession(session,team,repoPath,fullCommand),now=new Date().toISOString(),agentName=template.role??"worker",isClaude=template.provider==="claude"||template.provider==="claude-sdk",effectiveSessionId=resumeSessionId??params.sessionId,autoSpawnIdentity=await findOrCreateAgent(agentName,team,template.role),workerEntry={id:autoSpawnIdentity.id,paneId,session,provider:template.provider,transport:"tmux",role:template.role,skill:template.skill,team,customName:workerId,worktree:null,startedAt:now,state:"spawning",lastStateChange:now,repoPath,nativeTeamEnabled:isClaude,nativeAgentId:`${agentName}@${team}`,nativeColor:spawnColor,parentSessionId,window:teamWindow?.windowName,windowName:teamWindow?.windowName,windowId:teamWindow?.windowId};await register(workerEntry);try{await createExecutorForAutoSpawn(template,paneId,session,repoPath,effectiveSessionId,spawnColor,teamWindow)}catch{}if(await registerNativeTeamMember(team,agentName,template,paneId,repoPath,spawnColor,resumeSessionId),spawnColor)await applyPaneColor(paneId,spawnColor,teamWindow?.windowId);return await injectResumeContext(repoPath,autoSpawnIdentity.id,workerId,agentName,team),await tryAutoBrain(workerId,repoPath),{worker:workerEntry,paneId,workerId}}function extractGroupSection(content,groupName){let escaped=groupName.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),pattern=new RegExp(`^### Group ${escaped}:`,"m"),match=content.match(pattern);if(!match||match.index===void 0)return null;let start=match.index,nextBoundary=content.slice(start).slice(1).search(/^### Group \d|^---$/m),end=nextBoundary!==-1?start+1+nextBoundary:content.length;return content.slice(start,end).trim()}async function getRecentGitLog(repoPath,count=3){try{let{stdout}=await execAsync(`git -C '${repoPath}' log --oneline -${count} 2>/dev/null`);return stdout.trim()}catch{return""}}async function getGitStatus(repoPath){try{let{stdout}=await execAsync(`git -C '${repoPath}' status --short 2>/dev/null`);return stdout.trim()}catch{return""}}async function injectResumeContext(repoPath,agentId,workerId,agentName,_team){try{let match=await _deps4.findAnyGroupByAssignee(agentId,repoPath)??await _deps4.findAnyGroupByAssignee(workerId,repoPath)??await _deps4.findAnyGroupByAssignee(agentName,repoPath);if(!match)return;let{slug,groupName,group}=match,wishPath=join49(repoPath,".genie","wishes",slug,"WISH.md"),groupSection="";try{let wishContent=await readFile9(wishPath,"utf-8");groupSection=extractGroupSection(wishContent,groupName)??""}catch{}let gitLog=await getRecentGitLog(repoPath),gitStatus=await getGitStatus(repoPath),resumePrompt=[`RESUME CONTEXT: You were working on wish "${slug}", group "${groupName}".`,`Status: ${group.status}. Started at: ${group.startedAt??"unknown"}.`,`Wish file: .genie/wishes/${slug}/WISH.md`,"",groupSection?`Group section:
|
|
1821
1821
|
${groupSection}`:"","",gitLog?`Last git log:
|
|
1822
1822
|
${gitLog}`:"","",gitStatus?`Uncommitted changes:
|
|
1823
1823
|
${gitStatus}`:"","","Pick up where you left off. Read the wish file for full context."].filter(Boolean).join(`
|
|
@@ -1856,7 +1856,7 @@ ${after}
|
|
|
1856
1856
|
|
|
1857
1857
|
${desired}
|
|
1858
1858
|
`:`${desired}
|
|
1859
|
-
`;if(existing.trim()===candidate.trim())return!1;return await mkdir6(codexHomeDir(),{recursive:!0}),await writeFile7(path3,candidate),!0}async function codexHooksInjected(){let path3=codexConfigPath();if(!existsSync42(path3))return!1;try{let content=await readFile10(path3,"utf-8");return content.includes(BEGIN_MARKER)&&content.includes(END_MARKER)}catch{return!1}}var DISPATCH_TIMEOUT2=15,CODEX_DISPATCHED_EVENTS,BEGIN_MARKER="# === GENIE HOOK BRIDGE BEGIN ===",END_MARKER="# === GENIE HOOK BRIDGE END ===";var init_codex_inject=__esm(()=>{init_inject();init_types2();CODEX_DISPATCHED_EVENTS=Object.keys(CODEX_DISPATCHED_EVENT_MATCHERS)});var exports_idle_timeout={};__export(exports_idle_timeout,{suspendWorker:()=>suspendWorker,getIdleTimeoutMs:()=>getIdleTimeoutMs,checkIdleWorkers:()=>checkIdleWorkers,WATCHDOG_POLL_INTERVAL_MS:()=>WATCHDOG_POLL_INTERVAL_MS});function getIdleTimeoutMs(){let env=process.env.GENIE_IDLE_TIMEOUT_MS;if(env!==void 0){if(env==="")return DEFAULT_IDLE_TIMEOUT_MS;let parsed=Number(env);if(!Number.isNaN(parsed)&&parsed>=0)return parsed}return DEFAULT_IDLE_TIMEOUT_MS}async function suspendWorker(executorId,deps=defaultDeps3){let executor=(await deps.listExecutors()).find((e)=>e.id===executorId);if(!executor)return!1;if(executor.state==="terminated")return!0;if(executor.tmuxPaneId)try{await deps.executeTmux(`kill-pane -t '${executor.tmuxPaneId}'`)}catch{}return await deps.terminateExecutor(executorId),!0}async function checkIdleWorkers(deps=defaultDeps3){let timeoutMs=getIdleTimeoutMs();if(timeoutMs===0)return[];let executors=await deps.listExecutors(),suspended=[];for(let e of executors){if(e.state!=="idle")continue;if(Date.now()-new Date(e.updatedAt).getTime()<timeoutMs)continue;if(e.tmuxPaneId){if(!await deps.isPaneAlive(e.tmuxPaneId)){await deps.terminateExecutor(e.id),suspended.push(e.id);continue}}if(await suspendWorker(e.id,deps))suspended.push(e.id)}return suspended}var defaultDeps3,DEFAULT_IDLE_TIMEOUT_MS=1800000,WATCHDOG_POLL_INTERVAL_MS=60000;var init_idle_timeout=__esm(()=>{init_executor_registry();init_tmux();defaultDeps3={listExecutors:()=>listExecutors(),terminateExecutor,updateExecutorState,executeTmux:executeTmux2,isPaneAlive}});var exports_agents={};__export(exports_agents,{tryAutoRegisterAgent:()=>tryAutoRegisterAgent,resolveTeamName:()=>resolveTeamName3,resolveSpawnIdentity:()=>resolveSpawnIdentity,resolveAgentWorkingDir:()=>resolveAgentWorkingDir,resolveAgentForSpawn:()=>resolveAgentForSpawn,rejectDuplicateRole:()=>rejectDuplicateRole,recoverSurgery:()=>recoverSurgery,pickParallelShortId:()=>pickParallelShortId,killAgentWithDedup:()=>killAgentWithDedup,handleWorkerStop:()=>handleWorkerStop,handleWorkerSpawn:()=>handleWorkerSpawn,handleWorkerResume:()=>handleWorkerResume,handleWorkerRecover:()=>handleWorkerRecover,handleWorkerKill:()=>handleWorkerKill,handleLsCommand:()=>handleLsCommand,findDeadResumable:()=>findDeadResumable,buildWorkerStatusMap:()=>buildWorkerStatusMap,buildResumeContext:()=>buildResumeContext,buildInitialSplitWindowCommand:()=>buildInitialSplitWindowCommand,buildFullResumeParams:()=>buildFullResumeParams,buildDirectoryPermissionSpawnParams:()=>buildDirectoryPermissionSpawnParams,_spawnAutoSyncDeps:()=>_spawnAutoSyncDeps,SpawnPaneVanishedError:()=>SpawnPaneVanishedError,ResumePaneVanishedError:()=>ResumePaneVanishedError,RecoverAgentNotFoundError:()=>RecoverAgentNotFoundError,OwnerSpawnCollisionError:()=>OwnerSpawnCollisionError,AgentReadinessTimeoutError:()=>AgentReadinessTimeoutError});import{existsSync as existsSync43,readFileSync as readFileSync29}from"fs";import{isAbsolute as isAbsolute2,join as join51,relative,resolve as resolvePath}from"path";async function isPaneAliveOrDead(paneId){try{return await isPaneAlive(paneId)}catch(err){let message=err instanceof Error?err.message:String(err);if(err instanceof TmuxUnreachableError||message.includes("no server running")||message.includes("server exited")||message.includes("error connecting"))return!1;throw err}}async function resolveTeamLeaderName(teamNameOrDefault){return resolveLeaderName(teamNameOrDefault)}function isRelayAlive(pidFile){let{readFileSync:readFileSync30,existsSync:existsSync44}=__require("fs");if(!existsSync44(pidFile))return!1;try{let pid=Number.parseInt(readFileSync30(pidFile,"utf-8").trim());if(pid>0)return process.kill(pid,0),!0}catch{}return!1}async function ensureOtelRelay(team){let{writeFileSync:writeFileSync17,mkdirSync:mkdirSync19}=__require("fs"),{join:join52}=__require("path"),{homedir:homedir35}=__require("os"),relayDir=join52(homedir35(),".genie","relay");mkdirSync19(relayDir,{recursive:!0});let pidFile=join52(relayDir,"otel-relay.pid"),scriptFile=join52(relayDir,"otel-relay.mjs");if(isRelayAlive(pidFile))return!0;let inboxDir=join52(process.env.CLAUDE_CONFIG_DIR??join52(homedir35(),".claude"),"teams",team,"inboxes"),leaderInboxName=sanitizeTeamName(await resolveTeamLeaderName(team)),escapedRelayDir=relayDir.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),escapedInboxDir=inboxDir.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),escapedPidFile=pidFile.replace(/\\/g,"\\\\").replace(/'/g,"\\'");try{writeFileSync17(scriptFile,`import { createServer } from 'http';
|
|
1859
|
+
`;if(existing.trim()===candidate.trim())return!1;return await mkdir6(codexHomeDir(),{recursive:!0}),await writeFile7(path3,candidate),!0}async function codexHooksInjected(){let path3=codexConfigPath();if(!existsSync42(path3))return!1;try{let content=await readFile10(path3,"utf-8");return content.includes(BEGIN_MARKER)&&content.includes(END_MARKER)}catch{return!1}}var DISPATCH_TIMEOUT2=15,CODEX_DISPATCHED_EVENTS,BEGIN_MARKER="# === GENIE HOOK BRIDGE BEGIN ===",END_MARKER="# === GENIE HOOK BRIDGE END ===";var init_codex_inject=__esm(()=>{init_inject();init_types2();CODEX_DISPATCHED_EVENTS=Object.keys(CODEX_DISPATCHED_EVENT_MATCHERS)});var exports_idle_timeout={};__export(exports_idle_timeout,{suspendWorker:()=>suspendWorker,getIdleTimeoutMs:()=>getIdleTimeoutMs,checkIdleWorkers:()=>checkIdleWorkers,WATCHDOG_POLL_INTERVAL_MS:()=>WATCHDOG_POLL_INTERVAL_MS});function getIdleTimeoutMs(){let env=process.env.GENIE_IDLE_TIMEOUT_MS;if(env!==void 0){if(env==="")return DEFAULT_IDLE_TIMEOUT_MS;let parsed=Number(env);if(!Number.isNaN(parsed)&&parsed>=0)return parsed}return DEFAULT_IDLE_TIMEOUT_MS}async function suspendWorker(executorId,deps=defaultDeps3){let executor=(await deps.listExecutors()).find((e)=>e.id===executorId);if(!executor)return!1;if(executor.state==="terminated")return!0;if(executor.tmuxPaneId)try{await deps.executeTmux(`kill-pane -t '${executor.tmuxPaneId}'`)}catch{}return await deps.terminateExecutor(executorId),!0}async function checkIdleWorkers(deps=defaultDeps3){let timeoutMs=getIdleTimeoutMs();if(timeoutMs===0)return[];let executors=await deps.listExecutors(),suspended=[];for(let e of executors){if(e.state!=="idle")continue;if(Date.now()-new Date(e.updatedAt).getTime()<timeoutMs)continue;if(e.tmuxPaneId){if(!await deps.isPaneAlive(e.tmuxPaneId)){await deps.terminateExecutor(e.id),suspended.push(e.id);continue}}if(await suspendWorker(e.id,deps))suspended.push(e.id)}return suspended}var defaultDeps3,DEFAULT_IDLE_TIMEOUT_MS=1800000,WATCHDOG_POLL_INTERVAL_MS=60000;var init_idle_timeout=__esm(()=>{init_executor_registry();init_tmux();defaultDeps3={listExecutors:()=>listExecutors(),terminateExecutor,updateExecutorState,executeTmux:executeTmux2,isPaneAlive}});var exports_agents={};__export(exports_agents,{tryAutoRegisterAgent:()=>tryAutoRegisterAgent,resolveTeamName:()=>resolveTeamName3,resolveSpawnIdentity:()=>resolveSpawnIdentity,resolveAgentWorkingDir:()=>resolveAgentWorkingDir,resolveAgentForSpawn:()=>resolveAgentForSpawn,rejectDuplicateRole:()=>rejectDuplicateRole,recoverSurgery:()=>recoverSurgery,pickParallelShortId:()=>pickParallelShortId,killAgentWithDedup:()=>killAgentWithDedup,handleWorkerStop:()=>handleWorkerStop,handleWorkerSpawn:()=>handleWorkerSpawn,handleWorkerResume:()=>handleWorkerResume,handleWorkerRecover:()=>handleWorkerRecover,handleWorkerKill:()=>handleWorkerKill,handleLsCommand:()=>handleLsCommand,findDeadResumable:()=>findDeadResumable,buildWorkerStatusMap:()=>buildWorkerStatusMap,buildResumeContext:()=>buildResumeContext,buildInitialSplitWindowCommand:()=>buildInitialSplitWindowCommand,buildFullResumeParams:()=>buildFullResumeParams,buildDirectoryPermissionSpawnParams:()=>buildDirectoryPermissionSpawnParams,_spawnAutoSyncDeps:()=>_spawnAutoSyncDeps,SpawnPaneVanishedError:()=>SpawnPaneVanishedError,ResumePaneVanishedError:()=>ResumePaneVanishedError,RecoverAgentNotFoundError:()=>RecoverAgentNotFoundError,OwnerSpawnCollisionError:()=>OwnerSpawnCollisionError,AgentReadinessTimeoutError:()=>AgentReadinessTimeoutError});import{existsSync as existsSync43,readFileSync as readFileSync29}from"fs";import{isAbsolute as isAbsolute2,join as join51,relative,resolve as resolvePath}from"path";async function isPaneAliveOrDead(paneId){try{return await isPaneAlive(paneId)}catch(err){let message=err instanceof Error?err.message:String(err);if(err instanceof TmuxUnreachableError||message.includes("no server running")||message.includes("server exited")||message.includes("error connecting"))return!1;throw err}}async function resolveTeamLeaderName(teamNameOrDefault){return await resolveLeaderName(teamNameOrDefault)??teamNameOrDefault}function isRelayAlive(pidFile){let{readFileSync:readFileSync30,existsSync:existsSync44}=__require("fs");if(!existsSync44(pidFile))return!1;try{let pid=Number.parseInt(readFileSync30(pidFile,"utf-8").trim());if(pid>0)return process.kill(pid,0),!0}catch{}return!1}async function ensureOtelRelay(team){let{writeFileSync:writeFileSync17,mkdirSync:mkdirSync19}=__require("fs"),{join:join52}=__require("path"),{homedir:homedir35}=__require("os"),relayDir=join52(homedir35(),".genie","relay");mkdirSync19(relayDir,{recursive:!0});let pidFile=join52(relayDir,"otel-relay.pid"),scriptFile=join52(relayDir,"otel-relay.mjs");if(isRelayAlive(pidFile))return!0;let inboxDir=join52(process.env.CLAUDE_CONFIG_DIR??join52(homedir35(),".claude"),"teams",team,"inboxes"),leaderInboxName=sanitizeTeamName(await resolveTeamLeaderName(team)),escapedRelayDir=relayDir.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),escapedInboxDir=inboxDir.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),escapedPidFile=pidFile.replace(/\\/g,"\\\\").replace(/'/g,"\\'");try{writeFileSync17(scriptFile,`import { createServer } from 'http';
|
|
1860
1860
|
import { execSync } from 'child_process';
|
|
1861
1861
|
import { readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync, statSync } from 'fs';
|
|
1862
1862
|
import { createHash } from 'crypto';
|
|
@@ -2132,7 +2132,7 @@ server.listen(PORT, '127.0.0.1', () => {
|
|
|
2132
2132
|
process.on('SIGTERM', () => { server.close(); process.exit(0); });
|
|
2133
2133
|
process.on('SIGINT', () => { server.close(); process.exit(0); });
|
|
2134
2134
|
`,{mode:420});let{spawn:spawnChild}=__require("child_process");spawnChild("node",[scriptFile],{detached:!0,stdio:"ignore"}).unref();for(let i2=0;i2<30;i2++)if(await new Promise((r)=>setTimeout(r,100)),isRelayAlive(pidFile))return!0;return!1}catch{return!1}}async function generateWorkerId2(_team,_role){return crypto.randomUUID()}async function capturePanePid2(paneId){if(paneId==="inline")return null;try{let{execSync:execSync10}=__require("child_process"),output=execSync10(genieTmuxCmd(`display -t '${paneId}' -p '#{pane_pid}'`),{encoding:"utf-8"}).trim(),pid=Number.parseInt(output,10);return pid>0?pid:null}catch{return null}}function validateSpawnedPane(paneId,expectedPid){if(paneId==="inline")return;let{execSync:execSync10}=__require("child_process"),panes;try{panes=execSync10(genieTmuxCmd("list-panes -a -F '#{pane_id}'"),{encoding:"utf-8"})}catch{throw new SpawnPaneVanishedError(paneId,expectedPid,"tmux_query_failed")}if(!panes.split(`
|
|
2135
|
-
`).map((line)=>line.trim()).includes(paneId))throw new SpawnPaneVanishedError(paneId,expectedPid,"pane_not_in_list");if(expectedPid!==null&&expectedPid>0)try{process.kill(expectedPid,0)}catch(err){if(err.code==="ESRCH")throw new SpawnPaneVanishedError(paneId,expectedPid,"pid_dead")}}function resolveExecutorTransport2(provider,spawnTransport){if(provider==="codex")return"api";if(provider==="claude-sdk")return"process";return spawnTransport==="inline"?"process":"tmux"}async function terminateActiveExecutorWithCleanup(agentIdentityId){try{let currentExec=await getCurrentExecutor(agentIdentityId);if(!currentExec||currentExec.state==="terminated"||currentExec.state==="done")return;let provider=getProvider(currentExec.provider);if(provider)try{await provider.terminate(currentExec)}catch{}await terminateActiveExecutor(agentIdentityId)}catch{}}async function createAndLinkExecutor2(agentIdentityId,provider,transport,opts){try{let executor=await createExecutor(agentIdentityId,provider,transport,opts);return await setCurrentExecutor(agentIdentityId,executor.id),executor.id}catch{return null}}async function registerSpawnWorker(ctx,paneId,windowInfo){let nt=ctx.validated.nativeTeam;if(!ctx.agentIdentityId)throw Error(`registerSpawnWorker: missing agentIdentityId for workerId=${JSON.stringify(ctx.workerId)} (team=${JSON.stringify(ctx.validated.team)}). The spawn pipeline MUST call registry.findOrCreateAgent before register() \u2014 see wish retire-session-names-id-only Group 3.`);let workerEntry={id:ctx.agentIdentityId,paneId,session:ctx.validated.team,provider:ctx.validated.provider,transport:ctx.transport,role:ctx.validated.role??ctx.workerId,skill:ctx.validated.skill,team:ctx.validated.team,customName:ctx.workerId,worktree:null,startedAt:ctx.now,state:"spawning",lastStateChange:ctx.now,repoPath:ctx.cwd,nativeTeamEnabled:nt?.enabled??!1,nativeAgentId:`${ctx.agentName}@${ctx.validated.team}`,nativeColor:nt?.color??ctx.spawnColor,parentSessionId:nt?.parentSessionId??ctx.parentSessionId,window:windowInfo?.windowName,windowName:windowInfo?.windowName,windowId:windowInfo?.windowId,autoResume:ctx.autoResume===!1?!1:void 0,resumeAttempts:0};await register(workerEntry);let role=ctx.validated.role??ctx.agentName;if(role!=="council")try{await hireAgent(ctx.validated.team,role)}catch{}return workerEntry}async function notifySpawnJoin(ctx,paneId){let nt=ctx.validated.nativeTeam;if(!nt?.enabled)return;await registerNativeMember(ctx.validated.team,{agentName:ctx.agentName,agentType:nt.agentType??ctx.validated.role??"general-purpose",color:nt.color??ctx.spawnColor??"blue",tmuxPaneId:paneId,cwd:ctx.cwd,planModeRequired:nt.planModeRequired});let leaderName=await resolveTeamLeaderName(ctx.validated.team);await writeNativeInbox(ctx.validated.team,leaderName,{from:ctx.agentName,text:`Worker ${ctx.agentName} (${ctx.validated.provider}) joined team ${ctx.validated.team}. cwd: ${ctx.cwd}. Ready for tasks.`,summary:`${ctx.agentName} (${ctx.validated.provider}) joined`,timestamp:new Date().toISOString(),color:nt.color??ctx.spawnColor??"blue",read:!1})}function registerOtelRelayPane(workerId,paneId,agentName,spawnColor,repoPath){let{writeFileSync:wfs}=__require("fs"),{join:pjoin}=__require("path"),{homedir:hdir}=__require("os"),rd=pjoin(hdir(),".genie","relay");wfs(pjoin(rd,`${workerId}-pane`),paneId),wfs(pjoin(rd,`${workerId}-meta`),JSON.stringify({agent:agentName,color:spawnColor,repoPath}))}function printSpawnInfo(ctx,paneId,workerEntry){let nt=ctx.validated.nativeTeam;if(console.log(`Agent "${ctx.workerId}" spawned.`),console.log(` Provider: ${ctx.launch.provider}`),console.log(` Command: ${ctx.fullCommand}`),console.log(` Team: ${ctx.validated.team}`),console.log(` Pane: ${paneId}`),ctx.validated.role)console.log(` Role: ${ctx.validated.role}`);if(ctx.executorId)console.log(` Executor: ${ctx.executorId}`);if(ctx.validated.skill)console.log(` Skill: ${ctx.validated.skill}`);if(ctx.claudeSessionId)console.log(` Session: ${ctx.claudeSessionId}`);if(console.log(` Layout: ${ctx.layoutMode}`),nt?.enabled)console.log(" Native: enabled"),console.log(` AgentID: ${workerEntry.nativeAgentId}`),console.log(` Color: ${nt.color}`);if(ctx.otelRelayActive)console.log(` OTel: relay on port ${OTEL_RELAY_PORT}`)}function shellQuote2(arg){return`'${arg.replace(/'/g,"'\\''")}'`}function writeTmuxLaunchScript(workerId,fullCommand){let{chmodSync:chmodSync4,mkdirSync:mkdirSync19,writeFileSync:writeFileSync17}=__require("fs"),{join:join52}=__require("path"),{homedir:homedir35}=__require("os"),dir=join52(homedir35(),".genie","spawn-scripts");mkdirSync19(dir,{recursive:!0});let safeId=workerId.replace(/[^a-zA-Z0-9._-]/g,"-"),scriptPath=join52(dir,`${safeId}-${Date.now().toString(36)}.sh`);return writeFileSync17(scriptPath,`#!/bin/sh
|
|
2135
|
+
`).map((line)=>line.trim()).includes(paneId))throw new SpawnPaneVanishedError(paneId,expectedPid,"pane_not_in_list");if(expectedPid!==null&&expectedPid>0)try{process.kill(expectedPid,0)}catch(err){if(err.code==="ESRCH")throw new SpawnPaneVanishedError(paneId,expectedPid,"pid_dead")}}function resolveExecutorTransport2(provider,spawnTransport){if(provider==="codex")return"api";if(provider==="claude-sdk")return"process";return spawnTransport==="inline"?"process":"tmux"}async function terminateActiveExecutorWithCleanup(agentIdentityId){try{let currentExec=await getCurrentExecutor(agentIdentityId);if(!currentExec||currentExec.state==="terminated"||currentExec.state==="done")return;let provider=getProvider(currentExec.provider);if(provider)try{await provider.terminate(currentExec)}catch{}await terminateActiveExecutor(agentIdentityId)}catch{}}async function createAndLinkExecutor2(agentIdentityId,provider,transport,opts){try{let executor=await createExecutor(agentIdentityId,provider,transport,opts);return await setCurrentExecutor(agentIdentityId,executor.id),executor.id}catch{return null}}async function registerSpawnWorker(ctx,paneId,windowInfo){let nt=ctx.validated.nativeTeam;if(!ctx.agentIdentityId)throw Error(`registerSpawnWorker: missing agentIdentityId for workerId=${JSON.stringify(ctx.workerId)} (team=${JSON.stringify(ctx.validated.team)}). The spawn pipeline MUST call registry.findOrCreateAgent before register() \u2014 see wish retire-session-names-id-only Group 3.`);let workerEntry={id:ctx.agentIdentityId,paneId,session:ctx.validated.team,provider:ctx.validated.provider,transport:ctx.transport,role:ctx.validated.role??ctx.workerId,skill:ctx.validated.skill,team:ctx.validated.team,customName:ctx.workerId,worktree:null,startedAt:ctx.now,state:"spawning",lastStateChange:ctx.now,repoPath:ctx.cwd,nativeTeamEnabled:nt?.enabled??!1,nativeAgentId:`${ctx.agentName}@${ctx.validated.team}`,nativeColor:nt?.color??ctx.spawnColor,parentSessionId:nt?.parentSessionId??ctx.parentSessionId,window:windowInfo?.windowName,windowName:windowInfo?.windowName,windowId:windowInfo?.windowId,autoResume:ctx.autoResume===!1?!1:void 0,resumeAttempts:0};await register(workerEntry);let role=ctx.validated.role??ctx.agentName;if(role!=="council")try{await hireAgent(ctx.validated.team,role)}catch(err){if(err instanceof Error&&err.message.includes("not found"))return workerEntry;throw err}return workerEntry}async function notifySpawnJoin(ctx,paneId){let nt=ctx.validated.nativeTeam;if(!nt?.enabled)return;await registerNativeMember(ctx.validated.team,{agentName:ctx.agentName,agentType:nt.agentType??ctx.validated.role??"general-purpose",color:nt.color??ctx.spawnColor??"blue",tmuxPaneId:paneId,cwd:ctx.cwd,planModeRequired:nt.planModeRequired});let leaderName=await resolveTeamLeaderName(ctx.validated.team);await writeNativeInbox(ctx.validated.team,leaderName,{from:ctx.agentName,text:`Worker ${ctx.agentName} (${ctx.validated.provider}) joined team ${ctx.validated.team}. cwd: ${ctx.cwd}. Ready for tasks.`,summary:`${ctx.agentName} (${ctx.validated.provider}) joined`,timestamp:new Date().toISOString(),color:nt.color??ctx.spawnColor??"blue",read:!1})}function registerOtelRelayPane(workerId,paneId,agentName,spawnColor,repoPath){let{writeFileSync:wfs}=__require("fs"),{join:pjoin}=__require("path"),{homedir:hdir}=__require("os"),rd=pjoin(hdir(),".genie","relay");wfs(pjoin(rd,`${workerId}-pane`),paneId),wfs(pjoin(rd,`${workerId}-meta`),JSON.stringify({agent:agentName,color:spawnColor,repoPath}))}function printSpawnInfo(ctx,paneId,workerEntry){let nt=ctx.validated.nativeTeam;if(console.log(`Agent "${ctx.workerId}" spawned.`),console.log(` Provider: ${ctx.launch.provider}`),console.log(` Command: ${ctx.fullCommand}`),console.log(` Team: ${ctx.validated.team}`),console.log(` Pane: ${paneId}`),ctx.validated.role)console.log(` Role: ${ctx.validated.role}`);if(ctx.executorId)console.log(` Executor: ${ctx.executorId}`);if(ctx.validated.skill)console.log(` Skill: ${ctx.validated.skill}`);if(ctx.claudeSessionId)console.log(` Session: ${ctx.claudeSessionId}`);if(console.log(` Layout: ${ctx.layoutMode}`),nt?.enabled)console.log(" Native: enabled"),console.log(` AgentID: ${workerEntry.nativeAgentId}`),console.log(` Color: ${nt.color}`);if(ctx.otelRelayActive)console.log(` OTel: relay on port ${OTEL_RELAY_PORT}`)}function shellQuote2(arg){return`'${arg.replace(/'/g,"'\\''")}'`}function writeTmuxLaunchScript(workerId,fullCommand){let{chmodSync:chmodSync4,mkdirSync:mkdirSync19,writeFileSync:writeFileSync17}=__require("fs"),{join:join52}=__require("path"),{homedir:homedir35}=__require("os"),dir=join52(homedir35(),".genie","spawn-scripts");mkdirSync19(dir,{recursive:!0});let safeId=workerId.replace(/[^a-zA-Z0-9._-]/g,"-"),scriptPath=join52(dir,`${safeId}-${Date.now().toString(36)}.sh`);return writeFileSync17(scriptPath,`#!/bin/sh
|
|
2136
2136
|
exec ${fullCommand}
|
|
2137
2137
|
`,{mode:448}),chmodSync4(scriptPath,448),scriptPath}function buildInitialSplitWindowCommand(windowId,cwd,fullCommand){let cwdFlag=cwd?` -c ${shellQuote2(cwd)}`:"";return genieTmuxCmd(`split-window -d -t ${shellQuote2(windowId)}${cwdFlag} -P -F '#{pane_id}' ${shellQuote2(fullCommand)}`)}async function resolveSpawnTeamWindow(team,cwd,sessionOverride){if(!team)return null;try{let sessionName=sessionOverride;if(!sessionName)sessionName=(await getTeam(team))?.tmuxSessionName;if(!sessionName)sessionName=await resolveRepoSession(cwd);if(!sessionName)sessionName=team;return await ensureTeamWindow(sessionName,team,cwd)}catch(err){return console.warn(`Warning: could not ensure team window for "${team}": ${err instanceof Error?err.message:err}`),null}}async function autoConfirmTrustPrompt(paneId){let{execSync:execSync10}=__require("child_process"),maxWaitMs=15000,pollMs=500,start=Date.now();while(Date.now()-start<15000){await new Promise((r)=>setTimeout(r,500));let content;try{content=execSync10(genieTmuxCmd(`capture-pane -t '${paneId}' -p`),{encoding:"utf-8"})}catch{return}if(content.includes("trust this folder")||content.includes("Quick safety check")){try{execSync10(genieTmuxCmd(`send-keys -t '${paneId}' Enter`),{encoding:"utf-8"})}catch{}return}if(content.includes("Claude Code")||content.includes("\u276F")||content.includes("Churning"))return}}function createTmuxPane(ctx,teamWindow){let{execSync:execSync10}=__require("child_process"),useLaunchScript=ctx.validated.provider==="claude"&&Boolean(ctx.validated.nativeTeam?.enabled),tmuxCommand=useLaunchScript?shellQuote2(writeTmuxLaunchScript(ctx.workerId,ctx.fullCommand)):shellQuote2(ctx.fullCommand),tmuxPrefix=genieTmuxCmd("");if(ctx.validated.windowTarget){let cwdFlag2=ctx.cwd?` -c ${shellQuote2(ctx.cwd)}`:"",cmd=`${tmuxPrefix}split-window -d -t ${shellQuote2(ctx.validated.windowTarget)}${cwdFlag2} -P -F '#{pane_id}' ${tmuxCommand}`;return execSync10(cmd,{encoding:"utf-8"}).trim()}if(ctx.validated.newWindow){let session=ctx.sessionOverride??teamWindow?.sessionName??ctx.validated.team,cwdFlag2=ctx.cwd?` -c ${shellQuote2(ctx.cwd)}`:"",sessionExists2=!1;try{execSync10(`${tmuxPrefix}has-session -t ${shellQuote2(`=${session}`)}`,{stdio:"ignore"}),sessionExists2=!0}catch{sessionExists2=!1}if(!sessionExists2)execSync10(`${tmuxPrefix}new-session -d -s ${shellQuote2(session)} -n home${cwdFlag2}`,{stdio:"ignore"});let cmd=`${tmuxPrefix}new-window -a -d -t ${shellQuote2(`${session}:`)} -n claude${cwdFlag2} -P -F '#{pane_id}' ${tmuxCommand}`;return execSync10(cmd,{encoding:"utf-8"}).trim()}if(teamWindow?.created){let cwdFlag2=ctx.cwd?` -c ${shellQuote2(ctx.cwd)}`:"",paneId=execSync10(`${tmuxPrefix}split-window -d -t ${shellQuote2(teamWindow.windowId)}${cwdFlag2} -P -F '#{pane_id}' ${tmuxCommand}`,{encoding:"utf-8"}).trim();try{execSync10(genieTmuxCmd(`kill-pane -t '${teamWindow.paneId}'`),{stdio:"ignore"})}catch{}return paneId}let callerPane=process.env.TMUX_PANE;if(!teamWindow&&!callerPane)throw Error("createTmuxPane: refusing to split with no target \u2014 neither teamWindow nor TMUX_PANE is set. "+"This indicates a missing --team or --window flag, or a caller outside tmux. See ~/.genie/reports/trace-genie-spawn-wrong-window.md");let splitTarget=teamWindow?`-t '${teamWindow.windowId}'`:`-t '${callerPane}'`,cwdFlag=ctx.cwd?`-c '${ctx.cwd}'`:"";if(useLaunchScript){let splitCmd2=`${tmuxPrefix}split-window -d ${splitTarget} ${cwdFlag} -P -F '#{pane_id}' ${tmuxCommand}`;return execSync10(splitCmd2,{encoding:"utf-8"}).trim()}let escapedCmd=ctx.fullCommand.replace(/'/g,"'\\''"),splitCmd=`${tmuxPrefix}split-window -d ${splitTarget} ${cwdFlag} -P -F '#{pane_id}' '${escapedCmd}'`;return execSync10(splitCmd,{encoding:"utf-8"}).trim()}async function applySpawnLayout(ctx,teamWindow){let{execSync:execSync10}=__require("child_process"),session=await getCurrentSessionName()??ctx.validated.team,layoutTarget=`${session}:${teamWindow?.windowName??""}`;if(!teamWindow){let wins=await listWindows(session);layoutTarget=wins[0]?wins[0].id:`${session}:`}try{execSync10(genieTmuxCmd(buildLayoutCommand(layoutTarget,ctx.layoutMode)),{stdio:"ignore"})}catch{}}async function createTmuxExecutor(ctx,paneId,pid,teamWindow){if(!ctx.agentIdentityId||!ctx.executorId)return;await createAndLinkExecutor2(ctx.agentIdentityId,ctx.validated.provider,resolveExecutorTransport2(ctx.validated.provider,"tmux"),{id:ctx.executorId,pid,tmuxSession:ctx.validated.team,tmuxPaneId:paneId,tmuxWindow:teamWindow?.windowName??null,tmuxWindowId:teamWindow?.windowId??null,claudeSessionId:ctx.claudeSessionId??null,state:"spawning",repoPath:ctx.cwd,paneColor:ctx.spawnColor})}async function finalizeTmuxSpawn(ctx,paneId,teamWindow,workerEntry){if(ctx.spawnColor&&paneId!=="inline")await applyPaneColor(paneId,ctx.spawnColor,teamWindow?.windowId);let templateId=ctx.validated.role??ctx.workerId;if(!isBuiltinAgent(templateId)){let team=ctx.validated.team,slash=templateId.indexOf("/");if(slash>0){let parentTeam=await lookupTemplateTeam(templateId.slice(0,slash));if(parentTeam)team=parentTeam}await saveTemplate({id:templateId,provider:ctx.validated.provider,team,role:ctx.validated.role,skill:ctx.validated.skill,cwd:ctx.cwd,extraArgs:ctx.extraArgs,nativeTeamEnabled:workerEntry.nativeTeamEnabled,lastSpawnedAt:new Date().toISOString()})}if(ctx.otelRelayActive&&paneId!=="%0")registerOtelRelayPane(ctx.workerId,paneId,ctx.agentName,ctx.spawnColor,ctx.cwd);if(teamWindow)console.log(` Window: ${teamWindow.windowName} (${teamWindow.windowId})`);printSpawnInfo(ctx,paneId,workerEntry)}async function awaitAgentReadiness(paneId,role,tolerateReadinessTimeout){if(paneId==="inline")return;let result2=await waitForAgentReady(paneId);if(result2.ready){console.log(` \u2713 Agent ready (${(result2.elapsedMs/1000).toFixed(1)}s)`);return}if(tolerateReadinessTimeout){console.log(` \u26A0 Agent readiness timeout (${Math.round(result2.elapsedMs/1000)}s) \u2014 proceeding anyway`);return}throw console.error(` \u2717 Agent readiness timeout (${Math.round(result2.elapsedMs/1000)}s) \u2014 failing strict mode`),new AgentReadinessTimeoutError(role,paneId,result2.elapsedMs)}async function launchTmuxSpawn(ctx){let isolatedSessionSpawn=ctx.validated.newWindow===!0&&Boolean(ctx.sessionOverride),teamWindow=ctx.spawnIntoCurrentWindow||isolatedSessionSpawn?null:await resolveSpawnTeamWindow(ctx.validated.team,ctx.cwd,ctx.sessionOverride),emitFailed=(reason,extra={})=>{recordAuditEvent("worker",ctx.workerId,"worker.spawn.failed",getActor(),{reason,worker_id:ctx.workerId,agent_role:ctx.validated.role??ctx.workerId,cwd:ctx.cwd,executor_id:ctx.executorId,...extra}).catch(()=>{})},paneId;try{paneId=createTmuxPane(ctx,teamWindow)}catch(err){let msg=err instanceof Error?err.message:"unknown error";return emitFailed("createTmuxPane_threw",{error:msg}),console.error(`Failed to create tmux pane: ${msg}`),process.exit(1)}let pid=await capturePanePid2(paneId);try{validateSpawnedPane(paneId,pid)}catch(err){let reason=err instanceof SpawnPaneVanishedError?err.reason:"pane_validation_threw";throw emitFailed("pane_vanished",{pane_id:paneId,pid,vanish_reason:reason,error:err instanceof Error?err.message:String(err)}),err}if(await createTmuxExecutor(ctx,paneId,pid,teamWindow),await applySpawnLayout(ctx,teamWindow),ctx.validated.provider==="claude")await autoConfirmTrustPrompt(paneId);let workerEntry=await registerSpawnWorker(ctx,paneId,teamWindow);await notifySpawnJoin(ctx,paneId),await finalizeTmuxSpawn(ctx,paneId,teamWindow,workerEntry);try{await awaitAgentReadiness(paneId,ctx.validated.role??ctx.workerId,ctx.tolerateReadinessTimeout)}catch(err){let reason=err instanceof AgentReadinessTimeoutError?"readiness_timeout":"readiness_probe_threw";throw emitFailed(reason,{pane_id:paneId,pid,error:err instanceof Error?err.message:String(err)}),err}if(ctx.executorId)await updateExecutorState(ctx.executorId,"running").catch(()=>{});if(ctx.agentIdentityId)await update(ctx.agentIdentityId,{state:"idle"}).catch(()=>{});return recordAuditEvent("worker",ctx.workerId,"worker.spawn.ok",getActor(),{worker_id:ctx.workerId,agent_role:ctx.validated.role??ctx.workerId,pane_id:paneId,pid,cwd:ctx.cwd,executor_id:ctx.executorId}).catch(()=>{}),paneId}async function runSdkQuery(ctx,permConfig,streamOpts,sdkConfig,runtimeExtraOptions){let{ClaudeSdkProvider:ClaudeSdkProvider2}=await Promise.resolve().then(() => (init_claude_sdk(),exports_claude_sdk)),{startSession:startSession2,recordTurn:recordTurn2,updateTurnCount:updateTurnCount2,endSession:endSession2}=await Promise.resolve().then(() => exports_sdk_session_capture),{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sdkProvider=new ClaudeSdkProvider2,spawnContext={agentId:ctx.agentIdentityId??ctx.workerId,executorId:ctx.executorId??crypto.randomUUID(),team:ctx.validated.team,role:ctx.validated.role,skill:ctx.validated.skill,cwd:ctx.cwd,model:ctx.validated.model,systemPrompt:ctx.validated.systemPrompt,systemPromptFile:ctx.validated.systemPromptFile,initialPrompt:ctx.validated.initialPrompt,name:ctx.validated.name},safePgCall=async(_op,fn,fallback)=>{try{let sql=await getConnection2();return await fn(sql)}catch{return fallback}},prompt2=ctx.validated.initialPrompt??`You are ${ctx.validated.role??"an agent"} on team "${ctx.validated.team}". Awaiting instructions.`,resumeSessionId=typeof runtimeExtraOptions?.resume==="string"?runtimeExtraOptions.resume:void 0,dbSessionId=null,turnIndex=0;if(resumeSessionId){let resolvedClaudeSessionId=resumeSessionId,byPgId=await safePgCall("resolve-session-resume",(sql)=>sql`
|
|
2138
2138
|
SELECT s.id, s.total_turns, COALESCE(s.claude_session_id, e.claude_session_id) as csid
|
|
@@ -2144,8 +2144,8 @@ exec ${fullCommand}
|
|
|
2144
2144
|
`)}let extraOptions={...streaming&&{includePartialMessages:!0},...runtimeExtraOptions},hasExtraOptions=Object.keys(extraOptions).length>0,{messages:messages2}=sdkProvider.runQuery(spawnContext,prompt2,permConfig,hasExtraOptions?extraOptions:void 0,sdkConfig);if(ctx.executorId)await updateExecutorState(ctx.executorId,"running").catch(()=>{});let claudeSessionId,toolNameById=new Map,record=async(role,content,toolName)=>{if(!dbSessionId)return;await recordTurn2(safePgCall,dbSessionId,turnIndex++,role,content,toolName)},recordToolUseBlock=async(block)=>{let b2=block,name=String(b2.name??""),id=String(b2.id??"");if(id)toolNameById.set(id,name);await record("tool_input",JSON.stringify(b2.input??{}).slice(0,500),name)},recordAssistantBlocks=async(message)=>{if(!message.message)return;for(let block of message.message.content)if(block.type==="tool_use")await recordToolUseBlock(block);else if(block.type==="text"&&block.text)await record("assistant",block.text)},recordToolResultBlock=async(block)=>{let b2=block;if(b2.type!=="tool_result")return;let toolId=String(b2.tool_use_id??""),toolName=toolNameById.get(toolId)??"",output=typeof b2.content==="string"?b2.content.slice(0,500):"";await record("tool_output",output,toolName)},recordToolResults=async(message)=>{if(!message.message?.content||!Array.isArray(message.message.content))return;for(let block of message.message.content)await recordToolResultBlock(block)},processMessage=async(message)=>{if(message.type==="system"){let sid=message.session_id;if(sid)claudeSessionId=sid;return}if(message.type==="assistant"){await recordAssistantBlocks(message);return}if(message.type==="user"){await recordToolResults(message);return}if(message.type==="result"&&message.subtype==="success"&&message.session_id)claudeSessionId=message.session_id};if(streaming){let{formatSdkMessage:formatSdkMessage2}=await Promise.resolve().then(() => exports_claude_sdk_stream),format=streamOpts?.streamFormat??"text";try{for await(let message of messages2){let formatted=formatSdkMessage2(message,format);if(formatted!==null){if(process.stdout.write(formatted),format==="json")process.stdout.write(`
|
|
2145
2145
|
`)}await processMessage(message)}}catch(err){if(!(err instanceof Error&&err.name==="AbortError"))console.error(`SDK query error: ${err instanceof Error?err.message:err}`)}}else try{for await(let message of messages2){if(message.type==="assistant"&&message.message){for(let block of message.message.content)if(block.type==="text"&&block.text)process.stdout.write(block.text)}if(message.type==="result"&&message.subtype==="success"&&message.result)console.log(message.result);await processMessage(message)}}catch(err){if(!(err instanceof Error&&err.name==="AbortError"))console.error(`SDK query error: ${err instanceof Error?err.message:err}`)}if(dbSessionId)await updateTurnCount2(safePgCall,dbSessionId,turnIndex),await endSession2(safePgCall,dbSessionId,"completed");if(claudeSessionId&&spawnContext.executorId){let csId=claudeSessionId;await safePgCall("update-claude-session-id",(sql)=>sql`UPDATE executors SET claude_session_id = ${csId} WHERE id = ${spawnContext.executorId}`,void 0)}if(claudeSessionId&&dbSessionId){let csId=claudeSessionId,sessId=dbSessionId;await safePgCall("update-session-claude-id",(sql)=>sql`UPDATE sessions SET claude_session_id = ${csId} WHERE id = ${sessId}`,void 0)}}async function rollbackSpawn(ctx,opts){if(opts.workerRegistered&&ctx.agentIdentityId)await unregister(ctx.agentIdentityId).catch(()=>{});if(ctx.executorId)await updateExecutorState(ctx.executorId,"error").catch(()=>{})}async function launchSdkSpawn(ctx,permissionsConfig,streamOpts,sdkConfig,runtimeExtraOptions){let workerRegistered=!1;try{if(ctx.agentIdentityId&&ctx.executorId)await createAndLinkExecutor2(ctx.agentIdentityId,"claude-sdk","process",{id:ctx.executorId,claudeSessionId:null,state:"spawning",repoPath:ctx.cwd});if(await registerSpawnWorker(ctx,"sdk"),workerRegistered=!0,ctx.executorId)process.env.GENIE_EXECUTOR_ID=ctx.executorId;if(console.log(`Agent "${ctx.workerId}" starting via Claude Agent SDK...`),console.log(` Provider: claude-sdk | Team: ${ctx.validated.team} | Role: ${ctx.validated.role??"-"}`),ctx.executorId)console.log(` Executor: ${ctx.executorId}`);console.log("");let{resolvePermissionConfig:resolvePermissionConfig2}=await Promise.resolve().then(() => (init_claude_sdk_permissions(),exports_claude_sdk_permissions)),permConfig=resolvePermissionConfig2(permissionsConfig);await runSdkQuery(ctx,permConfig,streamOpts,sdkConfig,runtimeExtraOptions)}catch(err){throw await rollbackSpawn(ctx,{workerRegistered}),err}if(ctx.executorId)await updateExecutorState(ctx.executorId,"done").catch(()=>{});if(ctx.agentIdentityId)await unregister(ctx.agentIdentityId);return console.log(`
|
|
2146
2146
|
Agent "${ctx.workerId}" SDK session ended.`),ctx.workerId}async function launchInlineSpawn(ctx){let nt=ctx.validated.nativeTeam,paneId="inline",workerRegistered=!1,workerEntry;try{if(ctx.agentIdentityId&&ctx.executorId)await createAndLinkExecutor2(ctx.agentIdentityId,ctx.validated.provider,resolveExecutorTransport2(ctx.validated.provider,"inline"),{id:ctx.executorId,claudeSessionId:ctx.claudeSessionId??null,state:"spawning",repoPath:ctx.cwd});if(workerEntry=await registerSpawnWorker(ctx,"inline"),workerRegistered=!0,await notifySpawnJoin(ctx,"inline"),console.log(`Agent "${ctx.workerId}" starting inline...`),console.log(` Provider: ${ctx.launch.provider} | Team: ${ctx.validated.team} | Role: ${ctx.validated.role??"-"}`),nt?.enabled)console.log(` Native: enabled | AgentID: ${workerEntry.nativeAgentId}`);console.log("")}catch(err){throw await rollbackSpawn(ctx,{workerRegistered}),err}let{spawnSync:spawnSync6}=__require("child_process"),envVars={...process.env,...ctx.launch.env??{}},result2=spawnSync6("sh",["-c",ctx.launch.command],{env:envVars,stdio:"inherit"});if(result2.error)throw await rollbackSpawn(ctx,{workerRegistered}),result2.error;if(ctx.agentIdentityId&&ctx.executorId)await updateExecutorState(ctx.executorId,"done").catch(()=>{});if(ctx.agentIdentityId)await unregister(ctx.agentIdentityId);if(nt?.enabled&&ctx.agentName)await clearNativeInbox(ctx.validated.team,ctx.agentName).catch(()=>{}),await unregisterNativeMember(ctx.validated.team,ctx.agentName).catch(()=>{});return console.log(`
|
|
2147
|
-
Agent "${ctx.workerId}" session ended.`),process.exit(result2.status??0)}async function findDeadResumable(team,role,isAliveFn=isPaneAliveOrDead){let prefiltered=(await list()).filter((w)=>w.role===role
|
|
2148
|
-
Use a different --role name for a second worker, e.g.: --role ${role}-2`),process.exit(1)}await unregister(w.id)}}async function classifyCollisionLiveness(w){if(!await resolveWorkerLivenessByTransport(w))return"dead";if(w.session&&/^%\d+$/.test(w.paneId)){if(await getPaneSession(w.paneId)!==w.session)return"recycled"}return"alive"}async function getPaneSession(paneId){try{return(await executeTmux2(`display-message -t '${paneId}' -p '#{session_name}'`)).trim()||null}catch{return null}}async function resolveNativeTeam(team,_repoPath,options){let leaderName=await resolveLeaderName(team),sanitizedTeam=sanitizeTeamName(team),leaderAgent=await getAgentByName(leaderName,sanitizedTeam).catch(()=>null),parentSessionId;if(leaderAgent&&!options.isIdentitySpawn)parentSessionId=(await shouldResume(leaderAgent.id).catch(()=>null))?.sessionId;if(!parentSessionId)parentSessionId=await discoverClaudeParentSessionId()??`genie-${team}`;await ensureNativeTeam(team,`Genie team: ${team}`,parentSessionId);let spawnColor=options.color??await assignColor(team),nativeTeam;if(options.provider==="claude")nativeTeam={enabled:!0,parentSessionId,color:spawnColor,agentType:options.role??"general-purpose",planModeRequired:options.planMode,permissionMode:options.permissionMode,agentName:options.role};return{parentSessionId,spawnColor,nativeTeam}}function autoSyncDisabled(options){return options.noAutoSync===!0||options.autoSync===!1||process.env.GENIE_DISABLE_AUTO_SYNC==="1"}function isWithinAgentsRoot(agentsRoot,agentDir){let rel=relative(agentsRoot,agentDir);return rel!==""&&!rel.startsWith("..")&&!isAbsolute2(rel)}
|
|
2147
|
+
Agent "${ctx.workerId}" session ended.`),process.exit(result2.status??0)}async function findDeadResumable(team,role,isAliveFn=isPaneAliveOrDead){let prefiltered=(await list()).filter((w)=>(w.role===role||w.customName===role)&&w.team===team),candidate=null,candidatePaneId=null;for(let w of prefiltered){let executor=await getCurrentExecutor(w.id),provider=executor?.provider??w.provider,transport=executor?.transport??w.transport;if(executor?.claudeSessionId&&provider==="claude"&&transport==="tmux"){candidate=w,candidatePaneId=executor.tmuxPaneId??w.paneId;break}}if(!candidate)return null;let alive=candidatePaneId?await isAliveFn(candidatePaneId):!1,resumableCandidate=candidatePaneId?{...candidate,paneId:candidatePaneId}:candidate;if(alive){if(resumableCandidate.kind==="permanent")throw new OwnerSpawnCollisionError(role,team,resumableCandidate.id,resumableCandidate.paneId,resumableCandidate.state);return null}return resumableCandidate}async function rejectDuplicateRole(team,role){let existing=await list();for(let w of existing){if(w.team!==team)continue;let matchesRole=w.role===role,matchesName=w.id===role;if(!matchesRole&&!matchesName)continue;if(await classifyCollisionLiveness(w)==="alive"){let collisionLabel=matchesName&&!matchesRole?`name "${w.id}"`:`role "${role}"`;console.error(`Error: Worker with ${collisionLabel} already exists in team "${team}" (state: ${w.state}, pane: ${w.paneId})
|
|
2148
|
+
Use a different --role name for a second worker, e.g.: --role ${role}-2`),process.exit(1)}await unregister(w.id)}}async function classifyCollisionLiveness(w){if(!await resolveWorkerLivenessByTransport(w))return"dead";if(w.session&&/^%\d+$/.test(w.paneId)){if(await getPaneSession(w.paneId)!==w.session)return"recycled"}return"alive"}async function getPaneSession(paneId){try{return(await executeTmux2(`display-message -t '${paneId}' -p '#{session_name}'`)).trim()||null}catch{return null}}async function resolveNativeTeam(team,_repoPath,options){let leaderName=await resolveLeaderName(team),sanitizedTeam=sanitizeTeamName(team),leaderAgent=leaderName?await getAgent(leaderName).catch(()=>null)??await getAgentByName(leaderName,sanitizedTeam).catch(()=>null):null,parentSessionId;if(leaderAgent&&!options.isIdentitySpawn)parentSessionId=(await shouldResume(leaderAgent.id).catch(()=>null))?.sessionId;if(!parentSessionId)parentSessionId=await discoverClaudeParentSessionId()??`genie-${team}`;await ensureNativeTeam(team,`Genie team: ${team}`,parentSessionId);let spawnColor=options.color??await assignColor(team),nativeTeam;if(options.provider==="claude")nativeTeam={enabled:!0,parentSessionId,color:spawnColor,agentType:options.role??"general-purpose",planModeRequired:options.planMode,permissionMode:options.permissionMode,agentName:options.role};return{parentSessionId,spawnColor,nativeTeam}}function autoSyncDisabled(options){return options.noAutoSync===!0||options.autoSync===!1||process.env.GENIE_DISABLE_AUTO_SYNC==="1"}function isWithinAgentsRoot(agentsRoot,agentDir){let rel=relative(agentsRoot,agentDir);return rel!==""&&!rel.startsWith("..")&&!isAbsolute2(rel)}function resolveAutoRegisterAgentDir(workspaceRoot,name){let parts=name.split("/");if(parts.length<1||parts.length>2)return null;if(parts.some((part)=>part===""||part==="."||part===".."))return null;let agentsRoot=join51(workspaceRoot,"agents"),agentDir=parts.length===2?resolvePath(agentsRoot,parts[0],".genie","agents",parts[1]):resolvePath(agentsRoot,parts[0]);return isWithinAgentsRoot(agentsRoot,agentDir)?agentDir:null}async function tryAutoRegisterAgent(name,options){if(autoSyncDisabled(options))return null;let workspace=_spawnAutoSyncDeps.findWorkspace();if(!workspace)return null;let agentDir=resolveAutoRegisterAgentDir(workspace.root,name);if(!agentDir)return null;let agentsMdPath=join51(agentDir,"AGENTS.md");if(!_spawnAutoSyncDeps.existsSync(agentsMdPath))return null;try{if(await _spawnAutoSyncDeps.syncSingleAgentByName(workspace.root,name)==="not-found")return null}catch{return null}let resolved=await _spawnAutoSyncDeps.resolveAgent(name);if(!resolved)return null;return _spawnAutoSyncDeps.stderr(`Auto-registered agent '${name}' from ${agentDir}`),resolved}async function resolveAgentForSpawn(name,options){let resolved=await _spawnAutoSyncDeps.resolveAgent(name)??await tryAutoRegisterAgent(name,options);if(!resolved)console.error(`Error: Agent "${name}" not found in directory or built-ins.`),console.error(` Register with: genie dir add ${name} --dir <path>`),console.error(" Or use a built-in: engineer, reviewer, qa, fix, ..."),process.exit(1);let entry2=resolved.entry,identityPath=null;if(resolved.builtin)identityPath=resolveBuiltinAgentPath(name);else if(entry2.dir)identityPath=_spawnAutoSyncDeps.loadIdentity(entry2);if(!identityPath)identityPath=resolveBuiltinAgentPath(name);let repoPath=resolveAgentWorkingDir(entry2,options.cwd),model=options.model;if(!model){let ctx=buildSpawnResolveContext(name,entry2);model=resolveField(entry2,"model",ctx)}return{entry:entry2,repoPath,identityPath,model}}function buildSpawnResolveContext(agentName,_entry){let ctx={};try{let ws=findWorkspace();if(ws){let wsConfig=getWorkspaceConfig(ws.root);ctx.workspaceDefaults=wsConfig.agents?.defaults}}catch{}if(agentName.includes("/")){let parentName=agentName.split("/")[0];try{let{readFileSync:readFileSync30,existsSync:existsSync44}=__require("fs"),{join:join52}=__require("path"),ws=findWorkspace();if(ws){let parentAgentsMd=join52(ws.root,"agents",parentName,"AGENTS.md");if(existsSync44(parentAgentsMd)){let{parseFrontmatter:parseFrontmatter3}=(init_frontmatter(),__toCommonJS(exports_frontmatter)),parentFm=parseFrontmatter3(readFileSync30(parentAgentsMd,"utf-8"));ctx.parent={name:parentName,fields:parentFm}}}}catch{}}return ctx}function resolveAgentWorkingDir(entry2,explicitCwd){if(explicitCwd)return explicitCwd;if(entry2.dir)return entry2.dir;let repo=entry2.repo;if(repo&&__require("fs").existsSync(repo))return repo;return process.cwd()}function buildDirectoryPermissionSpawnParams(entry2){let permissions=entry2.permissions?.allow?.length||entry2.permissions?.deny?.length?{allow:entry2.permissions.allow,deny:entry2.permissions.deny}:void 0;return{...permissions?{permissions}:{},...entry2.disallowedTools?{disallowedTools:entry2.disallowedTools}:{}}}async function buildSpawnParams2(name,team,options,agent,preassignedSessionId,agentTemplate){let resolvedProvider=options.provider??agent.entry.provider??"claude",params={provider:resolvedProvider,team,role:name,agentTemplate:agentTemplate??name,skill:options.skill,extraArgs:options.extraArgs,model:agent.model,systemPromptFile:agent.identityPath??void 0,promptMode:agent.entry.promptMode,initialPrompt:options.prompt??options.initialPrompt,newWindow:options.newWindow,windowTarget:options.window,...buildDirectoryPermissionSpawnParams(agent.entry)},isIdentitySpawn=options.role!==void 0&&options.role!==name,{parentSessionId,spawnColor,nativeTeam}=await resolveNativeTeam(team,agent.repoPath,{...options,provider:resolvedProvider,role:name,isIdentitySpawn});if(nativeTeam)params.nativeTeam=nativeTeam;try{let{injectTeamHooks:injectTeamHooks2}=await Promise.resolve().then(() => (init_inject(),exports_inject));if(await injectTeamHooks2(team))console.log(` Hooks: injected genie hook dispatch into team "${team}"`)}catch(err){console.warn(`Warning: could not inject hooks for team "${team}": ${err instanceof Error?err.message:err}`)}if(params.provider==="codex")try{let{injectCodexHooks:injectCodexHooks2}=await Promise.resolve().then(() => (init_codex_inject(),exports_codex_inject));if(await injectCodexHooks2())console.log(" Hooks: injected genie hook dispatch into ~/.codex/config.toml")}catch(err){console.warn(`Warning: could not inject codex hooks: ${err instanceof Error?err.message:err}`)}if(params.provider==="claude")params.sessionId=preassignedSessionId??crypto.randomUUID();if(params.provider==="claude"){if(await startOtelReceiver())params.otelPort=getOtelPort(),params.otelLogPrompts=!0}return{params,parentSessionId,spawnColor}}async function maybeStartOtelRelay(nt,validated,insideTmux){if(!nt?.enabled&&validated.provider==="codex"&&insideTmux)return ensureCodexOtelConfig(),await ensureOtelRelay(validated.team);return!1}function buildSdkRuntimeExtra(options){let extra={};if(options.sdkMaxTurns!=null)extra.maxTurns=options.sdkMaxTurns;if(options.sdkMaxBudget!=null)extra.maxBudgetUsd=options.sdkMaxBudget;if(options.sdkEffort)extra.effort=options.sdkEffort;if(options.sdkResume)extra.resume=options.sdkResume;return Object.keys(extra).length>0?extra:void 0}async function dispatchSpawn(ctx,validated,options,agent,insideTmux){if(validated.provider==="claude-sdk"){let streamFormat=options.streamFormat??"text",streamOpts=options.stream||options.sdkStream?{stream:!0,streamFormat}:void 0;return await launchSdkSpawn(ctx,agent.entry.permissions,streamOpts,agent.entry.sdk,buildSdkRuntimeExtra(options))}if(insideTmux)return await launchTmuxSpawn(ctx);return await launchInlineSpawn(ctx)}async function resolveTeamName3(opts){if(opts.explicitTeam)return opts.explicitTeam;if(opts.entryTeam)return opts.entryTeam;let env=opts.env??process.env;if(env.GENIE_TEAM)return env.GENIE_TEAM;return await(opts.discover??discoverTeamName)()??null}async function pickParallelShortId(baseName,team,uuid){if(!UUID_REGEX.test(uuid))throw Error(`pickParallelShortId: expected a well-formed UUID (8-4-4-4-12 hex), got ${JSON.stringify(uuid)}`);let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2();for(let k=4;k<=uuid.length;k++){let slice=uuid.slice(0,k),id=`${baseName}-${slice}`;if((await sql`
|
|
2149
2149
|
SELECT id FROM agents WHERE id = ${id} LIMIT 1
|
|
2150
2150
|
`).length===0)return slice}return uuid}async function resolveSpawnIdentity(name,team,uuidFactory=()=>crypto.randomUUID(),isAliveFn=(agent)=>resolveWorkerLivenessByTransport(agent)){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(name))return{kind:"canonical",workerId:name,sessionUuid:uuidFactory()};let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),rows=await(await getConnection2())`
|
|
2151
2151
|
SELECT id, pane_id, team FROM agents WHERE id = ${name} LIMIT 1
|
|
@@ -2637,7 +2637,7 @@ ${queryContent}`;let{messages:queryMessages}=state.provider.runQuery({agentId:se
|
|
|
2637
2637
|
`;appendFileSync5(crashLog,line)}catch{}}function freshCreateTuiSession(){runTuiTmuxCapturing(`new-session -d -s ${TUI_SESSION} -x 120 -y 40`),runTuiTmuxCapturing(`split-window -h -t ${TUI_SESSION}:0 -l ${120-NAV_WIDTH-1}`);let panes=execSync10(tuiTmux(`list-panes -t ${TUI_SESSION}:0 -F '#{pane_id}'`),{encoding:"utf-8"}).trim().split(`
|
|
2638
2638
|
`);applyTuiStyle(),setupTuiKeybindings();try{execSync10(tuiTmux(`select-pane -t ${panes[0]}`),{stdio:"ignore"})}catch{}return{leftPane:panes[0],rightPane:panes[1]||panes[0]}}function startTuiTmuxServer(){try{execSync10(tuiTmux(`has-session -t ${TUI_SESSION}`),{stdio:"ignore"})}catch{return freshCreateTuiSession()}try{let panes=execSync10(tuiTmux(`list-panes -t ${TUI_SESSION}:0 -F '#{pane_id}'`),{encoding:"utf-8"}).trim().split(`
|
|
2639
2639
|
`).filter((id)=>id.length>0);if(panes.length>=2){try{execSync10(tuiTmux(`respawn-pane -k -t ${panes[1]} 'cat'`),{stdio:"ignore"})}catch{}return{leftPane:panes[0],rightPane:panes[1]}}let cols=Number.parseInt(execSync10(tuiTmux(`display-message -t ${TUI_SESSION}:0 -p '#{window_width}'`),{encoding:"utf-8"}).trim(),10)||120;runTuiTmuxCapturing(`split-window -h -t ${TUI_SESSION}:0 -l ${cols-NAV_WIDTH-1}`);let refreshed=execSync10(tuiTmux(`list-panes -t ${TUI_SESSION}:0 -F '#{pane_id}'`),{encoding:"utf-8"}).trim().split(`
|
|
2640
|
-
`);applyTuiStyle(),setupTuiKeybindings();try{execSync10(tuiTmux(`select-pane -t ${refreshed[0]}`),{stdio:"ignore"})}catch{}return{leftPane:refreshed[0],rightPane:refreshed[1]||refreshed[0]}}catch(err){let message=err instanceof Error?err.message:String(err);logTuiStartupFailure(message);try{execSync10(tuiTmux(`kill-session -t ${TUI_SESSION}`),{stdio:"ignore"})}catch{}return freshCreateTuiSession()}}function sendTuiLaunchScript(leftPane,rightPane,workspaceRoot){let home=genieHome3(),bunPath=process.execPath||"bun",genieBin=process.argv[1]||"genie",scriptPath=join64(home,"tui-launch.sh"),logsDir=join64(home,"logs"),crashLog=join64(logsDir,"tui-crash.log"),envVars=["GENIE_TUI_PANE=left",`GENIE_TUI_RIGHT=${rightPane}`];if(workspaceRoot)envVars.push(`GENIE_TUI_WORKSPACE=${workspaceRoot}`);let content=["#!/bin/sh",`mkdir -p '${logsDir}'`,`exec 2>> '${crashLog}'`,`printf -- '--- tui-launch %s pid=%s ---\\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$$" >&2`,`export ${envVars.join(`
|
|
2640
|
+
`);applyTuiStyle(),setupTuiKeybindings();try{execSync10(tuiTmux(`select-pane -t ${refreshed[0]}`),{stdio:"ignore"})}catch{}return{leftPane:refreshed[0],rightPane:refreshed[1]||refreshed[0]}}catch(err){let message=err instanceof Error?err.message:String(err);logTuiStartupFailure(message);try{execSync10(tuiTmux(`kill-session -t ${TUI_SESSION}`),{stdio:"ignore"})}catch{}return freshCreateTuiSession()}}function sendTuiLaunchScript(leftPane,rightPane,workspaceRoot){let home=genieHome3(),bunPath=process.execPath||"bun",genieBin=process.argv[1]||"genie",scriptPath=join64(home,"tui-launch.sh"),logsDir=join64(home,"logs"),crashLog=join64(logsDir,"tui-crash.log"),envVars=["GENIE_TUI_PANE=left",`GENIE_TUI_RIGHT=${rightPane}`];if(workspaceRoot)envVars.push(`GENIE_TUI_WORKSPACE=${workspaceRoot}`);if(process.env.GENIE_TEAM)envVars.push(`GENIE_TUI_TEAM=${process.env.GENIE_TEAM}`);let content=["#!/bin/sh",`mkdir -p '${logsDir}'`,`exec 2>> '${crashLog}'`,`printf -- '--- tui-launch %s pid=%s ---\\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$$" >&2`,`export ${envVars.join(`
|
|
2641
2641
|
export `)}`,`exec ${bunPath} ${genieBin}`,""].join(`
|
|
2642
2642
|
`);writeFileSync20(scriptPath,content,{mode:493});try{execSync10(tuiTmux(`send-keys -t '${leftPane}' '${scriptPath}' Enter`),{stdio:"ignore"})}catch{}}function killTuiSession(){try{execSync10(tuiTmux("kill-server"),{stdio:"ignore"})}catch{}}function listAgentSessions(){try{return execSync10(genieTmuxCmd("list-sessions -F '#{session_name}'"),{encoding:"utf-8"}).trim().split(`
|
|
2643
2643
|
`).filter(Boolean)}catch{return[]}}function isServeRunning(){let entry2=readServePid();return entry2!==null&&isProcessAlive(entry2.pid)}async function autoStartServe(){if(isStoppingLockActive()){console.log("genie serve is shutting down \u2014 skipping auto-start.");return}if(isServeRunning())return;let bunPath=process.execPath??"bun",genieBin=process.argv[1]??"genie",{spawn:spawnChild}=await import("child_process");spawnChild(bunPath,[genieBin,"serve","--foreground"],{detached:!0,stdio:"ignore",env:{...process.env,GENIE_IS_DAEMON:"1"}}).unref();let deadline=Date.now()+15000;while(Date.now()<deadline)if(await new Promise((resolve12)=>setTimeout(resolve12,500)),isServeRunning()&&isTuiSessionReady())return;if(!isServeRunning())throw Error("genie serve failed to start within 15s. Run `genie serve` manually.")}function isTuiSessionReady(){try{return execSync10(tuiTmux(`has-session -t ${TUI_SESSION}`),{stdio:"ignore"}),!0}catch{return!1}}function ensureTuiSession(workspaceRoot){if(isTuiDisabled()){noticeTuiSkipped("session ensure");return}if(isTuiSessionReady())return;let{leftPane,rightPane}=startTuiTmuxServer();sendTuiLaunchScript(leftPane,rightPane,workspaceRoot)}async function startAgentSync(){try{let{findWorkspace:findWorkspace2,genieHome:genieHome4}=(init_workspace(),__toCommonJS(exports_workspace)),ws=findWorkspace2();if(!ws){let{join:join65}=__require("path"),configPath2=join65(genieHome4(),"config.json");return console.warn(` Agent sync: DISABLED \u2014 no workspace found from cwd or ${configPath2}`),console.warn(" Fix: `cd <workspace> && genie serve restart`, or run `genie init` to bootstrap one"),null}let{syncAgentDirectory:syncAgentDirectory2,watchAgentDirectory:watchAgentDirectory2}=await Promise.resolve().then(() => (init_agent_sync(),exports_agent_sync)),syncResult=await syncAgentDirectory2(ws.root);if(syncResult.registered.length+syncResult.updated.length>0)console.log(` Agent sync: ${syncResult.registered.length} registered, ${syncResult.updated.length} updated (workspace: ${ws.root})`);else console.log(` Agent sync: up to date (workspace: ${ws.root})`);if(syncResult.errors.length>0){console.warn(` Agent sync: ${syncResult.errors.length} error(s) \u2014 these agents were NOT registered:`);for(let e of syncResult.errors)console.warn(` ${e.name}: ${e.error}`)}let watcher2=watchAgentDirectory2(ws.root,{onSync:(name,action)=>{console.log(` [agent-watcher] ${name}: ${action}`)}});if(watcher2)console.log(" Agent watcher started (watching agents/ directory)");else console.warn(" Agent watcher: FAILED to start \u2014 new agents will not be auto-registered");return watcher2}catch(err){let msg=err instanceof Error?err.message:String(err);return console.error(` Agent sync failed: ${msg}`),null}}async function requirePgserveReady(){console.log(" Probing pgserve transport...");try{let{resolvePgserveTransport:resolvePgserveTransport2}=await Promise.resolve().then(() => (init_db(),exports_db)),transport=await resolvePgserveTransport2();if(transport.kind==="unix")console.log(` pgserve ready: unix socket ${transport.socketDir}/.s.PGSQL.${transport.port}`);else console.log(` pgserve ready: tcp ${transport.host}:${transport.port}`);try{let{registerService:registerService2}=await Promise.resolve().then(() => (init_service_registry(),exports_service_registry));registerService2("pgserve-owner",process.pid)}catch{}}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(` pgserve unreachable: ${msg}`),process.env.GENIE_PG_NO_AUTOSTART="1",process.env.GENIE_PG_DISABLE_AUTOSTART="1"}}async function startScheduler(){console.log(" Starting scheduler daemon...");try{let{startDaemon:startDaemon2}=await Promise.resolve().then(() => (init_scheduler_daemon(),exports_scheduler_daemon));handles.schedulerHandle=startDaemon2(),console.log(" Scheduler started (includes event-router + inbox-watcher)");try{let{registerService:registerService2}=await Promise.resolve().then(() => (init_service_registry(),exports_service_registry));registerService2("scheduler",process.pid)}catch{}}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(` Scheduler failed: ${msg}`)}try{let{startDerivedSignalsEngine:startDerivedSignalsEngine2}=await Promise.resolve().then(() => (init_derived_signals(),exports_derived_signals));handles.derivedSignals=await startDerivedSignalsEngine2(),console.log(" Derived-signal rule engine subscribed")}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(` Derived-signal engine failed: ${msg}`)}}function claimServePidOrExit(){let path3=servePidPath();mkdirSync23(genieHome3(),{recursive:!0});let startTime=getProcessStartTime(process.pid)??"unknown",payload=`${process.pid}:${startTime}`;for(let attempt=0;attempt<2;attempt++)try{let fd=openSync5(path3,"wx",420);try{writeSync2(fd,payload)}finally{closeSync5(fd)}return}catch(err){if(err.code!=="EEXIST")throw err;let existing=readServePid();if(existing&&existing.startTime!==null&&isProcessAlive(existing.pid))console.log(`genie serve already running (PID ${existing.pid})`),warnIfHookSocketMissing(),process.exit(0);forceRemoveServePid()}console.error("Could not claim serve.pid after 2 attempts \u2014 another genie serve is racing this one. "+"Wait a moment and retry, or run `genie serve status`."),process.exit(1)}function resolveServeMode(headless){let tuiDisabled=isTuiDisabled();if(tuiDisabled&&!headless)noticeTuiSkipped("serve");return{skipTui:Boolean(headless)||tuiDisabled,mode:headless?"headless":tuiDisabled?"no-tui":"full"}}async function loadBrainStartupConfig(deps){return deps.loadConfig?.()??(await Promise.resolve().then(() => (init_genie_config2(),exports_genie_config))).loadGenieConfigSync()}async function importBrainForStartup(deps){if(deps.importBrain)return deps.importBrain();return import("@khal-os/brain")}async function getBrainStartupPgPort(deps){return deps.getActivePort?.()??(await Promise.resolve().then(() => (init_db(),exports_db))).getActivePort()}function assignBrainHandles(deps,brainHandles){if(deps.setBrainHandles){deps.setBrainHandles(brainHandles);return}handles.brainHandles=brainHandles}function isMissingBrainModule(message){return message.includes("Cannot find")||message.includes("not found")||message.includes("MODULE_NOT_FOUND")}async function startBrainServer(deps,config,log2,warn){let brain=await importBrainForStartup(deps);if(!brain.startEmbeddedBrainServer)return[];let pgPort=await getBrainStartupPgPort(deps);if(!pgPort)return log2(" Brain server: pgserve not available (skipped)"),[];let resolveVaults=deps.resolveVaults??resolveBrainVaults,startVaults=deps.startVaults??startResolvedBrainVaults,resolution=await resolveVaults({brain,config,warn});if(resolution.paths.length===0)return log2(` Brain server: no ${resolution.source} brain vaults found (skipped)`),[];log2(` Starting brain server (${resolution.paths.length} ${resolution.source} vault(s))...`);let brainHandles=await startVaults(resolution,brain,pgPort,{warn,log:log2});if(assignBrainHandles(deps,brainHandles),brainHandles.length===0)log2(" Brain server: no vaults started");return brainHandles}async function startBrainServerIfEnabled(deps={}){let config=await loadBrainStartupConfig(deps),brainEmbedded=config.brain?.embedded!==!1,log2=deps.log??console.log,warn=deps.warn??console.warn;if(!brainEmbedded)return log2(" Brain server: skipped (brain.embedded=false \u2014 managed externally)"),[];try{return await startBrainServer(deps,config,log2,warn)}catch(err){let msg=err instanceof Error?err.message:String(err);if(isMissingBrainModule(msg))return[];return warn(` Brain server: failed: ${msg}`),[]}}function logAgentSessionInfo(){let sessions=listAgentSessions();if(sessions.length>0)console.log(` Agent server (-L genie): ${sessions.length} sessions`);else console.log(" Agent server (-L genie): no sessions yet (created on first spawn)")}function startTuiSessionIfEnabled(skipTui){if(skipTui)return;console.log(" Setting up TUI session...");let{leftPane,rightPane}=startTuiTmuxServer(),ws=(()=>{try{let{findWorkspace:findWorkspace2}=(init_workspace(),__toCommonJS(exports_workspace));return findWorkspace2()}catch{return null}})();sendTuiLaunchScript(leftPane,rightPane,ws?.root),console.log(" TUI server ready (session: genie-tui)")}async function startDetectorSchedulerSafely(){try{await Promise.resolve().then(() => (init_built_in(),exports_built_in));let{start:startDetectorScheduler}=await Promise.resolve().then(() => (init_detector_scheduler(),exports_detector_scheduler)),{listDetectors:listDetectors2}=await Promise.resolve().then(() => (init_detectors(),exports_detectors));handles.detectorScheduler=startDetectorScheduler();let registered=listDetectors2().map((d)=>d.id);console.log(` Detector scheduler started (measurement only, 60s \xB1 5s cadence) \u2014 registered: [${registered.join(", ")}]`)}catch(err){let msg=err instanceof Error?err.message:String(err);console.warn(` Detector scheduler: failed \u2014 ${msg}`)}}async function startExecutorReadEndpointSafely(){try{let{startExecutorReadEndpoint:startExecutorReadEndpoint2,getExecutorReadPort:getExecutorReadPort2}=await Promise.resolve().then(() => (init_executor_read(),exports_executor_read));if(await startExecutorReadEndpoint2())console.log(` Executor read endpoint ready on port ${getExecutorReadPort2()}`)}catch(err){let msg=err instanceof Error?err.message:String(err);console.warn(` Executor read endpoint: failed \u2014 ${msg}`)}}async function startOmniApprovalHandlerSafely(){try{let{startOmniApprovalHandler:startOmniApprovalHandler2}=await Promise.resolve().then(() => (init_omni_approval_handler(),exports_omni_approval_handler)),handler=await startOmniApprovalHandler2();if(handler)handles.omniApprovalHandler=handler,console.log(" Omni approval handler started")}catch{}}async function startOmniBridgeSafely(){let{OmniBridge:OmniBridge2}=await Promise.resolve().then(() => (init_omni_bridge(),exports_omni_bridge)),bridge=new OmniBridge2({natsUrl:process.env.GENIE_NATS_URL??"localhost:4222",maxConcurrent:Number(process.env.GENIE_MAX_CONCURRENT??"20"),idleTimeoutMs:Number(process.env.GENIE_IDLE_TIMEOUT_MS??"900000")});try{await bridge.start(),handles.omniBridge=bridge,console.log(" Omni bridge started")}catch(err){let msg=err instanceof Error?err.message:String(err);if(process.env.GENIE_OMNI_REQUIRED==="1")console.error(` Omni bridge: FAILED \u2014 ${msg}`),process.exit(1);console.warn(` Omni bridge: degraded \u2014 ${msg}; set GENIE_OMNI_REQUIRED=1 to make this fatal`)}}async function stopSchedulerHandles(){handles.agentWatcher?.close();let schedulerHandle=handles.schedulerHandle;if(schedulerHandle){schedulerHandle.stop();try{await schedulerHandle.done}catch{}handles.schedulerHandle=null}if(handles.detectorScheduler)handles.detectorScheduler.stop(),handles.detectorScheduler=null;if(handles.derivedSignals)await handles.derivedSignals.stop().catch(()=>{}),handles.derivedSignals=null}async function stopOmniAndBrainServices(){if(handles.omniApprovalHandler)await handles.omniApprovalHandler.stop().catch(()=>{}),handles.omniApprovalHandler=null;if(handles.omniBridge)await handles.omniBridge.stop().catch(()=>{}),handles.omniBridge=null;if(Promise.resolve().then(() => (init_executor_read(),exports_executor_read)).then((m)=>m.stopExecutorReadEndpoint().catch(()=>{})),handles.brainHandles.length>0){for(let handle of handles.brainHandles)await handle.stop().catch(()=>{});handles.brainHandles=[]}}function killRegisteredServices(){try{let{killAllServices:killAllServices2}=(init_service_registry(),__toCommonJS(exports_service_registry));killAllServices2()}catch{}}function removeLegacyPgservePortLockfileIfForcedTcp(){if(process.env.GENIE_PG_FORCE_TCP!=="1")return;try{let lockfilePath=join64(genieHome3(),"pgserve.port");if(existsSync52(lockfilePath))unlinkSync11(lockfilePath)}catch{}}function sigKillRegisteredServices(){try{let{getRegisteredServices:getRegisteredServices2}=(init_service_registry(),__toCommonJS(exports_service_registry));for(let svc of getRegisteredServices2())try{process.kill(svc.pid,"SIGKILL")}catch{}}catch{}}async function startHookSocketSafely(){try{let{startHookSocket:startHookSocket2}=await Promise.resolve().then(() => (init_hook_socket(),exports_hook_socket));handles.hookSocket=await startHookSocket2({strict:process.env.GENIE_STRICT_HOOKS==="1",repoRoot:operatorCwd})}catch(err){if(process.env.GENIE_STRICT_HOOKS==="1"&&err.message.includes("--strict-hooks"))throw err;console.warn(` Hook socket: DISABLED \u2014 ${err.message}`),handles.hookSocket=null}}async function stopHookSocketSafely(){if(!handles.hookSocket)return;try{await handles.hookSocket.stop()}catch{}handles.hookSocket=null}function buildShutdownFn(headless){let shutdownStarted=!1;return{shutdown:async()=>{if(shutdownStarted)return;if(shutdownStarted=!0,console.log(`
|
|
@@ -2972,7 +2972,7 @@ Genie Serve`),console.log("\u2500".repeat(50)),console.log(` Status: ${runn
|
|
|
2972
2972
|
WHERE team = ${slug}
|
|
2973
2973
|
AND state IS DISTINCT FROM 'archived'
|
|
2974
2974
|
RETURNING id
|
|
2975
|
-
`;if(rows.length>0)console.log(` \uD83D\uDCE6 Archived ${rows.length} wish-named agent row${rows.length===1?"":"s"} (team="${slug}")`);return rows.length}catch(err){let detail=err instanceof Error?err.message:String(err);return console.warn(` \u26A0\uFE0F Could not archive wish-named agent rows: ${detail}`),0}}function autoKillPane(){let paneId=process.env.TMUX_PANE;if(paneId)setTimeout(()=>{try{let{genieTmuxCmd:genieTmuxCmd2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper));execSync13(genieTmuxCmd2(`kill-pane -t '${paneId}'`),{encoding:"utf-8"})}catch{process.exit(0)}},1000);else process.exit(0)}async function resolveNotificationTargets(){let teamName=process.env.GENIE_TEAM;if(!teamName)return{leader:"team-lead"};try{let teamManager=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leader=await teamManager.resolveLeaderName(teamName),config=await teamManager.getTeam(teamName);return{leader,spawner:config?.spawner}}catch{return{leader:teamName}}}async function notifyWaveCompletion(waveResult,wishComplete,report2){console.log(` \uD83C\uDF0A ${waveResult.waveName} complete! All groups done: ${waveResult.waveGroups.join(", ")}`);try{let protocolRouter=await Promise.resolve().then(() => (init_protocol_router(),exports_protocol_router)),repoPath=process.cwd(),{leader,spawner}=await resolveNotificationTargets(),reportBlock=`
|
|
2975
|
+
`;if(rows.length>0)console.log(` \uD83D\uDCE6 Archived ${rows.length} wish-named agent row${rows.length===1?"":"s"} (team="${slug}")`);return rows.length}catch(err){let detail=err instanceof Error?err.message:String(err);return console.warn(` \u26A0\uFE0F Could not archive wish-named agent rows: ${detail}`),0}}function autoKillPane(){let paneId=process.env.TMUX_PANE;if(paneId)setTimeout(()=>{try{let{genieTmuxCmd:genieTmuxCmd2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper));execSync13(genieTmuxCmd2(`kill-pane -t '${paneId}'`),{encoding:"utf-8"})}catch{process.exit(0)}},1000);else process.exit(0)}async function resolveNotificationTargets(){let teamName=process.env.GENIE_TEAM;if(!teamName)return{leader:"team-lead"};try{let teamManager=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leader=await teamManager.resolveLeaderName(teamName),config=await teamManager.getTeam(teamName);return{leader:leader??teamName,spawner:config?.spawner}}catch{return{leader:teamName}}}async function notifyWaveCompletion(waveResult,wishComplete,report2){console.log(` \uD83C\uDF0A ${waveResult.waveName} complete! All groups done: ${waveResult.waveGroups.join(", ")}`);try{let protocolRouter=await Promise.resolve().then(() => (init_protocol_router(),exports_protocol_router)),repoPath=process.cwd(),{leader,spawner}=await resolveNotificationTargets(),reportBlock=`
|
|
2976
2976
|
|
|
2977
2977
|
--- Handoff ---
|
|
2978
2978
|
${report2.trimEnd()}
|
|
@@ -2989,11 +2989,11 @@ Examples:
|
|
|
2989
2989
|
genie team create hotfix --repo . --branch main # Create from main branch`).action(async(name,options)=>{try{let merged={...options,tmuxSession:options.tmuxSession??options.session};await handleTeamCreate(name,merged)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("hire <agent>").description('Add an agent to a team ("council" hires all 10 council members)').option("--team <name>","Team name (auto-detects from leader context if omitted)").action(async(agent,options)=>{try{let teamName=options.team??await autoDetectTeam();if(!teamName)console.error("Error: Could not detect team. Use --team <name> to specify."),process.exit(1);let added=await hireAgent(teamName,agent);if(added.length===0)console.log(`Agent "${agent}" is already a member of "${teamName}".`);else if(agent==="council"){console.log(`Hired ${added.length} council members to "${teamName}":`);for(let name of added)console.log(` + ${name}`)}else console.log(`Hired "${agent}" to team "${teamName}".`)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("fire <agent>").description("Remove an agent from a team").option("--team <name>","Team name (auto-detects from leader context if omitted)").action(async(agent,options)=>{try{let teamName=options.team??await autoDetectTeam();if(!teamName)console.error("Error: Could not detect team. Use --team <name> to specify."),process.exit(1);if(await fireAgent(teamName,agent))console.log(`Fired "${agent}" from team "${teamName}".`);else console.error(`Agent "${agent}" is not a member of "${teamName}".`),process.exit(1)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("ls [name]").alias("list").description("List teams or members of a team").option("--all","Include archived teams").option("--json","Output as JSON").action(async(name,options)=>{try{if(name)await printMembers(name,options.json);else await printTeams(options.json,options.all)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("archive <name>").description("Archive a team (preserves all data, kills members)").action(async(name)=>{try{if(await archiveTeam(name))console.log(`Team "${name}" archived.`);else console.error(`Team "${name}" not found.`),process.exit(1)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("unarchive <name>").description("Restore an archived team").action(async(name)=>{try{if(await unarchiveTeam(name))console.log(`Team "${name}" unarchived.`);else console.error(`Team "${name}" not found.`),process.exit(1)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("disband <name>").description("Disband a team (archives \u2014 preserves data). Use `genie team archive` directly.").action(async(name)=>{try{if(await disbandTeam(name))console.log("Note: disband now archives the team. Use `genie team archive` directly."),console.log(`Team "${name}" disbanded (archived).`);else console.error(`Team "${name}" not found.`),process.exit(1)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("done <name>").description("Mark a team as done and kill all members").action(async(name)=>{try{await setTeamStatus(name,"done"),await killTeamMembers(name),console.log(`Team "${name}" marked as done. All members killed.`)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("blocked <name>").description("Mark a team as blocked and kill all members").action(async(name)=>{try{await setTeamStatus(name,"blocked"),await killTeamMembers(name),console.log(`Team "${name}" marked as blocked. All members killed.`)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("cleanup").description("Kill tmux windows for done/archived teams").option("--dry-run","Show what would be cleaned without doing it").action(async(options)=>{try{await handleTeamCleanup(options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}),team.command("repair <name>").description("Archive an orphaned team-config dir to ~/.claude/teams/_archive/").option("--dry-run","Show what would be archived without doing it").addHelpText("after",`
|
|
2990
2990
|
This command resolves the doctor's "team_config_orphans" warning by moving
|
|
2991
2991
|
~/.claude/teams/<name>/ (which has no corresponding PG team row) into the
|
|
2992
|
-
_archive/ subdirectory. Inboxes are preserved on disk; nothing is deleted.`).action(async(name,options)=>{try{await handleTeamRepair(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}async function handleTeamCreate(name,options){let resolvedRepo=resolve15(options.repo);if(options.wish){let wishPath=join74(resolvedRepo,".genie","wishes",options.wish,"WISH.md");if(!existsSync62(wishPath)){let cwdWishDir=join74(process.cwd(),".genie","wishes",options.wish),cwdWishPath=join74(cwdWishDir,"WISH.md");if(existsSync62(cwdWishPath)){let destDir=join74(resolvedRepo,".genie","wishes",options.wish);await mkdir8(destDir,{recursive:!0}),await cp(cwdWishDir,destDir,{recursive:!0}),console.log(`Wish: copied ${options.wish}/WISH.md to repo`)}else console.error(`Error: Wish not found at ${wishPath}`),process.exit(1)}}let config=await createTeam(name,options.repo,options.branch),{findSessionByRepo:findSessionByRepo2}=await Promise.resolve().then(() => (init_agent_directory(),exports_agent_directory)),{resolveRepoSession:resolveRepoSession2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux));if(config.tmuxSessionName=options.tmuxSession??await findSessionByRepo2(resolvedRepo)??await resolveRepoSession2(resolvedRepo),options.wish)config.wishSlug=options.wish;if(await updateTeamConfig(name,config),console.log(`Team "${config.name}" created.`),console.log(` Worktree: ${config.worktreePath}`),console.log(` Branch: ${config.name} (from ${config.baseBranch})`),config.tmuxSessionName)console.log(` Session: ${config.tmuxSessionName}`);if(config.nativeTeamsEnabled)console.log(" Native teams: enabled");if(options.wish&&options.spawn!==!1)await spawnLeaderWithWish(config,options.wish,options.repo,options.tmuxSession)}async function spawnLeaderWithWish(config,slug,repoPath,sessionOverride){let{handleWorkerSpawn:handleWorkerSpawn2}=await Promise.resolve().then(() => (init_agents(),exports_agents)),{findSessionByRepo:findSessionByRepo2}=await Promise.resolve().then(() => (init_agent_directory(),exports_agent_directory)),{resolveRepoSession:resolveRepoSession2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux)),resolvedRepo=resolve15(repoPath),tmuxSession=sessionOverride??config.tmuxSessionName??await findSessionByRepo2(resolvedRepo)??await resolveRepoSession2(resolvedRepo);config.tmuxSessionName=tmuxSession,await updateTeamConfig(config.name,config);let leaderAgent=config.name;config.spawner=process.env.GENIE_AGENT_NAME||"cli",await updateTeamConfig(config.name,config);let sourceWishPath=join74(resolvedRepo,".genie","wishes",slug,"WISH.md");if(!existsSync62(sourceWishPath))console.error(`Error: Wish not found at ${sourceWishPath}`),process.exit(1);let destWishDir=join74(config.worktreePath,".genie","wishes",slug);await mkdir8(destWishDir,{recursive:!0});let destWishPath=join74(destWishDir,"WISH.md");await copyFile3(sourceWishPath,destWishPath),console.log(` Wish: copied ${slug}/WISH.md into worktree`);let standardRoles=["
|
|
2992
|
+
_archive/ subdirectory. Inboxes are preserved on disk; nothing is deleted.`).action(async(name,options)=>{try{await handleTeamRepair(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}async function handleTeamCreate(name,options){let resolvedRepo=resolve15(options.repo);if(options.wish){let wishPath=join74(resolvedRepo,".genie","wishes",options.wish,"WISH.md");if(!existsSync62(wishPath)){let cwdWishDir=join74(process.cwd(),".genie","wishes",options.wish),cwdWishPath=join74(cwdWishDir,"WISH.md");if(existsSync62(cwdWishPath)){let destDir=join74(resolvedRepo,".genie","wishes",options.wish);await mkdir8(destDir,{recursive:!0}),await cp(cwdWishDir,destDir,{recursive:!0}),console.log(`Wish: copied ${options.wish}/WISH.md to repo`)}else console.error(`Error: Wish not found at ${wishPath}`),process.exit(1)}}let config=await createTeam(name,options.repo,options.branch),{findSessionByRepo:findSessionByRepo2}=await Promise.resolve().then(() => (init_agent_directory(),exports_agent_directory)),{resolveRepoSession:resolveRepoSession2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux));if(config.tmuxSessionName=options.tmuxSession??await findSessionByRepo2(resolvedRepo)??await resolveRepoSession2(resolvedRepo),options.wish)config.wishSlug=options.wish;if(await updateTeamConfig(name,config),console.log(`Team "${config.name}" created.`),console.log(` Worktree: ${config.worktreePath}`),console.log(` Branch: ${config.name} (from ${config.baseBranch})`),config.tmuxSessionName)console.log(` Session: ${config.tmuxSessionName}`);if(config.nativeTeamsEnabled)console.log(" Native teams: enabled");if(options.wish&&options.spawn!==!1)await spawnLeaderWithWish(config,options.wish,options.repo,options.tmuxSession)}async function spawnLeaderWithWish(config,slug,repoPath,sessionOverride){let{handleWorkerSpawn:handleWorkerSpawn2}=await Promise.resolve().then(() => (init_agents(),exports_agents)),{findSessionByRepo:findSessionByRepo2}=await Promise.resolve().then(() => (init_agent_directory(),exports_agent_directory)),{resolveRepoSession:resolveRepoSession2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux)),resolvedRepo=resolve15(repoPath),tmuxSession=sessionOverride??config.tmuxSessionName??await findSessionByRepo2(resolvedRepo)??await resolveRepoSession2(resolvedRepo);config.tmuxSessionName=tmuxSession,await updateTeamConfig(config.name,config);let leaderAgent=config.name;config.spawner=process.env.GENIE_AGENT_NAME||"cli",await updateTeamConfig(config.name,config);let sourceWishPath=join74(resolvedRepo,".genie","wishes",slug,"WISH.md");if(!existsSync62(sourceWishPath))console.error(`Error: Wish not found at ${sourceWishPath}`),process.exit(1);let destWishDir=join74(config.worktreePath,".genie","wishes",slug);await mkdir8(destWishDir,{recursive:!0});let destWishPath=join74(destWishDir,"WISH.md");await copyFile3(sourceWishPath,destWishPath),console.log(` Wish: copied ${slug}/WISH.md into worktree`);let standardRoles=["engineer","reviewer","qa","fix"];for(let role of standardRoles)await hireAgent(config.name,role);console.log(` Team: hired ${standardRoles.join(", ")}`);let members=standardRoles.filter((r)=>r!=="team-lead").join(", "),spawner=config.spawner||"cli",kickoffPrompt=`Your team is "${config.name}". Repo: ${config.repo}. Branch: ${config.name}. Worktree: ${config.worktreePath}. Wish slug: ${slug}. Your team members are: ${members} (already hired \u2014 genie work will spawn them automatically). Report completion to: ${spawner} (via genie send --to ${spawner}). Read the wish at .genie/wishes/${slug}/WISH.md and execute the full lifecycle autonomously.`,broadcasts=await getRecentBroadcasts(config.name);if(broadcasts.length>0){let broadcastLines=broadcasts.map((b2)=>`[${b2.sender}] ${b2.text}`).join(`
|
|
2993
2993
|
`);kickoffPrompt+=`
|
|
2994
2994
|
|
|
2995
2995
|
Recent team broadcasts for context:
|
|
2996
|
-
${broadcastLines}`}await handleWorkerSpawn2("team-lead",{provider:"claude",team:config.name,role:leaderAgent,cwd:config.worktreePath,session:tmuxSession,initialPrompt:kickoffPrompt});let{getAgentByName:getAgentByName2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),leader=await getAgentByName2(leaderAgent,config.name).catch(()=>null);if(leader?.id)config.leader=leader.id,await updateTeamConfig(config.name,config);console.log(` Leader: ${leaderAgent} spawned as ${slug}`)}async function autoDetectTeam(){let envTeam=process.env.GENIE_TEAM;if(envTeam)return envTeam;let teams=await listTeams();if(teams.length===1)return teams[0].name;return null}async function getRecentBroadcasts(teamName,minutesAgo=5){try{let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2(),since=new Date(Date.now()-minutesAgo*60*1000);return(await sql`
|
|
2996
|
+
${broadcastLines}`}await handleWorkerSpawn2("team-lead",{provider:"claude",team:config.name,role:leaderAgent,cwd:config.worktreePath,session:tmuxSession,initialPrompt:kickoffPrompt});let{getAgentByName:getAgentByName2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),leader=await getAgentByName2(leaderAgent,config.name).catch(()=>null);if(leader?.id)config.leader=leader.id,await updateTeamConfig(config.name,config),await hireAgent(config.name,leader.id);console.log(` Leader: ${leaderAgent} spawned as ${slug}`)}async function autoDetectTeam(){let envTeam=process.env.GENIE_TEAM;if(envTeam)return envTeam;let teams=await listTeams();if(teams.length===1)return teams[0].name;return null}async function getRecentBroadcasts(teamName,minutesAgo=5){try{let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2(),since=new Date(Date.now()-minutesAgo*60*1000);return(await sql`
|
|
2997
2997
|
SELECT m.sender_id, m.body, m.created_at
|
|
2998
2998
|
FROM messages m
|
|
2999
2999
|
JOIN conversations c ON c.id = m.conversation_id
|
|
@@ -3024,7 +3024,7 @@ ${answer}
|
|
|
3024
3024
|
`)}function getGitDiff(){try{let diff=execSync15("git diff HEAD",{encoding:"utf-8",maxBuffer:1048576}),staged=execSync15("git diff --cached",{encoding:"utf-8",maxBuffer:1048576}),combined=[diff,staged].filter(Boolean).join(`
|
|
3025
3025
|
`);if(combined.length>50000)return`${combined.slice(0,50000)}
|
|
3026
3026
|
|
|
3027
|
-
... (diff truncated at 50KB)`;return combined}catch{return""}}function parseWishGroups(content){let groups=[],groupPattern=/^### Group ([A-Za-z0-9]+):[ \t]*(.*)$/gim,match=groupPattern.exec(content);while(match!==null){let name=match[1],trimmedTitle=(match[2]??"").trim(),title=trimmedTitle.length>0?trimmedTitle:void 0,start3=match.index,rest=content.slice(start3+match[0].length),nextGroupIdx=rest.search(/^### Group [A-Za-z0-9]+:/m),depsMatch=(nextGroupIdx!==-1?rest.slice(0,nextGroupIdx):rest).match(/\*\*depends-on:\*\*\s*(.+)/i),dependsOn=[];if(depsMatch){let depsNormalized=depsMatch[1].trim().replace(/\s*\([^)]*\)/g,"").trim();if(depsNormalized.toLowerCase()!=="none")dependsOn=depsNormalized.split(",").map((d)=>d.trim().replace(/^groups?\s*/i,"").replace(/^[a-z0-9-]+#/,"").trim()).filter(Boolean)}let groupDef={name,dependsOn};if(title!==void 0)groupDef.title=title;groups.push(groupDef),match=groupPattern.exec(content)}return groups}function parseExecutionStrategy(content){let strategyMatch=content.match(/^## Execution Strategy\s*$/m);if(!strategyMatch||strategyMatch.index===void 0)return buildFallbackWaves(content);let strategyStart=strategyMatch.index+strategyMatch[0].length,nextSectionMatch=content.slice(strategyStart).match(/^## /m),strategyEnd=nextSectionMatch?.index!==void 0?strategyStart+nextSectionMatch.index:content.length,strategyContent=content.slice(strategyStart,strategyEnd),waves=[],wavePattern=/^### (Wave \d+[^\n]*)/gm,waveMatch=wavePattern.exec(strategyContent);while(waveMatch!==null){let waveName=waveMatch[1].trim(),waveStart=waveMatch.index+waveMatch[0].length,nextWaveIdx=strategyContent.slice(waveStart).search(/^### /m),waveEnd=nextWaveIdx!==-1?waveStart+nextWaveIdx:strategyContent.length,waveContent=strategyContent.slice(waveStart,waveEnd),waveGroups=[],tableRowPattern=/^\|\s*([^|]+?)\s*\|\s*([^|]+?)\s*\|\s*[^|]*\s*\|$/gm,rowMatch=tableRowPattern.exec(waveContent);while(rowMatch!==null){let groupVal=rowMatch[1].trim(),agentVal=rowMatch[2].trim();if(groupVal!=="Group"&&!groupVal.startsWith("-"))waveGroups.push({group:groupVal,agent:agentVal});rowMatch=tableRowPattern.exec(waveContent)}if(waveGroups.length>0)waves.push({name:waveName,groups:waveGroups});waveMatch=wavePattern.exec(strategyContent)}if(waves.length===0)return buildFallbackWaves(content);return waves}function buildFallbackWaves(content){let groups=parseWishGroups(content);if(groups.length===0)return[];return[{name:"Wave 1 (sequential fallback)",groups:groups.map((g)=>({group:g.name,agent:"engineer"}))}]}async function resolveLeaderTarget(){let teamName=process.env.GENIE_TEAM;if(!teamName)return"team-lead";try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return await resolveLeaderName2(teamName)}catch{return teamName}}function detectWorkMode(ref,agent){if(!agent){if(ref.includes("#"))throw Error("Manual dispatch requires an agent: genie work <slug>#<group> <agent>");return{mode:"auto",slug:ref}}if(ref.includes("#"))return{mode:"manual",ref,agent};if(agent.includes("#"))return{mode:"manual",ref:agent,agent:ref};throw Error('Invalid: ref must contain "#" \u2014 use "genie work <slug>" or "genie work <agent> <slug>#<group>"')}async function autoOrchestrateCommand(slug){let wishPath,actualSlug=slug;if(parseWishRef(slug).namespace){let resolved=await resolveWish(slug);wishPath=resolved.wishPath,actualSlug=resolved.slug;let{handleTeamCreate:handleTeamCreate2}=await Promise.resolve().then(() => (init_team(),exports_team));await handleTeamCreate2(actualSlug,{repo:resolved.repo,branch:"dev",wish:actualSlug,tmuxSession:resolved.session});return}if(validateSlug(slug),wishPath=join77(process.cwd(),".genie","wishes",slug,"WISH.md"),!existsSync65(wishPath))console.error(`\u274C Wish not found: ${wishPath}`),console.error(` Create it first: genie wish <agent> ${slug}`),process.exit(1);Promise.resolve().then(() => (init_wish_sync(),exports_wish_sync)).then((ws)=>ws.syncWishes(process.cwd())).catch(()=>{});let content=await readFile13(wishPath,"utf-8"),groups=parseWishGroups(content),waves=parseExecutionStrategy(content);if(waves.length===0)console.error("\u274C No execution groups found in wish"),process.exit(1);let state=await getOrCreateState(slug,groups),nextWave=waves.find((wave)=>wave.groups.some((g)=>{let gs=state?.groups[g.group];return!gs||gs.status==="ready"}));if(!nextWave){console.log(`\u2705 All waves already dispatched for wish "${slug}"`);return}console.log(`\uD83D\uDE80 Dispatching ${nextWave.name} for wish "${slug}" \u2014 ${nextWave.groups.length} group(s)`);let results=await Promise.allSettled(nextWave.groups.map(({group,agent})=>{let ref=`${slug}#${group}`;return workDispatchCommand(agent,ref)})),succeeded=[],failed=[];if(results.forEach((r,i2)=>{let groupName=nextWave.groups[i2].group,agent=nextWave.groups[i2].agent;if(r.status==="fulfilled")succeeded.push(groupName);else{let reason=r.reason instanceof Error?r.reason.message:String(r.reason),errorClass=r.reason instanceof Error?r.reason.constructor.name:"string";failed.push({group:groupName,agent,reason,errorClass})}}),succeeded.length>0)console.log(`
|
|
3027
|
+
... (diff truncated at 50KB)`;return combined}catch{return""}}function parseWishGroups(content){let groups=[],groupPattern=/^### Group ([A-Za-z0-9]+):[ \t]*(.*)$/gim,match=groupPattern.exec(content);while(match!==null){let name=match[1],trimmedTitle=(match[2]??"").trim(),title=trimmedTitle.length>0?trimmedTitle:void 0,start3=match.index,rest=content.slice(start3+match[0].length),nextGroupIdx=rest.search(/^### Group [A-Za-z0-9]+:/m),depsMatch=(nextGroupIdx!==-1?rest.slice(0,nextGroupIdx):rest).match(/\*\*depends-on:\*\*\s*(.+)/i),dependsOn=[];if(depsMatch){let depsNormalized=depsMatch[1].trim().replace(/\s*\([^)]*\)/g,"").trim();if(depsNormalized.toLowerCase()!=="none")dependsOn=depsNormalized.split(",").map((d)=>d.trim().replace(/^groups?\s*/i,"").replace(/^[a-z0-9-]+#/,"").trim()).filter(Boolean)}let groupDef={name,dependsOn};if(title!==void 0)groupDef.title=title;groups.push(groupDef),match=groupPattern.exec(content)}return groups}function parseExecutionStrategy(content){let strategyMatch=content.match(/^## Execution Strategy\s*$/m);if(!strategyMatch||strategyMatch.index===void 0)return buildFallbackWaves(content);let strategyStart=strategyMatch.index+strategyMatch[0].length,nextSectionMatch=content.slice(strategyStart).match(/^## /m),strategyEnd=nextSectionMatch?.index!==void 0?strategyStart+nextSectionMatch.index:content.length,strategyContent=content.slice(strategyStart,strategyEnd),waves=[],wavePattern=/^### (Wave \d+[^\n]*)/gm,waveMatch=wavePattern.exec(strategyContent);while(waveMatch!==null){let waveName=waveMatch[1].trim(),waveStart=waveMatch.index+waveMatch[0].length,nextWaveIdx=strategyContent.slice(waveStart).search(/^### /m),waveEnd=nextWaveIdx!==-1?waveStart+nextWaveIdx:strategyContent.length,waveContent=strategyContent.slice(waveStart,waveEnd),waveGroups=[],tableRowPattern=/^\|\s*([^|]+?)\s*\|\s*([^|]+?)\s*\|\s*[^|]*\s*\|$/gm,rowMatch=tableRowPattern.exec(waveContent);while(rowMatch!==null){let groupVal=rowMatch[1].trim(),agentVal=rowMatch[2].trim();if(groupVal!=="Group"&&!groupVal.startsWith("-"))waveGroups.push({group:groupVal,agent:agentVal});rowMatch=tableRowPattern.exec(waveContent)}if(waveGroups.length>0)waves.push({name:waveName,groups:waveGroups});waveMatch=wavePattern.exec(strategyContent)}if(waves.length===0)return buildFallbackWaves(content);return waves}function buildFallbackWaves(content){let groups=parseWishGroups(content);if(groups.length===0)return[];return[{name:"Wave 1 (sequential fallback)",groups:groups.map((g)=>({group:g.name,agent:"engineer"}))}]}async function resolveLeaderTarget(){let teamName=process.env.GENIE_TEAM;if(!teamName)return"team-lead";try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return await resolveLeaderName2(teamName)??teamName}catch{return teamName}}function detectWorkMode(ref,agent){if(!agent){if(ref.includes("#"))throw Error("Manual dispatch requires an agent: genie work <slug>#<group> <agent>");return{mode:"auto",slug:ref}}if(ref.includes("#"))return{mode:"manual",ref,agent};if(agent.includes("#"))return{mode:"manual",ref:agent,agent:ref};throw Error('Invalid: ref must contain "#" \u2014 use "genie work <slug>" or "genie work <agent> <slug>#<group>"')}async function autoOrchestrateCommand(slug){let wishPath,actualSlug=slug;if(parseWishRef(slug).namespace){let resolved=await resolveWish(slug);wishPath=resolved.wishPath,actualSlug=resolved.slug;let{handleTeamCreate:handleTeamCreate2}=await Promise.resolve().then(() => (init_team(),exports_team));await handleTeamCreate2(actualSlug,{repo:resolved.repo,branch:"dev",wish:actualSlug,tmuxSession:resolved.session});return}if(validateSlug(slug),wishPath=join77(process.cwd(),".genie","wishes",slug,"WISH.md"),!existsSync65(wishPath))console.error(`\u274C Wish not found: ${wishPath}`),console.error(` Create it first: genie wish <agent> ${slug}`),process.exit(1);Promise.resolve().then(() => (init_wish_sync(),exports_wish_sync)).then((ws)=>ws.syncWishes(process.cwd())).catch(()=>{});let content=await readFile13(wishPath,"utf-8"),groups=parseWishGroups(content),waves=parseExecutionStrategy(content);if(waves.length===0)console.error("\u274C No execution groups found in wish"),process.exit(1);let state=await getOrCreateState(slug,groups),nextWave=waves.find((wave)=>wave.groups.some((g)=>{let gs=state?.groups[g.group];return!gs||gs.status==="ready"}));if(!nextWave){console.log(`\u2705 All waves already dispatched for wish "${slug}"`);return}console.log(`\uD83D\uDE80 Dispatching ${nextWave.name} for wish "${slug}" \u2014 ${nextWave.groups.length} group(s)`);let results=await Promise.allSettled(nextWave.groups.map(({group,agent})=>{let ref=`${slug}#${group}`;return workDispatchCommand(agent,ref)})),succeeded=[],failed=[];if(results.forEach((r,i2)=>{let groupName=nextWave.groups[i2].group,agent=nextWave.groups[i2].agent;if(r.status==="fulfilled")succeeded.push(groupName);else{let reason=r.reason instanceof Error?r.reason.message:String(r.reason),errorClass=r.reason instanceof Error?r.reason.constructor.name:"string";failed.push({group:groupName,agent,reason,errorClass})}}),succeeded.length>0)console.log(`
|
|
3028
3028
|
\u2705 Agents dispatched for ${nextWave.name} (groups: ${succeeded.join(", ")})`);if(failed.length>0){console.error(`
|
|
3029
3029
|
\u274C ${failed.length} group(s) failed to dispatch in ${nextWave.name}:`);for(let{group,agent,reason,errorClass}of failed)console.error(` \u2022 Group ${group} (${agent}): [${errorClass}] ${reason}`),recordAuditEvent("wish",actualSlug,"wish.dispatch.failed",getActor(),{wish_slug:actualSlug,wave_name:nextWave.name,group_name:group,agent_name:agent,error_class:errorClass,reason}).catch(()=>{});console.error(` Check state with: genie status ${slug}`),console.error(" Some groups may have mutated state before failing \u2014 rerun genie work to retry.")}if(console.log(` Monitor: genie status ${slug}`),console.log(" Logs: genie read <agent>"),failed.length>0)process.exitCode=1}async function brainstormCommand(agentName,slug){validateSlug(slug);let draftPath=join77(process.cwd(),".genie","brainstorms",slug,"DRAFT.md");if(!existsSync65(draftPath))console.error(`\u274C Draft not found: ${draftPath}`),console.error(` Create it first: mkdir -p .genie/brainstorms/${slug} && touch .genie/brainstorms/${slug}/DRAFT.md`),process.exit(1);let content=await readFile13(draftPath,"utf-8"),context=buildContextPrompt({filePath:draftPath,sectionContent:content,command:"brainstorm",skill:"brainstorm"}),contextFile=await writeContextFile(context);console.log(`\uD83D\uDCDD Dispatching brainstorm to ${agentName} for "${slug}"`),console.log(` Draft: ${draftPath}`);let brainstormPrompt=`Brainstorm "${slug}". Your context is in the system prompt. Explore the idea, ask clarifying questions, and build toward a design.`;await handleWorkerSpawn(agentName,{provider:"claude",cwd:process.cwd(),extraArgs:["--append-system-prompt-file",contextFile],initialPrompt:brainstormPrompt});let repoPath=process.cwd(),result2=await sendMessage2(repoPath,await cliSender(),agentName,brainstormPrompt);if(!result2.delivered)console.warn(`\u26A0 Backup delivery to ${agentName} failed: ${result2.reason??"unknown"}`)}async function wishCommand(agentName,slug){validateSlug(slug);let designPath=join77(process.cwd(),".genie","brainstorms",slug,"DESIGN.md");if(!existsSync65(designPath))console.error(`\u274C Design not found: ${designPath}`),console.error(` Run brainstorm first: genie brainstorm <agent> ${slug}`),process.exit(1);let content=await readFile13(designPath,"utf-8"),context=buildContextPrompt({filePath:designPath,sectionContent:content,command:"wish",skill:"wish"}),contextFile=await writeContextFile(context);console.log(`\uD83D\uDCDD Dispatching wish to ${agentName} for "${slug}"`),console.log(` Design: ${designPath}`);let wishPrompt=`Create a wish from the design for "${slug}". Your context is in the system prompt. Write the WISH.md with execution groups, acceptance criteria, and validation commands.`;await handleWorkerSpawn(agentName,{provider:"claude",cwd:process.cwd(),extraArgs:["--append-system-prompt-file",contextFile],initialPrompt:wishPrompt});let repoPath=process.cwd(),result2=await sendMessage2(repoPath,await cliSender(),agentName,wishPrompt);if(!result2.delivered)console.warn(`\u26A0 Backup delivery to ${agentName} failed: ${result2.reason??"unknown"}`)}async function workDispatchCommand(agentName,ref){let{slug,group}=parseRef(ref);validateSlug(slug);let wishPath=join77(process.cwd(),".genie","wishes",slug,"WISH.md"),dispatchSpan=isWideEmitEnabled()?startSpan("wish.dispatch",{wish_slug:slug,group_name:group},{source_subsystem:"dispatch",ctx:getAmbient()??void 0,agent:agentName}):null;try{if(await runWorkDispatch(slug,group,agentName,wishPath,ref),dispatchSpan)endSpan(dispatchSpan,{outcome:"completed"},{source_subsystem:"dispatch",agent:agentName})}catch(err){if(dispatchSpan)endSpan(dispatchSpan,{outcome:"failed"},{source_subsystem:"dispatch",agent:agentName});throw err}}async function runWorkDispatch(slug,group,agentName,wishPath,ref){if(!existsSync65(wishPath))throw Error(`Wish not found: ${wishPath}. Create it first: genie wish <agent> ${slug}`);let content=await readFile13(wishPath,"utf-8"),groupSection=extractGroup(content,group);if(!groupSection){let availableGroups=content.match(/^### Group [A-Za-z0-9]+:.*$/gm),availableList=availableGroups?availableGroups.join(", "):"(none)";throw Error(`Group "${group}" not found in ${wishPath}. Available: ${availableList}`)}let groups=parseWishGroups(content);await getOrCreateState(slug,groups);try{await startGroup(slug,group,agentName),console.log(`\u2705 Group "${group}" set to in_progress (assigned to ${agentName})`)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);throw Error(message)}let wishContext=extractWishContext(content),enrichedContext;try{let{enrichContext:enrichContext2}=await Promise.resolve().then(() => (init_context_enrichment(),exports_context_enrichment));enrichedContext=enrichContext2({query:`${slug} ${group}: ${groupSection.slice(0,500)}`})||void 0}catch{}let context=buildContextPrompt({filePath:wishPath,sectionContent:groupSection,wishContext,command:`work ${ref}`,skill:"work",enrichedContext}),contextFile=await writeContextFile(context);console.log(`\uD83D\uDD27 Dispatching work to ${agentName} for "${ref}"`),console.log(` Wish: ${wishPath}`),console.log(` Group: ${group}`);let effectiveRole=`${agentName}-${group}-${randomUUID14().slice(0,4)}`,leaderTarget=await resolveLeaderTarget(),workPrompt=`Execute Group ${group} of wish "${slug}". Your full context is in the system prompt. Read the wish at ${wishPath} if needed. Implement all deliverables, run validation, and report completion.
|
|
3030
3030
|
|
|
@@ -3625,7 +3625,7 @@ $ bun add react-devtools-core@7 -d
|
|
|
3625
3625
|
ORDER BY a.started_at DESC
|
|
3626
3626
|
`).map(mapAssignment)}function mapExecutor(row2){let meta=row2.metadata;return{id:String(row2.id),agentId:String(row2.agent_id),agentName:row2.agent_name?String(row2.agent_name):null,provider:String(row2.provider),transport:String(row2.transport),pid:row2.pid!=null?Number(row2.pid):null,tmuxSession:row2.tmux_session?String(row2.tmux_session):null,tmuxPaneId:row2.tmux_pane_id?String(row2.tmux_pane_id):null,state:String(row2.state),metadata:typeof meta==="string"?JSON.parse(meta):meta??{},startedAt:row2.started_at instanceof Date?row2.started_at.toISOString():String(row2.started_at),role:row2.role?String(row2.role):null,team:row2.team?String(row2.team):null}}function mapAssignment(row2){return{id:String(row2.id),executorId:String(row2.executor_id),taskId:row2.task_id?String(row2.task_id):null,taskTitle:row2.task_title?String(row2.task_title):null,wishSlug:row2.wish_slug?String(row2.wish_slug):null,groupNumber:row2.group_number!=null?Number(row2.group_number):null,startedAt:row2.started_at instanceof Date?row2.started_at.toISOString():String(row2.started_at)}}async function loadAgentWorkStates(){let{listAgentsForRender:listAgentsForRender2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),{shouldResume:shouldResume2,BOOT_PASS_CONCURRENCY_CAP:BOOT_PASS_CONCURRENCY_CAP2}=await Promise.resolve().then(() => (init_should_resume(),exports_should_resume)),agents=await listAgentsForRender2({includeArchived:!1});if(agents.length===0)return new Map;let out=new Map,cursor=0,cap=Math.min(BOOT_PASS_CONCURRENCY_CAP2,Math.max(1,agents.length)),workers=Array.from({length:cap},async()=>{while(cursor<agents.length){let i2=cursor++;if(i2>=agents.length)return;let a=agents[i2];try{let decision=await shouldResume2(a.id),work=reasonToWorkState(decision.reason);if(!work)continue;let name=a.customName??a.role??a.id;mergeWorkState(out,name,work)}catch{}}});return await Promise.all(workers),out}function mergeWorkState(states,name,next){let current=states.get(name);if(!current||WORK_STATE_PRIORITY[next]>WORK_STATE_PRIORITY[current])states.set(name,next)}function reasonToWorkState(reason){if(reason==="ok")return"in_flight";if(reason==="auto_resume_disabled")return"paused";if(reason==="assignment_closed")return"done";if(reason==="no_session_id")return"stuck";return}async function loadAgentObservabilityForTui(){try{return await loadAgentObservabilityMap()}catch{return new Map}}var WORK_STATE_PRIORITY;var init_db2=__esm(()=>{init_agent_observability();WORK_STATE_PRIORITY={in_flight:4,paused:3,stuck:2,done:1}});import{execSync as execSync17}from"child_process";function getProcessCommandByPid(pids){let uniquePids=[...new Set(pids.filter((pid)=>Number.isFinite(pid)&&pid>0))];if(uniquePids.length===0)return new Map;let output=execQuiet(`ps -p ${uniquePids.join(",")} -o pid=,command=`),commands=new Map;for(let line of output.split(`
|
|
3627
3627
|
`)){let match=line.trim().match(/^(\d+)\s+(.+)$/);if(!match)continue;commands.set(Number.parseInt(match[1],10),match[2])}return commands}function execQuiet(cmd){try{return execSync17(cmd,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return""}}function parsePaneLine(parts,processCommandByPid){let[sessionName,winIdxStr,winName,winActive,winPanes,paneIdxStr,paneId,panePidStr,paneCmd,paneTitle,paneSize,sessAttached,sessWindows,sessCreated,paneDead]=parts;return{sessionName,winIdxStr,session:{name:sessionName,attached:sessAttached==="1",windowCount:Number.parseInt(sessWindows,10)||0,created:Number.parseInt(sessCreated,10)||0},window:{sessionName,index:Number.parseInt(winIdxStr,10)||0,name:winName,active:winActive==="1",paneCount:Number.parseInt(winPanes,10)||0},pane:{sessionName,windowIndex:Number.parseInt(winIdxStr,10)||0,paneIndex:Number.parseInt(paneIdxStr,10)||0,paneId,pid:Number.parseInt(panePidStr,10)||0,command:paneCmd,processCommand:processCommandByPid.get(Number.parseInt(panePidStr,10)||0)??"",title:paneTitle,size:paneSize,isDead:paneDead==="1"}}}function getTmuxInventory(){let paneOutput=execQuiet(`${tmuxBin()} -L genie list-panes -a -F '#{session_name}|#{window_index}|#{window_name}|#{window_active}|#{window_panes}|#{pane_index}|#{pane_id}|#{pane_pid}|#{pane_current_command}|#{pane_title}|#{pane_width}x#{pane_height}|#{session_attached}|#{session_windows}|#{session_created}|#{pane_dead}'`);if(!paneOutput)return[];let paneLines=paneOutput.split(`
|
|
3628
|
-
`).filter(Boolean),panePids=paneLines.map((line)=>Number.parseInt(line.split("|")[7]??"",10)).filter((pid)=>Number.isFinite(pid)&&pid>0),processCommandByPid=getProcessCommandByPid(panePids),sessionMap=new Map,windowMap=new Map;for(let line of paneLines){let parts=line.split("|");if(parts.length<15)continue;let parsed=parsePaneLine(parts,processCommandByPid);if(!sessionMap.has(parsed.sessionName))sessionMap.set(parsed.sessionName,{...parsed.session,windows:[]});let winKey=`${parsed.sessionName}:${parsed.winIdxStr}`;if(!windowMap.has(winKey)){let win={...parsed.window,panes:[]};windowMap.set(winKey,win),sessionMap.get(parsed.sessionName)?.windows.push(win)}windowMap.get(winKey)?.panes.push(parsed.pane)}return Array.from(sessionMap.values()).sort((a,b3)=>a.name.localeCompare(b3.name))}function isPidAlive4(pid){try{return process.kill(pid,0),!0}catch{return!1}}function allClaudePanes(sessions2){return sessions2.flatMap((s2)=>s2.windows.flatMap((w2)=>w2.panes)).filter(isClaudeLikePane)}function detectGaps(executors,sessions2){let deadPidExecutors=executors.filter((e)=>e.pid!=null&&!isPidAlive4(e.pid)),executorPaneIds=new Set(executors.map((e)=>e.tmuxPaneId).filter(Boolean)),claudePanes=allClaudePanes(sessions2),orphanPanes=claudePanes.filter((p)=>!executorPaneIds.has(p.paneId)),linkedCount=executors.filter((e)=>e.tmuxPaneId&&!deadPidExecutors.some((d2)=>d2.id===e.id)).length,deadPaneCount=sessions2.flatMap((s2)=>s2.windows.flatMap((w2)=>w2.panes)).filter((p)=>p.isDead).length;return{deadPidExecutors,orphanPanes,linkedCount,totalExecutors:executors.length,totalClaudePanes:claudePanes.length,deadPaneCount}}async function collectDiagnostics(){let{loadExecutors:loadExecutors2,loadAssignments:loadAssignments2,loadAgentWorkStates:loadAgentWorkStates2,loadAgentObservabilityForTui:loadAgentObservabilityForTui2}=await Promise.resolve().then(() => (init_db2(),exports_db2)),sessions2=getTmuxInventory(),executors=[];try{executors=await loadExecutors2()}catch{}let executorIds=executors.map((e)=>e.id),assignments=[];try{assignments=await loadAssignments2(executorIds)}catch{}let workStates=new Map,alertCount=0,observability=new Map;try{workStates=await loadAgentWorkStates2()}catch{}observability=await loadAgentObservabilityForTui2();try{let{listActiveDerivedSignals:listActiveDerivedSignals2}=await Promise.resolve().then(() => (init_derived_signals(),exports_derived_signals));alertCount=(await listActiveDerivedSignals2()).length}catch{}let gaps=detectGaps(executors,sessions2);if(gaps.deadPidExecutors.length>0)try{let{terminateExecutor:terminateExecutor2}=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2();await Promise.allSettled(gaps.deadPidExecutors.map(async(exec3)=>{if(await terminateExecutor2(exec3.id),exec3.agentId)await sql`UPDATE agents SET current_executor_id = NULL WHERE current_executor_id = ${exec3.id}`}))}catch{}return{sessions:sessions2,executors,assignments,gaps,workStates,observability,alertCount,timestamp:Date.now()}}var init_diagnostics=__esm(()=>{init_ensure_tmux();init_pane_detection()});import{existsSync as existsSync76,readFileSync as readFileSync50,unlinkSync as unlinkSync13}from"fs";import{homedir as homedir51}from"os";import{join as join93}from"path";function getInitialAgentFilePath(){let genieHome6=process.env.GENIE_HOME??join93(homedir51(),".genie");return join93(genieHome6,"tui-initial-agent")}function consumeInitialAgentSignal(){let filePath=getInitialAgentFilePath();if(!existsSync76(filePath))return;try{let agent=readFileSync50(filePath,"utf-8").trim();return unlinkSync13(filePath),agent||void 0}catch{return}}var init_initial_agent=()=>{};function toSessionName(agentName){return agentName.replace(/\//g,"-")}function buildSessionTree(snapshot){let executorByPaneId=new Map;for(let exec3 of snapshot.executors)if(exec3.tmuxPaneId)executorByPaneId.set(exec3.tmuxPaneId,exec3);return snapshot.sessions.filter((s2)=>s2.name!==TUI_SESSION2).map((session)=>sessionToNode(session,executorByPaneId))}function buildWorkspaceTree(input){let{agentNames,sessions:sessions2,executors}=input,workStates=input.workStates??new Map,sessionByName=new Map;for(let s2 of sessions2)if(s2.name!==TUI_SESSION2)sessionByName.set(s2.name,s2);let executorByPaneId=new Map;for(let exec3 of executors)if(exec3.tmuxPaneId)executorByPaneId.set(exec3.tmuxPaneId,exec3);let executorsByAgent=new Map;for(let exec3 of executors){let name=exec3.agentName??exec3.metadata?.agentName;if(typeof name==="string"){let list2=executorsByAgent.get(name)??[];list2.push(exec3),executorsByAgent.set(name,list2)}}let{topLevel,subsByParent}=groupAgentNames(agentNames),nodes=topLevel.map((name)=>{let node=buildAgentNode(name,sessionByName.get(toSessionName(name)),executorsByAgent.get(name)??[],executorByPaneId,workStates.get(name),"canonical");return appendSubAgentNodes(node,subsByParent.get(name),sessionByName,executorsByAgent,executorByPaneId,workStates),node}),claimedSessions=new Set(agentNames.map(toSessionName));for(let[name,session]of sessionByName)if(!claimedSessions.has(name))nodes.push(sessionToNode(session,executorByPaneId));return nodes}function resolvePreferredWindowIndex(session,agentName){let windows=[...session.windows].sort((a,b3)=>a.index-b3.index),hasClaudePane=(window2)=>window2.panes.some(isClaudeLikePane);return(windows.find((window2)=>window2.active&&hasClaudePane(window2))??(agentName?windows.find((window2)=>window2.name===agentName):void 0)??windows.find((window2)=>hasClaudePane(window2))??windows.find((window2)=>window2.active&&window2.index!==0)??windows.find((window2)=>window2.index!==0))?.index}function hasLiveClaudeWindow(session){return session.windows.some((window2)=>window2.panes.some(isClaudeLikePane))}function groupAgentNames(names){let topLevel=[],subsByParent=new Map;for(let name of names){let slashIdx=name.indexOf("/");if(slashIdx===-1)topLevel.push(name);else{let parent=name.slice(0,slashIdx),subs=subsByParent.get(parent)??[];subs.push(name),subsByParent.set(parent,subs)}}return{topLevel,subsByParent}}function appendSubAgentNodes(parent,subs,sessionByName,executorsByAgent,executorByPaneId,workStates){if(!subs)return;for(let subName of subs){let subLabel=subName.slice(subName.indexOf("/")+1),subNode=buildAgentNode(subName,sessionByName.get(toSessionName(subName)),executorsByAgent.get(subName)??[],executorByPaneId,workStates.get(subName),"subagent");subNode.label=subLabel,subNode.depth=1,parent.children.push(subNode)}}function countClaudePanes(session){return session.windows.reduce((sum,w2)=>sum+w2.panes.filter(isClaudeLikePane).length,0)}function buildAgentNode(name,session,agentExecutors,executorByPaneId,workState,kind){let wsState=deriveWsAgentState(session,agentExecutors),attachWindowIndex=session?resolvePreferredWindowIndex(session,name):void 0,children=[];if(session)for(let win of session.windows){if(win.index===0)continue;children.push(windowToNode(session.name,win,executorByPaneId))}let node={id:`agent:${name}`,type:"agent",label:name,depth:0,expanded:children.length>0,children,data:{sessionName:toSessionName(name),windowCount:session?session.windows.length:0,attachWindowIndex,provider:agentExecutors[0]?.provider??null},activePanes:session?countClaudePanes(session):0,agentState:agentExecutors.length>0?deriveExecutorState(agentExecutors):void 0,wsAgentState:wsState,kind};if(workState)node.workState=workState;return node}function deriveWsAgentState(session,agentExecutors){if(!session)return"stopped";if(hasLiveClaudeWindow(session))return"running";for(let exec3 of agentExecutors){if(exec3.state==="error"||exec3.state==="terminated")return"error";if(exec3.state==="spawning")return"spawning"}if(agentExecutors.length===0)return"stopped";return"running"}function deriveExecutorState(execs){for(let e of execs)if(e.state==="working")return"working";for(let e of execs)if(e.state==="permission")return"permission";for(let e of execs)if(e.state==="error"||e.state==="terminated")return"error";return"idle"}function sessionToNode(session,executorMap){let claudePanes=session.windows.reduce((sum,w2)=>sum+w2.panes.filter(isClaudeLikePane).length,0);return{id:`session:${session.name}`,type:"session",label:session.name,depth:0,expanded:!0,children:session.windows.map((w2)=>windowToNode(session.name,w2,executorMap)),data:{attached:session.attached,windowCount:session.windowCount},activePanes:claudePanes,agentState:void 0,wsAgentState:void 0}}function windowToNode(sessionName,window2,executorMap){let activePanes=window2.panes.filter(isClaudeLikePane).length;return{id:`window:${sessionName}:${window2.index}`,type:"window",label:window2.name,depth:1,expanded:!0,children:window2.panes.map((p)=>paneToNode(sessionName,window2.index,p,executorMap)),data:{active:window2.active,paneCount:window2.paneCount},activePanes,agentState:void 0,wsAgentState:void 0}}function paneToNode(sessionName,windowIndex,pane,executorMap){let executor=executorMap.get(pane.paneId),isClaude=isClaudeLikePane(pane);return{id:`pane:${pane.paneId}`,type:"pane",label:derivePaneLabel(pane,executor,isClaude),depth:2,expanded:!1,children:[],data:{command:pane.command,processCommand:pane.processCommand,title:pane.title,isClaudeLike:isClaude,isDead:pane.isDead,pid:pane.pid,size:pane.size,paneId:pane.paneId,sessionName,windowIndex},activePanes:0,agentState:derivePaneState(pane,executor),wsAgentState:void 0}}function derivePaneLabel(pane,executor,isClaude){if(executor?.agentName&&executor?.team)return`${executor.team}/${executor.agentName}`;if(executor?.agentName)return executor.agentName;if(pane.title&&pane.title!==pane.command&&!isDefaultPaneTitle(pane.title))return pane.title;if(isClaude)return"claude";return pane.command}function isDefaultPaneTitle(title){let hostname2=__require("os").hostname();return title===hostname2||title.startsWith(`${hostname2}.`)||title.startsWith("\u2733")}function derivePaneState(pane,executor){if(pane.isDead)return"error";if(!executor)return;let s2=executor.state;if(s2==="working")return"working";if(s2==="idle"||s2==="spawning")return"idle";if(s2==="permission")return"permission";if(s2==="error"||s2==="terminated")return"error";return}function getSessionTarget(node){if(node.type==="agent"){let sessionName=node.data.sessionName,attachWindowIndex=node.data.attachWindowIndex;if(typeof attachWindowIndex==="number")return{sessionName,windowIndex:attachWindowIndex};let firstWindowChild=node.children.find((child)=>child.type==="window");if(firstWindowChild){let parts=firstWindowChild.id.split(":");return{sessionName,windowIndex:Number(parts[2])}}return{sessionName}}if(node.type==="session")return{sessionName:node.label};if(node.type==="window"){let parts=node.id.split(":");return{sessionName:parts[1],windowIndex:Number(parts[2])}}if(node.type==="pane"){let data=node.data;return{sessionName:data.sessionName,windowIndex:data.windowIndex}}return null}var TUI_SESSION2="genie-tui";var init_session_tree=__esm(()=>{init_pane_detection()});function flattenTree(nodes){let result2=[];function walk(node,depth){if(result2.push({node,depth,visible:!0}),node.expanded)for(let child of node.children)walk(child,depth+1)}for(let node of nodes)walk(node,0);return result2}function toggleNode(nodes,id){return nodes.map((node)=>{if(node.id===id)return{...node,expanded:!node.expanded};return{...node,children:toggleNode(node.children,id)}})}function CliPreviewLine({intent,hint=DEFAULT_HINT}){let cli=null,errorMessage=null;try{cli=buildSpawnInvocation(intent).cli}catch(err){errorMessage=err instanceof Error?err.message:String(err)}if(errorMessage!==null)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${errorMessage}`},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:hint},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"\u25B6 "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:cli},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:hint},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}var DEFAULT_HINT="Enter to run \xB7 Esc to cancel";var init_CliPreviewLine=__esm(()=>{init_spawn_invocation();init_theme2();init_jsx_dev_runtime()});async function defaultLoadAgents(){let{spawn:spawn5}=await import("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1],[command,args]=genieBin&&genieBin!=="genie"?[bunPath,[genieBin,"dir","ls","--json"]]:["genie",["dir","ls","--json"]],stdout=await new Promise((resolve23,reject)=>{let child=spawn5(command,args,{stdio:["ignore","pipe","ignore"]}),chunks=[];child.stdout.on("data",(c)=>chunks.push(c)),child.on("error",reject),child.on("close",()=>resolve23(Buffer.concat(chunks).toString("utf-8")))});return JSON.parse(stdout).map((e)=>typeof e?.name==="string"?{name:e.name}:null).filter((e)=>e!==null)}function buildIntent(agentName,target){let intent={kind:"spawn-agent",name:agentName,session:target.session};if(target.window!==void 0&&target.window.length>0)intent.window=target.window;else intent.newWindow=!0;return intent}function applyFilter2(agents,filter){if(filter.length===0)return agents;let needle=filter.toLowerCase();return agents.filter((a)=>a.name.toLowerCase().includes(needle))}function handleControlKey(key,deps){if(key.name==="escape")return deps.onCancel(),!0;if(key.name==="up"&&deps.filteredLength>0)return deps.setSelectedIndex((prev)=>prev<=0?deps.filteredLength-1:prev-1),!0;if(key.name==="down"&&deps.filteredLength>0)return deps.setSelectedIndex((prev)=>prev>=deps.filteredLength-1?0:prev+1),!0;if((key.name==="return"||key.name==="enter")&&deps.highlighted)return deps.onConfirm(buildIntent(deps.highlighted.name,deps.target)),!0;if(key.name==="backspace")return deps.setFilter((prev)=>prev.slice(0,-1)),!0;if(key.name==="up"||key.name==="down"||key.name==="return"||key.name==="enter")return!0;return!1}function appendCharIfPrintable(key,setFilter){let ch=key.sequence??key.name;if(typeof ch==="string"&&ch.length===1&&ch>=" "&&ch!=="\x7F")setFilter((prev)=>prev+ch)}function AgentPicker({target,onConfirm,onCancel,loadAgents=defaultLoadAgents}){let[agents,setAgents]=import_react18.useState(null),[loadError,setLoadError]=import_react18.useState(null),[filter,setFilter]=import_react18.useState(""),[selectedIndex,setSelectedIndex]=import_react18.useState(0);import_react18.useEffect(()=>{let active=!0;return loadAgents().then((list2)=>{if(!active)return;setAgents(list2)}).catch((err)=>{if(!active)return;setLoadError(err instanceof Error?err.message:String(err)),setAgents([])}),()=>{active=!1}},[loadAgents]);let filtered=import_react18.useMemo(()=>agents?applyFilter2(agents,filter):[],[agents,filter]);import_react18.useEffect(()=>{if(filtered.length===0){if(selectedIndex!==0)setSelectedIndex(0);return}if(selectedIndex>=filtered.length)setSelectedIndex(filtered.length-1)},[filtered.length,selectedIndex]);let highlighted=filtered[selectedIndex],previewIntent=highlighted?buildIntent(highlighted.name,target):null,handleKey=import_react18.useCallback((key)=>{if(handleControlKey(key,{onCancel,onConfirm,target,highlighted,filteredLength:filtered.length,setSelectedIndex,setFilter}))return;if(key.ctrl||key.meta)return;appendCharIfPrintable(key,setFilter)},[filtered.length,highlighted,onCancel,onConfirm,target]);useKeyboard(handleKey);let targetLabel=target.window?target.window:target.session,modeHint=target.window?"in window":"new window in session",statusText=agents===null?"Loading agents\u2026":loadError!==null?`Load failed: ${loadError}`:null,selectOptions=filtered.map((agent)=>({name:agent.name,description:"",value:agent.name}));return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:palette.bgOverlay,children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.borderActive,backgroundColor:palette.bgRaised,width:"100%",flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"Spawn here"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` \u2014 ${modeHint} `},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:targetLabel},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Filter: "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:filter.length>0?filter:" "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:filter.length>0?"":"(type to narrow)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),statusText!==null?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:loadError!==null?palette.error:palette.textDim,children:statusText},void 0,!1,void 0,this)},void 0,!1,void 0,this):filtered.length===0?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"No agents registered"},void 0,!1,void 0,this)},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("select",{options:selectOptions,selectedIndex,showDescription:!1,focused:!1,height:Math.min(filtered.length,12),selectedBackgroundColor:palette.accentDim,selectedTextColor:palette.accentBright},void 0,!1,void 0,this),previewIntent!==null?import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent:previewIntent},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var import_react18;var init_AgentPicker=__esm(async()=>{init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react2();import_react18=__toESM(require_react_development(),1)});function ContextMenu({items,onAction,onClose,positionY=0}){let[selectedIndex,setSelectedIndex]=import_react20.useState(0),[inputMode,setInputMode]=import_react20.useState(!1),inputRef=import_react20.useRef(""),selectOptions=items.map((item)=>({name:`${item.label}${item.shortcut?` ${item.shortcut}`:""}`,description:"",value:item.action}));useKeyboard(import_react20.useCallback((key)=>{if(inputMode)return;if(key.name==="escape"){onClose();return}for(let item of items)if(item.shortcut&&key.name===item.shortcut.toLowerCase()){if(item.needsInput)setInputMode(!0),inputRef.current="",setSelectedIndex(items.indexOf(item));else onAction(item.action);return}},[inputMode,items,onAction,onClose]));let handleSelect=import_react20.useCallback((_index,option)=>{let value=option?.value;if(!value)return;if(items.find((i2)=>i2.action===value)?.needsInput){setInputMode(!0),inputRef.current="";return}onAction(value)},[items,onAction]),handleInputChange=import_react20.useCallback((v2)=>{inputRef.current=v2},[]),handleInputSubmit=import_react20.useCallback(()=>{let item=items[selectedIndex],value=inputRef.current.trim();if(item&&value)onAction(item.action,value);setInputMode(!1),inputRef.current=""},[items,selectedIndex,onAction]);if(items.length===0)return onClose(),null;return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",onMouseDown:()=>onClose(),children:[positionY>0?import_jsx_dev_runtime2.jsxDEV("box",{height:positionY},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.borderActive,backgroundColor:palette.bgRaised,width:"100%",height:inputMode?items.length+5:items.length+2,flexDirection:"column",onMouseDown:(e)=>e.stopPropagation?.(),children:[import_jsx_dev_runtime2.jsxDEV("select",{options:selectOptions,selectedIndex,onSelect:handleSelect,onChange:(index)=>setSelectedIndex(index),focused:!inputMode,height:items.length,showDescription:!1,selectedBackgroundColor:palette.accentDim,selectedTextColor:palette.accentBright},void 0,!1,void 0,this),inputMode?import_jsx_dev_runtime2.jsxDEV("box",{paddingX:1,height:3,flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[items[selectedIndex]?.label??"Input",":"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("input",{onChange:handleInputChange,onSubmit:handleInputSubmit,placeholder:"Type and press Enter...",focused:!0,width:28,backgroundColor:palette.bg,textColor:palette.text,placeholderColor:palette.textMuted},void 0,!1,void 0,this)]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}var import_react20;var init_ContextMenu=__esm(async()=>{init_theme2();init_jsx_dev_runtime();await init_react2();import_react20=__toESM(require_react_development(),1)});function buildRows(sessions2){let rows=[];for(let session of sessions2){if(session.name===TUI_SESSION3)continue;rows.push({kind:"session",sessionName:session.name,label:`${session.name} (new window)`});for(let win of session.windows){let windowLabel=win.name?` ${win.name}`:"";rows.push({kind:"window",sessionName:session.name,windowIndex:win.index,label:` ${session.name}:${win.index}${windowLabel}`})}}return rows}function pickFromRow(row2){if(row2.kind==="session")return{kind:"session",sessionName:row2.sessionName};return{kind:"window",sessionName:row2.sessionName,windowIndex:row2.windowIndex}}function picksEqual(a,b3){if(a.kind==="session"&&b3.kind==="session")return a.sessionName===b3.sessionName;if(a.kind==="window"&&b3.kind==="window")return a.sessionName===b3.sessionName&&a.windowIndex===b3.windowIndex;return!1}function pickExists(pick,sessions2){let session=sessions2.find((s2)=>s2.name===pick.sessionName);if(!session)return!1;if(pick.kind==="session")return!0;return session.windows.some((w2)=>w2.index===pick.windowIndex)}function pickToIntent(agentName,pick){if(!pick)return{kind:"spawn-agent",name:agentName};if(pick.kind==="session")return{kind:"spawn-agent",name:agentName,session:pick.sessionName,newWindow:!0};return{kind:"spawn-agent",name:agentName,window:`${pick.sessionName}:${pick.windowIndex}`}}function pickLabel(pick){if(pick.kind==="session")return pick.sessionName;return`${pick.sessionName}:${pick.windowIndex}`}function SpawnTargetPicker({agentName,sessions:sessions2,onConfirm,onCancel}){let rows=import_react22.useMemo(()=>buildRows(sessions2),[sessions2]),[pick,setPick]=import_react22.useState(()=>rows[0]?pickFromRow(rows[0]):null),[staleError,setStaleError]=import_react22.useState(null);if(pick===null&&rows[0])setPick(pickFromRow(rows[0]));let selectedIndex=import_react22.useMemo(()=>{if(!pick)return-1;return rows.findIndex((r)=>picksEqual(pick,r))},[pick,rows]),movePick=import_react22.useCallback((delta)=>{if(rows.length===0)return;let next=((selectedIndex<0?0:selectedIndex)+delta+rows.length)%rows.length;setPick(pickFromRow(rows[next])),setStaleError(null)},[rows,selectedIndex]),handleEnter=import_react22.useCallback(()=>{if(!pick)return;if(!pickExists(pick,sessions2)){setStaleError(`Target "${pickLabel(pick)}" no longer exists \u2014 pick another.`);return}onConfirm(pickToIntent(agentName,pick))},[pick,sessions2,agentName,onConfirm]);useKeyboard(import_react22.useCallback((key)=>{let n=key.name;if(n==="escape"){onCancel();return}if(n==="enter"||n==="return"){handleEnter();return}if(n==="up"||n==="k")movePick(-1);else if(n==="down"||n==="j")movePick(1)},[onCancel,handleEnter,movePick]));let intent=import_react22.useMemo(()=>pickToIntent(agentName,pick),[agentName,pick]);return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:palette.bgOverlay,children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.borderActive,backgroundColor:palette.bgRaised,paddingX:2,paddingY:1,flexDirection:"column",width:"100%",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:`Spawn "${agentName}" into\u2026`},void 0,!1,void 0,this)},void 0,!1,void 0,this),rows.length===0?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"No tmux sessions available. Press Esc to cancel."},void 0,!1,void 0,this)},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("select",{options:rows.map((row2,i2)=>({name:row2.label,description:"",value:`${row2.kind}:${row2.sessionName}:${row2.kind==="window"?row2.windowIndex:""}:${i2}`})),selectedIndex,showDescription:!1,focused:!1,height:Math.min(rows.length,12),selectedBackgroundColor:palette.accentDim,selectedTextColor:palette.accentBright},void 0,!1,void 0,this),staleError?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${staleError}`},void 0,!1,void 0,this)},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var import_react22,TUI_SESSION3="genie-tui";var init_SpawnTargetPicker=__esm(async()=>{init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react2();import_react22=__toESM(require_react_development(),1)});var require_package=__commonJS((exports,module2)=>{module2.exports={name:"systeminformation",version:"5.31.5",description:"Advanced, lightweight system and OS information library",license:"MIT",author:"Sebastian Hildebrandt <hildebrandt@plus-innovations.com> (https://plus-innovations.com)",homepage:"https://systeminformation.io",main:"./lib/index.js",type:"commonjs",bin:{systeminformation:"lib/cli.js"},types:"./lib/index.d.ts",scripts:{test:"node ./test/test.js",testDeno:"deno run -A ./test/test.js"},files:["lib/"],keywords:["system information","sysinfo","monitor","monitoring","os","linux","osx","windows","freebsd","openbsd","netbsd","cpu","cpuload","physical cores","logical cores","processor","cores","threads","socket type","memory","file system","fsstats","diskio","block devices","netstats","network","network interfaces","network connections","network stats","iface","printer","processes","users","internet","battery","docker","docker stats","docker processes","graphics","graphic card","graphic controller","gpu","display","smart","disk layout","usb","audio","bluetooth","wifi","wifinetworks","virtual box","virtualbox","vm","backend","hardware","BIOS","chassis"],repository:{type:"git",url:"git+https://github.com/sebhildebrandt/systeminformation.git"},funding:{type:"Buy me a coffee",url:"https://www.buymeacoffee.com/systeminfo"},os:["darwin","linux","win32","freebsd","openbsd","netbsd","sunos","android"],engines:{node:">=8.0.0"}}});var require_util3=__commonJS((exports)=>{var os4=__require("os"),fs3=__require("fs"),path6=__require("path"),spawn5=__require("child_process").spawn,exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,util4=__require("util"),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_cores=0,codepage="",_smartMonToolsInstalled=null,_rpi_cpuinfo=null,WINDIR=process.env.WINDIR||"C:\\Windows",_psChild,_psResult="",_psCmds=[],_psPersistent=!1,_powerShell="",_psToUTF8="$OutputEncoding = [System.Console]::OutputEncoding = [System.Console]::InputEncoding = [System.Text.Encoding]::UTF8 ; ",_psCmdStart="--###START###--",_psError="--ERROR--",_psCmdSeperator="--###ENDCMD###--",_psIdSeperator="--##ID##--",execOptsWin={windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})},execOptsLinux={maxBuffer:104857600,encoding:"UTF-8",stdio:["pipe","pipe","ignore"]};function toInt(value){let result2=parseInt(value,10);if(isNaN(result2))result2=0;return result2}function splitByNumber(str5){let numberStarted=!1,num="",cpart="";for(let c of str5)if(c>="0"&&c<="9"||numberStarted)numberStarted=!0,num+=c;else cpart+=c;return[cpart,num]}var stringObj=new String,stringReplace=new String().replace,stringToLower=new String().toLowerCase,stringToString=new String().toString,stringSubstr=new String().substr,stringSubstring=new String().substring,stringTrim=new String().trim,stringStartWith=new String().startsWith,mathMin=Math.min;function isFunction(functionToCheck){return functionToCheck&&{}.toString.call(functionToCheck)==="[object Function]"}function unique(obj){let uniques=[],stringify2={};for(let i2=0;i2<obj.length;i2++){let keys=Object.keys(obj[i2]);keys.sort((a,b3)=>{return a-b3});let str5="";for(let j2=0;j2<keys.length;j2++)str5+=JSON.stringify(keys[j2]),str5+=JSON.stringify(obj[i2][keys[j2]]);if(!{}.hasOwnProperty.call(stringify2,str5))uniques.push(obj[i2]),stringify2[str5]=!0}return uniques}function sortByKey(array,keys){return array.sort((a,b3)=>{let x2="",y2="";return keys.forEach((key)=>{x2=x2+a[key],y2=y2+b3[key]}),x2<y2?-1:x2>y2?1:0})}function cores(){if(_cores===0)_cores=os4.cpus().length;return _cores}function getValue(lines,property,separator,trimmed,lineMatch){separator=separator||":",property=property.toLowerCase(),trimmed=trimmed||!1,lineMatch=lineMatch||!1;let result2="";return lines.some((line)=>{let lineLower=line.toLowerCase().replace(/\t/g,"");if(trimmed)lineLower=lineLower.trim();if(lineLower.startsWith(property)&&(lineMatch?lineLower.match(property+separator)||lineLower.match(property+" "+separator):!0)){let parts=trimmed?line.trim().split(separator):line.split(separator);if(parts.length>=2)return parts.shift(),result2=parts.join(separator).trim(),!0}return!1}),result2}function decodeEscapeSequence(str5,base){return base=base||16,str5.replace(/\\x([0-9A-Fa-f]{2})/g,function(){return String.fromCharCode(parseInt(arguments[1],base))})}function detectSplit(str5){let seperator="",part=0;return str5.split("").forEach((element)=>{if(element>="0"&&element<="9"){if(part===1)part++}else{if(part===0)part++;if(part===1)seperator+=element}}),seperator}function parseTime(t2,pmDesignator){pmDesignator=pmDesignator||"",t2=t2.toUpperCase();let hour=0,min=0,splitter=detectSplit(t2),parts=t2.split(splitter);if(parts.length>=2){if(parts[2])parts[1]+=parts[2];let isPM=parts[1]&&parts[1].toLowerCase().indexOf("pm")>-1||parts[1].toLowerCase().indexOf("p.m.")>-1||parts[1].toLowerCase().indexOf("p. m.")>-1||parts[1].toLowerCase().indexOf("n")>-1||parts[1].toLowerCase().indexOf("ch")>-1||parts[1].toLowerCase().indexOf("\xF6s")>-1||pmDesignator&&parts[1].toLowerCase().indexOf(pmDesignator)>-1;return hour=parseInt(parts[0],10),min=parseInt(parts[1],10),hour=isPM&&hour<12?hour+12:hour,("0"+hour).substr(-2)+":"+("0"+min).substr(-2)}}function parseDateTime(dt,culture){let result2={date:"",time:""};culture=culture||{};let dateFormat=(culture.dateFormat||"").toLowerCase(),pmDesignator=culture.pmDesignator||"",parts=dt.split(" ");if(parts[0]){if(parts[0].indexOf("/")>=0){let dtparts=parts[0].split("/");if(dtparts.length===3)if(dtparts[0].length===4)result2.date=dtparts[0]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[2]).substr(-2);else if(dtparts[2].length===2)if(dateFormat.indexOf("/d/")>-1||dateFormat.indexOf("/dd/")>-1)result2.date="20"+dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2);else result2.date="20"+dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2);else if((dt.toLowerCase().indexOf("pm")>-1||dt.toLowerCase().indexOf("p.m.")>-1||dt.toLowerCase().indexOf("p. m.")>-1||dt.toLowerCase().indexOf("am")>-1||dt.toLowerCase().indexOf("a.m.")>-1||dt.toLowerCase().indexOf("a. m.")>-1||dateFormat.indexOf("/d/")>-1||dateFormat.indexOf("/dd/")>-1)&&dateFormat.indexOf("dd/")!==0)result2.date=dtparts[2]+"-"+("0"+dtparts[0]).substr(-2)+"-"+("0"+dtparts[1]).substr(-2);else result2.date=dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2)}if(parts[0].indexOf(".")>=0){let dtparts=parts[0].split(".");if(dtparts.length===3)if(dateFormat.indexOf(".d.")>-1||dateFormat.indexOf(".dd.")>-1)result2.date=dtparts[2]+"-"+("0"+dtparts[0]).substr(-2)+"-"+("0"+dtparts[1]).substr(-2);else result2.date=dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2)}if(parts[0].indexOf("-")>=0){let dtparts=parts[0].split("-");if(dtparts.length===3)result2.date=dtparts[0]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[2]).substr(-2)}}if(parts[1]){parts.shift();let time=parts.join(" ");result2.time=parseTime(time,pmDesignator)}return result2}function parseHead(head,rights){let space=rights>0,count=1,from=0,to=0,result2=[];for(let i2=0;i2<head.length;i2++)if(count<=rights){if(/\s/.test(head[i2])&&!space)to=i2-1,result2.push({from,to:to+1,cap:head.substring(from,to+1)}),from=to+2,count++;space=head[i2]===" "}else{if(!/\s/.test(head[i2])&&space){if(to=i2-1,from<to)result2.push({from,to,cap:head.substring(from,to)});from=to+1,count++}space=head[i2]===" "}to=5000,result2.push({from,to,cap:head.substring(from,to)});let len=result2.length;for(let i2=0;i2<len;i2++)if(result2[i2].cap.replace(/\s/g,"").length===0){if(i2+1<len)result2[i2].to=result2[i2+1].to,result2[i2].cap=result2[i2].cap+result2[i2+1].cap,result2.splice(i2+1,1),len=len-1}return result2}function findObjectByKey(array,key,value){for(let i2=0;i2<array.length;i2++)if(array[i2][key]===value)return i2;return-1}function getPowershell(){if(_powerShell="powershell.exe",_windows){let defaultPath=`${WINDIR}\\system32\\WindowsPowerShell\\v1.0\\powershell.exe`;if(fs3.existsSync(defaultPath))_powerShell=defaultPath}}function getVboxmanage(){return _windows?`"${process.env.VBOX_INSTALL_PATH||process.env.VBOX_MSI_INSTALL_PATH}\\VBoxManage.exe"`:"vboxmanage"}function powerShellProceedResults(data){let id="",parts,res="";if(data.indexOf(_psCmdStart)>=0){parts=data.split(_psCmdStart);let parts2=parts[1].split(_psIdSeperator);if(id=parts2[0],parts2.length>1)data=parts2.slice(1).join(_psIdSeperator)}if(data.indexOf(_psCmdSeperator)>=0)parts=data.split(_psCmdSeperator),res=parts[0];let remove=-1;for(let i2=0;i2<_psCmds.length;i2++)if(_psCmds[i2].id===id)remove=i2,_psCmds[i2].callback(res);if(remove>=0)_psCmds.splice(remove,1)}function powerShellStart(){if(!_psChild){if(_psChild=spawn5(_powerShell,["-NoProfile","-NoLogo","-InputFormat","Text","-NoExit","-Command","-"],{stdio:"pipe",windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})}),_psChild&&_psChild.pid)_psPersistent=!0,_psChild.stdout.on("data",(data)=>{if(_psResult=_psResult+data.toString("utf8"),data.indexOf(_psCmdSeperator)>=0)powerShellProceedResults(_psResult),_psResult=""}),_psChild.stderr.on("data",()=>{powerShellProceedResults(_psResult+_psError)}),_psChild.on("error",()=>{powerShellProceedResults(_psResult+_psError)}),_psChild.on("close",()=>{if(_psChild)_psChild.kill()})}}function powerShellRelease(){try{if(_psChild)_psChild.stdin.write("exit"+os4.EOL),_psChild.stdin.end()}catch{if(_psChild)_psChild.kill()}_psPersistent=!1,_psChild=null}function powerShell(cmd){if(_psPersistent){let id=Math.random().toString(36).substring(2,12);return new Promise((resolve23)=>{process.nextTick(()=>{function callback(data){resolve23(data)}_psCmds.push({id,cmd,callback,start:new Date});try{if(_psChild&&_psChild.pid)_psChild.stdin.write(_psToUTF8+"echo "+_psCmdStart+id+_psIdSeperator+"; "+os4.EOL+cmd+os4.EOL+"echo "+_psCmdSeperator+os4.EOL)}catch{resolve23("")}})})}else{let result2="";return new Promise((resolve23)=>{process.nextTick(()=>{try{let osVersion=os4.release().split(".").map(Number),spanOptions=osVersion[0]<10?["-NoProfile","-NoLogo","-InputFormat","Text","-NoExit","-ExecutionPolicy","Unrestricted","-Command","-"]:["-NoProfile","-NoLogo","-InputFormat","Text","-ExecutionPolicy","Unrestricted","-Command",_psToUTF8+cmd],child=spawn5(_powerShell,spanOptions,{stdio:"pipe",windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})});if(child&&!child.pid)child.on("error",()=>{resolve23(result2)});if(child&&child.pid){if(child.stdout.on("data",(data)=>{result2=result2+data.toString("utf8")}),child.stderr.on("data",()=>{child.kill(),resolve23(result2)}),child.on("close",()=>{child.kill(),resolve23(result2)}),child.on("error",()=>{child.kill(),resolve23(result2)}),osVersion[0]<10)try{child.stdin.write(_psToUTF8+cmd+os4.EOL),child.stdin.write("exit"+os4.EOL),child.stdin.end()}catch{child.kill(),resolve23(result2)}}else resolve23(result2)}catch{resolve23(result2)}})})}}function execSafe(cmd,args,options){let result2="";return options=options||{},new Promise((resolve23)=>{process.nextTick(()=>{try{let child=spawn5(cmd,args,options);if(child&&!child.pid)child.on("error",()=>{resolve23(result2)});if(child&&child.pid)child.stdout.on("data",(data)=>{result2+=data.toString()}),child.on("close",()=>{child.kill(),resolve23(result2)}),child.on("error",()=>{child.kill(),resolve23(result2)});else resolve23(result2)}catch{resolve23(result2)}})})}function getCodepage(){if(_windows){if(!codepage)try{let parts=execSync18("chcp",execOptsWin).toString().split(`\r
|
|
3628
|
+
`).filter(Boolean),panePids=paneLines.map((line)=>Number.parseInt(line.split("|")[7]??"",10)).filter((pid)=>Number.isFinite(pid)&&pid>0),processCommandByPid=getProcessCommandByPid(panePids),sessionMap=new Map,windowMap=new Map;for(let line of paneLines){let parts=line.split("|");if(parts.length<15)continue;let parsed=parsePaneLine(parts,processCommandByPid);if(!sessionMap.has(parsed.sessionName))sessionMap.set(parsed.sessionName,{...parsed.session,windows:[]});let winKey=`${parsed.sessionName}:${parsed.winIdxStr}`;if(!windowMap.has(winKey)){let win={...parsed.window,panes:[]};windowMap.set(winKey,win),sessionMap.get(parsed.sessionName)?.windows.push(win)}windowMap.get(winKey)?.panes.push(parsed.pane)}return Array.from(sessionMap.values()).sort((a,b3)=>a.name.localeCompare(b3.name))}function isPidAlive4(pid){try{return process.kill(pid,0),!0}catch{return!1}}function allClaudePanes(sessions2){return sessions2.flatMap((s2)=>s2.windows.flatMap((w2)=>w2.panes)).filter(isClaudeLikePane)}function detectGaps(executors,sessions2){let deadPidExecutors=executors.filter((e)=>e.pid!=null&&!isPidAlive4(e.pid)),executorPaneIds=new Set(executors.map((e)=>e.tmuxPaneId).filter(Boolean)),claudePanes=allClaudePanes(sessions2),orphanPanes=claudePanes.filter((p)=>!executorPaneIds.has(p.paneId)),linkedCount=executors.filter((e)=>e.tmuxPaneId&&!deadPidExecutors.some((d2)=>d2.id===e.id)).length,deadPaneCount=sessions2.flatMap((s2)=>s2.windows.flatMap((w2)=>w2.panes)).filter((p)=>p.isDead).length;return{deadPidExecutors,orphanPanes,linkedCount,totalExecutors:executors.length,totalClaudePanes:claudePanes.length,deadPaneCount}}async function collectDiagnostics(){let{loadExecutors:loadExecutors2,loadAssignments:loadAssignments2,loadAgentWorkStates:loadAgentWorkStates2,loadAgentObservabilityForTui:loadAgentObservabilityForTui2}=await Promise.resolve().then(() => (init_db2(),exports_db2)),sessions2=getTmuxInventory(),executors=[];try{executors=await loadExecutors2()}catch{}let executorIds=executors.map((e)=>e.id),assignments=[];try{assignments=await loadAssignments2(executorIds)}catch{}let workStates=new Map,alertCount=0,observability=new Map;try{workStates=await loadAgentWorkStates2()}catch{}observability=await loadAgentObservabilityForTui2();try{let{listActiveDerivedSignals:listActiveDerivedSignals2}=await Promise.resolve().then(() => (init_derived_signals(),exports_derived_signals));alertCount=(await listActiveDerivedSignals2()).length}catch{}let gaps=detectGaps(executors,sessions2);if(gaps.deadPidExecutors.length>0)try{let{terminateExecutor:terminateExecutor2}=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2();await Promise.allSettled(gaps.deadPidExecutors.map(async(exec3)=>{if(await terminateExecutor2(exec3.id),exec3.agentId)await sql`UPDATE agents SET current_executor_id = NULL WHERE current_executor_id = ${exec3.id}`}))}catch{}return{sessions:sessions2,executors,assignments,gaps,workStates,observability,alertCount,timestamp:Date.now()}}var init_diagnostics=__esm(()=>{init_ensure_tmux();init_pane_detection()});import{existsSync as existsSync76,readFileSync as readFileSync50,unlinkSync as unlinkSync13}from"fs";import{homedir as homedir51}from"os";import{join as join93}from"path";function getInitialAgentFilePath(){let genieHome6=process.env.GENIE_HOME??join93(homedir51(),".genie");return join93(genieHome6,"tui-initial-agent")}function consumeInitialAgentSignal(){let filePath=getInitialAgentFilePath();if(!existsSync76(filePath))return;try{let agent=readFileSync50(filePath,"utf-8").trim();return unlinkSync13(filePath),agent||void 0}catch{return}}var init_initial_agent=()=>{};function toSessionName(agentName){return agentName.replace(/\//g,"-")}function buildSessionTree(snapshot){let executorByPaneId=new Map;for(let exec3 of snapshot.executors)if(exec3.tmuxPaneId)executorByPaneId.set(exec3.tmuxPaneId,exec3);return snapshot.sessions.filter((s2)=>s2.name!==TUI_SESSION2).map((session)=>sessionToNode(session,executorByPaneId))}function buildWorkspaceTree(input){let{agentNames,sessions:sessions2,executors}=input,teamScope=input.teamScope,workStates=input.workStates??new Map,sessionByName=new Map;for(let s2 of sessions2)if(s2.name!==TUI_SESSION2)sessionByName.set(s2.name,s2);let executorByPaneId=new Map;for(let exec3 of executors)if(exec3.tmuxPaneId)executorByPaneId.set(exec3.tmuxPaneId,exec3);let executorsByAgent=new Map;for(let exec3 of executors){let name=exec3.agentName??exec3.metadata?.agentName;if(typeof name==="string"){let list2=executorsByAgent.get(name)??[];list2.push(exec3),executorsByAgent.set(name,list2)}}let{topLevel,subsByParent}=groupAgentNames(agentNames),nodes=topLevel.map((name)=>{let agentExecutors=executorsByAgent.get(name)??[],node=buildAgentNode(name,resolveAgentSession(name,sessionByName,agentExecutors,teamScope),agentExecutors,executorByPaneId,workStates.get(name),"canonical");return appendSubAgentNodes(node,subsByParent.get(name),sessionByName,executorsByAgent,executorByPaneId,workStates,teamScope),node}),claimedSessions=collectClaimedAgentSessions(nodes,sessionByName);for(let[name,session]of sessionByName)if(!claimedSessions.has(name))nodes.push(sessionToNode(session,executorByPaneId));return nodes}function resolvePreferredWindowIndex(session,agentName){let windows=[...session.windows].sort((a,b3)=>a.index-b3.index),hasClaudePane=(window2)=>window2.panes.some(isClaudeLikePane);return(windows.find((window2)=>window2.active&&hasClaudePane(window2))??(agentName?windows.find((window2)=>window2.name===agentName):void 0)??windows.find((window2)=>hasClaudePane(window2))??windows.find((window2)=>window2.active&&window2.index!==0)??windows.find((window2)=>window2.index!==0))?.index}function hasLiveClaudeWindow(session){return session.windows.some((window2)=>window2.panes.some(isClaudeLikePane))}function groupAgentNames(names){let topLevel=[],subsByParent=new Map;for(let name of names){let slashIdx=name.indexOf("/");if(slashIdx===-1)topLevel.push(name);else{let parent=name.slice(0,slashIdx),subs=subsByParent.get(parent)??[];subs.push(name),subsByParent.set(parent,subs)}}return{topLevel,subsByParent}}function appendSubAgentNodes(parent,subs,sessionByName,executorsByAgent,executorByPaneId,workStates,teamScope){if(!subs)return;for(let subName of subs){let subLabel=subName.slice(subName.indexOf("/")+1),agentExecutors=executorsByAgent.get(subName)??[],subNode=buildAgentNode(subName,resolveAgentSession(subName,sessionByName,agentExecutors,teamScope),agentExecutors,executorByPaneId,workStates.get(subName),"subagent");subNode.label=subLabel,subNode.depth=1,parent.children.push(subNode)}}function resolveAgentSession(name,sessionByName,agentExecutors,teamScope){let executorSessions=collectExecutorSessions(agentExecutors,sessionByName),scoped=teamScope?uniqueSessions(executorSessions.filter((candidate)=>candidate.exec.team===teamScope).map((candidate)=>candidate.session)):[];if(scoped.length===1)return scoped[0];let unscoped=uniqueSessions(executorSessions.map((candidate)=>candidate.session));if(unscoped.length===1)return unscoped[0];return sessionByName.get(toSessionName(name))}function collectExecutorSessions(agentExecutors,sessionByName){let candidates=[];for(let exec3 of agentExecutors){if(!exec3.tmuxSession)continue;let session=sessionByName.get(exec3.tmuxSession);if(!session)continue;if(exec3.tmuxPaneId&&!sessionHasPane(session,exec3.tmuxPaneId))continue;candidates.push({exec:exec3,session})}return candidates}function sessionHasPane(session,paneId){return session.windows.some((window2)=>window2.panes.some((pane)=>pane.paneId===paneId))}function uniqueSessions(sessions2){let byName=new Map;for(let session of sessions2)byName.set(session.name,session);return[...byName.values()]}function collectClaimedAgentSessions(nodes,sessionByName){let claimed=new Set,visit=(node)=>{if(node.type==="agent"){let sessionName=node.data.sessionName;if(typeof sessionName==="string"&&sessionByName.has(sessionName))claimed.add(sessionName)}for(let child of node.children)visit(child)};for(let node of nodes)visit(node);return claimed}function countClaudePanes(session){return session.windows.reduce((sum,w2)=>sum+w2.panes.filter(isClaudeLikePane).length,0)}function buildAgentNode(name,session,agentExecutors,executorByPaneId,workState,kind){let wsState=deriveWsAgentState(session,agentExecutors),attachWindowIndex=session?resolvePreferredWindowIndex(session,name):void 0,children=[];if(session)for(let win of session.windows){if(win.index===0)continue;children.push(windowToNode(session.name,win,executorByPaneId))}let node={id:`agent:${name}`,type:"agent",label:name,depth:0,expanded:children.length>0,children,data:{sessionName:session?.name??toSessionName(name),windowCount:session?session.windows.length:0,attachWindowIndex,provider:agentExecutors[0]?.provider??null},activePanes:session?countClaudePanes(session):0,agentState:agentExecutors.length>0?deriveExecutorState(agentExecutors):void 0,wsAgentState:wsState,kind};if(workState)node.workState=workState;return node}function deriveWsAgentState(session,agentExecutors){if(!session)return"stopped";if(hasLiveClaudeWindow(session))return"running";for(let exec3 of agentExecutors){if(exec3.state==="error"||exec3.state==="terminated")return"error";if(exec3.state==="spawning")return"spawning"}if(agentExecutors.length===0)return"stopped";return"running"}function deriveExecutorState(execs){for(let e of execs)if(e.state==="working")return"working";for(let e of execs)if(e.state==="permission")return"permission";for(let e of execs)if(e.state==="error"||e.state==="terminated")return"error";return"idle"}function sessionToNode(session,executorMap){let claudePanes=session.windows.reduce((sum,w2)=>sum+w2.panes.filter(isClaudeLikePane).length,0);return{id:`session:${session.name}`,type:"session",label:session.name,depth:0,expanded:!0,children:session.windows.map((w2)=>windowToNode(session.name,w2,executorMap)),data:{attached:session.attached,windowCount:session.windowCount},activePanes:claudePanes,agentState:void 0,wsAgentState:void 0}}function windowToNode(sessionName,window2,executorMap){let activePanes=window2.panes.filter(isClaudeLikePane).length;return{id:`window:${sessionName}:${window2.index}`,type:"window",label:window2.name,depth:1,expanded:!0,children:window2.panes.map((p)=>paneToNode(sessionName,window2.index,p,executorMap)),data:{active:window2.active,paneCount:window2.paneCount},activePanes,agentState:void 0,wsAgentState:void 0}}function paneToNode(sessionName,windowIndex,pane,executorMap){let executor=executorMap.get(pane.paneId),isClaude=isClaudeLikePane(pane);return{id:`pane:${pane.paneId}`,type:"pane",label:derivePaneLabel(pane,executor,isClaude),depth:2,expanded:!1,children:[],data:{command:pane.command,processCommand:pane.processCommand,title:pane.title,isClaudeLike:isClaude,isDead:pane.isDead,pid:pane.pid,size:pane.size,paneId:pane.paneId,sessionName,windowIndex},activePanes:0,agentState:derivePaneState(pane,executor),wsAgentState:void 0}}function derivePaneLabel(pane,executor,isClaude){if(executor?.agentName&&executor?.team)return`${executor.team}/${executor.agentName}`;if(executor?.agentName)return executor.agentName;if(pane.title&&pane.title!==pane.command&&!isDefaultPaneTitle(pane.title))return pane.title;if(isClaude)return"claude";return pane.command}function isDefaultPaneTitle(title){let hostname2=__require("os").hostname();return title===hostname2||title.startsWith(`${hostname2}.`)||title.startsWith("\u2733")}function derivePaneState(pane,executor){if(pane.isDead)return"error";if(!executor)return;let s2=executor.state;if(s2==="working")return"working";if(s2==="idle"||s2==="spawning")return"idle";if(s2==="permission")return"permission";if(s2==="error"||s2==="terminated")return"error";return}function getSessionTarget(node){if(node.type==="agent"){let sessionName=node.data.sessionName,attachWindowIndex=node.data.attachWindowIndex;if(typeof attachWindowIndex==="number")return{sessionName,windowIndex:attachWindowIndex};let firstWindowChild=node.children.find((child)=>child.type==="window");if(firstWindowChild){let parts=firstWindowChild.id.split(":");return{sessionName,windowIndex:Number(parts[2])}}return{sessionName}}if(node.type==="session")return{sessionName:node.label};if(node.type==="window"){let parts=node.id.split(":");return{sessionName:parts[1],windowIndex:Number(parts[2])}}if(node.type==="pane"){let data=node.data;return{sessionName:data.sessionName,windowIndex:data.windowIndex}}return null}var TUI_SESSION2="genie-tui";var init_session_tree=__esm(()=>{init_pane_detection()});function flattenTree(nodes){let result2=[];function walk(node,depth){if(result2.push({node,depth,visible:!0}),node.expanded)for(let child of node.children)walk(child,depth+1)}for(let node of nodes)walk(node,0);return result2}function toggleNode(nodes,id){return nodes.map((node)=>{if(node.id===id)return{...node,expanded:!node.expanded};return{...node,children:toggleNode(node.children,id)}})}function CliPreviewLine({intent,hint=DEFAULT_HINT}){let cli=null,errorMessage=null;try{cli=buildSpawnInvocation(intent).cli}catch(err){errorMessage=err instanceof Error?err.message:String(err)}if(errorMessage!==null)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${errorMessage}`},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:hint},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"\u25B6 "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:cli},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:hint},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}var DEFAULT_HINT="Enter to run \xB7 Esc to cancel";var init_CliPreviewLine=__esm(()=>{init_spawn_invocation();init_theme2();init_jsx_dev_runtime()});async function defaultLoadAgents(){let{spawn:spawn5}=await import("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1],[command,args]=genieBin&&genieBin!=="genie"?[bunPath,[genieBin,"dir","ls","--json"]]:["genie",["dir","ls","--json"]],stdout=await new Promise((resolve23,reject)=>{let child=spawn5(command,args,{stdio:["ignore","pipe","ignore"]}),chunks=[];child.stdout.on("data",(c)=>chunks.push(c)),child.on("error",reject),child.on("close",()=>resolve23(Buffer.concat(chunks).toString("utf-8")))});return JSON.parse(stdout).map((e)=>typeof e?.name==="string"?{name:e.name}:null).filter((e)=>e!==null)}function buildIntent(agentName,target){let intent={kind:"spawn-agent",name:agentName,session:target.session};if(target.window!==void 0&&target.window.length>0)intent.window=target.window;else intent.newWindow=!0;return intent}function applyFilter2(agents,filter){if(filter.length===0)return agents;let needle=filter.toLowerCase();return agents.filter((a)=>a.name.toLowerCase().includes(needle))}function handleControlKey(key,deps){if(key.name==="escape")return deps.onCancel(),!0;if(key.name==="up"&&deps.filteredLength>0)return deps.setSelectedIndex((prev)=>prev<=0?deps.filteredLength-1:prev-1),!0;if(key.name==="down"&&deps.filteredLength>0)return deps.setSelectedIndex((prev)=>prev>=deps.filteredLength-1?0:prev+1),!0;if((key.name==="return"||key.name==="enter")&&deps.highlighted)return deps.onConfirm(buildIntent(deps.highlighted.name,deps.target)),!0;if(key.name==="backspace")return deps.setFilter((prev)=>prev.slice(0,-1)),!0;if(key.name==="up"||key.name==="down"||key.name==="return"||key.name==="enter")return!0;return!1}function appendCharIfPrintable(key,setFilter){let ch=key.sequence??key.name;if(typeof ch==="string"&&ch.length===1&&ch>=" "&&ch!=="\x7F")setFilter((prev)=>prev+ch)}function AgentPicker({target,onConfirm,onCancel,loadAgents=defaultLoadAgents}){let[agents,setAgents]=import_react18.useState(null),[loadError,setLoadError]=import_react18.useState(null),[filter,setFilter]=import_react18.useState(""),[selectedIndex,setSelectedIndex]=import_react18.useState(0);import_react18.useEffect(()=>{let active=!0;return loadAgents().then((list2)=>{if(!active)return;setAgents(list2)}).catch((err)=>{if(!active)return;setLoadError(err instanceof Error?err.message:String(err)),setAgents([])}),()=>{active=!1}},[loadAgents]);let filtered=import_react18.useMemo(()=>agents?applyFilter2(agents,filter):[],[agents,filter]);import_react18.useEffect(()=>{if(filtered.length===0){if(selectedIndex!==0)setSelectedIndex(0);return}if(selectedIndex>=filtered.length)setSelectedIndex(filtered.length-1)},[filtered.length,selectedIndex]);let highlighted=filtered[selectedIndex],previewIntent=highlighted?buildIntent(highlighted.name,target):null,handleKey=import_react18.useCallback((key)=>{if(handleControlKey(key,{onCancel,onConfirm,target,highlighted,filteredLength:filtered.length,setSelectedIndex,setFilter}))return;if(key.ctrl||key.meta)return;appendCharIfPrintable(key,setFilter)},[filtered.length,highlighted,onCancel,onConfirm,target]);useKeyboard(handleKey);let targetLabel=target.window?target.window:target.session,modeHint=target.window?"in window":"new window in session",statusText=agents===null?"Loading agents\u2026":loadError!==null?`Load failed: ${loadError}`:null,selectOptions=filtered.map((agent)=>({name:agent.name,description:"",value:agent.name}));return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:palette.bgOverlay,children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.borderActive,backgroundColor:palette.bgRaised,width:"100%",flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"Spawn here"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` \u2014 ${modeHint} `},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:targetLabel},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Filter: "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:filter.length>0?filter:" "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:filter.length>0?"":"(type to narrow)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),statusText!==null?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:loadError!==null?palette.error:palette.textDim,children:statusText},void 0,!1,void 0,this)},void 0,!1,void 0,this):filtered.length===0?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"No agents registered"},void 0,!1,void 0,this)},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("select",{options:selectOptions,selectedIndex,showDescription:!1,focused:!1,height:Math.min(filtered.length,12),selectedBackgroundColor:palette.accentDim,selectedTextColor:palette.accentBright},void 0,!1,void 0,this),previewIntent!==null?import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent:previewIntent},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var import_react18;var init_AgentPicker=__esm(async()=>{init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react2();import_react18=__toESM(require_react_development(),1)});function ContextMenu({items,onAction,onClose,positionY=0}){let[selectedIndex,setSelectedIndex]=import_react20.useState(0),[inputMode,setInputMode]=import_react20.useState(!1),inputRef=import_react20.useRef(""),selectOptions=items.map((item)=>({name:`${item.label}${item.shortcut?` ${item.shortcut}`:""}`,description:"",value:item.action}));useKeyboard(import_react20.useCallback((key)=>{if(inputMode)return;if(key.name==="escape"){onClose();return}for(let item of items)if(item.shortcut&&key.name===item.shortcut.toLowerCase()){if(item.needsInput)setInputMode(!0),inputRef.current="",setSelectedIndex(items.indexOf(item));else onAction(item.action);return}},[inputMode,items,onAction,onClose]));let handleSelect=import_react20.useCallback((_index,option)=>{let value=option?.value;if(!value)return;if(items.find((i2)=>i2.action===value)?.needsInput){setInputMode(!0),inputRef.current="";return}onAction(value)},[items,onAction]),handleInputChange=import_react20.useCallback((v2)=>{inputRef.current=v2},[]),handleInputSubmit=import_react20.useCallback(()=>{let item=items[selectedIndex],value=inputRef.current.trim();if(item&&value)onAction(item.action,value);setInputMode(!1),inputRef.current=""},[items,selectedIndex,onAction]);if(items.length===0)return onClose(),null;return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",onMouseDown:()=>onClose(),children:[positionY>0?import_jsx_dev_runtime2.jsxDEV("box",{height:positionY},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.borderActive,backgroundColor:palette.bgRaised,width:"100%",height:inputMode?items.length+5:items.length+2,flexDirection:"column",onMouseDown:(e)=>e.stopPropagation?.(),children:[import_jsx_dev_runtime2.jsxDEV("select",{options:selectOptions,selectedIndex,onSelect:handleSelect,onChange:(index)=>setSelectedIndex(index),focused:!inputMode,height:items.length,showDescription:!1,selectedBackgroundColor:palette.accentDim,selectedTextColor:palette.accentBright},void 0,!1,void 0,this),inputMode?import_jsx_dev_runtime2.jsxDEV("box",{paddingX:1,height:3,flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[items[selectedIndex]?.label??"Input",":"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("input",{onChange:handleInputChange,onSubmit:handleInputSubmit,placeholder:"Type and press Enter...",focused:!0,width:28,backgroundColor:palette.bg,textColor:palette.text,placeholderColor:palette.textMuted},void 0,!1,void 0,this)]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}var import_react20;var init_ContextMenu=__esm(async()=>{init_theme2();init_jsx_dev_runtime();await init_react2();import_react20=__toESM(require_react_development(),1)});function buildRows(sessions2){let rows=[];for(let session of sessions2){if(session.name===TUI_SESSION3)continue;rows.push({kind:"session",sessionName:session.name,label:`${session.name} (new window)`});for(let win of session.windows){let windowLabel=win.name?` ${win.name}`:"";rows.push({kind:"window",sessionName:session.name,windowIndex:win.index,label:` ${session.name}:${win.index}${windowLabel}`})}}return rows}function pickFromRow(row2){if(row2.kind==="session")return{kind:"session",sessionName:row2.sessionName};return{kind:"window",sessionName:row2.sessionName,windowIndex:row2.windowIndex}}function picksEqual(a,b3){if(a.kind==="session"&&b3.kind==="session")return a.sessionName===b3.sessionName;if(a.kind==="window"&&b3.kind==="window")return a.sessionName===b3.sessionName&&a.windowIndex===b3.windowIndex;return!1}function pickExists(pick,sessions2){let session=sessions2.find((s2)=>s2.name===pick.sessionName);if(!session)return!1;if(pick.kind==="session")return!0;return session.windows.some((w2)=>w2.index===pick.windowIndex)}function pickToIntent(agentName,pick){if(!pick)return{kind:"spawn-agent",name:agentName};if(pick.kind==="session")return{kind:"spawn-agent",name:agentName,session:pick.sessionName,newWindow:!0};return{kind:"spawn-agent",name:agentName,window:`${pick.sessionName}:${pick.windowIndex}`}}function pickLabel(pick){if(pick.kind==="session")return pick.sessionName;return`${pick.sessionName}:${pick.windowIndex}`}function SpawnTargetPicker({agentName,sessions:sessions2,onConfirm,onCancel}){let rows=import_react22.useMemo(()=>buildRows(sessions2),[sessions2]),[pick,setPick]=import_react22.useState(()=>rows[0]?pickFromRow(rows[0]):null),[staleError,setStaleError]=import_react22.useState(null);if(pick===null&&rows[0])setPick(pickFromRow(rows[0]));let selectedIndex=import_react22.useMemo(()=>{if(!pick)return-1;return rows.findIndex((r)=>picksEqual(pick,r))},[pick,rows]),movePick=import_react22.useCallback((delta)=>{if(rows.length===0)return;let next=((selectedIndex<0?0:selectedIndex)+delta+rows.length)%rows.length;setPick(pickFromRow(rows[next])),setStaleError(null)},[rows,selectedIndex]),handleEnter=import_react22.useCallback(()=>{if(!pick)return;if(!pickExists(pick,sessions2)){setStaleError(`Target "${pickLabel(pick)}" no longer exists \u2014 pick another.`);return}onConfirm(pickToIntent(agentName,pick))},[pick,sessions2,agentName,onConfirm]);useKeyboard(import_react22.useCallback((key)=>{let n=key.name;if(n==="escape"){onCancel();return}if(n==="enter"||n==="return"){handleEnter();return}if(n==="up"||n==="k")movePick(-1);else if(n==="down"||n==="j")movePick(1)},[onCancel,handleEnter,movePick]));let intent=import_react22.useMemo(()=>pickToIntent(agentName,pick),[agentName,pick]);return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:palette.bgOverlay,children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.borderActive,backgroundColor:palette.bgRaised,paddingX:2,paddingY:1,flexDirection:"column",width:"100%",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:`Spawn "${agentName}" into\u2026`},void 0,!1,void 0,this)},void 0,!1,void 0,this),rows.length===0?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"No tmux sessions available. Press Esc to cancel."},void 0,!1,void 0,this)},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("select",{options:rows.map((row2,i2)=>({name:row2.label,description:"",value:`${row2.kind}:${row2.sessionName}:${row2.kind==="window"?row2.windowIndex:""}:${i2}`})),selectedIndex,showDescription:!1,focused:!1,height:Math.min(rows.length,12),selectedBackgroundColor:palette.accentDim,selectedTextColor:palette.accentBright},void 0,!1,void 0,this),staleError?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${staleError}`},void 0,!1,void 0,this)},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var import_react22,TUI_SESSION3="genie-tui";var init_SpawnTargetPicker=__esm(async()=>{init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react2();import_react22=__toESM(require_react_development(),1)});var require_package=__commonJS((exports,module2)=>{module2.exports={name:"systeminformation",version:"5.31.5",description:"Advanced, lightweight system and OS information library",license:"MIT",author:"Sebastian Hildebrandt <hildebrandt@plus-innovations.com> (https://plus-innovations.com)",homepage:"https://systeminformation.io",main:"./lib/index.js",type:"commonjs",bin:{systeminformation:"lib/cli.js"},types:"./lib/index.d.ts",scripts:{test:"node ./test/test.js",testDeno:"deno run -A ./test/test.js"},files:["lib/"],keywords:["system information","sysinfo","monitor","monitoring","os","linux","osx","windows","freebsd","openbsd","netbsd","cpu","cpuload","physical cores","logical cores","processor","cores","threads","socket type","memory","file system","fsstats","diskio","block devices","netstats","network","network interfaces","network connections","network stats","iface","printer","processes","users","internet","battery","docker","docker stats","docker processes","graphics","graphic card","graphic controller","gpu","display","smart","disk layout","usb","audio","bluetooth","wifi","wifinetworks","virtual box","virtualbox","vm","backend","hardware","BIOS","chassis"],repository:{type:"git",url:"git+https://github.com/sebhildebrandt/systeminformation.git"},funding:{type:"Buy me a coffee",url:"https://www.buymeacoffee.com/systeminfo"},os:["darwin","linux","win32","freebsd","openbsd","netbsd","sunos","android"],engines:{node:">=8.0.0"}}});var require_util3=__commonJS((exports)=>{var os4=__require("os"),fs3=__require("fs"),path6=__require("path"),spawn5=__require("child_process").spawn,exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,util4=__require("util"),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_cores=0,codepage="",_smartMonToolsInstalled=null,_rpi_cpuinfo=null,WINDIR=process.env.WINDIR||"C:\\Windows",_psChild,_psResult="",_psCmds=[],_psPersistent=!1,_powerShell="",_psToUTF8="$OutputEncoding = [System.Console]::OutputEncoding = [System.Console]::InputEncoding = [System.Text.Encoding]::UTF8 ; ",_psCmdStart="--###START###--",_psError="--ERROR--",_psCmdSeperator="--###ENDCMD###--",_psIdSeperator="--##ID##--",execOptsWin={windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})},execOptsLinux={maxBuffer:104857600,encoding:"UTF-8",stdio:["pipe","pipe","ignore"]};function toInt(value){let result2=parseInt(value,10);if(isNaN(result2))result2=0;return result2}function splitByNumber(str5){let numberStarted=!1,num="",cpart="";for(let c of str5)if(c>="0"&&c<="9"||numberStarted)numberStarted=!0,num+=c;else cpart+=c;return[cpart,num]}var stringObj=new String,stringReplace=new String().replace,stringToLower=new String().toLowerCase,stringToString=new String().toString,stringSubstr=new String().substr,stringSubstring=new String().substring,stringTrim=new String().trim,stringStartWith=new String().startsWith,mathMin=Math.min;function isFunction(functionToCheck){return functionToCheck&&{}.toString.call(functionToCheck)==="[object Function]"}function unique(obj){let uniques=[],stringify2={};for(let i2=0;i2<obj.length;i2++){let keys=Object.keys(obj[i2]);keys.sort((a,b3)=>{return a-b3});let str5="";for(let j2=0;j2<keys.length;j2++)str5+=JSON.stringify(keys[j2]),str5+=JSON.stringify(obj[i2][keys[j2]]);if(!{}.hasOwnProperty.call(stringify2,str5))uniques.push(obj[i2]),stringify2[str5]=!0}return uniques}function sortByKey(array,keys){return array.sort((a,b3)=>{let x2="",y2="";return keys.forEach((key)=>{x2=x2+a[key],y2=y2+b3[key]}),x2<y2?-1:x2>y2?1:0})}function cores(){if(_cores===0)_cores=os4.cpus().length;return _cores}function getValue(lines,property,separator,trimmed,lineMatch){separator=separator||":",property=property.toLowerCase(),trimmed=trimmed||!1,lineMatch=lineMatch||!1;let result2="";return lines.some((line)=>{let lineLower=line.toLowerCase().replace(/\t/g,"");if(trimmed)lineLower=lineLower.trim();if(lineLower.startsWith(property)&&(lineMatch?lineLower.match(property+separator)||lineLower.match(property+" "+separator):!0)){let parts=trimmed?line.trim().split(separator):line.split(separator);if(parts.length>=2)return parts.shift(),result2=parts.join(separator).trim(),!0}return!1}),result2}function decodeEscapeSequence(str5,base){return base=base||16,str5.replace(/\\x([0-9A-Fa-f]{2})/g,function(){return String.fromCharCode(parseInt(arguments[1],base))})}function detectSplit(str5){let seperator="",part=0;return str5.split("").forEach((element)=>{if(element>="0"&&element<="9"){if(part===1)part++}else{if(part===0)part++;if(part===1)seperator+=element}}),seperator}function parseTime(t2,pmDesignator){pmDesignator=pmDesignator||"",t2=t2.toUpperCase();let hour=0,min=0,splitter=detectSplit(t2),parts=t2.split(splitter);if(parts.length>=2){if(parts[2])parts[1]+=parts[2];let isPM=parts[1]&&parts[1].toLowerCase().indexOf("pm")>-1||parts[1].toLowerCase().indexOf("p.m.")>-1||parts[1].toLowerCase().indexOf("p. m.")>-1||parts[1].toLowerCase().indexOf("n")>-1||parts[1].toLowerCase().indexOf("ch")>-1||parts[1].toLowerCase().indexOf("\xF6s")>-1||pmDesignator&&parts[1].toLowerCase().indexOf(pmDesignator)>-1;return hour=parseInt(parts[0],10),min=parseInt(parts[1],10),hour=isPM&&hour<12?hour+12:hour,("0"+hour).substr(-2)+":"+("0"+min).substr(-2)}}function parseDateTime(dt,culture){let result2={date:"",time:""};culture=culture||{};let dateFormat=(culture.dateFormat||"").toLowerCase(),pmDesignator=culture.pmDesignator||"",parts=dt.split(" ");if(parts[0]){if(parts[0].indexOf("/")>=0){let dtparts=parts[0].split("/");if(dtparts.length===3)if(dtparts[0].length===4)result2.date=dtparts[0]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[2]).substr(-2);else if(dtparts[2].length===2)if(dateFormat.indexOf("/d/")>-1||dateFormat.indexOf("/dd/")>-1)result2.date="20"+dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2);else result2.date="20"+dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2);else if((dt.toLowerCase().indexOf("pm")>-1||dt.toLowerCase().indexOf("p.m.")>-1||dt.toLowerCase().indexOf("p. m.")>-1||dt.toLowerCase().indexOf("am")>-1||dt.toLowerCase().indexOf("a.m.")>-1||dt.toLowerCase().indexOf("a. m.")>-1||dateFormat.indexOf("/d/")>-1||dateFormat.indexOf("/dd/")>-1)&&dateFormat.indexOf("dd/")!==0)result2.date=dtparts[2]+"-"+("0"+dtparts[0]).substr(-2)+"-"+("0"+dtparts[1]).substr(-2);else result2.date=dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2)}if(parts[0].indexOf(".")>=0){let dtparts=parts[0].split(".");if(dtparts.length===3)if(dateFormat.indexOf(".d.")>-1||dateFormat.indexOf(".dd.")>-1)result2.date=dtparts[2]+"-"+("0"+dtparts[0]).substr(-2)+"-"+("0"+dtparts[1]).substr(-2);else result2.date=dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2)}if(parts[0].indexOf("-")>=0){let dtparts=parts[0].split("-");if(dtparts.length===3)result2.date=dtparts[0]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[2]).substr(-2)}}if(parts[1]){parts.shift();let time=parts.join(" ");result2.time=parseTime(time,pmDesignator)}return result2}function parseHead(head,rights){let space=rights>0,count=1,from=0,to=0,result2=[];for(let i2=0;i2<head.length;i2++)if(count<=rights){if(/\s/.test(head[i2])&&!space)to=i2-1,result2.push({from,to:to+1,cap:head.substring(from,to+1)}),from=to+2,count++;space=head[i2]===" "}else{if(!/\s/.test(head[i2])&&space){if(to=i2-1,from<to)result2.push({from,to,cap:head.substring(from,to)});from=to+1,count++}space=head[i2]===" "}to=5000,result2.push({from,to,cap:head.substring(from,to)});let len=result2.length;for(let i2=0;i2<len;i2++)if(result2[i2].cap.replace(/\s/g,"").length===0){if(i2+1<len)result2[i2].to=result2[i2+1].to,result2[i2].cap=result2[i2].cap+result2[i2+1].cap,result2.splice(i2+1,1),len=len-1}return result2}function findObjectByKey(array,key,value){for(let i2=0;i2<array.length;i2++)if(array[i2][key]===value)return i2;return-1}function getPowershell(){if(_powerShell="powershell.exe",_windows){let defaultPath=`${WINDIR}\\system32\\WindowsPowerShell\\v1.0\\powershell.exe`;if(fs3.existsSync(defaultPath))_powerShell=defaultPath}}function getVboxmanage(){return _windows?`"${process.env.VBOX_INSTALL_PATH||process.env.VBOX_MSI_INSTALL_PATH}\\VBoxManage.exe"`:"vboxmanage"}function powerShellProceedResults(data){let id="",parts,res="";if(data.indexOf(_psCmdStart)>=0){parts=data.split(_psCmdStart);let parts2=parts[1].split(_psIdSeperator);if(id=parts2[0],parts2.length>1)data=parts2.slice(1).join(_psIdSeperator)}if(data.indexOf(_psCmdSeperator)>=0)parts=data.split(_psCmdSeperator),res=parts[0];let remove=-1;for(let i2=0;i2<_psCmds.length;i2++)if(_psCmds[i2].id===id)remove=i2,_psCmds[i2].callback(res);if(remove>=0)_psCmds.splice(remove,1)}function powerShellStart(){if(!_psChild){if(_psChild=spawn5(_powerShell,["-NoProfile","-NoLogo","-InputFormat","Text","-NoExit","-Command","-"],{stdio:"pipe",windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})}),_psChild&&_psChild.pid)_psPersistent=!0,_psChild.stdout.on("data",(data)=>{if(_psResult=_psResult+data.toString("utf8"),data.indexOf(_psCmdSeperator)>=0)powerShellProceedResults(_psResult),_psResult=""}),_psChild.stderr.on("data",()=>{powerShellProceedResults(_psResult+_psError)}),_psChild.on("error",()=>{powerShellProceedResults(_psResult+_psError)}),_psChild.on("close",()=>{if(_psChild)_psChild.kill()})}}function powerShellRelease(){try{if(_psChild)_psChild.stdin.write("exit"+os4.EOL),_psChild.stdin.end()}catch{if(_psChild)_psChild.kill()}_psPersistent=!1,_psChild=null}function powerShell(cmd){if(_psPersistent){let id=Math.random().toString(36).substring(2,12);return new Promise((resolve23)=>{process.nextTick(()=>{function callback(data){resolve23(data)}_psCmds.push({id,cmd,callback,start:new Date});try{if(_psChild&&_psChild.pid)_psChild.stdin.write(_psToUTF8+"echo "+_psCmdStart+id+_psIdSeperator+"; "+os4.EOL+cmd+os4.EOL+"echo "+_psCmdSeperator+os4.EOL)}catch{resolve23("")}})})}else{let result2="";return new Promise((resolve23)=>{process.nextTick(()=>{try{let osVersion=os4.release().split(".").map(Number),spanOptions=osVersion[0]<10?["-NoProfile","-NoLogo","-InputFormat","Text","-NoExit","-ExecutionPolicy","Unrestricted","-Command","-"]:["-NoProfile","-NoLogo","-InputFormat","Text","-ExecutionPolicy","Unrestricted","-Command",_psToUTF8+cmd],child=spawn5(_powerShell,spanOptions,{stdio:"pipe",windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})});if(child&&!child.pid)child.on("error",()=>{resolve23(result2)});if(child&&child.pid){if(child.stdout.on("data",(data)=>{result2=result2+data.toString("utf8")}),child.stderr.on("data",()=>{child.kill(),resolve23(result2)}),child.on("close",()=>{child.kill(),resolve23(result2)}),child.on("error",()=>{child.kill(),resolve23(result2)}),osVersion[0]<10)try{child.stdin.write(_psToUTF8+cmd+os4.EOL),child.stdin.write("exit"+os4.EOL),child.stdin.end()}catch{child.kill(),resolve23(result2)}}else resolve23(result2)}catch{resolve23(result2)}})})}}function execSafe(cmd,args,options){let result2="";return options=options||{},new Promise((resolve23)=>{process.nextTick(()=>{try{let child=spawn5(cmd,args,options);if(child&&!child.pid)child.on("error",()=>{resolve23(result2)});if(child&&child.pid)child.stdout.on("data",(data)=>{result2+=data.toString()}),child.on("close",()=>{child.kill(),resolve23(result2)}),child.on("error",()=>{child.kill(),resolve23(result2)});else resolve23(result2)}catch{resolve23(result2)}})})}function getCodepage(){if(_windows){if(!codepage)try{let parts=execSync18("chcp",execOptsWin).toString().split(`\r
|
|
3629
3629
|
`)[0].split(":");codepage=parts.length>1?parts[1].replace(".","").trim():""}catch{codepage="437"}return codepage}if(_linux||_darwin||_freebsd||_openbsd||_netbsd){if(!codepage)try{let parts=execSync18("echo $LANG",execOptsLinux).toString().split(`\r
|
|
3630
3630
|
`)[0].split(".");if(codepage=parts.length>1?parts[1].trim():"",!codepage)codepage="UTF-8"}catch{codepage="UTF-8"}return codepage}}function smartMonToolsInstalled(){if(_smartMonToolsInstalled!==null)return _smartMonToolsInstalled;if(_smartMonToolsInstalled=!1,_windows)try{let pathArray=execSync18("WHERE smartctl 2>nul",execOptsWin).toString().split(`\r
|
|
3631
3631
|
`);if(pathArray&&pathArray.length)_smartMonToolsInstalled=pathArray[0].indexOf(":\\")>=0;else _smartMonToolsInstalled=!1}catch{_smartMonToolsInstalled=!1}if(_linux||_darwin||_freebsd||_openbsd||_netbsd)try{_smartMonToolsInstalled=execSync18("which smartctl 2>/dev/null",execOptsLinux).toString().split(`\r
|
|
@@ -4010,7 +4010,7 @@ Bus `);for(let i2=1;i2<parts.length;i2++){let usb2=parseLinuxUsb(parts[i2]);resu
|
|
|
4010
4010
|
`);if(util4.getValue(lines,"class",":",!0).toLowerCase().indexOf("audio")>=0){let audio2=parseLinuxAudioPciMM(lines,audioPCI);result2.push(audio2)}})}if(callback)callback(result2);resolve23(result2)});if(_darwin)exec3("system_profiler SPAudioDataType -json",(error2,stdout)=>{if(!error2)try{let outObj=JSON.parse(stdout.toString());if(outObj.SPAudioDataType&&outObj.SPAudioDataType.length&&outObj.SPAudioDataType[0]&&outObj.SPAudioDataType[0]._items&&outObj.SPAudioDataType[0]._items.length)for(let i2=0;i2<outObj.SPAudioDataType[0]._items.length;i2++){let audio2=parseDarwinAudio(outObj.SPAudioDataType[0]._items[i2],i2);result2.push(audio2)}}catch{util4.noop()}if(callback)callback(result2);resolve23(result2)});if(_windows)util4.powerShell("Get-CimInstance Win32_SoundDevice | select DeviceID,StatusInfo,Name,Manufacturer | fl").then((stdout,error2)=>{if(!error2)stdout.toString().split(/\n\s*\n/).forEach((element)=>{let lines=element.split(`
|
|
4011
4011
|
`);if(util4.getValue(lines,"name",":"))result2.push(parseWindowsAudio(lines))});if(callback)callback(result2);resolve23(result2)});if(_sunos)resolve23(null)})})}exports.audio=audio});var require_bluetoothVendors=__commonJS((exports,module2)=>{module2.exports={0:"Ericsson Technology Licensing",1:"Nokia Mobile Phones",2:"Intel Corp.",3:"IBM Corp.",4:"Toshiba Corp.",5:"3Com",6:"Microsoft",7:"Lucent",8:"Motorola",9:"Infineon Technologies AG",10:"Cambridge Silicon Radio",11:"Silicon Wave",12:"Digianswer A/S",13:"Texas Instruments Inc.",14:"Ceva, Inc. (formerly Parthus Technologies, Inc.)",15:"Broadcom Corporation",16:"Mitel Semiconductor",17:"Widcomm, Inc",18:"Zeevo, Inc.",19:"Atmel Corporation",20:"Mitsubishi Electric Corporation",21:"RTX Telecom A/S",22:"KC Technology Inc.",23:"NewLogic",24:"Transilica, Inc.",25:"Rohde & Schwarz GmbH & Co. KG",26:"TTPCom Limited",27:"Signia Technologies, Inc.",28:"Conexant Systems Inc.",29:"Qualcomm",30:"Inventel",31:"AVM Berlin",32:"BandSpeed, Inc.",33:"Mansella Ltd",34:"NEC Corporation",35:"WavePlus Technology Co., Ltd.",36:"Alcatel",37:"NXP Semiconductors (formerly Philips Semiconductors)",38:"C Technologies",39:"Open Interface",40:"R F Micro Devices",41:"Hitachi Ltd",42:"Symbol Technologies, Inc.",43:"Tenovis",44:"Macronix International Co. Ltd.",45:"GCT Semiconductor",46:"Norwood Systems",47:"MewTel Technology Inc.",48:"ST Microelectronics",49:"Synopsis",50:"Red-M (Communications) Ltd",51:"Commil Ltd",52:"Computer Access Technology Corporation (CATC)",53:"Eclipse (HQ Espana) S.L.",54:"Renesas Electronics Corporation",55:"Mobilian Corporation",56:"Terax",57:"Integrated System Solution Corp.",58:"Matsushita Electric Industrial Co., Ltd.",59:"Gennum Corporation",60:"BlackBerry Limited (formerly Research In Motion)",61:"IPextreme, Inc.",62:"Systems and Chips, Inc.",63:"Bluetooth SIG, Inc.",64:"Seiko Epson Corporation",65:"Integrated Silicon Solution Taiwan, Inc.",66:"CONWISE Technology Corporation Ltd",67:"PARROT SA",68:"Socket Mobile",69:"Atheros Communications, Inc.",70:"MediaTek, Inc.",71:"Bluegiga",72:"Marvell Technology Group Ltd.",73:"3DSP Corporation",74:"Accel Semiconductor Ltd.",75:"Continental Automotive Systems",76:"Apple, Inc.",77:"Staccato Communications, Inc.",78:"Avago Technologies",79:"APT Licensing Ltd.",80:"SiRF Technology",81:"Tzero Technologies, Inc.",82:"J&M Corporation",83:"Free2move AB",84:"3DiJoy Corporation",85:"Plantronics, Inc.",86:"Sony Ericsson Mobile Communications",87:"Harman International Industries, Inc.",88:"Vizio, Inc.",89:"Nordic Semiconductor ASA",90:"EM Microelectronic-Marin SA",91:"Ralink Technology Corporation",92:"Belkin International, Inc.",93:"Realtek Semiconductor Corporation",94:"Stonestreet One, LLC",95:"Wicentric, Inc.",96:"RivieraWaves S.A.S",97:"RDA Microelectronics",98:"Gibson Guitars",99:"MiCommand Inc.",100:"Band XI International, LLC",101:"Hewlett-Packard Company",102:"9Solutions Oy",103:"GN Netcom A/S",104:"General Motors",105:"A&D Engineering, Inc.",106:"MindTree Ltd.",107:"Polar Electro OY",108:"Beautiful Enterprise Co., Ltd.",109:"BriarTek, Inc.",110:"Summit Data Communications, Inc.",111:"Sound ID",112:"Monster, LLC",113:"connectBlue AB",114:"ShangHai Super Smart Electronics Co. Ltd.",115:"Group Sense Ltd.",116:"Zomm, LLC",117:"Samsung Electronics Co. Ltd.",118:"Creative Technology Ltd.",119:"Laird Technologies",120:"Nike, Inc.",121:"lesswire AG",122:"MStar Semiconductor, Inc.",123:"Hanlynn Technologies",124:"A & R Cambridge",125:"Seers Technology Co. Ltd",126:"Sports Tracking Technologies Ltd.",127:"Autonet Mobile",128:"DeLorme Publishing Company, Inc.",129:"WuXi Vimicro",130:"Sennheiser Communications A/S",131:"TimeKeeping Systems, Inc.",132:"Ludus Helsinki Ltd.",133:"BlueRadios, Inc.",134:"equinox AG",135:"Garmin International, Inc.",136:"Ecotest",137:"GN ReSound A/S",138:"Jawbone",139:"Topcorn Positioning Systems, LLC",140:"Gimbal Inc. (formerly Qualcomm Labs, Inc. and Qualcomm Retail Solutions, Inc.)",141:"Zscan Software",142:"Quintic Corp.",143:"Stollman E+V GmbH",144:"Funai Electric Co., Ltd.",145:"Advanced PANMOBIL Systems GmbH & Co. KG",146:"ThinkOptics, Inc.",147:"Universal Electronics, Inc.",148:"Airoha Technology Corp.",149:"NEC Lighting, Ltd.",150:"ODM Technology, Inc.",151:"ConnecteDevice Ltd.",152:"zer01.tv GmbH",153:"i.Tech Dynamic Global Distribution Ltd.",154:"Alpwise",155:"Jiangsu Toppower Automotive Electronics Co., Ltd.",156:"Colorfy, Inc.",157:"Geoforce Inc.",158:"Bose Corporation",159:"Suunto Oy",160:"Kensington Computer Products Group",161:"SR-Medizinelektronik",162:"Vertu Corporation Limited",163:"Meta Watch Ltd.",164:"LINAK A/S",165:"OTL Dynamics LLC",166:"Panda Ocean Inc.",167:"Visteon Corporation",168:"ARP Devices Limited",169:"Magneti Marelli S.p.A",170:"CAEN RFID srl",171:"Ingenieur-Systemgruppe Zahn GmbH",172:"Green Throttle Games",173:"Peter Systemtechnik GmbH",174:"Omegawave Oy",175:"Cinetix",176:"Passif Semiconductor Corp",177:"Saris Cycling Group, Inc",178:"Bekey A/S",179:"Clarinox Technologies Pty. Ltd.",180:"BDE Technology Co., Ltd.",181:"Swirl Networks",182:"Meso international",183:"TreLab Ltd",184:"Qualcomm Innovation Center, Inc. (QuIC)",185:"Johnson Controls, Inc.",186:"Starkey Laboratories Inc.",187:"S-Power Electronics Limited",188:"Ace Sensor Inc",189:"Aplix Corporation",190:"AAMP of America",191:"Stalmart Technology Limited",192:"AMICCOM Electronics Corporation",193:"Shenzhen Excelsecu Data Technology Co.,Ltd",194:"Geneq Inc.",195:"adidas AG",196:"LG Electronics",197:"Onset Computer Corporation",198:"Selfly BV",199:"Quuppa Oy.",200:"GeLo Inc",201:"Evluma",202:"MC10",203:"Binauric SE",204:"Beats Electronics",205:"Microchip Technology Inc.",206:"Elgato Systems GmbH",207:"ARCHOS SA",208:"Dexcom, Inc.",209:"Polar Electro Europe B.V.",210:"Dialog Semiconductor B.V.",211:"Taixingbang\xA0Technology (HK) Co,. LTD.",212:"Kawantech",213:"Austco Communication Systems",214:"Timex Group USA, Inc.",215:"Qualcomm Technologies, Inc.",216:"Qualcomm Connected Experiences, Inc.",217:"Voyetra Turtle Beach",218:"txtr GmbH",219:"Biosentronics",220:"Procter & Gamble",221:"Hosiden Corporation",222:"Muzik LLC",223:"Misfit Wearables Corp",224:"Google",225:"Danlers Ltd",226:"Semilink Inc",227:"inMusic Brands, Inc",228:"L.S. Research Inc.",229:"Eden Software Consultants Ltd.",230:"Freshtemp",231:"KS Technologies",232:"ACTS Technologies",233:"Vtrack Systems",234:"Nielsen-Kellerman Company",235:"Server Technology, Inc.",236:"BioResearch Associates",237:"Jolly Logic, LLC",238:"Above Average Outcomes, Inc.",239:"Bitsplitters GmbH",240:"PayPal, Inc.",241:"Witron Technology Limited",242:"Aether Things\xA0Inc. (formerly Morse Project Inc.)",243:"Kent Displays Inc.",244:"Nautilus Inc.",245:"Smartifier Oy",246:"Elcometer Limited",247:"VSN Technologies Inc.",248:"AceUni Corp., Ltd.",249:"StickNFind",250:"Crystal Code AB",251:"KOUKAAM a.s.",252:"Delphi Corporation",253:"ValenceTech Limited",254:"Reserved",255:"Typo Products, LLC",256:"TomTom International BV",257:"Fugoo, Inc",258:"Keiser Corporation",259:"Bang & Olufsen A/S",260:"PLUS Locations Systems Pty Ltd",261:"Ubiquitous Computing Technology Corporation",262:"Innovative Yachtter Solutions",263:"William Demant Holding A/S",264:"Chicony Electronics Co., Ltd.",265:"Atus BV",266:"Codegate Ltd.",267:"ERi, Inc.",268:"Transducers Direct, LLC",269:"Fujitsu Ten Limited",270:"Audi AG",271:"HiSilicon Technologies Co., Ltd.",272:"Nippon Seiki Co., Ltd.",273:"Steelseries ApS",274:"vyzybl Inc.",275:"Openbrain Technologies, Co., Ltd.",276:"Xensr",277:"e.solutions",278:"1OAK Technologies",279:"Wimoto Technologies Inc",280:"Radius Networks, Inc.",281:"Wize Technology Co., Ltd.",282:"Qualcomm Labs, Inc.",283:"Aruba Networks",284:"Baidu",285:"Arendi AG",286:"Skoda Auto a.s.",287:"Volkswagon AG",288:"Porsche AG",289:"Sino Wealth Electronic Ltd.",290:"AirTurn, Inc.",291:"Kinsa, Inc.",292:"HID Global",293:"SEAT es",294:"Promethean Ltd.",295:"Salutica Allied Solutions",296:"GPSI Group Pty Ltd",297:"Nimble Devices Oy",298:"Changzhou Yongse Infotech Co., Ltd",299:"SportIQ",300:"TEMEC Instruments B.V.",301:"Sony Corporation",302:"ASSA ABLOY",303:"Clarion Co., Ltd.",304:"Warehouse Innovations",305:"Cypress Semiconductor Corporation",306:"MADS Inc",307:"Blue Maestro Limited",308:"Resolution Products, Inc.",309:"Airewear LLC",310:"Seed Labs, Inc. (formerly ETC sp. z.o.o.)",311:"Prestigio Plaza Ltd.",312:"NTEO Inc.",313:"Focus Systems Corporation",314:"Tencent Holdings Limited",315:"Allegion",316:"Murata Manufacuring Co., Ltd.",318:"Nod, Inc.",319:"B&B Manufacturing Company",320:"Alpine\xA0Electronics\xA0(China)\xA0Co.,\xA0Ltd",321:"FedEx Services",322:"Grape Systems Inc.",323:"Bkon Connect",324:"Lintech GmbH",325:"Novatel Wireless",326:"Ciright",327:"Mighty Cast, Inc.",328:"Ambimat Electronics",329:"Perytons Ltd.",330:"Tivoli Audio, LLC",331:"Master Lock",332:"Mesh-Net Ltd",333:"Huizhou Desay SV Automotive CO., LTD.",334:"Tangerine, Inc.",335:"B&W Group Ltd.",336:"Pioneer Corporation",337:"OnBeep",338:"Vernier Software & Technology",339:"ROL Ergo",340:"Pebble Technology",341:"NETATMO",342:"Accumulate AB",343:"Anhui Huami Information Technology Co., Ltd.",344:"Inmite s.r.o.",345:"ChefSteps, Inc.",346:"micas AG",347:"Biomedical Research Ltd.",348:"Pitius Tec S.L.",349:"Estimote, Inc.",350:"Unikey Technologies, Inc.",351:"Timer Cap Co.",352:"AwoX",353:"yikes",354:"MADSGlobal NZ Ltd.",355:"PCH International",356:"Qingdao Yeelink Information Technology Co., Ltd.",357:"Milwaukee Tool (formerly Milwaukee Electric Tools)",358:"MISHIK Pte Ltd",359:"Bayer HealthCare",360:"Spicebox LLC",361:"emberlight",362:"Cooper-Atkins Corporation",363:"Qblinks",364:"MYSPHERA",365:"LifeScan Inc",366:"Volantic AB",367:"Podo Labs, Inc",368:"Roche Diabetes Care AG",369:"Amazon Fulfillment Service",370:"Connovate Technology Private Limited",371:"Kocomojo, LLC",372:"Everykey LLC",373:"Dynamic Controls",374:"SentriLock",375:"I-SYST inc.",376:"CASIO COMPUTER CO., LTD.",377:"LAPIS Semiconductor Co., Ltd.",378:"Telemonitor, Inc.",379:"taskit GmbH",380:"Daimler AG",381:"BatAndCat",382:"BluDotz Ltd",383:"XTel ApS",384:"Gigaset Communications GmbH",385:"Gecko Health Innovations, Inc.",386:"HOP Ubiquitous",387:"To Be Assigned",388:"Nectar",389:"bel\u2019apps LLC",390:"CORE Lighting Ltd",391:"Seraphim Sense Ltd",392:"Unico RBC",393:"Physical Enterprises Inc.",394:"Able Trend Technology Limited",395:"Konica Minolta, Inc.",396:"Wilo SE",397:"Extron Design Services",398:"Fitbit, Inc.",399:"Fireflies Systems",400:"Intelletto Technologies Inc.",401:"FDK CORPORATION",402:"Cloudleaf, Inc",403:"Maveric Automation LLC",404:"Acoustic Stream Corporation",405:"Zuli",406:"Paxton Access Ltd",407:"WiSilica Inc",408:"Vengit Limited",409:"SALTO SYSTEMS S.L.",410:"TRON Forum (formerly T-Engine Forum)",411:"CUBETECH s.r.o.",412:"Cokiya Incorporated",413:"CVS Health",414:"Ceruus",415:"Strainstall Ltd",416:"Channel Enterprises (HK) Ltd.",417:"FIAMM",418:"GIGALANE.CO.,LTD",419:"EROAD",420:"Mine Safety Appliances",421:"Icon Health and Fitness",422:"Asandoo GmbH",423:"ENERGOUS CORPORATION",424:"Taobao",425:"Canon Inc.",426:"Geophysical Technology Inc.",427:"Facebook, Inc.",428:"Nipro Diagnostics, Inc.",429:"FlightSafety International",430:"Earlens Corporation",431:"Sunrise Micro Devices, Inc.",432:"Star Micronics Co., Ltd.",433:"Netizens Sp. z o.o.",434:"Nymi Inc.",435:"Nytec, Inc.",436:"Trineo Sp. z o.o.",437:"Nest Labs Inc.",438:"LM Technologies Ltd",439:"General Electric Company",440:"i+D3 S.L.",441:"HANA Micron",442:"Stages Cycling LLC",443:"Cochlear Bone Anchored Solutions AB",444:"SenionLab AB",445:"Syszone Co., Ltd",446:"Pulsate Mobile Ltd.",447:"Hong Kong HunterSun Electronic Limited",448:"pironex GmbH",449:"BRADATECH Corp.",450:"Transenergooil AG",451:"Bunch",452:"DME Microelectronics",453:"Bitcraze AB",454:"HASWARE Inc.",455:"Abiogenix Inc.",456:"Poly-Control ApS",457:"Avi-on",458:"Laerdal Medical AS",459:"Fetch My Pet",460:"Sam Labs Ltd.",461:"Chengdu Synwing Technology Ltd",462:"HOUWA SYSTEM DESIGN, k.k.",463:"BSH",464:"Primus Inter Pares Ltd",465:"August",466:"Gill Electronics",467:"Sky Wave Design",468:"Newlab S.r.l.",469:"ELAD srl",470:"G-wearables inc.",471:"Squadrone Systems Inc.",472:"Code Corporation",473:"Savant Systems LLC",474:"Logitech International SA",475:"Innblue Consulting",476:"iParking Ltd.",477:"Koninklijke Philips Electronics N.V.",478:"Minelab Electronics Pty Limited",479:"Bison Group Ltd.",480:"Widex A/S",481:"Jolla Ltd",482:"Lectronix, Inc.",483:"Caterpillar Inc",484:"Freedom Innovations",485:"Dynamic Devices Ltd",486:"Technology Solutions (UK) Ltd",487:"IPS Group Inc.",488:"STIR",489:"Sano, Inc",490:"Advanced Application Design, Inc.",491:"AutoMap LLC",492:"Spreadtrum Communications Shanghai Ltd",493:"CuteCircuit LTD",494:"Valeo Service",495:"Fullpower Technologies, Inc.",496:"KloudNation",497:"Zebra Technologies Corporation",498:"Itron, Inc.",499:"The University of Tokyo",500:"UTC Fire and Security",501:"Cool Webthings Limited",502:"DJO Global",503:"Gelliner Limited",504:"Anyka (Guangzhou) Microelectronics Technology Co, LTD",505:"Medtronic, Inc.",506:"Gozio, Inc.",507:"Form Lifting, LLC",508:"Wahoo Fitness, LLC",509:"Kontakt Micro-Location Sp. z o.o.",510:"Radio System Corporation",511:"Freescale Semiconductor, Inc.",512:"Verifone Systems PTe Ltd. Taiwan Branch",513:"AR Timing",514:"Rigado LLC",515:"Kemppi Oy",516:"Tapcentive Inc.",517:"Smartbotics Inc.",518:"Otter Products, LLC",519:"STEMP Inc.",520:"LumiGeek LLC",521:"InvisionHeart Inc.",522:"Macnica Inc. ",523:"Jaguar Land Rover Limited",524:"CoroWare Technologies, Inc",525:"Simplo Technology Co., LTD",526:"Omron Healthcare Co., LTD",527:"Comodule GMBH",528:"ikeGPS",529:"Telink Semiconductor Co. Ltd",530:"Interplan Co., Ltd",531:"Wyler AG",532:"IK Multimedia Production srl",533:"Lukoton Experience Oy",534:"MTI Ltd",535:"Tech4home, Lda",536:"Hiotech AB",537:"DOTT Limited",538:"Blue Speck Labs, LLC",539:"Cisco Systems, Inc",540:"Mobicomm Inc",541:"Edamic",542:"Goodnet, Ltd",543:"Luster Leaf Products Inc",544:"Manus Machina BV",545:"Mobiquity Networks Inc",546:"Praxis Dynamics",547:"Philip Morris Products S.A.",548:"Comarch SA",549:"Nestl Nespresso S.A.",550:"Merlinia A/S",551:"LifeBEAM Technologies",552:"Twocanoes Labs, LLC",553:"Muoverti Limited",554:"Stamer Musikanlagen GMBH",555:"Tesla Motors",556:"Pharynks Corporation",557:"Lupine",558:"Siemens AG",559:"Huami (Shanghai) Culture Communication CO., LTD",560:"Foster Electric Company, Ltd",561:"ETA SA",562:"x-Senso Solutions Kft",563:"Shenzhen SuLong Communication Ltd",564:"FengFan (BeiJing) Technology Co, Ltd",565:"Qrio Inc",566:"Pitpatpet Ltd",567:"MSHeli s.r.l.",568:"Trakm8 Ltd",569:"JIN CO, Ltd",570:"Alatech Tehnology",571:"Beijing CarePulse Electronic Technology Co, Ltd",572:"Awarepoint",573:"ViCentra B.V.",574:"Raven Industries",575:"WaveWare Technologies Inc.",576:"Argenox Technologies",577:"Bragi GmbH",578:"16Lab Inc",579:"Masimo Corp",580:"Iotera Inc",581:"Endress+Hauser",582:"ACKme Networks, Inc.",583:"FiftyThree Inc.",584:"Parker Hannifin Corp",585:"Transcranial Ltd",586:"Uwatec AG",587:"Orlan LLC",588:"Blue Clover Devices",589:"M-Way Solutions GmbH",590:"Microtronics Engineering GmbH",591:"Schneider Schreibgerte GmbH",592:"Sapphire Circuits LLC",593:"Lumo Bodytech Inc.",594:"UKC Technosolution",595:"Xicato Inc.",596:"Playbrush",597:"Dai Nippon Printing Co., Ltd.",598:"G24 Power Limited",599:"AdBabble Local Commerce Inc.",600:"Devialet SA",601:"ALTYOR",602:"University of Applied Sciences Valais/Haute Ecole Valaisanne",603:"Five Interactive, LLC dba Zendo",604:"NetEaseHangzhouNetwork co.Ltd.",605:"Lexmark International Inc.",606:"Fluke Corporation",607:"Yardarm Technologies",608:"SensaRx",609:"SECVRE GmbH",610:"Glacial Ridge Technologies",611:"Identiv, Inc.",612:"DDS, Inc.",613:"SMK Corporation",614:"Schawbel Technologies LLC",615:"XMI Systems SA",616:"Cerevo",617:"Torrox GmbH & Co KG",618:"Gemalto",619:"DEKA Research & Development Corp.",620:"Domster Tadeusz Szydlowski",621:"Technogym SPA",622:"FLEURBAEY BVBA",623:"Aptcode Solutions",624:"LSI ADL Technology",625:"Animas Corp",626:"Alps Electric Co., Ltd.",627:"OCEASOFT",628:"Motsai Research",629:"Geotab",630:"E.G.O. Elektro-Gertebau GmbH",631:"bewhere inc",632:"Johnson Outdoors Inc",633:"steute Schaltgerate GmbH & Co. KG",634:"Ekomini inc.",635:"DEFA AS",636:"Aseptika Ltd",637:"HUAWEI Technologies Co., Ltd. ( )",638:"HabitAware, LLC",639:"ruwido austria gmbh",640:"ITEC corporation",641:"StoneL",642:"Sonova AG",643:"Maven Machines, Inc.",644:"Synapse Electronics",645:"Standard Innovation Inc.",646:"RF Code, Inc.",647:"Wally Ventures S.L.",648:"Willowbank Electronics Ltd",649:"SK Telecom",650:"Jetro AS",651:"Code Gears LTD",652:"NANOLINK APS",653:"IF, LLC",654:"RF Digital Corp",655:"Church & Dwight Co., Inc",656:"Multibit Oy",657:"CliniCloud Inc",658:"SwiftSensors",659:"Blue Bite",660:"ELIAS GmbH",661:"Sivantos GmbH",662:"Petzl",663:"storm power ltd",664:"EISST Ltd",665:"Inexess Technology Simma KG",666:"Currant, Inc.",667:"C2 Development, Inc.",668:"Blue Sky Scientific, LLC",669:"ALOTTAZS LABS, LLC",670:"Kupson spol. s r.o.",671:"Areus Engineering GmbH",672:"Impossible Camera GmbH",673:"InventureTrack Systems",674:"LockedUp",675:"Itude",676:"Pacific Lock Company",677:"Tendyron Corporation ( )",678:"Robert Bosch GmbH",679:"Illuxtron international B.V.",680:"miSport Ltd.",681:"Chargelib",682:"Doppler Lab",683:"BBPOS Limited",684:"RTB Elektronik GmbH & Co. KG",685:"Rx Networks, Inc.",686:"WeatherFlow, Inc.",687:"Technicolor USA Inc.",688:"Bestechnic(Shanghai),Ltd",689:"Raden Inc",690:"JouZen Oy",691:"CLABER S.P.A.",692:"Hyginex, Inc.",693:"HANSHIN ELECTRIC RAILWAY CO.,LTD.",694:"Schneider Electric",695:"Oort Technologies LLC",696:"Chrono Therapeutics",697:"Rinnai Corporation",698:"Swissprime Technologies AG",699:"Koha.,Co.Ltd",700:"Genevac Ltd",701:"Chemtronics",702:"Seguro Technology Sp. z o.o.",703:"Redbird Flight Simulations",704:"Dash Robotics",705:"LINE Corporation",706:"Guillemot Corporation",707:"Techtronic Power Tools Technology Limited",708:"Wilson Sporting Goods",709:"Lenovo (Singapore) Pte Ltd. ( )",710:"Ayatan Sensors",711:"Electronics Tomorrow Limited",712:"VASCO Data Security International, Inc.",713:"PayRange Inc.",714:"ABOV Semiconductor",715:"AINA-Wireless Inc.",716:"Eijkelkamp Soil & Water",717:"BMA ergonomics b.v.",718:"Teva Branded Pharmaceutical Products R&D, Inc.",719:"Anima",720:"3M",721:"Empatica Srl",722:"Afero, Inc.",723:"Powercast Corporation",724:"Secuyou ApS",725:"OMRON Corporation",726:"Send Solutions",727:"NIPPON SYSTEMWARE CO.,LTD.",728:"Neosfar",729:"Fliegl Agrartechnik GmbH",730:"Gilvader",731:"Digi International Inc (R)",732:"DeWalch Technologies, Inc.",733:"Flint Rehabilitation Devices, LLC",734:"Samsung SDS Co., Ltd.",735:"Blur Product Development",736:"University of Michigan",737:"Victron Energy BV",738:"NTT docomo",739:"Carmanah Technologies Corp.",740:"Bytestorm Ltd.",741:"Espressif Incorporated ( () )",742:"Unwire",743:"Connected Yard, Inc.",744:"American Music Environments",745:"Sensogram Technologies, Inc.",746:"Fujitsu Limited",747:"Ardic Technology",748:"Delta Systems, Inc",749:"HTC Corporation",750:"Citizen Holdings Co., Ltd.",751:"SMART-INNOVATION.inc",752:"Blackrat Software",753:"The Idea Cave, LLC",754:"GoPro, Inc.",755:"AuthAir, Inc",756:"Vensi, Inc.",757:"Indagem Tech LLC",758:"Intemo Technologies",759:"DreamVisions co., Ltd.",760:"Runteq Oy Ltd",761:"IMAGINATION TECHNOLOGIES LTD",762:"CoSTAR TEchnologies",763:"Clarius Mobile Health Corp.",764:"Shanghai Frequen Microelectronics Co., Ltd.",765:"Uwanna, Inc.",766:"Lierda Science & Technology Group Co., Ltd.",767:"Silicon Laboratories",768:"World Moto Inc.",769:"Giatec Scientific Inc.",770:"Loop Devices, Inc",771:"IACA electronique",772:"Martians Inc",773:"Swipp ApS",774:"Life Laboratory Inc.",775:"FUJI INDUSTRIAL CO.,LTD.",776:"Surefire, LLC",777:"Dolby Labs",778:"Ellisys",779:"Magnitude Lighting Converters",780:"Hilti AG",781:"Devdata S.r.l.",782:"Deviceworx",783:"Shortcut Labs",784:"SGL Italia S.r.l.",785:"PEEQ DATA",786:"Ducere Technologies Pvt Ltd",787:"DiveNav, Inc.",788:"RIIG AI Sp. z o.o.",789:"Thermo Fisher Scientific",790:"AG Measurematics Pvt. Ltd.",791:"CHUO Electronics CO., LTD.",792:"Aspenta International",793:"Eugster Frismag AG",794:"Amber wireless GmbH",795:"HQ Inc",796:"Lab Sensor Solutions",797:"Enterlab ApS",798:"Eyefi, Inc.",799:"MetaSystem S.p.A.",800:"SONO ELECTRONICS. CO., LTD",801:"Jewelbots",802:"Compumedics Limited",803:"Rotor Bike Components",804:"Astro, Inc.",805:"Amotus Solutions",806:"Healthwear Technologies (Changzhou)Ltd",807:"Essex Electronics",808:"Grundfos A/S",809:"Eargo, Inc.",810:"Electronic Design Lab",811:"ESYLUX",812:"NIPPON SMT.CO.,Ltd",813:"BM innovations GmbH",814:"indoormap",815:"OttoQ Inc",816:"North Pole Engineering",817:"3flares Technologies Inc.",818:"Electrocompaniet A.S.",819:"Mul-T-Lock",820:"Corentium AS",821:"Enlighted Inc",822:"GISTIC",823:"AJP2 Holdings, LLC",824:"COBI GmbH",825:"Blue Sky Scientific, LLC",826:"Appception, Inc.",827:"Courtney Thorne Limited",828:"Virtuosys",829:"TPV Technology Limited",830:"Monitra SA",831:"Automation Components, Inc.",832:"Letsense s.r.l.",833:"Etesian Technologies LLC",834:"GERTEC BRASIL LTDA.",835:"Drekker Development Pty. Ltd.",836:"Whirl Inc",837:"Locus Positioning",838:"Acuity Brands Lighting, Inc",839:"Prevent Biometrics",840:"Arioneo",841:"VersaMe",842:"Vaddio",843:"Libratone A/S",844:"HM Electronics, Inc.",845:"TASER International, Inc.",846:"SafeTrust Inc.",847:"Heartland Payment Systems",848:"Bitstrata Systems Inc.",849:"Pieps GmbH",850:"iRiding(Xiamen)Technology Co.,Ltd.",851:"Alpha Audiotronics, Inc.",852:"TOPPAN FORMS CO.,LTD.",853:"Sigma Designs, Inc.",854:"Spectrum Brands, Inc.",855:"Polymap Wireless",856:"MagniWare Ltd.",857:"Novotec Medical GmbH",858:"Medicom Innovation Partner a/s",859:"Matrix Inc.",860:"Eaton Corporation",861:"KYS",862:"Naya Health, Inc.",863:"Acromag",864:"Insulet Corporation",865:"Wellinks Inc.",866:"ON Semiconductor",867:"FREELAP SA",868:"Favero Electronics Srl",869:"BioMech Sensor LLC",870:"BOLTT Sports technologies Private limited",871:"Saphe International",872:"Metormote AB",873:"littleBits",874:"SetPoint Medical",875:"BRControls Products BV",876:"Zipcar",877:"AirBolt Pty Ltd",878:"KeepTruckin Inc",879:"Motiv, Inc.",880:"Wazombi Labs O",881:"ORBCOMM",882:"Nixie Labs, Inc.",883:"AppNearMe Ltd",884:"Holman Industries",885:"Expain AS",886:"Electronic Temperature Instruments Ltd",887:"Plejd AB",888:"Propeller Health",889:"Shenzhen iMCO Electronic Technology Co.,Ltd",890:"Algoria",891:"Apption Labs Inc.",892:"Cronologics Corporation",893:"MICRODIA Ltd.",894:"lulabytes S.L.",895:"Nestec S.A.",896:"LLC MEGA - F service",897:"Sharp Corporation",898:"Precision Outcomes Ltd",899:"Kronos Incorporated",900:"OCOSMOS Co., Ltd.",901:"Embedded Electronic Solutions Ltd. dba e2Solutions",902:"Aterica Inc.",903:"BluStor PMC, Inc.",904:"Kapsch TrafficCom AB",905:"ActiveBlu Corporation",906:"Kohler Mira Limited",907:"Noke",908:"Appion Inc.",909:"Resmed Ltd",910:"Crownstone B.V.",911:"Xiaomi Inc.",912:"INFOTECH s.r.o.",913:"Thingsquare AB",914:"T&D",915:"LAVAZZA S.p.A.",916:"Netclearance Systems, Inc.",917:"SDATAWAY",918:"BLOKS GmbH",919:"LEGO System A/S",920:"Thetatronics Ltd",921:"Nikon Corporation",922:"NeST",923:"South Silicon Valley Microelectronics",924:"ALE International",925:"CareView Communications, Inc.",926:"SchoolBoard Limited",927:"Molex Corporation",928:"IVT Wireless Limited",929:"Alpine Labs LLC",930:"Candura Instruments",931:"SmartMovt Technology Co., Ltd",932:"Token Zero Ltd",933:"ACE CAD Enterprise Co., Ltd. (ACECAD)",934:"Medela, Inc",935:"AeroScout",936:"Esrille Inc.",937:"THINKERLY SRL",938:"Exon Sp. z o.o.",939:"Meizu Technology Co., Ltd.",940:"Smablo LTD",941:"XiQ",942:"Allswell Inc.",943:"Comm-N-Sense Corp DBA Verigo",944:"VIBRADORM GmbH",945:"Otodata Wireless Network Inc.",946:"Propagation Systems Limited",947:"Midwest Instruments & Controls",948:"Alpha Nodus, inc.",949:"petPOMM, Inc",950:"Mattel",951:"Airbly Inc.",952:"A-Safe Limited",953:"FREDERIQUE CONSTANT SA",954:"Maxscend Microelectronics Company Limited",955:"Abbott Diabetes Care",956:"ASB Bank Ltd",957:"amadas",958:"Applied Science, Inc.",959:"iLumi Solutions Inc.",960:"Arch Systems Inc.",961:"Ember Technologies, Inc.",962:"Snapchat Inc",963:"Casambi Technologies Oy",964:"Pico Technology Inc.",965:"St. Jude Medical, Inc.",966:"Intricon",967:"Structural Health Systems, Inc.",968:"Avvel International",969:"Gallagher Group",970:"In2things Automation Pvt. Ltd.",971:"SYSDEV Srl",972:"Vonkil Technologies Ltd",973:"Wynd Technologies, Inc.",974:"CONTRINEX S.A.",975:"MIRA, Inc.",976:"Watteam Ltd",977:"Density Inc.",978:"IOT Pot India Private Limited",979:"Sigma Connectivity AB",980:"PEG PEREGO SPA",981:"Wyzelink Systems Inc.",982:"Yota Devices LTD",983:"FINSECUR",984:"Zen-Me Labs Ltd",985:"3IWare Co., Ltd.",986:"EnOcean GmbH",987:"Instabeat, Inc",988:"Nima Labs",989:"Andreas Stihl AG & Co. KG",990:"Nathan Rhoades LLC",991:"Grob Technologies, LLC",992:"Actions (Zhuhai) Technology Co., Limited",993:"SPD Development Company Ltd",994:"Sensoan Oy",995:"Qualcomm Life Inc",996:"Chip-ing AG",997:"ffly4u",998:"IoT Instruments Oy",999:"TRUE Fitness Technology",1000:"Reiner Kartengeraete GmbH & Co. KG.",1001:"SHENZHEN LEMONJOY TECHNOLOGY CO., LTD.",1002:"Hello Inc.",1003:"Evollve Inc.",1004:"Jigowatts Inc.",1005:"BASIC MICRO.COM,INC.",1006:"CUBE TECHNOLOGIES",1007:"foolography GmbH",1008:"CLINK",1009:"Hestan Smart Cooking Inc.",1010:"WindowMaster A/S",1011:"Flowscape AB",1012:"PAL Technologies Ltd",1013:"WHERE, Inc.",1014:"Iton Technology Corp.",1015:"Owl Labs Inc.",1016:"Rockford Corp.",1017:"Becon Technologies Co.,Ltd.",1018:"Vyassoft Technologies Inc",1019:"Nox Medical",1020:"Kimberly-Clark",1021:"Trimble Navigation Ltd.",1022:"Littelfuse",1023:"Withings",1024:"i-developer IT Beratung UG",1026:"Sears Holdings Corporation",1027:"Gantner Electronic GmbH",1028:"Authomate Inc",1029:"Vertex International, Inc.",1030:"Airtago",1031:"Swiss Audio SA",1032:"ToGetHome Inc.",1033:"AXIS",1034:"Openmatics",1035:"Jana Care Inc.",1036:"Senix Corporation",1037:"NorthStar Battery Company, LLC",1038:"SKF (U.K.) Limited",1039:"CO-AX Technology, Inc.",1040:"Fender Musical Instruments",1041:"Luidia Inc",1042:"SEFAM",1043:"Wireless Cables Inc",1044:"Lightning Protection International Pty Ltd",1045:"Uber Technologies Inc",1046:"SODA GmbH",1047:"Fatigue Science",1048:"Alpine Electronics Inc.",1049:"Novalogy LTD",1050:"Friday Labs Limited",1051:"OrthoAccel Technologies",1052:"WaterGuru, Inc.",1053:"Benning Elektrotechnik und Elektronik GmbH & Co. KG",1054:"Dell Computer Corporation",1055:"Kopin Corporation",1056:"TecBakery GmbH",1057:"Backbone Labs, Inc.",1058:"DELSEY SA",1059:"Chargifi Limited",1060:"Trainesense Ltd.",1061:"Unify Software and Solutions GmbH & Co. KG",1062:"Husqvarna AB",1063:"Focus fleet and fuel management inc",1064:"SmallLoop, LLC",1065:"Prolon Inc.",1066:"BD Medical",1067:"iMicroMed Incorporated",1068:"Ticto N.V.",1069:"Meshtech AS",1070:"MemCachier Inc.",1071:"Danfoss A/S",1072:"SnapStyk Inc.",1073:"Amyway Corporation",1074:"Silk Labs, Inc.",1075:"Pillsy Inc.",1076:"Hatch Baby, Inc.",1077:"Blocks Wearables Ltd.",1078:"Drayson Technologies (Europe) Limited",1079:"eBest IOT Inc.",1080:"Helvar Ltd",1081:"Radiance Technologies",1082:"Nuheara Limited",1083:"Appside co., ltd.",1084:"DeLaval",1085:"Coiler Corporation",1086:"Thermomedics, Inc.",1087:"Tentacle Sync GmbH",1088:"Valencell, Inc.",1089:"iProtoXi Oy",1090:"SECOM CO., LTD.",1091:"Tucker International LLC",1092:"Metanate Limited",1093:"Kobian Canada Inc.",1094:"NETGEAR, Inc.",1095:"Fabtronics Australia Pty Ltd",1096:"Grand Centrix GmbH",1097:"1UP USA.com llc",1098:"SHIMANO INC.",1099:"Nain Inc.",1100:"LifeStyle Lock, LLC",1101:"VEGA Grieshaber KG",1102:"Xtrava Inc.",1103:"TTS Tooltechnic Systems AG & Co. KG",1104:"Teenage Engineering AB",1105:"Tunstall Nordic AB",1106:"Svep Design Center AB",1107:"GreenPeak Technologies BV",1108:"Sphinx Electronics GmbH & Co KG",1109:"Atomation",1110:"Nemik Consulting Inc",1111:"RF INNOVATION",1112:"Mini Solution Co., Ltd.",1113:"Lumenetix, Inc",1114:"2048450 Ontario Inc",1115:"SPACEEK LTD",1116:"Delta T Corporation",1117:"Boston Scientific Corporation",1118:"Nuviz, Inc.",1119:"Real Time Automation, Inc.",1120:"Kolibree",1121:"vhf elektronik GmbH",1122:"Bonsai Systems GmbH",1123:"Fathom Systems Inc.",1124:"Bellman & Symfon",1125:"International Forte Group LLC",1126:"CycleLabs Solutions inc.",1127:"Codenex Oy",1128:"Kynesim Ltd",1129:"Palago AB",1130:"INSIGMA INC.",1131:"PMD Solutions",1132:"Qingdao Realtime Technology Co., Ltd.",1133:"BEGA Gantenbrink-Leuchten KG",1134:"Pambor Ltd.",65535:"SPECIAL USE/DEFAULT"}});var require_bluetooth=__commonJS((exports)=>{var exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,path6=__require("path"),util4=require_util3(),bluetoothVendors=require_bluetoothVendors(),fs3=__require("fs"),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";function parseBluetoothType(str5){let result2="";if(str5.indexOf("keyboard")>=0)result2="Keyboard";if(str5.indexOf("mouse")>=0)result2="Mouse";if(str5.indexOf("trackpad")>=0)result2="Trackpad";if(str5.indexOf("audio")>=0)result2="Audio";if(str5.indexOf("sound")>=0)result2="Audio";if(str5.indexOf("microph")>=0)result2="Microphone";if(str5.indexOf("speaker")>=0)result2="Speaker";if(str5.indexOf("headset")>=0)result2="Headset";if(str5.indexOf("phone")>=0)result2="Phone";if(str5.indexOf("macbook")>=0)result2="Computer";if(str5.indexOf("imac")>=0)result2="Computer";if(str5.indexOf("ipad")>=0)result2="Tablet";if(str5.indexOf("watch")>=0)result2="Watch";if(str5.indexOf("headphone")>=0)result2="Headset";return result2}function parseBluetoothManufacturer(str5){let result2=str5.split(" ")[0];if(str5=str5.toLowerCase(),str5.indexOf("apple")>=0)result2="Apple";if(str5.indexOf("ipad")>=0)result2="Apple";if(str5.indexOf("imac")>=0)result2="Apple";if(str5.indexOf("iphone")>=0)result2="Apple";if(str5.indexOf("magic mouse")>=0)result2="Apple";if(str5.indexOf("magic track")>=0)result2="Apple";if(str5.indexOf("macbook")>=0)result2="Apple";return result2}function parseBluetoothVendor(str5){let id=parseInt(str5);if(!isNaN(id))return bluetoothVendors[id]}function parseLinuxBluetoothInfo(lines,macAddr1,macAddr2){let result2={};return result2.device=null,result2.name=util4.getValue(lines,"name","="),result2.manufacturer=null,result2.macDevice=macAddr1,result2.macHost=macAddr2,result2.batteryPercent=null,result2.type=parseBluetoothType(result2.name.toLowerCase()),result2.connected=!1,result2}function parseDarwinBluetoothDevices(bluetoothObject,macAddr2){let result2={},typeStr=((bluetoothObject.device_minorClassOfDevice_string||bluetoothObject.device_majorClassOfDevice_string||bluetoothObject.device_minorType||"")+(bluetoothObject.device_name||"")).toLowerCase();return result2.device=bluetoothObject.device_services||"",result2.name=bluetoothObject.device_name||"",result2.manufacturer=bluetoothObject.device_manufacturer||parseBluetoothVendor(bluetoothObject.device_vendorID)||parseBluetoothManufacturer(bluetoothObject.device_name||"")||"",result2.macDevice=(bluetoothObject.device_addr||bluetoothObject.device_address||"").toLowerCase().replace(/-/g,":"),result2.macHost=macAddr2,result2.batteryPercent=bluetoothObject.device_batteryPercent||null,result2.type=parseBluetoothType(typeStr),result2.connected=bluetoothObject.device_isconnected==="attrib_Yes"||!1,result2}function parseWindowsBluetooth(lines){let result2={};return result2.device=null,result2.name=util4.getValue(lines,"name",":"),result2.manufacturer=util4.getValue(lines,"manufacturer",":"),result2.macDevice=null,result2.macHost=null,result2.batteryPercent=null,result2.type=parseBluetoothType(result2.name.toLowerCase()),result2.connected=null,result2}function bluetoothDevices(callback){return new Promise((resolve23)=>{process.nextTick(()=>{let result2=[];if(_linux){util4.getFilesInPath("/var/lib/bluetooth/").forEach((element)=>{let filename=path6.basename(element),pathParts=element.split("/"),macAddr1=pathParts.length>=6?pathParts[pathParts.length-2]:null,macAddr2=pathParts.length>=7?pathParts[pathParts.length-3]:null;if(filename==="info"){let infoFile=fs3.readFileSync(element,{encoding:"utf8"}).split(`
|
|
4012
4012
|
`);result2.push(parseLinuxBluetoothInfo(infoFile,macAddr1,macAddr2))}});try{let hdicon=execSync18("hcitool con",util4.execOptsLinux).toString().toLowerCase();for(let i2=0;i2<result2.length;i2++)if(result2[i2].macDevice&&result2[i2].macDevice.length>10&&hdicon.indexOf(result2[i2].macDevice.toLowerCase())>=0)result2[i2].connected=!0}catch{util4.noop()}if(callback)callback(result2);resolve23(result2)}if(_darwin)exec3("system_profiler SPBluetoothDataType -json",(error2,stdout)=>{if(!error2)try{let outObj=JSON.parse(stdout.toString());if(outObj.SPBluetoothDataType&&outObj.SPBluetoothDataType.length&&outObj.SPBluetoothDataType[0]&&outObj.SPBluetoothDataType[0].device_title&&outObj.SPBluetoothDataType[0].device_title.length){let macAddr2=null;if(outObj.SPBluetoothDataType[0].local_device_title&&outObj.SPBluetoothDataType[0].local_device_title.general_address)macAddr2=outObj.SPBluetoothDataType[0].local_device_title.general_address.toLowerCase().replace(/-/g,":");outObj.SPBluetoothDataType[0].device_title.forEach((element)=>{let obj=element,objKey=Object.keys(obj);if(objKey&&objKey.length===1){let innerObject=obj[objKey[0]];innerObject.device_name=objKey[0];let bluetoothDevice=parseDarwinBluetoothDevices(innerObject,macAddr2);result2.push(bluetoothDevice)}})}if(outObj.SPBluetoothDataType&&outObj.SPBluetoothDataType.length&&outObj.SPBluetoothDataType[0]&&outObj.SPBluetoothDataType[0].device_connected&&outObj.SPBluetoothDataType[0].device_connected.length){let macAddr2=outObj.SPBluetoothDataType[0].controller_properties&&outObj.SPBluetoothDataType[0].controller_properties.controller_address?outObj.SPBluetoothDataType[0].controller_properties.controller_address.toLowerCase().replace(/-/g,":"):null;outObj.SPBluetoothDataType[0].device_connected.forEach((element)=>{let obj=element,objKey=Object.keys(obj);if(objKey&&objKey.length===1){let innerObject=obj[objKey[0]];innerObject.device_name=objKey[0],innerObject.device_isconnected="attrib_Yes";let bluetoothDevice=parseDarwinBluetoothDevices(innerObject,macAddr2);result2.push(bluetoothDevice)}})}if(outObj.SPBluetoothDataType&&outObj.SPBluetoothDataType.length&&outObj.SPBluetoothDataType[0]&&outObj.SPBluetoothDataType[0].device_not_connected&&outObj.SPBluetoothDataType[0].device_not_connected.length){let macAddr2=outObj.SPBluetoothDataType[0].controller_properties&&outObj.SPBluetoothDataType[0].controller_properties.controller_address?outObj.SPBluetoothDataType[0].controller_properties.controller_address.toLowerCase().replace(/-/g,":"):null;outObj.SPBluetoothDataType[0].device_not_connected.forEach((element)=>{let obj=element,objKey=Object.keys(obj);if(objKey&&objKey.length===1){let innerObject=obj[objKey[0]];innerObject.device_name=objKey[0],innerObject.device_isconnected="attrib_No";let bluetoothDevice=parseDarwinBluetoothDevices(innerObject,macAddr2);result2.push(bluetoothDevice)}})}}catch{util4.noop()}if(callback)callback(result2);resolve23(result2)});if(_windows)util4.powerShell("Get-CimInstance Win32_PNPEntity | select PNPClass, Name, Manufacturer, Status, Service, ConfigManagerErrorCode, Present | fl").then((stdout,error2)=>{if(!error2)stdout.toString().split(/\n\s*\n/).forEach((part)=>{let lines=part.split(`
|
|
4013
|
-
`),service=util4.getValue(lines,"Service",":"),errorCode=util4.getValue(lines,"ConfigManagerErrorCode",":");if(util4.getValue(lines,"PNPClass",":").toLowerCase()==="bluetooth"&&errorCode==="0"&&service==="")result2.push(parseWindowsBluetooth(lines))});if(callback)callback(result2);resolve23(result2)});if(_freebsd||_netbsd||_openbsd||_sunos)resolve23(null)})})}exports.bluetoothDevices=bluetoothDevices});var require_lib5=__commonJS((exports)=>{var lib_version=require_package().version,util4=require_util3(),system=require_system(),osInfo=require_osinfo(),cpu=require_cpu(),memory=require_memory(),battery=require_battery(),graphics=require_graphics(),filesystem=require_filesystem(),network=require_network(),wifi=require_wifi(),processes=require_processes(),users=require_users(),internet=require_internet(),docker=require_docker(),vbox=require_virtualbox(),printer=require_printer(),usb=require_usb(),audio=require_audio(),bluetooth=require_bluetooth(),_platform=process.platform,_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";if(_windows)util4.getCodepage(),util4.getPowershell();function version(){return lib_version}function getStaticData(callback){return new Promise((resolve23)=>{process.nextTick(()=>{let data={};data.version=version(),Promise.all([system.system(),system.bios(),system.baseboard(),system.chassis(),osInfo.osInfo(),osInfo.uuid(),osInfo.versions(),cpu.cpu(),cpu.cpuFlags(),graphics.graphics(),network.networkInterfaces(),memory.memLayout(),filesystem.diskLayout(),audio.audio(),bluetooth.bluetoothDevices(),usb.usb(),printer.printer()]).then((res)=>{if(data.system=res[0],data.bios=res[1],data.baseboard=res[2],data.chassis=res[3],data.os=res[4],data.uuid=res[5],data.versions=res[6],data.cpu=res[7],data.cpu.flags=res[8],data.graphics=res[9],data.net=res[10],data.memLayout=res[11],data.diskLayout=res[12],data.audio=res[13],data.bluetooth=res[14],data.usb=res[15],data.printer=res[16],callback)callback(data);resolve23(data)})})})}function getDynamicData(srv,iface,callback){if(util4.isFunction(iface))callback=iface,iface="";if(util4.isFunction(srv))callback=srv,srv="";return new Promise((resolve23)=>{process.nextTick(()=>{iface=iface||network.getDefaultNetworkInterface(),srv=srv||"";let functionProcessed=(()=>{let totalFunctions=15;if(_windows)totalFunctions=13;if(_freebsd||_openbsd||_netbsd)totalFunctions=11;if(_sunos)totalFunctions=6;return function(){if(--totalFunctions===0){if(callback)callback(data);resolve23(data)}}})(),data={};if(data.time=osInfo.time(),data.node=process.versions.node,data.v8=process.versions.v8,cpu.cpuCurrentSpeed().then((res)=>{data.cpuCurrentSpeed=res,functionProcessed()}),users.users().then((res)=>{data.users=res,functionProcessed()}),processes.processes().then((res)=>{data.processes=res,functionProcessed()}),cpu.currentLoad().then((res)=>{data.currentLoad=res,functionProcessed()}),!_sunos)cpu.cpuTemperature().then((res)=>{data.temp=res,functionProcessed()});if(!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)network.networkStats(iface).then((res)=>{data.networkStats=res,functionProcessed()});if(!_sunos)network.networkConnections().then((res)=>{data.networkConnections=res,functionProcessed()});if(memory.mem().then((res)=>{data.mem=res,functionProcessed()}),!_sunos)battery().then((res)=>{data.battery=res,functionProcessed()});if(!_sunos)processes.services(srv).then((res)=>{data.services=res,functionProcessed()});if(!_sunos)filesystem.fsSize().then((res)=>{data.fsSize=res,functionProcessed()});if(!_windows&&!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)filesystem.fsStats().then((res)=>{data.fsStats=res,functionProcessed()});if(!_windows&&!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)filesystem.disksIO().then((res)=>{data.disksIO=res,functionProcessed()});if(!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)wifi.wifiNetworks().then((res)=>{data.wifiNetworks=res,functionProcessed()});internet.inetLatency().then((res)=>{data.inetLatency=res,functionProcessed()})})})}function getAllData(srv,iface,callback){return new Promise((resolve23)=>{process.nextTick(()=>{let data={};if(iface&&util4.isFunction(iface)&&!callback)callback=iface,iface="";if(srv&&util4.isFunction(srv)&&!iface&&!callback)callback=srv,srv="",iface="";getStaticData().then((res)=>{data=res,getDynamicData(srv,iface).then((res2)=>{for(let key in res2)if({}.hasOwnProperty.call(res2,key))data[key]=res2[key];if(callback)callback(data);resolve23(data)})})})})}function get3(valueObject,callback){return new Promise((resolve23)=>{process.nextTick(()=>{let allPromises=Object.keys(valueObject).filter((func)=>({}).hasOwnProperty.call(exports,func)).map((func)=>{let params=valueObject[func].substring(valueObject[func].lastIndexOf("(")+1,valueObject[func].lastIndexOf(")")),funcWithoutParams=func.indexOf(")")>=0?func.split(")")[1].trim():func;if(funcWithoutParams=func.indexOf("|")>=0?func.split("|")[0].trim():funcWithoutParams,params)return exports[funcWithoutParams](params);else return exports[funcWithoutParams]("")});Promise.all(allPromises).then((data)=>{let result2={},i2=0;for(let key in valueObject)if({}.hasOwnProperty.call(valueObject,key)&&{}.hasOwnProperty.call(exports,key)&&data.length>i2){if(valueObject[key]==="*"||valueObject[key]==="all")result2[key]=data[i2];else{let keys=valueObject[key],filter="",filterParts=[];if(keys.indexOf(")")>=0)keys=keys.split(")")[1].trim();if(keys.indexOf("|")>=0)filter=keys.split("|")[1].trim(),filterParts=filter.split(":"),keys=keys.split("|")[0].trim();if(keys=keys.replace(/,/g," ").replace(/ +/g," ").split(" "),data[i2])if(Array.isArray(data[i2])){let partialArray=[];data[i2].forEach((element)=>{let partialRes={};if(keys.length===1&&(keys[0]==="*"||keys[0]==="all"))partialRes=element;else keys.forEach((k2)=>{if({}.hasOwnProperty.call(element,k2))partialRes[k2]=element[k2]});if(filter&&filterParts.length===2){if({}.hasOwnProperty.call(partialRes,filterParts[0].trim())){let val=partialRes[filterParts[0].trim()];if(typeof val==="number"){if(val===parseFloat(filterParts[1].trim()))partialArray.push(partialRes)}else if(typeof val==="string"){if(val.toLowerCase()===filterParts[1].trim().toLowerCase())partialArray.push(partialRes)}}}else partialArray.push(partialRes)}),result2[key]=partialArray}else{let partialRes={};keys.forEach((k2)=>{if({}.hasOwnProperty.call(data[i2],k2))partialRes[k2]=data[i2][k2]}),result2[key]=partialRes}else result2[key]={}}i2++}if(callback)callback(result2);resolve23(result2)})})})}function observe(valueObject,interval,callback){let _data=null;return setInterval(()=>{get3(valueObject).then((data)=>{if(JSON.stringify(_data)!==JSON.stringify(data))_data=Object.assign({},data),callback(data)})},interval)}exports.version=version;exports.system=system.system;exports.bios=system.bios;exports.baseboard=system.baseboard;exports.chassis=system.chassis;exports.time=osInfo.time;exports.osInfo=osInfo.osInfo;exports.versions=osInfo.versions;exports.shell=osInfo.shell;exports.uuid=osInfo.uuid;exports.cpu=cpu.cpu;exports.cpuFlags=cpu.cpuFlags;exports.cpuCache=cpu.cpuCache;exports.cpuCurrentSpeed=cpu.cpuCurrentSpeed;exports.cpuTemperature=cpu.cpuTemperature;exports.currentLoad=cpu.currentLoad;exports.fullLoad=cpu.fullLoad;exports.mem=memory.mem;exports.memLayout=memory.memLayout;exports.battery=battery;exports.graphics=graphics.graphics;exports.fsSize=filesystem.fsSize;exports.fsOpenFiles=filesystem.fsOpenFiles;exports.blockDevices=filesystem.blockDevices;exports.fsStats=filesystem.fsStats;exports.disksIO=filesystem.disksIO;exports.diskLayout=filesystem.diskLayout;exports.networkInterfaceDefault=network.networkInterfaceDefault;exports.networkGatewayDefault=network.networkGatewayDefault;exports.networkInterfaces=network.networkInterfaces;exports.networkStats=network.networkStats;exports.networkConnections=network.networkConnections;exports.wifiNetworks=wifi.wifiNetworks;exports.wifiInterfaces=wifi.wifiInterfaces;exports.wifiConnections=wifi.wifiConnections;exports.services=processes.services;exports.processes=processes.processes;exports.processLoad=processes.processLoad;exports.users=users.users;exports.inetChecksite=internet.inetChecksite;exports.inetLatency=internet.inetLatency;exports.dockerInfo=docker.dockerInfo;exports.dockerImages=docker.dockerImages;exports.dockerContainers=docker.dockerContainers;exports.dockerContainerStats=docker.dockerContainerStats;exports.dockerContainerProcesses=docker.dockerContainerProcesses;exports.dockerVolumes=docker.dockerVolumes;exports.dockerAll=docker.dockerAll;exports.vboxInfo=vbox.vboxInfo;exports.printer=printer.printer;exports.usb=usb.usb;exports.audio=audio.audio;exports.bluetoothDevices=bluetooth.bluetoothDevices;exports.getStaticData=getStaticData;exports.getDynamicData=getDynamicData;exports.getAllData=getAllData;exports.get=get3;exports.observe=observe;exports.powerShellStart=util4.powerShellStart;exports.powerShellRelease=util4.powerShellRelease});import os4 from"os";function toGB(bytes){return Math.round(bytes/1073741824*10)/10}function bar(percent,width){let p=Math.max(0,Math.min(100,percent)),filled=Math.round(p/100*width);return`[${"=".repeat(filled)}${"-".repeat(width-filled)}]`}function pickColor(percent){if(percent>90)return palette.error;if(percent>70)return palette.warning;return palette.accent}function SystemStatsView({stats:stats2}){if(!stats2)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,backgroundColor:palette.bgRaised,children:import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"genie"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` v${VERSION}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this);let{cpu,ram,swap,load:load3}=stats2,hotStr=cpu.hotCores.map((c)=>`#${c.id} ${c.load}%`).join(" ");return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,backgroundColor:palette.bgRaised,children:[import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"genie"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` v${VERSION}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"CPU "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(cpu.combined),children:`${String(cpu.combined).padStart(3)}% ${bar(cpu.combined,8)}`},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` ${cpu.coreCount}c`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:" hot "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.warning,children:hotStr},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"RAM "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(ram.percent),children:`${ram.usedGB}/${ram.totalGB}G ${bar(ram.percent,8)}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),swap.totalGB>0?import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"SWP "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(swap.percent),children:`${swap.usedGB}/${swap.totalGB}G ${bar(swap.percent,8)}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Load "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(load3.percent),children:`${load3.percent}%`},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` (${load3.busy}/${load3.total} busy)`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function SystemStats(){let[stats2,setStats]=import_react23.useState(null),mountedRef=import_react23.useRef(!0);return import_react23.useEffect(()=>{mountedRef.current=!0;async function refresh(){try{let[cpu,mem]=await Promise.all([import_systeminformation.default.currentLoad(),import_systeminformation.default.mem()]);if(!mountedRef.current)return;let coreCount=os4.cpus().length,avg1=os4.loadavg()[0],sorted=cpu.cpus.map((c,i2)=>({id:i2,load:Math.round(c.load)})).sort((a,b3)=>b3.load-a.load);setStats({cpu:{combined:Math.round(cpu.currentLoad),hotCores:sorted.slice(0,3),coreCount},ram:{usedGB:toGB(mem.active),totalGB:toGB(mem.total),percent:mem.total>0?Math.round(mem.active/mem.total*100):0},swap:{usedGB:toGB(mem.swapused),totalGB:toGB(mem.swaptotal),percent:mem.swaptotal>0?Math.round(mem.swapused/mem.swaptotal*100):0},load:{percent:coreCount>0?Math.round(avg1/coreCount*100):0,busy:Math.round(avg1*10)/10,total:coreCount}})}catch{}}refresh();let timer2=setInterval(refresh,3000);return()=>{mountedRef.current=!1,clearInterval(timer2)}},[]),import_jsx_dev_runtime2.jsxDEV(SystemStatsView,{stats:stats2},void 0,!1,void 0,this)}var import_react23,import_systeminformation;var init_SystemStats=__esm(()=>{init_version();init_theme2();init_jsx_dev_runtime();import_react23=__toESM(require_react_development(),1),import_systeminformation=__toESM(require_lib5(),1)});function validateName(name){if(name.length===0)return null;try{return validateBranchName(name),null}catch(err){return err instanceof Error?err.message:String(err)}}function TeamCreate({availableAgents,workspaceRoot,onConfirm,onCancel}){let[step,setStep]=import_react25.useState("name"),[teamName,setTeamName]=import_react25.useState(""),[selected,setSelected]=import_react25.useState(()=>new Set),[memberCursor,setMemberCursor]=import_react25.useState(0),nameError=import_react25.useMemo(()=>validateName(teamName),[teamName]),nameValid=teamName.length>0&&nameError===null,intent=import_react25.useMemo(()=>({kind:"create-team",name:teamName.length>0?teamName:"TEAM_NAME",repo:workspaceRoot}),[teamName,workspaceRoot]),handleNameChange=import_react25.useCallback((value)=>{setTeamName(value)},[]),advanceFromName=import_react25.useCallback(()=>{if(!nameValid)return;setStep("members")},[nameValid]),toggleMember=import_react25.useCallback((name)=>{setSelected((prev)=>{let next=new Set(prev);if(next.has(name))next.delete(name);else next.add(name);return next})},[]),confirmMembers=import_react25.useCallback(()=>{onConfirm({teamName,members:Array.from(selected)})},[onConfirm,teamName,selected]);return useKeyboard((key)=>{if(step==="name"){handleNameStepKey(key,{onCancel,nameValid,advanceFromName});return}handleMembersStepKey(key,{availableAgents,memberCursor,setStep,setMemberCursor,toggleMember,confirmMembers})}),import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:palette.bgOverlay,children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderColor:palette.borderActive,backgroundColor:palette.bgRaised,paddingX:3,paddingY:1,flexDirection:"column",width:"100%",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"New team"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:step==="name"?" \u2014 step 1 of 2":" \u2014 step 2 of 2"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),step==="name"?import_jsx_dev_runtime2.jsxDEV(NameStep,{value:teamName,onChange:handleNameChange,onSubmit:advanceFromName,errorMessage:nameError},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV(MembersStep,{agents:availableAgents,selected,cursor:memberCursor},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent,hint:step==="name"?"Enter: next \xB7 Esc: cancel":"Space: toggle \xB7 Enter: create \xB7 Esc: back"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}function NameStep({value,onChange,onSubmit,errorMessage}){return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Team name (git-branch-safe):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("input",{value,onInput:onChange,onChange,onSubmit,focused:!0,placeholder:"feat/auth-bug",backgroundColor:palette.bg,textColor:palette.text,placeholderColor:palette.textMuted},void 0,!1,void 0,this),errorMessage!==null?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${errorMessage}`},void 0,!1,void 0,this)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}function MembersStep({agents,selected,cursor}){if(agents.length===0)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"No agents registered"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Members can be hired later via `genie team hire`."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Select members (space to toggle):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:agents.map((name,idx)=>{let isSelected=selected.has(name),isCursor=idx===cursor,tick=isSelected?"[x]":"[ ]",prefix=isCursor?"\u25B6 ":" ";return import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:isCursor?palette.accent:palette.textMuted,children:prefix},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:isSelected?palette.success:palette.textDim,children:tick},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:` ${name}`},void 0,!1,void 0,this)]},name,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function isEnter(key){return key.name==="enter"||key.name==="return"}function handleNameStepKey(key,opts){if(key.name==="escape"){opts.onCancel();return}if(isEnter(key)&&opts.nameValid)opts.advanceFromName()}function handleMembersStepKey(key,opts){if(key.name==="escape"){opts.setStep("name");return}if(opts.availableAgents.length===0){if(isEnter(key))opts.confirmMembers();return}if(key.name==="up"||key.name==="k"){opts.setMemberCursor((prev)=>prev<=0?opts.availableAgents.length-1:prev-1);return}if(key.name==="down"||key.name==="j"){opts.setMemberCursor((prev)=>prev>=opts.availableAgents.length-1?0:prev+1);return}if(key.name==="space"){let name=opts.availableAgents[opts.memberCursor];if(name)opts.toggleMember(name);return}if(isEnter(key))opts.confirmMembers()}var import_react25;var init_TeamCreate=__esm(async()=>{init_team_manager();init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react2();import_react25=__toESM(require_react_development(),1)});function getNodeIcon(node){if(node.type==="agent")return getAgentIcon(node);switch(node.type){case"session":return node.data.attached?"\u25B6":"\u25B8";case"window":return node.data.active?"\u25A0":"\u25A1";case"pane":return getPaneIcon(node);default:return" "}}function getAgentIcon(node){switch(node.workState){case"in_flight":return"\u25C6";case"paused":return"\u25D0";case"done":return"\u2714";case"stuck":return"\u2718";default:break}switch(node.wsAgentState){case"running":return"\u25CF";case"stopped":return"\u25CC";case"error":return"\u2298";case"spawning":return"\u231B";default:return"\u25CC"}}function getPaneIcon(node){if(node.data.isDead)return"\u2718";if(node.agentState==="working")return"\u25CF";if(node.agentState==="idle")return"\u25CB";if(node.agentState==="permission")return"\u26A0";if(node.agentState==="error")return"\u2718";if(node.data.isClaudeLike)return"\u25C6";return"\u25CB"}function getNodeColor(node){if(node.type==="agent")return getAgentColor(node);switch(node.type){case"session":return node.data.attached?palette.success:palette.textDim;case"window":return node.data.active?palette.info:palette.text;case"pane":return getPaneColor(node);default:return palette.text}}function getAgentColor(node){switch(node.workState){case"in_flight":return palette.accentBright;case"paused":return palette.textDim;case"done":return palette.info;case"stuck":return palette.error;default:break}switch(node.wsAgentState){case"running":return palette.success;case"stopped":return palette.text;case"error":return palette.error;case"spawning":return palette.warning;default:return palette.textDim}}function getPaneColor(node){if(node.data.isDead)return palette.error;if(node.agentState==="working")return palette.info;if(node.agentState==="permission")return palette.warning;if(node.agentState==="error")return palette.error;if(node.agentState==="idle")return palette.textDim;if(node.data.isClaudeLike)return palette.info;return palette.textDim}function getAgentSuffix(node){if(node.workState==="stuck")return" [stuck \u2014 press R to retry]";if(node.workState==="paused")return" [paused \u2014 auto-resume off]";if(node.workState==="done")return" [done]";if(node.wsAgentState==="spawning"&&node.activePanes===0)return" [stuck \u2014 press R to retry]";if(node.wsAgentState==="stopped")return" [Enter to start]";let wc=node.data.windowCount;if(wc>1)return` (${wc} windows)`;if(wc===1)return" (1 window)";return""}function getNodeSuffix(node){if(node.type==="agent")return getAgentSuffix(node);if(node.type==="session"||node.type==="pane"){let count=node.activePanes;if(count>0)return` ${icons.agent}${count}`}return""}function getStateColor(state){switch(state){case"working":return palette.info;case"idle":return palette.textDim;case"permission":return palette.warning;case"error":return palette.error;default:return palette.textMuted}}var import_react26,TreeNodeRow;var init_TreeNode=__esm(()=>{init_theme2();init_jsx_dev_runtime();import_react26=__toESM(require_react_development(),1),TreeNodeRow=import_react26.memo(function({node,selected,onSelect,onToggle,onContextMenu}){let indent2=" ".repeat(node.depth),hasChildren=node.children.length>0,expandIcon=hasChildren?node.expanded?icons.expanded:icons.collapsed:" ",icon=getNodeIcon(node),color2=getNodeColor(node),suffix=getNodeSuffix(node),labelColor=selected?palette.accentBright:node.type==="agent"&&node.kind==="subagent"?palette.textDim:palette.text;return import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",backgroundColor:selected?palette.accentDim:void 0,onMouseDown:(event)=>{if(event.button===2&&onContextMenu){onSelect(node.id),onContextMenu(node.id);return}if(onSelect(node.id),hasChildren)onToggle(node.id)},children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[indent2,expandIcon," "]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:color2,children:[icon," "]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:labelColor,children:node.label},void 0,!1,void 0,this),suffix?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:suffix},void 0,!1,void 0,this):null,node.agentState?import_jsx_dev_runtime2.jsxDEV("span",{fg:getStateColor(node.agentState),children:[" ",node.agentState]},void 0,!0,void 0,this):null,process.env.GENIE_TUI_DEBUG==="1"?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:` [${node.type}]`},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)},void 0,!1,void 0,this)})});function useDiagnosticsRefresh(setDiagnostics,setRequestedInitialAgent){import_react28.useEffect(()=>{let active=!0,lastErrorMessage=null,lastErrorLoggedAt=0;async function refresh(){try{let snap=await collectDiagnostics();if(!active)return;setDiagnostics(snap),lastErrorMessage=null;let signaledAgent=consumeInitialAgentSignal();if(signaledAgent)setRequestedInitialAgent(signaledAgent)}catch(err){let message=err instanceof Error?err.message:String(err),now=Date.now();if(message!==lastErrorMessage||now-lastErrorLoggedAt>30000)console.error("TUI: diagnostics failed:",message),lastErrorMessage=message,lastErrorLoggedAt=now}}refresh();let timer2=setInterval(refresh,2000);return()=>{active=!1,clearInterval(timer2)}},[setDiagnostics,setRequestedInitialAgent])}function useSessionTreeBuilder(diagnostics,workspaceRoot,setSessionTree){import_react28.useEffect(()=>{if(!diagnostics)return;let newTree;if(workspaceRoot){let agentNames=scanAgents2(workspaceRoot);newTree=buildWorkspaceTree({agentNames,sessions:diagnostics.sessions,executors:diagnostics.executors,workStates:diagnostics.workStates})}else newTree=buildSessionTree(diagnostics);setSessionTree((prev)=>mergeExpandedState(prev,newTree))},[diagnostics,workspaceRoot,setSessionTree])}function useStableSelection(flatNodes,selectedIndex,setSelectedIndex,selectedNodeId){import_react28.useEffect(()=>{let node=flatNodes[selectedIndex]?.node;if(node)selectedNodeId.current=node.id},[selectedIndex,flatNodes,selectedNodeId]),import_react28.useLayoutEffect(()=>{if(flatNodes.length===0)return;if(selectedIndex>=flatNodes.length){setSelectedIndex(flatNodes.length-1);return}if(!selectedNodeId.current)return;let currentAtIndex=flatNodes[selectedIndex]?.node;if(currentAtIndex&¤tAtIndex.id===selectedNodeId.current)return;let restored=flatNodes.findIndex((n)=>n.node.id===selectedNodeId.current);if(restored>=0)setSelectedIndex(restored)},[flatNodes])}function useInitialAgentSelection(requestedInitialAgent,flatNodes,setSelectedIndex,setRequestedInitialAgent,onTmuxSessionSelect){import_react28.useEffect(()=>{if(!requestedInitialAgent||flatNodes.length===0)return;let idx=flatNodes.findIndex((n)=>n.node.id===`agent:${requestedInitialAgent}`);if(idx<0)return;setSelectedIndex(idx);let node=flatNodes[idx].node;if(node.type==="agent"&&node.wsAgentState!=="running"&&node.wsAgentState!=="spawning")spawnAgent(agentNameFromNode(node),onTmuxSessionSelect);setRequestedInitialAgent(void 0)},[requestedInitialAgent,flatNodes,onTmuxSessionSelect,setSelectedIndex,setRequestedInitialAgent])}function useAutoAttach(flatNodes,selectedIndex,lastTarget,onTmuxSessionSelect){import_react28.useEffect(()=>{let current=flatNodes[selectedIndex]?.node;if(!current)return;let target=getSessionTarget(current);if(!target)return;if(current.type==="agent"&¤t.wsAgentState!=="running")return;let key=`${target.sessionName}:${target.windowIndex??""}`;if(key===lastTarget.current)return;lastTarget.current=key,onTmuxSessionSelect(target.sessionName,target.windowIndex)},[selectedIndex,flatNodes,onTmuxSessionSelect,lastTarget])}function useNavKeyboard(opts){useKeyboard((key)=>{if(opts.keyboardDisabled)return;if(opts.spawnIntoAgent!==null||opts.spawnPickerTarget!==null)return;if(tryOpenTeamCreate(key,{workspaceRoot:opts.workspaceRoot,showTeamCreate:opts.showTeamCreate,contextMenuNodeId:opts.contextMenuNodeId,handleOpenTeamCreate:opts.handleOpenTeamCreate}))return;if(opts.showTeamCreate)return;handleKeyboardInput(key,opts)})}function renderAlertBadge(alertCount){if(alertCount<=0)return null;return import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:[" ","\u25CF ",alertCount," alert",alertCount===1?"":"s"]},void 0,!0,void 0,this)}function countAgents(nodes,predicate){let count=0;for(let n of nodes){if(n.type==="agent"&&predicate(n))count++;if(n.children.length>0)count+=countAgents(n.children,predicate)}return count}function computeNavCounts(workspaceRoot,sessionTree,diagnostics){if(workspaceRoot){let agentCount=countAgents(sessionTree,()=>!0);if(agentCount>0)return{agentCount,runningCount:countAgents(sessionTree,(n)=>n.wsAgentState==="running")}}let paneSum=diagnostics?.sessions.reduce((sum,s2)=>sum+s2.windows.reduce((ws,w2)=>ws+w2.panes.length,0),0)??0;return{agentCount:diagnostics?.sessions.length??0,runningCount:paneSum}}function Nav({onTmuxSessionSelect,onNewAgentWindow,workspaceRoot,initialAgent,keyboardDisabled=!1}){let[diagnostics,setDiagnostics]=import_react28.useState(null),[sessionTree,setSessionTree]=import_react28.useState([]),[selectedIndex,setSelectedIndex]=import_react28.useState(0),[requestedInitialAgent,setRequestedInitialAgent]=import_react28.useState(initialAgent),[contextMenuNodeId,setContextMenuNodeId]=import_react28.useState(null),[spawnIntoAgent,setSpawnIntoAgent]=import_react28.useState(null),[spawnPickerTarget,setSpawnPickerTarget]=import_react28.useState(null),lastTarget=import_react28.useRef(null),selectedNodeId=import_react28.useRef(null);useDiagnosticsRefresh(setDiagnostics,setRequestedInitialAgent),useSessionTreeBuilder(diagnostics,workspaceRoot,setSessionTree);let flatNodes=import_react28.useMemo(()=>flattenTree(sessionTree),[sessionTree]);useStableSelection(flatNodes,selectedIndex,setSelectedIndex,selectedNodeId),useInitialAgentSelection(requestedInitialAgent,flatNodes,setSelectedIndex,setRequestedInitialAgent,onTmuxSessionSelect),useAutoAttach(flatNodes,selectedIndex,lastTarget,onTmuxSessionSelect);let handleSelect=import_react28.useCallback((id)=>{let idx=flatNodes.findIndex((n)=>n.node.id===id);if(idx>=0)setSelectedIndex(idx)},[flatNodes]),handleToggle=import_react28.useCallback((id)=>{setSessionTree((prev)=>toggleNode(prev,id))},[]),handleVerticalNav=import_react28.useCallback((keyName2)=>{let rowCount=flatNodes.length;if(rowCount===0)return;if(keyName2==="up"||keyName2==="k")setSelectedIndex((prev)=>prev===0?rowCount-1:prev-1);else if(keyName2==="down"||keyName2==="j")setSelectedIndex((prev)=>prev>=rowCount-1?0:prev+1)},[flatNodes.length]),handleExpandCollapse=import_react28.useCallback((keyName2)=>{let node=flatNodes[selectedIndex]?.node;if(!node)return;if((keyName2==="right"||keyName2==="l")&&node.children.length>0&&!node.expanded)handleToggle(node.id);else if((keyName2==="left"||keyName2==="h")&&node.expanded)handleToggle(node.id)},[flatNodes,selectedIndex,handleToggle]),handleEnter=import_react28.useCallback(()=>{let node=flatNodes[selectedIndex]?.node;if(!node)return;if(node.type==="agent"){handleEnterAgent(node,onTmuxSessionSelect);return}if(node.children.length>0)handleToggle(node.id);let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex)},[flatNodes,selectedIndex,handleToggle,onTmuxSessionSelect]),handleRetry=import_react28.useCallback(()=>{let node=flatNodes[selectedIndex]?.node;if(!node||node.type!=="agent")return;if(node.wsAgentState!=="spawning"&&node.wsAgentState!=="error")return;(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}spawnAgent(agentNameFromNode(node),onTmuxSessionSelect)})()},[flatNodes,selectedIndex,onTmuxSessionSelect]),handleContextMenu=import_react28.useCallback((nodeId)=>{let flat=flatNodes.find((n)=>n.node.id===nodeId);if(flat&&buildMenuItems(flat.node).length>0)setContextMenuNodeId(nodeId)},[flatNodes]),handleContextMenuAction=import_react28.useCallback((action,payload)=>{let node=flatNodes.find((n)=>n.node.id===contextMenuNodeId)?.node;if(!node)return;if(setContextMenuNodeId(null),action==="spawn-here"){let target=resolveSpawnHereTarget(node);if(target)setSpawnPickerTarget(target);return}dispatchContextMenuAction(action,node,payload,{sessionTree,onTmuxSessionSelect,onNewAgentWindow,openSpawnInto:setSpawnIntoAgent})},[flatNodes,contextMenuNodeId,sessionTree,onTmuxSessionSelect,onNewAgentWindow]),handleSpawnIntoConfirm=import_react28.useCallback((intent)=>{executeSpawnIntent(intent),setSpawnIntoAgent(null)},[]),handleSpawnIntoCancel=import_react28.useCallback(()=>{setSpawnIntoAgent(null)},[]),handleSpawnPickerConfirm=import_react28.useCallback((intent)=>{setSpawnPickerTarget(null),executeSpawnIntent(intent)},[]),handleSpawnPickerCancel=import_react28.useCallback(()=>{setSpawnPickerTarget(null)},[]),_menuDisabled=keyboardDisabled||contextMenuNodeId!==null,{showTeamCreate,handleOpenTeamCreate,handleTeamCreateConfirm,handleTeamCreateCancel}=useTeamCreateControls({workspaceRoot,diagnostics,onTmuxSessionSelect});useNavKeyboard({keyboardDisabled,spawnIntoAgent,spawnPickerTarget,workspaceRoot,showTeamCreate,contextMenuNodeId,handleOpenTeamCreate,flatNodes,selectedIndex,setContextMenuNodeId,handleVerticalNav,handleExpandCollapse,handleEnter,handleRetry,onNewAgentWindow});let{agentCount,runningCount}=computeNavCounts(workspaceRoot,sessionTree,diagnostics),headerLabel=workspaceRoot?"Agents":"Sessions",alertCount=diagnostics?.alertCount??0;return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",width:"100%",height:"100%",backgroundColor:palette.bg,children:[import_jsx_dev_runtime2.jsxDEV("box",{height:1,paddingX:1,backgroundColor:palette.bgRaised,children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:headerLabel},void 0,!1,void 0,this),diagnostics?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[" ",workspaceRoot?`${runningCount}/${agentCount}`:`${agentCount}s ${runningCount}p`]},void 0,!0,void 0,this):null,renderAlertBadge(alertCount)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),diagnostics?import_jsx_dev_runtime2.jsxDEV("scrollbox",{focused:!0,height:"100%",style:{scrollbarOptions:{showArrows:!1,trackOptions:{foregroundColor:palette.scrollThumb,backgroundColor:palette.scrollTrack}}},children:flatNodes.map((flat,i2)=>import_jsx_dev_runtime2.jsxDEV(TreeNodeRow,{node:flat.node,selected:i2===selectedIndex,onSelect:handleSelect,onToggle:handleToggle,onContextMenu:handleContextMenu},flat.node.id,!1,void 0,this))},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("box",{flexGrow:1,justifyContent:"center",alignItems:"center",flexDirection:"column",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("ascii-font",{text:"GENIE",font:"tiny",color:palette.accent},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{fg:palette.textDim,children:"Collecting..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),contextMenuNodeId?import_jsx_dev_runtime2.jsxDEV(ContextMenu,{items:buildMenuItems(flatNodes.find((n)=>n.node.id===contextMenuNodeId)?.node??{}),onAction:handleContextMenuAction,onClose:()=>setContextMenuNodeId(null),positionY:flatNodes.findIndex((n)=>n.node.id===contextMenuNodeId)+1},void 0,!1,void 0,this):null,spawnIntoAgent!==null?import_jsx_dev_runtime2.jsxDEV(SpawnTargetPicker,{agentName:spawnIntoAgent,sessions:diagnostics?.sessions??[],onConfirm:handleSpawnIntoConfirm,onCancel:handleSpawnIntoCancel},void 0,!1,void 0,this):null,spawnPickerTarget!==null?import_jsx_dev_runtime2.jsxDEV(AgentPicker,{target:spawnPickerTarget,onConfirm:handleSpawnPickerConfirm,onCancel:handleSpawnPickerCancel},void 0,!1,void 0,this):null,showTeamCreate?import_jsx_dev_runtime2.jsxDEV(TeamCreate,{availableAgents:workspaceRoot?scanAgents2(workspaceRoot):[],workspaceRoot,onConfirm:handleTeamCreateConfirm,onCancel:handleTeamCreateCancel},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV(SystemStats,{},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,paddingX:1,backgroundColor:palette.bgRaised,children:import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:buildFooterHint(workspaceRoot)},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function useTeamCreateControls(opts){let{workspaceRoot,diagnostics,onTmuxSessionSelect}=opts,[showTeamCreate,setShowTeamCreate]=import_react28.useState(!1),pendingTeamNameRef=import_react28.useRef(null),handleOpenTeamCreate=import_react28.useCallback(()=>{if(!workspaceRoot)return;setShowTeamCreate(!0)},[workspaceRoot]),handleTeamCreateConfirm=import_react28.useCallback((result2)=>{setShowTeamCreate(!1),runTeamCreation(result2,workspaceRoot),pendingTeamNameRef.current=result2.teamName},[workspaceRoot]),handleTeamCreateCancel=import_react28.useCallback(()=>{setShowTeamCreate(!1)},[]);return import_react28.useEffect(()=>{let pending=pendingTeamNameRef.current;if(!pending||!diagnostics)return;let session=diagnostics.sessions.find((s2)=>s2.name===pending);if(!session)return;pendingTeamNameRef.current=null,onTmuxSessionSelect(session.name,resolvePreferredWindowIndex(session,pending))},[diagnostics,onTmuxSessionSelect]),{showTeamCreate,handleOpenTeamCreate,handleTeamCreateConfirm,handleTeamCreateCancel}}function handleEnterAgent(node,onTmuxSessionSelect,spawn5=spawnAgent){if(node.wsAgentState!=="running"&&node.wsAgentState!=="spawning")spawn5(agentNameFromNode(node),onTmuxSessionSelect);else if(node.wsAgentState==="running"){let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex)}}function dispatchContextMenuAction(action,node,payload,deps){let name=node.label;if(action==="spawn-into"&&node.type==="agent"&&deps.openSpawnInto){deps.openSpawnInto(agentNameFromNode(node));return}if(handleAttachAction(action,node,deps.onTmuxSessionSelect))return;if(handleRetryAction(action,name,deps.onTmuxSessionSelect))return;if(handleGenieAction(action,name,payload))return;let tmuxServer=process.env.GENIE_TMUX_SERVER||"genie";if(handleRenameAction(action,node,tmuxServer,payload))return;if(handleAgentWindowActions(action,node,name,tmuxServer,deps.onNewAgentWindow))return;if(handleSessionNodeActions(action,node,tmuxServer,payload))return;if(handleWindowNodeActions(action,node,deps.sessionTree,tmuxServer,payload))return;handlePaneNodeActions(action,node,deps.sessionTree,tmuxServer,deps.onNewAgentWindow)}function handleAttachAction(action,node,onTmuxSessionSelect){if(action!=="attach")return!1;let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex);return!0}function handleRetryAction(action,name,onTmuxSessionSelect){if(action!=="retry")return!1;return(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}spawnAgent(name,onTmuxSessionSelect)})(),!0}function handleGenieAction(action,name,payload){if(action==="send"&&payload)return executeGenie(["agent","send",payload,"--to",name]),!0;if(action==="answer-text"&&payload)return executeGenie(["agent","answer",name,`text:${payload}`]),!0;let genieArgs={spawn:["spawn",name],"spawn-plan":["spawn",name,"--plan-mode"],stop:["agent","stop",name],kill:["agent","kill",name],log:["agent","log",name],show:["agent","show",name],read:["read",name],"answer-yes":["agent","answer",name,"yes"],"answer-no":["agent","answer",name,"no"]}[action];if(genieArgs)return executeGenie(genieArgs),!0;return!1}function handleRenameAction(action,node,tmuxServer,payload){if(action==="rename-session"&&payload){let sess=node.type==="agent"?node.data.sessionName||node.label:node.id.split(":").slice(1).join(":");return executeTmux3(["-L",tmuxServer,"rename-session","-t",sess,payload]),!0}if(action==="rename-window"&&payload){let idParts=node.id.split(":"),windowTarget=`${idParts[1]}:${idParts[2]}`;return executeTmux3(["-L",tmuxServer,"rename-window","-t",windowTarget,payload]),!0}if(action==="rename-pane"&&payload&&node.type==="pane"){let paneId=node.data.paneId;return executeTmux3(["-L",tmuxServer,"select-pane","-t",`${paneId}`,"-T",payload]),!0}return!1}function handleAgentWindowActions(action,node,name,tmuxServer,onNewAgentWindow){if(action==="agent-new-window"&&node.type==="agent"){if(onNewAgentWindow)onNewAgentWindow(agentNameFromNode(node));return!0}if(action==="new-empty-window"&&node.type==="agent"){let sessionName=node.data.sessionName||name;return executeTmux3(["-L",tmuxServer,"new-window","-a","-t",sessionName]),!0}return!1}function handleSessionNodeActions(action,node,tmuxServer,payload){if(node.type!=="session")return!1;let sess=node.id.split(":").slice(1).join(":");if(action==="kill-session")return executeTmux3(["-L",tmuxServer,"kill-session","-t",sess]),!0;if(action==="new-window")return executeTmux3(["-L",tmuxServer,"new-window","-a","-t",sess]),!0;if(action==="clone-session")return executeTmux3(["-L",tmuxServer,"new-session","-d","-s",`${sess}-clone`,"-t",sess]),!0;if(action==="spawn-in-session"&&payload)return executeGenie(["spawn",payload,"--session",sess]),!0;return!1}function handleWindowNodeActions(action,node,sessionTree,tmuxServer,payload){if(node.type!=="window")return!1;let idParts=node.id.split(":"),windowTarget=`${idParts[1]}:${idParts[2]}`;if(action==="kill-window")return executeTmux3(["-L",tmuxServer,"kill-window","-t",windowTarget]),!0;if(action==="window-new-agent"){let parentAgent=findParentAgent(sessionTree,node.id);if(parentAgent){let agentFullName=agentNameFromNode(parentAgent),suffix=Date.now()%1e4,role=`${agentFullName}-${suffix}`;executeGenie(["spawn",agentFullName,"--role",role,"--window",windowTarget])}return!0}if(action==="split-pane")return executeTmux3(["-L",tmuxServer,"split-window","-t",windowTarget]),!0;if(action==="spawn-in-window"&&payload)return executeGenie(["spawn",payload,"--session",idParts[1]]),!0;return!1}function handlePaneNodeActions(action,node,sessionTree,tmuxServer,onNewAgentWindow){if(node.type!=="pane")return!1;let paneId=node.data.paneId;if(action==="clone-agent"){let parentAgent=findParentAgent(sessionTree,node.id);if(parentAgent&&onNewAgentWindow)onNewAgentWindow(agentNameFromNode(parentAgent));return!0}if(action==="kill-pane")return executeTmux3(["-L",tmuxServer,"kill-pane","-t",`${paneId}`]),!0;if(action==="split-h")return executeTmux3(["-L",tmuxServer,"split-window","-h","-t",`${paneId}`]),!0;if(action==="split-v")return executeTmux3(["-L",tmuxServer,"split-window","-v","-t",`${paneId}`]),!0;return!1}function buildFooterHint(workspaceRoot){return`\u2191\u2193:nav \u2190\u2192:expand Enter:${workspaceRoot?"spawn/attach":"attach"} ^T:new${workspaceRoot?" ^N:team":""} R:retry .:menu`}function tryOpenTeamCreate(key,opts){if(!key.ctrl||key.name!=="n")return!1;if(!opts.workspaceRoot||opts.showTeamCreate||opts.contextMenuNodeId)return!1;return opts.handleOpenTeamCreate(),!0}function tryOpenContextMenu(flatNodes,selectedIndex,setContextMenuNodeId){let node=flatNodes[selectedIndex]?.node;if(node&&buildMenuItems(node).length>0)return setContextMenuNodeId(node.id),!0;return!1}function dispatchNavKey(key,handlers,agentAction){let n=key.name;if(n==="up"||n==="k"||n==="down"||n==="j")handlers.handleVerticalNav(n);else if(n==="right"||n==="l"||n==="left"||n==="h")handlers.handleExpandCollapse(n);else if(n==="enter"||n==="return")handlers.handleEnter();else if(n==="r")handlers.handleRetry();else if(key.ctrl&&n==="t")agentAction()}function handleKeyboardInput(key,opts){if(key.name==="."&&!opts.contextMenuNodeId){if(tryOpenContextMenu(opts.flatNodes,opts.selectedIndex,opts.setContextMenuNodeId))return}if(opts.contextMenuNodeId)return;dispatchNavKey(key,opts,()=>{let node=opts.flatNodes[opts.selectedIndex]?.node;if(node?.type==="agent"&&node.wsAgentState==="running"&&opts.onNewAgentWindow)opts.onNewAgentWindow(agentNameFromNode(node))})}function agentNameFromNode(node){return node.id.replace(/^agent:/,"")}function spawnAgent(name,onTmuxSessionSelect){try{let{spawn:spawn5}=__require("child_process"),{join:join94,resolve:resolve23}=__require("path"),{existsSync:existsSync77,mkdirSync:mkdirSync35,openSync:openSync6}=__require("fs"),{homedir:homedir52}=__require("os"),bunPath=process.execPath||"bun",genieBin=process.argv[1],wsRoot=process.env.GENIE_TUI_WORKSPACE,sessionName=name.replace(/\//g,"-"),cwd;if(wsRoot){let parentName=name.includes("/")?name.slice(0,name.indexOf("/")):name,agentDir=resolve23(join94(wsRoot,"agents",parentName));if(existsSync77(agentDir))cwd=agentDir}let{GENIE_TUI_PANE:_a,GENIE_TUI_RIGHT:_b,GENIE_TUI_WORKSPACE:_c,GENIE_IS_DAEMON:_d,...cleanEnv}=process.env,logDir=join94(homedir52(),".genie","logs","tui-spawn");try{mkdirSync35(logDir,{recursive:!0})}catch{}let logPath=join94(logDir,`${sessionName}-${Date.now()}.log`),logFd;try{logFd=openSync6(logPath,"a")}catch{logFd=void 0}let spawnOpts=logFd!==void 0?{detached:!0,stdio:["ignore",logFd,logFd],cwd,env:cleanEnv}:{detached:!0,stdio:"ignore",cwd,env:cleanEnv},child=genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,"spawn",name,"--session",sessionName,"--new-window"],spawnOpts):spawn5("genie",["spawn",name,"--session",sessionName,"--new-window"],spawnOpts);if(child.on("exit",(code)=>{if(code&&code!==0)console.error(`TUI: spawn "${name}" exited ${code}. See ${logPath}`)}),child.on("error",(err)=>{console.error(`TUI: spawn "${name}" error: ${err.message}. See ${logPath}`)}),child.unref(),onTmuxSessionSelect)attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect)}catch(err){console.error(`TUI: spawn failed for ${name}:`,err instanceof Error?err.message:err)}}function attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect,attempt=0){(async()=>{try{let session=(await collectDiagnostics()).sessions.find((candidate)=>candidate.name===sessionName);if(session){let windowIndex=resolvePreferredWindowIndex(session,sessionName);if(windowIndex!==void 0){onTmuxSessionSelect(sessionName,windowIndex);return}}}catch{}if(attempt>=40){onTmuxSessionSelect(sessionName);return}setTimeout(()=>{attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect,attempt+1)},250)})()}function executeTmux3(args){try{let{spawn:spawn5}=__require("child_process");spawn5("tmux",args,{detached:!0,stdio:"ignore"}).unref()}catch{}}function executeGenie(args){try{let{spawn:spawn5}=__require("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1];(genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{detached:!0,stdio:"ignore"}):spawn5("genie",args,{detached:!0,stdio:"ignore"})).unref()}catch{}}function executeGenieAwaited(args){return new Promise((resolve23,reject)=>{try{let{spawn:spawn5}=__require("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1],child=genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{stdio:"ignore"}):spawn5("genie",args,{stdio:"ignore"});child.on("exit",(code)=>resolve23(code)),child.on("error",reject)}catch(err){reject(err instanceof Error?err:Error(String(err)))}})}function resolveSpawnHereTarget(node){if(node.type==="session"){let sess=node.id.split(":").slice(1).join(":");if(sess.length===0)return null;return{session:sess}}if(node.type==="window"){let idParts=node.id.split(":");if(idParts.length<3)return null;return{session:idParts[1],window:`${idParts[1]}:${idParts[2]}`}}return null}function executeSpawnIntent(intent){try{let{argv}=buildSpawnInvocation(intent);executeGenie(argv)}catch(err){console.error("TUI: spawn-intent execution failed:",err instanceof Error?err.message:err)}}async function runTeamCreation(result2,workspaceRoot){let argv;try{({argv}=buildSpawnInvocation({kind:"create-team",name:result2.teamName,repo:workspaceRoot}))}catch(err){console.error("TUI: team create intent build failed:",err instanceof Error?err.message:err);return}let createExit=null;try{createExit=await executeGenieAwaited(argv)}catch(err){console.error("TUI: team create spawn failed:",err instanceof Error?err.message:err);return}if(createExit!==0){console.error(`TUI: team create exited ${createExit} \u2014 skipping member hires for "${result2.teamName}"`);return}for(let member of result2.members)try{let code=await executeGenieAwaited(["team","hire",member,"--team",result2.teamName]);if(code!==0)console.error(`TUI: team hire "${member}" exited ${code} \u2014 continuing with remaining members`)}catch(err){console.error(`TUI: team hire "${member}" failed:`,err instanceof Error?err.message:err)}}function findParentAgent(tree,targetId){for(let node of tree){if(node.type==="agent"&&containsNode(node,targetId))return node;let found=findParentAgent(node.children,targetId);if(found)return found}return null}function containsNode(node,targetId){if(node.id===targetId)return!0;return node.children.some((c)=>containsNode(c,targetId))}function mergeExpandedState(oldTree,newTree){if(oldTree.length===0)return newTree;let oldState=new Map;function collect(nodes){for(let n of nodes)oldState.set(n.id,{expanded:n.expanded,childCount:n.children.length}),collect(n.children)}collect(oldTree);function apply(nodes){return nodes.map((n)=>({...n,expanded:(()=>{let previous=oldState.get(n.id);if(!previous)return n.expanded;if(previous.childCount===0&&n.children.length>0)return n.expanded;return previous.expanded})(),children:apply(n.children)}))}return apply(newTree)}var import_react28;var init_Nav=__esm(async()=>{init_spawn_invocation();init_workspace();init_diagnostics();init_initial_agent();init_session_tree();init_theme2();init_SystemStats();init_TreeNode();init_jsx_dev_runtime();await __promiseAll([init_react2(),init_AgentPicker(),init_ContextMenu(),init_SpawnTargetPicker(),init_TeamCreate()]);import_react28=__toESM(require_react_development(),1)});function QuitDialog({onConfirm,onCancel}){return useKeyboard((key)=>{if(key.name==="enter"||key.name==="return"||key.name==="y")onConfirm();else if(key.name==="escape"||key.name==="n")onCancel()}),import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:palette.bgOverlay,children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderColor:palette.borderActive,backgroundColor:palette.bgRaised,paddingX:3,paddingY:1,flexDirection:"column",alignItems:"center",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"Close TUI?"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:"Enter"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:" to close "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:" | "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:" Esc"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:" to cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Daemon keeps running. `genie serve stop` to shut down."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var init_QuitDialog=__esm(async()=>{init_theme2();init_jsx_dev_runtime();await init_react2()});import{execSync as execSync18}from"child_process";function App({rightPane,workspaceRoot,initialAgent}){let renderer=useRenderer(),[showQuit,setShowQuit]=import_react32.useState(!1),[showHelp,setShowHelp]=import_react32.useState(!1),[activeSession,setActiveSession]=import_react32.useState(null);import_react32.useEffect(()=>{let title=activeSession?`${BASE_TERMINAL_TITLE} \u2014 ${activeSession}`:BASE_TERMINAL_TITLE;try{renderer.setTerminalTitle(title)}catch{}},[renderer,activeSession]);let handleQuit=import_react32.useCallback(()=>{try{execSync18("tmux -L genie-tui kill-server",{stdio:"ignore"})}catch{}},[]);useBindings(()=>({commands:[{name:"app.quit",title:"Close TUI",desc:"Close TUI window (daemon keeps running \u2014 use `genie serve stop` to shut down)",category:"app",run(){if(showQuit)handleQuit();else setShowQuit(!0)}},{name:"app.help.toggle",title:"Toggle help overlay",desc:"Show/hide the keyboard shortcut overlay",category:"app",run(){setShowHelp((prev)=>!prev)}},{name:"app.console.toggle",title:"Toggle console overlay",desc:"Show/hide the OpenTUI console (logs)",category:"app",run(){renderer.console.toggle()}}],bindings:[{key:"ctrl+q",cmd:"app.quit"},{key:"f1",cmd:"app.help.toggle"},{key:"`",cmd:"app.console.toggle"}]}),[renderer,showQuit,handleQuit]);let handleTmuxSessionSelect=import_react32.useCallback((sessionName,windowIndex)=>{if(setActiveSession(sessionName),!rightPane)return;attachProjectWindow(rightPane,sessionName,windowIndex)},[rightPane]);return import_jsx_dev_runtime2.jsxDEV("box",{width:"100%",height:"100%",children:[import_jsx_dev_runtime2.jsxDEV(Nav,{onTmuxSessionSelect:handleTmuxSessionSelect,onNewAgentWindow:newAgentWindow,workspaceRoot,initialAgent,keyboardDisabled:showQuit||showHelp},void 0,!1,void 0,this),showHelp?import_jsx_dev_runtime2.jsxDEV(HelpOverlay,{onClose:()=>setShowHelp(!1)},void 0,!1,void 0,this):null,showQuit?import_jsx_dev_runtime2.jsxDEV(QuitDialog,{onConfirm:handleQuit,onCancel:()=>setShowQuit(!1)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}var import_react32,BASE_TERMINAL_TITLE="genie tui";var init_app=__esm(async()=>{init_react();init_tmux2();init_jsx_dev_runtime();await __promiseAll([init_react2(),init_HelpOverlay(),init_Nav(),init_QuitDialog()]);import_react32=__toESM(require_react_development(),1)});function getFocusedTargetIfAvailable(host){if(host.isDestroyed)return null;return host.getFocusedTarget()}function forEachActivationTarget(host,focused,visit){let current=focused??host.rootTarget,isFocusedTarget=focused!==null;while(current){if(visit(current,isFocusedTarget)===!1)return;current=host.getParentTarget(current),isFocusedTarget=!1}}function getActivationPath(host,focused){let path6=new Set;return forEachActivationTarget(host,focused,(current)=>{path6.add(current)}),path6}function getActiveLayersForFocused(state,host,focused){if(state.activeLayersCacheVersion===state.activeLayersVersion&&state.activeLayersCacheFocused===focused)return state.activeLayersCache;let activeLayers=[],activationPath=getActivationPath(host,focused);for(let layer of state.sortedLayers)if(isLayerActiveForFocused(host,layer,focused,activationPath))activeLayers.push(layer);return state.activeLayersCacheVersion=state.activeLayersVersion,state.activeLayersCacheFocused=focused,state.activeLayersCache=activeLayers,activeLayers}function invalidateCachedActiveLayers(state){state.activeLayersCacheVersion=-1,state.activeLayersCacheFocused=void 0,state.activeLayersCache=[]}function isLayerActiveForFocused(host,layer,focused,activationPath=getActivationPath(host,focused)){let target=layer.target;if(!target)return!0;if(host.isTargetDestroyed(target))return!1;if(layer.targetMode==="focus")return target===focused;return activationPath.has(target)}function normalizeBindingTokenName(token){let normalized=token.trim().toLowerCase();if(!normalized)throw Error("Invalid keymap token: token cannot be empty");return normalized}function normalizeKeyName(name){let normalized=name.trim().toLowerCase();if(!normalized)throw Error("Invalid key name: key name cannot be empty");return normalized}function normalizeKeyStroke(input){return{name:normalizeKeyName(input.name),ctrl:input.ctrl??!1,shift:input.shift??!1,meta:input.meta??!1,super:input.super??!1,hyper:input.hyper||void 0}}function cloneKeyStroke(stroke){return{name:stroke.name,ctrl:stroke.ctrl,shift:stroke.shift,meta:stroke.meta,super:stroke.super,hyper:stroke.hyper||void 0}}function createKeySequencePart(input,options){let stroke=cloneKeyStroke(normalizeKeyStroke(input));return{stroke,display:options?.display??stringifyCanonicalStroke(stroke),match:options?.match??createKeyMatch(stroke),tokenName:options?.tokenName?normalizeBindingTokenName(options.tokenName):void 0}}function cloneKeySequencePart(part){return{stroke:cloneKeyStroke(part.stroke),display:part.display,match:part.match,tokenName:part.tokenName}}function cloneKeySequence(parts){return parts.map((part)=>cloneKeySequencePart(part))}function resolveKeyMatch(input){if("match"in input)return input.match;if("stroke"in input)return createKeyMatch(input.stroke);return createKeyMatch(input)}function createKeyMatch(input){return`key:${buildKeyMatchId(normalizeKeyStroke(input))}`}function createTextKeyMatch(id){let normalized=id.trim();if(!normalized)throw Error("Invalid keymap match id: id cannot be empty");return`text:${normalized}`}function stringifyKeyStroke(input,options){if("stroke"in input){if(options?.preferDisplay&&input.display)return input.display;return stringifyCanonicalStroke(input.stroke)}return stringifyCanonicalStroke(normalizeKeyStroke(input))}function stringifyKeySequence(input,options){return input.map((part)=>stringifyKeyStroke(part,options)).join("")}function stringifyCanonicalStroke(stroke){let parts=[];if(stroke.ctrl)parts.push("ctrl");if(stroke.shift)parts.push("shift");if(stroke.meta)parts.push("meta");if(stroke.super)parts.push("super");if(stroke.hyper)parts.push("hyper");return parts.push(stroke.name==="return"?"enter":stroke.name),parts.join("+")}function buildKeyMatchId(stroke){return`${stroke.name}:${stroke.ctrl?1:0}:${stroke.shift?1:0}:${stroke.meta?1:0}:${stroke.super?1:0}:${stroke.hyper?1:0}`}function getLiveHost(host){if(host.isDestroyed)throw Error("Cannot use a keymap after its host was destroyed");return host}function isSamePendingSequence(current,next){if(current===next)return!0;if(!current||!next)return!1;if(current.captures.length!==next.captures.length)return!1;for(let index=0;index<current.captures.length;index+=1){let left=current.captures[index],right=next.captures[index];if(!left||!right||left.layer!==right.layer||left.node!==right.node)return!1}return!0}class ActivationService{state;host;hooks;notify;conditions;catalog;options;constructor(state,host,hooks,notify,conditions,catalog,options={}){this.state=state,this.host=host,this.hooks=hooks,this.notify=notify,this.conditions=conditions,this.catalog=catalog,this.options=options}getFocusedTarget(){return getLiveHost(this.host).getFocusedTarget()}getFocusedTargetIfAvailable(){return getFocusedTargetIfAvailable(this.host)}setPendingSequence(next){let previous=this.state.projection.pendingSequence;if(isSamePendingSequence(previous,next))return;this.state.projection.pendingSequence=next,this.options.onPendingSequenceChanged?.(previous,next),this.invalidateCaches(),this.notifyPendingSequenceChange(),this.notify.queueStateChange()}ensureValidPendingSequence(){let pending=this.state.projection.pendingSequence;if(!pending)return;let focused=this.getFocusedTarget(),captures=pending.captures.filter((capture2)=>{return this.state.layers.layers.has(capture2.layer)&&this.isLayerActiveForFocused(capture2.layer,focused)&&this.conditions.layerMatchesRuntimeState(capture2.layer)&&this.nodeHasReachableBindings(capture2.node,focused)});if(captures.length===0){this.setPendingSequence(null);return}if(captures.length!==pending.captures.length)this.setPendingSequence({captures});return this.state.projection.pendingSequence??void 0}revalidatePendingSequenceIfNeeded(){if(this.host.isDestroyed||!this.state.projection.pendingSequence)return;this.ensureValidPendingSequence()}hasPendingSequenceState(){return!this.host.isDestroyed&&this.state.projection.pendingSequence!==null}getPendingSequence(){let projections=this.state.projection,derivedStateVersion=this.state.notify.derivedStateVersion;if(projections.pendingSequenceCacheVersion===derivedStateVersion)return projections.pendingSequenceCache;let pending=this.ensureValidPendingSequence(),canUseCache=!pending||pending.captures.every((capture2)=>this.layerCanCacheActiveKeys(capture2.layer)),sequence=pending?this.collectSequencePartsFromPending(pending):[];if(canUseCache)projections.pendingSequenceCacheVersion=derivedStateVersion,projections.pendingSequenceCache=sequence;return sequence}popPendingSequence(){let pending=this.ensureValidPendingSequence();if(!pending)return!1;let firstCapture=pending.captures[0];if(!firstCapture||firstCapture.node.depth<=1)return this.setPendingSequence(null),!0;let nextCaptures=[];for(let capture2 of pending.captures){let parent=capture2.node.parent;if(!parent||!parent.stroke)continue;nextCaptures.push({layer:capture2.layer,node:parent})}if(nextCaptures.length===0)return this.setPendingSequence(null),!0;return this.setPendingSequence({captures:nextCaptures}),!0}getActiveKeys(options){let projections=this.state.projection,derivedStateVersion=this.state.notify.derivedStateVersion,includeBindings=options?.includeBindings===!0,includeMetadata=options?.includeMetadata===!0;if(includeBindings){if(includeMetadata){if(projections.activeKeysBindingsAndMetadataCacheVersion===derivedStateVersion)return projections.activeKeysBindingsAndMetadataCache}else if(projections.activeKeysBindingsCacheVersion===derivedStateVersion)return projections.activeKeysBindingsCache}else if(includeMetadata){if(projections.activeKeysMetadataCacheVersion===derivedStateVersion)return projections.activeKeysMetadataCache}else if(projections.activeKeysPlainCacheVersion===derivedStateVersion)return projections.activeKeysPlainCache;let focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused),pending=this.ensureValidPendingSequence(),activeLayers=pending?[]:this.getActiveLayers(focused),canUseCache=pending?pending.captures.every((capture2)=>this.layerCanCacheActiveKeys(capture2.layer)):this.activeLayersCanCacheActiveKeys(activeLayers),activeKeys=pending?this.collectActiveKeysFromPending(pending.captures,includeBindings,includeMetadata,focused,activeView):this.collectActiveKeysAtRoot(activeLayers,includeBindings,includeMetadata,focused,activeView);if(!canUseCache)return activeKeys;if(includeBindings)if(includeMetadata)projections.activeKeysBindingsAndMetadataCacheVersion=derivedStateVersion,projections.activeKeysBindingsAndMetadataCache=activeKeys;else projections.activeKeysBindingsCacheVersion=derivedStateVersion,projections.activeKeysBindingsCache=activeKeys;else if(includeMetadata)projections.activeKeysMetadataCacheVersion=derivedStateVersion,projections.activeKeysMetadataCache=activeKeys;else projections.activeKeysPlainCacheVersion=derivedStateVersion,projections.activeKeysPlainCache=activeKeys;return activeKeys}getActiveKeysForCaptures(captures,options){let includeBindings=options?.includeBindings===!0,includeMetadata=options?.includeMetadata===!0,focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused);return this.collectActiveKeysFromPending(captures,includeBindings,includeMetadata,focused,activeView)}nodeHasReachableBindings(node,focused){return this.hasMatchingBindings(node.reachableBindings,focused,this.catalog.getActiveCommandView(focused))}getActiveLayers(focused){return getActiveLayersForFocused(this.state.layers,this.host,focused)}refreshActiveLayers(focused=this.getFocusedTargetIfAvailable()){getActiveLayersForFocused(this.state.layers,this.host,focused)}invalidateActiveLayers(){invalidateCachedActiveLayers(this.state.layers)}isLayerActiveForFocused(layer,focused){return isLayerActiveForFocused(this.host,layer,focused)}layerCanCacheActiveKeys(layer){return!layer.hasUnkeyedMatchers&&!layer.hasUnkeyedCommands&&!layer.hasUnkeyedBindings}activeLayersCanCacheActiveKeys(activeLayers){for(let layer of activeLayers)if(!this.layerCanCacheActiveKeys(layer))return!1;return!0}collectNodesFromNode(node){let nodes=[],current=node;while(current&¤t.stroke)nodes.push(current),current=current.parent;return nodes.reverse(),nodes}collectSequencePartsFromPending(pending){let focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused),paths=pending.captures.map((capture2)=>this.collectNodesFromNode(capture2.node)),firstPath=paths[0];if(!firstPath||firstPath.length===0)return[];let parts=[];for(let index=0;index<firstPath.length;index+=1){let firstNode=firstPath[index];if(!firstNode?.stroke||firstNode.match===null)continue;let display,tokenName,hasDisplayConflict=!1,hasTokenConflict=!1;for(let path6 of paths){let node=path6[index];if(!node)continue;let presentation=this.getNodePresentation(node,focused,activeView);if(display===void 0){display=presentation.display,tokenName=presentation.tokenName;continue}if(!hasDisplayConflict&&display!==presentation.display)hasDisplayConflict=!0;if(!hasTokenConflict&&tokenName!==presentation.tokenName)hasTokenConflict=!0}if(display===void 0||hasDisplayConflict)display=stringifyKeyStroke(firstNode.stroke);if(hasTokenConflict)tokenName=void 0;parts.push(createKeySequencePart(firstNode.stroke,{display,match:firstNode.match,tokenName}))}return parts}collectMatchingBindings(bindings,focused,activeView){let matches=[];for(let binding of bindings)if(this.conditions.matchesConditions(binding)&&this.catalog.isBindingVisible(binding,focused,activeView))matches.push(binding);return matches}hasMatchingBindings(bindings,focused,activeView){for(let binding of bindings)if(this.conditions.matchesConditions(binding)&&this.catalog.isBindingVisible(binding,focused,activeView))return!0;return!1}getNodePresentation(node,focused,activeView,reachableBindings=this.collectMatchingBindings(node.reachableBindings,focused,activeView)){if(!node.stroke)return{display:""};let partIndex=node.depth-1,display,tokenName,hasDisplayConflict=!1,hasTokenConflict=!1;for(let binding of reachableBindings){let part=binding.sequence[partIndex];if(!part)continue;if(display===void 0){display=part.display,tokenName=part.tokenName;continue}if(!hasDisplayConflict&&display!==part.display)hasDisplayConflict=!0;if(!hasTokenConflict&&tokenName!==part.tokenName)hasTokenConflict=!0}if(display===void 0||hasDisplayConflict)display=stringifyKeyStroke(node.stroke);if(hasTokenConflict)tokenName=void 0;return{display,tokenName}}toActiveBinding(binding,focused,activeView){return{sequence:binding.sequence,command:binding.command,commandAttrs:this.catalog.getBindingCommandAttrs(binding,focused,activeView),attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough}}collectActiveBindings(bindings,focused,activeView){return bindings.map((binding)=>this.toActiveBinding(binding,focused,activeView))}collectActiveKeysAtRoot(activeLayers,includeBindings,includeMetadata,focused,activeView){let activeKeys=new Map,stopped=new Set,hasLayerConditions=this.state.layers.layersWithConditions>0;for(let layer of activeLayers){if(layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;for(let[bindingKey,child]of layer.root.children){if(stopped.has(bindingKey))continue;let selection=this.selectActiveKey(child,includeBindings,focused,activeView);if(!selection)continue;let existing=activeKeys.get(bindingKey);if(!existing)activeKeys.set(bindingKey,this.createActiveKeyState(child.stroke,selection,includeBindings));else this.updateActiveKeyState(existing,selection,includeBindings);if(selection.stop)stopped.add(bindingKey)}}let materialized=[];for(let state of activeKeys.values()){let activeKey=this.materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView);if(activeKey)materialized.push(activeKey)}return materialized}collectActiveKeysFromPending(captures,includeBindings,includeMetadata,focused,activeView){let activeKeys=new Map,stopped=new Set;for(let capture2 of captures)for(let[bindingKey,child]of capture2.node.children){if(stopped.has(bindingKey))continue;let selection=this.selectActiveKey(child,includeBindings,focused,activeView);if(!selection)continue;let existing=activeKeys.get(bindingKey);if(!existing)activeKeys.set(bindingKey,this.createActiveKeyState(child.stroke,selection,includeBindings));else this.updateActiveKeyState(existing,selection,includeBindings);if(selection.stop)stopped.add(bindingKey)}let materialized=[];for(let state of activeKeys.values()){let activeKey=this.materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView);if(activeKey)materialized.push(activeKey)}return materialized}selectActiveKey(node,includeBindings,focused,activeView){return node.children.size>0?this.selectPrefixActiveKey(node,includeBindings,focused,activeView):this.selectExactActiveKey(node,includeBindings,focused,activeView)}selectPrefixActiveKey(node,includeBindings,focused,activeView){if(!node.stroke)return;let reachableBindings=this.collectMatchingBindings(node.reachableBindings,focused,activeView);if(reachableBindings.length===0)return;let prefixBindings=this.selectActiveBindings(node.bindings,focused,activeView);return{...this.getNodePresentation(node,focused,activeView,reachableBindings),continues:!0,firstBinding:prefixBindings?.bindings[0],commandBinding:prefixBindings?.commandBinding,bindings:includeBindings&&prefixBindings&&prefixBindings.bindings.length>0?[...prefixBindings.bindings]:void 0,stop:!0}}selectExactActiveKey(node,includeBindings,focused,activeView){if(!node.stroke)return;let selected=this.selectActiveBindings(node.bindings,focused,activeView);if(!selected)return;let display,tokenName;if(selected.bindings.length===1){let part=selected.bindings[0]?.sequence[node.depth-1];display=part?.display??stringifyKeyStroke(node.stroke),tokenName=part?.tokenName}else{let presentation=this.getNodePresentation(node,focused,activeView,selected.bindings);display=presentation.display,tokenName=presentation.tokenName}return{display,tokenName,continues:!1,firstBinding:selected.bindings[0],commandBinding:selected.commandBinding,bindings:includeBindings?[...selected.bindings]:void 0,stop:selected.stop}}selectActiveBindings(bindings,focused,activeView){let selected=[],commandBinding;for(let binding of bindings){if(!this.conditions.matchesConditions(binding)||!this.catalog.isBindingVisible(binding,focused,activeView))continue;if(selected.push(binding),binding.command===void 0)continue;if(commandBinding??=binding,!binding.fallthrough)return{bindings:selected,commandBinding,stop:!0}}if(selected.length===0)return;return{bindings:selected,commandBinding,stop:!1}}createActiveKeyState(stroke,selection,includeBindings){return{stroke,display:selection.display,tokenName:selection.tokenName,continues:selection.continues,firstBinding:selection.firstBinding,commandBinding:selection.commandBinding,bindings:includeBindings&&selection.bindings?[...selection.bindings]:void 0}}updateActiveKeyState(state,selection,includeBindings){if(!state.firstBinding&&selection.firstBinding)state.firstBinding=selection.firstBinding;if(!state.commandBinding&&selection.commandBinding)state.commandBinding=selection.commandBinding;if(selection.continues)state.continues=!0;if(!includeBindings||!selection.bindings||selection.bindings.length===0)return;if(!state.bindings){state.bindings=[...selection.bindings];return}state.bindings.push(...selection.bindings)}materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView){if(!state.commandBinding&&!state.continues)return;let activeKey={stroke:cloneKeyStroke(state.stroke),display:state.display,continues:state.continues};if(state.tokenName)activeKey.tokenName=state.tokenName;if(state.commandBinding)activeKey.command=state.commandBinding.command;if(includeBindings&&state.bindings&&state.bindings.length>0)activeKey.bindings=state.bindings.length===1?[this.toActiveBinding(state.bindings[0],focused,activeView)]:this.collectActiveBindings(state.bindings,focused,activeView);if(includeMetadata){if(state.firstBinding?.attrs)activeKey.bindingAttrs=state.firstBinding.attrs;let commandAttrs=state.commandBinding?this.catalog.getBindingCommandAttrs(state.commandBinding,focused,activeView):void 0;if(commandAttrs)activeKey.commandAttrs=commandAttrs}return activeKey}invalidateCaches(){this.state.projection.pendingSequenceCacheVersion=-1,this.state.projection.activeKeysPlainCacheVersion=-1,this.state.projection.activeKeysBindingsCacheVersion=-1,this.state.projection.activeKeysMetadataCacheVersion=-1,this.state.projection.activeKeysBindingsAndMetadataCacheVersion=-1}notifyPendingSequenceChange(){if(!this.hooks.has("pendingSequence"))return;this.hooks.emit("pendingSequence",this.state.projection.pendingSequence?this.collectSequencePartsFromPending(this.state.projection.pendingSequence):[])}}function mergeRequirement(target,name,value,source){if(Object.prototype.hasOwnProperty.call(target,name)&&!Object.is(target[name],value))throw Error(`Conflicting keymap requirement for "${name}" from ${source}`);target[name]=value}function mergeAttribute(target,name,value,source){if(Object.prototype.hasOwnProperty.call(target,name)&&!Object.is(target[name],value))throw Error(`Conflicting keymap attribute for "${name}" from ${source}`);target[name]=value}function isPlainObject2(value){let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function getErrorMessage(error2,fallback){if(error2 instanceof Error&&error2.message)return error2.message;return fallback}function isPromiseLike(value){if(!value)return!1;if(typeof value!=="object"&&typeof value!=="function")return!1;return typeof value.then==="function"}function snapshotDataValue(value,options){let deep=options?.deep===!0,freeze=options?.freeze===!0,preserveNonPlainObjects=options?.preserveNonPlainObjects===!0;if(Array.isArray(value)){let cloned=deep?value.map((entry2)=>snapshotDataValue(entry2,options)):[...value];return freeze?Object.freeze(cloned):cloned}if(value&&typeof value==="object"){if(preserveNonPlainObjects&&!isPlainObject2(value))return value;let cloned={};for(let[key,entry2]of Object.entries(value))cloned[key]=deep?snapshotDataValue(entry2,options):entry2;return freeze?Object.freeze(cloned):cloned}return value}function createCommandChainCacheState(){return{resolvedWithoutRecordChains:new Map,resolvedWithRecordChains:new Map,fallbackWithoutRecord:new Map,fallbackWithRecord:new Map,fallbackWithoutRecordErrors:new Set,fallbackWithRecordErrors:new Set}}function normalizeBindingCommand(command){if(command===void 0||typeof command==="function")return command;let trimmed=command.trim();if(!trimmed)throw Error("Invalid keymap command: command cannot be empty");return trimmed}function normalizeCommandName(name){let trimmed=name.trim();if(!trimmed)throw Error("Invalid keymap command name: name cannot be empty");if(/\s/.test(trimmed))throw Error(`Invalid keymap command name "${name}": command names cannot contain whitespace`);return trimmed}class CommandCatalogService{state;host;notify;conditions;options;constructor(state,host,notify,conditions,options){this.state=state,this.host=host,this.notify=notify,this.conditions=conditions,this.options=options}normalizeCommands(commands){return normalizeRegisteredCommands({commands,commandFields:this.state.environment.commandFields,conditions:this.conditions,onError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}prependCommandResolver(resolver){return this.mutateCommandResolvers(()=>this.state.commands.commandResolvers.prepend(resolver),resolver)}appendCommandResolver(resolver){return this.mutateCommandResolvers(()=>this.state.commands.commandResolvers.append(resolver),resolver)}clearCommandResolvers(){if(!this.state.commands.commandResolvers.has())return;this.notify.runWithStateChangeBatch(()=>{this.state.commands.commandResolvers.clear(),this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange()})}getCommands(query2){return this.getFilteredCommandEntries(query2).map((entry2)=>getRegisteredCommandRecord(entry2.command))}getCommandEntries(query2){let context=this.getCommandQueryContext(query2),filteredEntries=this.getFilteredCommandEntries(query2,context);if(filteredEntries.length===0)return[];let grouped=filteredEntries.map((entry2)=>({entry:entry2,command:getRegisteredCommandRecord(entry2.command),bindings:[]})),indexesByName=new Map;for(let[index,item]of grouped.entries()){let existing=indexesByName.get(item.command.name);if(existing)existing.push(index);else indexesByName.set(item.command.name,[index])}if(indexesByName.size>0)this.collectCommandEntryBindings(grouped,indexesByName,context);return grouped.map((item)=>({command:item.command,bindings:item.bindings}))}getResolvedCommandChain(command,focused,includeRecord){let view=this.getActiveCommandView(focused),entries=this.getResolvedCommandChainFromView(view,command,focused,includeRecord,"active",view.chainsByName.get(command)),hadError=(includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors).has(command);return{entries,hadError}}getRegisteredResolvedEntries(command,includeRecord){let view=this.getRegisteredCommandView(),cache=includeRecord?view.resolvedWithRecordChains:view.resolvedWithoutRecordChains,cached=cache.get(command);if(cached)return cached.length>0?cached:void 0;let chain=view.chainsByName.get(command);if(!chain||chain.length===0){cache.set(command,[]);return}let resolved=[];for(let entry2 of chain)resolved.push({target:entry2.layer.target,resolved:resolveRegisteredCommand(entry2.command,{includeRecord})});return cache.set(command,resolved),resolved}getRegisteredResolverFallback(command,includeRecord){let view=this.getRegisteredCommandView(),fallback=this.getFallbackResolvedCommand(view,command,null,includeRecord,"registered"),hadError=(includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors).has(command);return{resolved:fallback?.resolved,hadError}}getCommandAttrs(command,focused){return this.getTopResolvedCommand(command,focused,!1)?.resolved.attrs}getTopCommandRecord(command,focused){return this.getTopResolvedCommand(command,focused,!0)?.resolved.record}getTopRegisteredCommandRecord(command){let top=this.getTopRegisteredCommand(command);return top?getRegisteredCommandRecord(top.command):void 0}getDispatchUnavailableCommandState(command,focused,includeRecord){let chain=this.getRegisteredCommandView().chainsByName.get(command);if(!chain||chain.length===0)return;let inactiveEntry,disabledEntry;for(let entry2 of chain){if(!isLayerActiveForFocused(this.host,entry2.layer,focused)){inactiveEntry??=entry2;continue}if(!this.conditions.layerMatchesRuntimeState(entry2.layer)||!this.conditions.matchesConditions(entry2.command))disabledEntry??=entry2}let unavailableEntry=disabledEntry??inactiveEntry;if(!unavailableEntry)return;return{reason:disabledEntry?"disabled":"inactive",command:includeRecord?getRegisteredCommandRecord(unavailableEntry.command):void 0}}getActiveCommandView(focused){let currentFocused=getFocusedTargetIfAvailable(this.host),derivedStateVersion=this.state.notify.derivedStateVersion;if(focused===currentFocused&&this.state.commands.activeCommandViewVersion===derivedStateVersion&&this.state.commands.activeCommandView?.cacheable)return this.state.commands.activeCommandView;let entries=[],reachable=[],reachableByName=new Map,chainsByName=new Map,cacheable=!0;if(this.state.layers.layersWithCommands>0)for(let layer of getActiveLayersForFocused(this.state.layers,this.host,focused)){if(layer.commands.length===0||!this.conditions.layerMatchesRuntimeState(layer))continue;if(layer.hasUnkeyedMatchers)cacheable=!1;for(let command of layer.commands){if(command.hasUnkeyedMatchers)cacheable=!1;if(!this.conditions.matchesConditions(command))continue;let entry2={layer,command};entries.push(entry2);let existing=chainsByName.get(command.name);if(existing)existing.push(entry2);else chainsByName.set(command.name,[entry2]);if(!reachableByName.has(command.name))reachableByName.set(command.name,entry2),reachable.push(entry2)}}let view={cacheable,entries,reachable,reachableByName,chainsByName,...createCommandChainCacheState()};if(focused===currentFocused&&view.cacheable)this.state.commands.activeCommandViewVersion=derivedStateVersion,this.state.commands.activeCommandView=view;return view}getRegisteredCommandView(){let cacheVersion=this.state.commands.commandMetadataVersion;if(this.state.commands.registeredCommandViewVersion===cacheVersion&&this.state.commands.registeredCommandView)return this.state.commands.registeredCommandView;let entries=[],chainsByName=new Map;for(let layer of this.state.layers.sortedLayers){if(layer.commands.length===0)continue;for(let command of layer.commands){let entry2={layer,command};entries.push(entry2);let existing=chainsByName.get(command.name);if(existing)existing.push(entry2);else chainsByName.set(command.name,[entry2])}}let view={entries,chainsByName,...createCommandChainCacheState()};return this.state.commands.registeredCommandViewVersion=cacheVersion,this.state.commands.registeredCommandView=view,view}isBindingVisible(binding,focused,activeView){if(binding.command===void 0||binding.run)return!0;if(typeof binding.command!=="string")return!1;if(activeView.reachableByName.has(binding.command))return!0;return this.getFallbackResolvedCommand(activeView,binding.command,focused,!1,"active")!==void 0}getBindingCommandAttrs(binding,focused,activeView){if(typeof binding.command!=="string")return;let active=activeView.reachableByName.get(binding.command);if(active)return active.command.attrs;return this.getFallbackResolvedCommand(activeView,binding.command,focused,!1,"active")?.resolved.attrs}getCommandResolutionStatus(command,layerCommands){if(layerCommands?.has(command)||this.state.commands.registeredNames.has(command))return"resolved";let lookup=this.resolveCommandWithResolvers(command,getFocusedTargetIfAvailable(this.host));if(lookup.resolved||lookup.hadError)return lookup.resolved?"resolved":"error";return"unresolved"}mutateCommandResolvers(register2,resolver){return this.notify.runWithStateChangeBatch(()=>{let off=register2();return this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange(),()=>{this.notify.runWithStateChangeBatch(()=>{if(off(),this.state.commands.commandResolvers.values().includes(resolver))return;this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange()})}})}getTopResolvedCommand(command,focused,includeRecord){let activeView=this.getActiveCommandView(focused),active=activeView.reachableByName.get(command);if(active)return{target:active.layer.target,resolved:resolveRegisteredCommand(active.command,{includeRecord})};return this.getFallbackResolvedCommand(activeView,command,focused,includeRecord,"active")}getTopRegisteredCommand(command){return this.getRegisteredCommandView().chainsByName.get(command)?.[0]}getFallbackResolvedCommand(view,command,focused,includeRecord,mode){let cache=includeRecord?view.fallbackWithRecord:view.fallbackWithoutRecord,errorCache=includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors;if(cache.has(command)){let cached=cache.get(command);return cached?{resolved:cached}:void 0}let lookup=this.resolveCommandWithResolvers(command,focused,{includeRecord,mode});if(cache.set(command,lookup.resolved??null),lookup.hadError)errorCache.add(command);if(!lookup.resolved)return;return{resolved:lookup.resolved}}getResolvedCommandChainFromView(view,command,focused,includeRecord,mode,activeChain){let cache=includeRecord?view.resolvedWithRecordChains:view.resolvedWithoutRecordChains,cached=cache.get(command);if(cached)return cached.length>0?cached:void 0;let resolved=[],chain=activeChain;if(chain)for(let entry2 of chain)resolved.push({target:entry2.layer.target,resolved:resolveRegisteredCommand(entry2.command,{includeRecord})});let fallback=this.getFallbackResolvedCommand(view,command,focused,includeRecord,mode);if(fallback)resolved.push(fallback);return cache.set(command,resolved),resolved.length>0?resolved:void 0}getRegisteredLayerCommandEntries(){let cacheVersion=this.state.commands.commandMetadataVersion;if(this.state.commands.registeredCommandEntriesCacheVersion===cacheVersion)return this.state.commands.registeredCommandEntriesCache;let layers=[...this.state.layers.layers];layers.sort((left,right)=>left.order-right.order);let entries=[];for(let layer of layers)for(let command of layer.commands)entries.push({layer,command});return this.state.commands.registeredCommandEntriesCacheVersion=cacheVersion,this.state.commands.registeredCommandEntriesCache=entries,entries}getCommandQueryContext(query2){let visibility=query2?.visibility??"reachable",focused=query2&&Object.prototype.hasOwnProperty.call(query2,"focused")?query2.focused??null:getFocusedTargetIfAvailable(this.host);if(visibility==="registered")return{visibility,focused};return{visibility,focused,activeView:this.getActiveCommandView(focused)}}getFilteredCommandEntries(query2,context=this.getCommandQueryContext(query2)){let entries;if(context.visibility==="registered")entries=this.getRegisteredLayerCommandEntries();else if(context.visibility==="active")entries=context.activeView?.entries??[];else entries=context.activeView?.reachable??[];return queryLayerCommandEntries({entries,query:query2,getCommandRecord:(command)=>getRegisteredCommandRecord(command),onFilterError:(error2)=>{this.notify.emitError("command-query-filter-error",error2,"[Keymap] Error in command query filter:")}})}collectCommandEntryBindings(grouped,indexesByName,context){if(context.visibility==="registered"){let layers=[...this.state.layers.layers];layers.sort((left,right)=>left.order-right.order);for(let layer of layers)for(let binding of layer.compiledBindings)this.collectBindingForCommandEntries(grouped,indexesByName,binding);return}let activeView=context.activeView;if(!activeView)return;for(let layer of getActiveLayersForFocused(this.state.layers,this.host,context.focused)){if(layer.compiledBindings.length===0||!this.conditions.layerMatchesRuntimeState(layer))continue;for(let binding of layer.compiledBindings){if(!this.conditions.matchesConditions(binding)||!this.isBindingVisible(binding,context.focused,activeView))continue;this.collectBindingForCommandEntries(grouped,indexesByName,binding)}}}collectBindingForCommandEntries(grouped,indexesByName,binding){if(typeof binding.command!=="string")return;let indexes=indexesByName.get(binding.command);if(!indexes||indexes.length===0)return;for(let index of indexes){let item=grouped[index];if(!item)continue;item.bindings.push({sequence:binding.sequence,command:binding.command,commandAttrs:item.command.attrs,attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough})}}resolveCommandWithResolvers(command,focused,options){let includeRecord=options?.includeRecord===!0,context=this.createCommandResolverContext(includeRecord,focused,options?.mode??"active");return resolveCommandWithResolvers(command,this.state.commands.commandResolvers.values(),context,(error2)=>{this.notify.emitError("command-resolver-error",error2,`[Keymap] Error in command resolver for "${command}":`)})}createCommandResolverContext(includeRecord,focused,mode){return{getCommandAttrs:(name)=>{if(mode==="registered")return this.getTopRegisteredCommand(name)?.command.attrs;return this.getCommandAttrs(name,focused)},getCommandRecord:(name)=>{if(!includeRecord)return;if(mode==="registered")return this.getTopRegisteredCommandRecord(name);return this.getTopCommandRecord(name,focused)}}}}function getRegisteredCommandRecord(command){if(command.record)return command.record;let fields=EMPTY_COMMAND_FIELDS;if(command.fields!==EMPTY_COMMAND_FIELDS&&Object.keys(command.fields).length>0)fields=snapshotDataValue(command.fields,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS);let record=command.attrs?Object.freeze({name:command.name,fields,attrs:snapshotDataValue(command.attrs,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS)}):Object.freeze({name:command.name,fields});return command.record=record,record}function resolveRegisteredCommand(command,options){if(options?.includeRecord===!0){let existing2=command.resolvedWithRecord;if(existing2)return existing2;let resolved2={run:createRegisteredCommandRunner(command)};if(command.attrs)resolved2.attrs=command.attrs;return resolved2.record=getRegisteredCommandRecord(command),command.resolvedWithRecord=resolved2,resolved2}let existing=command.resolved;if(existing)return existing;let resolved={run:createRegisteredCommandRunner(command)};if(command.attrs)resolved.attrs=command.attrs;return command.resolved=resolved,resolved}function normalizeRegisteredCommands(options){let normalizedCommands=[],seen=new Set;for(let command of options.commands){let normalizedCommand;try{let mergedAttrs={},mergedFields={},mergedRequires={},matchers=[],conditionKeys=new Set,hasUnkeyedMatchers=!1,normalizedName=normalizeCommandName(command.name);if(seen.has(normalizedName)){options.onError("duplicate-command",{command:normalizedName},`Duplicate keymap command "${normalizedName}" in the same layer`);continue}for(let[fieldName,value]of Object.entries(command)){if(RESERVED_COMMAND_FIELDS.has(fieldName)||value===void 0)continue;mergedFields[fieldName]=snapshotDataValue(value,SNAPSHOT_COMMAND_METADATA_OPTIONS);let compiler=options.commandFields.get(fieldName);if(!compiler)continue;compiler(value,createCommandFieldContext(mergedAttrs,mergedRequires,conditionKeys,matchers,options.conditions,fieldName,{onUnkeyedMatcher(){hasUnkeyedMatchers=!0}}))}let attrs=Object.keys(mergedAttrs).length===0?void 0:Object.freeze(mergedAttrs),fields=Object.keys(mergedFields).length===0?EMPTY_COMMAND_FIELDS:Object.freeze(mergedFields);if(normalizedCommand={name:normalizedName,fields,run:command.run,requires:Object.entries(mergedRequires),matchers,conditionKeys:[...conditionKeys],hasUnkeyedMatchers,matchCacheDirty:!0},attrs)normalizedCommand.attrs=attrs}catch(error2){options.onError("register-command-failed",error2,getErrorMessage(error2,`Failed to register keymap command "${String(command.name)}"`));continue}seen.add(normalizedCommand.name),normalizedCommands.push(normalizedCommand)}return normalizedCommands}function createCommandFieldContext(mergedAttrs,mergedRequires,conditionKeys,matchers,conditions,fieldName,options){return{require(name,requiredValue){mergeRequirement(mergedRequires,name,requiredValue,`field ${fieldName}`),conditionKeys.add(name)},attr(name,attributeValue){mergeAttribute(mergedAttrs,name,snapshotDataValue(attributeValue,SNAPSHOT_COMMAND_METADATA_OPTIONS),`field ${fieldName}`)},activeWhen(matcher){let runtimeMatcher=conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)options.onUnkeyedMatcher();matchers.push(runtimeMatcher)}}}function createRegisteredCommandRunner(command){if(command.runner)return command.runner;let runner=(ctx)=>{return command.run({...ctx,command:getRegisteredCommandRecord(command)})};return command.runner=runner,runner}function resolveCommandWithResolvers(command,resolvers,context,onResolverError){if(resolvers.length===0)return{hadError:!1};let hadError=!1;for(let resolver of resolvers){let resolved;try{resolved=resolver(command,context)}catch(error2){hadError=!0,onResolverError(error2);continue}if(resolved)return{hadError,resolved}}return{hadError}}function queryLayerCommandEntries(options){let namespace=options.query?.namespace,normalizedSearch=options.query?.search?.trim().toLowerCase()??"",searchKeys=DEFAULT_COMMAND_SEARCH_FIELDS;if(options.query?.searchIn&&options.query.searchIn.length>0)searchKeys=options.query.searchIn;let filter=options.query?.filter,filterEntries2,filterPredicate;if(typeof filter==="function")filterPredicate=filter;else if(filter)filterEntries2=Object.entries(filter);let results=[];for(let entry2 of options.entries){let command=entry2.command;if(!commandMatchesNamespace(command,namespace))continue;if(!commandMatchesSearch(command,normalizedSearch,searchKeys))continue;if(!commandMatchesFilters(command,filterEntries2,options))continue;let record=options.getCommandRecord(command);if(filterPredicate){let matches=!1;try{matches=filterPredicate(record)}catch(error2){options.onFilterError(error2);continue}if(!matches)continue}results.push(entry2)}return results}function commandMatchesSearch(command,search,searchKeys){if(!search)return!0;for(let key of searchKeys)if(commandKeyMatchesSearch(command,key,search))return!0;return!1}function commandMatchesNamespace(command,namespace){if(namespace===void 0)return!0;if(!Object.prototype.hasOwnProperty.call(command.fields,"namespace"))return!1;return commandValueMatchesFilter(command.fields.namespace,namespace)}function commandMatchesFilters(command,filters,options){if(!filters)return!0;for(let[key,matcher]of filters)if(!commandKeyMatchesQuery(command,key,matcher,options))return!1;return!0}function commandKeyMatchesSearch(command,key,search){if(key==="name"&&commandValueMatchesSearch(command.name,search))return!0;if(Object.prototype.hasOwnProperty.call(command.fields,key)&&commandValueMatchesSearch(command.fields[key],search))return!0;if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key))return commandValueMatchesSearch(command.attrs[key],search);return!1}function commandKeyMatchesQuery(command,key,matcher,options){if(typeof matcher==="function"){let record,getRecord=()=>{if(!record)record=options.getCommandRecord(command);return record},foundValue=!1;if(key==="name"){foundValue=!0;try{if(matcher(command.name,getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(Object.prototype.hasOwnProperty.call(command.fields,key)){foundValue=!0;try{if(matcher(command.fields[key],getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key)){foundValue=!0;try{if(matcher(command.attrs[key],getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(!foundValue)try{return matcher(void 0,getRecord())}catch(error2){return options.onFilterError(error2),!1}return!1}return commandKeyMatchesExact(command,key,matcher)}function commandKeyMatchesExact(command,key,matcher){if(key==="name"&&commandValueMatchesFilter(command.name,matcher))return!0;if(Object.prototype.hasOwnProperty.call(command.fields,key)&&commandValueMatchesFilter(command.fields[key],matcher))return!0;if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key))return commandValueMatchesFilter(command.attrs[key],matcher);return!1}function commandValueMatchesFilter(value,matcher){if(Array.isArray(matcher)){for(let expected of matcher)if(commandValueMatchesExact(value,expected))return!0;return!1}return commandValueMatchesExact(value,matcher)}function commandValueMatchesExact(value,expected){if(Array.isArray(value)){for(let entry2 of value)if(commandValueMatchesExact(entry2,expected))return!0;return!1}return Object.is(value,expected)}function commandValueMatchesSearch(value,search){if(Array.isArray(value)){for(let entry2 of value)if(commandValueMatchesSearch(entry2,search))return!0;return!1}if(typeof value==="string")return value.toLowerCase().includes(search);if(typeof value==="number"||typeof value==="boolean"||typeof value==="bigint")return String(value).toLowerCase().includes(search);return!1}class CommandExecutorService{notify;runtime;activation;catalog;options;constructor(notify,runtime,activation,catalog,options){this.notify=notify,this.runtime=runtime,this.activation=activation,this.catalog=catalog,this.options=options}runCommand(cmd,options){let normalized;try{normalized=normalizeBindingCommand(cmd)}catch{return{ok:!1,reason:"invalid-args"}}if(typeof normalized!=="string")return{ok:!1,reason:"not-found"};let includeRecord=options?.includeCommand===!0,focused=options?.focused??this.activation.getFocusedTargetIfAvailable(),event=options?.event??this.options.createCommandEvent(),data=this.runtime.getReadonlyData(),chain=this.catalog.getRegisteredResolvedEntries(normalized,includeRecord),rejectedResult;if(chain?.length===1){let[entry2]=chain;if(entry2){let execution=this.executeResolvedCommand(normalized,entry2.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data},execution=this.executeResolvedCommand(normalized,entry2.resolved,context);if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}let fallback=this.catalog.getRegisteredResolverFallback(normalized,includeRecord);if(fallback.resolved){let execution=this.executeResolvedCommand(normalized,fallback.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}if(fallback.hadError)return{ok:!1,reason:"error"};return rejectedResult??{ok:!1,reason:"not-found"}}dispatchCommand(cmd,options){let normalized;try{normalized=normalizeBindingCommand(cmd)}catch{return{ok:!1,reason:"invalid-args"}}if(typeof normalized!=="string")return{ok:!1,reason:"not-found"};let includeRecord=options?.includeCommand===!0,focused=options?.focused??this.activation.getFocusedTargetIfAvailable(),event=options?.event??this.options.createCommandEvent(),data=this.runtime.getReadonlyData(),chainLookup=this.catalog.getResolvedCommandChain(normalized,focused,includeRecord),chain=chainLookup.entries,rejectedResult;if(chain?.length===1){let[entry2]=chain;if(entry2){let execution=this.executeResolvedCommand(normalized,entry2.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data},execution=this.executeResolvedCommand(normalized,entry2.resolved,context);if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}if(chainLookup.hadError)return{ok:!1,reason:"error"};let unavailable=this.catalog.getDispatchUnavailableCommandState(normalized,focused,includeRecord);if(unavailable)return unavailable.command?{ok:!1,reason:unavailable.reason,command:unavailable.command}:{ok:!1,reason:unavailable.reason};return rejectedResult??{ok:!1,reason:"not-found"}}runBinding(bindingLayer,binding,event,focused){let data=this.runtime.getReadonlyData();if(binding.run){if(this.executeResolvedCommand(typeof binding.command==="string"?binding.command:"<function>",{run:binding.run},{keymap:this.options.keymap,event,focused,target:bindingLayer.target??null,data}).status==="rejected")return!1;return applyBindingEventEffects(binding,event),!0}if(typeof binding.command!=="string")return!1;let chain=this.catalog.getResolvedCommandChain(binding.command,focused,!1).entries;if(chain?.length===1){let[entry2]=chain;if(entry2){if(this.executeResolvedCommand(binding.command,entry2.resolved,{keymap:this.options.keymap,event,focused,target:entry2.target??bindingLayer.target??null,data}).status==="rejected")return!1;return applyBindingEventEffects(binding,event),!0}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:entry2.target??bindingLayer.target??null,data};if(this.executeResolvedCommand(binding.command,entry2.resolved,context).status==="rejected")continue;return applyBindingEventEffects(binding,event),!0}return!1}executeResolvedCommand(commandName,resolved,context){let command=resolved.record,result2;try{result2=resolved.run(context)}catch(error2){return this.notify.emitError("command-execution-error",error2,`[Keymap] Error running command "${commandName}":`),{status:"error",result:{ok:!1,reason:"error",command}}}if(isPromiseLike(result2))return result2.catch((error2)=>{this.notify.emitError("async-command-error",error2,`[Keymap] Async error in command "${commandName}":`)}),{status:"handled",result:{ok:!0,command}};if(result2===!1){if(resolved.rejectedResult)return{status:"rejected",result:resolved.rejectedResult};return{status:"rejected",result:{ok:!1,reason:"rejected",command}}}return{status:"handled",result:{ok:!0,command}}}}function applyBindingEventEffects(binding,event){if(!binding.preventDefault)return;event.preventDefault(),event.stopPropagation()}function normalizeBindingInputs(bindings){if(Array.isArray(bindings))return bindings;let normalized=[];for(let[key,cmd]of Object.entries(bindings)){if(typeof cmd!=="string"&&typeof cmd!=="function")throw Error(`Invalid keymap binding for "${key}": shorthand bindings must map to string or function commands`);normalized.push({key,cmd})}return normalized}function snapshotBindingInputs(bindings){return normalizeBindingInputs(bindings).map((binding)=>({...binding,key:typeof binding.key==="string"?binding.key:{...binding.key}}))}function snapshotParsedBindingInput(binding){return{...binding,sequence:cloneKeySequence(binding.sequence)}}function createSequenceNode(parent,stroke,match){return{parent,depth:parent?parent.depth+1:0,stroke,match,children:new Map,bindings:[],reachableBindings:[]}}function snapshotAttributes(attrs){if(Object.keys(attrs).length===0)return;return snapshotDataValue(attrs,{freeze:!0})}class CompilerService{state;notify;conditions;options;constructor(state,notify,conditions,options){this.state=state,this.notify=notify,this.conditions=conditions,this.options=options}parseTokenKey(key){return parseSingleKeyPartWithParsers(key,this.state.environment.bindingParsers.values(),{tokens:this.state.environment.tokens,layer:EMPTY_COMPILE_FIELDS,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)})}compileBindings(bindings,tokens2,sourceTarget,sourceLayerOrder,compileFields){let root=createSequenceNode(null,null,null),compiledBindings=[],hasTokenBindings=!1,bindingExpanders=this.state.environment.bindingExpanders.values(),bindingParsers=this.state.environment.bindingParsers.values(),bindingFieldCompilers=this.state.environment.bindingFields,allowExactPrefixAmbiguity=this.state.dispatch.disambiguationResolvers.has(),warnUnknownField=this.options.warnUnknownField,warnUnknownToken=this.options.warnUnknownToken,conditions=this.conditions;for(let[bindingIndex,binding]of bindings.entries()){let expandedBindingKeys;try{expandedBindingKeys=expandBindingInputWithExpanders(binding.key,bindingExpanders,{layer:compileFields})}catch(error2){this.notify.emitError("binding-expand-error",error2,getErrorMessage(error2,"Failed to expand keymap binding"));continue}for(let expandedBindingKey of expandedBindingKeys){let parsed;try{parsed=typeof expandedBindingKey==="string"?parseBindingSequenceWithParsers(expandedBindingKey,bindingParsers,{tokens:tokens2,layer:compileFields,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)}):{parts:[this.parseObjectKeyPart(expandedBindingKey)],usedTokens:[],unknownTokens:[],hasTokenBindings:!1}}catch(error2){this.notify.emitError("binding-parse-error",error2,getErrorMessage(error2,"Failed to parse keymap binding"));continue}let sequence=parsed.parts;hasTokenBindings||=parsed.hasTokenBindings;for(let tokenName of parsed.unknownTokens)warnUnknownToken(tokenName,typeof expandedBindingKey==="string"?expandedBindingKey:String(expandedBindingKey.name));for(let compiledInput of this.applyBindingTransformers(binding,sequence,tokens2,bindingParsers,compileFields))try{let event=this.normalizeBindingEvent(compiledInput.event),compiledSequence=compiledInput.sequence,mergedRequires,mergedAttrs,matchers,conditionKeys,hasUnkeyedMatchers=!1;for(let fieldName in compiledInput){if(fieldName==="sequence")continue;if(RESERVED_BINDING_FIELDS.has(fieldName))continue;let value=compiledInput[fieldName];if(value===void 0)continue;let compiler=bindingFieldCompilers.get(fieldName);if(!compiler){warnUnknownField("binding",fieldName);continue}compiler(value,{require(name,requiredValue){if(!mergedRequires)mergedRequires={};if(mergeRequirement(mergedRequires,name,requiredValue,`field ${fieldName}`),!conditionKeys)conditionKeys=new Set;conditionKeys.add(name)},attr(name,attributeValue){if(!mergedAttrs)mergedAttrs={};mergeAttribute(mergedAttrs,name,attributeValue,`field ${fieldName}`)},activeWhen:(matcher)=>{let runtimeMatcher=conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)hasUnkeyedMatchers=!0;if(!matchers)matchers=[];matchers.push(runtimeMatcher)}})}let attrs=mergedAttrs?snapshotAttributes(mergedAttrs):void 0,command=normalizeBindingCommand(compiledInput.cmd),compiledBinding={sequence:compiledSequence,command,event,sourceBinding:snapshotParsedBindingInput(compiledInput),sourceTarget,sourceLayerOrder,sourceBindingIndex:bindingIndex,requires:mergedRequires?Object.entries(mergedRequires):EMPTY_REQUIRES,matchers:matchers??EMPTY_MATCHERS,conditionKeys:conditionKeys?[...conditionKeys]:EMPTY_CONDITION_KEYS,hasUnkeyedMatchers,matchCacheDirty:!0,preventDefault:compiledInput.preventDefault!==!1,fallthrough:compiledInput.fallthrough??!1};if(attrs)compiledBinding.attrs=attrs;if(typeof command==="function")compiledBinding.run=command;if(compiledSequence.length===0)continue;if(event==="release"&&compiledSequence.length>1)throw Error("Keymap release bindings only support a single key stroke");if(event==="press")this.insertBinding(root,compiledBinding,allowExactPrefixAmbiguity);compiledBindings.push(compiledBinding)}catch(error2){this.notify.emitError("binding-compile-error",error2,getErrorMessage(error2,"Failed to compile keymap binding"))}}}return{root,bindings:compiledBindings,hasTokenBindings}}parseObjectKeyPart(key,options){return createKeySequencePart(key,options)}normalizeBindingEvent(event){if(event===void 0||event==="press")return"press";if(event==="release")return"release";throw Error(`Invalid keymap binding event "${String(event)}": expected "press" or "release"`)}applyBindingTransformers(binding,sequence,tokens2,bindingParsers,compileFields){let bindingTransformers=this.state.environment.bindingTransformers.values();if(bindingTransformers.length===0)return[{...binding,sequence:cloneKeySequence(sequence)}];let parsedBinding={...binding,sequence:cloneKeySequence(sequence)},extraBindings=[],keepOriginal=!0,layer=compileFields??EMPTY_COMPILE_FIELDS;for(let transformer of bindingTransformers)try{transformer(parsedBinding,{layer,parseKey:(key)=>{return parseSingleKeyPartWithParsers(key,bindingParsers,{tokens:tokens2,layer,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)})},add:(nextBinding)=>{extraBindings.push(snapshotParsedBindingInput(nextBinding))},skipOriginal:()=>{keepOriginal=!1}})}catch(error2){this.notify.emitError("binding-transformer-error",error2,"[Keymap] Error in binding transformer:")}if(!keepOriginal)return extraBindings;if(extraBindings.length===0)return[parsedBinding];return[parsedBinding,...extraBindings]}insertBinding(root,binding,allowExactPrefixAmbiguity){let node=root,touchedNodes=[],createdNodes=[];try{for(let part of binding.sequence){if(!allowExactPrefixAmbiguity&&node.bindings.some((candidate)=>candidate.command!==void 0))throw Error("Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer");let bindingKey=part.match,child=node.children.get(bindingKey);if(!child)child=createSequenceNode(node,cloneKeySequencePart(part).stroke,part.match),node.children.set(bindingKey,child),createdNodes.push({parent:node,key:bindingKey});child.reachableBindings.push(binding),touchedNodes.push(child),node=child}if(!allowExactPrefixAmbiguity&&binding.command!==void 0&&node.children.size>0)throw Error("Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer");node.bindings=[...node.bindings,binding]}catch(error2){for(let index=touchedNodes.length-1;index>=0;index-=1){let touchedNode=touchedNodes[index];if(!touchedNode)continue;if(touchedNode.reachableBindings.at(-1)===binding){touchedNode.reachableBindings.pop();continue}touchedNode.reachableBindings=touchedNode.reachableBindings.filter((candidate)=>candidate!==binding)}for(let index=createdNodes.length-1;index>=0;index-=1){let createdNode=createdNodes[index];if(!createdNode)continue;let child=createdNode.parent.children.get(createdNode.key);if(!child)continue;if(child.children.size>0||child.reachableBindings.length>0||child.bindings.length>0)continue;createdNode.parent.children.delete(createdNode.key)}throw error2}}}function expandBindingInputWithExpanders(key,expanders,options){if(typeof key!=="string"||expanders.length===0)return[key];let layer=options?.layer??EMPTY_COMPILE_FIELDS,candidates=[key];for(let expander of expanders){let nextCandidates=[];for(let input of candidates){let result2=expander({input,layer});if(!result2){nextCandidates.push(input);continue}if(result2.length===0)throw Error(`Keymap binding expander must return at least one key sequence for "${input}"`);for(let expandedInput of result2){if(typeof expandedInput!=="string")throw Error(`Keymap binding expander must return string key sequences for "${input}"`);nextCandidates.push(expandedInput)}}candidates=nextCandidates}return candidates}function parseBindingSequenceWithParsers(key,parsers2,options){if(key.length===0)throw Error("Invalid key sequence: sequence cannot be empty");if(parsers2.length===0)throw Error("No keymap binding parsers are registered");let tokens2=options.tokens??new Map,layer=options.layer??EMPTY_COMPILE_FIELDS,parseObjectKey=options.parseObjectKey,parts=[],usedTokens=new Set,unknownTokens=new Set,index=0;while(index<key.length){let matched=!1;for(let parser of parsers2){let result2=parser({input:key,index,layer,tokens:tokens2,normalizeTokenName:normalizeBindingTokenName,createMatch:createTextKeyMatch,parseObjectKey});if(!result2)continue;if(result2.nextIndex<=index||result2.nextIndex>key.length)throw Error(`Keymap binding parser must advance the input for "${key}" at index ${index}`);parts.push(...result2.parts);for(let tokenName of result2.usedTokens??[])usedTokens.add(tokenName);for(let tokenName of result2.unknownTokens??[])unknownTokens.add(tokenName);index=result2.nextIndex,matched=!0;break}if(!matched)throw Error(`No keymap binding parser handled input at index ${index} in "${key}"`)}return{parts,usedTokens:[...usedTokens],unknownTokens:[...unknownTokens],hasTokenBindings:usedTokens.size>0||unknownTokens.size>0}}function parseSingleKeyPartWithParsers(key,parsers2,options){if(typeof key!=="string")return options.parseObjectKey(key);let{parts}=parseBindingSequenceWithParsers(key,parsers2,options),[part]=parts;if(!part||parts.length!==1)throw Error(`Invalid key "${String(key)}": expected a single key stroke`);return part}function isReactiveMatcher(value){if(!value||typeof value!=="object")return!1;let candidate=value;return typeof candidate.get==="function"&&typeof candidate.subscribe==="function"}class ConditionService{state;notify;constructor(state,notify){this.state=state,this.notify=notify}buildRuntimeMatcher(matcher,source){if(typeof matcher==="function")return{source,match:matcher,cacheable:!1};if(isReactiveMatcher(matcher))return{source,match:()=>matcher.get(),cacheable:!0,subscribe:(onChange)=>matcher.subscribe(onChange)};throw Error(`Keymap ${source} expected a function or a reactive matcher`)}hasNoConditions(target){return target.requires.length===0&&target.matchers.length===0}indexRuntimeMatchable(target){if(target.conditionKeys.length>0)for(let key of target.conditionKeys){let dependents=this.state.conditions.runtimeKeyDependents.get(key);if(dependents){dependents.add(target);continue}this.state.conditions.runtimeKeyDependents.set(key,new Set([target]))}if(!target.hasUnkeyedMatchers)target.matchCacheDirty=!0}unindexRuntimeMatchable(target){if(target.conditionKeys.length===0)return;for(let key of target.conditionKeys){let dependents=this.state.conditions.runtimeKeyDependents.get(key);if(!dependents)continue;if(dependents.delete(target),dependents.size===0)this.state.conditions.runtimeKeyDependents.delete(key)}}invalidateRuntimeConditionKey(name){let dependents=this.state.conditions.runtimeKeyDependents.get(name);if(!dependents)return;for(let target of dependents)target.matchCacheDirty=!0}matchesConditions(target){if(this.hasNoConditions(target))return!0;if(this.hasFreshConditionCache(target))return target.matchCache===!0;let matched=this.matchRequirements(target.requires)&&this.matchesRuntimeMatchers(target);return this.updateConditionCache(target,matched),matched}layerMatchesRuntimeState(layer){if(this.state.layers.layersWithConditions===0||this.hasNoConditions(layer))return!0;return this.matchesConditions(layer)}matchRequirements(requires){if(requires.length===0)return!0;for(let[name,value]of requires)if(!Object.is(this.state.runtime.data[name],value))return!1;return!0}hasFreshConditionCache(target){if(target.hasUnkeyedMatchers)return!1;return target.matchCacheDirty!==!0&&target.matchCache!==void 0}updateConditionCache(target,matched){if(target.hasUnkeyedMatchers)return;target.matchCacheDirty=!1,target.matchCache=matched}matchesRuntimeMatcher(matcher){try{return matcher.match()}catch(error2){return this.notify.emitError("runtime-matcher-error",error2,`[Keymap] Error evaluating runtime matcher from ${matcher.source}:`),!1}}matchesRuntimeMatchers(target){if(target.matchers.length===0)return!0;if(target.matchers.length===1){let[matcher]=target.matchers;return matcher?this.matchesRuntimeMatcher(matcher):!0}for(let matcher of target.matchers)if(!this.matchesRuntimeMatcher(matcher))return!1;return!0}}function createSyncDecision(action,handler){return{[KEY_DISAMBIGUATION_DECISION]:!0,action,handler}}function createDeferredDecision(action){return{[KEY_DEFERRED_DISAMBIGUATION_DECISION]:!0,action}}function isSyncDecision(value){return!!value&&typeof value==="object"&&value[KEY_DISAMBIGUATION_DECISION]===!0}function isDeferredDecision(value){return!!value&&typeof value==="object"&&value[KEY_DEFERRED_DISAMBIGUATION_DECISION]===!0}class DispatchService{state;notify;runtime;activation;conditions;executor;compiler;catalog;layers;eventMatchResolverContext;pendingDisambiguation=null;nextPendingDisambiguationId=0;constructor(state,notify,runtime,activation,conditions,executor,compiler,catalog,layers){this.state=state,this.notify=notify,this.runtime=runtime,this.activation=activation,this.conditions=conditions,this.executor=executor,this.compiler=compiler,this.catalog=catalog,this.layers=layers,this.eventMatchResolverContext={resolveKey:(key)=>{return this.compiler.parseTokenKey(key).match}}}intercept(name,fn,options){if(name==="key"){let keyOptions=options;return this.state.dispatch.keyHooks.register(fn,{priority:keyOptions?.priority??0,release:keyOptions?.release??!1})}let rawOptions=options;return this.state.dispatch.rawHooks.register(fn,{priority:rawOptions?.priority??0})}prependEventMatchResolver(resolver){return this.state.dispatch.eventMatchResolvers.prepend(resolver)}appendEventMatchResolver(resolver){return this.state.dispatch.eventMatchResolvers.append(resolver)}clearEventMatchResolvers(){this.state.dispatch.eventMatchResolvers.clear()}prependDisambiguationResolver(resolver){return this.mutateDisambiguationResolvers(()=>this.state.dispatch.disambiguationResolvers.prepend(resolver),resolver)}appendDisambiguationResolver(resolver){return this.mutateDisambiguationResolvers(()=>this.state.dispatch.disambiguationResolvers.append(resolver),resolver)}clearDisambiguationResolvers(){if(!this.state.dispatch.disambiguationResolvers.has())return;this.notify.runWithStateChangeBatch(()=>{this.state.dispatch.disambiguationResolvers.clear(),this.layers.recompileBindings()})}handlePendingSequenceChange(_previous,_next){if(!this.pendingDisambiguation)return;this.cancelPendingDisambiguation()}handleRawSequence(sequence){let hooks=this.state.dispatch.rawHooks.entries();if(hooks.length===0)return!1;let stopped=!1,context={sequence,stop(){stopped=!0}};for(let hook of hooks){try{hook.listener(context)}catch(error2){this.notify.emitError("raw-intercept-error",error2,"[Keymap] Error in raw intercept listener:")}if(stopped)return!0}return!1}handleKeyEvent(event,release){if(!release)this.cancelPendingDisambiguation();let hooks=this.state.dispatch.keyHooks.entries(),context={event,setData:(name,value)=>{this.runtime.setData(name,value)},getData:(name)=>{return this.runtime.getData(name)},consume:(options)=>{let shouldPreventDefault=options?.preventDefault??!0,shouldStopPropagation=options?.stopPropagation??!0;if(shouldPreventDefault)event.preventDefault();if(shouldStopPropagation)event.stopPropagation()}};for(let hook of hooks){if(hook.release!==release)continue;try{hook.listener(context)}catch(error2){this.notify.emitError("key-intercept-error",error2,"[Keymap] Error in key intercept listener:")}if(event.propagationStopped)return}if(release){this.dispatchReleaseLayers(event);return}this.dispatchLayers(event)}mutateDisambiguationResolvers(register2,resolver){return this.notify.runWithStateChangeBatch(()=>{let hadResolvers=this.state.dispatch.disambiguationResolvers.has(),off=register2();if(!hadResolvers&&this.state.dispatch.disambiguationResolvers.has())this.layers.recompileBindings();return()=>{this.notify.runWithStateChangeBatch(()=>{let hadBeforeRemoval=this.state.dispatch.disambiguationResolvers.has();if(off(),this.state.dispatch.disambiguationResolvers.values().includes(resolver))return;if(hadBeforeRemoval&&!this.state.dispatch.disambiguationResolvers.has())this.layers.recompileBindings()})}})}dispatchReleaseLayers(event){let focused=this.activation.getFocusedTarget(),activeLayers=this.activation.getActiveLayers(focused),hasLayerConditions=this.state.layers.layersWithConditions>0,matchKeys=this.resolveEventMatchKeys(event);layerLoop:for(let layer of activeLayers){if(layer.compiledBindings.length===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;for(let strokeKey of matchKeys){let result2=this.runReleaseBindings(layer,strokeKey,event,focused);if(!result2.handled)continue;if(result2.stop)return;continue layerLoop}}}dispatchLayers(event){let focused=this.activation.getFocusedTarget(),pending=this.activation.ensureValidPendingSequence(),matchKeys=this.resolveEventMatchKeys(event);if(pending){this.dispatchPendingSequence(pending,matchKeys,event,focused);return}let activeLayers=this.activation.getActiveLayers(focused);this.dispatchFromRoot(activeLayers,matchKeys,event,focused)}dispatchPendingSequence(pending,matchKeys,event,focused){let advancedCaptures=[];for(let capture2 of pending.captures){let nextNode=this.getReachableChild(capture2.node,matchKeys,focused);if(!nextNode)continue;advancedCaptures.push({layer:capture2.layer,node:nextNode})}if(advancedCaptures.length===0){this.activation.setPendingSequence(null);return}this.dispatchPendingCapturesFromIndex(advancedCaptures,0,!1,event,focused)}dispatchPendingCapturesFromIndex(advancedCaptures,startIndex,handledExact,event,focused){let hasHandledExact=handledExact;for(let index=startIndex;index<advancedCaptures.length;index+=1){let capture2=advancedCaptures[index];if(!capture2)continue;if(capture2.node.children.size>0){if(hasHandledExact)continue;let continuationCaptures=this.collectPendingCapturesFromAdvanced(advancedCaptures,index);if(this.tryResolvePendingAmbiguity(advancedCaptures,index,continuationCaptures,capture2,event,focused,hasHandledExact))return;this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation();return}let result2=this.runBindings(capture2.layer,capture2.node.bindings,event,focused);if(!result2.handled)continue;if(hasHandledExact=!0,result2.stop){this.activation.setPendingSequence(null);return}}this.activation.setPendingSequence(null)}dispatchFromRoot(activeLayers,matchKeys,event,focused){this.dispatchFromRootAtIndex(activeLayers,0,matchKeys,event,focused)}dispatchFromRootAtIndex(activeLayers,startIndex,matchKeys,event,focused){let hasLayerConditions=this.state.layers.layersWithConditions>0;for(let index=startIndex;index<activeLayers.length;index+=1){let layer=activeLayers[index];if(!layer)continue;if(layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;let nextNode=this.getReachableChild(layer.root,matchKeys,focused);if(!nextNode)continue;if(nextNode.children.size>0){let continuationCaptures=this.collectPendingCapturesFromRoot(activeLayers,index,matchKeys,focused);if(this.tryResolveRootAmbiguity(activeLayers,index,matchKeys,continuationCaptures,layer,nextNode,event,focused))return;this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation();return}let result2=this.runBindings(layer,nextNode.bindings,event,focused);if(!result2.handled)continue;if(result2.stop)return}}tryResolveRootAmbiguity(activeLayers,layerIndex,matchKeys,continuationCaptures,layer,node,event,focused){let applyExact=()=>{if(this.activation.setPendingSequence(null),!this.runBindings(layer,node.bindings,event,focused).stop)this.dispatchFromRootAtIndex(activeLayers,layerIndex+1,matchKeys,event,focused)};return this.tryResolveAmbiguity({event,focused,continuationCaptures,exactBindingsSource:node.bindings,runExact:applyExact})}tryResolvePendingAmbiguity(advancedCaptures,captureIndex,continuationCaptures,capture2,event,focused,handledExact){let applyExact=()=>{this.activation.setPendingSequence(null);let result2=this.runBindings(capture2.layer,capture2.node.bindings,event,focused);if(result2.stop)return;this.dispatchPendingCapturesFromIndex(advancedCaptures,captureIndex+1,handledExact||result2.handled,event,focused)};return this.tryResolveAmbiguity({event,focused,continuationCaptures,exactBindingsSource:capture2.node.bindings,runExact:applyExact})}tryResolveAmbiguity(options){let{event,focused,continuationCaptures,exactBindingsSource,runExact}=options;if(!this.state.dispatch.disambiguationResolvers.has()||continuationCaptures.length===0)return!1;let activeView=this.catalog.getActiveCommandView(focused),exactBindings=this.activation.collectMatchingBindings(exactBindingsSource,focused,activeView);if(!exactBindings.some((binding)=>binding.command!==void 0))return!1;let continueSequence=()=>{this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation()},clear=()=>{this.activation.setPendingSequence(null),event.preventDefault(),event.stopPropagation()},sequence,getSequence=()=>{return sequence??=this.activation.collectSequencePartsFromPending({captures:continuationCaptures}),sequence},decision=this.resolveDisambiguation({event,focused,getSequence,exactBindings,continuationCaptures,activeView});if(!decision)return this.warnUnresolvedAmbiguity(getSequence()),continueSequence(),!0;return this.applySyncDecision(decision,continuationCaptures,runExact,continueSequence,clear,focused,getSequence)}applySyncDecision(decision,continuationCaptures,runExact,continueSequence,clear,focused,getSequence){if(decision.action==="run-exact")return runExact(),!0;if(decision.action==="continue-sequence")return continueSequence(),!0;if(decision.action==="clear")return clear(),!0;return continueSequence(),this.scheduleDeferredDisambiguation(continuationCaptures,decision.handler,focused,getSequence(),(nextDecision)=>{if(!nextDecision)return;if(nextDecision.action==="run-exact"){runExact();return}if(nextDecision.action==="continue-sequence"){continueSequence();return}clear()}),!0}resolveDisambiguation(options){let activation=this.activation,runtime=this.runtime,sequence,exact,continuations,strokePart,ctx={event:options.event,focused:options.focused,get sequence(){return sequence??=cloneKeySequence(options.getSequence()),sequence},get stroke(){let stroke=options.getSequence().at(-1);if(!stroke)throw Error("Disambiguation context expected a non-empty sequence");return strokePart??={...stroke,stroke:cloneKeyStroke(stroke.stroke)},strokePart},get exact(){return exact??=activation.collectActiveBindings(options.exactBindings,options.focused,options.activeView).map((binding)=>({...binding,sequence:cloneKeySequence(binding.sequence)})),exact},get continuations(){return continuations??=activation.getActiveKeysForCaptures(options.continuationCaptures,{includeBindings:!0,includeMetadata:!0}),continuations},getData:(name)=>{return runtime.getData(name)},setData:(name,value)=>{runtime.setData(name,value)},runExact:()=>createSyncDecision("run-exact"),continueSequence:()=>createSyncDecision("continue-sequence"),clear:()=>createSyncDecision("clear"),defer:(run)=>createSyncDecision("defer",run)};for(let resolver of this.state.dispatch.disambiguationResolvers.values()){let result2;try{result2=resolver(ctx)}catch(error2){this.notify.emitError("disambiguation-resolver-error",error2,"[Keymap] Error in disambiguation resolver:");continue}if(result2===void 0)continue;if(isPromiseLike(result2)){this.notify.emitError("invalid-disambiguation-resolver-return",result2,"[Keymap] Disambiguation resolvers must return synchronously; use ctx.defer(...) for async handling");continue}if(!isSyncDecision(result2)){this.notify.emitError("invalid-disambiguation-decision",result2,"[Keymap] Invalid disambiguation decision returned by resolver:");continue}return result2}return}scheduleDeferredDisambiguation(captures,handler,focused,sequence,apply){this.cancelPendingDisambiguation();let controller=new AbortController,pending={id:this.nextPendingDisambiguationId++,controller,captures,apply};this.pendingDisambiguation=pending,queueMicrotask(()=>{this.executeDeferredDisambiguation(pending,handler,focused,sequence)})}executeDeferredDisambiguation(pending,handler,focused,sequence){if(!this.isPendingDisambiguationCurrent(pending))return;let ctx={signal:pending.controller.signal,sequence:cloneKeySequence(sequence),focused,sleep:(ms)=>{return this.sleepWithSignal(ms,pending.controller.signal)},runExact:()=>createDeferredDecision("run-exact"),continueSequence:()=>createDeferredDecision("continue-sequence"),clear:()=>createDeferredDecision("clear")},result2;try{result2=handler(ctx)}catch(error2){if(this.isPendingDisambiguationCurrent(pending))this.notify.emitError("deferred-disambiguation-error",error2,"[Keymap] Error in deferred disambiguation handler:"),this.finishPendingDisambiguation(pending);return}if(isPromiseLike(result2)){result2.then((resolved)=>{this.applyDeferredDisambiguationResult(pending,resolved)}).catch((error2)=>{if(!this.isPendingDisambiguationCurrent(pending))return;this.notify.emitError("deferred-disambiguation-error",error2,"[Keymap] Error in deferred disambiguation handler:"),this.finishPendingDisambiguation(pending)});return}this.applyDeferredDisambiguationResult(pending,result2)}applyDeferredDisambiguationResult(pending,result2){if(!this.isPendingDisambiguationCurrent(pending))return;if(result2!==void 0&&!isDeferredDecision(result2)){this.notify.emitError("invalid-deferred-disambiguation-decision",result2,"[Keymap] Invalid deferred disambiguation decision returned by handler:"),this.finishPendingDisambiguation(pending);return}this.finishPendingDisambiguation(pending),pending.apply(result2)}finishPendingDisambiguation(pending){if(!this.isPendingDisambiguationCurrent(pending))return;this.pendingDisambiguation=null}cancelPendingDisambiguation(){let pending=this.pendingDisambiguation;if(!pending)return;this.pendingDisambiguation=null,pending.controller.abort()}isPendingDisambiguationCurrent(pending){return this.pendingDisambiguation===pending}sleepWithSignal(ms,signal){if(signal.aborted)return Promise.resolve(!1);return new Promise((resolve23)=>{let timeout=setTimeout(()=>{signal.removeEventListener("abort",onAbort),resolve23(!0)},Math.max(0,ms)),onAbort=()=>{clearTimeout(timeout),signal.removeEventListener("abort",onAbort),resolve23(!1)};signal.addEventListener("abort",onAbort,{once:!0})})}warnUnresolvedAmbiguity(sequence){let display=stringifyKeySequence(sequence,{preferDisplay:!0});this.notify.warnOnce(`unresolved-disambiguation:${display}`,"unresolved-disambiguation",{sequence:display},`[Keymap] Ambiguous exact/prefix sequence "${display}" fell back to prefix handling because no disambiguation resolver resolved it`)}collectPendingCapturesFromRoot(activeLayers,startIndex,matchKeys,focused){let captures=[],hasLayerConditions=this.state.layers.layersWithConditions>0;for(let index=startIndex;index<activeLayers.length;index+=1){let layer=activeLayers[index];if(!layer||layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;let nextNode=this.getReachableChild(layer.root,matchKeys,focused);if(!nextNode||nextNode.children.size===0)continue;captures.push({layer,node:nextNode})}return captures}collectPendingCapturesFromAdvanced(advancedCaptures,startIndex){return advancedCaptures.filter((candidate,candidateIndex)=>{return candidateIndex>=startIndex&&candidate.node.children.size>0})}resolveEventMatchKeys(event){let resolvers=this.state.dispatch.eventMatchResolvers.values();if(resolvers.length===0)return[];if(resolvers.length===1)return resolveSingleEventMatchKeys(resolvers[0],event,this.eventMatchResolverContext,this.notify);let keys=[],seen=new Set;for(let resolver of resolvers){let resolved;try{resolved=resolver(event,this.eventMatchResolverContext)}catch(error2){this.notify.emitError("event-match-resolver-error",error2,"[Keymap] Error in event match resolver:");continue}if(!resolved||resolved.length===0)continue;for(let candidate of resolved){if(typeof candidate!=="string"){this.notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:");continue}if(seen.has(candidate))continue;seen.add(candidate),keys.push(candidate)}}return keys}runReleaseBindings(layer,strokeKey,event,focused){let handled=!1;for(let binding of layer.compiledBindings){if(binding.event!=="release")continue;let firstPart=binding.sequence[0];if(!firstPart||firstPart.match!==strokeKey)continue;if(!this.conditions.matchesConditions(binding))continue;if(!this.executor.runBinding(layer,binding,event,focused))continue;if(handled=!0,!binding.fallthrough)return{handled:!0,stop:!0}}return{handled,stop:!1}}getReachableChild(node,matchKeys,focused){for(let strokeKey of matchKeys){let child=node.children.get(strokeKey);if(!child||!this.activation.nodeHasReachableBindings(child,focused))continue;return child}return}runBindings(layer,bindings,event,focused){let handled=!1;for(let binding of bindings){if(!this.conditions.matchesConditions(binding))continue;if(!this.executor.runBinding(layer,binding,event,focused))continue;if(handled=!0,!binding.fallthrough)return{handled:!0,stop:!0}}return{handled,stop:!1}}}function resolveSingleEventMatchKeys(resolver,event,ctx,notify){let resolved;try{resolved=resolver(event,ctx)}catch(error2){return notify.emitError("event-match-resolver-error",error2,"[Keymap] Error in event match resolver:"),[]}if(!resolved||resolved.length===0)return[];if(resolved.length===1){let[candidate]=resolved;if(typeof candidate!=="string")return notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:"),[];return[candidate]}let keys=[],seen=new Set;for(let candidate of resolved){if(typeof candidate!=="string"){notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:");continue}if(seen.has(candidate))continue;seen.add(candidate),keys.push(candidate)}return keys}function registerFieldCompilers(fields,options){let{kind,reservedFields,registeredFields,emitError}=options,entries=Object.entries(fields),registered=[];for(let[name]of entries){if(reservedFields.has(name)){emitError(`reserved-${kind}-field`,{field:name,kind},`Keymap ${kind} field "${name}" is reserved`);continue}if(registeredFields.has(name))emitError(`duplicate-${kind}-field`,{field:name,kind},`Keymap ${kind} field "${name}" is already registered`)}for(let[name,compiler]of entries){if(reservedFields.has(name)||registeredFields.has(name))continue;registeredFields.set(name,compiler),registered.push([name,compiler])}return()=>{for(let[name,compiler]of registered)if(registeredFields.get(name)===compiler)registeredFields.delete(name)}}class EnvironmentService{state;notify;compiler;layers;constructor(state,notify,compiler,layers){this.state=state,this.notify=notify,this.compiler=compiler,this.layers=layers}prependBindingTransformer(transformer){return this.state.environment.bindingTransformers.prepend(transformer)}appendBindingTransformer(transformer){return this.state.environment.bindingTransformers.append(transformer)}clearBindingTransformers(){this.state.environment.bindingTransformers.clear()}prependBindingParser(parser){return this.state.environment.bindingParsers.prepend(parser)}appendBindingParser(parser){return this.state.environment.bindingParsers.append(parser)}clearBindingParsers(){this.state.environment.bindingParsers.clear()}registerToken(token){let normalizedToken;try{normalizedToken=normalizeBindingTokenName(token.name)}catch(error2){return this.notify.emitError("token-name-normalize-error",error2,getErrorMessage(error2,"Failed to register keymap token")),NOOP}if(this.state.environment.tokens.has(normalizedToken))return this.notify.emitError("duplicate-token",{token:normalizedToken},`Keymap token "${normalizedToken}" is already registered`),NOOP;let parsedToken;try{parsedToken=this.compiler.parseTokenKey(token.key)}catch(error2){return this.notify.emitError("token-parse-error",error2,getErrorMessage(error2,`Failed to register keymap token "${normalizedToken}"`)),NOOP}let registeredToken={stroke:parsedToken.stroke,match:parsedToken.match},nextTokens=new Map(this.state.environment.tokens);nextTokens.set(normalizedToken,registeredToken);try{this.layers.applyTokenState(nextTokens)}catch(error2){return this.notify.emitError("token-register-error",error2,getErrorMessage(error2,`Failed to register keymap token "${normalizedToken}"`)),NOOP}return()=>{if(this.state.environment.tokens.get(normalizedToken)!==registeredToken)return;let nextTokens2=new Map(this.state.environment.tokens);nextTokens2.delete(normalizedToken);try{this.layers.applyTokenState(nextTokens2)}catch(error2){this.notify.emitError("token-unregister-error",error2,getErrorMessage(error2,`Failed to unregister keymap token "${normalizedToken}"`))}}}prependBindingExpander(expander){return this.state.environment.bindingExpanders.prepend(expander)}appendBindingExpander(expander){return this.state.environment.bindingExpanders.append(expander)}clearBindingExpanders(){this.state.environment.bindingExpanders.clear()}registerLayerFields(fields){return registerFieldCompilers(fields,{kind:"layer",reservedFields:RESERVED_LAYER_FIELDS,registeredFields:this.state.environment.layerFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}registerBindingFields(fields){return registerFieldCompilers(fields,{kind:"binding",reservedFields:RESERVED_BINDING_FIELDS,registeredFields:this.state.environment.bindingFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}registerCommandFields(fields){return registerFieldCompilers(fields,{kind:"command",reservedFields:RESERVED_COMMAND_FIELDS,registeredFields:this.state.environment.commandFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}}function sortLayers(layers){return[...layers].sort((left,right)=>{let priorityDiff=right.priority-left.priority;if(priorityDiff!==0)return priorityDiff;return right.order-left.order})}function createCommandLookup(commands){if(commands.length===0)return;let lookup=new Map;for(let command of commands)lookup.set(command.name,command);return lookup}function addRegisteredCommandNames(target,commands){for(let command of commands)target.set(command.name,(target.get(command.name)??0)+1)}function removeRegisteredCommandNames(target,commands){for(let command of commands){let count=target.get(command.name);if(!count||count<=1){target.delete(command.name);continue}target.set(command.name,count-1)}}function getSequenceNode(root,sequence){let node=root;for(let part of sequence)if(node=node.children.get(part.match),!node)return;return node}function buildLayerBindingAnalyses(root,compiledBindings){return compiledBindings.map((binding)=>{let node=binding.event==="press"?getSequenceNode(root,binding.sequence):void 0;return{sequence:cloneKeySequence(binding.sequence),command:binding.command,attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough,sourceBinding:snapshotParsedBindingInput(binding.sourceBinding),sourceTarget:binding.sourceTarget,sourceLayerOrder:binding.sourceLayerOrder,sourceBindingIndex:binding.sourceBindingIndex,hasCommandAtSequence:node?node.bindings.some((candidate)=>candidate.command!==void 0):!1,hasContinuations:node?node.children.size>0:!1}})}class LayerService{state;notify;conditions;activation;options;constructor(state,notify,conditions,activation,options){this.state=state,this.notify=notify,this.conditions=conditions,this.activation=activation,this.options=options}registerLayer(layer){return this.notify.runWithStateChangeBatch(()=>{let target=layer.target;if(target&&this.options.host.isTargetDestroyed(target))return this.notify.emitError("destroyed-layer-target",{target},"Cannot register a keymap layer for a destroyed keymap target"),NOOP2;let bindingInputs,requires,matchers,conditionKeys,hasUnkeyedMatchers,compileFields,commands,commandLookup,targetMode;try{targetMode=this.normalizeTargetMode(layer),bindingInputs=snapshotBindingInputs(layer.bindings??[]),commands=!layer.commands||layer.commands.length===0?[]:this.options.commands.normalizeCommands(layer.commands),commandLookup=createCommandLookup(commands),{requires,matchers,conditionKeys,hasUnkeyedMatchers,compileFields}=this.compileLayerRuntimeState(layer)}catch(error2){return this.notify.emitError("register-layer-failed",error2,getErrorMessage(error2,"Failed to register keymap layer")),NOOP2}let order=this.state.core.order++,compiledBindings=this.options.compiler.compileBindings(bindingInputs,this.state.environment.tokens,target,order,compileFields);if(compiledBindings.bindings.length===0&&!compiledBindings.hasTokenBindings&&commands.length===0)return NOOP2;this.runLayerAnalyzers({target,order,commandLookup,bindingInputs,compiledBindings:compiledBindings.bindings,root:compiledBindings.root,hasTokenBindings:compiledBindings.hasTokenBindings});let registeredLayer={order,target,targetMode,priority:layer.priority??0,requires,matchers,conditionKeys,hasUnkeyedMatchers,matchCacheDirty:!0,compileFields,commands,commandLookup,bindingInputs,compiledBindings:compiledBindings.bindings,hasUnkeyedCommands:commands.some((command)=>command.hasUnkeyedMatchers),hasUnkeyedBindings:compiledBindings.bindings.some((binding)=>binding.hasUnkeyedMatchers),hasTokenBindings:compiledBindings.hasTokenBindings,root:compiledBindings.root};if(this.state.layers.layers.add(registeredLayer),registeredLayer.commands.length>0)this.state.layers.layersWithCommands+=1,this.state.commands.commandMetadataVersion+=1,addRegisteredCommandNames(this.state.commands.registeredNames,registeredLayer.commands);if(registeredLayer.requires.length>0||registeredLayer.matchers.length>0)this.state.layers.layersWithConditions+=1;this.connectRuntimeMatchable(registeredLayer);for(let command of registeredLayer.commands)this.connectRuntimeMatchable(command);for(let binding of registeredLayer.compiledBindings)this.connectRuntimeMatchable(binding);if(this.indexLayer(registeredLayer),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(),target){let onTargetDestroy=()=>{this.unregisterLayer(registeredLayer)};registeredLayer.offTargetDestroy=this.options.host.onTargetDestroy(target,onTargetDestroy)}if(registeredLayer.commands.length>0)this.activation.ensureValidPendingSequence();return this.notify.queueStateChange(),()=>{this.unregisterLayer(registeredLayer)}})}applyTokenState(nextTokens){this.notify.runWithStateChangeBatch(()=>{let nextCompilations=new Map;for(let layer of this.state.layers.layers){if(!layer.hasTokenBindings)continue;nextCompilations.set(layer,this.compileLayerBindings(layer,nextTokens))}this.state.environment.tokens=nextTokens;let shouldClearPending=!1;for(let[layer,compilation]of nextCompilations)if(this.applyCompiledBindings(layer,compilation))shouldClearPending=!0;if(shouldClearPending)this.activation.setPendingSequence(null);if(nextCompilations.size>0)this.notify.queueStateChange()})}recompileBindings(){this.notify.runWithStateChangeBatch(()=>{let recompiledLayers=0,shouldClearPending=!1;for(let layer of this.state.layers.layers){if(layer.bindingInputs.length===0)continue;let compilation=this.compileLayerBindings(layer,this.state.environment.tokens);if(this.applyCompiledBindings(layer,compilation))shouldClearPending=!0;recompiledLayers+=1}if(shouldClearPending)this.activation.setPendingSequence(null);if(recompiledLayers>0)this.notify.queueStateChange()})}prependLayerAnalyzer(analyzer){return this.state.layers.layerAnalyzers.prepend(analyzer)}appendLayerAnalyzer(analyzer){return this.state.layers.layerAnalyzers.append(analyzer)}clearLayerAnalyzers(){this.state.layers.layerAnalyzers.clear()}cleanup(){for(let layer of this.state.layers.layers){this.disconnectRuntimeMatchable(layer);for(let command of layer.commands)this.disconnectRuntimeMatchable(command);for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);layer.offTargetDestroy?.(),layer.offTargetDestroy=void 0}}normalizeTargetMode(layer){if(layer.targetMode){if(!layer.target)throw Error(`Keymap targetMode "${layer.targetMode}" requires a target`);return layer.targetMode}return layer.target?"focus-within":void 0}runLayerAnalyzers(options){let analyzers=this.state.layers.layerAnalyzers.values();if(analyzers.length===0)return;let bindings=buildLayerBindingAnalyses(options.root,options.compiledBindings),ctx={target:options.target,order:options.order,bindingInputs:options.bindingInputs,bindings,hasTokenBindings:options.hasTokenBindings,checkCommandResolution:(command)=>{return this.options.commands.getCommandResolutionStatus(command,options.commandLookup)},warn:(code,warning,message)=>{this.notify.emitWarning(code,warning,message)},warnOnce:(key,code,warning,message)=>{this.notify.warnOnce(key,code,warning,message)},error:(code,error2,message)=>{this.notify.emitError(code,error2,message)}};for(let analyzer of analyzers)try{analyzer(ctx)}catch(error2){this.notify.emitError("layer-analyzer-error",error2,"[Keymap] Error in layer analyzer:")}}compileLayerRuntimeState(layer){let mergedRequires={},matchers=[],compileFields=Object.create(null),conditionKeys=new Set,hasUnkeyedMatchers=!1;for(let[fieldName,value]of Object.entries(layer)){if(RESERVED_LAYER_FIELDS.has(fieldName))continue;if(value===void 0)continue;compileFields[fieldName]=snapshotDataValue(value);let compiler=this.state.environment.layerFields.get(fieldName);if(!compiler){this.options.warnUnknownField("layer",fieldName);continue}compiler(value,{require:(name,requiredValue)=>{mergeRequirement(mergedRequires,name,requiredValue,`field ${fieldName}`),conditionKeys.add(name)},activeWhen:(matcher)=>{let runtimeMatcher=this.conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)hasUnkeyedMatchers=!0;matchers.push(runtimeMatcher)}})}return{requires:Object.entries(mergedRequires),matchers,conditionKeys:[...conditionKeys],hasUnkeyedMatchers,compileFields:Object.keys(compileFields).length>0?Object.freeze(compileFields):void 0}}compileLayerBindings(layer,tokens2){return this.options.compiler.compileBindings(layer.bindingInputs,tokens2,layer.target,layer.order,layer.compileFields)}applyCompiledBindings(layer,compilation){this.runLayerAnalyzers({target:layer.target,order:layer.order,commandLookup:layer.commandLookup,bindingInputs:layer.bindingInputs,compiledBindings:compilation.bindings,root:compilation.root,hasTokenBindings:compilation.hasTokenBindings});for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);layer.root=compilation.root,layer.compiledBindings=compilation.bindings,layer.hasUnkeyedBindings=compilation.bindings.some((binding)=>binding.hasUnkeyedMatchers),layer.hasTokenBindings=compilation.hasTokenBindings;for(let binding of layer.compiledBindings)this.connectRuntimeMatchable(binding);return this.state.projection.pendingSequence?.captures.some((capture2)=>capture2.layer===layer)??!1}indexLayer(layer){this.state.layers.sortedLayers=sortLayers([...this.state.layers.sortedLayers,layer]),this.state.layers.activeLayersVersion+=1}removeLayerFromIndex(layer){this.state.layers.sortedLayers=this.state.layers.sortedLayers.filter((candidate)=>candidate!==layer),this.state.layers.activeLayersVersion+=1}unregisterLayer(layer){this.notify.runWithStateChangeBatch(()=>{if(!this.state.layers.layers.delete(layer))return;if(layer.requires.length>0||layer.matchers.length>0)this.state.layers.layersWithConditions-=1;if(layer.commands.length>0)this.state.layers.layersWithCommands-=1,this.state.commands.commandMetadataVersion+=1,removeRegisteredCommandNames(this.state.commands.registeredNames,layer.commands);this.disconnectRuntimeMatchable(layer);for(let command of layer.commands)this.disconnectRuntimeMatchable(command);for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);if(this.removeLayerFromIndex(layer),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(),layer.offTargetDestroy?.(),layer.offTargetDestroy=void 0,this.state.projection.pendingSequence?.captures.some((capture2)=>capture2.layer===layer))this.activation.setPendingSequence(null);else if(layer.commands.length>0&&!this.options.host.isDestroyed)this.activation.ensureValidPendingSequence();this.notify.queueStateChange()})}connectRuntimeMatchable(target){this.attachReactiveMatchers(target),this.conditions.indexRuntimeMatchable(target)}disconnectRuntimeMatchable(target){this.detachReactiveMatchers(target),this.conditions.unindexRuntimeMatchable(target)}attachReactiveMatchers(target){for(let matcher of target.matchers){if(!matcher.subscribe)continue;try{matcher.dispose=matcher.subscribe(()=>{if(target.matchCacheDirty=!0,!this.activation.hasPendingSequenceState()){this.notify.queueStateChange();return}this.notify.runWithStateChangeBatch(()=>{this.activation.revalidatePendingSequenceIfNeeded(),this.notify.queueStateChange()})})}catch(error2){this.notify.emitError("reactive-matcher-subscribe-error",error2,getErrorMessage(error2,`Failed to subscribe to reactive matcher from ${matcher.source}`))}}}detachReactiveMatchers(target){for(let matcher of target.matchers){if(!matcher.dispose)continue;try{matcher.dispose()}catch(error2){this.notify.emitError("reactive-matcher-dispose-error",error2,getErrorMessage(error2,`Failed to dispose reactive matcher from ${matcher.source}`))}matcher.dispose=void 0}}}class Emitter2{onError;listeners=Object.create(null);constructor(onError){this.onError=onError}hook(name,listener){let current=this.listeners[name]??[];return this.listeners[name]=[...current,listener],()=>{let current2=this.listeners[name];if(!current2||current2.length===0)return;let next=current2.filter((candidate)=>candidate!==listener);if(next.length===0){delete this.listeners[name];return}this.listeners[name]=next}}has(name){return(this.listeners[name]?.length??0)>0}off(name,listener){let current=this.listeners[name];if(!current||current.length===0)return;let next=current.filter((candidate)=>candidate!==listener);if(next.length===current.length)return;if(next.length===0){delete this.listeners[name];return}this.listeners[name]=next}clear(){this.listeners=Object.create(null)}emit(name,...args){let listeners2=this.listeners[name];if(!listeners2||listeners2.length===0)return;for(let listener of listeners2)try{if(args.length===0)listener();else listener(args[0])}catch(error2){this.onError(name,error2)}}}class NotificationService{state;events;hooks;constructor(state,events,hooks){this.state=state,this.events=events,this.hooks=hooks}runWithStateChangeBatch(fn){this.state.notify.stateChangeDepth+=1;try{return fn()}finally{if(this.state.notify.stateChangeDepth-=1,this.state.notify.stateChangeDepth===0)this.flushStateChange()}}queueStateChange(){if(this.state.notify.derivedStateVersion+=1,!this.hooks.has("state"))return;if(this.state.notify.stateChangePending=!0,this.state.notify.stateChangeDepth===0&&!this.state.notify.flushingStateChange)this.flushStateChange()}emitWarning(code,warning,message){if(!this.events.has("warning")){let consoleMessage=`[${code}] ${message}`;if(warning instanceof Error)console.warn(consoleMessage,warning);else console.warn(consoleMessage);return}this.events.emit("warning",{code,message,warning})}emitError(code,error2,message){if(!this.events.has("error")){let consoleMessage=`[${code}] ${message}`;if(error2 instanceof Error)console.error(consoleMessage,error2);else console.error(consoleMessage);return}this.events.emit("error",{code,message,error:error2})}reportListenerError(name,error2){if(name==="state"){this.emitError("state-listener-error",error2,"[Keymap] Error in state listener:");return}if(name==="pendingSequence"){this.emitError("pending-sequence-listener-error",error2,"[Keymap] Error in pending sequence listener:");return}}warnOnce(key,code,warning,message){if(this.state.notify.usedWarningKeys.has(key))return;this.state.notify.usedWarningKeys.add(key),this.emitWarning(code,warning,message)}flushStateChange(){if(!this.state.notify.stateChangePending||this.state.notify.stateChangeDepth>0||this.state.notify.flushingStateChange)return;this.state.notify.flushingStateChange=!0;try{let iterations=0;while(this.state.notify.stateChangePending&&this.state.notify.stateChangeDepth===0){if(iterations>=MAX_STATE_CHANGE_FLUSH_ITERATIONS){this.state.notify.stateChangePending=!1,this.emitError("state-change-feedback-loop",{iterations:MAX_STATE_CHANGE_FLUSH_ITERATIONS},`[Keymap] Possible infinite state listener feedback loop detected after ${MAX_STATE_CHANGE_FLUSH_ITERATIONS} iterations; pending state notifications were dropped`);break}iterations+=1,this.state.notify.stateChangePending=!1,this.hooks.emit("state")}}finally{this.state.notify.flushingStateChange=!1}}}class RuntimeService{state;notify;conditions;activation;constructor(state,notify,conditions,activation){this.state=state,this.notify=notify,this.conditions=conditions,this.activation=activation}getData(name){return this.state.runtime.data[name]}setData(name,value){this.notify.runWithStateChangeBatch(()=>{if(value===void 0){if(!(name in this.state.runtime.data))return;delete this.state.runtime.data[name],this.state.runtime.dataVersion+=1,this.conditions.invalidateRuntimeConditionKey(name),this.activation.ensureValidPendingSequence(),this.notify.queueStateChange();return}if(Object.is(this.state.runtime.data[name],value))return;this.state.runtime.data[name]=value,this.state.runtime.dataVersion+=1,this.conditions.invalidateRuntimeConditionKey(name),this.activation.ensureValidPendingSequence(),this.notify.queueStateChange()})}getReadonlyData(){if(this.state.runtime.readonlyDataVersion===this.state.runtime.dataVersion)return this.state.runtime.readonlyData;return this.state.runtime.readonlyData=Object.freeze({...this.state.runtime.data}),this.state.runtime.readonlyDataVersion=this.state.runtime.dataVersion,this.state.runtime.readonlyData}}class CopyOnWriteRegistry{items=[];getItems(){return this.items}setItems(items){this.items=items}removeItem(value){let current=this.items;if(current.length===0)return!1;let next=current.filter((candidate)=>candidate!==value);if(next.length===current.length)return!1;return this.items=next,!0}has(){return this.items.length>0}clear(){this.items=[]}}function createKeymapState(){return{core:{order:0},environment:{tokens:new Map,layerFields:new Map,bindingExpanders:new OrderedRegistry,bindingParsers:new OrderedRegistry,bindingTransformers:new OrderedRegistry,bindingFields:new Map,commandFields:new Map},dispatch:{eventMatchResolvers:new OrderedRegistry,disambiguationResolvers:new OrderedRegistry,keyHooks:new PriorityRegistry,rawHooks:new PriorityRegistry},layers:{layers:new Set,sortedLayers:[],activeLayersVersion:0,activeLayersCacheVersion:-1,activeLayersCacheFocused:void 0,activeLayersCache:[],layersWithConditions:0,layersWithCommands:0,layerAnalyzers:new OrderedRegistry},commands:{commandMetadataVersion:0,registeredNames:new Map,commandResolvers:new OrderedRegistry,activeCommandViewVersion:-1,activeCommandView:void 0,registeredCommandViewVersion:-1,registeredCommandView:void 0,registeredCommandEntriesCacheVersion:-1,registeredCommandEntriesCache:[]},projection:{pendingSequence:null,pendingSequenceCacheVersion:-1,pendingSequenceCache:[],activeKeysPlainCacheVersion:-1,activeKeysPlainCache:[],activeKeysBindingsCacheVersion:-1,activeKeysBindingsCache:[],activeKeysMetadataCacheVersion:-1,activeKeysMetadataCache:[],activeKeysBindingsAndMetadataCacheVersion:-1,activeKeysBindingsAndMetadataCache:[]},conditions:{runtimeKeyDependents:new Map},runtime:{data:{},dataVersion:0,readonlyDataVersion:-1,readonlyData:EMPTY_DATA},notify:{derivedStateVersion:0,stateChangeDepth:0,stateChangePending:!1,flushingStateChange:!1,usedWarningKeys:new Set}}}function getKeyMatchKey(input){return resolveKeyMatch(input)}class Keymap{host;state=createKeymapState();cleanedUp=!1;resources=new Map;cleanupListeners=[];events=new Emitter2(()=>{});hooks;notify;activation;runtime;conditions;catalog;executor;compiler;dispatch;layers;environment;keypressListener;keyreleaseListener;rawListener;focusedTargetListener;constructor(host){if(this.host=host,host.isDestroyed)throw Error("Cannot create a keymap for a destroyed host");if(this.hooks=new Emitter2((name,error2)=>{this.notify.reportListenerError(name,error2)}),this.notify=new NotificationService(this.state,this.events,this.hooks),this.conditions=new ConditionService(this.state,this.notify),this.catalog=new CommandCatalogService(this.state,this.host,this.notify,this.conditions,{onCommandResolversChanged:()=>{this.activation.ensureValidPendingSequence()}}),this.activation=new ActivationService(this.state,this.host,this.hooks,this.notify,this.conditions,this.catalog,{onPendingSequenceChanged:(previous,next)=>{this.dispatch?.handlePendingSequenceChange(previous,next)}}),this.runtime=new RuntimeService(this.state,this.notify,this.conditions,this.activation),this.executor=new CommandExecutorService(this.notify,this.runtime,this.activation,this.catalog,{keymap:this,createCommandEvent:()=>this.host.createCommandEvent()}),this.compiler=new CompilerService(this.state,this.notify,this.conditions,{warnUnknownField:(kind,fieldName)=>{this.warnUnknownField(kind,fieldName)},warnUnknownToken:(token,sequence)=>{this.warnUnknownToken(token,sequence)}}),this.layers=new LayerService(this.state,this.notify,this.conditions,this.activation,{compiler:this.compiler,commands:this.catalog,host:this.host,warnUnknownField:(kind,fieldName)=>{this.warnUnknownField(kind,fieldName)}}),this.environment=new EnvironmentService(this.state,this.notify,this.compiler,this.layers),this.dispatch=new DispatchService(this.state,this.notify,this.runtime,this.activation,this.conditions,this.executor,this.compiler,this.catalog,this.layers),this.keypressListener=(event)=>{this.dispatch.handleKeyEvent(event,!1)},this.keyreleaseListener=(event)=>{this.dispatch.handleKeyEvent(event,!0)},this.rawListener=(sequence)=>{return this.dispatch.handleRawSequence(sequence)},this.focusedTargetListener=(focused)=>{this.handleFocusedTargetChange(focused)},this.cleanupListeners.push(this.host.onKeyPress(this.keypressListener)),this.cleanupListeners.push(this.host.onKeyRelease(this.keyreleaseListener)),this.host.onRawInput)this.cleanupListeners.push(this.host.onRawInput(this.rawListener));if(this.cleanupListeners.push(this.host.onFocusChange(this.focusedTargetListener)),this.host.onDestroy)this.cleanupListeners.push(this.host.onDestroy(()=>{this.cleanup()}))}cleanup(){if(this.cleanedUp)return;this.cleanedUp=!0,this.activation.setPendingSequence(null);for(let resource of this.resources.values())resource.dispose();this.resources.clear(),this.layers.cleanup();for(let cleanupListener of this.cleanupListeners.splice(0))cleanupListener()}setData(name,value){this.runtime.setData(name,value)}getData(name){return this.runtime.getData(name)}hasPendingSequence(){return this.activation.ensureValidPendingSequence()!==void 0}getPendingSequence(){return this.activation.getPendingSequence()}createKeyMatcher(key){let match=this.compiler.parseTokenKey(key).match;return(input)=>{if(!input)return!1;return getKeyMatchKey(input)===match}}clearPendingSequence(){this.activation.setPendingSequence(null)}popPendingSequence(){return this.activation.popPendingSequence()}getActiveKeys(options){return this.activation.getActiveKeys(options)}getCommands(query2){return this.catalog.getCommands(query2)}getCommandEntries(query2){return this.catalog.getCommandEntries(query2)}normalizeCommandName(name){return normalizeCommandName(name)}normalizeBindings(bindings){return normalizeBindingInputs(bindings)}acquireResource(key,setup){if(this.cleanedUp||this.host.isDestroyed)throw Error("Cannot use a keymap after its host was destroyed");let existing=this.resources.get(key);if(existing)return existing.count+=1,()=>{this.releaseResource(key,existing)};let resource={count:1,dispose:setup()};return this.resources.set(key,resource),()=>{this.releaseResource(key,resource)}}runCommand(cmd,options){return this.executor.runCommand(cmd,options)}dispatchCommand(cmd,options){return this.executor.dispatchCommand(cmd,options)}on(name,fn){if(name==="warning")return this.events.hook(name,fn);if(name==="error")return this.events.hook(name,fn);return this.hooks.hook(name,fn)}intercept(name,fn,options){if(name==="key")return this.dispatch.intercept(name,fn,options);return this.dispatch.intercept(name,fn,options)}registerLayer(layer){return this.layers.registerLayer(layer)}registerLayerFields(fields){return this.environment.registerLayerFields(fields)}prependBindingTransformer(transformer){return this.environment.prependBindingTransformer(transformer)}appendBindingTransformer(transformer){return this.environment.appendBindingTransformer(transformer)}clearBindingTransformers(){this.environment.clearBindingTransformers()}prependBindingParser(parser){return this.environment.prependBindingParser(parser)}appendBindingParser(parser){return this.environment.appendBindingParser(parser)}clearBindingParsers(){this.environment.clearBindingParsers()}registerToken(token){return this.environment.registerToken(token)}prependBindingExpander(expander){return this.environment.prependBindingExpander(expander)}appendBindingExpander(expander){return this.environment.appendBindingExpander(expander)}clearBindingExpanders(){this.environment.clearBindingExpanders()}registerBindingFields(fields){return this.environment.registerBindingFields(fields)}registerCommandFields(fields){return this.environment.registerCommandFields(fields)}prependCommandResolver(resolver){return this.catalog.prependCommandResolver(resolver)}appendCommandResolver(resolver){return this.catalog.appendCommandResolver(resolver)}clearCommandResolvers(){this.catalog.clearCommandResolvers()}prependLayerAnalyzer(analyzer){return this.layers.prependLayerAnalyzer(analyzer)}appendLayerAnalyzer(analyzer){return this.layers.appendLayerAnalyzer(analyzer)}clearLayerAnalyzers(){this.layers.clearLayerAnalyzers()}prependEventMatchResolver(resolver){return this.dispatch.prependEventMatchResolver(resolver)}appendEventMatchResolver(resolver){return this.dispatch.appendEventMatchResolver(resolver)}clearEventMatchResolvers(){this.dispatch.clearEventMatchResolvers()}prependDisambiguationResolver(resolver){return this.dispatch.prependDisambiguationResolver(resolver)}appendDisambiguationResolver(resolver){return this.dispatch.appendDisambiguationResolver(resolver)}clearDisambiguationResolvers(){this.dispatch.clearDisambiguationResolvers()}handleFocusedTargetChange(_focused){this.notify.runWithStateChangeBatch(()=>{this.activation.setPendingSequence(null),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(_focused),this.notify.queueStateChange()})}warnUnknownField(kind,fieldName){this.notify.warnOnce(`${kind}:${fieldName}`,`unknown-${kind}-field`,{field:fieldName,kind},`[Keymap] Unknown ${kind} field "${fieldName}" was ignored`)}warnUnknownToken(token,sequence){this.notify.warnOnce(`token:${token}`,"unknown-token",{token,sequence},`[Keymap] Unknown token "${token}" in key sequence "${sequence}" was ignored`)}releaseResource(key,resource){if(this.resources.get(key)!==resource)return;if(resource.count-=1,resource.count>0)return;resource.dispose(),this.resources.delete(key)}}function registerEscapeClearsPendingSequence(keymap,options){let shouldPreventDefault=options?.preventDefault??!0;return keymap.intercept("key",({event,consume})=>{if(event.name!=="escape")return;if(!keymap.hasPendingSequence())return;if(keymap.clearPendingSequence(),shouldPreventDefault)consume()},{priority:options?.priority??0})}function registerLeader(keymap,options){return keymap.registerToken({name:options.name??"<leader>",key:options.trigger})}var RESERVED_COMMAND_FIELDS,RESERVED_BINDING_FIELDS,RESERVED_LAYER_FIELDS,DEFAULT_COMMAND_SEARCH_FIELDS,SNAPSHOT_COMMAND_METADATA_OPTIONS,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS,EMPTY_COMMAND_FIELDS,EMPTY_COMPILE_FIELDS,EMPTY_REQUIRES,EMPTY_MATCHERS,EMPTY_CONDITION_KEYS,KEY_DISAMBIGUATION_DECISION,KEY_DEFERRED_DISAMBIGUATION_DECISION,NOOP=()=>{},NOOP2=()=>{},MAX_STATE_CHANGE_FLUSH_ITERATIONS=1000,OrderedRegistry,PriorityRegistry,EMPTY_DATA,EMPTY_FIELDS;var init_addons=__esm(()=>{RESERVED_COMMAND_FIELDS=new Set(["name","run"]),RESERVED_BINDING_FIELDS=new Set(["key","cmd","event","preventDefault","fallthrough"]),RESERVED_LAYER_FIELDS=new Set(["target","targetMode","priority","bindings","commands"]);DEFAULT_COMMAND_SEARCH_FIELDS=["name"],SNAPSHOT_COMMAND_METADATA_OPTIONS=Object.freeze({deep:!0,preserveNonPlainObjects:!0}),SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS=Object.freeze({deep:!0,freeze:!0,preserveNonPlainObjects:!0}),EMPTY_COMMAND_FIELDS=Object.freeze({});EMPTY_COMPILE_FIELDS=Object.freeze({}),EMPTY_REQUIRES=[],EMPTY_MATCHERS=[],EMPTY_CONDITION_KEYS=[];KEY_DISAMBIGUATION_DECISION=Symbol("keymap-disambiguation-decision"),KEY_DEFERRED_DISAMBIGUATION_DECISION=Symbol("keymap-deferred-disambiguation-decision");OrderedRegistry=class OrderedRegistry extends CopyOnWriteRegistry{append(value){return this.setItems([...this.getItems(),value]),()=>{this.remove(value)}}prepend(value){return this.setItems([value,...this.getItems()]),()=>{this.remove(value)}}remove(value){return this.removeItem(value)}values(){return this.getItems()}};PriorityRegistry=class PriorityRegistry extends CopyOnWriteRegistry{order=0;register(listener,options){let registered={...options,listener,order:this.order++};return this.setItems([...this.getItems(),registered].sort((left,right)=>{let priorityDiff=right.priority-left.priority;if(priorityDiff!==0)return priorityDiff;return left.order-right.order})),()=>{this.removeItem(registered)}}entries(){return this.getItems()}};EMPTY_DATA=Object.freeze({});EMPTY_FIELDS=Object.freeze({})});function getFocusedTargetIfAvailable2(host){if(host.isDestroyed)return null;return host.getFocusedTarget()}function forEachActivationTarget2(host,focused,visit){let current=focused??host.rootTarget,isFocusedTarget=focused!==null;while(current){if(visit(current,isFocusedTarget)===!1)return;current=host.getParentTarget(current),isFocusedTarget=!1}}function getActivationPath2(host,focused){let path6=new Set;return forEachActivationTarget2(host,focused,(current)=>{path6.add(current)}),path6}function getActiveLayersForFocused2(state,host,focused){if(state.activeLayersCacheVersion===state.activeLayersVersion&&state.activeLayersCacheFocused===focused)return state.activeLayersCache;let activeLayers=[],activationPath=getActivationPath2(host,focused);for(let layer of state.sortedLayers)if(isLayerActiveForFocused2(host,layer,focused,activationPath))activeLayers.push(layer);return state.activeLayersCacheVersion=state.activeLayersVersion,state.activeLayersCacheFocused=focused,state.activeLayersCache=activeLayers,activeLayers}function invalidateCachedActiveLayers2(state){state.activeLayersCacheVersion=-1,state.activeLayersCacheFocused=void 0,state.activeLayersCache=[]}function isLayerActiveForFocused2(host,layer,focused,activationPath=getActivationPath2(host,focused)){let target=layer.target;if(!target)return!0;if(host.isTargetDestroyed(target))return!1;if(layer.targetMode==="focus")return target===focused;return activationPath.has(target)}function normalizeBindingTokenName2(token){let normalized=token.trim().toLowerCase();if(!normalized)throw Error("Invalid keymap token: token cannot be empty");return normalized}function normalizeKeyName2(name){let normalized=name.trim().toLowerCase();if(!normalized)throw Error("Invalid key name: key name cannot be empty");return normalized}function normalizeKeyStroke2(input){return{name:normalizeKeyName2(input.name),ctrl:input.ctrl??!1,shift:input.shift??!1,meta:input.meta??!1,super:input.super??!1,hyper:input.hyper||void 0}}function cloneKeyStroke2(stroke){return{name:stroke.name,ctrl:stroke.ctrl,shift:stroke.shift,meta:stroke.meta,super:stroke.super,hyper:stroke.hyper||void 0}}function createKeySequencePart2(input,options){let stroke=cloneKeyStroke2(normalizeKeyStroke2(input));return{stroke,display:options?.display??stringifyCanonicalStroke2(stroke),match:options?.match??createKeyMatch2(stroke),tokenName:options?.tokenName?normalizeBindingTokenName2(options.tokenName):void 0}}function cloneKeySequencePart2(part){return{stroke:cloneKeyStroke2(part.stroke),display:part.display,match:part.match,tokenName:part.tokenName}}function cloneKeySequence2(parts){return parts.map((part)=>cloneKeySequencePart2(part))}function resolveKeyMatch2(input){if("match"in input)return input.match;if("stroke"in input)return createKeyMatch2(input.stroke);return createKeyMatch2(input)}function createKeyMatch2(input){return`key:${buildKeyMatchId2(normalizeKeyStroke2(input))}`}function createTextKeyMatch2(id){let normalized=id.trim();if(!normalized)throw Error("Invalid keymap match id: id cannot be empty");return`text:${normalized}`}function stringifyKeyStroke2(input,options){if("stroke"in input){if(options?.preferDisplay&&input.display)return input.display;return stringifyCanonicalStroke2(input.stroke)}return stringifyCanonicalStroke2(normalizeKeyStroke2(input))}function stringifyKeySequence2(input,options){return input.map((part)=>stringifyKeyStroke2(part,options)).join("")}function stringifyCanonicalStroke2(stroke){let parts=[];if(stroke.ctrl)parts.push("ctrl");if(stroke.shift)parts.push("shift");if(stroke.meta)parts.push("meta");if(stroke.super)parts.push("super");if(stroke.hyper)parts.push("hyper");return parts.push(stroke.name==="return"?"enter":stroke.name),parts.join("+")}function buildKeyMatchId2(stroke){return`${stroke.name}:${stroke.ctrl?1:0}:${stroke.shift?1:0}:${stroke.meta?1:0}:${stroke.super?1:0}:${stroke.hyper?1:0}`}function getLiveHost2(host){if(host.isDestroyed)throw Error("Cannot use a keymap after its host was destroyed");return host}function isSamePendingSequence2(current,next){if(current===next)return!0;if(!current||!next)return!1;if(current.captures.length!==next.captures.length)return!1;for(let index=0;index<current.captures.length;index+=1){let left=current.captures[index],right=next.captures[index];if(!left||!right||left.layer!==right.layer||left.node!==right.node)return!1}return!0}class ActivationService2{state;host;hooks;notify;conditions;catalog;options;constructor(state,host,hooks,notify,conditions,catalog,options={}){this.state=state,this.host=host,this.hooks=hooks,this.notify=notify,this.conditions=conditions,this.catalog=catalog,this.options=options}getFocusedTarget(){return getLiveHost2(this.host).getFocusedTarget()}getFocusedTargetIfAvailable(){return getFocusedTargetIfAvailable2(this.host)}setPendingSequence(next){let previous=this.state.projection.pendingSequence;if(isSamePendingSequence2(previous,next))return;this.state.projection.pendingSequence=next,this.options.onPendingSequenceChanged?.(previous,next),this.invalidateCaches(),this.notifyPendingSequenceChange(),this.notify.queueStateChange()}ensureValidPendingSequence(){let pending=this.state.projection.pendingSequence;if(!pending)return;let focused=this.getFocusedTarget(),captures=pending.captures.filter((capture2)=>{return this.state.layers.layers.has(capture2.layer)&&this.isLayerActiveForFocused(capture2.layer,focused)&&this.conditions.layerMatchesRuntimeState(capture2.layer)&&this.nodeHasReachableBindings(capture2.node,focused)});if(captures.length===0){this.setPendingSequence(null);return}if(captures.length!==pending.captures.length)this.setPendingSequence({captures});return this.state.projection.pendingSequence??void 0}revalidatePendingSequenceIfNeeded(){if(this.host.isDestroyed||!this.state.projection.pendingSequence)return;this.ensureValidPendingSequence()}hasPendingSequenceState(){return!this.host.isDestroyed&&this.state.projection.pendingSequence!==null}getPendingSequence(){let projections=this.state.projection,derivedStateVersion=this.state.notify.derivedStateVersion;if(projections.pendingSequenceCacheVersion===derivedStateVersion)return projections.pendingSequenceCache;let pending=this.ensureValidPendingSequence(),canUseCache=!pending||pending.captures.every((capture2)=>this.layerCanCacheActiveKeys(capture2.layer)),sequence=pending?this.collectSequencePartsFromPending(pending):[];if(canUseCache)projections.pendingSequenceCacheVersion=derivedStateVersion,projections.pendingSequenceCache=sequence;return sequence}popPendingSequence(){let pending=this.ensureValidPendingSequence();if(!pending)return!1;let firstCapture=pending.captures[0];if(!firstCapture||firstCapture.node.depth<=1)return this.setPendingSequence(null),!0;let nextCaptures=[];for(let capture2 of pending.captures){let parent=capture2.node.parent;if(!parent||!parent.stroke)continue;nextCaptures.push({layer:capture2.layer,node:parent})}if(nextCaptures.length===0)return this.setPendingSequence(null),!0;return this.setPendingSequence({captures:nextCaptures}),!0}getActiveKeys(options){let projections=this.state.projection,derivedStateVersion=this.state.notify.derivedStateVersion,includeBindings=options?.includeBindings===!0,includeMetadata=options?.includeMetadata===!0;if(includeBindings){if(includeMetadata){if(projections.activeKeysBindingsAndMetadataCacheVersion===derivedStateVersion)return projections.activeKeysBindingsAndMetadataCache}else if(projections.activeKeysBindingsCacheVersion===derivedStateVersion)return projections.activeKeysBindingsCache}else if(includeMetadata){if(projections.activeKeysMetadataCacheVersion===derivedStateVersion)return projections.activeKeysMetadataCache}else if(projections.activeKeysPlainCacheVersion===derivedStateVersion)return projections.activeKeysPlainCache;let focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused),pending=this.ensureValidPendingSequence(),activeLayers=pending?[]:this.getActiveLayers(focused),canUseCache=pending?pending.captures.every((capture2)=>this.layerCanCacheActiveKeys(capture2.layer)):this.activeLayersCanCacheActiveKeys(activeLayers),activeKeys=pending?this.collectActiveKeysFromPending(pending.captures,includeBindings,includeMetadata,focused,activeView):this.collectActiveKeysAtRoot(activeLayers,includeBindings,includeMetadata,focused,activeView);if(!canUseCache)return activeKeys;if(includeBindings)if(includeMetadata)projections.activeKeysBindingsAndMetadataCacheVersion=derivedStateVersion,projections.activeKeysBindingsAndMetadataCache=activeKeys;else projections.activeKeysBindingsCacheVersion=derivedStateVersion,projections.activeKeysBindingsCache=activeKeys;else if(includeMetadata)projections.activeKeysMetadataCacheVersion=derivedStateVersion,projections.activeKeysMetadataCache=activeKeys;else projections.activeKeysPlainCacheVersion=derivedStateVersion,projections.activeKeysPlainCache=activeKeys;return activeKeys}getActiveKeysForCaptures(captures,options){let includeBindings=options?.includeBindings===!0,includeMetadata=options?.includeMetadata===!0,focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused);return this.collectActiveKeysFromPending(captures,includeBindings,includeMetadata,focused,activeView)}nodeHasReachableBindings(node,focused){return this.hasMatchingBindings(node.reachableBindings,focused,this.catalog.getActiveCommandView(focused))}getActiveLayers(focused){return getActiveLayersForFocused2(this.state.layers,this.host,focused)}refreshActiveLayers(focused=this.getFocusedTargetIfAvailable()){getActiveLayersForFocused2(this.state.layers,this.host,focused)}invalidateActiveLayers(){invalidateCachedActiveLayers2(this.state.layers)}isLayerActiveForFocused(layer,focused){return isLayerActiveForFocused2(this.host,layer,focused)}layerCanCacheActiveKeys(layer){return!layer.hasUnkeyedMatchers&&!layer.hasUnkeyedCommands&&!layer.hasUnkeyedBindings}activeLayersCanCacheActiveKeys(activeLayers){for(let layer of activeLayers)if(!this.layerCanCacheActiveKeys(layer))return!1;return!0}collectNodesFromNode(node){let nodes=[],current=node;while(current&¤t.stroke)nodes.push(current),current=current.parent;return nodes.reverse(),nodes}collectSequencePartsFromPending(pending){let focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused),paths=pending.captures.map((capture2)=>this.collectNodesFromNode(capture2.node)),firstPath=paths[0];if(!firstPath||firstPath.length===0)return[];let parts=[];for(let index=0;index<firstPath.length;index+=1){let firstNode=firstPath[index];if(!firstNode?.stroke||firstNode.match===null)continue;let display,tokenName,hasDisplayConflict=!1,hasTokenConflict=!1;for(let path6 of paths){let node=path6[index];if(!node)continue;let presentation=this.getNodePresentation(node,focused,activeView);if(display===void 0){display=presentation.display,tokenName=presentation.tokenName;continue}if(!hasDisplayConflict&&display!==presentation.display)hasDisplayConflict=!0;if(!hasTokenConflict&&tokenName!==presentation.tokenName)hasTokenConflict=!0}if(display===void 0||hasDisplayConflict)display=stringifyKeyStroke2(firstNode.stroke);if(hasTokenConflict)tokenName=void 0;parts.push(createKeySequencePart2(firstNode.stroke,{display,match:firstNode.match,tokenName}))}return parts}collectMatchingBindings(bindings,focused,activeView){let matches=[];for(let binding of bindings)if(this.conditions.matchesConditions(binding)&&this.catalog.isBindingVisible(binding,focused,activeView))matches.push(binding);return matches}hasMatchingBindings(bindings,focused,activeView){for(let binding of bindings)if(this.conditions.matchesConditions(binding)&&this.catalog.isBindingVisible(binding,focused,activeView))return!0;return!1}getNodePresentation(node,focused,activeView,reachableBindings=this.collectMatchingBindings(node.reachableBindings,focused,activeView)){if(!node.stroke)return{display:""};let partIndex=node.depth-1,display,tokenName,hasDisplayConflict=!1,hasTokenConflict=!1;for(let binding of reachableBindings){let part=binding.sequence[partIndex];if(!part)continue;if(display===void 0){display=part.display,tokenName=part.tokenName;continue}if(!hasDisplayConflict&&display!==part.display)hasDisplayConflict=!0;if(!hasTokenConflict&&tokenName!==part.tokenName)hasTokenConflict=!0}if(display===void 0||hasDisplayConflict)display=stringifyKeyStroke2(node.stroke);if(hasTokenConflict)tokenName=void 0;return{display,tokenName}}toActiveBinding(binding,focused,activeView){return{sequence:binding.sequence,command:binding.command,commandAttrs:this.catalog.getBindingCommandAttrs(binding,focused,activeView),attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough}}collectActiveBindings(bindings,focused,activeView){return bindings.map((binding)=>this.toActiveBinding(binding,focused,activeView))}collectActiveKeysAtRoot(activeLayers,includeBindings,includeMetadata,focused,activeView){let activeKeys=new Map,stopped=new Set,hasLayerConditions=this.state.layers.layersWithConditions>0;for(let layer of activeLayers){if(layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;for(let[bindingKey,child]of layer.root.children){if(stopped.has(bindingKey))continue;let selection=this.selectActiveKey(child,includeBindings,focused,activeView);if(!selection)continue;let existing=activeKeys.get(bindingKey);if(!existing)activeKeys.set(bindingKey,this.createActiveKeyState(child.stroke,selection,includeBindings));else this.updateActiveKeyState(existing,selection,includeBindings);if(selection.stop)stopped.add(bindingKey)}}let materialized=[];for(let state of activeKeys.values()){let activeKey=this.materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView);if(activeKey)materialized.push(activeKey)}return materialized}collectActiveKeysFromPending(captures,includeBindings,includeMetadata,focused,activeView){let activeKeys=new Map,stopped=new Set;for(let capture2 of captures)for(let[bindingKey,child]of capture2.node.children){if(stopped.has(bindingKey))continue;let selection=this.selectActiveKey(child,includeBindings,focused,activeView);if(!selection)continue;let existing=activeKeys.get(bindingKey);if(!existing)activeKeys.set(bindingKey,this.createActiveKeyState(child.stroke,selection,includeBindings));else this.updateActiveKeyState(existing,selection,includeBindings);if(selection.stop)stopped.add(bindingKey)}let materialized=[];for(let state of activeKeys.values()){let activeKey=this.materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView);if(activeKey)materialized.push(activeKey)}return materialized}selectActiveKey(node,includeBindings,focused,activeView){return node.children.size>0?this.selectPrefixActiveKey(node,includeBindings,focused,activeView):this.selectExactActiveKey(node,includeBindings,focused,activeView)}selectPrefixActiveKey(node,includeBindings,focused,activeView){if(!node.stroke)return;let reachableBindings=this.collectMatchingBindings(node.reachableBindings,focused,activeView);if(reachableBindings.length===0)return;let prefixBindings=this.selectActiveBindings(node.bindings,focused,activeView);return{...this.getNodePresentation(node,focused,activeView,reachableBindings),continues:!0,firstBinding:prefixBindings?.bindings[0],commandBinding:prefixBindings?.commandBinding,bindings:includeBindings&&prefixBindings&&prefixBindings.bindings.length>0?[...prefixBindings.bindings]:void 0,stop:!0}}selectExactActiveKey(node,includeBindings,focused,activeView){if(!node.stroke)return;let selected=this.selectActiveBindings(node.bindings,focused,activeView);if(!selected)return;let display,tokenName;if(selected.bindings.length===1){let part=selected.bindings[0]?.sequence[node.depth-1];display=part?.display??stringifyKeyStroke2(node.stroke),tokenName=part?.tokenName}else{let presentation=this.getNodePresentation(node,focused,activeView,selected.bindings);display=presentation.display,tokenName=presentation.tokenName}return{display,tokenName,continues:!1,firstBinding:selected.bindings[0],commandBinding:selected.commandBinding,bindings:includeBindings?[...selected.bindings]:void 0,stop:selected.stop}}selectActiveBindings(bindings,focused,activeView){let selected=[],commandBinding;for(let binding of bindings){if(!this.conditions.matchesConditions(binding)||!this.catalog.isBindingVisible(binding,focused,activeView))continue;if(selected.push(binding),binding.command===void 0)continue;if(commandBinding??=binding,!binding.fallthrough)return{bindings:selected,commandBinding,stop:!0}}if(selected.length===0)return;return{bindings:selected,commandBinding,stop:!1}}createActiveKeyState(stroke,selection,includeBindings){return{stroke,display:selection.display,tokenName:selection.tokenName,continues:selection.continues,firstBinding:selection.firstBinding,commandBinding:selection.commandBinding,bindings:includeBindings&&selection.bindings?[...selection.bindings]:void 0}}updateActiveKeyState(state,selection,includeBindings){if(!state.firstBinding&&selection.firstBinding)state.firstBinding=selection.firstBinding;if(!state.commandBinding&&selection.commandBinding)state.commandBinding=selection.commandBinding;if(selection.continues)state.continues=!0;if(!includeBindings||!selection.bindings||selection.bindings.length===0)return;if(!state.bindings){state.bindings=[...selection.bindings];return}state.bindings.push(...selection.bindings)}materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView){if(!state.commandBinding&&!state.continues)return;let activeKey={stroke:cloneKeyStroke2(state.stroke),display:state.display,continues:state.continues};if(state.tokenName)activeKey.tokenName=state.tokenName;if(state.commandBinding)activeKey.command=state.commandBinding.command;if(includeBindings&&state.bindings&&state.bindings.length>0)activeKey.bindings=state.bindings.length===1?[this.toActiveBinding(state.bindings[0],focused,activeView)]:this.collectActiveBindings(state.bindings,focused,activeView);if(includeMetadata){if(state.firstBinding?.attrs)activeKey.bindingAttrs=state.firstBinding.attrs;let commandAttrs=state.commandBinding?this.catalog.getBindingCommandAttrs(state.commandBinding,focused,activeView):void 0;if(commandAttrs)activeKey.commandAttrs=commandAttrs}return activeKey}invalidateCaches(){this.state.projection.pendingSequenceCacheVersion=-1,this.state.projection.activeKeysPlainCacheVersion=-1,this.state.projection.activeKeysBindingsCacheVersion=-1,this.state.projection.activeKeysMetadataCacheVersion=-1,this.state.projection.activeKeysBindingsAndMetadataCacheVersion=-1}notifyPendingSequenceChange(){if(!this.hooks.has("pendingSequence"))return;this.hooks.emit("pendingSequence",this.state.projection.pendingSequence?this.collectSequencePartsFromPending(this.state.projection.pendingSequence):[])}}function mergeRequirement2(target,name,value,source){if(Object.prototype.hasOwnProperty.call(target,name)&&!Object.is(target[name],value))throw Error(`Conflicting keymap requirement for "${name}" from ${source}`);target[name]=value}function mergeAttribute2(target,name,value,source){if(Object.prototype.hasOwnProperty.call(target,name)&&!Object.is(target[name],value))throw Error(`Conflicting keymap attribute for "${name}" from ${source}`);target[name]=value}function isPlainObject3(value){let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function getErrorMessage2(error2,fallback){if(error2 instanceof Error&&error2.message)return error2.message;return fallback}function isPromiseLike2(value){if(!value)return!1;if(typeof value!=="object"&&typeof value!=="function")return!1;return typeof value.then==="function"}function snapshotDataValue2(value,options){let deep=options?.deep===!0,freeze=options?.freeze===!0,preserveNonPlainObjects=options?.preserveNonPlainObjects===!0;if(Array.isArray(value)){let cloned=deep?value.map((entry2)=>snapshotDataValue2(entry2,options)):[...value];return freeze?Object.freeze(cloned):cloned}if(value&&typeof value==="object"){if(preserveNonPlainObjects&&!isPlainObject3(value))return value;let cloned={};for(let[key,entry2]of Object.entries(value))cloned[key]=deep?snapshotDataValue2(entry2,options):entry2;return freeze?Object.freeze(cloned):cloned}return value}function createCommandChainCacheState2(){return{resolvedWithoutRecordChains:new Map,resolvedWithRecordChains:new Map,fallbackWithoutRecord:new Map,fallbackWithRecord:new Map,fallbackWithoutRecordErrors:new Set,fallbackWithRecordErrors:new Set}}function normalizeBindingCommand2(command){if(command===void 0||typeof command==="function")return command;let trimmed=command.trim();if(!trimmed)throw Error("Invalid keymap command: command cannot be empty");return trimmed}function normalizeCommandName2(name){let trimmed=name.trim();if(!trimmed)throw Error("Invalid keymap command name: name cannot be empty");if(/\s/.test(trimmed))throw Error(`Invalid keymap command name "${name}": command names cannot contain whitespace`);return trimmed}class CommandCatalogService2{state;host;notify;conditions;options;constructor(state,host,notify,conditions,options){this.state=state,this.host=host,this.notify=notify,this.conditions=conditions,this.options=options}normalizeCommands(commands){return normalizeRegisteredCommands2({commands,commandFields:this.state.environment.commandFields,conditions:this.conditions,onError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}prependCommandResolver(resolver){return this.mutateCommandResolvers(()=>this.state.commands.commandResolvers.prepend(resolver),resolver)}appendCommandResolver(resolver){return this.mutateCommandResolvers(()=>this.state.commands.commandResolvers.append(resolver),resolver)}clearCommandResolvers(){if(!this.state.commands.commandResolvers.has())return;this.notify.runWithStateChangeBatch(()=>{this.state.commands.commandResolvers.clear(),this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange()})}getCommands(query2){return this.getFilteredCommandEntries(query2).map((entry2)=>getRegisteredCommandRecord2(entry2.command))}getCommandEntries(query2){let context=this.getCommandQueryContext(query2),filteredEntries=this.getFilteredCommandEntries(query2,context);if(filteredEntries.length===0)return[];let grouped=filteredEntries.map((entry2)=>({entry:entry2,command:getRegisteredCommandRecord2(entry2.command),bindings:[]})),indexesByName=new Map;for(let[index,item]of grouped.entries()){let existing=indexesByName.get(item.command.name);if(existing)existing.push(index);else indexesByName.set(item.command.name,[index])}if(indexesByName.size>0)this.collectCommandEntryBindings(grouped,indexesByName,context);return grouped.map((item)=>({command:item.command,bindings:item.bindings}))}getResolvedCommandChain(command,focused,includeRecord){let view=this.getActiveCommandView(focused),entries=this.getResolvedCommandChainFromView(view,command,focused,includeRecord,"active",view.chainsByName.get(command)),hadError=(includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors).has(command);return{entries,hadError}}getRegisteredResolvedEntries(command,includeRecord){let view=this.getRegisteredCommandView(),cache=includeRecord?view.resolvedWithRecordChains:view.resolvedWithoutRecordChains,cached=cache.get(command);if(cached)return cached.length>0?cached:void 0;let chain=view.chainsByName.get(command);if(!chain||chain.length===0){cache.set(command,[]);return}let resolved=[];for(let entry2 of chain)resolved.push({target:entry2.layer.target,resolved:resolveRegisteredCommand2(entry2.command,{includeRecord})});return cache.set(command,resolved),resolved}getRegisteredResolverFallback(command,includeRecord){let view=this.getRegisteredCommandView(),fallback=this.getFallbackResolvedCommand(view,command,null,includeRecord,"registered"),hadError=(includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors).has(command);return{resolved:fallback?.resolved,hadError}}getCommandAttrs(command,focused){return this.getTopResolvedCommand(command,focused,!1)?.resolved.attrs}getTopCommandRecord(command,focused){return this.getTopResolvedCommand(command,focused,!0)?.resolved.record}getTopRegisteredCommandRecord(command){let top=this.getTopRegisteredCommand(command);return top?getRegisteredCommandRecord2(top.command):void 0}getDispatchUnavailableCommandState(command,focused,includeRecord){let chain=this.getRegisteredCommandView().chainsByName.get(command);if(!chain||chain.length===0)return;let inactiveEntry,disabledEntry;for(let entry2 of chain){if(!isLayerActiveForFocused2(this.host,entry2.layer,focused)){inactiveEntry??=entry2;continue}if(!this.conditions.layerMatchesRuntimeState(entry2.layer)||!this.conditions.matchesConditions(entry2.command))disabledEntry??=entry2}let unavailableEntry=disabledEntry??inactiveEntry;if(!unavailableEntry)return;return{reason:disabledEntry?"disabled":"inactive",command:includeRecord?getRegisteredCommandRecord2(unavailableEntry.command):void 0}}getActiveCommandView(focused){let currentFocused=getFocusedTargetIfAvailable2(this.host),derivedStateVersion=this.state.notify.derivedStateVersion;if(focused===currentFocused&&this.state.commands.activeCommandViewVersion===derivedStateVersion&&this.state.commands.activeCommandView?.cacheable)return this.state.commands.activeCommandView;let entries=[],reachable=[],reachableByName=new Map,chainsByName=new Map,cacheable=!0;if(this.state.layers.layersWithCommands>0)for(let layer of getActiveLayersForFocused2(this.state.layers,this.host,focused)){if(layer.commands.length===0||!this.conditions.layerMatchesRuntimeState(layer))continue;if(layer.hasUnkeyedMatchers)cacheable=!1;for(let command of layer.commands){if(command.hasUnkeyedMatchers)cacheable=!1;if(!this.conditions.matchesConditions(command))continue;let entry2={layer,command};entries.push(entry2);let existing=chainsByName.get(command.name);if(existing)existing.push(entry2);else chainsByName.set(command.name,[entry2]);if(!reachableByName.has(command.name))reachableByName.set(command.name,entry2),reachable.push(entry2)}}let view={cacheable,entries,reachable,reachableByName,chainsByName,...createCommandChainCacheState2()};if(focused===currentFocused&&view.cacheable)this.state.commands.activeCommandViewVersion=derivedStateVersion,this.state.commands.activeCommandView=view;return view}getRegisteredCommandView(){let cacheVersion=this.state.commands.commandMetadataVersion;if(this.state.commands.registeredCommandViewVersion===cacheVersion&&this.state.commands.registeredCommandView)return this.state.commands.registeredCommandView;let entries=[],chainsByName=new Map;for(let layer of this.state.layers.sortedLayers){if(layer.commands.length===0)continue;for(let command of layer.commands){let entry2={layer,command};entries.push(entry2);let existing=chainsByName.get(command.name);if(existing)existing.push(entry2);else chainsByName.set(command.name,[entry2])}}let view={entries,chainsByName,...createCommandChainCacheState2()};return this.state.commands.registeredCommandViewVersion=cacheVersion,this.state.commands.registeredCommandView=view,view}isBindingVisible(binding,focused,activeView){if(binding.command===void 0||binding.run)return!0;if(typeof binding.command!=="string")return!1;if(activeView.reachableByName.has(binding.command))return!0;return this.getFallbackResolvedCommand(activeView,binding.command,focused,!1,"active")!==void 0}getBindingCommandAttrs(binding,focused,activeView){if(typeof binding.command!=="string")return;let active=activeView.reachableByName.get(binding.command);if(active)return active.command.attrs;return this.getFallbackResolvedCommand(activeView,binding.command,focused,!1,"active")?.resolved.attrs}getCommandResolutionStatus(command,layerCommands){if(layerCommands?.has(command)||this.state.commands.registeredNames.has(command))return"resolved";let lookup=this.resolveCommandWithResolvers(command,getFocusedTargetIfAvailable2(this.host));if(lookup.resolved||lookup.hadError)return lookup.resolved?"resolved":"error";return"unresolved"}mutateCommandResolvers(register2,resolver){return this.notify.runWithStateChangeBatch(()=>{let off=register2();return this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange(),()=>{this.notify.runWithStateChangeBatch(()=>{if(off(),this.state.commands.commandResolvers.values().includes(resolver))return;this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange()})}})}getTopResolvedCommand(command,focused,includeRecord){let activeView=this.getActiveCommandView(focused),active=activeView.reachableByName.get(command);if(active)return{target:active.layer.target,resolved:resolveRegisteredCommand2(active.command,{includeRecord})};return this.getFallbackResolvedCommand(activeView,command,focused,includeRecord,"active")}getTopRegisteredCommand(command){return this.getRegisteredCommandView().chainsByName.get(command)?.[0]}getFallbackResolvedCommand(view,command,focused,includeRecord,mode){let cache=includeRecord?view.fallbackWithRecord:view.fallbackWithoutRecord,errorCache=includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors;if(cache.has(command)){let cached=cache.get(command);return cached?{resolved:cached}:void 0}let lookup=this.resolveCommandWithResolvers(command,focused,{includeRecord,mode});if(cache.set(command,lookup.resolved??null),lookup.hadError)errorCache.add(command);if(!lookup.resolved)return;return{resolved:lookup.resolved}}getResolvedCommandChainFromView(view,command,focused,includeRecord,mode,activeChain){let cache=includeRecord?view.resolvedWithRecordChains:view.resolvedWithoutRecordChains,cached=cache.get(command);if(cached)return cached.length>0?cached:void 0;let resolved=[],chain=activeChain;if(chain)for(let entry2 of chain)resolved.push({target:entry2.layer.target,resolved:resolveRegisteredCommand2(entry2.command,{includeRecord})});let fallback=this.getFallbackResolvedCommand(view,command,focused,includeRecord,mode);if(fallback)resolved.push(fallback);return cache.set(command,resolved),resolved.length>0?resolved:void 0}getRegisteredLayerCommandEntries(){let cacheVersion=this.state.commands.commandMetadataVersion;if(this.state.commands.registeredCommandEntriesCacheVersion===cacheVersion)return this.state.commands.registeredCommandEntriesCache;let layers=[...this.state.layers.layers];layers.sort((left,right)=>left.order-right.order);let entries=[];for(let layer of layers)for(let command of layer.commands)entries.push({layer,command});return this.state.commands.registeredCommandEntriesCacheVersion=cacheVersion,this.state.commands.registeredCommandEntriesCache=entries,entries}getCommandQueryContext(query2){let visibility=query2?.visibility??"reachable",focused=query2&&Object.prototype.hasOwnProperty.call(query2,"focused")?query2.focused??null:getFocusedTargetIfAvailable2(this.host);if(visibility==="registered")return{visibility,focused};return{visibility,focused,activeView:this.getActiveCommandView(focused)}}getFilteredCommandEntries(query2,context=this.getCommandQueryContext(query2)){let entries;if(context.visibility==="registered")entries=this.getRegisteredLayerCommandEntries();else if(context.visibility==="active")entries=context.activeView?.entries??[];else entries=context.activeView?.reachable??[];return queryLayerCommandEntries2({entries,query:query2,getCommandRecord:(command)=>getRegisteredCommandRecord2(command),onFilterError:(error2)=>{this.notify.emitError("command-query-filter-error",error2,"[Keymap] Error in command query filter:")}})}collectCommandEntryBindings(grouped,indexesByName,context){if(context.visibility==="registered"){let layers=[...this.state.layers.layers];layers.sort((left,right)=>left.order-right.order);for(let layer of layers)for(let binding of layer.compiledBindings)this.collectBindingForCommandEntries(grouped,indexesByName,binding);return}let activeView=context.activeView;if(!activeView)return;for(let layer of getActiveLayersForFocused2(this.state.layers,this.host,context.focused)){if(layer.compiledBindings.length===0||!this.conditions.layerMatchesRuntimeState(layer))continue;for(let binding of layer.compiledBindings){if(!this.conditions.matchesConditions(binding)||!this.isBindingVisible(binding,context.focused,activeView))continue;this.collectBindingForCommandEntries(grouped,indexesByName,binding)}}}collectBindingForCommandEntries(grouped,indexesByName,binding){if(typeof binding.command!=="string")return;let indexes=indexesByName.get(binding.command);if(!indexes||indexes.length===0)return;for(let index of indexes){let item=grouped[index];if(!item)continue;item.bindings.push({sequence:binding.sequence,command:binding.command,commandAttrs:item.command.attrs,attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough})}}resolveCommandWithResolvers(command,focused,options){let includeRecord=options?.includeRecord===!0,context=this.createCommandResolverContext(includeRecord,focused,options?.mode??"active");return resolveCommandWithResolvers2(command,this.state.commands.commandResolvers.values(),context,(error2)=>{this.notify.emitError("command-resolver-error",error2,`[Keymap] Error in command resolver for "${command}":`)})}createCommandResolverContext(includeRecord,focused,mode){return{getCommandAttrs:(name)=>{if(mode==="registered")return this.getTopRegisteredCommand(name)?.command.attrs;return this.getCommandAttrs(name,focused)},getCommandRecord:(name)=>{if(!includeRecord)return;if(mode==="registered")return this.getTopRegisteredCommandRecord(name);return this.getTopCommandRecord(name,focused)}}}}function getRegisteredCommandRecord2(command){if(command.record)return command.record;let fields=EMPTY_COMMAND_FIELDS2;if(command.fields!==EMPTY_COMMAND_FIELDS2&&Object.keys(command.fields).length>0)fields=snapshotDataValue2(command.fields,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS2);let record=command.attrs?Object.freeze({name:command.name,fields,attrs:snapshotDataValue2(command.attrs,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS2)}):Object.freeze({name:command.name,fields});return command.record=record,record}function resolveRegisteredCommand2(command,options){if(options?.includeRecord===!0){let existing2=command.resolvedWithRecord;if(existing2)return existing2;let resolved2={run:createRegisteredCommandRunner2(command)};if(command.attrs)resolved2.attrs=command.attrs;return resolved2.record=getRegisteredCommandRecord2(command),command.resolvedWithRecord=resolved2,resolved2}let existing=command.resolved;if(existing)return existing;let resolved={run:createRegisteredCommandRunner2(command)};if(command.attrs)resolved.attrs=command.attrs;return command.resolved=resolved,resolved}function normalizeRegisteredCommands2(options){let normalizedCommands=[],seen=new Set;for(let command of options.commands){let normalizedCommand;try{let mergedAttrs={},mergedFields={},mergedRequires={},matchers=[],conditionKeys=new Set,hasUnkeyedMatchers=!1,normalizedName=normalizeCommandName2(command.name);if(seen.has(normalizedName)){options.onError("duplicate-command",{command:normalizedName},`Duplicate keymap command "${normalizedName}" in the same layer`);continue}for(let[fieldName,value]of Object.entries(command)){if(RESERVED_COMMAND_FIELDS2.has(fieldName)||value===void 0)continue;mergedFields[fieldName]=snapshotDataValue2(value,SNAPSHOT_COMMAND_METADATA_OPTIONS2);let compiler=options.commandFields.get(fieldName);if(!compiler)continue;compiler(value,createCommandFieldContext2(mergedAttrs,mergedRequires,conditionKeys,matchers,options.conditions,fieldName,{onUnkeyedMatcher(){hasUnkeyedMatchers=!0}}))}let attrs=Object.keys(mergedAttrs).length===0?void 0:Object.freeze(mergedAttrs),fields=Object.keys(mergedFields).length===0?EMPTY_COMMAND_FIELDS2:Object.freeze(mergedFields);if(normalizedCommand={name:normalizedName,fields,run:command.run,requires:Object.entries(mergedRequires),matchers,conditionKeys:[...conditionKeys],hasUnkeyedMatchers,matchCacheDirty:!0},attrs)normalizedCommand.attrs=attrs}catch(error2){options.onError("register-command-failed",error2,getErrorMessage2(error2,`Failed to register keymap command "${String(command.name)}"`));continue}seen.add(normalizedCommand.name),normalizedCommands.push(normalizedCommand)}return normalizedCommands}function createCommandFieldContext2(mergedAttrs,mergedRequires,conditionKeys,matchers,conditions,fieldName,options){return{require(name,requiredValue){mergeRequirement2(mergedRequires,name,requiredValue,`field ${fieldName}`),conditionKeys.add(name)},attr(name,attributeValue){mergeAttribute2(mergedAttrs,name,snapshotDataValue2(attributeValue,SNAPSHOT_COMMAND_METADATA_OPTIONS2),`field ${fieldName}`)},activeWhen(matcher){let runtimeMatcher=conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)options.onUnkeyedMatcher();matchers.push(runtimeMatcher)}}}function createRegisteredCommandRunner2(command){if(command.runner)return command.runner;let runner=(ctx)=>{return command.run({...ctx,command:getRegisteredCommandRecord2(command)})};return command.runner=runner,runner}function resolveCommandWithResolvers2(command,resolvers,context,onResolverError){if(resolvers.length===0)return{hadError:!1};let hadError=!1;for(let resolver of resolvers){let resolved;try{resolved=resolver(command,context)}catch(error2){hadError=!0,onResolverError(error2);continue}if(resolved)return{hadError,resolved}}return{hadError}}function queryLayerCommandEntries2(options){let namespace=options.query?.namespace,normalizedSearch=options.query?.search?.trim().toLowerCase()??"",searchKeys=DEFAULT_COMMAND_SEARCH_FIELDS2;if(options.query?.searchIn&&options.query.searchIn.length>0)searchKeys=options.query.searchIn;let filter=options.query?.filter,filterEntries2,filterPredicate;if(typeof filter==="function")filterPredicate=filter;else if(filter)filterEntries2=Object.entries(filter);let results=[];for(let entry2 of options.entries){let command=entry2.command;if(!commandMatchesNamespace2(command,namespace))continue;if(!commandMatchesSearch2(command,normalizedSearch,searchKeys))continue;if(!commandMatchesFilters2(command,filterEntries2,options))continue;let record=options.getCommandRecord(command);if(filterPredicate){let matches=!1;try{matches=filterPredicate(record)}catch(error2){options.onFilterError(error2);continue}if(!matches)continue}results.push(entry2)}return results}function commandMatchesSearch2(command,search,searchKeys){if(!search)return!0;for(let key of searchKeys)if(commandKeyMatchesSearch2(command,key,search))return!0;return!1}function commandMatchesNamespace2(command,namespace){if(namespace===void 0)return!0;if(!Object.prototype.hasOwnProperty.call(command.fields,"namespace"))return!1;return commandValueMatchesFilter2(command.fields.namespace,namespace)}function commandMatchesFilters2(command,filters,options){if(!filters)return!0;for(let[key,matcher]of filters)if(!commandKeyMatchesQuery2(command,key,matcher,options))return!1;return!0}function commandKeyMatchesSearch2(command,key,search){if(key==="name"&&commandValueMatchesSearch2(command.name,search))return!0;if(Object.prototype.hasOwnProperty.call(command.fields,key)&&commandValueMatchesSearch2(command.fields[key],search))return!0;if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key))return commandValueMatchesSearch2(command.attrs[key],search);return!1}function commandKeyMatchesQuery2(command,key,matcher,options){if(typeof matcher==="function"){let record,getRecord=()=>{if(!record)record=options.getCommandRecord(command);return record},foundValue=!1;if(key==="name"){foundValue=!0;try{if(matcher(command.name,getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(Object.prototype.hasOwnProperty.call(command.fields,key)){foundValue=!0;try{if(matcher(command.fields[key],getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key)){foundValue=!0;try{if(matcher(command.attrs[key],getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(!foundValue)try{return matcher(void 0,getRecord())}catch(error2){return options.onFilterError(error2),!1}return!1}return commandKeyMatchesExact2(command,key,matcher)}function commandKeyMatchesExact2(command,key,matcher){if(key==="name"&&commandValueMatchesFilter2(command.name,matcher))return!0;if(Object.prototype.hasOwnProperty.call(command.fields,key)&&commandValueMatchesFilter2(command.fields[key],matcher))return!0;if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key))return commandValueMatchesFilter2(command.attrs[key],matcher);return!1}function commandValueMatchesFilter2(value,matcher){if(Array.isArray(matcher)){for(let expected of matcher)if(commandValueMatchesExact2(value,expected))return!0;return!1}return commandValueMatchesExact2(value,matcher)}function commandValueMatchesExact2(value,expected){if(Array.isArray(value)){for(let entry2 of value)if(commandValueMatchesExact2(entry2,expected))return!0;return!1}return Object.is(value,expected)}function commandValueMatchesSearch2(value,search){if(Array.isArray(value)){for(let entry2 of value)if(commandValueMatchesSearch2(entry2,search))return!0;return!1}if(typeof value==="string")return value.toLowerCase().includes(search);if(typeof value==="number"||typeof value==="boolean"||typeof value==="bigint")return String(value).toLowerCase().includes(search);return!1}class CommandExecutorService2{notify;runtime;activation;catalog;options;constructor(notify,runtime,activation,catalog,options){this.notify=notify,this.runtime=runtime,this.activation=activation,this.catalog=catalog,this.options=options}runCommand(cmd,options){let normalized;try{normalized=normalizeBindingCommand2(cmd)}catch{return{ok:!1,reason:"invalid-args"}}if(typeof normalized!=="string")return{ok:!1,reason:"not-found"};let includeRecord=options?.includeCommand===!0,focused=options?.focused??this.activation.getFocusedTargetIfAvailable(),event=options?.event??this.options.createCommandEvent(),data=this.runtime.getReadonlyData(),chain=this.catalog.getRegisteredResolvedEntries(normalized,includeRecord),rejectedResult;if(chain?.length===1){let[entry2]=chain;if(entry2){let execution=this.executeResolvedCommand(normalized,entry2.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data},execution=this.executeResolvedCommand(normalized,entry2.resolved,context);if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}let fallback=this.catalog.getRegisteredResolverFallback(normalized,includeRecord);if(fallback.resolved){let execution=this.executeResolvedCommand(normalized,fallback.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}if(fallback.hadError)return{ok:!1,reason:"error"};return rejectedResult??{ok:!1,reason:"not-found"}}dispatchCommand(cmd,options){let normalized;try{normalized=normalizeBindingCommand2(cmd)}catch{return{ok:!1,reason:"invalid-args"}}if(typeof normalized!=="string")return{ok:!1,reason:"not-found"};let includeRecord=options?.includeCommand===!0,focused=options?.focused??this.activation.getFocusedTargetIfAvailable(),event=options?.event??this.options.createCommandEvent(),data=this.runtime.getReadonlyData(),chainLookup=this.catalog.getResolvedCommandChain(normalized,focused,includeRecord),chain=chainLookup.entries,rejectedResult;if(chain?.length===1){let[entry2]=chain;if(entry2){let execution=this.executeResolvedCommand(normalized,entry2.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data},execution=this.executeResolvedCommand(normalized,entry2.resolved,context);if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}if(chainLookup.hadError)return{ok:!1,reason:"error"};let unavailable=this.catalog.getDispatchUnavailableCommandState(normalized,focused,includeRecord);if(unavailable)return unavailable.command?{ok:!1,reason:unavailable.reason,command:unavailable.command}:{ok:!1,reason:unavailable.reason};return rejectedResult??{ok:!1,reason:"not-found"}}runBinding(bindingLayer,binding,event,focused){let data=this.runtime.getReadonlyData();if(binding.run){if(this.executeResolvedCommand(typeof binding.command==="string"?binding.command:"<function>",{run:binding.run},{keymap:this.options.keymap,event,focused,target:bindingLayer.target??null,data}).status==="rejected")return!1;return applyBindingEventEffects2(binding,event),!0}if(typeof binding.command!=="string")return!1;let chain=this.catalog.getResolvedCommandChain(binding.command,focused,!1).entries;if(chain?.length===1){let[entry2]=chain;if(entry2){if(this.executeResolvedCommand(binding.command,entry2.resolved,{keymap:this.options.keymap,event,focused,target:entry2.target??bindingLayer.target??null,data}).status==="rejected")return!1;return applyBindingEventEffects2(binding,event),!0}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:entry2.target??bindingLayer.target??null,data};if(this.executeResolvedCommand(binding.command,entry2.resolved,context).status==="rejected")continue;return applyBindingEventEffects2(binding,event),!0}return!1}executeResolvedCommand(commandName,resolved,context){let command=resolved.record,result2;try{result2=resolved.run(context)}catch(error2){return this.notify.emitError("command-execution-error",error2,`[Keymap] Error running command "${commandName}":`),{status:"error",result:{ok:!1,reason:"error",command}}}if(isPromiseLike2(result2))return result2.catch((error2)=>{this.notify.emitError("async-command-error",error2,`[Keymap] Async error in command "${commandName}":`)}),{status:"handled",result:{ok:!0,command}};if(result2===!1){if(resolved.rejectedResult)return{status:"rejected",result:resolved.rejectedResult};return{status:"rejected",result:{ok:!1,reason:"rejected",command}}}return{status:"handled",result:{ok:!0,command}}}}function applyBindingEventEffects2(binding,event){if(!binding.preventDefault)return;event.preventDefault(),event.stopPropagation()}function normalizeBindingInputs2(bindings){if(Array.isArray(bindings))return bindings;let normalized=[];for(let[key,cmd]of Object.entries(bindings)){if(typeof cmd!=="string"&&typeof cmd!=="function")throw Error(`Invalid keymap binding for "${key}": shorthand bindings must map to string or function commands`);normalized.push({key,cmd})}return normalized}function snapshotBindingInputs2(bindings){return normalizeBindingInputs2(bindings).map((binding)=>({...binding,key:typeof binding.key==="string"?binding.key:{...binding.key}}))}function snapshotParsedBindingInput2(binding){return{...binding,sequence:cloneKeySequence2(binding.sequence)}}function createSequenceNode2(parent,stroke,match){return{parent,depth:parent?parent.depth+1:0,stroke,match,children:new Map,bindings:[],reachableBindings:[]}}function snapshotAttributes2(attrs){if(Object.keys(attrs).length===0)return;return snapshotDataValue2(attrs,{freeze:!0})}class CompilerService2{state;notify;conditions;options;constructor(state,notify,conditions,options){this.state=state,this.notify=notify,this.conditions=conditions,this.options=options}parseTokenKey(key){return parseSingleKeyPartWithParsers2(key,this.state.environment.bindingParsers.values(),{tokens:this.state.environment.tokens,layer:EMPTY_COMPILE_FIELDS2,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)})}compileBindings(bindings,tokens2,sourceTarget,sourceLayerOrder,compileFields){let root=createSequenceNode2(null,null,null),compiledBindings=[],hasTokenBindings=!1,bindingExpanders=this.state.environment.bindingExpanders.values(),bindingParsers=this.state.environment.bindingParsers.values(),bindingFieldCompilers=this.state.environment.bindingFields,allowExactPrefixAmbiguity=this.state.dispatch.disambiguationResolvers.has(),warnUnknownField=this.options.warnUnknownField,warnUnknownToken=this.options.warnUnknownToken,conditions=this.conditions;for(let[bindingIndex,binding]of bindings.entries()){let expandedBindingKeys;try{expandedBindingKeys=expandBindingInputWithExpanders2(binding.key,bindingExpanders,{layer:compileFields})}catch(error2){this.notify.emitError("binding-expand-error",error2,getErrorMessage2(error2,"Failed to expand keymap binding"));continue}for(let expandedBindingKey of expandedBindingKeys){let parsed;try{parsed=typeof expandedBindingKey==="string"?parseBindingSequenceWithParsers2(expandedBindingKey,bindingParsers,{tokens:tokens2,layer:compileFields,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)}):{parts:[this.parseObjectKeyPart(expandedBindingKey)],usedTokens:[],unknownTokens:[],hasTokenBindings:!1}}catch(error2){this.notify.emitError("binding-parse-error",error2,getErrorMessage2(error2,"Failed to parse keymap binding"));continue}let sequence=parsed.parts;hasTokenBindings||=parsed.hasTokenBindings;for(let tokenName of parsed.unknownTokens)warnUnknownToken(tokenName,typeof expandedBindingKey==="string"?expandedBindingKey:String(expandedBindingKey.name));for(let compiledInput of this.applyBindingTransformers(binding,sequence,tokens2,bindingParsers,compileFields))try{let event=this.normalizeBindingEvent(compiledInput.event),compiledSequence=compiledInput.sequence,mergedRequires,mergedAttrs,matchers,conditionKeys,hasUnkeyedMatchers=!1;for(let fieldName in compiledInput){if(fieldName==="sequence")continue;if(RESERVED_BINDING_FIELDS2.has(fieldName))continue;let value=compiledInput[fieldName];if(value===void 0)continue;let compiler=bindingFieldCompilers.get(fieldName);if(!compiler){warnUnknownField("binding",fieldName);continue}compiler(value,{require(name,requiredValue){if(!mergedRequires)mergedRequires={};if(mergeRequirement2(mergedRequires,name,requiredValue,`field ${fieldName}`),!conditionKeys)conditionKeys=new Set;conditionKeys.add(name)},attr(name,attributeValue){if(!mergedAttrs)mergedAttrs={};mergeAttribute2(mergedAttrs,name,attributeValue,`field ${fieldName}`)},activeWhen:(matcher)=>{let runtimeMatcher=conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)hasUnkeyedMatchers=!0;if(!matchers)matchers=[];matchers.push(runtimeMatcher)}})}let attrs=mergedAttrs?snapshotAttributes2(mergedAttrs):void 0,command=normalizeBindingCommand2(compiledInput.cmd),compiledBinding={sequence:compiledSequence,command,event,sourceBinding:snapshotParsedBindingInput2(compiledInput),sourceTarget,sourceLayerOrder,sourceBindingIndex:bindingIndex,requires:mergedRequires?Object.entries(mergedRequires):EMPTY_REQUIRES2,matchers:matchers??EMPTY_MATCHERS2,conditionKeys:conditionKeys?[...conditionKeys]:EMPTY_CONDITION_KEYS2,hasUnkeyedMatchers,matchCacheDirty:!0,preventDefault:compiledInput.preventDefault!==!1,fallthrough:compiledInput.fallthrough??!1};if(attrs)compiledBinding.attrs=attrs;if(typeof command==="function")compiledBinding.run=command;if(compiledSequence.length===0)continue;if(event==="release"&&compiledSequence.length>1)throw Error("Keymap release bindings only support a single key stroke");if(event==="press")this.insertBinding(root,compiledBinding,allowExactPrefixAmbiguity);compiledBindings.push(compiledBinding)}catch(error2){this.notify.emitError("binding-compile-error",error2,getErrorMessage2(error2,"Failed to compile keymap binding"))}}}return{root,bindings:compiledBindings,hasTokenBindings}}parseObjectKeyPart(key,options){return createKeySequencePart2(key,options)}normalizeBindingEvent(event){if(event===void 0||event==="press")return"press";if(event==="release")return"release";throw Error(`Invalid keymap binding event "${String(event)}": expected "press" or "release"`)}applyBindingTransformers(binding,sequence,tokens2,bindingParsers,compileFields){let bindingTransformers=this.state.environment.bindingTransformers.values();if(bindingTransformers.length===0)return[{...binding,sequence:cloneKeySequence2(sequence)}];let parsedBinding={...binding,sequence:cloneKeySequence2(sequence)},extraBindings=[],keepOriginal=!0,layer=compileFields??EMPTY_COMPILE_FIELDS2;for(let transformer of bindingTransformers)try{transformer(parsedBinding,{layer,parseKey:(key)=>{return parseSingleKeyPartWithParsers2(key,bindingParsers,{tokens:tokens2,layer,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)})},add:(nextBinding)=>{extraBindings.push(snapshotParsedBindingInput2(nextBinding))},skipOriginal:()=>{keepOriginal=!1}})}catch(error2){this.notify.emitError("binding-transformer-error",error2,"[Keymap] Error in binding transformer:")}if(!keepOriginal)return extraBindings;if(extraBindings.length===0)return[parsedBinding];return[parsedBinding,...extraBindings]}insertBinding(root,binding,allowExactPrefixAmbiguity){let node=root,touchedNodes=[],createdNodes=[];try{for(let part of binding.sequence){if(!allowExactPrefixAmbiguity&&node.bindings.some((candidate)=>candidate.command!==void 0))throw Error("Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer");let bindingKey=part.match,child=node.children.get(bindingKey);if(!child)child=createSequenceNode2(node,cloneKeySequencePart2(part).stroke,part.match),node.children.set(bindingKey,child),createdNodes.push({parent:node,key:bindingKey});child.reachableBindings.push(binding),touchedNodes.push(child),node=child}if(!allowExactPrefixAmbiguity&&binding.command!==void 0&&node.children.size>0)throw Error("Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer");node.bindings=[...node.bindings,binding]}catch(error2){for(let index=touchedNodes.length-1;index>=0;index-=1){let touchedNode=touchedNodes[index];if(!touchedNode)continue;if(touchedNode.reachableBindings.at(-1)===binding){touchedNode.reachableBindings.pop();continue}touchedNode.reachableBindings=touchedNode.reachableBindings.filter((candidate)=>candidate!==binding)}for(let index=createdNodes.length-1;index>=0;index-=1){let createdNode=createdNodes[index];if(!createdNode)continue;let child=createdNode.parent.children.get(createdNode.key);if(!child)continue;if(child.children.size>0||child.reachableBindings.length>0||child.bindings.length>0)continue;createdNode.parent.children.delete(createdNode.key)}throw error2}}}function expandBindingInputWithExpanders2(key,expanders,options){if(typeof key!=="string"||expanders.length===0)return[key];let layer=options?.layer??EMPTY_COMPILE_FIELDS2,candidates=[key];for(let expander of expanders){let nextCandidates=[];for(let input of candidates){let result2=expander({input,layer});if(!result2){nextCandidates.push(input);continue}if(result2.length===0)throw Error(`Keymap binding expander must return at least one key sequence for "${input}"`);for(let expandedInput of result2){if(typeof expandedInput!=="string")throw Error(`Keymap binding expander must return string key sequences for "${input}"`);nextCandidates.push(expandedInput)}}candidates=nextCandidates}return candidates}function parseBindingSequenceWithParsers2(key,parsers2,options){if(key.length===0)throw Error("Invalid key sequence: sequence cannot be empty");if(parsers2.length===0)throw Error("No keymap binding parsers are registered");let tokens2=options.tokens??new Map,layer=options.layer??EMPTY_COMPILE_FIELDS2,parseObjectKey=options.parseObjectKey,parts=[],usedTokens=new Set,unknownTokens=new Set,index=0;while(index<key.length){let matched=!1;for(let parser of parsers2){let result2=parser({input:key,index,layer,tokens:tokens2,normalizeTokenName:normalizeBindingTokenName2,createMatch:createTextKeyMatch2,parseObjectKey});if(!result2)continue;if(result2.nextIndex<=index||result2.nextIndex>key.length)throw Error(`Keymap binding parser must advance the input for "${key}" at index ${index}`);parts.push(...result2.parts);for(let tokenName of result2.usedTokens??[])usedTokens.add(tokenName);for(let tokenName of result2.unknownTokens??[])unknownTokens.add(tokenName);index=result2.nextIndex,matched=!0;break}if(!matched)throw Error(`No keymap binding parser handled input at index ${index} in "${key}"`)}return{parts,usedTokens:[...usedTokens],unknownTokens:[...unknownTokens],hasTokenBindings:usedTokens.size>0||unknownTokens.size>0}}function parseSingleKeyPartWithParsers2(key,parsers2,options){if(typeof key!=="string")return options.parseObjectKey(key);let{parts}=parseBindingSequenceWithParsers2(key,parsers2,options),[part]=parts;if(!part||parts.length!==1)throw Error(`Invalid key "${String(key)}": expected a single key stroke`);return part}function isReactiveMatcher2(value){if(!value||typeof value!=="object")return!1;let candidate=value;return typeof candidate.get==="function"&&typeof candidate.subscribe==="function"}class ConditionService2{state;notify;constructor(state,notify){this.state=state,this.notify=notify}buildRuntimeMatcher(matcher,source){if(typeof matcher==="function")return{source,match:matcher,cacheable:!1};if(isReactiveMatcher2(matcher))return{source,match:()=>matcher.get(),cacheable:!0,subscribe:(onChange)=>matcher.subscribe(onChange)};throw Error(`Keymap ${source} expected a function or a reactive matcher`)}hasNoConditions(target){return target.requires.length===0&&target.matchers.length===0}indexRuntimeMatchable(target){if(target.conditionKeys.length>0)for(let key of target.conditionKeys){let dependents=this.state.conditions.runtimeKeyDependents.get(key);if(dependents){dependents.add(target);continue}this.state.conditions.runtimeKeyDependents.set(key,new Set([target]))}if(!target.hasUnkeyedMatchers)target.matchCacheDirty=!0}unindexRuntimeMatchable(target){if(target.conditionKeys.length===0)return;for(let key of target.conditionKeys){let dependents=this.state.conditions.runtimeKeyDependents.get(key);if(!dependents)continue;if(dependents.delete(target),dependents.size===0)this.state.conditions.runtimeKeyDependents.delete(key)}}invalidateRuntimeConditionKey(name){let dependents=this.state.conditions.runtimeKeyDependents.get(name);if(!dependents)return;for(let target of dependents)target.matchCacheDirty=!0}matchesConditions(target){if(this.hasNoConditions(target))return!0;if(this.hasFreshConditionCache(target))return target.matchCache===!0;let matched=this.matchRequirements(target.requires)&&this.matchesRuntimeMatchers(target);return this.updateConditionCache(target,matched),matched}layerMatchesRuntimeState(layer){if(this.state.layers.layersWithConditions===0||this.hasNoConditions(layer))return!0;return this.matchesConditions(layer)}matchRequirements(requires){if(requires.length===0)return!0;for(let[name,value]of requires)if(!Object.is(this.state.runtime.data[name],value))return!1;return!0}hasFreshConditionCache(target){if(target.hasUnkeyedMatchers)return!1;return target.matchCacheDirty!==!0&&target.matchCache!==void 0}updateConditionCache(target,matched){if(target.hasUnkeyedMatchers)return;target.matchCacheDirty=!1,target.matchCache=matched}matchesRuntimeMatcher(matcher){try{return matcher.match()}catch(error2){return this.notify.emitError("runtime-matcher-error",error2,`[Keymap] Error evaluating runtime matcher from ${matcher.source}:`),!1}}matchesRuntimeMatchers(target){if(target.matchers.length===0)return!0;if(target.matchers.length===1){let[matcher]=target.matchers;return matcher?this.matchesRuntimeMatcher(matcher):!0}for(let matcher of target.matchers)if(!this.matchesRuntimeMatcher(matcher))return!1;return!0}}function createSyncDecision2(action,handler){return{[KEY_DISAMBIGUATION_DECISION2]:!0,action,handler}}function createDeferredDecision2(action){return{[KEY_DEFERRED_DISAMBIGUATION_DECISION2]:!0,action}}function isSyncDecision2(value){return!!value&&typeof value==="object"&&value[KEY_DISAMBIGUATION_DECISION2]===!0}function isDeferredDecision2(value){return!!value&&typeof value==="object"&&value[KEY_DEFERRED_DISAMBIGUATION_DECISION2]===!0}class DispatchService2{state;notify;runtime;activation;conditions;executor;compiler;catalog;layers;eventMatchResolverContext;pendingDisambiguation=null;nextPendingDisambiguationId=0;constructor(state,notify,runtime,activation,conditions,executor,compiler,catalog,layers){this.state=state,this.notify=notify,this.runtime=runtime,this.activation=activation,this.conditions=conditions,this.executor=executor,this.compiler=compiler,this.catalog=catalog,this.layers=layers,this.eventMatchResolverContext={resolveKey:(key)=>{return this.compiler.parseTokenKey(key).match}}}intercept(name,fn,options){if(name==="key"){let keyOptions=options;return this.state.dispatch.keyHooks.register(fn,{priority:keyOptions?.priority??0,release:keyOptions?.release??!1})}let rawOptions=options;return this.state.dispatch.rawHooks.register(fn,{priority:rawOptions?.priority??0})}prependEventMatchResolver(resolver){return this.state.dispatch.eventMatchResolvers.prepend(resolver)}appendEventMatchResolver(resolver){return this.state.dispatch.eventMatchResolvers.append(resolver)}clearEventMatchResolvers(){this.state.dispatch.eventMatchResolvers.clear()}prependDisambiguationResolver(resolver){return this.mutateDisambiguationResolvers(()=>this.state.dispatch.disambiguationResolvers.prepend(resolver),resolver)}appendDisambiguationResolver(resolver){return this.mutateDisambiguationResolvers(()=>this.state.dispatch.disambiguationResolvers.append(resolver),resolver)}clearDisambiguationResolvers(){if(!this.state.dispatch.disambiguationResolvers.has())return;this.notify.runWithStateChangeBatch(()=>{this.state.dispatch.disambiguationResolvers.clear(),this.layers.recompileBindings()})}handlePendingSequenceChange(_previous,_next){if(!this.pendingDisambiguation)return;this.cancelPendingDisambiguation()}handleRawSequence(sequence){let hooks=this.state.dispatch.rawHooks.entries();if(hooks.length===0)return!1;let stopped=!1,context={sequence,stop(){stopped=!0}};for(let hook of hooks){try{hook.listener(context)}catch(error2){this.notify.emitError("raw-intercept-error",error2,"[Keymap] Error in raw intercept listener:")}if(stopped)return!0}return!1}handleKeyEvent(event,release){if(!release)this.cancelPendingDisambiguation();let hooks=this.state.dispatch.keyHooks.entries(),context={event,setData:(name,value)=>{this.runtime.setData(name,value)},getData:(name)=>{return this.runtime.getData(name)},consume:(options)=>{let shouldPreventDefault=options?.preventDefault??!0,shouldStopPropagation=options?.stopPropagation??!0;if(shouldPreventDefault)event.preventDefault();if(shouldStopPropagation)event.stopPropagation()}};for(let hook of hooks){if(hook.release!==release)continue;try{hook.listener(context)}catch(error2){this.notify.emitError("key-intercept-error",error2,"[Keymap] Error in key intercept listener:")}if(event.propagationStopped)return}if(release){this.dispatchReleaseLayers(event);return}this.dispatchLayers(event)}mutateDisambiguationResolvers(register2,resolver){return this.notify.runWithStateChangeBatch(()=>{let hadResolvers=this.state.dispatch.disambiguationResolvers.has(),off=register2();if(!hadResolvers&&this.state.dispatch.disambiguationResolvers.has())this.layers.recompileBindings();return()=>{this.notify.runWithStateChangeBatch(()=>{let hadBeforeRemoval=this.state.dispatch.disambiguationResolvers.has();if(off(),this.state.dispatch.disambiguationResolvers.values().includes(resolver))return;if(hadBeforeRemoval&&!this.state.dispatch.disambiguationResolvers.has())this.layers.recompileBindings()})}})}dispatchReleaseLayers(event){let focused=this.activation.getFocusedTarget(),activeLayers=this.activation.getActiveLayers(focused),hasLayerConditions=this.state.layers.layersWithConditions>0,matchKeys=this.resolveEventMatchKeys(event);layerLoop:for(let layer of activeLayers){if(layer.compiledBindings.length===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;for(let strokeKey of matchKeys){let result2=this.runReleaseBindings(layer,strokeKey,event,focused);if(!result2.handled)continue;if(result2.stop)return;continue layerLoop}}}dispatchLayers(event){let focused=this.activation.getFocusedTarget(),pending=this.activation.ensureValidPendingSequence(),matchKeys=this.resolveEventMatchKeys(event);if(pending){this.dispatchPendingSequence(pending,matchKeys,event,focused);return}let activeLayers=this.activation.getActiveLayers(focused);this.dispatchFromRoot(activeLayers,matchKeys,event,focused)}dispatchPendingSequence(pending,matchKeys,event,focused){let advancedCaptures=[];for(let capture2 of pending.captures){let nextNode=this.getReachableChild(capture2.node,matchKeys,focused);if(!nextNode)continue;advancedCaptures.push({layer:capture2.layer,node:nextNode})}if(advancedCaptures.length===0){this.activation.setPendingSequence(null);return}this.dispatchPendingCapturesFromIndex(advancedCaptures,0,!1,event,focused)}dispatchPendingCapturesFromIndex(advancedCaptures,startIndex,handledExact,event,focused){let hasHandledExact=handledExact;for(let index=startIndex;index<advancedCaptures.length;index+=1){let capture2=advancedCaptures[index];if(!capture2)continue;if(capture2.node.children.size>0){if(hasHandledExact)continue;let continuationCaptures=this.collectPendingCapturesFromAdvanced(advancedCaptures,index);if(this.tryResolvePendingAmbiguity(advancedCaptures,index,continuationCaptures,capture2,event,focused,hasHandledExact))return;this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation();return}let result2=this.runBindings(capture2.layer,capture2.node.bindings,event,focused);if(!result2.handled)continue;if(hasHandledExact=!0,result2.stop){this.activation.setPendingSequence(null);return}}this.activation.setPendingSequence(null)}dispatchFromRoot(activeLayers,matchKeys,event,focused){this.dispatchFromRootAtIndex(activeLayers,0,matchKeys,event,focused)}dispatchFromRootAtIndex(activeLayers,startIndex,matchKeys,event,focused){let hasLayerConditions=this.state.layers.layersWithConditions>0;for(let index=startIndex;index<activeLayers.length;index+=1){let layer=activeLayers[index];if(!layer)continue;if(layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;let nextNode=this.getReachableChild(layer.root,matchKeys,focused);if(!nextNode)continue;if(nextNode.children.size>0){let continuationCaptures=this.collectPendingCapturesFromRoot(activeLayers,index,matchKeys,focused);if(this.tryResolveRootAmbiguity(activeLayers,index,matchKeys,continuationCaptures,layer,nextNode,event,focused))return;this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation();return}let result2=this.runBindings(layer,nextNode.bindings,event,focused);if(!result2.handled)continue;if(result2.stop)return}}tryResolveRootAmbiguity(activeLayers,layerIndex,matchKeys,continuationCaptures,layer,node,event,focused){let applyExact=()=>{if(this.activation.setPendingSequence(null),!this.runBindings(layer,node.bindings,event,focused).stop)this.dispatchFromRootAtIndex(activeLayers,layerIndex+1,matchKeys,event,focused)};return this.tryResolveAmbiguity({event,focused,continuationCaptures,exactBindingsSource:node.bindings,runExact:applyExact})}tryResolvePendingAmbiguity(advancedCaptures,captureIndex,continuationCaptures,capture2,event,focused,handledExact){let applyExact=()=>{this.activation.setPendingSequence(null);let result2=this.runBindings(capture2.layer,capture2.node.bindings,event,focused);if(result2.stop)return;this.dispatchPendingCapturesFromIndex(advancedCaptures,captureIndex+1,handledExact||result2.handled,event,focused)};return this.tryResolveAmbiguity({event,focused,continuationCaptures,exactBindingsSource:capture2.node.bindings,runExact:applyExact})}tryResolveAmbiguity(options){let{event,focused,continuationCaptures,exactBindingsSource,runExact}=options;if(!this.state.dispatch.disambiguationResolvers.has()||continuationCaptures.length===0)return!1;let activeView=this.catalog.getActiveCommandView(focused),exactBindings=this.activation.collectMatchingBindings(exactBindingsSource,focused,activeView);if(!exactBindings.some((binding)=>binding.command!==void 0))return!1;let continueSequence=()=>{this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation()},clear=()=>{this.activation.setPendingSequence(null),event.preventDefault(),event.stopPropagation()},sequence,getSequence=()=>{return sequence??=this.activation.collectSequencePartsFromPending({captures:continuationCaptures}),sequence},decision=this.resolveDisambiguation({event,focused,getSequence,exactBindings,continuationCaptures,activeView});if(!decision)return this.warnUnresolvedAmbiguity(getSequence()),continueSequence(),!0;return this.applySyncDecision(decision,continuationCaptures,runExact,continueSequence,clear,focused,getSequence)}applySyncDecision(decision,continuationCaptures,runExact,continueSequence,clear,focused,getSequence){if(decision.action==="run-exact")return runExact(),!0;if(decision.action==="continue-sequence")return continueSequence(),!0;if(decision.action==="clear")return clear(),!0;return continueSequence(),this.scheduleDeferredDisambiguation(continuationCaptures,decision.handler,focused,getSequence(),(nextDecision)=>{if(!nextDecision)return;if(nextDecision.action==="run-exact"){runExact();return}if(nextDecision.action==="continue-sequence"){continueSequence();return}clear()}),!0}resolveDisambiguation(options){let activation=this.activation,runtime=this.runtime,sequence,exact,continuations,strokePart,ctx={event:options.event,focused:options.focused,get sequence(){return sequence??=cloneKeySequence2(options.getSequence()),sequence},get stroke(){let stroke=options.getSequence().at(-1);if(!stroke)throw Error("Disambiguation context expected a non-empty sequence");return strokePart??={...stroke,stroke:cloneKeyStroke2(stroke.stroke)},strokePart},get exact(){return exact??=activation.collectActiveBindings(options.exactBindings,options.focused,options.activeView).map((binding)=>({...binding,sequence:cloneKeySequence2(binding.sequence)})),exact},get continuations(){return continuations??=activation.getActiveKeysForCaptures(options.continuationCaptures,{includeBindings:!0,includeMetadata:!0}),continuations},getData:(name)=>{return runtime.getData(name)},setData:(name,value)=>{runtime.setData(name,value)},runExact:()=>createSyncDecision2("run-exact"),continueSequence:()=>createSyncDecision2("continue-sequence"),clear:()=>createSyncDecision2("clear"),defer:(run)=>createSyncDecision2("defer",run)};for(let resolver of this.state.dispatch.disambiguationResolvers.values()){let result2;try{result2=resolver(ctx)}catch(error2){this.notify.emitError("disambiguation-resolver-error",error2,"[Keymap] Error in disambiguation resolver:");continue}if(result2===void 0)continue;if(isPromiseLike2(result2)){this.notify.emitError("invalid-disambiguation-resolver-return",result2,"[Keymap] Disambiguation resolvers must return synchronously; use ctx.defer(...) for async handling");continue}if(!isSyncDecision2(result2)){this.notify.emitError("invalid-disambiguation-decision",result2,"[Keymap] Invalid disambiguation decision returned by resolver:");continue}return result2}return}scheduleDeferredDisambiguation(captures,handler,focused,sequence,apply){this.cancelPendingDisambiguation();let controller=new AbortController,pending={id:this.nextPendingDisambiguationId++,controller,captures,apply};this.pendingDisambiguation=pending,queueMicrotask(()=>{this.executeDeferredDisambiguation(pending,handler,focused,sequence)})}executeDeferredDisambiguation(pending,handler,focused,sequence){if(!this.isPendingDisambiguationCurrent(pending))return;let ctx={signal:pending.controller.signal,sequence:cloneKeySequence2(sequence),focused,sleep:(ms)=>{return this.sleepWithSignal(ms,pending.controller.signal)},runExact:()=>createDeferredDecision2("run-exact"),continueSequence:()=>createDeferredDecision2("continue-sequence"),clear:()=>createDeferredDecision2("clear")},result2;try{result2=handler(ctx)}catch(error2){if(this.isPendingDisambiguationCurrent(pending))this.notify.emitError("deferred-disambiguation-error",error2,"[Keymap] Error in deferred disambiguation handler:"),this.finishPendingDisambiguation(pending);return}if(isPromiseLike2(result2)){result2.then((resolved)=>{this.applyDeferredDisambiguationResult(pending,resolved)}).catch((error2)=>{if(!this.isPendingDisambiguationCurrent(pending))return;this.notify.emitError("deferred-disambiguation-error",error2,"[Keymap] Error in deferred disambiguation handler:"),this.finishPendingDisambiguation(pending)});return}this.applyDeferredDisambiguationResult(pending,result2)}applyDeferredDisambiguationResult(pending,result2){if(!this.isPendingDisambiguationCurrent(pending))return;if(result2!==void 0&&!isDeferredDecision2(result2)){this.notify.emitError("invalid-deferred-disambiguation-decision",result2,"[Keymap] Invalid deferred disambiguation decision returned by handler:"),this.finishPendingDisambiguation(pending);return}this.finishPendingDisambiguation(pending),pending.apply(result2)}finishPendingDisambiguation(pending){if(!this.isPendingDisambiguationCurrent(pending))return;this.pendingDisambiguation=null}cancelPendingDisambiguation(){let pending=this.pendingDisambiguation;if(!pending)return;this.pendingDisambiguation=null,pending.controller.abort()}isPendingDisambiguationCurrent(pending){return this.pendingDisambiguation===pending}sleepWithSignal(ms,signal){if(signal.aborted)return Promise.resolve(!1);return new Promise((resolve23)=>{let timeout=setTimeout(()=>{signal.removeEventListener("abort",onAbort),resolve23(!0)},Math.max(0,ms)),onAbort=()=>{clearTimeout(timeout),signal.removeEventListener("abort",onAbort),resolve23(!1)};signal.addEventListener("abort",onAbort,{once:!0})})}warnUnresolvedAmbiguity(sequence){let display=stringifyKeySequence2(sequence,{preferDisplay:!0});this.notify.warnOnce(`unresolved-disambiguation:${display}`,"unresolved-disambiguation",{sequence:display},`[Keymap] Ambiguous exact/prefix sequence "${display}" fell back to prefix handling because no disambiguation resolver resolved it`)}collectPendingCapturesFromRoot(activeLayers,startIndex,matchKeys,focused){let captures=[],hasLayerConditions=this.state.layers.layersWithConditions>0;for(let index=startIndex;index<activeLayers.length;index+=1){let layer=activeLayers[index];if(!layer||layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;let nextNode=this.getReachableChild(layer.root,matchKeys,focused);if(!nextNode||nextNode.children.size===0)continue;captures.push({layer,node:nextNode})}return captures}collectPendingCapturesFromAdvanced(advancedCaptures,startIndex){return advancedCaptures.filter((candidate,candidateIndex)=>{return candidateIndex>=startIndex&&candidate.node.children.size>0})}resolveEventMatchKeys(event){let resolvers=this.state.dispatch.eventMatchResolvers.values();if(resolvers.length===0)return[];if(resolvers.length===1)return resolveSingleEventMatchKeys2(resolvers[0],event,this.eventMatchResolverContext,this.notify);let keys=[],seen=new Set;for(let resolver of resolvers){let resolved;try{resolved=resolver(event,this.eventMatchResolverContext)}catch(error2){this.notify.emitError("event-match-resolver-error",error2,"[Keymap] Error in event match resolver:");continue}if(!resolved||resolved.length===0)continue;for(let candidate of resolved){if(typeof candidate!=="string"){this.notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:");continue}if(seen.has(candidate))continue;seen.add(candidate),keys.push(candidate)}}return keys}runReleaseBindings(layer,strokeKey,event,focused){let handled=!1;for(let binding of layer.compiledBindings){if(binding.event!=="release")continue;let firstPart=binding.sequence[0];if(!firstPart||firstPart.match!==strokeKey)continue;if(!this.conditions.matchesConditions(binding))continue;if(!this.executor.runBinding(layer,binding,event,focused))continue;if(handled=!0,!binding.fallthrough)return{handled:!0,stop:!0}}return{handled,stop:!1}}getReachableChild(node,matchKeys,focused){for(let strokeKey of matchKeys){let child=node.children.get(strokeKey);if(!child||!this.activation.nodeHasReachableBindings(child,focused))continue;return child}return}runBindings(layer,bindings,event,focused){let handled=!1;for(let binding of bindings){if(!this.conditions.matchesConditions(binding))continue;if(!this.executor.runBinding(layer,binding,event,focused))continue;if(handled=!0,!binding.fallthrough)return{handled:!0,stop:!0}}return{handled,stop:!1}}}function resolveSingleEventMatchKeys2(resolver,event,ctx,notify){let resolved;try{resolved=resolver(event,ctx)}catch(error2){return notify.emitError("event-match-resolver-error",error2,"[Keymap] Error in event match resolver:"),[]}if(!resolved||resolved.length===0)return[];if(resolved.length===1){let[candidate]=resolved;if(typeof candidate!=="string")return notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:"),[];return[candidate]}let keys=[],seen=new Set;for(let candidate of resolved){if(typeof candidate!=="string"){notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:");continue}if(seen.has(candidate))continue;seen.add(candidate),keys.push(candidate)}return keys}function registerFieldCompilers2(fields,options){let{kind,reservedFields,registeredFields,emitError}=options,entries=Object.entries(fields),registered=[];for(let[name]of entries){if(reservedFields.has(name)){emitError(`reserved-${kind}-field`,{field:name,kind},`Keymap ${kind} field "${name}" is reserved`);continue}if(registeredFields.has(name))emitError(`duplicate-${kind}-field`,{field:name,kind},`Keymap ${kind} field "${name}" is already registered`)}for(let[name,compiler]of entries){if(reservedFields.has(name)||registeredFields.has(name))continue;registeredFields.set(name,compiler),registered.push([name,compiler])}return()=>{for(let[name,compiler]of registered)if(registeredFields.get(name)===compiler)registeredFields.delete(name)}}class EnvironmentService2{state;notify;compiler;layers;constructor(state,notify,compiler,layers){this.state=state,this.notify=notify,this.compiler=compiler,this.layers=layers}prependBindingTransformer(transformer){return this.state.environment.bindingTransformers.prepend(transformer)}appendBindingTransformer(transformer){return this.state.environment.bindingTransformers.append(transformer)}clearBindingTransformers(){this.state.environment.bindingTransformers.clear()}prependBindingParser(parser){return this.state.environment.bindingParsers.prepend(parser)}appendBindingParser(parser){return this.state.environment.bindingParsers.append(parser)}clearBindingParsers(){this.state.environment.bindingParsers.clear()}registerToken(token){let normalizedToken;try{normalizedToken=normalizeBindingTokenName2(token.name)}catch(error2){return this.notify.emitError("token-name-normalize-error",error2,getErrorMessage2(error2,"Failed to register keymap token")),NOOP3}if(this.state.environment.tokens.has(normalizedToken))return this.notify.emitError("duplicate-token",{token:normalizedToken},`Keymap token "${normalizedToken}" is already registered`),NOOP3;let parsedToken;try{parsedToken=this.compiler.parseTokenKey(token.key)}catch(error2){return this.notify.emitError("token-parse-error",error2,getErrorMessage2(error2,`Failed to register keymap token "${normalizedToken}"`)),NOOP3}let registeredToken={stroke:parsedToken.stroke,match:parsedToken.match},nextTokens=new Map(this.state.environment.tokens);nextTokens.set(normalizedToken,registeredToken);try{this.layers.applyTokenState(nextTokens)}catch(error2){return this.notify.emitError("token-register-error",error2,getErrorMessage2(error2,`Failed to register keymap token "${normalizedToken}"`)),NOOP3}return()=>{if(this.state.environment.tokens.get(normalizedToken)!==registeredToken)return;let nextTokens2=new Map(this.state.environment.tokens);nextTokens2.delete(normalizedToken);try{this.layers.applyTokenState(nextTokens2)}catch(error2){this.notify.emitError("token-unregister-error",error2,getErrorMessage2(error2,`Failed to unregister keymap token "${normalizedToken}"`))}}}prependBindingExpander(expander){return this.state.environment.bindingExpanders.prepend(expander)}appendBindingExpander(expander){return this.state.environment.bindingExpanders.append(expander)}clearBindingExpanders(){this.state.environment.bindingExpanders.clear()}registerLayerFields(fields){return registerFieldCompilers2(fields,{kind:"layer",reservedFields:RESERVED_LAYER_FIELDS2,registeredFields:this.state.environment.layerFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}registerBindingFields(fields){return registerFieldCompilers2(fields,{kind:"binding",reservedFields:RESERVED_BINDING_FIELDS2,registeredFields:this.state.environment.bindingFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}registerCommandFields(fields){return registerFieldCompilers2(fields,{kind:"command",reservedFields:RESERVED_COMMAND_FIELDS2,registeredFields:this.state.environment.commandFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}}function sortLayers2(layers){return[...layers].sort((left,right)=>{let priorityDiff=right.priority-left.priority;if(priorityDiff!==0)return priorityDiff;return right.order-left.order})}function createCommandLookup2(commands){if(commands.length===0)return;let lookup=new Map;for(let command of commands)lookup.set(command.name,command);return lookup}function addRegisteredCommandNames2(target,commands){for(let command of commands)target.set(command.name,(target.get(command.name)??0)+1)}function removeRegisteredCommandNames2(target,commands){for(let command of commands){let count=target.get(command.name);if(!count||count<=1){target.delete(command.name);continue}target.set(command.name,count-1)}}function getSequenceNode2(root,sequence){let node=root;for(let part of sequence)if(node=node.children.get(part.match),!node)return;return node}function buildLayerBindingAnalyses2(root,compiledBindings){return compiledBindings.map((binding)=>{let node=binding.event==="press"?getSequenceNode2(root,binding.sequence):void 0;return{sequence:cloneKeySequence2(binding.sequence),command:binding.command,attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough,sourceBinding:snapshotParsedBindingInput2(binding.sourceBinding),sourceTarget:binding.sourceTarget,sourceLayerOrder:binding.sourceLayerOrder,sourceBindingIndex:binding.sourceBindingIndex,hasCommandAtSequence:node?node.bindings.some((candidate)=>candidate.command!==void 0):!1,hasContinuations:node?node.children.size>0:!1}})}class LayerService2{state;notify;conditions;activation;options;constructor(state,notify,conditions,activation,options){this.state=state,this.notify=notify,this.conditions=conditions,this.activation=activation,this.options=options}registerLayer(layer){return this.notify.runWithStateChangeBatch(()=>{let target=layer.target;if(target&&this.options.host.isTargetDestroyed(target))return this.notify.emitError("destroyed-layer-target",{target},"Cannot register a keymap layer for a destroyed keymap target"),NOOP22;let bindingInputs,requires,matchers,conditionKeys,hasUnkeyedMatchers,compileFields,commands,commandLookup,targetMode;try{targetMode=this.normalizeTargetMode(layer),bindingInputs=snapshotBindingInputs2(layer.bindings??[]),commands=!layer.commands||layer.commands.length===0?[]:this.options.commands.normalizeCommands(layer.commands),commandLookup=createCommandLookup2(commands),{requires,matchers,conditionKeys,hasUnkeyedMatchers,compileFields}=this.compileLayerRuntimeState(layer)}catch(error2){return this.notify.emitError("register-layer-failed",error2,getErrorMessage2(error2,"Failed to register keymap layer")),NOOP22}let order=this.state.core.order++,compiledBindings=this.options.compiler.compileBindings(bindingInputs,this.state.environment.tokens,target,order,compileFields);if(compiledBindings.bindings.length===0&&!compiledBindings.hasTokenBindings&&commands.length===0)return NOOP22;this.runLayerAnalyzers({target,order,commandLookup,bindingInputs,compiledBindings:compiledBindings.bindings,root:compiledBindings.root,hasTokenBindings:compiledBindings.hasTokenBindings});let registeredLayer={order,target,targetMode,priority:layer.priority??0,requires,matchers,conditionKeys,hasUnkeyedMatchers,matchCacheDirty:!0,compileFields,commands,commandLookup,bindingInputs,compiledBindings:compiledBindings.bindings,hasUnkeyedCommands:commands.some((command)=>command.hasUnkeyedMatchers),hasUnkeyedBindings:compiledBindings.bindings.some((binding)=>binding.hasUnkeyedMatchers),hasTokenBindings:compiledBindings.hasTokenBindings,root:compiledBindings.root};if(this.state.layers.layers.add(registeredLayer),registeredLayer.commands.length>0)this.state.layers.layersWithCommands+=1,this.state.commands.commandMetadataVersion+=1,addRegisteredCommandNames2(this.state.commands.registeredNames,registeredLayer.commands);if(registeredLayer.requires.length>0||registeredLayer.matchers.length>0)this.state.layers.layersWithConditions+=1;this.connectRuntimeMatchable(registeredLayer);for(let command of registeredLayer.commands)this.connectRuntimeMatchable(command);for(let binding of registeredLayer.compiledBindings)this.connectRuntimeMatchable(binding);if(this.indexLayer(registeredLayer),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(),target){let onTargetDestroy=()=>{this.unregisterLayer(registeredLayer)};registeredLayer.offTargetDestroy=this.options.host.onTargetDestroy(target,onTargetDestroy)}if(registeredLayer.commands.length>0)this.activation.ensureValidPendingSequence();return this.notify.queueStateChange(),()=>{this.unregisterLayer(registeredLayer)}})}applyTokenState(nextTokens){this.notify.runWithStateChangeBatch(()=>{let nextCompilations=new Map;for(let layer of this.state.layers.layers){if(!layer.hasTokenBindings)continue;nextCompilations.set(layer,this.compileLayerBindings(layer,nextTokens))}this.state.environment.tokens=nextTokens;let shouldClearPending=!1;for(let[layer,compilation]of nextCompilations)if(this.applyCompiledBindings(layer,compilation))shouldClearPending=!0;if(shouldClearPending)this.activation.setPendingSequence(null);if(nextCompilations.size>0)this.notify.queueStateChange()})}recompileBindings(){this.notify.runWithStateChangeBatch(()=>{let recompiledLayers=0,shouldClearPending=!1;for(let layer of this.state.layers.layers){if(layer.bindingInputs.length===0)continue;let compilation=this.compileLayerBindings(layer,this.state.environment.tokens);if(this.applyCompiledBindings(layer,compilation))shouldClearPending=!0;recompiledLayers+=1}if(shouldClearPending)this.activation.setPendingSequence(null);if(recompiledLayers>0)this.notify.queueStateChange()})}prependLayerAnalyzer(analyzer){return this.state.layers.layerAnalyzers.prepend(analyzer)}appendLayerAnalyzer(analyzer){return this.state.layers.layerAnalyzers.append(analyzer)}clearLayerAnalyzers(){this.state.layers.layerAnalyzers.clear()}cleanup(){for(let layer of this.state.layers.layers){this.disconnectRuntimeMatchable(layer);for(let command of layer.commands)this.disconnectRuntimeMatchable(command);for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);layer.offTargetDestroy?.(),layer.offTargetDestroy=void 0}}normalizeTargetMode(layer){if(layer.targetMode){if(!layer.target)throw Error(`Keymap targetMode "${layer.targetMode}" requires a target`);return layer.targetMode}return layer.target?"focus-within":void 0}runLayerAnalyzers(options){let analyzers=this.state.layers.layerAnalyzers.values();if(analyzers.length===0)return;let bindings=buildLayerBindingAnalyses2(options.root,options.compiledBindings),ctx={target:options.target,order:options.order,bindingInputs:options.bindingInputs,bindings,hasTokenBindings:options.hasTokenBindings,checkCommandResolution:(command)=>{return this.options.commands.getCommandResolutionStatus(command,options.commandLookup)},warn:(code,warning,message)=>{this.notify.emitWarning(code,warning,message)},warnOnce:(key,code,warning,message)=>{this.notify.warnOnce(key,code,warning,message)},error:(code,error2,message)=>{this.notify.emitError(code,error2,message)}};for(let analyzer of analyzers)try{analyzer(ctx)}catch(error2){this.notify.emitError("layer-analyzer-error",error2,"[Keymap] Error in layer analyzer:")}}compileLayerRuntimeState(layer){let mergedRequires={},matchers=[],compileFields=Object.create(null),conditionKeys=new Set,hasUnkeyedMatchers=!1;for(let[fieldName,value]of Object.entries(layer)){if(RESERVED_LAYER_FIELDS2.has(fieldName))continue;if(value===void 0)continue;compileFields[fieldName]=snapshotDataValue2(value);let compiler=this.state.environment.layerFields.get(fieldName);if(!compiler){this.options.warnUnknownField("layer",fieldName);continue}compiler(value,{require:(name,requiredValue)=>{mergeRequirement2(mergedRequires,name,requiredValue,`field ${fieldName}`),conditionKeys.add(name)},activeWhen:(matcher)=>{let runtimeMatcher=this.conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)hasUnkeyedMatchers=!0;matchers.push(runtimeMatcher)}})}return{requires:Object.entries(mergedRequires),matchers,conditionKeys:[...conditionKeys],hasUnkeyedMatchers,compileFields:Object.keys(compileFields).length>0?Object.freeze(compileFields):void 0}}compileLayerBindings(layer,tokens2){return this.options.compiler.compileBindings(layer.bindingInputs,tokens2,layer.target,layer.order,layer.compileFields)}applyCompiledBindings(layer,compilation){this.runLayerAnalyzers({target:layer.target,order:layer.order,commandLookup:layer.commandLookup,bindingInputs:layer.bindingInputs,compiledBindings:compilation.bindings,root:compilation.root,hasTokenBindings:compilation.hasTokenBindings});for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);layer.root=compilation.root,layer.compiledBindings=compilation.bindings,layer.hasUnkeyedBindings=compilation.bindings.some((binding)=>binding.hasUnkeyedMatchers),layer.hasTokenBindings=compilation.hasTokenBindings;for(let binding of layer.compiledBindings)this.connectRuntimeMatchable(binding);return this.state.projection.pendingSequence?.captures.some((capture2)=>capture2.layer===layer)??!1}indexLayer(layer){this.state.layers.sortedLayers=sortLayers2([...this.state.layers.sortedLayers,layer]),this.state.layers.activeLayersVersion+=1}removeLayerFromIndex(layer){this.state.layers.sortedLayers=this.state.layers.sortedLayers.filter((candidate)=>candidate!==layer),this.state.layers.activeLayersVersion+=1}unregisterLayer(layer){this.notify.runWithStateChangeBatch(()=>{if(!this.state.layers.layers.delete(layer))return;if(layer.requires.length>0||layer.matchers.length>0)this.state.layers.layersWithConditions-=1;if(layer.commands.length>0)this.state.layers.layersWithCommands-=1,this.state.commands.commandMetadataVersion+=1,removeRegisteredCommandNames2(this.state.commands.registeredNames,layer.commands);this.disconnectRuntimeMatchable(layer);for(let command of layer.commands)this.disconnectRuntimeMatchable(command);for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);if(this.removeLayerFromIndex(layer),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(),layer.offTargetDestroy?.(),layer.offTargetDestroy=void 0,this.state.projection.pendingSequence?.captures.some((capture2)=>capture2.layer===layer))this.activation.setPendingSequence(null);else if(layer.commands.length>0&&!this.options.host.isDestroyed)this.activation.ensureValidPendingSequence();this.notify.queueStateChange()})}connectRuntimeMatchable(target){this.attachReactiveMatchers(target),this.conditions.indexRuntimeMatchable(target)}disconnectRuntimeMatchable(target){this.detachReactiveMatchers(target),this.conditions.unindexRuntimeMatchable(target)}attachReactiveMatchers(target){for(let matcher of target.matchers){if(!matcher.subscribe)continue;try{matcher.dispose=matcher.subscribe(()=>{if(target.matchCacheDirty=!0,!this.activation.hasPendingSequenceState()){this.notify.queueStateChange();return}this.notify.runWithStateChangeBatch(()=>{this.activation.revalidatePendingSequenceIfNeeded(),this.notify.queueStateChange()})})}catch(error2){this.notify.emitError("reactive-matcher-subscribe-error",error2,getErrorMessage2(error2,`Failed to subscribe to reactive matcher from ${matcher.source}`))}}}detachReactiveMatchers(target){for(let matcher of target.matchers){if(!matcher.dispose)continue;try{matcher.dispose()}catch(error2){this.notify.emitError("reactive-matcher-dispose-error",error2,getErrorMessage2(error2,`Failed to dispose reactive matcher from ${matcher.source}`))}matcher.dispose=void 0}}}class Emitter3{onError;listeners=Object.create(null);constructor(onError){this.onError=onError}hook(name,listener){let current=this.listeners[name]??[];return this.listeners[name]=[...current,listener],()=>{let current2=this.listeners[name];if(!current2||current2.length===0)return;let next=current2.filter((candidate)=>candidate!==listener);if(next.length===0){delete this.listeners[name];return}this.listeners[name]=next}}has(name){return(this.listeners[name]?.length??0)>0}off(name,listener){let current=this.listeners[name];if(!current||current.length===0)return;let next=current.filter((candidate)=>candidate!==listener);if(next.length===current.length)return;if(next.length===0){delete this.listeners[name];return}this.listeners[name]=next}clear(){this.listeners=Object.create(null)}emit(name,...args){let listeners2=this.listeners[name];if(!listeners2||listeners2.length===0)return;for(let listener of listeners2)try{if(args.length===0)listener();else listener(args[0])}catch(error2){this.onError(name,error2)}}}class NotificationService2{state;events;hooks;constructor(state,events,hooks){this.state=state,this.events=events,this.hooks=hooks}runWithStateChangeBatch(fn){this.state.notify.stateChangeDepth+=1;try{return fn()}finally{if(this.state.notify.stateChangeDepth-=1,this.state.notify.stateChangeDepth===0)this.flushStateChange()}}queueStateChange(){if(this.state.notify.derivedStateVersion+=1,!this.hooks.has("state"))return;if(this.state.notify.stateChangePending=!0,this.state.notify.stateChangeDepth===0&&!this.state.notify.flushingStateChange)this.flushStateChange()}emitWarning(code,warning,message){if(!this.events.has("warning")){let consoleMessage=`[${code}] ${message}`;if(warning instanceof Error)console.warn(consoleMessage,warning);else console.warn(consoleMessage);return}this.events.emit("warning",{code,message,warning})}emitError(code,error2,message){if(!this.events.has("error")){let consoleMessage=`[${code}] ${message}`;if(error2 instanceof Error)console.error(consoleMessage,error2);else console.error(consoleMessage);return}this.events.emit("error",{code,message,error:error2})}reportListenerError(name,error2){if(name==="state"){this.emitError("state-listener-error",error2,"[Keymap] Error in state listener:");return}if(name==="pendingSequence"){this.emitError("pending-sequence-listener-error",error2,"[Keymap] Error in pending sequence listener:");return}}warnOnce(key,code,warning,message){if(this.state.notify.usedWarningKeys.has(key))return;this.state.notify.usedWarningKeys.add(key),this.emitWarning(code,warning,message)}flushStateChange(){if(!this.state.notify.stateChangePending||this.state.notify.stateChangeDepth>0||this.state.notify.flushingStateChange)return;this.state.notify.flushingStateChange=!0;try{let iterations=0;while(this.state.notify.stateChangePending&&this.state.notify.stateChangeDepth===0){if(iterations>=MAX_STATE_CHANGE_FLUSH_ITERATIONS2){this.state.notify.stateChangePending=!1,this.emitError("state-change-feedback-loop",{iterations:MAX_STATE_CHANGE_FLUSH_ITERATIONS2},`[Keymap] Possible infinite state listener feedback loop detected after ${MAX_STATE_CHANGE_FLUSH_ITERATIONS2} iterations; pending state notifications were dropped`);break}iterations+=1,this.state.notify.stateChangePending=!1,this.hooks.emit("state")}}finally{this.state.notify.flushingStateChange=!1}}}class RuntimeService2{state;notify;conditions;activation;constructor(state,notify,conditions,activation){this.state=state,this.notify=notify,this.conditions=conditions,this.activation=activation}getData(name){return this.state.runtime.data[name]}setData(name,value){this.notify.runWithStateChangeBatch(()=>{if(value===void 0){if(!(name in this.state.runtime.data))return;delete this.state.runtime.data[name],this.state.runtime.dataVersion+=1,this.conditions.invalidateRuntimeConditionKey(name),this.activation.ensureValidPendingSequence(),this.notify.queueStateChange();return}if(Object.is(this.state.runtime.data[name],value))return;this.state.runtime.data[name]=value,this.state.runtime.dataVersion+=1,this.conditions.invalidateRuntimeConditionKey(name),this.activation.ensureValidPendingSequence(),this.notify.queueStateChange()})}getReadonlyData(){if(this.state.runtime.readonlyDataVersion===this.state.runtime.dataVersion)return this.state.runtime.readonlyData;return this.state.runtime.readonlyData=Object.freeze({...this.state.runtime.data}),this.state.runtime.readonlyDataVersion=this.state.runtime.dataVersion,this.state.runtime.readonlyData}}class CopyOnWriteRegistry2{items=[];getItems(){return this.items}setItems(items){this.items=items}removeItem(value){let current=this.items;if(current.length===0)return!1;let next=current.filter((candidate)=>candidate!==value);if(next.length===current.length)return!1;return this.items=next,!0}has(){return this.items.length>0}clear(){this.items=[]}}function createKeymapState2(){return{core:{order:0},environment:{tokens:new Map,layerFields:new Map,bindingExpanders:new OrderedRegistry2,bindingParsers:new OrderedRegistry2,bindingTransformers:new OrderedRegistry2,bindingFields:new Map,commandFields:new Map},dispatch:{eventMatchResolvers:new OrderedRegistry2,disambiguationResolvers:new OrderedRegistry2,keyHooks:new PriorityRegistry2,rawHooks:new PriorityRegistry2},layers:{layers:new Set,sortedLayers:[],activeLayersVersion:0,activeLayersCacheVersion:-1,activeLayersCacheFocused:void 0,activeLayersCache:[],layersWithConditions:0,layersWithCommands:0,layerAnalyzers:new OrderedRegistry2},commands:{commandMetadataVersion:0,registeredNames:new Map,commandResolvers:new OrderedRegistry2,activeCommandViewVersion:-1,activeCommandView:void 0,registeredCommandViewVersion:-1,registeredCommandView:void 0,registeredCommandEntriesCacheVersion:-1,registeredCommandEntriesCache:[]},projection:{pendingSequence:null,pendingSequenceCacheVersion:-1,pendingSequenceCache:[],activeKeysPlainCacheVersion:-1,activeKeysPlainCache:[],activeKeysBindingsCacheVersion:-1,activeKeysBindingsCache:[],activeKeysMetadataCacheVersion:-1,activeKeysMetadataCache:[],activeKeysBindingsAndMetadataCacheVersion:-1,activeKeysBindingsAndMetadataCache:[]},conditions:{runtimeKeyDependents:new Map},runtime:{data:{},dataVersion:0,readonlyDataVersion:-1,readonlyData:EMPTY_DATA2},notify:{derivedStateVersion:0,stateChangeDepth:0,stateChangePending:!1,flushingStateChange:!1,usedWarningKeys:new Set}}}function getKeyMatchKey2(input){return resolveKeyMatch2(input)}class Keymap2{host;state=createKeymapState2();cleanedUp=!1;resources=new Map;cleanupListeners=[];events=new Emitter3(()=>{});hooks;notify;activation;runtime;conditions;catalog;executor;compiler;dispatch;layers;environment;keypressListener;keyreleaseListener;rawListener;focusedTargetListener;constructor(host){if(this.host=host,host.isDestroyed)throw Error("Cannot create a keymap for a destroyed host");if(this.hooks=new Emitter3((name,error2)=>{this.notify.reportListenerError(name,error2)}),this.notify=new NotificationService2(this.state,this.events,this.hooks),this.conditions=new ConditionService2(this.state,this.notify),this.catalog=new CommandCatalogService2(this.state,this.host,this.notify,this.conditions,{onCommandResolversChanged:()=>{this.activation.ensureValidPendingSequence()}}),this.activation=new ActivationService2(this.state,this.host,this.hooks,this.notify,this.conditions,this.catalog,{onPendingSequenceChanged:(previous,next)=>{this.dispatch?.handlePendingSequenceChange(previous,next)}}),this.runtime=new RuntimeService2(this.state,this.notify,this.conditions,this.activation),this.executor=new CommandExecutorService2(this.notify,this.runtime,this.activation,this.catalog,{keymap:this,createCommandEvent:()=>this.host.createCommandEvent()}),this.compiler=new CompilerService2(this.state,this.notify,this.conditions,{warnUnknownField:(kind,fieldName)=>{this.warnUnknownField(kind,fieldName)},warnUnknownToken:(token,sequence)=>{this.warnUnknownToken(token,sequence)}}),this.layers=new LayerService2(this.state,this.notify,this.conditions,this.activation,{compiler:this.compiler,commands:this.catalog,host:this.host,warnUnknownField:(kind,fieldName)=>{this.warnUnknownField(kind,fieldName)}}),this.environment=new EnvironmentService2(this.state,this.notify,this.compiler,this.layers),this.dispatch=new DispatchService2(this.state,this.notify,this.runtime,this.activation,this.conditions,this.executor,this.compiler,this.catalog,this.layers),this.keypressListener=(event)=>{this.dispatch.handleKeyEvent(event,!1)},this.keyreleaseListener=(event)=>{this.dispatch.handleKeyEvent(event,!0)},this.rawListener=(sequence)=>{return this.dispatch.handleRawSequence(sequence)},this.focusedTargetListener=(focused)=>{this.handleFocusedTargetChange(focused)},this.cleanupListeners.push(this.host.onKeyPress(this.keypressListener)),this.cleanupListeners.push(this.host.onKeyRelease(this.keyreleaseListener)),this.host.onRawInput)this.cleanupListeners.push(this.host.onRawInput(this.rawListener));if(this.cleanupListeners.push(this.host.onFocusChange(this.focusedTargetListener)),this.host.onDestroy)this.cleanupListeners.push(this.host.onDestroy(()=>{this.cleanup()}))}cleanup(){if(this.cleanedUp)return;this.cleanedUp=!0,this.activation.setPendingSequence(null);for(let resource of this.resources.values())resource.dispose();this.resources.clear(),this.layers.cleanup();for(let cleanupListener of this.cleanupListeners.splice(0))cleanupListener()}setData(name,value){this.runtime.setData(name,value)}getData(name){return this.runtime.getData(name)}hasPendingSequence(){return this.activation.ensureValidPendingSequence()!==void 0}getPendingSequence(){return this.activation.getPendingSequence()}createKeyMatcher(key){let match=this.compiler.parseTokenKey(key).match;return(input)=>{if(!input)return!1;return getKeyMatchKey2(input)===match}}clearPendingSequence(){this.activation.setPendingSequence(null)}popPendingSequence(){return this.activation.popPendingSequence()}getActiveKeys(options){return this.activation.getActiveKeys(options)}getCommands(query2){return this.catalog.getCommands(query2)}getCommandEntries(query2){return this.catalog.getCommandEntries(query2)}normalizeCommandName(name){return normalizeCommandName2(name)}normalizeBindings(bindings){return normalizeBindingInputs2(bindings)}acquireResource(key,setup){if(this.cleanedUp||this.host.isDestroyed)throw Error("Cannot use a keymap after its host was destroyed");let existing=this.resources.get(key);if(existing)return existing.count+=1,()=>{this.releaseResource(key,existing)};let resource={count:1,dispose:setup()};return this.resources.set(key,resource),()=>{this.releaseResource(key,resource)}}runCommand(cmd,options){return this.executor.runCommand(cmd,options)}dispatchCommand(cmd,options){return this.executor.dispatchCommand(cmd,options)}on(name,fn){if(name==="warning")return this.events.hook(name,fn);if(name==="error")return this.events.hook(name,fn);return this.hooks.hook(name,fn)}intercept(name,fn,options){if(name==="key")return this.dispatch.intercept(name,fn,options);return this.dispatch.intercept(name,fn,options)}registerLayer(layer){return this.layers.registerLayer(layer)}registerLayerFields(fields){return this.environment.registerLayerFields(fields)}prependBindingTransformer(transformer){return this.environment.prependBindingTransformer(transformer)}appendBindingTransformer(transformer){return this.environment.appendBindingTransformer(transformer)}clearBindingTransformers(){this.environment.clearBindingTransformers()}prependBindingParser(parser){return this.environment.prependBindingParser(parser)}appendBindingParser(parser){return this.environment.appendBindingParser(parser)}clearBindingParsers(){this.environment.clearBindingParsers()}registerToken(token){return this.environment.registerToken(token)}prependBindingExpander(expander){return this.environment.prependBindingExpander(expander)}appendBindingExpander(expander){return this.environment.appendBindingExpander(expander)}clearBindingExpanders(){this.environment.clearBindingExpanders()}registerBindingFields(fields){return this.environment.registerBindingFields(fields)}registerCommandFields(fields){return this.environment.registerCommandFields(fields)}prependCommandResolver(resolver){return this.catalog.prependCommandResolver(resolver)}appendCommandResolver(resolver){return this.catalog.appendCommandResolver(resolver)}clearCommandResolvers(){this.catalog.clearCommandResolvers()}prependLayerAnalyzer(analyzer){return this.layers.prependLayerAnalyzer(analyzer)}appendLayerAnalyzer(analyzer){return this.layers.appendLayerAnalyzer(analyzer)}clearLayerAnalyzers(){this.layers.clearLayerAnalyzers()}prependEventMatchResolver(resolver){return this.dispatch.prependEventMatchResolver(resolver)}appendEventMatchResolver(resolver){return this.dispatch.appendEventMatchResolver(resolver)}clearEventMatchResolvers(){this.dispatch.clearEventMatchResolvers()}prependDisambiguationResolver(resolver){return this.dispatch.prependDisambiguationResolver(resolver)}appendDisambiguationResolver(resolver){return this.dispatch.appendDisambiguationResolver(resolver)}clearDisambiguationResolvers(){this.dispatch.clearDisambiguationResolvers()}handleFocusedTargetChange(_focused){this.notify.runWithStateChangeBatch(()=>{this.activation.setPendingSequence(null),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(_focused),this.notify.queueStateChange()})}warnUnknownField(kind,fieldName){this.notify.warnOnce(`${kind}:${fieldName}`,`unknown-${kind}-field`,{field:fieldName,kind},`[Keymap] Unknown ${kind} field "${fieldName}" was ignored`)}warnUnknownToken(token,sequence){this.notify.warnOnce(`token:${token}`,"unknown-token",{token,sequence},`[Keymap] Unknown token "${token}" in key sequence "${sequence}" was ignored`)}releaseResource(key,resource){if(this.resources.get(key)!==resource)return;if(resource.count-=1,resource.count>0)return;resource.dispose(),this.resources.delete(key)}}function parseObjectKeyInput(ctx,key,display,match,tokenName){return ctx.parseObjectKey(key,{display,match,tokenName})}function isNamedSingleStrokeKey(input,extraNames){let normalized=input.trim().toLowerCase();if(!normalized)return!1;if(namedSingleStrokeKeys.has(normalized))return!0;if(extraNames?.has(normalized))return!0;return/^f\d{1,2}$/i.test(normalized)}function isSingleStrokeString(input,tokens2,normalizeTokenName,extraNames){if(input===" "||input==="+")return!0;if(input.length===1)return!0;if(tokens2.has(normalizeTokenName(input)))return!0;if(input.includes("+"))return!0;return isNamedSingleStrokeKey(input,extraNames)}function parseStringKeyPart(input,ctx){if(input===" ")return ctx.parseObjectKey({name:"space"},{display:"space"});if(input==="+")return ctx.parseObjectKey({name:"+"},{display:"+"});let parts=input.split("+"),name="",displayName="",ctrl=!1,shift=!1,meta=!1,superKey=!1,hyper=!1;for(let rawPart of parts){let part=rawPart.trim();if(!part)continue;let lowered=part.toLowerCase();if(lowered==="ctrl"||lowered==="control"){ctrl=!0;continue}if(lowered==="shift"){shift=!0;continue}if(lowered==="meta"||lowered==="alt"||lowered==="option"){meta=!0;continue}if(lowered==="super"){superKey=!0;continue}if(lowered==="hyper"){hyper=!0;continue}if(name)throw Error(`Invalid key "${input}": multiple key names are not supported`);name=part,displayName=lowered}if(!name)throw Error(`Invalid key "${input}": missing key name`);let displayParts=[];if(ctrl)displayParts.push("ctrl");if(shift)displayParts.push("shift");if(meta)displayParts.push("meta");if(superKey)displayParts.push("super");if(hyper)displayParts.push("hyper");return displayParts.push(displayName),ctx.parseObjectKey({name,ctrl,shift,meta,super:superKey,hyper:hyper||void 0},{display:displayParts.join("+")})}function registerDefaultBindingParser(keymap){return keymap.appendBindingParser(defaultBindingParser)}function registerDefaultEventMatchResolver(keymap){return keymap.appendEventMatchResolver(defaultEventMatchResolver)}function registerDefaultKeys(keymap){let offParser=registerDefaultBindingParser(keymap),offResolver=registerDefaultEventMatchResolver(keymap);return()=>{offResolver(),offParser()}}function isReactiveMatcher22(value){if(!value||typeof value!=="object")return!1;let candidate=value;return typeof candidate.get==="function"&&typeof candidate.subscribe==="function"}function normalizeEnabledValue(fieldName,value){if(typeof value==="boolean")return value;if(typeof value==="function")return value;if(isReactiveMatcher22(value))return value;throw Error(`Keymap enabled field "${fieldName}" must be a boolean, a function, or a reactive matcher`)}function registerEnabledFields(keymap){let offLayerFields=keymap.registerLayerFields({enabled(value,ctx){let normalized=normalizeEnabledValue("enabled",value);if(normalized===!0)return;if(normalized===!1){ctx.activeWhen(()=>!1);return}ctx.activeWhen(normalized)}}),offCommandFields=keymap.registerCommandFields({enabled(value,ctx){let normalized=normalizeEnabledValue("enabled",value);if(normalized===!0)return;if(normalized===!1){ctx.activeWhen(()=>!1);return}ctx.activeWhen(normalized)}});return()=>{offCommandFields(),offLayerFields()}}function normalizeMetadataText(fieldName,value){if(typeof value!=="string")throw Error(`Keymap metadata field "${fieldName}" must be a string`);let trimmed=value.trim();if(!trimmed)throw Error(`Keymap metadata field "${fieldName}" cannot be empty`);return trimmed}function registerMetadataFields(keymap){let offBindingFields=keymap.registerBindingFields({desc(value,ctx){ctx.attr("desc",normalizeMetadataText("desc",value))},group(value,ctx){ctx.attr("group",normalizeMetadataText("group",value))}}),offCommandFields=keymap.registerCommandFields({desc(value,ctx){ctx.attr("desc",normalizeMetadataText("desc",value))},title(value,ctx){ctx.attr("title",normalizeMetadataText("title",value))},category(value,ctx){ctx.attr("category",normalizeMetadataText("category",value))}});return()=>{offCommandFields(),offBindingFields()}}function createSyntheticCommandEvent(){return new KeyEvent({name:"command",ctrl:!1,meta:!1,shift:!1,option:!1,sequence:"",number:!1,raw:"",eventType:"press",source:"raw"})}function createOpenTuiKeymapHost(renderer){return{rootTarget:renderer.root,get isDestroyed(){return renderer.isDestroyed},getFocusedTarget(){let focused=renderer.currentFocusedRenderable;if(!focused||focused.isDestroyed||!focused.focused)return null;return focused},getParentTarget(target){return target.parent},isTargetDestroyed(target){return target.isDestroyed},onKeyPress(listener){return renderer.keyInput.prependListener("keypress",listener),()=>{renderer.keyInput.off("keypress",listener)}},onKeyRelease(listener){return renderer.keyInput.prependListener("keyrelease",listener),()=>{renderer.keyInput.off("keyrelease",listener)}},onFocusChange(listener){return renderer.on(CliRenderEvents.FOCUSED_RENDERABLE,listener),()=>{renderer.off(CliRenderEvents.FOCUSED_RENDERABLE,listener)}},onDestroy(listener){return renderer.once(CliRenderEvents.DESTROY,listener),()=>{renderer.off(CliRenderEvents.DESTROY,listener)}},onTargetDestroy(target,listener){return target.once(RenderableEvents.DESTROYED,listener),()=>{target.off(RenderableEvents.DESTROYED,listener)}},onRawInput(listener){return renderer.prependInputHandler(listener),()=>{renderer.removeInputHandler(listener)}},createCommandEvent(){return createSyntheticCommandEvent()}}}function createOpenTuiKeymap(renderer){if(renderer.isDestroyed)throw Error("Cannot create a keymap for a destroyed renderer");return new Keymap2(createOpenTuiKeymapHost(renderer))}function createDefaultOpenTuiKeymap(renderer){let keymap=createOpenTuiKeymap(renderer);return registerDefaultKeys(keymap),registerEnabledFields(keymap),registerMetadataFields(keymap),keymap}var RESERVED_COMMAND_FIELDS2,RESERVED_BINDING_FIELDS2,RESERVED_LAYER_FIELDS2,DEFAULT_COMMAND_SEARCH_FIELDS2,SNAPSHOT_COMMAND_METADATA_OPTIONS2,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS2,EMPTY_COMMAND_FIELDS2,EMPTY_COMPILE_FIELDS2,EMPTY_REQUIRES2,EMPTY_MATCHERS2,EMPTY_CONDITION_KEYS2,KEY_DISAMBIGUATION_DECISION2,KEY_DEFERRED_DISAMBIGUATION_DECISION2,NOOP3=()=>{},NOOP22=()=>{},MAX_STATE_CHANGE_FLUSH_ITERATIONS2=1000,OrderedRegistry2,PriorityRegistry2,EMPTY_DATA2,namedSingleStrokeKeys,defaultBindingParser=(ctx)=>{let{input,index,tokens:tokens2,normalizeTokenName}=ctx;if(index===0&&isSingleStrokeString(input,tokens2,normalizeTokenName)){if(input===" "||input==="+")return{parts:[parseStringKeyPart(input,ctx)],nextIndex:input.length};let normalizedToken=normalizeTokenName(input),token=tokens2.get(normalizedToken);if(token)return{parts:[parseObjectKeyInput(ctx,token.stroke,normalizedToken,token.match,normalizedToken)],nextIndex:input.length,usedTokens:[normalizedToken]};return{parts:[parseStringKeyPart(input,ctx)],nextIndex:input.length}}let char=input[index];if(char===void 0)return;if(char==="<"){let end=input.indexOf(">",index);if(end===-1)throw Error(`Invalid key sequence "${input}": unterminated token`);let tokenName=normalizeTokenName(input.slice(index,end+1)),token=tokens2.get(tokenName);if(!token)return{parts:[],nextIndex:end+1,unknownTokens:[tokenName]};return{parts:[parseObjectKeyInput(ctx,token.stroke,tokenName,token.match,tokenName)],nextIndex:end+1,usedTokens:[tokenName]}}return{parts:[parseStringKeyPart(char,ctx)],nextIndex:index+1}},defaultEventMatchResolver=(event,ctx)=>{return[ctx.resolveKey({name:event.name,ctrl:event.ctrl,shift:event.shift,meta:event.meta,super:event.super??!1,hyper:event.hyper||void 0})]};var init_opentui=__esm(async()=>{await init_core();RESERVED_COMMAND_FIELDS2=new Set(["name","run"]),RESERVED_BINDING_FIELDS2=new Set(["key","cmd","event","preventDefault","fallthrough"]),RESERVED_LAYER_FIELDS2=new Set(["target","targetMode","priority","bindings","commands"]);DEFAULT_COMMAND_SEARCH_FIELDS2=["name"],SNAPSHOT_COMMAND_METADATA_OPTIONS2=Object.freeze({deep:!0,preserveNonPlainObjects:!0}),SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS2=Object.freeze({deep:!0,freeze:!0,preserveNonPlainObjects:!0}),EMPTY_COMMAND_FIELDS2=Object.freeze({});EMPTY_COMPILE_FIELDS2=Object.freeze({}),EMPTY_REQUIRES2=[],EMPTY_MATCHERS2=[],EMPTY_CONDITION_KEYS2=[];KEY_DISAMBIGUATION_DECISION2=Symbol("keymap-disambiguation-decision"),KEY_DEFERRED_DISAMBIGUATION_DECISION2=Symbol("keymap-deferred-disambiguation-decision");OrderedRegistry2=class OrderedRegistry2 extends CopyOnWriteRegistry2{append(value){return this.setItems([...this.getItems(),value]),()=>{this.remove(value)}}prepend(value){return this.setItems([value,...this.getItems()]),()=>{this.remove(value)}}remove(value){return this.removeItem(value)}values(){return this.getItems()}};PriorityRegistry2=class PriorityRegistry2 extends CopyOnWriteRegistry2{order=0;register(listener,options){let registered={...options,listener,order:this.order++};return this.setItems([...this.getItems(),registered].sort((left,right)=>{let priorityDiff=right.priority-left.priority;if(priorityDiff!==0)return priorityDiff;return left.order-right.order})),()=>{this.removeItem(registered)}}entries(){return this.getItems()}};EMPTY_DATA2=Object.freeze({});namedSingleStrokeKeys=new Set(["up","down","left","right","clear","escape","return","linefeed","enter","tab","backspace","delete","insert","home","end","pageup","pagedown","space","lt","gt","plus","minus","equal","comma","period","slash","backslash","semicolon","quote","backquote","leftbracket","rightbracket","capslock","numlock","scrolllock","printscreen","pause","menu","apps","kp0","kp1","kp2","kp3","kp4","kp5","kp6","kp7","kp8","kp9","kpdecimal","kpdivide","kpmultiply","kpminus","kpplus","kpenter","kpequal","kpseparator","kpleft","kpright","kpup","kpdown","kppageup","kppagedown","kphome","kpend","kpinsert","kpdelete","mediaplay","mediapause","mediaplaypause","mediareverse","mediastop","mediafastforward","mediarewind","medianext","mediaprev","mediarecord","volumedown","volumeup","mute","leftshift","leftctrl","leftalt","leftsuper","lefthyper","leftmeta","rightshift","rightctrl","rightalt","rightsuper","righthyper","rightmeta","iso_level3_shift","iso_level5_shift","option","alt","meta","super","hyper","control","ctrl","shift"])});function createTuiKeymap(renderer){let keymap=createDefaultOpenTuiKeymap(renderer);return registerLeader(keymap,{trigger:{name:"space"}}),registerEscapeClearsPendingSequence(keymap),keymap}var init_keymap=__esm(async()=>{init_addons();await init_opentui()});import{spawnSync as spawnSync10}from"child_process";import{existsSync as existsSync77}from"fs";function resolveTuiTmuxConf(){let tuiConf=`${process.env.GENIE_HOME??`${process.env.HOME}/.genie`}/tui-tmux.conf`;return existsSync77(tuiConf)?tuiConf:"/dev/null"}function safeHex(value,fallback){if(!value)return fallback;let trimmed=value.trim();return HEX_COLOR_RE.test(trimmed)?trimmed:fallback}function resolveThemePalette(snapshot){if(snapshot.mode==="dark")return{bg:palette.bg,bgRaised:palette.bgRaised,text:palette.text,textDim:palette.textDim,textMuted:palette.textMuted,border:palette.border,accent:palette.accent,accentDim:palette.accentDim,accentBright:palette.accentBright,warning:palette.warning,info:palette.info};return{...lightPalette,bg:safeHex(snapshot.terminalBackground,lightPalette.bg),text:safeHex(snapshot.terminalForeground,lightPalette.text)}}function flattenTmuxCommands(commands){let args=[];return commands.forEach((command,index)=>{if(index>0)args.push(";");args.push(...command)}),args}function buildTuiTmuxThemeCommands(snapshot){let theme=resolveThemePalette(snapshot),terminalForeground=safeHex(snapshot.terminalForeground,theme.text),terminalBackground=safeHex(snapshot.terminalBackground,theme.bg);return flattenTmuxCommands([["set-environment","-g","GENIE_TUI_THEME_MODE",snapshot.mode],["set-environment","-g","GENIE_TUI_TERMINAL_FG",terminalForeground],["set-environment","-g","GENIE_TUI_TERMINAL_BG",terminalBackground],["set-environment","-g","GENIE_TUI_TMUX_BG",theme.bg],["set-environment","-g","GENIE_TUI_TMUX_TEXT",theme.text],["set-environment","-g","GENIE_TUI_TMUX_ACCENT",theme.accent],["set-option","-g","pane-border-style",`fg=${theme.border}`],["set-option","-g","pane-active-border-style",`fg=${theme.accent}`],["set-option","-g","message-style",`bg=${theme.bgRaised},fg=${theme.info}`],["set-option","-g","message-command-style",`bg=${theme.bgRaised},fg=${theme.warning}`],["set-option","-g","status-style",`bg=${theme.bg},fg=${theme.text}`],["set-window-option","-g","mode-style",`bg=${theme.accent},fg=${theme.bg}`],["set-window-option","-g","clock-mode-colour",theme.accent]])}function syncTuiTmuxTheme(snapshot,deps={}){let run=deps.spawnSync??spawnSync10,tmux=deps.tmuxBin??tmuxBin(),socketName=deps.socketName??TUI_TMUX_SOCKET,configPath2=deps.configPath??resolveTuiTmuxConf(),timeoutMs=deps.timeoutMs??DEFAULT_TMUX_SYNC_TIMEOUT_MS;return run(tmux,["-L",socketName,"-f",configPath2,...buildTuiTmuxThemeCommands(snapshot)],{stdio:"ignore",timeout:timeoutMs}).status===0}var TUI_TMUX_SOCKET="genie-tui",DEFAULT_TMUX_SYNC_TIMEOUT_MS=300,HEX_COLOR_RE,lightPalette;var init_tmux_theme_sync=__esm(()=>{init_ensure_tmux();init_theme2();HEX_COLOR_RE=/^#[0-9a-f]{6}$/i,lightPalette={bg:"#f5efe4",bgRaised:"#ebe3d7",text:"#24323a",textDim:"#56656d",textMuted:"#718087",border:"#c8bdae",accent:"#2f7a62",accentDim:"#3e9277",accentBright:"#17694f",warning:"#9a651e",info:"#406f8b"}});function readBool(env2,name,fallback){let raw=env2[name];if(!raw)return fallback;let normalized=raw.trim().toLowerCase();if(TRUTHY3.has(normalized))return!0;if(FALSY.has(normalized))return!1;return fallback}function readPositiveInt(env2,name,fallback){let raw=env2[name];if(!raw)return fallback;let parsed=Number.parseInt(raw,10);return Number.isFinite(parsed)&&parsed>0?parsed:fallback}function inferThemeMode(background){if(!background||!/^#[0-9a-f]{6}$/i.test(background))return null;let r=Number.parseInt(background.slice(1,3),16),g2=Number.parseInt(background.slice(3,5),16),b3=Number.parseInt(background.slice(5,7),16);return(0.2126*r+0.7152*g2+0.0722*b3)/255>=0.5?"light":"dark"}function snapshotKey(snapshot){return[snapshot.mode,snapshot.terminalForeground??"",snapshot.terminalBackground??""].join("|")}function buildSnapshot(mode,colors8){let resolvedMode=mode??inferThemeMode(colors8?.defaultBackground);if(!resolvedMode)return null;return{mode:resolvedMode,terminalForeground:colors8?.defaultForeground,terminalBackground:colors8?.defaultBackground}}function installOpenTui20Bridge(renderer,options={}){let env2=options.env??process.env;if(!readBool(env2,"GENIE_TUI_TMUX_THEME_SYNC",!0))return()=>{};let syncTheme=options.syncTheme??syncTuiTmuxTheme,themeQueryTimeoutMs=readPositiveInt(env2,"GENIE_TUI_THEME_QUERY_TIMEOUT_MS",DEFAULT_THEME_QUERY_TIMEOUT_MS),tmuxApplyTimeoutMs=readPositiveInt(env2,"GENIE_TUI_TMUX_THEME_SYNC_TIMEOUT_MS",DEFAULT_TMUX_APPLY_TIMEOUT_MS),disposed=!1,lastSnapshot="",syncSnapshot=(snapshot)=>{if(disposed||!snapshot)return;let key=snapshotKey(snapshot);if(key===lastSnapshot)return;lastSnapshot=key;try{syncTheme(snapshot,{timeoutMs:tmuxApplyTimeoutMs})}catch{}},syncFromMode=(mode,colors8)=>{syncSnapshot(buildSnapshot(mode,colors8))},onThemeMode=(mode)=>syncFromMode(mode);renderer.on("theme_mode",onThemeMode),syncFromMode(renderer.themeMode),renderer.waitForThemeMode(themeQueryTimeoutMs).then((mode)=>syncFromMode(mode)).catch(()=>{});let paletteOptions={size:OPEN_TUI_02_PALETTE_SIZE,timeout:themeQueryTimeoutMs};return renderer.getPalette(paletteOptions).then((colors8)=>syncFromMode(renderer.themeMode,colors8)).catch(()=>{}),()=>{disposed=!0,renderer.off("theme_mode",onThemeMode)}}var TRUTHY3,FALSY,DEFAULT_THEME_QUERY_TIMEOUT_MS=700,DEFAULT_TMUX_APPLY_TIMEOUT_MS=300,OPEN_TUI_02_PALETTE_SIZE=16;var init_opentui_bridge=__esm(()=>{init_tmux_theme_sync();TRUTHY3=new Set(["1","true","yes","on"]),FALSY=new Set(["0","false","no","off"])});var exports_render={};__export(exports_render,{resolveTuiRendererConfig:()=>resolveTuiRendererConfig,renderNav:()=>renderNav});function readBool2(env2,name,fallback){let raw=env2[name];if(!raw)return fallback;let normalized=raw.trim().toLowerCase();if(TRUTHY4.has(normalized))return!0;if(FALSY2.has(normalized))return!1;return fallback}function readPositiveInt2(env2,name){let raw=env2[name];if(!raw)return;let parsed=Number.parseInt(raw,10);return Number.isFinite(parsed)&&parsed>0?parsed:void 0}function resolveTuiRendererConfig(env2=process.env,platform2=process.platform){let isDarwin=platform2==="darwin",targetFps=readPositiveInt2(env2,"GENIE_TUI_TARGET_FPS")??(isDarwin?8:30),configuredMaxFps=readPositiveInt2(env2,"GENIE_TUI_MAX_FPS")??(isDarwin?12:60),maxFps=Math.max(configuredMaxFps,targetFps),useMouse=readBool2(env2,"GENIE_TUI_MOUSE",!0),enableMouseMovement=useMouse&&readBool2(env2,"GENIE_TUI_MOUSE_MOVEMENT",!isDarwin),consoleEnabled=readBool2(env2,"GENIE_TUI_CONSOLE",!0),kittyKeyboardOptIn=readBool2(env2,"GENIE_TUI_KITTY_KEYBOARD",!isDarwin);return{exitOnCtrlC:!1,useThread:!isDarwin,targetFps,maxFps,useMouse,enableMouseMovement,useKittyKeyboard:kittyKeyboardOptIn?void 0:null,consoleMode:consoleEnabled?void 0:"disabled",openConsoleOnError:consoleEnabled&&!isDarwin}}async function renderNav(){let rightPane=process.env.GENIE_TUI_RIGHT||void 0,workspaceRoot=process.env.GENIE_TUI_WORKSPACE||void 0,initialAgent=process.env.GENIE_TUI_AGENT||void 0,renderer=await createCliRenderer(resolveTuiRendererConfig()),disposeOpenTui20Bridge=installOpenTui20Bridge(renderer),keymap=createTuiKeymap(renderer);createRoot(renderer).render(import_jsx_dev_runtime2.jsxDEV(KeymapProvider,{keymap,children:import_jsx_dev_runtime2.jsxDEV(App,{rightPane,workspaceRoot,initialAgent},void 0,!1,void 0,this)},void 0,!1,void 0,this)),await new Promise((resolve23)=>{renderer.once("destroy",()=>{disposeOpenTui20Bridge(),resolve23()})})}var TRUTHY4,FALSY2;var init_render=__esm(async()=>{init_react();init_opentui_bridge();init_jsx_dev_runtime();await __promiseAll([init_core(),init_react2(),init_app(),init_keymap()]);TRUTHY4=new Set(["1","true","yes","on"]),FALSY2=new Set(["0","false","no","off"])});var exports_tui={};__export(exports_tui,{launchTui:()=>launchTui});import{appendFileSync as appendFileSync6,closeSync as closeSync6,mkdirSync as mkdirSync35,openSync as openSync6,readSync as readSync3,statSync as statSync17}from"fs";import{homedir as homedir52}from"os";import{join as join94}from"path";function genieHome6(){return process.env.GENIE_HOME??join94(homedir52(),".genie")}function extractPreviousRunCrashOutput(logPath){let fd=null;try{let size=statSync17(logPath).size;if(size===0)return"";let readSize=Math.min(size,TUI_CRASH_LOG_RECOVERY_MAX_BYTES);fd=openSync6(logPath,"r");let buffer2=Buffer.alloc(readSize);readSync3(fd,buffer2,0,readSize,size-readSize);let text=buffer2.toString("utf-8"),lastBannerIndex=text.lastIndexOf(TUI_CRASH_LOG_BANNER_PREFIX);if(lastBannerIndex<0)return"";let afterBannerNewline=text.indexOf(`
|
|
4013
|
+
`),service=util4.getValue(lines,"Service",":"),errorCode=util4.getValue(lines,"ConfigManagerErrorCode",":");if(util4.getValue(lines,"PNPClass",":").toLowerCase()==="bluetooth"&&errorCode==="0"&&service==="")result2.push(parseWindowsBluetooth(lines))});if(callback)callback(result2);resolve23(result2)});if(_freebsd||_netbsd||_openbsd||_sunos)resolve23(null)})})}exports.bluetoothDevices=bluetoothDevices});var require_lib5=__commonJS((exports)=>{var lib_version=require_package().version,util4=require_util3(),system=require_system(),osInfo=require_osinfo(),cpu=require_cpu(),memory=require_memory(),battery=require_battery(),graphics=require_graphics(),filesystem=require_filesystem(),network=require_network(),wifi=require_wifi(),processes=require_processes(),users=require_users(),internet=require_internet(),docker=require_docker(),vbox=require_virtualbox(),printer=require_printer(),usb=require_usb(),audio=require_audio(),bluetooth=require_bluetooth(),_platform=process.platform,_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";if(_windows)util4.getCodepage(),util4.getPowershell();function version(){return lib_version}function getStaticData(callback){return new Promise((resolve23)=>{process.nextTick(()=>{let data={};data.version=version(),Promise.all([system.system(),system.bios(),system.baseboard(),system.chassis(),osInfo.osInfo(),osInfo.uuid(),osInfo.versions(),cpu.cpu(),cpu.cpuFlags(),graphics.graphics(),network.networkInterfaces(),memory.memLayout(),filesystem.diskLayout(),audio.audio(),bluetooth.bluetoothDevices(),usb.usb(),printer.printer()]).then((res)=>{if(data.system=res[0],data.bios=res[1],data.baseboard=res[2],data.chassis=res[3],data.os=res[4],data.uuid=res[5],data.versions=res[6],data.cpu=res[7],data.cpu.flags=res[8],data.graphics=res[9],data.net=res[10],data.memLayout=res[11],data.diskLayout=res[12],data.audio=res[13],data.bluetooth=res[14],data.usb=res[15],data.printer=res[16],callback)callback(data);resolve23(data)})})})}function getDynamicData(srv,iface,callback){if(util4.isFunction(iface))callback=iface,iface="";if(util4.isFunction(srv))callback=srv,srv="";return new Promise((resolve23)=>{process.nextTick(()=>{iface=iface||network.getDefaultNetworkInterface(),srv=srv||"";let functionProcessed=(()=>{let totalFunctions=15;if(_windows)totalFunctions=13;if(_freebsd||_openbsd||_netbsd)totalFunctions=11;if(_sunos)totalFunctions=6;return function(){if(--totalFunctions===0){if(callback)callback(data);resolve23(data)}}})(),data={};if(data.time=osInfo.time(),data.node=process.versions.node,data.v8=process.versions.v8,cpu.cpuCurrentSpeed().then((res)=>{data.cpuCurrentSpeed=res,functionProcessed()}),users.users().then((res)=>{data.users=res,functionProcessed()}),processes.processes().then((res)=>{data.processes=res,functionProcessed()}),cpu.currentLoad().then((res)=>{data.currentLoad=res,functionProcessed()}),!_sunos)cpu.cpuTemperature().then((res)=>{data.temp=res,functionProcessed()});if(!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)network.networkStats(iface).then((res)=>{data.networkStats=res,functionProcessed()});if(!_sunos)network.networkConnections().then((res)=>{data.networkConnections=res,functionProcessed()});if(memory.mem().then((res)=>{data.mem=res,functionProcessed()}),!_sunos)battery().then((res)=>{data.battery=res,functionProcessed()});if(!_sunos)processes.services(srv).then((res)=>{data.services=res,functionProcessed()});if(!_sunos)filesystem.fsSize().then((res)=>{data.fsSize=res,functionProcessed()});if(!_windows&&!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)filesystem.fsStats().then((res)=>{data.fsStats=res,functionProcessed()});if(!_windows&&!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)filesystem.disksIO().then((res)=>{data.disksIO=res,functionProcessed()});if(!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)wifi.wifiNetworks().then((res)=>{data.wifiNetworks=res,functionProcessed()});internet.inetLatency().then((res)=>{data.inetLatency=res,functionProcessed()})})})}function getAllData(srv,iface,callback){return new Promise((resolve23)=>{process.nextTick(()=>{let data={};if(iface&&util4.isFunction(iface)&&!callback)callback=iface,iface="";if(srv&&util4.isFunction(srv)&&!iface&&!callback)callback=srv,srv="",iface="";getStaticData().then((res)=>{data=res,getDynamicData(srv,iface).then((res2)=>{for(let key in res2)if({}.hasOwnProperty.call(res2,key))data[key]=res2[key];if(callback)callback(data);resolve23(data)})})})})}function get3(valueObject,callback){return new Promise((resolve23)=>{process.nextTick(()=>{let allPromises=Object.keys(valueObject).filter((func)=>({}).hasOwnProperty.call(exports,func)).map((func)=>{let params=valueObject[func].substring(valueObject[func].lastIndexOf("(")+1,valueObject[func].lastIndexOf(")")),funcWithoutParams=func.indexOf(")")>=0?func.split(")")[1].trim():func;if(funcWithoutParams=func.indexOf("|")>=0?func.split("|")[0].trim():funcWithoutParams,params)return exports[funcWithoutParams](params);else return exports[funcWithoutParams]("")});Promise.all(allPromises).then((data)=>{let result2={},i2=0;for(let key in valueObject)if({}.hasOwnProperty.call(valueObject,key)&&{}.hasOwnProperty.call(exports,key)&&data.length>i2){if(valueObject[key]==="*"||valueObject[key]==="all")result2[key]=data[i2];else{let keys=valueObject[key],filter="",filterParts=[];if(keys.indexOf(")")>=0)keys=keys.split(")")[1].trim();if(keys.indexOf("|")>=0)filter=keys.split("|")[1].trim(),filterParts=filter.split(":"),keys=keys.split("|")[0].trim();if(keys=keys.replace(/,/g," ").replace(/ +/g," ").split(" "),data[i2])if(Array.isArray(data[i2])){let partialArray=[];data[i2].forEach((element)=>{let partialRes={};if(keys.length===1&&(keys[0]==="*"||keys[0]==="all"))partialRes=element;else keys.forEach((k2)=>{if({}.hasOwnProperty.call(element,k2))partialRes[k2]=element[k2]});if(filter&&filterParts.length===2){if({}.hasOwnProperty.call(partialRes,filterParts[0].trim())){let val=partialRes[filterParts[0].trim()];if(typeof val==="number"){if(val===parseFloat(filterParts[1].trim()))partialArray.push(partialRes)}else if(typeof val==="string"){if(val.toLowerCase()===filterParts[1].trim().toLowerCase())partialArray.push(partialRes)}}}else partialArray.push(partialRes)}),result2[key]=partialArray}else{let partialRes={};keys.forEach((k2)=>{if({}.hasOwnProperty.call(data[i2],k2))partialRes[k2]=data[i2][k2]}),result2[key]=partialRes}else result2[key]={}}i2++}if(callback)callback(result2);resolve23(result2)})})})}function observe(valueObject,interval,callback){let _data=null;return setInterval(()=>{get3(valueObject).then((data)=>{if(JSON.stringify(_data)!==JSON.stringify(data))_data=Object.assign({},data),callback(data)})},interval)}exports.version=version;exports.system=system.system;exports.bios=system.bios;exports.baseboard=system.baseboard;exports.chassis=system.chassis;exports.time=osInfo.time;exports.osInfo=osInfo.osInfo;exports.versions=osInfo.versions;exports.shell=osInfo.shell;exports.uuid=osInfo.uuid;exports.cpu=cpu.cpu;exports.cpuFlags=cpu.cpuFlags;exports.cpuCache=cpu.cpuCache;exports.cpuCurrentSpeed=cpu.cpuCurrentSpeed;exports.cpuTemperature=cpu.cpuTemperature;exports.currentLoad=cpu.currentLoad;exports.fullLoad=cpu.fullLoad;exports.mem=memory.mem;exports.memLayout=memory.memLayout;exports.battery=battery;exports.graphics=graphics.graphics;exports.fsSize=filesystem.fsSize;exports.fsOpenFiles=filesystem.fsOpenFiles;exports.blockDevices=filesystem.blockDevices;exports.fsStats=filesystem.fsStats;exports.disksIO=filesystem.disksIO;exports.diskLayout=filesystem.diskLayout;exports.networkInterfaceDefault=network.networkInterfaceDefault;exports.networkGatewayDefault=network.networkGatewayDefault;exports.networkInterfaces=network.networkInterfaces;exports.networkStats=network.networkStats;exports.networkConnections=network.networkConnections;exports.wifiNetworks=wifi.wifiNetworks;exports.wifiInterfaces=wifi.wifiInterfaces;exports.wifiConnections=wifi.wifiConnections;exports.services=processes.services;exports.processes=processes.processes;exports.processLoad=processes.processLoad;exports.users=users.users;exports.inetChecksite=internet.inetChecksite;exports.inetLatency=internet.inetLatency;exports.dockerInfo=docker.dockerInfo;exports.dockerImages=docker.dockerImages;exports.dockerContainers=docker.dockerContainers;exports.dockerContainerStats=docker.dockerContainerStats;exports.dockerContainerProcesses=docker.dockerContainerProcesses;exports.dockerVolumes=docker.dockerVolumes;exports.dockerAll=docker.dockerAll;exports.vboxInfo=vbox.vboxInfo;exports.printer=printer.printer;exports.usb=usb.usb;exports.audio=audio.audio;exports.bluetoothDevices=bluetooth.bluetoothDevices;exports.getStaticData=getStaticData;exports.getDynamicData=getDynamicData;exports.getAllData=getAllData;exports.get=get3;exports.observe=observe;exports.powerShellStart=util4.powerShellStart;exports.powerShellRelease=util4.powerShellRelease});import os4 from"os";function toGB(bytes){return Math.round(bytes/1073741824*10)/10}function bar(percent,width){let p=Math.max(0,Math.min(100,percent)),filled=Math.round(p/100*width);return`[${"=".repeat(filled)}${"-".repeat(width-filled)}]`}function pickColor(percent){if(percent>90)return palette.error;if(percent>70)return palette.warning;return palette.accent}function SystemStatsView({stats:stats2}){if(!stats2)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,backgroundColor:palette.bgRaised,children:import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"genie"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` v${VERSION}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this);let{cpu,ram,swap,load:load3}=stats2,hotStr=cpu.hotCores.map((c)=>`#${c.id} ${c.load}%`).join(" ");return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,backgroundColor:palette.bgRaised,children:[import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"genie"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` v${VERSION}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"CPU "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(cpu.combined),children:`${String(cpu.combined).padStart(3)}% ${bar(cpu.combined,8)}`},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` ${cpu.coreCount}c`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:" hot "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.warning,children:hotStr},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"RAM "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(ram.percent),children:`${ram.usedGB}/${ram.totalGB}G ${bar(ram.percent,8)}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),swap.totalGB>0?import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"SWP "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(swap.percent),children:`${swap.usedGB}/${swap.totalGB}G ${bar(swap.percent,8)}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Load "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(load3.percent),children:`${load3.percent}%`},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` (${load3.busy}/${load3.total} busy)`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function SystemStats(){let[stats2,setStats]=import_react23.useState(null),mountedRef=import_react23.useRef(!0);return import_react23.useEffect(()=>{mountedRef.current=!0;async function refresh(){try{let[cpu,mem]=await Promise.all([import_systeminformation.default.currentLoad(),import_systeminformation.default.mem()]);if(!mountedRef.current)return;let coreCount=os4.cpus().length,avg1=os4.loadavg()[0],sorted=cpu.cpus.map((c,i2)=>({id:i2,load:Math.round(c.load)})).sort((a,b3)=>b3.load-a.load);setStats({cpu:{combined:Math.round(cpu.currentLoad),hotCores:sorted.slice(0,3),coreCount},ram:{usedGB:toGB(mem.active),totalGB:toGB(mem.total),percent:mem.total>0?Math.round(mem.active/mem.total*100):0},swap:{usedGB:toGB(mem.swapused),totalGB:toGB(mem.swaptotal),percent:mem.swaptotal>0?Math.round(mem.swapused/mem.swaptotal*100):0},load:{percent:coreCount>0?Math.round(avg1/coreCount*100):0,busy:Math.round(avg1*10)/10,total:coreCount}})}catch{}}refresh();let timer2=setInterval(refresh,3000);return()=>{mountedRef.current=!1,clearInterval(timer2)}},[]),import_jsx_dev_runtime2.jsxDEV(SystemStatsView,{stats:stats2},void 0,!1,void 0,this)}var import_react23,import_systeminformation;var init_SystemStats=__esm(()=>{init_version();init_theme2();init_jsx_dev_runtime();import_react23=__toESM(require_react_development(),1),import_systeminformation=__toESM(require_lib5(),1)});function validateName(name){if(name.length===0)return null;try{return validateBranchName(name),null}catch(err){return err instanceof Error?err.message:String(err)}}function TeamCreate({availableAgents,workspaceRoot,onConfirm,onCancel}){let[step,setStep]=import_react25.useState("name"),[teamName,setTeamName]=import_react25.useState(""),[selected,setSelected]=import_react25.useState(()=>new Set),[memberCursor,setMemberCursor]=import_react25.useState(0),nameError=import_react25.useMemo(()=>validateName(teamName),[teamName]),nameValid=teamName.length>0&&nameError===null,intent=import_react25.useMemo(()=>({kind:"create-team",name:teamName.length>0?teamName:"TEAM_NAME",repo:workspaceRoot}),[teamName,workspaceRoot]),handleNameChange=import_react25.useCallback((value)=>{setTeamName(value)},[]),advanceFromName=import_react25.useCallback(()=>{if(!nameValid)return;setStep("members")},[nameValid]),toggleMember=import_react25.useCallback((name)=>{setSelected((prev)=>{let next=new Set(prev);if(next.has(name))next.delete(name);else next.add(name);return next})},[]),confirmMembers=import_react25.useCallback(()=>{onConfirm({teamName,members:Array.from(selected)})},[onConfirm,teamName,selected]);return useKeyboard((key)=>{if(step==="name"){handleNameStepKey(key,{onCancel,nameValid,advanceFromName});return}handleMembersStepKey(key,{availableAgents,memberCursor,setStep,setMemberCursor,toggleMember,confirmMembers})}),import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:palette.bgOverlay,children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderColor:palette.borderActive,backgroundColor:palette.bgRaised,paddingX:3,paddingY:1,flexDirection:"column",width:"100%",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"New team"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:step==="name"?" \u2014 step 1 of 2":" \u2014 step 2 of 2"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),step==="name"?import_jsx_dev_runtime2.jsxDEV(NameStep,{value:teamName,onChange:handleNameChange,onSubmit:advanceFromName,errorMessage:nameError},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV(MembersStep,{agents:availableAgents,selected,cursor:memberCursor},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent,hint:step==="name"?"Enter: next \xB7 Esc: cancel":"Space: toggle \xB7 Enter: create \xB7 Esc: back"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}function NameStep({value,onChange,onSubmit,errorMessage}){return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Team name (git-branch-safe):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("input",{value,onInput:onChange,onChange,onSubmit,focused:!0,placeholder:"feat/auth-bug",backgroundColor:palette.bg,textColor:palette.text,placeholderColor:palette.textMuted},void 0,!1,void 0,this),errorMessage!==null?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${errorMessage}`},void 0,!1,void 0,this)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}function MembersStep({agents,selected,cursor}){if(agents.length===0)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"No agents registered"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Members can be hired later via `genie team hire`."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Select members (space to toggle):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:agents.map((name,idx)=>{let isSelected=selected.has(name),isCursor=idx===cursor,tick=isSelected?"[x]":"[ ]",prefix=isCursor?"\u25B6 ":" ";return import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:isCursor?palette.accent:palette.textMuted,children:prefix},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:isSelected?palette.success:palette.textDim,children:tick},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:` ${name}`},void 0,!1,void 0,this)]},name,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function isEnter(key){return key.name==="enter"||key.name==="return"}function handleNameStepKey(key,opts){if(key.name==="escape"){opts.onCancel();return}if(isEnter(key)&&opts.nameValid)opts.advanceFromName()}function handleMembersStepKey(key,opts){if(key.name==="escape"){opts.setStep("name");return}if(opts.availableAgents.length===0){if(isEnter(key))opts.confirmMembers();return}if(key.name==="up"||key.name==="k"){opts.setMemberCursor((prev)=>prev<=0?opts.availableAgents.length-1:prev-1);return}if(key.name==="down"||key.name==="j"){opts.setMemberCursor((prev)=>prev>=opts.availableAgents.length-1?0:prev+1);return}if(key.name==="space"){let name=opts.availableAgents[opts.memberCursor];if(name)opts.toggleMember(name);return}if(isEnter(key))opts.confirmMembers()}var import_react25;var init_TeamCreate=__esm(async()=>{init_team_manager();init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react2();import_react25=__toESM(require_react_development(),1)});function getNodeIcon(node){if(node.type==="agent")return getAgentIcon(node);switch(node.type){case"session":return node.data.attached?"\u25B6":"\u25B8";case"window":return node.data.active?"\u25A0":"\u25A1";case"pane":return getPaneIcon(node);default:return" "}}function getAgentIcon(node){switch(node.workState){case"in_flight":return"\u25C6";case"paused":return"\u25D0";case"done":return"\u2714";case"stuck":return"\u2718";default:break}switch(node.wsAgentState){case"running":return"\u25CF";case"stopped":return"\u25CC";case"error":return"\u2298";case"spawning":return"\u231B";default:return"\u25CC"}}function getPaneIcon(node){if(node.data.isDead)return"\u2718";if(node.agentState==="working")return"\u25CF";if(node.agentState==="idle")return"\u25CB";if(node.agentState==="permission")return"\u26A0";if(node.agentState==="error")return"\u2718";if(node.data.isClaudeLike)return"\u25C6";return"\u25CB"}function getNodeColor(node){if(node.type==="agent")return getAgentColor(node);switch(node.type){case"session":return node.data.attached?palette.success:palette.textDim;case"window":return node.data.active?palette.info:palette.text;case"pane":return getPaneColor(node);default:return palette.text}}function getAgentColor(node){switch(node.workState){case"in_flight":return palette.accentBright;case"paused":return palette.textDim;case"done":return palette.info;case"stuck":return palette.error;default:break}switch(node.wsAgentState){case"running":return palette.success;case"stopped":return palette.text;case"error":return palette.error;case"spawning":return palette.warning;default:return palette.textDim}}function getPaneColor(node){if(node.data.isDead)return palette.error;if(node.agentState==="working")return palette.info;if(node.agentState==="permission")return palette.warning;if(node.agentState==="error")return palette.error;if(node.agentState==="idle")return palette.textDim;if(node.data.isClaudeLike)return palette.info;return palette.textDim}function getAgentSuffix(node){if(node.workState==="stuck")return" [stuck \u2014 press R to retry]";if(node.workState==="paused")return" [paused \u2014 auto-resume off]";if(node.workState==="done")return" [done]";if(node.wsAgentState==="spawning"&&node.activePanes===0)return" [stuck \u2014 press R to retry]";if(node.wsAgentState==="stopped")return" [Enter to start]";let wc=node.data.windowCount;if(wc>1)return` (${wc} windows)`;if(wc===1)return" (1 window)";return""}function getNodeSuffix(node){if(node.type==="agent")return getAgentSuffix(node);if(node.type==="session"||node.type==="pane"){let count=node.activePanes;if(count>0)return` ${icons.agent}${count}`}return""}function getStateColor(state){switch(state){case"working":return palette.info;case"idle":return palette.textDim;case"permission":return palette.warning;case"error":return palette.error;default:return palette.textMuted}}var import_react26,TreeNodeRow;var init_TreeNode=__esm(()=>{init_theme2();init_jsx_dev_runtime();import_react26=__toESM(require_react_development(),1),TreeNodeRow=import_react26.memo(function({node,selected,onSelect,onToggle,onContextMenu}){let indent2=" ".repeat(node.depth),hasChildren=node.children.length>0,expandIcon=hasChildren?node.expanded?icons.expanded:icons.collapsed:" ",icon=getNodeIcon(node),color2=getNodeColor(node),suffix=getNodeSuffix(node),labelColor=selected?palette.accentBright:node.type==="agent"&&node.kind==="subagent"?palette.textDim:palette.text;return import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",backgroundColor:selected?palette.accentDim:void 0,onMouseDown:(event)=>{if(event.button===2&&onContextMenu){onSelect(node.id),onContextMenu(node.id);return}if(onSelect(node.id),hasChildren)onToggle(node.id)},children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[indent2,expandIcon," "]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:color2,children:[icon," "]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:labelColor,children:node.label},void 0,!1,void 0,this),suffix?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:suffix},void 0,!1,void 0,this):null,node.agentState?import_jsx_dev_runtime2.jsxDEV("span",{fg:getStateColor(node.agentState),children:[" ",node.agentState]},void 0,!0,void 0,this):null,process.env.GENIE_TUI_DEBUG==="1"?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:` [${node.type}]`},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)},void 0,!1,void 0,this)})});function useDiagnosticsRefresh(setDiagnostics,setRequestedInitialAgent){import_react28.useEffect(()=>{let active=!0,lastErrorMessage=null,lastErrorLoggedAt=0;async function refresh(){try{let snap=await collectDiagnostics();if(!active)return;setDiagnostics(snap),lastErrorMessage=null;let signaledAgent=consumeInitialAgentSignal();if(signaledAgent)setRequestedInitialAgent(signaledAgent)}catch(err){let message=err instanceof Error?err.message:String(err),now=Date.now();if(message!==lastErrorMessage||now-lastErrorLoggedAt>30000)console.error("TUI: diagnostics failed:",message),lastErrorMessage=message,lastErrorLoggedAt=now}}refresh();let timer2=setInterval(refresh,2000);return()=>{active=!1,clearInterval(timer2)}},[setDiagnostics,setRequestedInitialAgent])}function useSessionTreeBuilder(diagnostics,workspaceRoot,setSessionTree){import_react28.useEffect(()=>{if(!diagnostics)return;let newTree;if(workspaceRoot){let agentNames=scanAgents2(workspaceRoot);newTree=buildWorkspaceTree({agentNames,sessions:diagnostics.sessions,executors:diagnostics.executors,workStates:diagnostics.workStates,teamScope:process.env.GENIE_TUI_TEAM??process.env.GENIE_TEAM})}else newTree=buildSessionTree(diagnostics);setSessionTree((prev)=>mergeExpandedState(prev,newTree))},[diagnostics,workspaceRoot,setSessionTree])}function useStableSelection(flatNodes,selectedIndex,setSelectedIndex,selectedNodeId){import_react28.useEffect(()=>{let node=flatNodes[selectedIndex]?.node;if(node)selectedNodeId.current=node.id},[selectedIndex,flatNodes,selectedNodeId]),import_react28.useLayoutEffect(()=>{if(flatNodes.length===0)return;if(selectedIndex>=flatNodes.length){setSelectedIndex(flatNodes.length-1);return}if(!selectedNodeId.current)return;let currentAtIndex=flatNodes[selectedIndex]?.node;if(currentAtIndex&¤tAtIndex.id===selectedNodeId.current)return;let restored=flatNodes.findIndex((n)=>n.node.id===selectedNodeId.current);if(restored>=0)setSelectedIndex(restored)},[flatNodes])}function useInitialAgentSelection(requestedInitialAgent,flatNodes,setSelectedIndex,setRequestedInitialAgent,onTmuxSessionSelect){import_react28.useEffect(()=>{if(!requestedInitialAgent||flatNodes.length===0)return;let idx=flatNodes.findIndex((n)=>n.node.id===`agent:${requestedInitialAgent}`);if(idx<0)return;setSelectedIndex(idx);let node=flatNodes[idx].node;if(node.type==="agent"&&node.wsAgentState!=="running"&&node.wsAgentState!=="spawning")spawnAgent(agentNameFromNode(node),onTmuxSessionSelect);setRequestedInitialAgent(void 0)},[requestedInitialAgent,flatNodes,onTmuxSessionSelect,setSelectedIndex,setRequestedInitialAgent])}function useAutoAttach(flatNodes,selectedIndex,lastTarget,onTmuxSessionSelect){import_react28.useEffect(()=>{let current=flatNodes[selectedIndex]?.node;if(!current)return;let target=getSessionTarget(current);if(!target)return;if(current.type==="agent"&¤t.wsAgentState!=="running")return;let key=`${target.sessionName}:${target.windowIndex??""}`;if(key===lastTarget.current)return;lastTarget.current=key,onTmuxSessionSelect(target.sessionName,target.windowIndex)},[selectedIndex,flatNodes,onTmuxSessionSelect,lastTarget])}function useNavKeyboard(opts){useKeyboard((key)=>{if(opts.keyboardDisabled)return;if(opts.spawnIntoAgent!==null||opts.spawnPickerTarget!==null)return;if(tryOpenTeamCreate(key,{workspaceRoot:opts.workspaceRoot,showTeamCreate:opts.showTeamCreate,contextMenuNodeId:opts.contextMenuNodeId,handleOpenTeamCreate:opts.handleOpenTeamCreate}))return;if(opts.showTeamCreate)return;handleKeyboardInput(key,opts)})}function renderAlertBadge(alertCount){if(alertCount<=0)return null;return import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:[" ","\u25CF ",alertCount," alert",alertCount===1?"":"s"]},void 0,!0,void 0,this)}function countAgents(nodes,predicate){let count=0;for(let n of nodes){if(n.type==="agent"&&predicate(n))count++;if(n.children.length>0)count+=countAgents(n.children,predicate)}return count}function computeNavCounts(workspaceRoot,sessionTree,diagnostics){if(workspaceRoot){let agentCount=countAgents(sessionTree,()=>!0);if(agentCount>0)return{agentCount,runningCount:countAgents(sessionTree,(n)=>n.wsAgentState==="running")}}let paneSum=diagnostics?.sessions.reduce((sum,s2)=>sum+s2.windows.reduce((ws,w2)=>ws+w2.panes.length,0),0)??0;return{agentCount:diagnostics?.sessions.length??0,runningCount:paneSum}}function Nav({onTmuxSessionSelect,onNewAgentWindow,workspaceRoot,initialAgent,keyboardDisabled=!1}){let[diagnostics,setDiagnostics]=import_react28.useState(null),[sessionTree,setSessionTree]=import_react28.useState([]),[selectedIndex,setSelectedIndex]=import_react28.useState(0),[requestedInitialAgent,setRequestedInitialAgent]=import_react28.useState(initialAgent),[contextMenuNodeId,setContextMenuNodeId]=import_react28.useState(null),[spawnIntoAgent,setSpawnIntoAgent]=import_react28.useState(null),[spawnPickerTarget,setSpawnPickerTarget]=import_react28.useState(null),lastTarget=import_react28.useRef(null),selectedNodeId=import_react28.useRef(null);useDiagnosticsRefresh(setDiagnostics,setRequestedInitialAgent),useSessionTreeBuilder(diagnostics,workspaceRoot,setSessionTree);let flatNodes=import_react28.useMemo(()=>flattenTree(sessionTree),[sessionTree]);useStableSelection(flatNodes,selectedIndex,setSelectedIndex,selectedNodeId),useInitialAgentSelection(requestedInitialAgent,flatNodes,setSelectedIndex,setRequestedInitialAgent,onTmuxSessionSelect),useAutoAttach(flatNodes,selectedIndex,lastTarget,onTmuxSessionSelect);let handleSelect=import_react28.useCallback((id)=>{let idx=flatNodes.findIndex((n)=>n.node.id===id);if(idx>=0)setSelectedIndex(idx)},[flatNodes]),handleToggle=import_react28.useCallback((id)=>{setSessionTree((prev)=>toggleNode(prev,id))},[]),handleVerticalNav=import_react28.useCallback((keyName2)=>{let rowCount=flatNodes.length;if(rowCount===0)return;if(keyName2==="up"||keyName2==="k")setSelectedIndex((prev)=>prev===0?rowCount-1:prev-1);else if(keyName2==="down"||keyName2==="j")setSelectedIndex((prev)=>prev>=rowCount-1?0:prev+1)},[flatNodes.length]),handleExpandCollapse=import_react28.useCallback((keyName2)=>{let node=flatNodes[selectedIndex]?.node;if(!node)return;if((keyName2==="right"||keyName2==="l")&&node.children.length>0&&!node.expanded)handleToggle(node.id);else if((keyName2==="left"||keyName2==="h")&&node.expanded)handleToggle(node.id)},[flatNodes,selectedIndex,handleToggle]),handleEnter=import_react28.useCallback(()=>{let node=flatNodes[selectedIndex]?.node;if(!node)return;if(node.type==="agent"){handleEnterAgent(node,onTmuxSessionSelect);return}if(node.children.length>0)handleToggle(node.id);let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex)},[flatNodes,selectedIndex,handleToggle,onTmuxSessionSelect]),handleRetry=import_react28.useCallback(()=>{let node=flatNodes[selectedIndex]?.node;if(!node||node.type!=="agent")return;if(node.wsAgentState!=="spawning"&&node.wsAgentState!=="error")return;(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}spawnAgent(agentNameFromNode(node),onTmuxSessionSelect)})()},[flatNodes,selectedIndex,onTmuxSessionSelect]),handleContextMenu=import_react28.useCallback((nodeId)=>{let flat=flatNodes.find((n)=>n.node.id===nodeId);if(flat&&buildMenuItems(flat.node).length>0)setContextMenuNodeId(nodeId)},[flatNodes]),handleContextMenuAction=import_react28.useCallback((action,payload)=>{let node=flatNodes.find((n)=>n.node.id===contextMenuNodeId)?.node;if(!node)return;if(setContextMenuNodeId(null),action==="spawn-here"){let target=resolveSpawnHereTarget(node);if(target)setSpawnPickerTarget(target);return}dispatchContextMenuAction(action,node,payload,{sessionTree,onTmuxSessionSelect,onNewAgentWindow,openSpawnInto:setSpawnIntoAgent})},[flatNodes,contextMenuNodeId,sessionTree,onTmuxSessionSelect,onNewAgentWindow]),handleSpawnIntoConfirm=import_react28.useCallback((intent)=>{executeSpawnIntent(intent),setSpawnIntoAgent(null)},[]),handleSpawnIntoCancel=import_react28.useCallback(()=>{setSpawnIntoAgent(null)},[]),handleSpawnPickerConfirm=import_react28.useCallback((intent)=>{setSpawnPickerTarget(null),executeSpawnIntent(intent)},[]),handleSpawnPickerCancel=import_react28.useCallback(()=>{setSpawnPickerTarget(null)},[]),_menuDisabled=keyboardDisabled||contextMenuNodeId!==null,{showTeamCreate,handleOpenTeamCreate,handleTeamCreateConfirm,handleTeamCreateCancel}=useTeamCreateControls({workspaceRoot,diagnostics,onTmuxSessionSelect});useNavKeyboard({keyboardDisabled,spawnIntoAgent,spawnPickerTarget,workspaceRoot,showTeamCreate,contextMenuNodeId,handleOpenTeamCreate,flatNodes,selectedIndex,setContextMenuNodeId,handleVerticalNav,handleExpandCollapse,handleEnter,handleRetry,onNewAgentWindow});let{agentCount,runningCount}=computeNavCounts(workspaceRoot,sessionTree,diagnostics),headerLabel=workspaceRoot?"Agents":"Sessions",alertCount=diagnostics?.alertCount??0;return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",width:"100%",height:"100%",backgroundColor:palette.bg,children:[import_jsx_dev_runtime2.jsxDEV("box",{height:1,paddingX:1,backgroundColor:palette.bgRaised,children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:headerLabel},void 0,!1,void 0,this),diagnostics?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[" ",workspaceRoot?`${runningCount}/${agentCount}`:`${agentCount}s ${runningCount}p`]},void 0,!0,void 0,this):null,renderAlertBadge(alertCount)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),diagnostics?import_jsx_dev_runtime2.jsxDEV("scrollbox",{focused:!0,height:"100%",style:{scrollbarOptions:{showArrows:!1,trackOptions:{foregroundColor:palette.scrollThumb,backgroundColor:palette.scrollTrack}}},children:flatNodes.map((flat,i2)=>import_jsx_dev_runtime2.jsxDEV(TreeNodeRow,{node:flat.node,selected:i2===selectedIndex,onSelect:handleSelect,onToggle:handleToggle,onContextMenu:handleContextMenu},flat.node.id,!1,void 0,this))},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("box",{flexGrow:1,justifyContent:"center",alignItems:"center",flexDirection:"column",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("ascii-font",{text:"GENIE",font:"tiny",color:palette.accent},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{fg:palette.textDim,children:"Collecting..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),contextMenuNodeId?import_jsx_dev_runtime2.jsxDEV(ContextMenu,{items:buildMenuItems(flatNodes.find((n)=>n.node.id===contextMenuNodeId)?.node??{}),onAction:handleContextMenuAction,onClose:()=>setContextMenuNodeId(null),positionY:flatNodes.findIndex((n)=>n.node.id===contextMenuNodeId)+1},void 0,!1,void 0,this):null,spawnIntoAgent!==null?import_jsx_dev_runtime2.jsxDEV(SpawnTargetPicker,{agentName:spawnIntoAgent,sessions:diagnostics?.sessions??[],onConfirm:handleSpawnIntoConfirm,onCancel:handleSpawnIntoCancel},void 0,!1,void 0,this):null,spawnPickerTarget!==null?import_jsx_dev_runtime2.jsxDEV(AgentPicker,{target:spawnPickerTarget,onConfirm:handleSpawnPickerConfirm,onCancel:handleSpawnPickerCancel},void 0,!1,void 0,this):null,showTeamCreate?import_jsx_dev_runtime2.jsxDEV(TeamCreate,{availableAgents:workspaceRoot?scanAgents2(workspaceRoot):[],workspaceRoot,onConfirm:handleTeamCreateConfirm,onCancel:handleTeamCreateCancel},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV(SystemStats,{},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,paddingX:1,backgroundColor:palette.bgRaised,children:import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:buildFooterHint(workspaceRoot)},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function useTeamCreateControls(opts){let{workspaceRoot,diagnostics,onTmuxSessionSelect}=opts,[showTeamCreate,setShowTeamCreate]=import_react28.useState(!1),pendingTeamNameRef=import_react28.useRef(null),handleOpenTeamCreate=import_react28.useCallback(()=>{if(!workspaceRoot)return;setShowTeamCreate(!0)},[workspaceRoot]),handleTeamCreateConfirm=import_react28.useCallback((result2)=>{setShowTeamCreate(!1),runTeamCreation(result2,workspaceRoot),pendingTeamNameRef.current=result2.teamName},[workspaceRoot]),handleTeamCreateCancel=import_react28.useCallback(()=>{setShowTeamCreate(!1)},[]);return import_react28.useEffect(()=>{let pending=pendingTeamNameRef.current;if(!pending||!diagnostics)return;let session=diagnostics.sessions.find((s2)=>s2.name===pending);if(!session)return;pendingTeamNameRef.current=null,onTmuxSessionSelect(session.name,resolvePreferredWindowIndex(session,pending))},[diagnostics,onTmuxSessionSelect]),{showTeamCreate,handleOpenTeamCreate,handleTeamCreateConfirm,handleTeamCreateCancel}}function handleEnterAgent(node,onTmuxSessionSelect,spawn5=spawnAgent){if(node.wsAgentState!=="running"&&node.wsAgentState!=="spawning")spawn5(agentNameFromNode(node),onTmuxSessionSelect);else if(node.wsAgentState==="running"){let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex)}}function dispatchContextMenuAction(action,node,payload,deps){let name=node.label;if(action==="spawn-into"&&node.type==="agent"&&deps.openSpawnInto){deps.openSpawnInto(agentNameFromNode(node));return}if(handleAttachAction(action,node,deps.onTmuxSessionSelect))return;if(handleRetryAction(action,name,deps.onTmuxSessionSelect))return;if(handleGenieAction(action,name,payload))return;let tmuxServer=process.env.GENIE_TMUX_SERVER||"genie";if(handleRenameAction(action,node,tmuxServer,payload))return;if(handleAgentWindowActions(action,node,name,tmuxServer,deps.onNewAgentWindow))return;if(handleSessionNodeActions(action,node,tmuxServer,payload))return;if(handleWindowNodeActions(action,node,deps.sessionTree,tmuxServer,payload))return;handlePaneNodeActions(action,node,deps.sessionTree,tmuxServer,deps.onNewAgentWindow)}function handleAttachAction(action,node,onTmuxSessionSelect){if(action!=="attach")return!1;let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex);return!0}function handleRetryAction(action,name,onTmuxSessionSelect){if(action!=="retry")return!1;return(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}spawnAgent(name,onTmuxSessionSelect)})(),!0}function handleGenieAction(action,name,payload){if(action==="send"&&payload)return executeGenie(["agent","send",payload,"--to",name]),!0;if(action==="answer-text"&&payload)return executeGenie(["agent","answer",name,`text:${payload}`]),!0;let genieArgs={spawn:["spawn",name],"spawn-plan":["spawn",name,"--plan-mode"],stop:["agent","stop",name],kill:["agent","kill",name],log:["agent","log",name],show:["agent","show",name],read:["read",name],"answer-yes":["agent","answer",name,"yes"],"answer-no":["agent","answer",name,"no"]}[action];if(genieArgs)return executeGenie(genieArgs),!0;return!1}function handleRenameAction(action,node,tmuxServer,payload){if(action==="rename-session"&&payload){let sess=node.type==="agent"?node.data.sessionName||node.label:node.id.split(":").slice(1).join(":");return executeTmux3(["-L",tmuxServer,"rename-session","-t",sess,payload]),!0}if(action==="rename-window"&&payload){let idParts=node.id.split(":"),windowTarget=`${idParts[1]}:${idParts[2]}`;return executeTmux3(["-L",tmuxServer,"rename-window","-t",windowTarget,payload]),!0}if(action==="rename-pane"&&payload&&node.type==="pane"){let paneId=node.data.paneId;return executeTmux3(["-L",tmuxServer,"select-pane","-t",`${paneId}`,"-T",payload]),!0}return!1}function handleAgentWindowActions(action,node,name,tmuxServer,onNewAgentWindow){if(action==="agent-new-window"&&node.type==="agent"){if(onNewAgentWindow)onNewAgentWindow(agentNameFromNode(node));return!0}if(action==="new-empty-window"&&node.type==="agent"){let sessionName=node.data.sessionName||name;return executeTmux3(["-L",tmuxServer,"new-window","-a","-t",sessionName]),!0}return!1}function handleSessionNodeActions(action,node,tmuxServer,payload){if(node.type!=="session")return!1;let sess=node.id.split(":").slice(1).join(":");if(action==="kill-session")return executeTmux3(["-L",tmuxServer,"kill-session","-t",sess]),!0;if(action==="new-window")return executeTmux3(["-L",tmuxServer,"new-window","-a","-t",sess]),!0;if(action==="clone-session")return executeTmux3(["-L",tmuxServer,"new-session","-d","-s",`${sess}-clone`,"-t",sess]),!0;if(action==="spawn-in-session"&&payload)return executeGenie(["spawn",payload,"--session",sess]),!0;return!1}function handleWindowNodeActions(action,node,sessionTree,tmuxServer,payload){if(node.type!=="window")return!1;let idParts=node.id.split(":"),windowTarget=`${idParts[1]}:${idParts[2]}`;if(action==="kill-window")return executeTmux3(["-L",tmuxServer,"kill-window","-t",windowTarget]),!0;if(action==="window-new-agent"){let parentAgent=findParentAgent(sessionTree,node.id);if(parentAgent){let agentFullName=agentNameFromNode(parentAgent),suffix=Date.now()%1e4,role=`${agentFullName}-${suffix}`;executeGenie(["spawn",agentFullName,"--role",role,"--window",windowTarget])}return!0}if(action==="split-pane")return executeTmux3(["-L",tmuxServer,"split-window","-t",windowTarget]),!0;if(action==="spawn-in-window"&&payload)return executeGenie(["spawn",payload,"--session",idParts[1]]),!0;return!1}function handlePaneNodeActions(action,node,sessionTree,tmuxServer,onNewAgentWindow){if(node.type!=="pane")return!1;let paneId=node.data.paneId;if(action==="clone-agent"){let parentAgent=findParentAgent(sessionTree,node.id);if(parentAgent&&onNewAgentWindow)onNewAgentWindow(agentNameFromNode(parentAgent));return!0}if(action==="kill-pane")return executeTmux3(["-L",tmuxServer,"kill-pane","-t",`${paneId}`]),!0;if(action==="split-h")return executeTmux3(["-L",tmuxServer,"split-window","-h","-t",`${paneId}`]),!0;if(action==="split-v")return executeTmux3(["-L",tmuxServer,"split-window","-v","-t",`${paneId}`]),!0;return!1}function buildFooterHint(workspaceRoot){return`\u2191\u2193:nav \u2190\u2192:expand Enter:${workspaceRoot?"spawn/attach":"attach"} ^T:new${workspaceRoot?" ^N:team":""} R:retry .:menu`}function tryOpenTeamCreate(key,opts){if(!key.ctrl||key.name!=="n")return!1;if(!opts.workspaceRoot||opts.showTeamCreate||opts.contextMenuNodeId)return!1;return opts.handleOpenTeamCreate(),!0}function tryOpenContextMenu(flatNodes,selectedIndex,setContextMenuNodeId){let node=flatNodes[selectedIndex]?.node;if(node&&buildMenuItems(node).length>0)return setContextMenuNodeId(node.id),!0;return!1}function dispatchNavKey(key,handlers,agentAction){let n=key.name;if(n==="up"||n==="k"||n==="down"||n==="j")handlers.handleVerticalNav(n);else if(n==="right"||n==="l"||n==="left"||n==="h")handlers.handleExpandCollapse(n);else if(n==="enter"||n==="return")handlers.handleEnter();else if(n==="r")handlers.handleRetry();else if(key.ctrl&&n==="t")agentAction()}function handleKeyboardInput(key,opts){if(key.name==="."&&!opts.contextMenuNodeId){if(tryOpenContextMenu(opts.flatNodes,opts.selectedIndex,opts.setContextMenuNodeId))return}if(opts.contextMenuNodeId)return;dispatchNavKey(key,opts,()=>{let node=opts.flatNodes[opts.selectedIndex]?.node;if(node?.type==="agent"&&node.wsAgentState==="running"&&opts.onNewAgentWindow)opts.onNewAgentWindow(agentNameFromNode(node))})}function agentNameFromNode(node){return node.id.replace(/^agent:/,"")}function spawnAgent(name,onTmuxSessionSelect){try{let{spawn:spawn5}=__require("child_process"),{join:join94,resolve:resolve23}=__require("path"),{existsSync:existsSync77,mkdirSync:mkdirSync35,openSync:openSync6}=__require("fs"),{homedir:homedir52}=__require("os"),bunPath=process.execPath||"bun",genieBin=process.argv[1],wsRoot=process.env.GENIE_TUI_WORKSPACE,sessionName=name.replace(/\//g,"-"),cwd;if(wsRoot){let parentName=name.includes("/")?name.slice(0,name.indexOf("/")):name,agentDir=resolve23(join94(wsRoot,"agents",parentName));if(existsSync77(agentDir))cwd=agentDir}let{GENIE_TUI_PANE:_a,GENIE_TUI_RIGHT:_b,GENIE_TUI_WORKSPACE:_c,GENIE_TUI_TEAM:_d,GENIE_IS_DAEMON:_e2,...cleanEnv}=process.env,logDir=join94(homedir52(),".genie","logs","tui-spawn");try{mkdirSync35(logDir,{recursive:!0})}catch{}let logPath=join94(logDir,`${sessionName}-${Date.now()}.log`),logFd;try{logFd=openSync6(logPath,"a")}catch{logFd=void 0}let spawnOpts=logFd!==void 0?{detached:!0,stdio:["ignore",logFd,logFd],cwd,env:cleanEnv}:{detached:!0,stdio:"ignore",cwd,env:cleanEnv},child=genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,"spawn",name,"--session",sessionName,"--new-window"],spawnOpts):spawn5("genie",["spawn",name,"--session",sessionName,"--new-window"],spawnOpts);if(child.on("exit",(code)=>{if(code&&code!==0)console.error(`TUI: spawn "${name}" exited ${code}. See ${logPath}`)}),child.on("error",(err)=>{console.error(`TUI: spawn "${name}" error: ${err.message}. See ${logPath}`)}),child.unref(),onTmuxSessionSelect)attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect)}catch(err){console.error(`TUI: spawn failed for ${name}:`,err instanceof Error?err.message:err)}}function attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect,attempt=0){(async()=>{try{let session=(await collectDiagnostics()).sessions.find((candidate)=>candidate.name===sessionName);if(session){let windowIndex=resolvePreferredWindowIndex(session,sessionName);if(windowIndex!==void 0){onTmuxSessionSelect(sessionName,windowIndex);return}}}catch{}if(attempt>=40){onTmuxSessionSelect(sessionName);return}setTimeout(()=>{attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect,attempt+1)},250)})()}function executeTmux3(args){try{let{spawn:spawn5}=__require("child_process");spawn5("tmux",args,{detached:!0,stdio:"ignore"}).unref()}catch{}}function executeGenie(args){try{let{spawn:spawn5}=__require("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1];(genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{detached:!0,stdio:"ignore"}):spawn5("genie",args,{detached:!0,stdio:"ignore"})).unref()}catch{}}function executeGenieAwaited(args){return new Promise((resolve23,reject)=>{try{let{spawn:spawn5}=__require("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1],child=genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{stdio:"ignore"}):spawn5("genie",args,{stdio:"ignore"});child.on("exit",(code)=>resolve23(code)),child.on("error",reject)}catch(err){reject(err instanceof Error?err:Error(String(err)))}})}function resolveSpawnHereTarget(node){if(node.type==="session"){let sess=node.id.split(":").slice(1).join(":");if(sess.length===0)return null;return{session:sess}}if(node.type==="window"){let idParts=node.id.split(":");if(idParts.length<3)return null;return{session:idParts[1],window:`${idParts[1]}:${idParts[2]}`}}return null}function executeSpawnIntent(intent){try{let{argv}=buildSpawnInvocation(intent);executeGenie(argv)}catch(err){console.error("TUI: spawn-intent execution failed:",err instanceof Error?err.message:err)}}async function runTeamCreation(result2,workspaceRoot){let argv;try{({argv}=buildSpawnInvocation({kind:"create-team",name:result2.teamName,repo:workspaceRoot}))}catch(err){console.error("TUI: team create intent build failed:",err instanceof Error?err.message:err);return}let createExit=null;try{createExit=await executeGenieAwaited(argv)}catch(err){console.error("TUI: team create spawn failed:",err instanceof Error?err.message:err);return}if(createExit!==0){console.error(`TUI: team create exited ${createExit} \u2014 skipping member hires for "${result2.teamName}"`);return}for(let member of result2.members)try{let code=await executeGenieAwaited(["team","hire",member,"--team",result2.teamName]);if(code!==0)console.error(`TUI: team hire "${member}" exited ${code} \u2014 continuing with remaining members`)}catch(err){console.error(`TUI: team hire "${member}" failed:`,err instanceof Error?err.message:err)}}function findParentAgent(tree,targetId){for(let node of tree){if(node.type==="agent"&&containsNode(node,targetId))return node;let found=findParentAgent(node.children,targetId);if(found)return found}return null}function containsNode(node,targetId){if(node.id===targetId)return!0;return node.children.some((c)=>containsNode(c,targetId))}function mergeExpandedState(oldTree,newTree){if(oldTree.length===0)return newTree;let oldState=new Map;function collect(nodes){for(let n of nodes)oldState.set(n.id,{expanded:n.expanded,childCount:n.children.length}),collect(n.children)}collect(oldTree);function apply(nodes){return nodes.map((n)=>({...n,expanded:(()=>{let previous=oldState.get(n.id);if(!previous)return n.expanded;if(previous.childCount===0&&n.children.length>0)return n.expanded;return previous.expanded})(),children:apply(n.children)}))}return apply(newTree)}var import_react28;var init_Nav=__esm(async()=>{init_spawn_invocation();init_workspace();init_diagnostics();init_initial_agent();init_session_tree();init_theme2();init_SystemStats();init_TreeNode();init_jsx_dev_runtime();await __promiseAll([init_react2(),init_AgentPicker(),init_ContextMenu(),init_SpawnTargetPicker(),init_TeamCreate()]);import_react28=__toESM(require_react_development(),1)});function QuitDialog({onConfirm,onCancel}){return useKeyboard((key)=>{if(key.name==="enter"||key.name==="return"||key.name==="y")onConfirm();else if(key.name==="escape"||key.name==="n")onCancel()}),import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:palette.bgOverlay,children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderColor:palette.borderActive,backgroundColor:palette.bgRaised,paddingX:3,paddingY:1,flexDirection:"column",alignItems:"center",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.accent,children:"Close TUI?"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:"Enter"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:" to close "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:" | "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:" Esc"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:" to cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Daemon keeps running. `genie serve stop` to shut down."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var init_QuitDialog=__esm(async()=>{init_theme2();init_jsx_dev_runtime();await init_react2()});import{execSync as execSync18}from"child_process";function App({rightPane,workspaceRoot,initialAgent}){let renderer=useRenderer(),[showQuit,setShowQuit]=import_react32.useState(!1),[showHelp,setShowHelp]=import_react32.useState(!1),[activeSession,setActiveSession]=import_react32.useState(null);import_react32.useEffect(()=>{let title=activeSession?`${BASE_TERMINAL_TITLE} \u2014 ${activeSession}`:BASE_TERMINAL_TITLE;try{renderer.setTerminalTitle(title)}catch{}},[renderer,activeSession]);let handleQuit=import_react32.useCallback(()=>{try{execSync18("tmux -L genie-tui kill-server",{stdio:"ignore"})}catch{}},[]);useBindings(()=>({commands:[{name:"app.quit",title:"Close TUI",desc:"Close TUI window (daemon keeps running \u2014 use `genie serve stop` to shut down)",category:"app",run(){if(showQuit)handleQuit();else setShowQuit(!0)}},{name:"app.help.toggle",title:"Toggle help overlay",desc:"Show/hide the keyboard shortcut overlay",category:"app",run(){setShowHelp((prev)=>!prev)}},{name:"app.console.toggle",title:"Toggle console overlay",desc:"Show/hide the OpenTUI console (logs)",category:"app",run(){renderer.console.toggle()}}],bindings:[{key:"ctrl+q",cmd:"app.quit"},{key:"f1",cmd:"app.help.toggle"},{key:"`",cmd:"app.console.toggle"}]}),[renderer,showQuit,handleQuit]);let handleTmuxSessionSelect=import_react32.useCallback((sessionName,windowIndex)=>{if(setActiveSession(sessionName),!rightPane)return;attachProjectWindow(rightPane,sessionName,windowIndex)},[rightPane]);return import_jsx_dev_runtime2.jsxDEV("box",{width:"100%",height:"100%",children:[import_jsx_dev_runtime2.jsxDEV(Nav,{onTmuxSessionSelect:handleTmuxSessionSelect,onNewAgentWindow:newAgentWindow,workspaceRoot,initialAgent,keyboardDisabled:showQuit||showHelp},void 0,!1,void 0,this),showHelp?import_jsx_dev_runtime2.jsxDEV(HelpOverlay,{onClose:()=>setShowHelp(!1)},void 0,!1,void 0,this):null,showQuit?import_jsx_dev_runtime2.jsxDEV(QuitDialog,{onConfirm:handleQuit,onCancel:()=>setShowQuit(!1)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}var import_react32,BASE_TERMINAL_TITLE="genie tui";var init_app=__esm(async()=>{init_react();init_tmux2();init_jsx_dev_runtime();await __promiseAll([init_react2(),init_HelpOverlay(),init_Nav(),init_QuitDialog()]);import_react32=__toESM(require_react_development(),1)});function getFocusedTargetIfAvailable(host){if(host.isDestroyed)return null;return host.getFocusedTarget()}function forEachActivationTarget(host,focused,visit){let current=focused??host.rootTarget,isFocusedTarget=focused!==null;while(current){if(visit(current,isFocusedTarget)===!1)return;current=host.getParentTarget(current),isFocusedTarget=!1}}function getActivationPath(host,focused){let path6=new Set;return forEachActivationTarget(host,focused,(current)=>{path6.add(current)}),path6}function getActiveLayersForFocused(state,host,focused){if(state.activeLayersCacheVersion===state.activeLayersVersion&&state.activeLayersCacheFocused===focused)return state.activeLayersCache;let activeLayers=[],activationPath=getActivationPath(host,focused);for(let layer of state.sortedLayers)if(isLayerActiveForFocused(host,layer,focused,activationPath))activeLayers.push(layer);return state.activeLayersCacheVersion=state.activeLayersVersion,state.activeLayersCacheFocused=focused,state.activeLayersCache=activeLayers,activeLayers}function invalidateCachedActiveLayers(state){state.activeLayersCacheVersion=-1,state.activeLayersCacheFocused=void 0,state.activeLayersCache=[]}function isLayerActiveForFocused(host,layer,focused,activationPath=getActivationPath(host,focused)){let target=layer.target;if(!target)return!0;if(host.isTargetDestroyed(target))return!1;if(layer.targetMode==="focus")return target===focused;return activationPath.has(target)}function normalizeBindingTokenName(token){let normalized=token.trim().toLowerCase();if(!normalized)throw Error("Invalid keymap token: token cannot be empty");return normalized}function normalizeKeyName(name){let normalized=name.trim().toLowerCase();if(!normalized)throw Error("Invalid key name: key name cannot be empty");return normalized}function normalizeKeyStroke(input){return{name:normalizeKeyName(input.name),ctrl:input.ctrl??!1,shift:input.shift??!1,meta:input.meta??!1,super:input.super??!1,hyper:input.hyper||void 0}}function cloneKeyStroke(stroke){return{name:stroke.name,ctrl:stroke.ctrl,shift:stroke.shift,meta:stroke.meta,super:stroke.super,hyper:stroke.hyper||void 0}}function createKeySequencePart(input,options){let stroke=cloneKeyStroke(normalizeKeyStroke(input));return{stroke,display:options?.display??stringifyCanonicalStroke(stroke),match:options?.match??createKeyMatch(stroke),tokenName:options?.tokenName?normalizeBindingTokenName(options.tokenName):void 0}}function cloneKeySequencePart(part){return{stroke:cloneKeyStroke(part.stroke),display:part.display,match:part.match,tokenName:part.tokenName}}function cloneKeySequence(parts){return parts.map((part)=>cloneKeySequencePart(part))}function resolveKeyMatch(input){if("match"in input)return input.match;if("stroke"in input)return createKeyMatch(input.stroke);return createKeyMatch(input)}function createKeyMatch(input){return`key:${buildKeyMatchId(normalizeKeyStroke(input))}`}function createTextKeyMatch(id){let normalized=id.trim();if(!normalized)throw Error("Invalid keymap match id: id cannot be empty");return`text:${normalized}`}function stringifyKeyStroke(input,options){if("stroke"in input){if(options?.preferDisplay&&input.display)return input.display;return stringifyCanonicalStroke(input.stroke)}return stringifyCanonicalStroke(normalizeKeyStroke(input))}function stringifyKeySequence(input,options){return input.map((part)=>stringifyKeyStroke(part,options)).join("")}function stringifyCanonicalStroke(stroke){let parts=[];if(stroke.ctrl)parts.push("ctrl");if(stroke.shift)parts.push("shift");if(stroke.meta)parts.push("meta");if(stroke.super)parts.push("super");if(stroke.hyper)parts.push("hyper");return parts.push(stroke.name==="return"?"enter":stroke.name),parts.join("+")}function buildKeyMatchId(stroke){return`${stroke.name}:${stroke.ctrl?1:0}:${stroke.shift?1:0}:${stroke.meta?1:0}:${stroke.super?1:0}:${stroke.hyper?1:0}`}function getLiveHost(host){if(host.isDestroyed)throw Error("Cannot use a keymap after its host was destroyed");return host}function isSamePendingSequence(current,next){if(current===next)return!0;if(!current||!next)return!1;if(current.captures.length!==next.captures.length)return!1;for(let index=0;index<current.captures.length;index+=1){let left=current.captures[index],right=next.captures[index];if(!left||!right||left.layer!==right.layer||left.node!==right.node)return!1}return!0}class ActivationService{state;host;hooks;notify;conditions;catalog;options;constructor(state,host,hooks,notify,conditions,catalog,options={}){this.state=state,this.host=host,this.hooks=hooks,this.notify=notify,this.conditions=conditions,this.catalog=catalog,this.options=options}getFocusedTarget(){return getLiveHost(this.host).getFocusedTarget()}getFocusedTargetIfAvailable(){return getFocusedTargetIfAvailable(this.host)}setPendingSequence(next){let previous=this.state.projection.pendingSequence;if(isSamePendingSequence(previous,next))return;this.state.projection.pendingSequence=next,this.options.onPendingSequenceChanged?.(previous,next),this.invalidateCaches(),this.notifyPendingSequenceChange(),this.notify.queueStateChange()}ensureValidPendingSequence(){let pending=this.state.projection.pendingSequence;if(!pending)return;let focused=this.getFocusedTarget(),captures=pending.captures.filter((capture2)=>{return this.state.layers.layers.has(capture2.layer)&&this.isLayerActiveForFocused(capture2.layer,focused)&&this.conditions.layerMatchesRuntimeState(capture2.layer)&&this.nodeHasReachableBindings(capture2.node,focused)});if(captures.length===0){this.setPendingSequence(null);return}if(captures.length!==pending.captures.length)this.setPendingSequence({captures});return this.state.projection.pendingSequence??void 0}revalidatePendingSequenceIfNeeded(){if(this.host.isDestroyed||!this.state.projection.pendingSequence)return;this.ensureValidPendingSequence()}hasPendingSequenceState(){return!this.host.isDestroyed&&this.state.projection.pendingSequence!==null}getPendingSequence(){let projections=this.state.projection,derivedStateVersion=this.state.notify.derivedStateVersion;if(projections.pendingSequenceCacheVersion===derivedStateVersion)return projections.pendingSequenceCache;let pending=this.ensureValidPendingSequence(),canUseCache=!pending||pending.captures.every((capture2)=>this.layerCanCacheActiveKeys(capture2.layer)),sequence=pending?this.collectSequencePartsFromPending(pending):[];if(canUseCache)projections.pendingSequenceCacheVersion=derivedStateVersion,projections.pendingSequenceCache=sequence;return sequence}popPendingSequence(){let pending=this.ensureValidPendingSequence();if(!pending)return!1;let firstCapture=pending.captures[0];if(!firstCapture||firstCapture.node.depth<=1)return this.setPendingSequence(null),!0;let nextCaptures=[];for(let capture2 of pending.captures){let parent=capture2.node.parent;if(!parent||!parent.stroke)continue;nextCaptures.push({layer:capture2.layer,node:parent})}if(nextCaptures.length===0)return this.setPendingSequence(null),!0;return this.setPendingSequence({captures:nextCaptures}),!0}getActiveKeys(options){let projections=this.state.projection,derivedStateVersion=this.state.notify.derivedStateVersion,includeBindings=options?.includeBindings===!0,includeMetadata=options?.includeMetadata===!0;if(includeBindings){if(includeMetadata){if(projections.activeKeysBindingsAndMetadataCacheVersion===derivedStateVersion)return projections.activeKeysBindingsAndMetadataCache}else if(projections.activeKeysBindingsCacheVersion===derivedStateVersion)return projections.activeKeysBindingsCache}else if(includeMetadata){if(projections.activeKeysMetadataCacheVersion===derivedStateVersion)return projections.activeKeysMetadataCache}else if(projections.activeKeysPlainCacheVersion===derivedStateVersion)return projections.activeKeysPlainCache;let focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused),pending=this.ensureValidPendingSequence(),activeLayers=pending?[]:this.getActiveLayers(focused),canUseCache=pending?pending.captures.every((capture2)=>this.layerCanCacheActiveKeys(capture2.layer)):this.activeLayersCanCacheActiveKeys(activeLayers),activeKeys=pending?this.collectActiveKeysFromPending(pending.captures,includeBindings,includeMetadata,focused,activeView):this.collectActiveKeysAtRoot(activeLayers,includeBindings,includeMetadata,focused,activeView);if(!canUseCache)return activeKeys;if(includeBindings)if(includeMetadata)projections.activeKeysBindingsAndMetadataCacheVersion=derivedStateVersion,projections.activeKeysBindingsAndMetadataCache=activeKeys;else projections.activeKeysBindingsCacheVersion=derivedStateVersion,projections.activeKeysBindingsCache=activeKeys;else if(includeMetadata)projections.activeKeysMetadataCacheVersion=derivedStateVersion,projections.activeKeysMetadataCache=activeKeys;else projections.activeKeysPlainCacheVersion=derivedStateVersion,projections.activeKeysPlainCache=activeKeys;return activeKeys}getActiveKeysForCaptures(captures,options){let includeBindings=options?.includeBindings===!0,includeMetadata=options?.includeMetadata===!0,focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused);return this.collectActiveKeysFromPending(captures,includeBindings,includeMetadata,focused,activeView)}nodeHasReachableBindings(node,focused){return this.hasMatchingBindings(node.reachableBindings,focused,this.catalog.getActiveCommandView(focused))}getActiveLayers(focused){return getActiveLayersForFocused(this.state.layers,this.host,focused)}refreshActiveLayers(focused=this.getFocusedTargetIfAvailable()){getActiveLayersForFocused(this.state.layers,this.host,focused)}invalidateActiveLayers(){invalidateCachedActiveLayers(this.state.layers)}isLayerActiveForFocused(layer,focused){return isLayerActiveForFocused(this.host,layer,focused)}layerCanCacheActiveKeys(layer){return!layer.hasUnkeyedMatchers&&!layer.hasUnkeyedCommands&&!layer.hasUnkeyedBindings}activeLayersCanCacheActiveKeys(activeLayers){for(let layer of activeLayers)if(!this.layerCanCacheActiveKeys(layer))return!1;return!0}collectNodesFromNode(node){let nodes=[],current=node;while(current&¤t.stroke)nodes.push(current),current=current.parent;return nodes.reverse(),nodes}collectSequencePartsFromPending(pending){let focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused),paths=pending.captures.map((capture2)=>this.collectNodesFromNode(capture2.node)),firstPath=paths[0];if(!firstPath||firstPath.length===0)return[];let parts=[];for(let index=0;index<firstPath.length;index+=1){let firstNode=firstPath[index];if(!firstNode?.stroke||firstNode.match===null)continue;let display,tokenName,hasDisplayConflict=!1,hasTokenConflict=!1;for(let path6 of paths){let node=path6[index];if(!node)continue;let presentation=this.getNodePresentation(node,focused,activeView);if(display===void 0){display=presentation.display,tokenName=presentation.tokenName;continue}if(!hasDisplayConflict&&display!==presentation.display)hasDisplayConflict=!0;if(!hasTokenConflict&&tokenName!==presentation.tokenName)hasTokenConflict=!0}if(display===void 0||hasDisplayConflict)display=stringifyKeyStroke(firstNode.stroke);if(hasTokenConflict)tokenName=void 0;parts.push(createKeySequencePart(firstNode.stroke,{display,match:firstNode.match,tokenName}))}return parts}collectMatchingBindings(bindings,focused,activeView){let matches=[];for(let binding of bindings)if(this.conditions.matchesConditions(binding)&&this.catalog.isBindingVisible(binding,focused,activeView))matches.push(binding);return matches}hasMatchingBindings(bindings,focused,activeView){for(let binding of bindings)if(this.conditions.matchesConditions(binding)&&this.catalog.isBindingVisible(binding,focused,activeView))return!0;return!1}getNodePresentation(node,focused,activeView,reachableBindings=this.collectMatchingBindings(node.reachableBindings,focused,activeView)){if(!node.stroke)return{display:""};let partIndex=node.depth-1,display,tokenName,hasDisplayConflict=!1,hasTokenConflict=!1;for(let binding of reachableBindings){let part=binding.sequence[partIndex];if(!part)continue;if(display===void 0){display=part.display,tokenName=part.tokenName;continue}if(!hasDisplayConflict&&display!==part.display)hasDisplayConflict=!0;if(!hasTokenConflict&&tokenName!==part.tokenName)hasTokenConflict=!0}if(display===void 0||hasDisplayConflict)display=stringifyKeyStroke(node.stroke);if(hasTokenConflict)tokenName=void 0;return{display,tokenName}}toActiveBinding(binding,focused,activeView){return{sequence:binding.sequence,command:binding.command,commandAttrs:this.catalog.getBindingCommandAttrs(binding,focused,activeView),attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough}}collectActiveBindings(bindings,focused,activeView){return bindings.map((binding)=>this.toActiveBinding(binding,focused,activeView))}collectActiveKeysAtRoot(activeLayers,includeBindings,includeMetadata,focused,activeView){let activeKeys=new Map,stopped=new Set,hasLayerConditions=this.state.layers.layersWithConditions>0;for(let layer of activeLayers){if(layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;for(let[bindingKey,child]of layer.root.children){if(stopped.has(bindingKey))continue;let selection=this.selectActiveKey(child,includeBindings,focused,activeView);if(!selection)continue;let existing=activeKeys.get(bindingKey);if(!existing)activeKeys.set(bindingKey,this.createActiveKeyState(child.stroke,selection,includeBindings));else this.updateActiveKeyState(existing,selection,includeBindings);if(selection.stop)stopped.add(bindingKey)}}let materialized=[];for(let state of activeKeys.values()){let activeKey=this.materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView);if(activeKey)materialized.push(activeKey)}return materialized}collectActiveKeysFromPending(captures,includeBindings,includeMetadata,focused,activeView){let activeKeys=new Map,stopped=new Set;for(let capture2 of captures)for(let[bindingKey,child]of capture2.node.children){if(stopped.has(bindingKey))continue;let selection=this.selectActiveKey(child,includeBindings,focused,activeView);if(!selection)continue;let existing=activeKeys.get(bindingKey);if(!existing)activeKeys.set(bindingKey,this.createActiveKeyState(child.stroke,selection,includeBindings));else this.updateActiveKeyState(existing,selection,includeBindings);if(selection.stop)stopped.add(bindingKey)}let materialized=[];for(let state of activeKeys.values()){let activeKey=this.materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView);if(activeKey)materialized.push(activeKey)}return materialized}selectActiveKey(node,includeBindings,focused,activeView){return node.children.size>0?this.selectPrefixActiveKey(node,includeBindings,focused,activeView):this.selectExactActiveKey(node,includeBindings,focused,activeView)}selectPrefixActiveKey(node,includeBindings,focused,activeView){if(!node.stroke)return;let reachableBindings=this.collectMatchingBindings(node.reachableBindings,focused,activeView);if(reachableBindings.length===0)return;let prefixBindings=this.selectActiveBindings(node.bindings,focused,activeView);return{...this.getNodePresentation(node,focused,activeView,reachableBindings),continues:!0,firstBinding:prefixBindings?.bindings[0],commandBinding:prefixBindings?.commandBinding,bindings:includeBindings&&prefixBindings&&prefixBindings.bindings.length>0?[...prefixBindings.bindings]:void 0,stop:!0}}selectExactActiveKey(node,includeBindings,focused,activeView){if(!node.stroke)return;let selected=this.selectActiveBindings(node.bindings,focused,activeView);if(!selected)return;let display,tokenName;if(selected.bindings.length===1){let part=selected.bindings[0]?.sequence[node.depth-1];display=part?.display??stringifyKeyStroke(node.stroke),tokenName=part?.tokenName}else{let presentation=this.getNodePresentation(node,focused,activeView,selected.bindings);display=presentation.display,tokenName=presentation.tokenName}return{display,tokenName,continues:!1,firstBinding:selected.bindings[0],commandBinding:selected.commandBinding,bindings:includeBindings?[...selected.bindings]:void 0,stop:selected.stop}}selectActiveBindings(bindings,focused,activeView){let selected=[],commandBinding;for(let binding of bindings){if(!this.conditions.matchesConditions(binding)||!this.catalog.isBindingVisible(binding,focused,activeView))continue;if(selected.push(binding),binding.command===void 0)continue;if(commandBinding??=binding,!binding.fallthrough)return{bindings:selected,commandBinding,stop:!0}}if(selected.length===0)return;return{bindings:selected,commandBinding,stop:!1}}createActiveKeyState(stroke,selection,includeBindings){return{stroke,display:selection.display,tokenName:selection.tokenName,continues:selection.continues,firstBinding:selection.firstBinding,commandBinding:selection.commandBinding,bindings:includeBindings&&selection.bindings?[...selection.bindings]:void 0}}updateActiveKeyState(state,selection,includeBindings){if(!state.firstBinding&&selection.firstBinding)state.firstBinding=selection.firstBinding;if(!state.commandBinding&&selection.commandBinding)state.commandBinding=selection.commandBinding;if(selection.continues)state.continues=!0;if(!includeBindings||!selection.bindings||selection.bindings.length===0)return;if(!state.bindings){state.bindings=[...selection.bindings];return}state.bindings.push(...selection.bindings)}materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView){if(!state.commandBinding&&!state.continues)return;let activeKey={stroke:cloneKeyStroke(state.stroke),display:state.display,continues:state.continues};if(state.tokenName)activeKey.tokenName=state.tokenName;if(state.commandBinding)activeKey.command=state.commandBinding.command;if(includeBindings&&state.bindings&&state.bindings.length>0)activeKey.bindings=state.bindings.length===1?[this.toActiveBinding(state.bindings[0],focused,activeView)]:this.collectActiveBindings(state.bindings,focused,activeView);if(includeMetadata){if(state.firstBinding?.attrs)activeKey.bindingAttrs=state.firstBinding.attrs;let commandAttrs=state.commandBinding?this.catalog.getBindingCommandAttrs(state.commandBinding,focused,activeView):void 0;if(commandAttrs)activeKey.commandAttrs=commandAttrs}return activeKey}invalidateCaches(){this.state.projection.pendingSequenceCacheVersion=-1,this.state.projection.activeKeysPlainCacheVersion=-1,this.state.projection.activeKeysBindingsCacheVersion=-1,this.state.projection.activeKeysMetadataCacheVersion=-1,this.state.projection.activeKeysBindingsAndMetadataCacheVersion=-1}notifyPendingSequenceChange(){if(!this.hooks.has("pendingSequence"))return;this.hooks.emit("pendingSequence",this.state.projection.pendingSequence?this.collectSequencePartsFromPending(this.state.projection.pendingSequence):[])}}function mergeRequirement(target,name,value,source){if(Object.prototype.hasOwnProperty.call(target,name)&&!Object.is(target[name],value))throw Error(`Conflicting keymap requirement for "${name}" from ${source}`);target[name]=value}function mergeAttribute(target,name,value,source){if(Object.prototype.hasOwnProperty.call(target,name)&&!Object.is(target[name],value))throw Error(`Conflicting keymap attribute for "${name}" from ${source}`);target[name]=value}function isPlainObject2(value){let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function getErrorMessage(error2,fallback){if(error2 instanceof Error&&error2.message)return error2.message;return fallback}function isPromiseLike(value){if(!value)return!1;if(typeof value!=="object"&&typeof value!=="function")return!1;return typeof value.then==="function"}function snapshotDataValue(value,options){let deep=options?.deep===!0,freeze=options?.freeze===!0,preserveNonPlainObjects=options?.preserveNonPlainObjects===!0;if(Array.isArray(value)){let cloned=deep?value.map((entry2)=>snapshotDataValue(entry2,options)):[...value];return freeze?Object.freeze(cloned):cloned}if(value&&typeof value==="object"){if(preserveNonPlainObjects&&!isPlainObject2(value))return value;let cloned={};for(let[key,entry2]of Object.entries(value))cloned[key]=deep?snapshotDataValue(entry2,options):entry2;return freeze?Object.freeze(cloned):cloned}return value}function createCommandChainCacheState(){return{resolvedWithoutRecordChains:new Map,resolvedWithRecordChains:new Map,fallbackWithoutRecord:new Map,fallbackWithRecord:new Map,fallbackWithoutRecordErrors:new Set,fallbackWithRecordErrors:new Set}}function normalizeBindingCommand(command){if(command===void 0||typeof command==="function")return command;let trimmed=command.trim();if(!trimmed)throw Error("Invalid keymap command: command cannot be empty");return trimmed}function normalizeCommandName(name){let trimmed=name.trim();if(!trimmed)throw Error("Invalid keymap command name: name cannot be empty");if(/\s/.test(trimmed))throw Error(`Invalid keymap command name "${name}": command names cannot contain whitespace`);return trimmed}class CommandCatalogService{state;host;notify;conditions;options;constructor(state,host,notify,conditions,options){this.state=state,this.host=host,this.notify=notify,this.conditions=conditions,this.options=options}normalizeCommands(commands){return normalizeRegisteredCommands({commands,commandFields:this.state.environment.commandFields,conditions:this.conditions,onError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}prependCommandResolver(resolver){return this.mutateCommandResolvers(()=>this.state.commands.commandResolvers.prepend(resolver),resolver)}appendCommandResolver(resolver){return this.mutateCommandResolvers(()=>this.state.commands.commandResolvers.append(resolver),resolver)}clearCommandResolvers(){if(!this.state.commands.commandResolvers.has())return;this.notify.runWithStateChangeBatch(()=>{this.state.commands.commandResolvers.clear(),this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange()})}getCommands(query2){return this.getFilteredCommandEntries(query2).map((entry2)=>getRegisteredCommandRecord(entry2.command))}getCommandEntries(query2){let context=this.getCommandQueryContext(query2),filteredEntries=this.getFilteredCommandEntries(query2,context);if(filteredEntries.length===0)return[];let grouped=filteredEntries.map((entry2)=>({entry:entry2,command:getRegisteredCommandRecord(entry2.command),bindings:[]})),indexesByName=new Map;for(let[index,item]of grouped.entries()){let existing=indexesByName.get(item.command.name);if(existing)existing.push(index);else indexesByName.set(item.command.name,[index])}if(indexesByName.size>0)this.collectCommandEntryBindings(grouped,indexesByName,context);return grouped.map((item)=>({command:item.command,bindings:item.bindings}))}getResolvedCommandChain(command,focused,includeRecord){let view=this.getActiveCommandView(focused),entries=this.getResolvedCommandChainFromView(view,command,focused,includeRecord,"active",view.chainsByName.get(command)),hadError=(includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors).has(command);return{entries,hadError}}getRegisteredResolvedEntries(command,includeRecord){let view=this.getRegisteredCommandView(),cache=includeRecord?view.resolvedWithRecordChains:view.resolvedWithoutRecordChains,cached=cache.get(command);if(cached)return cached.length>0?cached:void 0;let chain=view.chainsByName.get(command);if(!chain||chain.length===0){cache.set(command,[]);return}let resolved=[];for(let entry2 of chain)resolved.push({target:entry2.layer.target,resolved:resolveRegisteredCommand(entry2.command,{includeRecord})});return cache.set(command,resolved),resolved}getRegisteredResolverFallback(command,includeRecord){let view=this.getRegisteredCommandView(),fallback=this.getFallbackResolvedCommand(view,command,null,includeRecord,"registered"),hadError=(includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors).has(command);return{resolved:fallback?.resolved,hadError}}getCommandAttrs(command,focused){return this.getTopResolvedCommand(command,focused,!1)?.resolved.attrs}getTopCommandRecord(command,focused){return this.getTopResolvedCommand(command,focused,!0)?.resolved.record}getTopRegisteredCommandRecord(command){let top=this.getTopRegisteredCommand(command);return top?getRegisteredCommandRecord(top.command):void 0}getDispatchUnavailableCommandState(command,focused,includeRecord){let chain=this.getRegisteredCommandView().chainsByName.get(command);if(!chain||chain.length===0)return;let inactiveEntry,disabledEntry;for(let entry2 of chain){if(!isLayerActiveForFocused(this.host,entry2.layer,focused)){inactiveEntry??=entry2;continue}if(!this.conditions.layerMatchesRuntimeState(entry2.layer)||!this.conditions.matchesConditions(entry2.command))disabledEntry??=entry2}let unavailableEntry=disabledEntry??inactiveEntry;if(!unavailableEntry)return;return{reason:disabledEntry?"disabled":"inactive",command:includeRecord?getRegisteredCommandRecord(unavailableEntry.command):void 0}}getActiveCommandView(focused){let currentFocused=getFocusedTargetIfAvailable(this.host),derivedStateVersion=this.state.notify.derivedStateVersion;if(focused===currentFocused&&this.state.commands.activeCommandViewVersion===derivedStateVersion&&this.state.commands.activeCommandView?.cacheable)return this.state.commands.activeCommandView;let entries=[],reachable=[],reachableByName=new Map,chainsByName=new Map,cacheable=!0;if(this.state.layers.layersWithCommands>0)for(let layer of getActiveLayersForFocused(this.state.layers,this.host,focused)){if(layer.commands.length===0||!this.conditions.layerMatchesRuntimeState(layer))continue;if(layer.hasUnkeyedMatchers)cacheable=!1;for(let command of layer.commands){if(command.hasUnkeyedMatchers)cacheable=!1;if(!this.conditions.matchesConditions(command))continue;let entry2={layer,command};entries.push(entry2);let existing=chainsByName.get(command.name);if(existing)existing.push(entry2);else chainsByName.set(command.name,[entry2]);if(!reachableByName.has(command.name))reachableByName.set(command.name,entry2),reachable.push(entry2)}}let view={cacheable,entries,reachable,reachableByName,chainsByName,...createCommandChainCacheState()};if(focused===currentFocused&&view.cacheable)this.state.commands.activeCommandViewVersion=derivedStateVersion,this.state.commands.activeCommandView=view;return view}getRegisteredCommandView(){let cacheVersion=this.state.commands.commandMetadataVersion;if(this.state.commands.registeredCommandViewVersion===cacheVersion&&this.state.commands.registeredCommandView)return this.state.commands.registeredCommandView;let entries=[],chainsByName=new Map;for(let layer of this.state.layers.sortedLayers){if(layer.commands.length===0)continue;for(let command of layer.commands){let entry2={layer,command};entries.push(entry2);let existing=chainsByName.get(command.name);if(existing)existing.push(entry2);else chainsByName.set(command.name,[entry2])}}let view={entries,chainsByName,...createCommandChainCacheState()};return this.state.commands.registeredCommandViewVersion=cacheVersion,this.state.commands.registeredCommandView=view,view}isBindingVisible(binding,focused,activeView){if(binding.command===void 0||binding.run)return!0;if(typeof binding.command!=="string")return!1;if(activeView.reachableByName.has(binding.command))return!0;return this.getFallbackResolvedCommand(activeView,binding.command,focused,!1,"active")!==void 0}getBindingCommandAttrs(binding,focused,activeView){if(typeof binding.command!=="string")return;let active=activeView.reachableByName.get(binding.command);if(active)return active.command.attrs;return this.getFallbackResolvedCommand(activeView,binding.command,focused,!1,"active")?.resolved.attrs}getCommandResolutionStatus(command,layerCommands){if(layerCommands?.has(command)||this.state.commands.registeredNames.has(command))return"resolved";let lookup=this.resolveCommandWithResolvers(command,getFocusedTargetIfAvailable(this.host));if(lookup.resolved||lookup.hadError)return lookup.resolved?"resolved":"error";return"unresolved"}mutateCommandResolvers(register2,resolver){return this.notify.runWithStateChangeBatch(()=>{let off=register2();return this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange(),()=>{this.notify.runWithStateChangeBatch(()=>{if(off(),this.state.commands.commandResolvers.values().includes(resolver))return;this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange()})}})}getTopResolvedCommand(command,focused,includeRecord){let activeView=this.getActiveCommandView(focused),active=activeView.reachableByName.get(command);if(active)return{target:active.layer.target,resolved:resolveRegisteredCommand(active.command,{includeRecord})};return this.getFallbackResolvedCommand(activeView,command,focused,includeRecord,"active")}getTopRegisteredCommand(command){return this.getRegisteredCommandView().chainsByName.get(command)?.[0]}getFallbackResolvedCommand(view,command,focused,includeRecord,mode){let cache=includeRecord?view.fallbackWithRecord:view.fallbackWithoutRecord,errorCache=includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors;if(cache.has(command)){let cached=cache.get(command);return cached?{resolved:cached}:void 0}let lookup=this.resolveCommandWithResolvers(command,focused,{includeRecord,mode});if(cache.set(command,lookup.resolved??null),lookup.hadError)errorCache.add(command);if(!lookup.resolved)return;return{resolved:lookup.resolved}}getResolvedCommandChainFromView(view,command,focused,includeRecord,mode,activeChain){let cache=includeRecord?view.resolvedWithRecordChains:view.resolvedWithoutRecordChains,cached=cache.get(command);if(cached)return cached.length>0?cached:void 0;let resolved=[],chain=activeChain;if(chain)for(let entry2 of chain)resolved.push({target:entry2.layer.target,resolved:resolveRegisteredCommand(entry2.command,{includeRecord})});let fallback=this.getFallbackResolvedCommand(view,command,focused,includeRecord,mode);if(fallback)resolved.push(fallback);return cache.set(command,resolved),resolved.length>0?resolved:void 0}getRegisteredLayerCommandEntries(){let cacheVersion=this.state.commands.commandMetadataVersion;if(this.state.commands.registeredCommandEntriesCacheVersion===cacheVersion)return this.state.commands.registeredCommandEntriesCache;let layers=[...this.state.layers.layers];layers.sort((left,right)=>left.order-right.order);let entries=[];for(let layer of layers)for(let command of layer.commands)entries.push({layer,command});return this.state.commands.registeredCommandEntriesCacheVersion=cacheVersion,this.state.commands.registeredCommandEntriesCache=entries,entries}getCommandQueryContext(query2){let visibility=query2?.visibility??"reachable",focused=query2&&Object.prototype.hasOwnProperty.call(query2,"focused")?query2.focused??null:getFocusedTargetIfAvailable(this.host);if(visibility==="registered")return{visibility,focused};return{visibility,focused,activeView:this.getActiveCommandView(focused)}}getFilteredCommandEntries(query2,context=this.getCommandQueryContext(query2)){let entries;if(context.visibility==="registered")entries=this.getRegisteredLayerCommandEntries();else if(context.visibility==="active")entries=context.activeView?.entries??[];else entries=context.activeView?.reachable??[];return queryLayerCommandEntries({entries,query:query2,getCommandRecord:(command)=>getRegisteredCommandRecord(command),onFilterError:(error2)=>{this.notify.emitError("command-query-filter-error",error2,"[Keymap] Error in command query filter:")}})}collectCommandEntryBindings(grouped,indexesByName,context){if(context.visibility==="registered"){let layers=[...this.state.layers.layers];layers.sort((left,right)=>left.order-right.order);for(let layer of layers)for(let binding of layer.compiledBindings)this.collectBindingForCommandEntries(grouped,indexesByName,binding);return}let activeView=context.activeView;if(!activeView)return;for(let layer of getActiveLayersForFocused(this.state.layers,this.host,context.focused)){if(layer.compiledBindings.length===0||!this.conditions.layerMatchesRuntimeState(layer))continue;for(let binding of layer.compiledBindings){if(!this.conditions.matchesConditions(binding)||!this.isBindingVisible(binding,context.focused,activeView))continue;this.collectBindingForCommandEntries(grouped,indexesByName,binding)}}}collectBindingForCommandEntries(grouped,indexesByName,binding){if(typeof binding.command!=="string")return;let indexes=indexesByName.get(binding.command);if(!indexes||indexes.length===0)return;for(let index of indexes){let item=grouped[index];if(!item)continue;item.bindings.push({sequence:binding.sequence,command:binding.command,commandAttrs:item.command.attrs,attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough})}}resolveCommandWithResolvers(command,focused,options){let includeRecord=options?.includeRecord===!0,context=this.createCommandResolverContext(includeRecord,focused,options?.mode??"active");return resolveCommandWithResolvers(command,this.state.commands.commandResolvers.values(),context,(error2)=>{this.notify.emitError("command-resolver-error",error2,`[Keymap] Error in command resolver for "${command}":`)})}createCommandResolverContext(includeRecord,focused,mode){return{getCommandAttrs:(name)=>{if(mode==="registered")return this.getTopRegisteredCommand(name)?.command.attrs;return this.getCommandAttrs(name,focused)},getCommandRecord:(name)=>{if(!includeRecord)return;if(mode==="registered")return this.getTopRegisteredCommandRecord(name);return this.getTopCommandRecord(name,focused)}}}}function getRegisteredCommandRecord(command){if(command.record)return command.record;let fields=EMPTY_COMMAND_FIELDS;if(command.fields!==EMPTY_COMMAND_FIELDS&&Object.keys(command.fields).length>0)fields=snapshotDataValue(command.fields,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS);let record=command.attrs?Object.freeze({name:command.name,fields,attrs:snapshotDataValue(command.attrs,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS)}):Object.freeze({name:command.name,fields});return command.record=record,record}function resolveRegisteredCommand(command,options){if(options?.includeRecord===!0){let existing2=command.resolvedWithRecord;if(existing2)return existing2;let resolved2={run:createRegisteredCommandRunner(command)};if(command.attrs)resolved2.attrs=command.attrs;return resolved2.record=getRegisteredCommandRecord(command),command.resolvedWithRecord=resolved2,resolved2}let existing=command.resolved;if(existing)return existing;let resolved={run:createRegisteredCommandRunner(command)};if(command.attrs)resolved.attrs=command.attrs;return command.resolved=resolved,resolved}function normalizeRegisteredCommands(options){let normalizedCommands=[],seen=new Set;for(let command of options.commands){let normalizedCommand;try{let mergedAttrs={},mergedFields={},mergedRequires={},matchers=[],conditionKeys=new Set,hasUnkeyedMatchers=!1,normalizedName=normalizeCommandName(command.name);if(seen.has(normalizedName)){options.onError("duplicate-command",{command:normalizedName},`Duplicate keymap command "${normalizedName}" in the same layer`);continue}for(let[fieldName,value]of Object.entries(command)){if(RESERVED_COMMAND_FIELDS.has(fieldName)||value===void 0)continue;mergedFields[fieldName]=snapshotDataValue(value,SNAPSHOT_COMMAND_METADATA_OPTIONS);let compiler=options.commandFields.get(fieldName);if(!compiler)continue;compiler(value,createCommandFieldContext(mergedAttrs,mergedRequires,conditionKeys,matchers,options.conditions,fieldName,{onUnkeyedMatcher(){hasUnkeyedMatchers=!0}}))}let attrs=Object.keys(mergedAttrs).length===0?void 0:Object.freeze(mergedAttrs),fields=Object.keys(mergedFields).length===0?EMPTY_COMMAND_FIELDS:Object.freeze(mergedFields);if(normalizedCommand={name:normalizedName,fields,run:command.run,requires:Object.entries(mergedRequires),matchers,conditionKeys:[...conditionKeys],hasUnkeyedMatchers,matchCacheDirty:!0},attrs)normalizedCommand.attrs=attrs}catch(error2){options.onError("register-command-failed",error2,getErrorMessage(error2,`Failed to register keymap command "${String(command.name)}"`));continue}seen.add(normalizedCommand.name),normalizedCommands.push(normalizedCommand)}return normalizedCommands}function createCommandFieldContext(mergedAttrs,mergedRequires,conditionKeys,matchers,conditions,fieldName,options){return{require(name,requiredValue){mergeRequirement(mergedRequires,name,requiredValue,`field ${fieldName}`),conditionKeys.add(name)},attr(name,attributeValue){mergeAttribute(mergedAttrs,name,snapshotDataValue(attributeValue,SNAPSHOT_COMMAND_METADATA_OPTIONS),`field ${fieldName}`)},activeWhen(matcher){let runtimeMatcher=conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)options.onUnkeyedMatcher();matchers.push(runtimeMatcher)}}}function createRegisteredCommandRunner(command){if(command.runner)return command.runner;let runner=(ctx)=>{return command.run({...ctx,command:getRegisteredCommandRecord(command)})};return command.runner=runner,runner}function resolveCommandWithResolvers(command,resolvers,context,onResolverError){if(resolvers.length===0)return{hadError:!1};let hadError=!1;for(let resolver of resolvers){let resolved;try{resolved=resolver(command,context)}catch(error2){hadError=!0,onResolverError(error2);continue}if(resolved)return{hadError,resolved}}return{hadError}}function queryLayerCommandEntries(options){let namespace=options.query?.namespace,normalizedSearch=options.query?.search?.trim().toLowerCase()??"",searchKeys=DEFAULT_COMMAND_SEARCH_FIELDS;if(options.query?.searchIn&&options.query.searchIn.length>0)searchKeys=options.query.searchIn;let filter=options.query?.filter,filterEntries2,filterPredicate;if(typeof filter==="function")filterPredicate=filter;else if(filter)filterEntries2=Object.entries(filter);let results=[];for(let entry2 of options.entries){let command=entry2.command;if(!commandMatchesNamespace(command,namespace))continue;if(!commandMatchesSearch(command,normalizedSearch,searchKeys))continue;if(!commandMatchesFilters(command,filterEntries2,options))continue;let record=options.getCommandRecord(command);if(filterPredicate){let matches=!1;try{matches=filterPredicate(record)}catch(error2){options.onFilterError(error2);continue}if(!matches)continue}results.push(entry2)}return results}function commandMatchesSearch(command,search,searchKeys){if(!search)return!0;for(let key of searchKeys)if(commandKeyMatchesSearch(command,key,search))return!0;return!1}function commandMatchesNamespace(command,namespace){if(namespace===void 0)return!0;if(!Object.prototype.hasOwnProperty.call(command.fields,"namespace"))return!1;return commandValueMatchesFilter(command.fields.namespace,namespace)}function commandMatchesFilters(command,filters,options){if(!filters)return!0;for(let[key,matcher]of filters)if(!commandKeyMatchesQuery(command,key,matcher,options))return!1;return!0}function commandKeyMatchesSearch(command,key,search){if(key==="name"&&commandValueMatchesSearch(command.name,search))return!0;if(Object.prototype.hasOwnProperty.call(command.fields,key)&&commandValueMatchesSearch(command.fields[key],search))return!0;if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key))return commandValueMatchesSearch(command.attrs[key],search);return!1}function commandKeyMatchesQuery(command,key,matcher,options){if(typeof matcher==="function"){let record,getRecord=()=>{if(!record)record=options.getCommandRecord(command);return record},foundValue=!1;if(key==="name"){foundValue=!0;try{if(matcher(command.name,getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(Object.prototype.hasOwnProperty.call(command.fields,key)){foundValue=!0;try{if(matcher(command.fields[key],getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key)){foundValue=!0;try{if(matcher(command.attrs[key],getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(!foundValue)try{return matcher(void 0,getRecord())}catch(error2){return options.onFilterError(error2),!1}return!1}return commandKeyMatchesExact(command,key,matcher)}function commandKeyMatchesExact(command,key,matcher){if(key==="name"&&commandValueMatchesFilter(command.name,matcher))return!0;if(Object.prototype.hasOwnProperty.call(command.fields,key)&&commandValueMatchesFilter(command.fields[key],matcher))return!0;if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key))return commandValueMatchesFilter(command.attrs[key],matcher);return!1}function commandValueMatchesFilter(value,matcher){if(Array.isArray(matcher)){for(let expected of matcher)if(commandValueMatchesExact(value,expected))return!0;return!1}return commandValueMatchesExact(value,matcher)}function commandValueMatchesExact(value,expected){if(Array.isArray(value)){for(let entry2 of value)if(commandValueMatchesExact(entry2,expected))return!0;return!1}return Object.is(value,expected)}function commandValueMatchesSearch(value,search){if(Array.isArray(value)){for(let entry2 of value)if(commandValueMatchesSearch(entry2,search))return!0;return!1}if(typeof value==="string")return value.toLowerCase().includes(search);if(typeof value==="number"||typeof value==="boolean"||typeof value==="bigint")return String(value).toLowerCase().includes(search);return!1}class CommandExecutorService{notify;runtime;activation;catalog;options;constructor(notify,runtime,activation,catalog,options){this.notify=notify,this.runtime=runtime,this.activation=activation,this.catalog=catalog,this.options=options}runCommand(cmd,options){let normalized;try{normalized=normalizeBindingCommand(cmd)}catch{return{ok:!1,reason:"invalid-args"}}if(typeof normalized!=="string")return{ok:!1,reason:"not-found"};let includeRecord=options?.includeCommand===!0,focused=options?.focused??this.activation.getFocusedTargetIfAvailable(),event=options?.event??this.options.createCommandEvent(),data=this.runtime.getReadonlyData(),chain=this.catalog.getRegisteredResolvedEntries(normalized,includeRecord),rejectedResult;if(chain?.length===1){let[entry2]=chain;if(entry2){let execution=this.executeResolvedCommand(normalized,entry2.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data},execution=this.executeResolvedCommand(normalized,entry2.resolved,context);if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}let fallback=this.catalog.getRegisteredResolverFallback(normalized,includeRecord);if(fallback.resolved){let execution=this.executeResolvedCommand(normalized,fallback.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}if(fallback.hadError)return{ok:!1,reason:"error"};return rejectedResult??{ok:!1,reason:"not-found"}}dispatchCommand(cmd,options){let normalized;try{normalized=normalizeBindingCommand(cmd)}catch{return{ok:!1,reason:"invalid-args"}}if(typeof normalized!=="string")return{ok:!1,reason:"not-found"};let includeRecord=options?.includeCommand===!0,focused=options?.focused??this.activation.getFocusedTargetIfAvailable(),event=options?.event??this.options.createCommandEvent(),data=this.runtime.getReadonlyData(),chainLookup=this.catalog.getResolvedCommandChain(normalized,focused,includeRecord),chain=chainLookup.entries,rejectedResult;if(chain?.length===1){let[entry2]=chain;if(entry2){let execution=this.executeResolvedCommand(normalized,entry2.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data},execution=this.executeResolvedCommand(normalized,entry2.resolved,context);if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}if(chainLookup.hadError)return{ok:!1,reason:"error"};let unavailable=this.catalog.getDispatchUnavailableCommandState(normalized,focused,includeRecord);if(unavailable)return unavailable.command?{ok:!1,reason:unavailable.reason,command:unavailable.command}:{ok:!1,reason:unavailable.reason};return rejectedResult??{ok:!1,reason:"not-found"}}runBinding(bindingLayer,binding,event,focused){let data=this.runtime.getReadonlyData();if(binding.run){if(this.executeResolvedCommand(typeof binding.command==="string"?binding.command:"<function>",{run:binding.run},{keymap:this.options.keymap,event,focused,target:bindingLayer.target??null,data}).status==="rejected")return!1;return applyBindingEventEffects(binding,event),!0}if(typeof binding.command!=="string")return!1;let chain=this.catalog.getResolvedCommandChain(binding.command,focused,!1).entries;if(chain?.length===1){let[entry2]=chain;if(entry2){if(this.executeResolvedCommand(binding.command,entry2.resolved,{keymap:this.options.keymap,event,focused,target:entry2.target??bindingLayer.target??null,data}).status==="rejected")return!1;return applyBindingEventEffects(binding,event),!0}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:entry2.target??bindingLayer.target??null,data};if(this.executeResolvedCommand(binding.command,entry2.resolved,context).status==="rejected")continue;return applyBindingEventEffects(binding,event),!0}return!1}executeResolvedCommand(commandName,resolved,context){let command=resolved.record,result2;try{result2=resolved.run(context)}catch(error2){return this.notify.emitError("command-execution-error",error2,`[Keymap] Error running command "${commandName}":`),{status:"error",result:{ok:!1,reason:"error",command}}}if(isPromiseLike(result2))return result2.catch((error2)=>{this.notify.emitError("async-command-error",error2,`[Keymap] Async error in command "${commandName}":`)}),{status:"handled",result:{ok:!0,command}};if(result2===!1){if(resolved.rejectedResult)return{status:"rejected",result:resolved.rejectedResult};return{status:"rejected",result:{ok:!1,reason:"rejected",command}}}return{status:"handled",result:{ok:!0,command}}}}function applyBindingEventEffects(binding,event){if(!binding.preventDefault)return;event.preventDefault(),event.stopPropagation()}function normalizeBindingInputs(bindings){if(Array.isArray(bindings))return bindings;let normalized=[];for(let[key,cmd]of Object.entries(bindings)){if(typeof cmd!=="string"&&typeof cmd!=="function")throw Error(`Invalid keymap binding for "${key}": shorthand bindings must map to string or function commands`);normalized.push({key,cmd})}return normalized}function snapshotBindingInputs(bindings){return normalizeBindingInputs(bindings).map((binding)=>({...binding,key:typeof binding.key==="string"?binding.key:{...binding.key}}))}function snapshotParsedBindingInput(binding){return{...binding,sequence:cloneKeySequence(binding.sequence)}}function createSequenceNode(parent,stroke,match){return{parent,depth:parent?parent.depth+1:0,stroke,match,children:new Map,bindings:[],reachableBindings:[]}}function snapshotAttributes(attrs){if(Object.keys(attrs).length===0)return;return snapshotDataValue(attrs,{freeze:!0})}class CompilerService{state;notify;conditions;options;constructor(state,notify,conditions,options){this.state=state,this.notify=notify,this.conditions=conditions,this.options=options}parseTokenKey(key){return parseSingleKeyPartWithParsers(key,this.state.environment.bindingParsers.values(),{tokens:this.state.environment.tokens,layer:EMPTY_COMPILE_FIELDS,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)})}compileBindings(bindings,tokens2,sourceTarget,sourceLayerOrder,compileFields){let root=createSequenceNode(null,null,null),compiledBindings=[],hasTokenBindings=!1,bindingExpanders=this.state.environment.bindingExpanders.values(),bindingParsers=this.state.environment.bindingParsers.values(),bindingFieldCompilers=this.state.environment.bindingFields,allowExactPrefixAmbiguity=this.state.dispatch.disambiguationResolvers.has(),warnUnknownField=this.options.warnUnknownField,warnUnknownToken=this.options.warnUnknownToken,conditions=this.conditions;for(let[bindingIndex,binding]of bindings.entries()){let expandedBindingKeys;try{expandedBindingKeys=expandBindingInputWithExpanders(binding.key,bindingExpanders,{layer:compileFields})}catch(error2){this.notify.emitError("binding-expand-error",error2,getErrorMessage(error2,"Failed to expand keymap binding"));continue}for(let expandedBindingKey of expandedBindingKeys){let parsed;try{parsed=typeof expandedBindingKey==="string"?parseBindingSequenceWithParsers(expandedBindingKey,bindingParsers,{tokens:tokens2,layer:compileFields,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)}):{parts:[this.parseObjectKeyPart(expandedBindingKey)],usedTokens:[],unknownTokens:[],hasTokenBindings:!1}}catch(error2){this.notify.emitError("binding-parse-error",error2,getErrorMessage(error2,"Failed to parse keymap binding"));continue}let sequence=parsed.parts;hasTokenBindings||=parsed.hasTokenBindings;for(let tokenName of parsed.unknownTokens)warnUnknownToken(tokenName,typeof expandedBindingKey==="string"?expandedBindingKey:String(expandedBindingKey.name));for(let compiledInput of this.applyBindingTransformers(binding,sequence,tokens2,bindingParsers,compileFields))try{let event=this.normalizeBindingEvent(compiledInput.event),compiledSequence=compiledInput.sequence,mergedRequires,mergedAttrs,matchers,conditionKeys,hasUnkeyedMatchers=!1;for(let fieldName in compiledInput){if(fieldName==="sequence")continue;if(RESERVED_BINDING_FIELDS.has(fieldName))continue;let value=compiledInput[fieldName];if(value===void 0)continue;let compiler=bindingFieldCompilers.get(fieldName);if(!compiler){warnUnknownField("binding",fieldName);continue}compiler(value,{require(name,requiredValue){if(!mergedRequires)mergedRequires={};if(mergeRequirement(mergedRequires,name,requiredValue,`field ${fieldName}`),!conditionKeys)conditionKeys=new Set;conditionKeys.add(name)},attr(name,attributeValue){if(!mergedAttrs)mergedAttrs={};mergeAttribute(mergedAttrs,name,attributeValue,`field ${fieldName}`)},activeWhen:(matcher)=>{let runtimeMatcher=conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)hasUnkeyedMatchers=!0;if(!matchers)matchers=[];matchers.push(runtimeMatcher)}})}let attrs=mergedAttrs?snapshotAttributes(mergedAttrs):void 0,command=normalizeBindingCommand(compiledInput.cmd),compiledBinding={sequence:compiledSequence,command,event,sourceBinding:snapshotParsedBindingInput(compiledInput),sourceTarget,sourceLayerOrder,sourceBindingIndex:bindingIndex,requires:mergedRequires?Object.entries(mergedRequires):EMPTY_REQUIRES,matchers:matchers??EMPTY_MATCHERS,conditionKeys:conditionKeys?[...conditionKeys]:EMPTY_CONDITION_KEYS,hasUnkeyedMatchers,matchCacheDirty:!0,preventDefault:compiledInput.preventDefault!==!1,fallthrough:compiledInput.fallthrough??!1};if(attrs)compiledBinding.attrs=attrs;if(typeof command==="function")compiledBinding.run=command;if(compiledSequence.length===0)continue;if(event==="release"&&compiledSequence.length>1)throw Error("Keymap release bindings only support a single key stroke");if(event==="press")this.insertBinding(root,compiledBinding,allowExactPrefixAmbiguity);compiledBindings.push(compiledBinding)}catch(error2){this.notify.emitError("binding-compile-error",error2,getErrorMessage(error2,"Failed to compile keymap binding"))}}}return{root,bindings:compiledBindings,hasTokenBindings}}parseObjectKeyPart(key,options){return createKeySequencePart(key,options)}normalizeBindingEvent(event){if(event===void 0||event==="press")return"press";if(event==="release")return"release";throw Error(`Invalid keymap binding event "${String(event)}": expected "press" or "release"`)}applyBindingTransformers(binding,sequence,tokens2,bindingParsers,compileFields){let bindingTransformers=this.state.environment.bindingTransformers.values();if(bindingTransformers.length===0)return[{...binding,sequence:cloneKeySequence(sequence)}];let parsedBinding={...binding,sequence:cloneKeySequence(sequence)},extraBindings=[],keepOriginal=!0,layer=compileFields??EMPTY_COMPILE_FIELDS;for(let transformer of bindingTransformers)try{transformer(parsedBinding,{layer,parseKey:(key)=>{return parseSingleKeyPartWithParsers(key,bindingParsers,{tokens:tokens2,layer,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)})},add:(nextBinding)=>{extraBindings.push(snapshotParsedBindingInput(nextBinding))},skipOriginal:()=>{keepOriginal=!1}})}catch(error2){this.notify.emitError("binding-transformer-error",error2,"[Keymap] Error in binding transformer:")}if(!keepOriginal)return extraBindings;if(extraBindings.length===0)return[parsedBinding];return[parsedBinding,...extraBindings]}insertBinding(root,binding,allowExactPrefixAmbiguity){let node=root,touchedNodes=[],createdNodes=[];try{for(let part of binding.sequence){if(!allowExactPrefixAmbiguity&&node.bindings.some((candidate)=>candidate.command!==void 0))throw Error("Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer");let bindingKey=part.match,child=node.children.get(bindingKey);if(!child)child=createSequenceNode(node,cloneKeySequencePart(part).stroke,part.match),node.children.set(bindingKey,child),createdNodes.push({parent:node,key:bindingKey});child.reachableBindings.push(binding),touchedNodes.push(child),node=child}if(!allowExactPrefixAmbiguity&&binding.command!==void 0&&node.children.size>0)throw Error("Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer");node.bindings=[...node.bindings,binding]}catch(error2){for(let index=touchedNodes.length-1;index>=0;index-=1){let touchedNode=touchedNodes[index];if(!touchedNode)continue;if(touchedNode.reachableBindings.at(-1)===binding){touchedNode.reachableBindings.pop();continue}touchedNode.reachableBindings=touchedNode.reachableBindings.filter((candidate)=>candidate!==binding)}for(let index=createdNodes.length-1;index>=0;index-=1){let createdNode=createdNodes[index];if(!createdNode)continue;let child=createdNode.parent.children.get(createdNode.key);if(!child)continue;if(child.children.size>0||child.reachableBindings.length>0||child.bindings.length>0)continue;createdNode.parent.children.delete(createdNode.key)}throw error2}}}function expandBindingInputWithExpanders(key,expanders,options){if(typeof key!=="string"||expanders.length===0)return[key];let layer=options?.layer??EMPTY_COMPILE_FIELDS,candidates=[key];for(let expander of expanders){let nextCandidates=[];for(let input of candidates){let result2=expander({input,layer});if(!result2){nextCandidates.push(input);continue}if(result2.length===0)throw Error(`Keymap binding expander must return at least one key sequence for "${input}"`);for(let expandedInput of result2){if(typeof expandedInput!=="string")throw Error(`Keymap binding expander must return string key sequences for "${input}"`);nextCandidates.push(expandedInput)}}candidates=nextCandidates}return candidates}function parseBindingSequenceWithParsers(key,parsers2,options){if(key.length===0)throw Error("Invalid key sequence: sequence cannot be empty");if(parsers2.length===0)throw Error("No keymap binding parsers are registered");let tokens2=options.tokens??new Map,layer=options.layer??EMPTY_COMPILE_FIELDS,parseObjectKey=options.parseObjectKey,parts=[],usedTokens=new Set,unknownTokens=new Set,index=0;while(index<key.length){let matched=!1;for(let parser of parsers2){let result2=parser({input:key,index,layer,tokens:tokens2,normalizeTokenName:normalizeBindingTokenName,createMatch:createTextKeyMatch,parseObjectKey});if(!result2)continue;if(result2.nextIndex<=index||result2.nextIndex>key.length)throw Error(`Keymap binding parser must advance the input for "${key}" at index ${index}`);parts.push(...result2.parts);for(let tokenName of result2.usedTokens??[])usedTokens.add(tokenName);for(let tokenName of result2.unknownTokens??[])unknownTokens.add(tokenName);index=result2.nextIndex,matched=!0;break}if(!matched)throw Error(`No keymap binding parser handled input at index ${index} in "${key}"`)}return{parts,usedTokens:[...usedTokens],unknownTokens:[...unknownTokens],hasTokenBindings:usedTokens.size>0||unknownTokens.size>0}}function parseSingleKeyPartWithParsers(key,parsers2,options){if(typeof key!=="string")return options.parseObjectKey(key);let{parts}=parseBindingSequenceWithParsers(key,parsers2,options),[part]=parts;if(!part||parts.length!==1)throw Error(`Invalid key "${String(key)}": expected a single key stroke`);return part}function isReactiveMatcher(value){if(!value||typeof value!=="object")return!1;let candidate=value;return typeof candidate.get==="function"&&typeof candidate.subscribe==="function"}class ConditionService{state;notify;constructor(state,notify){this.state=state,this.notify=notify}buildRuntimeMatcher(matcher,source){if(typeof matcher==="function")return{source,match:matcher,cacheable:!1};if(isReactiveMatcher(matcher))return{source,match:()=>matcher.get(),cacheable:!0,subscribe:(onChange)=>matcher.subscribe(onChange)};throw Error(`Keymap ${source} expected a function or a reactive matcher`)}hasNoConditions(target){return target.requires.length===0&&target.matchers.length===0}indexRuntimeMatchable(target){if(target.conditionKeys.length>0)for(let key of target.conditionKeys){let dependents=this.state.conditions.runtimeKeyDependents.get(key);if(dependents){dependents.add(target);continue}this.state.conditions.runtimeKeyDependents.set(key,new Set([target]))}if(!target.hasUnkeyedMatchers)target.matchCacheDirty=!0}unindexRuntimeMatchable(target){if(target.conditionKeys.length===0)return;for(let key of target.conditionKeys){let dependents=this.state.conditions.runtimeKeyDependents.get(key);if(!dependents)continue;if(dependents.delete(target),dependents.size===0)this.state.conditions.runtimeKeyDependents.delete(key)}}invalidateRuntimeConditionKey(name){let dependents=this.state.conditions.runtimeKeyDependents.get(name);if(!dependents)return;for(let target of dependents)target.matchCacheDirty=!0}matchesConditions(target){if(this.hasNoConditions(target))return!0;if(this.hasFreshConditionCache(target))return target.matchCache===!0;let matched=this.matchRequirements(target.requires)&&this.matchesRuntimeMatchers(target);return this.updateConditionCache(target,matched),matched}layerMatchesRuntimeState(layer){if(this.state.layers.layersWithConditions===0||this.hasNoConditions(layer))return!0;return this.matchesConditions(layer)}matchRequirements(requires){if(requires.length===0)return!0;for(let[name,value]of requires)if(!Object.is(this.state.runtime.data[name],value))return!1;return!0}hasFreshConditionCache(target){if(target.hasUnkeyedMatchers)return!1;return target.matchCacheDirty!==!0&&target.matchCache!==void 0}updateConditionCache(target,matched){if(target.hasUnkeyedMatchers)return;target.matchCacheDirty=!1,target.matchCache=matched}matchesRuntimeMatcher(matcher){try{return matcher.match()}catch(error2){return this.notify.emitError("runtime-matcher-error",error2,`[Keymap] Error evaluating runtime matcher from ${matcher.source}:`),!1}}matchesRuntimeMatchers(target){if(target.matchers.length===0)return!0;if(target.matchers.length===1){let[matcher]=target.matchers;return matcher?this.matchesRuntimeMatcher(matcher):!0}for(let matcher of target.matchers)if(!this.matchesRuntimeMatcher(matcher))return!1;return!0}}function createSyncDecision(action,handler){return{[KEY_DISAMBIGUATION_DECISION]:!0,action,handler}}function createDeferredDecision(action){return{[KEY_DEFERRED_DISAMBIGUATION_DECISION]:!0,action}}function isSyncDecision(value){return!!value&&typeof value==="object"&&value[KEY_DISAMBIGUATION_DECISION]===!0}function isDeferredDecision(value){return!!value&&typeof value==="object"&&value[KEY_DEFERRED_DISAMBIGUATION_DECISION]===!0}class DispatchService{state;notify;runtime;activation;conditions;executor;compiler;catalog;layers;eventMatchResolverContext;pendingDisambiguation=null;nextPendingDisambiguationId=0;constructor(state,notify,runtime,activation,conditions,executor,compiler,catalog,layers){this.state=state,this.notify=notify,this.runtime=runtime,this.activation=activation,this.conditions=conditions,this.executor=executor,this.compiler=compiler,this.catalog=catalog,this.layers=layers,this.eventMatchResolverContext={resolveKey:(key)=>{return this.compiler.parseTokenKey(key).match}}}intercept(name,fn,options){if(name==="key"){let keyOptions=options;return this.state.dispatch.keyHooks.register(fn,{priority:keyOptions?.priority??0,release:keyOptions?.release??!1})}let rawOptions=options;return this.state.dispatch.rawHooks.register(fn,{priority:rawOptions?.priority??0})}prependEventMatchResolver(resolver){return this.state.dispatch.eventMatchResolvers.prepend(resolver)}appendEventMatchResolver(resolver){return this.state.dispatch.eventMatchResolvers.append(resolver)}clearEventMatchResolvers(){this.state.dispatch.eventMatchResolvers.clear()}prependDisambiguationResolver(resolver){return this.mutateDisambiguationResolvers(()=>this.state.dispatch.disambiguationResolvers.prepend(resolver),resolver)}appendDisambiguationResolver(resolver){return this.mutateDisambiguationResolvers(()=>this.state.dispatch.disambiguationResolvers.append(resolver),resolver)}clearDisambiguationResolvers(){if(!this.state.dispatch.disambiguationResolvers.has())return;this.notify.runWithStateChangeBatch(()=>{this.state.dispatch.disambiguationResolvers.clear(),this.layers.recompileBindings()})}handlePendingSequenceChange(_previous,_next){if(!this.pendingDisambiguation)return;this.cancelPendingDisambiguation()}handleRawSequence(sequence){let hooks=this.state.dispatch.rawHooks.entries();if(hooks.length===0)return!1;let stopped=!1,context={sequence,stop(){stopped=!0}};for(let hook of hooks){try{hook.listener(context)}catch(error2){this.notify.emitError("raw-intercept-error",error2,"[Keymap] Error in raw intercept listener:")}if(stopped)return!0}return!1}handleKeyEvent(event,release){if(!release)this.cancelPendingDisambiguation();let hooks=this.state.dispatch.keyHooks.entries(),context={event,setData:(name,value)=>{this.runtime.setData(name,value)},getData:(name)=>{return this.runtime.getData(name)},consume:(options)=>{let shouldPreventDefault=options?.preventDefault??!0,shouldStopPropagation=options?.stopPropagation??!0;if(shouldPreventDefault)event.preventDefault();if(shouldStopPropagation)event.stopPropagation()}};for(let hook of hooks){if(hook.release!==release)continue;try{hook.listener(context)}catch(error2){this.notify.emitError("key-intercept-error",error2,"[Keymap] Error in key intercept listener:")}if(event.propagationStopped)return}if(release){this.dispatchReleaseLayers(event);return}this.dispatchLayers(event)}mutateDisambiguationResolvers(register2,resolver){return this.notify.runWithStateChangeBatch(()=>{let hadResolvers=this.state.dispatch.disambiguationResolvers.has(),off=register2();if(!hadResolvers&&this.state.dispatch.disambiguationResolvers.has())this.layers.recompileBindings();return()=>{this.notify.runWithStateChangeBatch(()=>{let hadBeforeRemoval=this.state.dispatch.disambiguationResolvers.has();if(off(),this.state.dispatch.disambiguationResolvers.values().includes(resolver))return;if(hadBeforeRemoval&&!this.state.dispatch.disambiguationResolvers.has())this.layers.recompileBindings()})}})}dispatchReleaseLayers(event){let focused=this.activation.getFocusedTarget(),activeLayers=this.activation.getActiveLayers(focused),hasLayerConditions=this.state.layers.layersWithConditions>0,matchKeys=this.resolveEventMatchKeys(event);layerLoop:for(let layer of activeLayers){if(layer.compiledBindings.length===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;for(let strokeKey of matchKeys){let result2=this.runReleaseBindings(layer,strokeKey,event,focused);if(!result2.handled)continue;if(result2.stop)return;continue layerLoop}}}dispatchLayers(event){let focused=this.activation.getFocusedTarget(),pending=this.activation.ensureValidPendingSequence(),matchKeys=this.resolveEventMatchKeys(event);if(pending){this.dispatchPendingSequence(pending,matchKeys,event,focused);return}let activeLayers=this.activation.getActiveLayers(focused);this.dispatchFromRoot(activeLayers,matchKeys,event,focused)}dispatchPendingSequence(pending,matchKeys,event,focused){let advancedCaptures=[];for(let capture2 of pending.captures){let nextNode=this.getReachableChild(capture2.node,matchKeys,focused);if(!nextNode)continue;advancedCaptures.push({layer:capture2.layer,node:nextNode})}if(advancedCaptures.length===0){this.activation.setPendingSequence(null);return}this.dispatchPendingCapturesFromIndex(advancedCaptures,0,!1,event,focused)}dispatchPendingCapturesFromIndex(advancedCaptures,startIndex,handledExact,event,focused){let hasHandledExact=handledExact;for(let index=startIndex;index<advancedCaptures.length;index+=1){let capture2=advancedCaptures[index];if(!capture2)continue;if(capture2.node.children.size>0){if(hasHandledExact)continue;let continuationCaptures=this.collectPendingCapturesFromAdvanced(advancedCaptures,index);if(this.tryResolvePendingAmbiguity(advancedCaptures,index,continuationCaptures,capture2,event,focused,hasHandledExact))return;this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation();return}let result2=this.runBindings(capture2.layer,capture2.node.bindings,event,focused);if(!result2.handled)continue;if(hasHandledExact=!0,result2.stop){this.activation.setPendingSequence(null);return}}this.activation.setPendingSequence(null)}dispatchFromRoot(activeLayers,matchKeys,event,focused){this.dispatchFromRootAtIndex(activeLayers,0,matchKeys,event,focused)}dispatchFromRootAtIndex(activeLayers,startIndex,matchKeys,event,focused){let hasLayerConditions=this.state.layers.layersWithConditions>0;for(let index=startIndex;index<activeLayers.length;index+=1){let layer=activeLayers[index];if(!layer)continue;if(layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;let nextNode=this.getReachableChild(layer.root,matchKeys,focused);if(!nextNode)continue;if(nextNode.children.size>0){let continuationCaptures=this.collectPendingCapturesFromRoot(activeLayers,index,matchKeys,focused);if(this.tryResolveRootAmbiguity(activeLayers,index,matchKeys,continuationCaptures,layer,nextNode,event,focused))return;this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation();return}let result2=this.runBindings(layer,nextNode.bindings,event,focused);if(!result2.handled)continue;if(result2.stop)return}}tryResolveRootAmbiguity(activeLayers,layerIndex,matchKeys,continuationCaptures,layer,node,event,focused){let applyExact=()=>{if(this.activation.setPendingSequence(null),!this.runBindings(layer,node.bindings,event,focused).stop)this.dispatchFromRootAtIndex(activeLayers,layerIndex+1,matchKeys,event,focused)};return this.tryResolveAmbiguity({event,focused,continuationCaptures,exactBindingsSource:node.bindings,runExact:applyExact})}tryResolvePendingAmbiguity(advancedCaptures,captureIndex,continuationCaptures,capture2,event,focused,handledExact){let applyExact=()=>{this.activation.setPendingSequence(null);let result2=this.runBindings(capture2.layer,capture2.node.bindings,event,focused);if(result2.stop)return;this.dispatchPendingCapturesFromIndex(advancedCaptures,captureIndex+1,handledExact||result2.handled,event,focused)};return this.tryResolveAmbiguity({event,focused,continuationCaptures,exactBindingsSource:capture2.node.bindings,runExact:applyExact})}tryResolveAmbiguity(options){let{event,focused,continuationCaptures,exactBindingsSource,runExact}=options;if(!this.state.dispatch.disambiguationResolvers.has()||continuationCaptures.length===0)return!1;let activeView=this.catalog.getActiveCommandView(focused),exactBindings=this.activation.collectMatchingBindings(exactBindingsSource,focused,activeView);if(!exactBindings.some((binding)=>binding.command!==void 0))return!1;let continueSequence=()=>{this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation()},clear=()=>{this.activation.setPendingSequence(null),event.preventDefault(),event.stopPropagation()},sequence,getSequence=()=>{return sequence??=this.activation.collectSequencePartsFromPending({captures:continuationCaptures}),sequence},decision=this.resolveDisambiguation({event,focused,getSequence,exactBindings,continuationCaptures,activeView});if(!decision)return this.warnUnresolvedAmbiguity(getSequence()),continueSequence(),!0;return this.applySyncDecision(decision,continuationCaptures,runExact,continueSequence,clear,focused,getSequence)}applySyncDecision(decision,continuationCaptures,runExact,continueSequence,clear,focused,getSequence){if(decision.action==="run-exact")return runExact(),!0;if(decision.action==="continue-sequence")return continueSequence(),!0;if(decision.action==="clear")return clear(),!0;return continueSequence(),this.scheduleDeferredDisambiguation(continuationCaptures,decision.handler,focused,getSequence(),(nextDecision)=>{if(!nextDecision)return;if(nextDecision.action==="run-exact"){runExact();return}if(nextDecision.action==="continue-sequence"){continueSequence();return}clear()}),!0}resolveDisambiguation(options){let activation=this.activation,runtime=this.runtime,sequence,exact,continuations,strokePart,ctx={event:options.event,focused:options.focused,get sequence(){return sequence??=cloneKeySequence(options.getSequence()),sequence},get stroke(){let stroke=options.getSequence().at(-1);if(!stroke)throw Error("Disambiguation context expected a non-empty sequence");return strokePart??={...stroke,stroke:cloneKeyStroke(stroke.stroke)},strokePart},get exact(){return exact??=activation.collectActiveBindings(options.exactBindings,options.focused,options.activeView).map((binding)=>({...binding,sequence:cloneKeySequence(binding.sequence)})),exact},get continuations(){return continuations??=activation.getActiveKeysForCaptures(options.continuationCaptures,{includeBindings:!0,includeMetadata:!0}),continuations},getData:(name)=>{return runtime.getData(name)},setData:(name,value)=>{runtime.setData(name,value)},runExact:()=>createSyncDecision("run-exact"),continueSequence:()=>createSyncDecision("continue-sequence"),clear:()=>createSyncDecision("clear"),defer:(run)=>createSyncDecision("defer",run)};for(let resolver of this.state.dispatch.disambiguationResolvers.values()){let result2;try{result2=resolver(ctx)}catch(error2){this.notify.emitError("disambiguation-resolver-error",error2,"[Keymap] Error in disambiguation resolver:");continue}if(result2===void 0)continue;if(isPromiseLike(result2)){this.notify.emitError("invalid-disambiguation-resolver-return",result2,"[Keymap] Disambiguation resolvers must return synchronously; use ctx.defer(...) for async handling");continue}if(!isSyncDecision(result2)){this.notify.emitError("invalid-disambiguation-decision",result2,"[Keymap] Invalid disambiguation decision returned by resolver:");continue}return result2}return}scheduleDeferredDisambiguation(captures,handler,focused,sequence,apply){this.cancelPendingDisambiguation();let controller=new AbortController,pending={id:this.nextPendingDisambiguationId++,controller,captures,apply};this.pendingDisambiguation=pending,queueMicrotask(()=>{this.executeDeferredDisambiguation(pending,handler,focused,sequence)})}executeDeferredDisambiguation(pending,handler,focused,sequence){if(!this.isPendingDisambiguationCurrent(pending))return;let ctx={signal:pending.controller.signal,sequence:cloneKeySequence(sequence),focused,sleep:(ms)=>{return this.sleepWithSignal(ms,pending.controller.signal)},runExact:()=>createDeferredDecision("run-exact"),continueSequence:()=>createDeferredDecision("continue-sequence"),clear:()=>createDeferredDecision("clear")},result2;try{result2=handler(ctx)}catch(error2){if(this.isPendingDisambiguationCurrent(pending))this.notify.emitError("deferred-disambiguation-error",error2,"[Keymap] Error in deferred disambiguation handler:"),this.finishPendingDisambiguation(pending);return}if(isPromiseLike(result2)){result2.then((resolved)=>{this.applyDeferredDisambiguationResult(pending,resolved)}).catch((error2)=>{if(!this.isPendingDisambiguationCurrent(pending))return;this.notify.emitError("deferred-disambiguation-error",error2,"[Keymap] Error in deferred disambiguation handler:"),this.finishPendingDisambiguation(pending)});return}this.applyDeferredDisambiguationResult(pending,result2)}applyDeferredDisambiguationResult(pending,result2){if(!this.isPendingDisambiguationCurrent(pending))return;if(result2!==void 0&&!isDeferredDecision(result2)){this.notify.emitError("invalid-deferred-disambiguation-decision",result2,"[Keymap] Invalid deferred disambiguation decision returned by handler:"),this.finishPendingDisambiguation(pending);return}this.finishPendingDisambiguation(pending),pending.apply(result2)}finishPendingDisambiguation(pending){if(!this.isPendingDisambiguationCurrent(pending))return;this.pendingDisambiguation=null}cancelPendingDisambiguation(){let pending=this.pendingDisambiguation;if(!pending)return;this.pendingDisambiguation=null,pending.controller.abort()}isPendingDisambiguationCurrent(pending){return this.pendingDisambiguation===pending}sleepWithSignal(ms,signal){if(signal.aborted)return Promise.resolve(!1);return new Promise((resolve23)=>{let timeout=setTimeout(()=>{signal.removeEventListener("abort",onAbort),resolve23(!0)},Math.max(0,ms)),onAbort=()=>{clearTimeout(timeout),signal.removeEventListener("abort",onAbort),resolve23(!1)};signal.addEventListener("abort",onAbort,{once:!0})})}warnUnresolvedAmbiguity(sequence){let display=stringifyKeySequence(sequence,{preferDisplay:!0});this.notify.warnOnce(`unresolved-disambiguation:${display}`,"unresolved-disambiguation",{sequence:display},`[Keymap] Ambiguous exact/prefix sequence "${display}" fell back to prefix handling because no disambiguation resolver resolved it`)}collectPendingCapturesFromRoot(activeLayers,startIndex,matchKeys,focused){let captures=[],hasLayerConditions=this.state.layers.layersWithConditions>0;for(let index=startIndex;index<activeLayers.length;index+=1){let layer=activeLayers[index];if(!layer||layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;let nextNode=this.getReachableChild(layer.root,matchKeys,focused);if(!nextNode||nextNode.children.size===0)continue;captures.push({layer,node:nextNode})}return captures}collectPendingCapturesFromAdvanced(advancedCaptures,startIndex){return advancedCaptures.filter((candidate,candidateIndex)=>{return candidateIndex>=startIndex&&candidate.node.children.size>0})}resolveEventMatchKeys(event){let resolvers=this.state.dispatch.eventMatchResolvers.values();if(resolvers.length===0)return[];if(resolvers.length===1)return resolveSingleEventMatchKeys(resolvers[0],event,this.eventMatchResolverContext,this.notify);let keys=[],seen=new Set;for(let resolver of resolvers){let resolved;try{resolved=resolver(event,this.eventMatchResolverContext)}catch(error2){this.notify.emitError("event-match-resolver-error",error2,"[Keymap] Error in event match resolver:");continue}if(!resolved||resolved.length===0)continue;for(let candidate of resolved){if(typeof candidate!=="string"){this.notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:");continue}if(seen.has(candidate))continue;seen.add(candidate),keys.push(candidate)}}return keys}runReleaseBindings(layer,strokeKey,event,focused){let handled=!1;for(let binding of layer.compiledBindings){if(binding.event!=="release")continue;let firstPart=binding.sequence[0];if(!firstPart||firstPart.match!==strokeKey)continue;if(!this.conditions.matchesConditions(binding))continue;if(!this.executor.runBinding(layer,binding,event,focused))continue;if(handled=!0,!binding.fallthrough)return{handled:!0,stop:!0}}return{handled,stop:!1}}getReachableChild(node,matchKeys,focused){for(let strokeKey of matchKeys){let child=node.children.get(strokeKey);if(!child||!this.activation.nodeHasReachableBindings(child,focused))continue;return child}return}runBindings(layer,bindings,event,focused){let handled=!1;for(let binding of bindings){if(!this.conditions.matchesConditions(binding))continue;if(!this.executor.runBinding(layer,binding,event,focused))continue;if(handled=!0,!binding.fallthrough)return{handled:!0,stop:!0}}return{handled,stop:!1}}}function resolveSingleEventMatchKeys(resolver,event,ctx,notify){let resolved;try{resolved=resolver(event,ctx)}catch(error2){return notify.emitError("event-match-resolver-error",error2,"[Keymap] Error in event match resolver:"),[]}if(!resolved||resolved.length===0)return[];if(resolved.length===1){let[candidate]=resolved;if(typeof candidate!=="string")return notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:"),[];return[candidate]}let keys=[],seen=new Set;for(let candidate of resolved){if(typeof candidate!=="string"){notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:");continue}if(seen.has(candidate))continue;seen.add(candidate),keys.push(candidate)}return keys}function registerFieldCompilers(fields,options){let{kind,reservedFields,registeredFields,emitError}=options,entries=Object.entries(fields),registered=[];for(let[name]of entries){if(reservedFields.has(name)){emitError(`reserved-${kind}-field`,{field:name,kind},`Keymap ${kind} field "${name}" is reserved`);continue}if(registeredFields.has(name))emitError(`duplicate-${kind}-field`,{field:name,kind},`Keymap ${kind} field "${name}" is already registered`)}for(let[name,compiler]of entries){if(reservedFields.has(name)||registeredFields.has(name))continue;registeredFields.set(name,compiler),registered.push([name,compiler])}return()=>{for(let[name,compiler]of registered)if(registeredFields.get(name)===compiler)registeredFields.delete(name)}}class EnvironmentService{state;notify;compiler;layers;constructor(state,notify,compiler,layers){this.state=state,this.notify=notify,this.compiler=compiler,this.layers=layers}prependBindingTransformer(transformer){return this.state.environment.bindingTransformers.prepend(transformer)}appendBindingTransformer(transformer){return this.state.environment.bindingTransformers.append(transformer)}clearBindingTransformers(){this.state.environment.bindingTransformers.clear()}prependBindingParser(parser){return this.state.environment.bindingParsers.prepend(parser)}appendBindingParser(parser){return this.state.environment.bindingParsers.append(parser)}clearBindingParsers(){this.state.environment.bindingParsers.clear()}registerToken(token){let normalizedToken;try{normalizedToken=normalizeBindingTokenName(token.name)}catch(error2){return this.notify.emitError("token-name-normalize-error",error2,getErrorMessage(error2,"Failed to register keymap token")),NOOP}if(this.state.environment.tokens.has(normalizedToken))return this.notify.emitError("duplicate-token",{token:normalizedToken},`Keymap token "${normalizedToken}" is already registered`),NOOP;let parsedToken;try{parsedToken=this.compiler.parseTokenKey(token.key)}catch(error2){return this.notify.emitError("token-parse-error",error2,getErrorMessage(error2,`Failed to register keymap token "${normalizedToken}"`)),NOOP}let registeredToken={stroke:parsedToken.stroke,match:parsedToken.match},nextTokens=new Map(this.state.environment.tokens);nextTokens.set(normalizedToken,registeredToken);try{this.layers.applyTokenState(nextTokens)}catch(error2){return this.notify.emitError("token-register-error",error2,getErrorMessage(error2,`Failed to register keymap token "${normalizedToken}"`)),NOOP}return()=>{if(this.state.environment.tokens.get(normalizedToken)!==registeredToken)return;let nextTokens2=new Map(this.state.environment.tokens);nextTokens2.delete(normalizedToken);try{this.layers.applyTokenState(nextTokens2)}catch(error2){this.notify.emitError("token-unregister-error",error2,getErrorMessage(error2,`Failed to unregister keymap token "${normalizedToken}"`))}}}prependBindingExpander(expander){return this.state.environment.bindingExpanders.prepend(expander)}appendBindingExpander(expander){return this.state.environment.bindingExpanders.append(expander)}clearBindingExpanders(){this.state.environment.bindingExpanders.clear()}registerLayerFields(fields){return registerFieldCompilers(fields,{kind:"layer",reservedFields:RESERVED_LAYER_FIELDS,registeredFields:this.state.environment.layerFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}registerBindingFields(fields){return registerFieldCompilers(fields,{kind:"binding",reservedFields:RESERVED_BINDING_FIELDS,registeredFields:this.state.environment.bindingFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}registerCommandFields(fields){return registerFieldCompilers(fields,{kind:"command",reservedFields:RESERVED_COMMAND_FIELDS,registeredFields:this.state.environment.commandFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}}function sortLayers(layers){return[...layers].sort((left,right)=>{let priorityDiff=right.priority-left.priority;if(priorityDiff!==0)return priorityDiff;return right.order-left.order})}function createCommandLookup(commands){if(commands.length===0)return;let lookup=new Map;for(let command of commands)lookup.set(command.name,command);return lookup}function addRegisteredCommandNames(target,commands){for(let command of commands)target.set(command.name,(target.get(command.name)??0)+1)}function removeRegisteredCommandNames(target,commands){for(let command of commands){let count=target.get(command.name);if(!count||count<=1){target.delete(command.name);continue}target.set(command.name,count-1)}}function getSequenceNode(root,sequence){let node=root;for(let part of sequence)if(node=node.children.get(part.match),!node)return;return node}function buildLayerBindingAnalyses(root,compiledBindings){return compiledBindings.map((binding)=>{let node=binding.event==="press"?getSequenceNode(root,binding.sequence):void 0;return{sequence:cloneKeySequence(binding.sequence),command:binding.command,attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough,sourceBinding:snapshotParsedBindingInput(binding.sourceBinding),sourceTarget:binding.sourceTarget,sourceLayerOrder:binding.sourceLayerOrder,sourceBindingIndex:binding.sourceBindingIndex,hasCommandAtSequence:node?node.bindings.some((candidate)=>candidate.command!==void 0):!1,hasContinuations:node?node.children.size>0:!1}})}class LayerService{state;notify;conditions;activation;options;constructor(state,notify,conditions,activation,options){this.state=state,this.notify=notify,this.conditions=conditions,this.activation=activation,this.options=options}registerLayer(layer){return this.notify.runWithStateChangeBatch(()=>{let target=layer.target;if(target&&this.options.host.isTargetDestroyed(target))return this.notify.emitError("destroyed-layer-target",{target},"Cannot register a keymap layer for a destroyed keymap target"),NOOP2;let bindingInputs,requires,matchers,conditionKeys,hasUnkeyedMatchers,compileFields,commands,commandLookup,targetMode;try{targetMode=this.normalizeTargetMode(layer),bindingInputs=snapshotBindingInputs(layer.bindings??[]),commands=!layer.commands||layer.commands.length===0?[]:this.options.commands.normalizeCommands(layer.commands),commandLookup=createCommandLookup(commands),{requires,matchers,conditionKeys,hasUnkeyedMatchers,compileFields}=this.compileLayerRuntimeState(layer)}catch(error2){return this.notify.emitError("register-layer-failed",error2,getErrorMessage(error2,"Failed to register keymap layer")),NOOP2}let order=this.state.core.order++,compiledBindings=this.options.compiler.compileBindings(bindingInputs,this.state.environment.tokens,target,order,compileFields);if(compiledBindings.bindings.length===0&&!compiledBindings.hasTokenBindings&&commands.length===0)return NOOP2;this.runLayerAnalyzers({target,order,commandLookup,bindingInputs,compiledBindings:compiledBindings.bindings,root:compiledBindings.root,hasTokenBindings:compiledBindings.hasTokenBindings});let registeredLayer={order,target,targetMode,priority:layer.priority??0,requires,matchers,conditionKeys,hasUnkeyedMatchers,matchCacheDirty:!0,compileFields,commands,commandLookup,bindingInputs,compiledBindings:compiledBindings.bindings,hasUnkeyedCommands:commands.some((command)=>command.hasUnkeyedMatchers),hasUnkeyedBindings:compiledBindings.bindings.some((binding)=>binding.hasUnkeyedMatchers),hasTokenBindings:compiledBindings.hasTokenBindings,root:compiledBindings.root};if(this.state.layers.layers.add(registeredLayer),registeredLayer.commands.length>0)this.state.layers.layersWithCommands+=1,this.state.commands.commandMetadataVersion+=1,addRegisteredCommandNames(this.state.commands.registeredNames,registeredLayer.commands);if(registeredLayer.requires.length>0||registeredLayer.matchers.length>0)this.state.layers.layersWithConditions+=1;this.connectRuntimeMatchable(registeredLayer);for(let command of registeredLayer.commands)this.connectRuntimeMatchable(command);for(let binding of registeredLayer.compiledBindings)this.connectRuntimeMatchable(binding);if(this.indexLayer(registeredLayer),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(),target){let onTargetDestroy=()=>{this.unregisterLayer(registeredLayer)};registeredLayer.offTargetDestroy=this.options.host.onTargetDestroy(target,onTargetDestroy)}if(registeredLayer.commands.length>0)this.activation.ensureValidPendingSequence();return this.notify.queueStateChange(),()=>{this.unregisterLayer(registeredLayer)}})}applyTokenState(nextTokens){this.notify.runWithStateChangeBatch(()=>{let nextCompilations=new Map;for(let layer of this.state.layers.layers){if(!layer.hasTokenBindings)continue;nextCompilations.set(layer,this.compileLayerBindings(layer,nextTokens))}this.state.environment.tokens=nextTokens;let shouldClearPending=!1;for(let[layer,compilation]of nextCompilations)if(this.applyCompiledBindings(layer,compilation))shouldClearPending=!0;if(shouldClearPending)this.activation.setPendingSequence(null);if(nextCompilations.size>0)this.notify.queueStateChange()})}recompileBindings(){this.notify.runWithStateChangeBatch(()=>{let recompiledLayers=0,shouldClearPending=!1;for(let layer of this.state.layers.layers){if(layer.bindingInputs.length===0)continue;let compilation=this.compileLayerBindings(layer,this.state.environment.tokens);if(this.applyCompiledBindings(layer,compilation))shouldClearPending=!0;recompiledLayers+=1}if(shouldClearPending)this.activation.setPendingSequence(null);if(recompiledLayers>0)this.notify.queueStateChange()})}prependLayerAnalyzer(analyzer){return this.state.layers.layerAnalyzers.prepend(analyzer)}appendLayerAnalyzer(analyzer){return this.state.layers.layerAnalyzers.append(analyzer)}clearLayerAnalyzers(){this.state.layers.layerAnalyzers.clear()}cleanup(){for(let layer of this.state.layers.layers){this.disconnectRuntimeMatchable(layer);for(let command of layer.commands)this.disconnectRuntimeMatchable(command);for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);layer.offTargetDestroy?.(),layer.offTargetDestroy=void 0}}normalizeTargetMode(layer){if(layer.targetMode){if(!layer.target)throw Error(`Keymap targetMode "${layer.targetMode}" requires a target`);return layer.targetMode}return layer.target?"focus-within":void 0}runLayerAnalyzers(options){let analyzers=this.state.layers.layerAnalyzers.values();if(analyzers.length===0)return;let bindings=buildLayerBindingAnalyses(options.root,options.compiledBindings),ctx={target:options.target,order:options.order,bindingInputs:options.bindingInputs,bindings,hasTokenBindings:options.hasTokenBindings,checkCommandResolution:(command)=>{return this.options.commands.getCommandResolutionStatus(command,options.commandLookup)},warn:(code,warning,message)=>{this.notify.emitWarning(code,warning,message)},warnOnce:(key,code,warning,message)=>{this.notify.warnOnce(key,code,warning,message)},error:(code,error2,message)=>{this.notify.emitError(code,error2,message)}};for(let analyzer of analyzers)try{analyzer(ctx)}catch(error2){this.notify.emitError("layer-analyzer-error",error2,"[Keymap] Error in layer analyzer:")}}compileLayerRuntimeState(layer){let mergedRequires={},matchers=[],compileFields=Object.create(null),conditionKeys=new Set,hasUnkeyedMatchers=!1;for(let[fieldName,value]of Object.entries(layer)){if(RESERVED_LAYER_FIELDS.has(fieldName))continue;if(value===void 0)continue;compileFields[fieldName]=snapshotDataValue(value);let compiler=this.state.environment.layerFields.get(fieldName);if(!compiler){this.options.warnUnknownField("layer",fieldName);continue}compiler(value,{require:(name,requiredValue)=>{mergeRequirement(mergedRequires,name,requiredValue,`field ${fieldName}`),conditionKeys.add(name)},activeWhen:(matcher)=>{let runtimeMatcher=this.conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)hasUnkeyedMatchers=!0;matchers.push(runtimeMatcher)}})}return{requires:Object.entries(mergedRequires),matchers,conditionKeys:[...conditionKeys],hasUnkeyedMatchers,compileFields:Object.keys(compileFields).length>0?Object.freeze(compileFields):void 0}}compileLayerBindings(layer,tokens2){return this.options.compiler.compileBindings(layer.bindingInputs,tokens2,layer.target,layer.order,layer.compileFields)}applyCompiledBindings(layer,compilation){this.runLayerAnalyzers({target:layer.target,order:layer.order,commandLookup:layer.commandLookup,bindingInputs:layer.bindingInputs,compiledBindings:compilation.bindings,root:compilation.root,hasTokenBindings:compilation.hasTokenBindings});for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);layer.root=compilation.root,layer.compiledBindings=compilation.bindings,layer.hasUnkeyedBindings=compilation.bindings.some((binding)=>binding.hasUnkeyedMatchers),layer.hasTokenBindings=compilation.hasTokenBindings;for(let binding of layer.compiledBindings)this.connectRuntimeMatchable(binding);return this.state.projection.pendingSequence?.captures.some((capture2)=>capture2.layer===layer)??!1}indexLayer(layer){this.state.layers.sortedLayers=sortLayers([...this.state.layers.sortedLayers,layer]),this.state.layers.activeLayersVersion+=1}removeLayerFromIndex(layer){this.state.layers.sortedLayers=this.state.layers.sortedLayers.filter((candidate)=>candidate!==layer),this.state.layers.activeLayersVersion+=1}unregisterLayer(layer){this.notify.runWithStateChangeBatch(()=>{if(!this.state.layers.layers.delete(layer))return;if(layer.requires.length>0||layer.matchers.length>0)this.state.layers.layersWithConditions-=1;if(layer.commands.length>0)this.state.layers.layersWithCommands-=1,this.state.commands.commandMetadataVersion+=1,removeRegisteredCommandNames(this.state.commands.registeredNames,layer.commands);this.disconnectRuntimeMatchable(layer);for(let command of layer.commands)this.disconnectRuntimeMatchable(command);for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);if(this.removeLayerFromIndex(layer),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(),layer.offTargetDestroy?.(),layer.offTargetDestroy=void 0,this.state.projection.pendingSequence?.captures.some((capture2)=>capture2.layer===layer))this.activation.setPendingSequence(null);else if(layer.commands.length>0&&!this.options.host.isDestroyed)this.activation.ensureValidPendingSequence();this.notify.queueStateChange()})}connectRuntimeMatchable(target){this.attachReactiveMatchers(target),this.conditions.indexRuntimeMatchable(target)}disconnectRuntimeMatchable(target){this.detachReactiveMatchers(target),this.conditions.unindexRuntimeMatchable(target)}attachReactiveMatchers(target){for(let matcher of target.matchers){if(!matcher.subscribe)continue;try{matcher.dispose=matcher.subscribe(()=>{if(target.matchCacheDirty=!0,!this.activation.hasPendingSequenceState()){this.notify.queueStateChange();return}this.notify.runWithStateChangeBatch(()=>{this.activation.revalidatePendingSequenceIfNeeded(),this.notify.queueStateChange()})})}catch(error2){this.notify.emitError("reactive-matcher-subscribe-error",error2,getErrorMessage(error2,`Failed to subscribe to reactive matcher from ${matcher.source}`))}}}detachReactiveMatchers(target){for(let matcher of target.matchers){if(!matcher.dispose)continue;try{matcher.dispose()}catch(error2){this.notify.emitError("reactive-matcher-dispose-error",error2,getErrorMessage(error2,`Failed to dispose reactive matcher from ${matcher.source}`))}matcher.dispose=void 0}}}class Emitter2{onError;listeners=Object.create(null);constructor(onError){this.onError=onError}hook(name,listener){let current=this.listeners[name]??[];return this.listeners[name]=[...current,listener],()=>{let current2=this.listeners[name];if(!current2||current2.length===0)return;let next=current2.filter((candidate)=>candidate!==listener);if(next.length===0){delete this.listeners[name];return}this.listeners[name]=next}}has(name){return(this.listeners[name]?.length??0)>0}off(name,listener){let current=this.listeners[name];if(!current||current.length===0)return;let next=current.filter((candidate)=>candidate!==listener);if(next.length===current.length)return;if(next.length===0){delete this.listeners[name];return}this.listeners[name]=next}clear(){this.listeners=Object.create(null)}emit(name,...args){let listeners2=this.listeners[name];if(!listeners2||listeners2.length===0)return;for(let listener of listeners2)try{if(args.length===0)listener();else listener(args[0])}catch(error2){this.onError(name,error2)}}}class NotificationService{state;events;hooks;constructor(state,events,hooks){this.state=state,this.events=events,this.hooks=hooks}runWithStateChangeBatch(fn){this.state.notify.stateChangeDepth+=1;try{return fn()}finally{if(this.state.notify.stateChangeDepth-=1,this.state.notify.stateChangeDepth===0)this.flushStateChange()}}queueStateChange(){if(this.state.notify.derivedStateVersion+=1,!this.hooks.has("state"))return;if(this.state.notify.stateChangePending=!0,this.state.notify.stateChangeDepth===0&&!this.state.notify.flushingStateChange)this.flushStateChange()}emitWarning(code,warning,message){if(!this.events.has("warning")){let consoleMessage=`[${code}] ${message}`;if(warning instanceof Error)console.warn(consoleMessage,warning);else console.warn(consoleMessage);return}this.events.emit("warning",{code,message,warning})}emitError(code,error2,message){if(!this.events.has("error")){let consoleMessage=`[${code}] ${message}`;if(error2 instanceof Error)console.error(consoleMessage,error2);else console.error(consoleMessage);return}this.events.emit("error",{code,message,error:error2})}reportListenerError(name,error2){if(name==="state"){this.emitError("state-listener-error",error2,"[Keymap] Error in state listener:");return}if(name==="pendingSequence"){this.emitError("pending-sequence-listener-error",error2,"[Keymap] Error in pending sequence listener:");return}}warnOnce(key,code,warning,message){if(this.state.notify.usedWarningKeys.has(key))return;this.state.notify.usedWarningKeys.add(key),this.emitWarning(code,warning,message)}flushStateChange(){if(!this.state.notify.stateChangePending||this.state.notify.stateChangeDepth>0||this.state.notify.flushingStateChange)return;this.state.notify.flushingStateChange=!0;try{let iterations=0;while(this.state.notify.stateChangePending&&this.state.notify.stateChangeDepth===0){if(iterations>=MAX_STATE_CHANGE_FLUSH_ITERATIONS){this.state.notify.stateChangePending=!1,this.emitError("state-change-feedback-loop",{iterations:MAX_STATE_CHANGE_FLUSH_ITERATIONS},`[Keymap] Possible infinite state listener feedback loop detected after ${MAX_STATE_CHANGE_FLUSH_ITERATIONS} iterations; pending state notifications were dropped`);break}iterations+=1,this.state.notify.stateChangePending=!1,this.hooks.emit("state")}}finally{this.state.notify.flushingStateChange=!1}}}class RuntimeService{state;notify;conditions;activation;constructor(state,notify,conditions,activation){this.state=state,this.notify=notify,this.conditions=conditions,this.activation=activation}getData(name){return this.state.runtime.data[name]}setData(name,value){this.notify.runWithStateChangeBatch(()=>{if(value===void 0){if(!(name in this.state.runtime.data))return;delete this.state.runtime.data[name],this.state.runtime.dataVersion+=1,this.conditions.invalidateRuntimeConditionKey(name),this.activation.ensureValidPendingSequence(),this.notify.queueStateChange();return}if(Object.is(this.state.runtime.data[name],value))return;this.state.runtime.data[name]=value,this.state.runtime.dataVersion+=1,this.conditions.invalidateRuntimeConditionKey(name),this.activation.ensureValidPendingSequence(),this.notify.queueStateChange()})}getReadonlyData(){if(this.state.runtime.readonlyDataVersion===this.state.runtime.dataVersion)return this.state.runtime.readonlyData;return this.state.runtime.readonlyData=Object.freeze({...this.state.runtime.data}),this.state.runtime.readonlyDataVersion=this.state.runtime.dataVersion,this.state.runtime.readonlyData}}class CopyOnWriteRegistry{items=[];getItems(){return this.items}setItems(items){this.items=items}removeItem(value){let current=this.items;if(current.length===0)return!1;let next=current.filter((candidate)=>candidate!==value);if(next.length===current.length)return!1;return this.items=next,!0}has(){return this.items.length>0}clear(){this.items=[]}}function createKeymapState(){return{core:{order:0},environment:{tokens:new Map,layerFields:new Map,bindingExpanders:new OrderedRegistry,bindingParsers:new OrderedRegistry,bindingTransformers:new OrderedRegistry,bindingFields:new Map,commandFields:new Map},dispatch:{eventMatchResolvers:new OrderedRegistry,disambiguationResolvers:new OrderedRegistry,keyHooks:new PriorityRegistry,rawHooks:new PriorityRegistry},layers:{layers:new Set,sortedLayers:[],activeLayersVersion:0,activeLayersCacheVersion:-1,activeLayersCacheFocused:void 0,activeLayersCache:[],layersWithConditions:0,layersWithCommands:0,layerAnalyzers:new OrderedRegistry},commands:{commandMetadataVersion:0,registeredNames:new Map,commandResolvers:new OrderedRegistry,activeCommandViewVersion:-1,activeCommandView:void 0,registeredCommandViewVersion:-1,registeredCommandView:void 0,registeredCommandEntriesCacheVersion:-1,registeredCommandEntriesCache:[]},projection:{pendingSequence:null,pendingSequenceCacheVersion:-1,pendingSequenceCache:[],activeKeysPlainCacheVersion:-1,activeKeysPlainCache:[],activeKeysBindingsCacheVersion:-1,activeKeysBindingsCache:[],activeKeysMetadataCacheVersion:-1,activeKeysMetadataCache:[],activeKeysBindingsAndMetadataCacheVersion:-1,activeKeysBindingsAndMetadataCache:[]},conditions:{runtimeKeyDependents:new Map},runtime:{data:{},dataVersion:0,readonlyDataVersion:-1,readonlyData:EMPTY_DATA},notify:{derivedStateVersion:0,stateChangeDepth:0,stateChangePending:!1,flushingStateChange:!1,usedWarningKeys:new Set}}}function getKeyMatchKey(input){return resolveKeyMatch(input)}class Keymap{host;state=createKeymapState();cleanedUp=!1;resources=new Map;cleanupListeners=[];events=new Emitter2(()=>{});hooks;notify;activation;runtime;conditions;catalog;executor;compiler;dispatch;layers;environment;keypressListener;keyreleaseListener;rawListener;focusedTargetListener;constructor(host){if(this.host=host,host.isDestroyed)throw Error("Cannot create a keymap for a destroyed host");if(this.hooks=new Emitter2((name,error2)=>{this.notify.reportListenerError(name,error2)}),this.notify=new NotificationService(this.state,this.events,this.hooks),this.conditions=new ConditionService(this.state,this.notify),this.catalog=new CommandCatalogService(this.state,this.host,this.notify,this.conditions,{onCommandResolversChanged:()=>{this.activation.ensureValidPendingSequence()}}),this.activation=new ActivationService(this.state,this.host,this.hooks,this.notify,this.conditions,this.catalog,{onPendingSequenceChanged:(previous,next)=>{this.dispatch?.handlePendingSequenceChange(previous,next)}}),this.runtime=new RuntimeService(this.state,this.notify,this.conditions,this.activation),this.executor=new CommandExecutorService(this.notify,this.runtime,this.activation,this.catalog,{keymap:this,createCommandEvent:()=>this.host.createCommandEvent()}),this.compiler=new CompilerService(this.state,this.notify,this.conditions,{warnUnknownField:(kind,fieldName)=>{this.warnUnknownField(kind,fieldName)},warnUnknownToken:(token,sequence)=>{this.warnUnknownToken(token,sequence)}}),this.layers=new LayerService(this.state,this.notify,this.conditions,this.activation,{compiler:this.compiler,commands:this.catalog,host:this.host,warnUnknownField:(kind,fieldName)=>{this.warnUnknownField(kind,fieldName)}}),this.environment=new EnvironmentService(this.state,this.notify,this.compiler,this.layers),this.dispatch=new DispatchService(this.state,this.notify,this.runtime,this.activation,this.conditions,this.executor,this.compiler,this.catalog,this.layers),this.keypressListener=(event)=>{this.dispatch.handleKeyEvent(event,!1)},this.keyreleaseListener=(event)=>{this.dispatch.handleKeyEvent(event,!0)},this.rawListener=(sequence)=>{return this.dispatch.handleRawSequence(sequence)},this.focusedTargetListener=(focused)=>{this.handleFocusedTargetChange(focused)},this.cleanupListeners.push(this.host.onKeyPress(this.keypressListener)),this.cleanupListeners.push(this.host.onKeyRelease(this.keyreleaseListener)),this.host.onRawInput)this.cleanupListeners.push(this.host.onRawInput(this.rawListener));if(this.cleanupListeners.push(this.host.onFocusChange(this.focusedTargetListener)),this.host.onDestroy)this.cleanupListeners.push(this.host.onDestroy(()=>{this.cleanup()}))}cleanup(){if(this.cleanedUp)return;this.cleanedUp=!0,this.activation.setPendingSequence(null);for(let resource of this.resources.values())resource.dispose();this.resources.clear(),this.layers.cleanup();for(let cleanupListener of this.cleanupListeners.splice(0))cleanupListener()}setData(name,value){this.runtime.setData(name,value)}getData(name){return this.runtime.getData(name)}hasPendingSequence(){return this.activation.ensureValidPendingSequence()!==void 0}getPendingSequence(){return this.activation.getPendingSequence()}createKeyMatcher(key){let match=this.compiler.parseTokenKey(key).match;return(input)=>{if(!input)return!1;return getKeyMatchKey(input)===match}}clearPendingSequence(){this.activation.setPendingSequence(null)}popPendingSequence(){return this.activation.popPendingSequence()}getActiveKeys(options){return this.activation.getActiveKeys(options)}getCommands(query2){return this.catalog.getCommands(query2)}getCommandEntries(query2){return this.catalog.getCommandEntries(query2)}normalizeCommandName(name){return normalizeCommandName(name)}normalizeBindings(bindings){return normalizeBindingInputs(bindings)}acquireResource(key,setup){if(this.cleanedUp||this.host.isDestroyed)throw Error("Cannot use a keymap after its host was destroyed");let existing=this.resources.get(key);if(existing)return existing.count+=1,()=>{this.releaseResource(key,existing)};let resource={count:1,dispose:setup()};return this.resources.set(key,resource),()=>{this.releaseResource(key,resource)}}runCommand(cmd,options){return this.executor.runCommand(cmd,options)}dispatchCommand(cmd,options){return this.executor.dispatchCommand(cmd,options)}on(name,fn){if(name==="warning")return this.events.hook(name,fn);if(name==="error")return this.events.hook(name,fn);return this.hooks.hook(name,fn)}intercept(name,fn,options){if(name==="key")return this.dispatch.intercept(name,fn,options);return this.dispatch.intercept(name,fn,options)}registerLayer(layer){return this.layers.registerLayer(layer)}registerLayerFields(fields){return this.environment.registerLayerFields(fields)}prependBindingTransformer(transformer){return this.environment.prependBindingTransformer(transformer)}appendBindingTransformer(transformer){return this.environment.appendBindingTransformer(transformer)}clearBindingTransformers(){this.environment.clearBindingTransformers()}prependBindingParser(parser){return this.environment.prependBindingParser(parser)}appendBindingParser(parser){return this.environment.appendBindingParser(parser)}clearBindingParsers(){this.environment.clearBindingParsers()}registerToken(token){return this.environment.registerToken(token)}prependBindingExpander(expander){return this.environment.prependBindingExpander(expander)}appendBindingExpander(expander){return this.environment.appendBindingExpander(expander)}clearBindingExpanders(){this.environment.clearBindingExpanders()}registerBindingFields(fields){return this.environment.registerBindingFields(fields)}registerCommandFields(fields){return this.environment.registerCommandFields(fields)}prependCommandResolver(resolver){return this.catalog.prependCommandResolver(resolver)}appendCommandResolver(resolver){return this.catalog.appendCommandResolver(resolver)}clearCommandResolvers(){this.catalog.clearCommandResolvers()}prependLayerAnalyzer(analyzer){return this.layers.prependLayerAnalyzer(analyzer)}appendLayerAnalyzer(analyzer){return this.layers.appendLayerAnalyzer(analyzer)}clearLayerAnalyzers(){this.layers.clearLayerAnalyzers()}prependEventMatchResolver(resolver){return this.dispatch.prependEventMatchResolver(resolver)}appendEventMatchResolver(resolver){return this.dispatch.appendEventMatchResolver(resolver)}clearEventMatchResolvers(){this.dispatch.clearEventMatchResolvers()}prependDisambiguationResolver(resolver){return this.dispatch.prependDisambiguationResolver(resolver)}appendDisambiguationResolver(resolver){return this.dispatch.appendDisambiguationResolver(resolver)}clearDisambiguationResolvers(){this.dispatch.clearDisambiguationResolvers()}handleFocusedTargetChange(_focused){this.notify.runWithStateChangeBatch(()=>{this.activation.setPendingSequence(null),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(_focused),this.notify.queueStateChange()})}warnUnknownField(kind,fieldName){this.notify.warnOnce(`${kind}:${fieldName}`,`unknown-${kind}-field`,{field:fieldName,kind},`[Keymap] Unknown ${kind} field "${fieldName}" was ignored`)}warnUnknownToken(token,sequence){this.notify.warnOnce(`token:${token}`,"unknown-token",{token,sequence},`[Keymap] Unknown token "${token}" in key sequence "${sequence}" was ignored`)}releaseResource(key,resource){if(this.resources.get(key)!==resource)return;if(resource.count-=1,resource.count>0)return;resource.dispose(),this.resources.delete(key)}}function registerEscapeClearsPendingSequence(keymap,options){let shouldPreventDefault=options?.preventDefault??!0;return keymap.intercept("key",({event,consume})=>{if(event.name!=="escape")return;if(!keymap.hasPendingSequence())return;if(keymap.clearPendingSequence(),shouldPreventDefault)consume()},{priority:options?.priority??0})}function registerLeader(keymap,options){return keymap.registerToken({name:options.name??"<leader>",key:options.trigger})}var RESERVED_COMMAND_FIELDS,RESERVED_BINDING_FIELDS,RESERVED_LAYER_FIELDS,DEFAULT_COMMAND_SEARCH_FIELDS,SNAPSHOT_COMMAND_METADATA_OPTIONS,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS,EMPTY_COMMAND_FIELDS,EMPTY_COMPILE_FIELDS,EMPTY_REQUIRES,EMPTY_MATCHERS,EMPTY_CONDITION_KEYS,KEY_DISAMBIGUATION_DECISION,KEY_DEFERRED_DISAMBIGUATION_DECISION,NOOP=()=>{},NOOP2=()=>{},MAX_STATE_CHANGE_FLUSH_ITERATIONS=1000,OrderedRegistry,PriorityRegistry,EMPTY_DATA,EMPTY_FIELDS;var init_addons=__esm(()=>{RESERVED_COMMAND_FIELDS=new Set(["name","run"]),RESERVED_BINDING_FIELDS=new Set(["key","cmd","event","preventDefault","fallthrough"]),RESERVED_LAYER_FIELDS=new Set(["target","targetMode","priority","bindings","commands"]);DEFAULT_COMMAND_SEARCH_FIELDS=["name"],SNAPSHOT_COMMAND_METADATA_OPTIONS=Object.freeze({deep:!0,preserveNonPlainObjects:!0}),SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS=Object.freeze({deep:!0,freeze:!0,preserveNonPlainObjects:!0}),EMPTY_COMMAND_FIELDS=Object.freeze({});EMPTY_COMPILE_FIELDS=Object.freeze({}),EMPTY_REQUIRES=[],EMPTY_MATCHERS=[],EMPTY_CONDITION_KEYS=[];KEY_DISAMBIGUATION_DECISION=Symbol("keymap-disambiguation-decision"),KEY_DEFERRED_DISAMBIGUATION_DECISION=Symbol("keymap-deferred-disambiguation-decision");OrderedRegistry=class OrderedRegistry extends CopyOnWriteRegistry{append(value){return this.setItems([...this.getItems(),value]),()=>{this.remove(value)}}prepend(value){return this.setItems([value,...this.getItems()]),()=>{this.remove(value)}}remove(value){return this.removeItem(value)}values(){return this.getItems()}};PriorityRegistry=class PriorityRegistry extends CopyOnWriteRegistry{order=0;register(listener,options){let registered={...options,listener,order:this.order++};return this.setItems([...this.getItems(),registered].sort((left,right)=>{let priorityDiff=right.priority-left.priority;if(priorityDiff!==0)return priorityDiff;return left.order-right.order})),()=>{this.removeItem(registered)}}entries(){return this.getItems()}};EMPTY_DATA=Object.freeze({});EMPTY_FIELDS=Object.freeze({})});function getFocusedTargetIfAvailable2(host){if(host.isDestroyed)return null;return host.getFocusedTarget()}function forEachActivationTarget2(host,focused,visit){let current=focused??host.rootTarget,isFocusedTarget=focused!==null;while(current){if(visit(current,isFocusedTarget)===!1)return;current=host.getParentTarget(current),isFocusedTarget=!1}}function getActivationPath2(host,focused){let path6=new Set;return forEachActivationTarget2(host,focused,(current)=>{path6.add(current)}),path6}function getActiveLayersForFocused2(state,host,focused){if(state.activeLayersCacheVersion===state.activeLayersVersion&&state.activeLayersCacheFocused===focused)return state.activeLayersCache;let activeLayers=[],activationPath=getActivationPath2(host,focused);for(let layer of state.sortedLayers)if(isLayerActiveForFocused2(host,layer,focused,activationPath))activeLayers.push(layer);return state.activeLayersCacheVersion=state.activeLayersVersion,state.activeLayersCacheFocused=focused,state.activeLayersCache=activeLayers,activeLayers}function invalidateCachedActiveLayers2(state){state.activeLayersCacheVersion=-1,state.activeLayersCacheFocused=void 0,state.activeLayersCache=[]}function isLayerActiveForFocused2(host,layer,focused,activationPath=getActivationPath2(host,focused)){let target=layer.target;if(!target)return!0;if(host.isTargetDestroyed(target))return!1;if(layer.targetMode==="focus")return target===focused;return activationPath.has(target)}function normalizeBindingTokenName2(token){let normalized=token.trim().toLowerCase();if(!normalized)throw Error("Invalid keymap token: token cannot be empty");return normalized}function normalizeKeyName2(name){let normalized=name.trim().toLowerCase();if(!normalized)throw Error("Invalid key name: key name cannot be empty");return normalized}function normalizeKeyStroke2(input){return{name:normalizeKeyName2(input.name),ctrl:input.ctrl??!1,shift:input.shift??!1,meta:input.meta??!1,super:input.super??!1,hyper:input.hyper||void 0}}function cloneKeyStroke2(stroke){return{name:stroke.name,ctrl:stroke.ctrl,shift:stroke.shift,meta:stroke.meta,super:stroke.super,hyper:stroke.hyper||void 0}}function createKeySequencePart2(input,options){let stroke=cloneKeyStroke2(normalizeKeyStroke2(input));return{stroke,display:options?.display??stringifyCanonicalStroke2(stroke),match:options?.match??createKeyMatch2(stroke),tokenName:options?.tokenName?normalizeBindingTokenName2(options.tokenName):void 0}}function cloneKeySequencePart2(part){return{stroke:cloneKeyStroke2(part.stroke),display:part.display,match:part.match,tokenName:part.tokenName}}function cloneKeySequence2(parts){return parts.map((part)=>cloneKeySequencePart2(part))}function resolveKeyMatch2(input){if("match"in input)return input.match;if("stroke"in input)return createKeyMatch2(input.stroke);return createKeyMatch2(input)}function createKeyMatch2(input){return`key:${buildKeyMatchId2(normalizeKeyStroke2(input))}`}function createTextKeyMatch2(id){let normalized=id.trim();if(!normalized)throw Error("Invalid keymap match id: id cannot be empty");return`text:${normalized}`}function stringifyKeyStroke2(input,options){if("stroke"in input){if(options?.preferDisplay&&input.display)return input.display;return stringifyCanonicalStroke2(input.stroke)}return stringifyCanonicalStroke2(normalizeKeyStroke2(input))}function stringifyKeySequence2(input,options){return input.map((part)=>stringifyKeyStroke2(part,options)).join("")}function stringifyCanonicalStroke2(stroke){let parts=[];if(stroke.ctrl)parts.push("ctrl");if(stroke.shift)parts.push("shift");if(stroke.meta)parts.push("meta");if(stroke.super)parts.push("super");if(stroke.hyper)parts.push("hyper");return parts.push(stroke.name==="return"?"enter":stroke.name),parts.join("+")}function buildKeyMatchId2(stroke){return`${stroke.name}:${stroke.ctrl?1:0}:${stroke.shift?1:0}:${stroke.meta?1:0}:${stroke.super?1:0}:${stroke.hyper?1:0}`}function getLiveHost2(host){if(host.isDestroyed)throw Error("Cannot use a keymap after its host was destroyed");return host}function isSamePendingSequence2(current,next){if(current===next)return!0;if(!current||!next)return!1;if(current.captures.length!==next.captures.length)return!1;for(let index=0;index<current.captures.length;index+=1){let left=current.captures[index],right=next.captures[index];if(!left||!right||left.layer!==right.layer||left.node!==right.node)return!1}return!0}class ActivationService2{state;host;hooks;notify;conditions;catalog;options;constructor(state,host,hooks,notify,conditions,catalog,options={}){this.state=state,this.host=host,this.hooks=hooks,this.notify=notify,this.conditions=conditions,this.catalog=catalog,this.options=options}getFocusedTarget(){return getLiveHost2(this.host).getFocusedTarget()}getFocusedTargetIfAvailable(){return getFocusedTargetIfAvailable2(this.host)}setPendingSequence(next){let previous=this.state.projection.pendingSequence;if(isSamePendingSequence2(previous,next))return;this.state.projection.pendingSequence=next,this.options.onPendingSequenceChanged?.(previous,next),this.invalidateCaches(),this.notifyPendingSequenceChange(),this.notify.queueStateChange()}ensureValidPendingSequence(){let pending=this.state.projection.pendingSequence;if(!pending)return;let focused=this.getFocusedTarget(),captures=pending.captures.filter((capture2)=>{return this.state.layers.layers.has(capture2.layer)&&this.isLayerActiveForFocused(capture2.layer,focused)&&this.conditions.layerMatchesRuntimeState(capture2.layer)&&this.nodeHasReachableBindings(capture2.node,focused)});if(captures.length===0){this.setPendingSequence(null);return}if(captures.length!==pending.captures.length)this.setPendingSequence({captures});return this.state.projection.pendingSequence??void 0}revalidatePendingSequenceIfNeeded(){if(this.host.isDestroyed||!this.state.projection.pendingSequence)return;this.ensureValidPendingSequence()}hasPendingSequenceState(){return!this.host.isDestroyed&&this.state.projection.pendingSequence!==null}getPendingSequence(){let projections=this.state.projection,derivedStateVersion=this.state.notify.derivedStateVersion;if(projections.pendingSequenceCacheVersion===derivedStateVersion)return projections.pendingSequenceCache;let pending=this.ensureValidPendingSequence(),canUseCache=!pending||pending.captures.every((capture2)=>this.layerCanCacheActiveKeys(capture2.layer)),sequence=pending?this.collectSequencePartsFromPending(pending):[];if(canUseCache)projections.pendingSequenceCacheVersion=derivedStateVersion,projections.pendingSequenceCache=sequence;return sequence}popPendingSequence(){let pending=this.ensureValidPendingSequence();if(!pending)return!1;let firstCapture=pending.captures[0];if(!firstCapture||firstCapture.node.depth<=1)return this.setPendingSequence(null),!0;let nextCaptures=[];for(let capture2 of pending.captures){let parent=capture2.node.parent;if(!parent||!parent.stroke)continue;nextCaptures.push({layer:capture2.layer,node:parent})}if(nextCaptures.length===0)return this.setPendingSequence(null),!0;return this.setPendingSequence({captures:nextCaptures}),!0}getActiveKeys(options){let projections=this.state.projection,derivedStateVersion=this.state.notify.derivedStateVersion,includeBindings=options?.includeBindings===!0,includeMetadata=options?.includeMetadata===!0;if(includeBindings){if(includeMetadata){if(projections.activeKeysBindingsAndMetadataCacheVersion===derivedStateVersion)return projections.activeKeysBindingsAndMetadataCache}else if(projections.activeKeysBindingsCacheVersion===derivedStateVersion)return projections.activeKeysBindingsCache}else if(includeMetadata){if(projections.activeKeysMetadataCacheVersion===derivedStateVersion)return projections.activeKeysMetadataCache}else if(projections.activeKeysPlainCacheVersion===derivedStateVersion)return projections.activeKeysPlainCache;let focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused),pending=this.ensureValidPendingSequence(),activeLayers=pending?[]:this.getActiveLayers(focused),canUseCache=pending?pending.captures.every((capture2)=>this.layerCanCacheActiveKeys(capture2.layer)):this.activeLayersCanCacheActiveKeys(activeLayers),activeKeys=pending?this.collectActiveKeysFromPending(pending.captures,includeBindings,includeMetadata,focused,activeView):this.collectActiveKeysAtRoot(activeLayers,includeBindings,includeMetadata,focused,activeView);if(!canUseCache)return activeKeys;if(includeBindings)if(includeMetadata)projections.activeKeysBindingsAndMetadataCacheVersion=derivedStateVersion,projections.activeKeysBindingsAndMetadataCache=activeKeys;else projections.activeKeysBindingsCacheVersion=derivedStateVersion,projections.activeKeysBindingsCache=activeKeys;else if(includeMetadata)projections.activeKeysMetadataCacheVersion=derivedStateVersion,projections.activeKeysMetadataCache=activeKeys;else projections.activeKeysPlainCacheVersion=derivedStateVersion,projections.activeKeysPlainCache=activeKeys;return activeKeys}getActiveKeysForCaptures(captures,options){let includeBindings=options?.includeBindings===!0,includeMetadata=options?.includeMetadata===!0,focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused);return this.collectActiveKeysFromPending(captures,includeBindings,includeMetadata,focused,activeView)}nodeHasReachableBindings(node,focused){return this.hasMatchingBindings(node.reachableBindings,focused,this.catalog.getActiveCommandView(focused))}getActiveLayers(focused){return getActiveLayersForFocused2(this.state.layers,this.host,focused)}refreshActiveLayers(focused=this.getFocusedTargetIfAvailable()){getActiveLayersForFocused2(this.state.layers,this.host,focused)}invalidateActiveLayers(){invalidateCachedActiveLayers2(this.state.layers)}isLayerActiveForFocused(layer,focused){return isLayerActiveForFocused2(this.host,layer,focused)}layerCanCacheActiveKeys(layer){return!layer.hasUnkeyedMatchers&&!layer.hasUnkeyedCommands&&!layer.hasUnkeyedBindings}activeLayersCanCacheActiveKeys(activeLayers){for(let layer of activeLayers)if(!this.layerCanCacheActiveKeys(layer))return!1;return!0}collectNodesFromNode(node){let nodes=[],current=node;while(current&¤t.stroke)nodes.push(current),current=current.parent;return nodes.reverse(),nodes}collectSequencePartsFromPending(pending){let focused=this.getFocusedTarget(),activeView=this.catalog.getActiveCommandView(focused),paths=pending.captures.map((capture2)=>this.collectNodesFromNode(capture2.node)),firstPath=paths[0];if(!firstPath||firstPath.length===0)return[];let parts=[];for(let index=0;index<firstPath.length;index+=1){let firstNode=firstPath[index];if(!firstNode?.stroke||firstNode.match===null)continue;let display,tokenName,hasDisplayConflict=!1,hasTokenConflict=!1;for(let path6 of paths){let node=path6[index];if(!node)continue;let presentation=this.getNodePresentation(node,focused,activeView);if(display===void 0){display=presentation.display,tokenName=presentation.tokenName;continue}if(!hasDisplayConflict&&display!==presentation.display)hasDisplayConflict=!0;if(!hasTokenConflict&&tokenName!==presentation.tokenName)hasTokenConflict=!0}if(display===void 0||hasDisplayConflict)display=stringifyKeyStroke2(firstNode.stroke);if(hasTokenConflict)tokenName=void 0;parts.push(createKeySequencePart2(firstNode.stroke,{display,match:firstNode.match,tokenName}))}return parts}collectMatchingBindings(bindings,focused,activeView){let matches=[];for(let binding of bindings)if(this.conditions.matchesConditions(binding)&&this.catalog.isBindingVisible(binding,focused,activeView))matches.push(binding);return matches}hasMatchingBindings(bindings,focused,activeView){for(let binding of bindings)if(this.conditions.matchesConditions(binding)&&this.catalog.isBindingVisible(binding,focused,activeView))return!0;return!1}getNodePresentation(node,focused,activeView,reachableBindings=this.collectMatchingBindings(node.reachableBindings,focused,activeView)){if(!node.stroke)return{display:""};let partIndex=node.depth-1,display,tokenName,hasDisplayConflict=!1,hasTokenConflict=!1;for(let binding of reachableBindings){let part=binding.sequence[partIndex];if(!part)continue;if(display===void 0){display=part.display,tokenName=part.tokenName;continue}if(!hasDisplayConflict&&display!==part.display)hasDisplayConflict=!0;if(!hasTokenConflict&&tokenName!==part.tokenName)hasTokenConflict=!0}if(display===void 0||hasDisplayConflict)display=stringifyKeyStroke2(node.stroke);if(hasTokenConflict)tokenName=void 0;return{display,tokenName}}toActiveBinding(binding,focused,activeView){return{sequence:binding.sequence,command:binding.command,commandAttrs:this.catalog.getBindingCommandAttrs(binding,focused,activeView),attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough}}collectActiveBindings(bindings,focused,activeView){return bindings.map((binding)=>this.toActiveBinding(binding,focused,activeView))}collectActiveKeysAtRoot(activeLayers,includeBindings,includeMetadata,focused,activeView){let activeKeys=new Map,stopped=new Set,hasLayerConditions=this.state.layers.layersWithConditions>0;for(let layer of activeLayers){if(layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;for(let[bindingKey,child]of layer.root.children){if(stopped.has(bindingKey))continue;let selection=this.selectActiveKey(child,includeBindings,focused,activeView);if(!selection)continue;let existing=activeKeys.get(bindingKey);if(!existing)activeKeys.set(bindingKey,this.createActiveKeyState(child.stroke,selection,includeBindings));else this.updateActiveKeyState(existing,selection,includeBindings);if(selection.stop)stopped.add(bindingKey)}}let materialized=[];for(let state of activeKeys.values()){let activeKey=this.materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView);if(activeKey)materialized.push(activeKey)}return materialized}collectActiveKeysFromPending(captures,includeBindings,includeMetadata,focused,activeView){let activeKeys=new Map,stopped=new Set;for(let capture2 of captures)for(let[bindingKey,child]of capture2.node.children){if(stopped.has(bindingKey))continue;let selection=this.selectActiveKey(child,includeBindings,focused,activeView);if(!selection)continue;let existing=activeKeys.get(bindingKey);if(!existing)activeKeys.set(bindingKey,this.createActiveKeyState(child.stroke,selection,includeBindings));else this.updateActiveKeyState(existing,selection,includeBindings);if(selection.stop)stopped.add(bindingKey)}let materialized=[];for(let state of activeKeys.values()){let activeKey=this.materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView);if(activeKey)materialized.push(activeKey)}return materialized}selectActiveKey(node,includeBindings,focused,activeView){return node.children.size>0?this.selectPrefixActiveKey(node,includeBindings,focused,activeView):this.selectExactActiveKey(node,includeBindings,focused,activeView)}selectPrefixActiveKey(node,includeBindings,focused,activeView){if(!node.stroke)return;let reachableBindings=this.collectMatchingBindings(node.reachableBindings,focused,activeView);if(reachableBindings.length===0)return;let prefixBindings=this.selectActiveBindings(node.bindings,focused,activeView);return{...this.getNodePresentation(node,focused,activeView,reachableBindings),continues:!0,firstBinding:prefixBindings?.bindings[0],commandBinding:prefixBindings?.commandBinding,bindings:includeBindings&&prefixBindings&&prefixBindings.bindings.length>0?[...prefixBindings.bindings]:void 0,stop:!0}}selectExactActiveKey(node,includeBindings,focused,activeView){if(!node.stroke)return;let selected=this.selectActiveBindings(node.bindings,focused,activeView);if(!selected)return;let display,tokenName;if(selected.bindings.length===1){let part=selected.bindings[0]?.sequence[node.depth-1];display=part?.display??stringifyKeyStroke2(node.stroke),tokenName=part?.tokenName}else{let presentation=this.getNodePresentation(node,focused,activeView,selected.bindings);display=presentation.display,tokenName=presentation.tokenName}return{display,tokenName,continues:!1,firstBinding:selected.bindings[0],commandBinding:selected.commandBinding,bindings:includeBindings?[...selected.bindings]:void 0,stop:selected.stop}}selectActiveBindings(bindings,focused,activeView){let selected=[],commandBinding;for(let binding of bindings){if(!this.conditions.matchesConditions(binding)||!this.catalog.isBindingVisible(binding,focused,activeView))continue;if(selected.push(binding),binding.command===void 0)continue;if(commandBinding??=binding,!binding.fallthrough)return{bindings:selected,commandBinding,stop:!0}}if(selected.length===0)return;return{bindings:selected,commandBinding,stop:!1}}createActiveKeyState(stroke,selection,includeBindings){return{stroke,display:selection.display,tokenName:selection.tokenName,continues:selection.continues,firstBinding:selection.firstBinding,commandBinding:selection.commandBinding,bindings:includeBindings&&selection.bindings?[...selection.bindings]:void 0}}updateActiveKeyState(state,selection,includeBindings){if(!state.firstBinding&&selection.firstBinding)state.firstBinding=selection.firstBinding;if(!state.commandBinding&&selection.commandBinding)state.commandBinding=selection.commandBinding;if(selection.continues)state.continues=!0;if(!includeBindings||!selection.bindings||selection.bindings.length===0)return;if(!state.bindings){state.bindings=[...selection.bindings];return}state.bindings.push(...selection.bindings)}materializeActiveKey(state,includeBindings,includeMetadata,focused,activeView){if(!state.commandBinding&&!state.continues)return;let activeKey={stroke:cloneKeyStroke2(state.stroke),display:state.display,continues:state.continues};if(state.tokenName)activeKey.tokenName=state.tokenName;if(state.commandBinding)activeKey.command=state.commandBinding.command;if(includeBindings&&state.bindings&&state.bindings.length>0)activeKey.bindings=state.bindings.length===1?[this.toActiveBinding(state.bindings[0],focused,activeView)]:this.collectActiveBindings(state.bindings,focused,activeView);if(includeMetadata){if(state.firstBinding?.attrs)activeKey.bindingAttrs=state.firstBinding.attrs;let commandAttrs=state.commandBinding?this.catalog.getBindingCommandAttrs(state.commandBinding,focused,activeView):void 0;if(commandAttrs)activeKey.commandAttrs=commandAttrs}return activeKey}invalidateCaches(){this.state.projection.pendingSequenceCacheVersion=-1,this.state.projection.activeKeysPlainCacheVersion=-1,this.state.projection.activeKeysBindingsCacheVersion=-1,this.state.projection.activeKeysMetadataCacheVersion=-1,this.state.projection.activeKeysBindingsAndMetadataCacheVersion=-1}notifyPendingSequenceChange(){if(!this.hooks.has("pendingSequence"))return;this.hooks.emit("pendingSequence",this.state.projection.pendingSequence?this.collectSequencePartsFromPending(this.state.projection.pendingSequence):[])}}function mergeRequirement2(target,name,value,source){if(Object.prototype.hasOwnProperty.call(target,name)&&!Object.is(target[name],value))throw Error(`Conflicting keymap requirement for "${name}" from ${source}`);target[name]=value}function mergeAttribute2(target,name,value,source){if(Object.prototype.hasOwnProperty.call(target,name)&&!Object.is(target[name],value))throw Error(`Conflicting keymap attribute for "${name}" from ${source}`);target[name]=value}function isPlainObject3(value){let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function getErrorMessage2(error2,fallback){if(error2 instanceof Error&&error2.message)return error2.message;return fallback}function isPromiseLike2(value){if(!value)return!1;if(typeof value!=="object"&&typeof value!=="function")return!1;return typeof value.then==="function"}function snapshotDataValue2(value,options){let deep=options?.deep===!0,freeze=options?.freeze===!0,preserveNonPlainObjects=options?.preserveNonPlainObjects===!0;if(Array.isArray(value)){let cloned=deep?value.map((entry2)=>snapshotDataValue2(entry2,options)):[...value];return freeze?Object.freeze(cloned):cloned}if(value&&typeof value==="object"){if(preserveNonPlainObjects&&!isPlainObject3(value))return value;let cloned={};for(let[key,entry2]of Object.entries(value))cloned[key]=deep?snapshotDataValue2(entry2,options):entry2;return freeze?Object.freeze(cloned):cloned}return value}function createCommandChainCacheState2(){return{resolvedWithoutRecordChains:new Map,resolvedWithRecordChains:new Map,fallbackWithoutRecord:new Map,fallbackWithRecord:new Map,fallbackWithoutRecordErrors:new Set,fallbackWithRecordErrors:new Set}}function normalizeBindingCommand2(command){if(command===void 0||typeof command==="function")return command;let trimmed=command.trim();if(!trimmed)throw Error("Invalid keymap command: command cannot be empty");return trimmed}function normalizeCommandName2(name){let trimmed=name.trim();if(!trimmed)throw Error("Invalid keymap command name: name cannot be empty");if(/\s/.test(trimmed))throw Error(`Invalid keymap command name "${name}": command names cannot contain whitespace`);return trimmed}class CommandCatalogService2{state;host;notify;conditions;options;constructor(state,host,notify,conditions,options){this.state=state,this.host=host,this.notify=notify,this.conditions=conditions,this.options=options}normalizeCommands(commands){return normalizeRegisteredCommands2({commands,commandFields:this.state.environment.commandFields,conditions:this.conditions,onError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}prependCommandResolver(resolver){return this.mutateCommandResolvers(()=>this.state.commands.commandResolvers.prepend(resolver),resolver)}appendCommandResolver(resolver){return this.mutateCommandResolvers(()=>this.state.commands.commandResolvers.append(resolver),resolver)}clearCommandResolvers(){if(!this.state.commands.commandResolvers.has())return;this.notify.runWithStateChangeBatch(()=>{this.state.commands.commandResolvers.clear(),this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange()})}getCommands(query2){return this.getFilteredCommandEntries(query2).map((entry2)=>getRegisteredCommandRecord2(entry2.command))}getCommandEntries(query2){let context=this.getCommandQueryContext(query2),filteredEntries=this.getFilteredCommandEntries(query2,context);if(filteredEntries.length===0)return[];let grouped=filteredEntries.map((entry2)=>({entry:entry2,command:getRegisteredCommandRecord2(entry2.command),bindings:[]})),indexesByName=new Map;for(let[index,item]of grouped.entries()){let existing=indexesByName.get(item.command.name);if(existing)existing.push(index);else indexesByName.set(item.command.name,[index])}if(indexesByName.size>0)this.collectCommandEntryBindings(grouped,indexesByName,context);return grouped.map((item)=>({command:item.command,bindings:item.bindings}))}getResolvedCommandChain(command,focused,includeRecord){let view=this.getActiveCommandView(focused),entries=this.getResolvedCommandChainFromView(view,command,focused,includeRecord,"active",view.chainsByName.get(command)),hadError=(includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors).has(command);return{entries,hadError}}getRegisteredResolvedEntries(command,includeRecord){let view=this.getRegisteredCommandView(),cache=includeRecord?view.resolvedWithRecordChains:view.resolvedWithoutRecordChains,cached=cache.get(command);if(cached)return cached.length>0?cached:void 0;let chain=view.chainsByName.get(command);if(!chain||chain.length===0){cache.set(command,[]);return}let resolved=[];for(let entry2 of chain)resolved.push({target:entry2.layer.target,resolved:resolveRegisteredCommand2(entry2.command,{includeRecord})});return cache.set(command,resolved),resolved}getRegisteredResolverFallback(command,includeRecord){let view=this.getRegisteredCommandView(),fallback=this.getFallbackResolvedCommand(view,command,null,includeRecord,"registered"),hadError=(includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors).has(command);return{resolved:fallback?.resolved,hadError}}getCommandAttrs(command,focused){return this.getTopResolvedCommand(command,focused,!1)?.resolved.attrs}getTopCommandRecord(command,focused){return this.getTopResolvedCommand(command,focused,!0)?.resolved.record}getTopRegisteredCommandRecord(command){let top=this.getTopRegisteredCommand(command);return top?getRegisteredCommandRecord2(top.command):void 0}getDispatchUnavailableCommandState(command,focused,includeRecord){let chain=this.getRegisteredCommandView().chainsByName.get(command);if(!chain||chain.length===0)return;let inactiveEntry,disabledEntry;for(let entry2 of chain){if(!isLayerActiveForFocused2(this.host,entry2.layer,focused)){inactiveEntry??=entry2;continue}if(!this.conditions.layerMatchesRuntimeState(entry2.layer)||!this.conditions.matchesConditions(entry2.command))disabledEntry??=entry2}let unavailableEntry=disabledEntry??inactiveEntry;if(!unavailableEntry)return;return{reason:disabledEntry?"disabled":"inactive",command:includeRecord?getRegisteredCommandRecord2(unavailableEntry.command):void 0}}getActiveCommandView(focused){let currentFocused=getFocusedTargetIfAvailable2(this.host),derivedStateVersion=this.state.notify.derivedStateVersion;if(focused===currentFocused&&this.state.commands.activeCommandViewVersion===derivedStateVersion&&this.state.commands.activeCommandView?.cacheable)return this.state.commands.activeCommandView;let entries=[],reachable=[],reachableByName=new Map,chainsByName=new Map,cacheable=!0;if(this.state.layers.layersWithCommands>0)for(let layer of getActiveLayersForFocused2(this.state.layers,this.host,focused)){if(layer.commands.length===0||!this.conditions.layerMatchesRuntimeState(layer))continue;if(layer.hasUnkeyedMatchers)cacheable=!1;for(let command of layer.commands){if(command.hasUnkeyedMatchers)cacheable=!1;if(!this.conditions.matchesConditions(command))continue;let entry2={layer,command};entries.push(entry2);let existing=chainsByName.get(command.name);if(existing)existing.push(entry2);else chainsByName.set(command.name,[entry2]);if(!reachableByName.has(command.name))reachableByName.set(command.name,entry2),reachable.push(entry2)}}let view={cacheable,entries,reachable,reachableByName,chainsByName,...createCommandChainCacheState2()};if(focused===currentFocused&&view.cacheable)this.state.commands.activeCommandViewVersion=derivedStateVersion,this.state.commands.activeCommandView=view;return view}getRegisteredCommandView(){let cacheVersion=this.state.commands.commandMetadataVersion;if(this.state.commands.registeredCommandViewVersion===cacheVersion&&this.state.commands.registeredCommandView)return this.state.commands.registeredCommandView;let entries=[],chainsByName=new Map;for(let layer of this.state.layers.sortedLayers){if(layer.commands.length===0)continue;for(let command of layer.commands){let entry2={layer,command};entries.push(entry2);let existing=chainsByName.get(command.name);if(existing)existing.push(entry2);else chainsByName.set(command.name,[entry2])}}let view={entries,chainsByName,...createCommandChainCacheState2()};return this.state.commands.registeredCommandViewVersion=cacheVersion,this.state.commands.registeredCommandView=view,view}isBindingVisible(binding,focused,activeView){if(binding.command===void 0||binding.run)return!0;if(typeof binding.command!=="string")return!1;if(activeView.reachableByName.has(binding.command))return!0;return this.getFallbackResolvedCommand(activeView,binding.command,focused,!1,"active")!==void 0}getBindingCommandAttrs(binding,focused,activeView){if(typeof binding.command!=="string")return;let active=activeView.reachableByName.get(binding.command);if(active)return active.command.attrs;return this.getFallbackResolvedCommand(activeView,binding.command,focused,!1,"active")?.resolved.attrs}getCommandResolutionStatus(command,layerCommands){if(layerCommands?.has(command)||this.state.commands.registeredNames.has(command))return"resolved";let lookup=this.resolveCommandWithResolvers(command,getFocusedTargetIfAvailable2(this.host));if(lookup.resolved||lookup.hadError)return lookup.resolved?"resolved":"error";return"unresolved"}mutateCommandResolvers(register2,resolver){return this.notify.runWithStateChangeBatch(()=>{let off=register2();return this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange(),()=>{this.notify.runWithStateChangeBatch(()=>{if(off(),this.state.commands.commandResolvers.values().includes(resolver))return;this.state.commands.commandMetadataVersion+=1,this.options.onCommandResolversChanged(),this.notify.queueStateChange()})}})}getTopResolvedCommand(command,focused,includeRecord){let activeView=this.getActiveCommandView(focused),active=activeView.reachableByName.get(command);if(active)return{target:active.layer.target,resolved:resolveRegisteredCommand2(active.command,{includeRecord})};return this.getFallbackResolvedCommand(activeView,command,focused,includeRecord,"active")}getTopRegisteredCommand(command){return this.getRegisteredCommandView().chainsByName.get(command)?.[0]}getFallbackResolvedCommand(view,command,focused,includeRecord,mode){let cache=includeRecord?view.fallbackWithRecord:view.fallbackWithoutRecord,errorCache=includeRecord?view.fallbackWithRecordErrors:view.fallbackWithoutRecordErrors;if(cache.has(command)){let cached=cache.get(command);return cached?{resolved:cached}:void 0}let lookup=this.resolveCommandWithResolvers(command,focused,{includeRecord,mode});if(cache.set(command,lookup.resolved??null),lookup.hadError)errorCache.add(command);if(!lookup.resolved)return;return{resolved:lookup.resolved}}getResolvedCommandChainFromView(view,command,focused,includeRecord,mode,activeChain){let cache=includeRecord?view.resolvedWithRecordChains:view.resolvedWithoutRecordChains,cached=cache.get(command);if(cached)return cached.length>0?cached:void 0;let resolved=[],chain=activeChain;if(chain)for(let entry2 of chain)resolved.push({target:entry2.layer.target,resolved:resolveRegisteredCommand2(entry2.command,{includeRecord})});let fallback=this.getFallbackResolvedCommand(view,command,focused,includeRecord,mode);if(fallback)resolved.push(fallback);return cache.set(command,resolved),resolved.length>0?resolved:void 0}getRegisteredLayerCommandEntries(){let cacheVersion=this.state.commands.commandMetadataVersion;if(this.state.commands.registeredCommandEntriesCacheVersion===cacheVersion)return this.state.commands.registeredCommandEntriesCache;let layers=[...this.state.layers.layers];layers.sort((left,right)=>left.order-right.order);let entries=[];for(let layer of layers)for(let command of layer.commands)entries.push({layer,command});return this.state.commands.registeredCommandEntriesCacheVersion=cacheVersion,this.state.commands.registeredCommandEntriesCache=entries,entries}getCommandQueryContext(query2){let visibility=query2?.visibility??"reachable",focused=query2&&Object.prototype.hasOwnProperty.call(query2,"focused")?query2.focused??null:getFocusedTargetIfAvailable2(this.host);if(visibility==="registered")return{visibility,focused};return{visibility,focused,activeView:this.getActiveCommandView(focused)}}getFilteredCommandEntries(query2,context=this.getCommandQueryContext(query2)){let entries;if(context.visibility==="registered")entries=this.getRegisteredLayerCommandEntries();else if(context.visibility==="active")entries=context.activeView?.entries??[];else entries=context.activeView?.reachable??[];return queryLayerCommandEntries2({entries,query:query2,getCommandRecord:(command)=>getRegisteredCommandRecord2(command),onFilterError:(error2)=>{this.notify.emitError("command-query-filter-error",error2,"[Keymap] Error in command query filter:")}})}collectCommandEntryBindings(grouped,indexesByName,context){if(context.visibility==="registered"){let layers=[...this.state.layers.layers];layers.sort((left,right)=>left.order-right.order);for(let layer of layers)for(let binding of layer.compiledBindings)this.collectBindingForCommandEntries(grouped,indexesByName,binding);return}let activeView=context.activeView;if(!activeView)return;for(let layer of getActiveLayersForFocused2(this.state.layers,this.host,context.focused)){if(layer.compiledBindings.length===0||!this.conditions.layerMatchesRuntimeState(layer))continue;for(let binding of layer.compiledBindings){if(!this.conditions.matchesConditions(binding)||!this.isBindingVisible(binding,context.focused,activeView))continue;this.collectBindingForCommandEntries(grouped,indexesByName,binding)}}}collectBindingForCommandEntries(grouped,indexesByName,binding){if(typeof binding.command!=="string")return;let indexes=indexesByName.get(binding.command);if(!indexes||indexes.length===0)return;for(let index of indexes){let item=grouped[index];if(!item)continue;item.bindings.push({sequence:binding.sequence,command:binding.command,commandAttrs:item.command.attrs,attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough})}}resolveCommandWithResolvers(command,focused,options){let includeRecord=options?.includeRecord===!0,context=this.createCommandResolverContext(includeRecord,focused,options?.mode??"active");return resolveCommandWithResolvers2(command,this.state.commands.commandResolvers.values(),context,(error2)=>{this.notify.emitError("command-resolver-error",error2,`[Keymap] Error in command resolver for "${command}":`)})}createCommandResolverContext(includeRecord,focused,mode){return{getCommandAttrs:(name)=>{if(mode==="registered")return this.getTopRegisteredCommand(name)?.command.attrs;return this.getCommandAttrs(name,focused)},getCommandRecord:(name)=>{if(!includeRecord)return;if(mode==="registered")return this.getTopRegisteredCommandRecord(name);return this.getTopCommandRecord(name,focused)}}}}function getRegisteredCommandRecord2(command){if(command.record)return command.record;let fields=EMPTY_COMMAND_FIELDS2;if(command.fields!==EMPTY_COMMAND_FIELDS2&&Object.keys(command.fields).length>0)fields=snapshotDataValue2(command.fields,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS2);let record=command.attrs?Object.freeze({name:command.name,fields,attrs:snapshotDataValue2(command.attrs,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS2)}):Object.freeze({name:command.name,fields});return command.record=record,record}function resolveRegisteredCommand2(command,options){if(options?.includeRecord===!0){let existing2=command.resolvedWithRecord;if(existing2)return existing2;let resolved2={run:createRegisteredCommandRunner2(command)};if(command.attrs)resolved2.attrs=command.attrs;return resolved2.record=getRegisteredCommandRecord2(command),command.resolvedWithRecord=resolved2,resolved2}let existing=command.resolved;if(existing)return existing;let resolved={run:createRegisteredCommandRunner2(command)};if(command.attrs)resolved.attrs=command.attrs;return command.resolved=resolved,resolved}function normalizeRegisteredCommands2(options){let normalizedCommands=[],seen=new Set;for(let command of options.commands){let normalizedCommand;try{let mergedAttrs={},mergedFields={},mergedRequires={},matchers=[],conditionKeys=new Set,hasUnkeyedMatchers=!1,normalizedName=normalizeCommandName2(command.name);if(seen.has(normalizedName)){options.onError("duplicate-command",{command:normalizedName},`Duplicate keymap command "${normalizedName}" in the same layer`);continue}for(let[fieldName,value]of Object.entries(command)){if(RESERVED_COMMAND_FIELDS2.has(fieldName)||value===void 0)continue;mergedFields[fieldName]=snapshotDataValue2(value,SNAPSHOT_COMMAND_METADATA_OPTIONS2);let compiler=options.commandFields.get(fieldName);if(!compiler)continue;compiler(value,createCommandFieldContext2(mergedAttrs,mergedRequires,conditionKeys,matchers,options.conditions,fieldName,{onUnkeyedMatcher(){hasUnkeyedMatchers=!0}}))}let attrs=Object.keys(mergedAttrs).length===0?void 0:Object.freeze(mergedAttrs),fields=Object.keys(mergedFields).length===0?EMPTY_COMMAND_FIELDS2:Object.freeze(mergedFields);if(normalizedCommand={name:normalizedName,fields,run:command.run,requires:Object.entries(mergedRequires),matchers,conditionKeys:[...conditionKeys],hasUnkeyedMatchers,matchCacheDirty:!0},attrs)normalizedCommand.attrs=attrs}catch(error2){options.onError("register-command-failed",error2,getErrorMessage2(error2,`Failed to register keymap command "${String(command.name)}"`));continue}seen.add(normalizedCommand.name),normalizedCommands.push(normalizedCommand)}return normalizedCommands}function createCommandFieldContext2(mergedAttrs,mergedRequires,conditionKeys,matchers,conditions,fieldName,options){return{require(name,requiredValue){mergeRequirement2(mergedRequires,name,requiredValue,`field ${fieldName}`),conditionKeys.add(name)},attr(name,attributeValue){mergeAttribute2(mergedAttrs,name,snapshotDataValue2(attributeValue,SNAPSHOT_COMMAND_METADATA_OPTIONS2),`field ${fieldName}`)},activeWhen(matcher){let runtimeMatcher=conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)options.onUnkeyedMatcher();matchers.push(runtimeMatcher)}}}function createRegisteredCommandRunner2(command){if(command.runner)return command.runner;let runner=(ctx)=>{return command.run({...ctx,command:getRegisteredCommandRecord2(command)})};return command.runner=runner,runner}function resolveCommandWithResolvers2(command,resolvers,context,onResolverError){if(resolvers.length===0)return{hadError:!1};let hadError=!1;for(let resolver of resolvers){let resolved;try{resolved=resolver(command,context)}catch(error2){hadError=!0,onResolverError(error2);continue}if(resolved)return{hadError,resolved}}return{hadError}}function queryLayerCommandEntries2(options){let namespace=options.query?.namespace,normalizedSearch=options.query?.search?.trim().toLowerCase()??"",searchKeys=DEFAULT_COMMAND_SEARCH_FIELDS2;if(options.query?.searchIn&&options.query.searchIn.length>0)searchKeys=options.query.searchIn;let filter=options.query?.filter,filterEntries2,filterPredicate;if(typeof filter==="function")filterPredicate=filter;else if(filter)filterEntries2=Object.entries(filter);let results=[];for(let entry2 of options.entries){let command=entry2.command;if(!commandMatchesNamespace2(command,namespace))continue;if(!commandMatchesSearch2(command,normalizedSearch,searchKeys))continue;if(!commandMatchesFilters2(command,filterEntries2,options))continue;let record=options.getCommandRecord(command);if(filterPredicate){let matches=!1;try{matches=filterPredicate(record)}catch(error2){options.onFilterError(error2);continue}if(!matches)continue}results.push(entry2)}return results}function commandMatchesSearch2(command,search,searchKeys){if(!search)return!0;for(let key of searchKeys)if(commandKeyMatchesSearch2(command,key,search))return!0;return!1}function commandMatchesNamespace2(command,namespace){if(namespace===void 0)return!0;if(!Object.prototype.hasOwnProperty.call(command.fields,"namespace"))return!1;return commandValueMatchesFilter2(command.fields.namespace,namespace)}function commandMatchesFilters2(command,filters,options){if(!filters)return!0;for(let[key,matcher]of filters)if(!commandKeyMatchesQuery2(command,key,matcher,options))return!1;return!0}function commandKeyMatchesSearch2(command,key,search){if(key==="name"&&commandValueMatchesSearch2(command.name,search))return!0;if(Object.prototype.hasOwnProperty.call(command.fields,key)&&commandValueMatchesSearch2(command.fields[key],search))return!0;if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key))return commandValueMatchesSearch2(command.attrs[key],search);return!1}function commandKeyMatchesQuery2(command,key,matcher,options){if(typeof matcher==="function"){let record,getRecord=()=>{if(!record)record=options.getCommandRecord(command);return record},foundValue=!1;if(key==="name"){foundValue=!0;try{if(matcher(command.name,getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(Object.prototype.hasOwnProperty.call(command.fields,key)){foundValue=!0;try{if(matcher(command.fields[key],getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key)){foundValue=!0;try{if(matcher(command.attrs[key],getRecord()))return!0}catch(error2){return options.onFilterError(error2),!1}}if(!foundValue)try{return matcher(void 0,getRecord())}catch(error2){return options.onFilterError(error2),!1}return!1}return commandKeyMatchesExact2(command,key,matcher)}function commandKeyMatchesExact2(command,key,matcher){if(key==="name"&&commandValueMatchesFilter2(command.name,matcher))return!0;if(Object.prototype.hasOwnProperty.call(command.fields,key)&&commandValueMatchesFilter2(command.fields[key],matcher))return!0;if(command.attrs&&Object.prototype.hasOwnProperty.call(command.attrs,key))return commandValueMatchesFilter2(command.attrs[key],matcher);return!1}function commandValueMatchesFilter2(value,matcher){if(Array.isArray(matcher)){for(let expected of matcher)if(commandValueMatchesExact2(value,expected))return!0;return!1}return commandValueMatchesExact2(value,matcher)}function commandValueMatchesExact2(value,expected){if(Array.isArray(value)){for(let entry2 of value)if(commandValueMatchesExact2(entry2,expected))return!0;return!1}return Object.is(value,expected)}function commandValueMatchesSearch2(value,search){if(Array.isArray(value)){for(let entry2 of value)if(commandValueMatchesSearch2(entry2,search))return!0;return!1}if(typeof value==="string")return value.toLowerCase().includes(search);if(typeof value==="number"||typeof value==="boolean"||typeof value==="bigint")return String(value).toLowerCase().includes(search);return!1}class CommandExecutorService2{notify;runtime;activation;catalog;options;constructor(notify,runtime,activation,catalog,options){this.notify=notify,this.runtime=runtime,this.activation=activation,this.catalog=catalog,this.options=options}runCommand(cmd,options){let normalized;try{normalized=normalizeBindingCommand2(cmd)}catch{return{ok:!1,reason:"invalid-args"}}if(typeof normalized!=="string")return{ok:!1,reason:"not-found"};let includeRecord=options?.includeCommand===!0,focused=options?.focused??this.activation.getFocusedTargetIfAvailable(),event=options?.event??this.options.createCommandEvent(),data=this.runtime.getReadonlyData(),chain=this.catalog.getRegisteredResolvedEntries(normalized,includeRecord),rejectedResult;if(chain?.length===1){let[entry2]=chain;if(entry2){let execution=this.executeResolvedCommand(normalized,entry2.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data},execution=this.executeResolvedCommand(normalized,entry2.resolved,context);if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}let fallback=this.catalog.getRegisteredResolverFallback(normalized,includeRecord);if(fallback.resolved){let execution=this.executeResolvedCommand(normalized,fallback.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}if(fallback.hadError)return{ok:!1,reason:"error"};return rejectedResult??{ok:!1,reason:"not-found"}}dispatchCommand(cmd,options){let normalized;try{normalized=normalizeBindingCommand2(cmd)}catch{return{ok:!1,reason:"invalid-args"}}if(typeof normalized!=="string")return{ok:!1,reason:"not-found"};let includeRecord=options?.includeCommand===!0,focused=options?.focused??this.activation.getFocusedTargetIfAvailable(),event=options?.event??this.options.createCommandEvent(),data=this.runtime.getReadonlyData(),chainLookup=this.catalog.getResolvedCommandChain(normalized,focused,includeRecord),chain=chainLookup.entries,rejectedResult;if(chain?.length===1){let[entry2]=chain;if(entry2){let execution=this.executeResolvedCommand(normalized,entry2.resolved,{keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data});if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:options?.target??entry2.target??null,data},execution=this.executeResolvedCommand(normalized,entry2.resolved,context);if(execution.status==="handled"||execution.status==="error")return execution.result;rejectedResult=execution.result}if(chainLookup.hadError)return{ok:!1,reason:"error"};let unavailable=this.catalog.getDispatchUnavailableCommandState(normalized,focused,includeRecord);if(unavailable)return unavailable.command?{ok:!1,reason:unavailable.reason,command:unavailable.command}:{ok:!1,reason:unavailable.reason};return rejectedResult??{ok:!1,reason:"not-found"}}runBinding(bindingLayer,binding,event,focused){let data=this.runtime.getReadonlyData();if(binding.run){if(this.executeResolvedCommand(typeof binding.command==="string"?binding.command:"<function>",{run:binding.run},{keymap:this.options.keymap,event,focused,target:bindingLayer.target??null,data}).status==="rejected")return!1;return applyBindingEventEffects2(binding,event),!0}if(typeof binding.command!=="string")return!1;let chain=this.catalog.getResolvedCommandChain(binding.command,focused,!1).entries;if(chain?.length===1){let[entry2]=chain;if(entry2){if(this.executeResolvedCommand(binding.command,entry2.resolved,{keymap:this.options.keymap,event,focused,target:entry2.target??bindingLayer.target??null,data}).status==="rejected")return!1;return applyBindingEventEffects2(binding,event),!0}}else if(chain)for(let entry2 of chain){let context={keymap:this.options.keymap,event,focused,target:entry2.target??bindingLayer.target??null,data};if(this.executeResolvedCommand(binding.command,entry2.resolved,context).status==="rejected")continue;return applyBindingEventEffects2(binding,event),!0}return!1}executeResolvedCommand(commandName,resolved,context){let command=resolved.record,result2;try{result2=resolved.run(context)}catch(error2){return this.notify.emitError("command-execution-error",error2,`[Keymap] Error running command "${commandName}":`),{status:"error",result:{ok:!1,reason:"error",command}}}if(isPromiseLike2(result2))return result2.catch((error2)=>{this.notify.emitError("async-command-error",error2,`[Keymap] Async error in command "${commandName}":`)}),{status:"handled",result:{ok:!0,command}};if(result2===!1){if(resolved.rejectedResult)return{status:"rejected",result:resolved.rejectedResult};return{status:"rejected",result:{ok:!1,reason:"rejected",command}}}return{status:"handled",result:{ok:!0,command}}}}function applyBindingEventEffects2(binding,event){if(!binding.preventDefault)return;event.preventDefault(),event.stopPropagation()}function normalizeBindingInputs2(bindings){if(Array.isArray(bindings))return bindings;let normalized=[];for(let[key,cmd]of Object.entries(bindings)){if(typeof cmd!=="string"&&typeof cmd!=="function")throw Error(`Invalid keymap binding for "${key}": shorthand bindings must map to string or function commands`);normalized.push({key,cmd})}return normalized}function snapshotBindingInputs2(bindings){return normalizeBindingInputs2(bindings).map((binding)=>({...binding,key:typeof binding.key==="string"?binding.key:{...binding.key}}))}function snapshotParsedBindingInput2(binding){return{...binding,sequence:cloneKeySequence2(binding.sequence)}}function createSequenceNode2(parent,stroke,match){return{parent,depth:parent?parent.depth+1:0,stroke,match,children:new Map,bindings:[],reachableBindings:[]}}function snapshotAttributes2(attrs){if(Object.keys(attrs).length===0)return;return snapshotDataValue2(attrs,{freeze:!0})}class CompilerService2{state;notify;conditions;options;constructor(state,notify,conditions,options){this.state=state,this.notify=notify,this.conditions=conditions,this.options=options}parseTokenKey(key){return parseSingleKeyPartWithParsers2(key,this.state.environment.bindingParsers.values(),{tokens:this.state.environment.tokens,layer:EMPTY_COMPILE_FIELDS2,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)})}compileBindings(bindings,tokens2,sourceTarget,sourceLayerOrder,compileFields){let root=createSequenceNode2(null,null,null),compiledBindings=[],hasTokenBindings=!1,bindingExpanders=this.state.environment.bindingExpanders.values(),bindingParsers=this.state.environment.bindingParsers.values(),bindingFieldCompilers=this.state.environment.bindingFields,allowExactPrefixAmbiguity=this.state.dispatch.disambiguationResolvers.has(),warnUnknownField=this.options.warnUnknownField,warnUnknownToken=this.options.warnUnknownToken,conditions=this.conditions;for(let[bindingIndex,binding]of bindings.entries()){let expandedBindingKeys;try{expandedBindingKeys=expandBindingInputWithExpanders2(binding.key,bindingExpanders,{layer:compileFields})}catch(error2){this.notify.emitError("binding-expand-error",error2,getErrorMessage2(error2,"Failed to expand keymap binding"));continue}for(let expandedBindingKey of expandedBindingKeys){let parsed;try{parsed=typeof expandedBindingKey==="string"?parseBindingSequenceWithParsers2(expandedBindingKey,bindingParsers,{tokens:tokens2,layer:compileFields,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)}):{parts:[this.parseObjectKeyPart(expandedBindingKey)],usedTokens:[],unknownTokens:[],hasTokenBindings:!1}}catch(error2){this.notify.emitError("binding-parse-error",error2,getErrorMessage2(error2,"Failed to parse keymap binding"));continue}let sequence=parsed.parts;hasTokenBindings||=parsed.hasTokenBindings;for(let tokenName of parsed.unknownTokens)warnUnknownToken(tokenName,typeof expandedBindingKey==="string"?expandedBindingKey:String(expandedBindingKey.name));for(let compiledInput of this.applyBindingTransformers(binding,sequence,tokens2,bindingParsers,compileFields))try{let event=this.normalizeBindingEvent(compiledInput.event),compiledSequence=compiledInput.sequence,mergedRequires,mergedAttrs,matchers,conditionKeys,hasUnkeyedMatchers=!1;for(let fieldName in compiledInput){if(fieldName==="sequence")continue;if(RESERVED_BINDING_FIELDS2.has(fieldName))continue;let value=compiledInput[fieldName];if(value===void 0)continue;let compiler=bindingFieldCompilers.get(fieldName);if(!compiler){warnUnknownField("binding",fieldName);continue}compiler(value,{require(name,requiredValue){if(!mergedRequires)mergedRequires={};if(mergeRequirement2(mergedRequires,name,requiredValue,`field ${fieldName}`),!conditionKeys)conditionKeys=new Set;conditionKeys.add(name)},attr(name,attributeValue){if(!mergedAttrs)mergedAttrs={};mergeAttribute2(mergedAttrs,name,attributeValue,`field ${fieldName}`)},activeWhen:(matcher)=>{let runtimeMatcher=conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)hasUnkeyedMatchers=!0;if(!matchers)matchers=[];matchers.push(runtimeMatcher)}})}let attrs=mergedAttrs?snapshotAttributes2(mergedAttrs):void 0,command=normalizeBindingCommand2(compiledInput.cmd),compiledBinding={sequence:compiledSequence,command,event,sourceBinding:snapshotParsedBindingInput2(compiledInput),sourceTarget,sourceLayerOrder,sourceBindingIndex:bindingIndex,requires:mergedRequires?Object.entries(mergedRequires):EMPTY_REQUIRES2,matchers:matchers??EMPTY_MATCHERS2,conditionKeys:conditionKeys?[...conditionKeys]:EMPTY_CONDITION_KEYS2,hasUnkeyedMatchers,matchCacheDirty:!0,preventDefault:compiledInput.preventDefault!==!1,fallthrough:compiledInput.fallthrough??!1};if(attrs)compiledBinding.attrs=attrs;if(typeof command==="function")compiledBinding.run=command;if(compiledSequence.length===0)continue;if(event==="release"&&compiledSequence.length>1)throw Error("Keymap release bindings only support a single key stroke");if(event==="press")this.insertBinding(root,compiledBinding,allowExactPrefixAmbiguity);compiledBindings.push(compiledBinding)}catch(error2){this.notify.emitError("binding-compile-error",error2,getErrorMessage2(error2,"Failed to compile keymap binding"))}}}return{root,bindings:compiledBindings,hasTokenBindings}}parseObjectKeyPart(key,options){return createKeySequencePart2(key,options)}normalizeBindingEvent(event){if(event===void 0||event==="press")return"press";if(event==="release")return"release";throw Error(`Invalid keymap binding event "${String(event)}": expected "press" or "release"`)}applyBindingTransformers(binding,sequence,tokens2,bindingParsers,compileFields){let bindingTransformers=this.state.environment.bindingTransformers.values();if(bindingTransformers.length===0)return[{...binding,sequence:cloneKeySequence2(sequence)}];let parsedBinding={...binding,sequence:cloneKeySequence2(sequence)},extraBindings=[],keepOriginal=!0,layer=compileFields??EMPTY_COMPILE_FIELDS2;for(let transformer of bindingTransformers)try{transformer(parsedBinding,{layer,parseKey:(key)=>{return parseSingleKeyPartWithParsers2(key,bindingParsers,{tokens:tokens2,layer,parseObjectKey:(value,options)=>this.parseObjectKeyPart(value,options)})},add:(nextBinding)=>{extraBindings.push(snapshotParsedBindingInput2(nextBinding))},skipOriginal:()=>{keepOriginal=!1}})}catch(error2){this.notify.emitError("binding-transformer-error",error2,"[Keymap] Error in binding transformer:")}if(!keepOriginal)return extraBindings;if(extraBindings.length===0)return[parsedBinding];return[parsedBinding,...extraBindings]}insertBinding(root,binding,allowExactPrefixAmbiguity){let node=root,touchedNodes=[],createdNodes=[];try{for(let part of binding.sequence){if(!allowExactPrefixAmbiguity&&node.bindings.some((candidate)=>candidate.command!==void 0))throw Error("Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer");let bindingKey=part.match,child=node.children.get(bindingKey);if(!child)child=createSequenceNode2(node,cloneKeySequencePart2(part).stroke,part.match),node.children.set(bindingKey,child),createdNodes.push({parent:node,key:bindingKey});child.reachableBindings.push(binding),touchedNodes.push(child),node=child}if(!allowExactPrefixAmbiguity&&binding.command!==void 0&&node.children.size>0)throw Error("Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer");node.bindings=[...node.bindings,binding]}catch(error2){for(let index=touchedNodes.length-1;index>=0;index-=1){let touchedNode=touchedNodes[index];if(!touchedNode)continue;if(touchedNode.reachableBindings.at(-1)===binding){touchedNode.reachableBindings.pop();continue}touchedNode.reachableBindings=touchedNode.reachableBindings.filter((candidate)=>candidate!==binding)}for(let index=createdNodes.length-1;index>=0;index-=1){let createdNode=createdNodes[index];if(!createdNode)continue;let child=createdNode.parent.children.get(createdNode.key);if(!child)continue;if(child.children.size>0||child.reachableBindings.length>0||child.bindings.length>0)continue;createdNode.parent.children.delete(createdNode.key)}throw error2}}}function expandBindingInputWithExpanders2(key,expanders,options){if(typeof key!=="string"||expanders.length===0)return[key];let layer=options?.layer??EMPTY_COMPILE_FIELDS2,candidates=[key];for(let expander of expanders){let nextCandidates=[];for(let input of candidates){let result2=expander({input,layer});if(!result2){nextCandidates.push(input);continue}if(result2.length===0)throw Error(`Keymap binding expander must return at least one key sequence for "${input}"`);for(let expandedInput of result2){if(typeof expandedInput!=="string")throw Error(`Keymap binding expander must return string key sequences for "${input}"`);nextCandidates.push(expandedInput)}}candidates=nextCandidates}return candidates}function parseBindingSequenceWithParsers2(key,parsers2,options){if(key.length===0)throw Error("Invalid key sequence: sequence cannot be empty");if(parsers2.length===0)throw Error("No keymap binding parsers are registered");let tokens2=options.tokens??new Map,layer=options.layer??EMPTY_COMPILE_FIELDS2,parseObjectKey=options.parseObjectKey,parts=[],usedTokens=new Set,unknownTokens=new Set,index=0;while(index<key.length){let matched=!1;for(let parser of parsers2){let result2=parser({input:key,index,layer,tokens:tokens2,normalizeTokenName:normalizeBindingTokenName2,createMatch:createTextKeyMatch2,parseObjectKey});if(!result2)continue;if(result2.nextIndex<=index||result2.nextIndex>key.length)throw Error(`Keymap binding parser must advance the input for "${key}" at index ${index}`);parts.push(...result2.parts);for(let tokenName of result2.usedTokens??[])usedTokens.add(tokenName);for(let tokenName of result2.unknownTokens??[])unknownTokens.add(tokenName);index=result2.nextIndex,matched=!0;break}if(!matched)throw Error(`No keymap binding parser handled input at index ${index} in "${key}"`)}return{parts,usedTokens:[...usedTokens],unknownTokens:[...unknownTokens],hasTokenBindings:usedTokens.size>0||unknownTokens.size>0}}function parseSingleKeyPartWithParsers2(key,parsers2,options){if(typeof key!=="string")return options.parseObjectKey(key);let{parts}=parseBindingSequenceWithParsers2(key,parsers2,options),[part]=parts;if(!part||parts.length!==1)throw Error(`Invalid key "${String(key)}": expected a single key stroke`);return part}function isReactiveMatcher2(value){if(!value||typeof value!=="object")return!1;let candidate=value;return typeof candidate.get==="function"&&typeof candidate.subscribe==="function"}class ConditionService2{state;notify;constructor(state,notify){this.state=state,this.notify=notify}buildRuntimeMatcher(matcher,source){if(typeof matcher==="function")return{source,match:matcher,cacheable:!1};if(isReactiveMatcher2(matcher))return{source,match:()=>matcher.get(),cacheable:!0,subscribe:(onChange)=>matcher.subscribe(onChange)};throw Error(`Keymap ${source} expected a function or a reactive matcher`)}hasNoConditions(target){return target.requires.length===0&&target.matchers.length===0}indexRuntimeMatchable(target){if(target.conditionKeys.length>0)for(let key of target.conditionKeys){let dependents=this.state.conditions.runtimeKeyDependents.get(key);if(dependents){dependents.add(target);continue}this.state.conditions.runtimeKeyDependents.set(key,new Set([target]))}if(!target.hasUnkeyedMatchers)target.matchCacheDirty=!0}unindexRuntimeMatchable(target){if(target.conditionKeys.length===0)return;for(let key of target.conditionKeys){let dependents=this.state.conditions.runtimeKeyDependents.get(key);if(!dependents)continue;if(dependents.delete(target),dependents.size===0)this.state.conditions.runtimeKeyDependents.delete(key)}}invalidateRuntimeConditionKey(name){let dependents=this.state.conditions.runtimeKeyDependents.get(name);if(!dependents)return;for(let target of dependents)target.matchCacheDirty=!0}matchesConditions(target){if(this.hasNoConditions(target))return!0;if(this.hasFreshConditionCache(target))return target.matchCache===!0;let matched=this.matchRequirements(target.requires)&&this.matchesRuntimeMatchers(target);return this.updateConditionCache(target,matched),matched}layerMatchesRuntimeState(layer){if(this.state.layers.layersWithConditions===0||this.hasNoConditions(layer))return!0;return this.matchesConditions(layer)}matchRequirements(requires){if(requires.length===0)return!0;for(let[name,value]of requires)if(!Object.is(this.state.runtime.data[name],value))return!1;return!0}hasFreshConditionCache(target){if(target.hasUnkeyedMatchers)return!1;return target.matchCacheDirty!==!0&&target.matchCache!==void 0}updateConditionCache(target,matched){if(target.hasUnkeyedMatchers)return;target.matchCacheDirty=!1,target.matchCache=matched}matchesRuntimeMatcher(matcher){try{return matcher.match()}catch(error2){return this.notify.emitError("runtime-matcher-error",error2,`[Keymap] Error evaluating runtime matcher from ${matcher.source}:`),!1}}matchesRuntimeMatchers(target){if(target.matchers.length===0)return!0;if(target.matchers.length===1){let[matcher]=target.matchers;return matcher?this.matchesRuntimeMatcher(matcher):!0}for(let matcher of target.matchers)if(!this.matchesRuntimeMatcher(matcher))return!1;return!0}}function createSyncDecision2(action,handler){return{[KEY_DISAMBIGUATION_DECISION2]:!0,action,handler}}function createDeferredDecision2(action){return{[KEY_DEFERRED_DISAMBIGUATION_DECISION2]:!0,action}}function isSyncDecision2(value){return!!value&&typeof value==="object"&&value[KEY_DISAMBIGUATION_DECISION2]===!0}function isDeferredDecision2(value){return!!value&&typeof value==="object"&&value[KEY_DEFERRED_DISAMBIGUATION_DECISION2]===!0}class DispatchService2{state;notify;runtime;activation;conditions;executor;compiler;catalog;layers;eventMatchResolverContext;pendingDisambiguation=null;nextPendingDisambiguationId=0;constructor(state,notify,runtime,activation,conditions,executor,compiler,catalog,layers){this.state=state,this.notify=notify,this.runtime=runtime,this.activation=activation,this.conditions=conditions,this.executor=executor,this.compiler=compiler,this.catalog=catalog,this.layers=layers,this.eventMatchResolverContext={resolveKey:(key)=>{return this.compiler.parseTokenKey(key).match}}}intercept(name,fn,options){if(name==="key"){let keyOptions=options;return this.state.dispatch.keyHooks.register(fn,{priority:keyOptions?.priority??0,release:keyOptions?.release??!1})}let rawOptions=options;return this.state.dispatch.rawHooks.register(fn,{priority:rawOptions?.priority??0})}prependEventMatchResolver(resolver){return this.state.dispatch.eventMatchResolvers.prepend(resolver)}appendEventMatchResolver(resolver){return this.state.dispatch.eventMatchResolvers.append(resolver)}clearEventMatchResolvers(){this.state.dispatch.eventMatchResolvers.clear()}prependDisambiguationResolver(resolver){return this.mutateDisambiguationResolvers(()=>this.state.dispatch.disambiguationResolvers.prepend(resolver),resolver)}appendDisambiguationResolver(resolver){return this.mutateDisambiguationResolvers(()=>this.state.dispatch.disambiguationResolvers.append(resolver),resolver)}clearDisambiguationResolvers(){if(!this.state.dispatch.disambiguationResolvers.has())return;this.notify.runWithStateChangeBatch(()=>{this.state.dispatch.disambiguationResolvers.clear(),this.layers.recompileBindings()})}handlePendingSequenceChange(_previous,_next){if(!this.pendingDisambiguation)return;this.cancelPendingDisambiguation()}handleRawSequence(sequence){let hooks=this.state.dispatch.rawHooks.entries();if(hooks.length===0)return!1;let stopped=!1,context={sequence,stop(){stopped=!0}};for(let hook of hooks){try{hook.listener(context)}catch(error2){this.notify.emitError("raw-intercept-error",error2,"[Keymap] Error in raw intercept listener:")}if(stopped)return!0}return!1}handleKeyEvent(event,release){if(!release)this.cancelPendingDisambiguation();let hooks=this.state.dispatch.keyHooks.entries(),context={event,setData:(name,value)=>{this.runtime.setData(name,value)},getData:(name)=>{return this.runtime.getData(name)},consume:(options)=>{let shouldPreventDefault=options?.preventDefault??!0,shouldStopPropagation=options?.stopPropagation??!0;if(shouldPreventDefault)event.preventDefault();if(shouldStopPropagation)event.stopPropagation()}};for(let hook of hooks){if(hook.release!==release)continue;try{hook.listener(context)}catch(error2){this.notify.emitError("key-intercept-error",error2,"[Keymap] Error in key intercept listener:")}if(event.propagationStopped)return}if(release){this.dispatchReleaseLayers(event);return}this.dispatchLayers(event)}mutateDisambiguationResolvers(register2,resolver){return this.notify.runWithStateChangeBatch(()=>{let hadResolvers=this.state.dispatch.disambiguationResolvers.has(),off=register2();if(!hadResolvers&&this.state.dispatch.disambiguationResolvers.has())this.layers.recompileBindings();return()=>{this.notify.runWithStateChangeBatch(()=>{let hadBeforeRemoval=this.state.dispatch.disambiguationResolvers.has();if(off(),this.state.dispatch.disambiguationResolvers.values().includes(resolver))return;if(hadBeforeRemoval&&!this.state.dispatch.disambiguationResolvers.has())this.layers.recompileBindings()})}})}dispatchReleaseLayers(event){let focused=this.activation.getFocusedTarget(),activeLayers=this.activation.getActiveLayers(focused),hasLayerConditions=this.state.layers.layersWithConditions>0,matchKeys=this.resolveEventMatchKeys(event);layerLoop:for(let layer of activeLayers){if(layer.compiledBindings.length===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;for(let strokeKey of matchKeys){let result2=this.runReleaseBindings(layer,strokeKey,event,focused);if(!result2.handled)continue;if(result2.stop)return;continue layerLoop}}}dispatchLayers(event){let focused=this.activation.getFocusedTarget(),pending=this.activation.ensureValidPendingSequence(),matchKeys=this.resolveEventMatchKeys(event);if(pending){this.dispatchPendingSequence(pending,matchKeys,event,focused);return}let activeLayers=this.activation.getActiveLayers(focused);this.dispatchFromRoot(activeLayers,matchKeys,event,focused)}dispatchPendingSequence(pending,matchKeys,event,focused){let advancedCaptures=[];for(let capture2 of pending.captures){let nextNode=this.getReachableChild(capture2.node,matchKeys,focused);if(!nextNode)continue;advancedCaptures.push({layer:capture2.layer,node:nextNode})}if(advancedCaptures.length===0){this.activation.setPendingSequence(null);return}this.dispatchPendingCapturesFromIndex(advancedCaptures,0,!1,event,focused)}dispatchPendingCapturesFromIndex(advancedCaptures,startIndex,handledExact,event,focused){let hasHandledExact=handledExact;for(let index=startIndex;index<advancedCaptures.length;index+=1){let capture2=advancedCaptures[index];if(!capture2)continue;if(capture2.node.children.size>0){if(hasHandledExact)continue;let continuationCaptures=this.collectPendingCapturesFromAdvanced(advancedCaptures,index);if(this.tryResolvePendingAmbiguity(advancedCaptures,index,continuationCaptures,capture2,event,focused,hasHandledExact))return;this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation();return}let result2=this.runBindings(capture2.layer,capture2.node.bindings,event,focused);if(!result2.handled)continue;if(hasHandledExact=!0,result2.stop){this.activation.setPendingSequence(null);return}}this.activation.setPendingSequence(null)}dispatchFromRoot(activeLayers,matchKeys,event,focused){this.dispatchFromRootAtIndex(activeLayers,0,matchKeys,event,focused)}dispatchFromRootAtIndex(activeLayers,startIndex,matchKeys,event,focused){let hasLayerConditions=this.state.layers.layersWithConditions>0;for(let index=startIndex;index<activeLayers.length;index+=1){let layer=activeLayers[index];if(!layer)continue;if(layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;let nextNode=this.getReachableChild(layer.root,matchKeys,focused);if(!nextNode)continue;if(nextNode.children.size>0){let continuationCaptures=this.collectPendingCapturesFromRoot(activeLayers,index,matchKeys,focused);if(this.tryResolveRootAmbiguity(activeLayers,index,matchKeys,continuationCaptures,layer,nextNode,event,focused))return;this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation();return}let result2=this.runBindings(layer,nextNode.bindings,event,focused);if(!result2.handled)continue;if(result2.stop)return}}tryResolveRootAmbiguity(activeLayers,layerIndex,matchKeys,continuationCaptures,layer,node,event,focused){let applyExact=()=>{if(this.activation.setPendingSequence(null),!this.runBindings(layer,node.bindings,event,focused).stop)this.dispatchFromRootAtIndex(activeLayers,layerIndex+1,matchKeys,event,focused)};return this.tryResolveAmbiguity({event,focused,continuationCaptures,exactBindingsSource:node.bindings,runExact:applyExact})}tryResolvePendingAmbiguity(advancedCaptures,captureIndex,continuationCaptures,capture2,event,focused,handledExact){let applyExact=()=>{this.activation.setPendingSequence(null);let result2=this.runBindings(capture2.layer,capture2.node.bindings,event,focused);if(result2.stop)return;this.dispatchPendingCapturesFromIndex(advancedCaptures,captureIndex+1,handledExact||result2.handled,event,focused)};return this.tryResolveAmbiguity({event,focused,continuationCaptures,exactBindingsSource:capture2.node.bindings,runExact:applyExact})}tryResolveAmbiguity(options){let{event,focused,continuationCaptures,exactBindingsSource,runExact}=options;if(!this.state.dispatch.disambiguationResolvers.has()||continuationCaptures.length===0)return!1;let activeView=this.catalog.getActiveCommandView(focused),exactBindings=this.activation.collectMatchingBindings(exactBindingsSource,focused,activeView);if(!exactBindings.some((binding)=>binding.command!==void 0))return!1;let continueSequence=()=>{this.activation.setPendingSequence({captures:continuationCaptures}),event.preventDefault(),event.stopPropagation()},clear=()=>{this.activation.setPendingSequence(null),event.preventDefault(),event.stopPropagation()},sequence,getSequence=()=>{return sequence??=this.activation.collectSequencePartsFromPending({captures:continuationCaptures}),sequence},decision=this.resolveDisambiguation({event,focused,getSequence,exactBindings,continuationCaptures,activeView});if(!decision)return this.warnUnresolvedAmbiguity(getSequence()),continueSequence(),!0;return this.applySyncDecision(decision,continuationCaptures,runExact,continueSequence,clear,focused,getSequence)}applySyncDecision(decision,continuationCaptures,runExact,continueSequence,clear,focused,getSequence){if(decision.action==="run-exact")return runExact(),!0;if(decision.action==="continue-sequence")return continueSequence(),!0;if(decision.action==="clear")return clear(),!0;return continueSequence(),this.scheduleDeferredDisambiguation(continuationCaptures,decision.handler,focused,getSequence(),(nextDecision)=>{if(!nextDecision)return;if(nextDecision.action==="run-exact"){runExact();return}if(nextDecision.action==="continue-sequence"){continueSequence();return}clear()}),!0}resolveDisambiguation(options){let activation=this.activation,runtime=this.runtime,sequence,exact,continuations,strokePart,ctx={event:options.event,focused:options.focused,get sequence(){return sequence??=cloneKeySequence2(options.getSequence()),sequence},get stroke(){let stroke=options.getSequence().at(-1);if(!stroke)throw Error("Disambiguation context expected a non-empty sequence");return strokePart??={...stroke,stroke:cloneKeyStroke2(stroke.stroke)},strokePart},get exact(){return exact??=activation.collectActiveBindings(options.exactBindings,options.focused,options.activeView).map((binding)=>({...binding,sequence:cloneKeySequence2(binding.sequence)})),exact},get continuations(){return continuations??=activation.getActiveKeysForCaptures(options.continuationCaptures,{includeBindings:!0,includeMetadata:!0}),continuations},getData:(name)=>{return runtime.getData(name)},setData:(name,value)=>{runtime.setData(name,value)},runExact:()=>createSyncDecision2("run-exact"),continueSequence:()=>createSyncDecision2("continue-sequence"),clear:()=>createSyncDecision2("clear"),defer:(run)=>createSyncDecision2("defer",run)};for(let resolver of this.state.dispatch.disambiguationResolvers.values()){let result2;try{result2=resolver(ctx)}catch(error2){this.notify.emitError("disambiguation-resolver-error",error2,"[Keymap] Error in disambiguation resolver:");continue}if(result2===void 0)continue;if(isPromiseLike2(result2)){this.notify.emitError("invalid-disambiguation-resolver-return",result2,"[Keymap] Disambiguation resolvers must return synchronously; use ctx.defer(...) for async handling");continue}if(!isSyncDecision2(result2)){this.notify.emitError("invalid-disambiguation-decision",result2,"[Keymap] Invalid disambiguation decision returned by resolver:");continue}return result2}return}scheduleDeferredDisambiguation(captures,handler,focused,sequence,apply){this.cancelPendingDisambiguation();let controller=new AbortController,pending={id:this.nextPendingDisambiguationId++,controller,captures,apply};this.pendingDisambiguation=pending,queueMicrotask(()=>{this.executeDeferredDisambiguation(pending,handler,focused,sequence)})}executeDeferredDisambiguation(pending,handler,focused,sequence){if(!this.isPendingDisambiguationCurrent(pending))return;let ctx={signal:pending.controller.signal,sequence:cloneKeySequence2(sequence),focused,sleep:(ms)=>{return this.sleepWithSignal(ms,pending.controller.signal)},runExact:()=>createDeferredDecision2("run-exact"),continueSequence:()=>createDeferredDecision2("continue-sequence"),clear:()=>createDeferredDecision2("clear")},result2;try{result2=handler(ctx)}catch(error2){if(this.isPendingDisambiguationCurrent(pending))this.notify.emitError("deferred-disambiguation-error",error2,"[Keymap] Error in deferred disambiguation handler:"),this.finishPendingDisambiguation(pending);return}if(isPromiseLike2(result2)){result2.then((resolved)=>{this.applyDeferredDisambiguationResult(pending,resolved)}).catch((error2)=>{if(!this.isPendingDisambiguationCurrent(pending))return;this.notify.emitError("deferred-disambiguation-error",error2,"[Keymap] Error in deferred disambiguation handler:"),this.finishPendingDisambiguation(pending)});return}this.applyDeferredDisambiguationResult(pending,result2)}applyDeferredDisambiguationResult(pending,result2){if(!this.isPendingDisambiguationCurrent(pending))return;if(result2!==void 0&&!isDeferredDecision2(result2)){this.notify.emitError("invalid-deferred-disambiguation-decision",result2,"[Keymap] Invalid deferred disambiguation decision returned by handler:"),this.finishPendingDisambiguation(pending);return}this.finishPendingDisambiguation(pending),pending.apply(result2)}finishPendingDisambiguation(pending){if(!this.isPendingDisambiguationCurrent(pending))return;this.pendingDisambiguation=null}cancelPendingDisambiguation(){let pending=this.pendingDisambiguation;if(!pending)return;this.pendingDisambiguation=null,pending.controller.abort()}isPendingDisambiguationCurrent(pending){return this.pendingDisambiguation===pending}sleepWithSignal(ms,signal){if(signal.aborted)return Promise.resolve(!1);return new Promise((resolve23)=>{let timeout=setTimeout(()=>{signal.removeEventListener("abort",onAbort),resolve23(!0)},Math.max(0,ms)),onAbort=()=>{clearTimeout(timeout),signal.removeEventListener("abort",onAbort),resolve23(!1)};signal.addEventListener("abort",onAbort,{once:!0})})}warnUnresolvedAmbiguity(sequence){let display=stringifyKeySequence2(sequence,{preferDisplay:!0});this.notify.warnOnce(`unresolved-disambiguation:${display}`,"unresolved-disambiguation",{sequence:display},`[Keymap] Ambiguous exact/prefix sequence "${display}" fell back to prefix handling because no disambiguation resolver resolved it`)}collectPendingCapturesFromRoot(activeLayers,startIndex,matchKeys,focused){let captures=[],hasLayerConditions=this.state.layers.layersWithConditions>0;for(let index=startIndex;index<activeLayers.length;index+=1){let layer=activeLayers[index];if(!layer||layer.root.children.size===0)continue;if(hasLayerConditions&&!this.conditions.hasNoConditions(layer)&&!this.conditions.matchesConditions(layer))continue;let nextNode=this.getReachableChild(layer.root,matchKeys,focused);if(!nextNode||nextNode.children.size===0)continue;captures.push({layer,node:nextNode})}return captures}collectPendingCapturesFromAdvanced(advancedCaptures,startIndex){return advancedCaptures.filter((candidate,candidateIndex)=>{return candidateIndex>=startIndex&&candidate.node.children.size>0})}resolveEventMatchKeys(event){let resolvers=this.state.dispatch.eventMatchResolvers.values();if(resolvers.length===0)return[];if(resolvers.length===1)return resolveSingleEventMatchKeys2(resolvers[0],event,this.eventMatchResolverContext,this.notify);let keys=[],seen=new Set;for(let resolver of resolvers){let resolved;try{resolved=resolver(event,this.eventMatchResolverContext)}catch(error2){this.notify.emitError("event-match-resolver-error",error2,"[Keymap] Error in event match resolver:");continue}if(!resolved||resolved.length===0)continue;for(let candidate of resolved){if(typeof candidate!=="string"){this.notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:");continue}if(seen.has(candidate))continue;seen.add(candidate),keys.push(candidate)}}return keys}runReleaseBindings(layer,strokeKey,event,focused){let handled=!1;for(let binding of layer.compiledBindings){if(binding.event!=="release")continue;let firstPart=binding.sequence[0];if(!firstPart||firstPart.match!==strokeKey)continue;if(!this.conditions.matchesConditions(binding))continue;if(!this.executor.runBinding(layer,binding,event,focused))continue;if(handled=!0,!binding.fallthrough)return{handled:!0,stop:!0}}return{handled,stop:!1}}getReachableChild(node,matchKeys,focused){for(let strokeKey of matchKeys){let child=node.children.get(strokeKey);if(!child||!this.activation.nodeHasReachableBindings(child,focused))continue;return child}return}runBindings(layer,bindings,event,focused){let handled=!1;for(let binding of bindings){if(!this.conditions.matchesConditions(binding))continue;if(!this.executor.runBinding(layer,binding,event,focused))continue;if(handled=!0,!binding.fallthrough)return{handled:!0,stop:!0}}return{handled,stop:!1}}}function resolveSingleEventMatchKeys2(resolver,event,ctx,notify){let resolved;try{resolved=resolver(event,ctx)}catch(error2){return notify.emitError("event-match-resolver-error",error2,"[Keymap] Error in event match resolver:"),[]}if(!resolved||resolved.length===0)return[];if(resolved.length===1){let[candidate]=resolved;if(typeof candidate!=="string")return notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:"),[];return[candidate]}let keys=[],seen=new Set;for(let candidate of resolved){if(typeof candidate!=="string"){notify.emitError("invalid-event-match-resolver-candidate",candidate,"[Keymap] Invalid event match resolver candidate:");continue}if(seen.has(candidate))continue;seen.add(candidate),keys.push(candidate)}return keys}function registerFieldCompilers2(fields,options){let{kind,reservedFields,registeredFields,emitError}=options,entries=Object.entries(fields),registered=[];for(let[name]of entries){if(reservedFields.has(name)){emitError(`reserved-${kind}-field`,{field:name,kind},`Keymap ${kind} field "${name}" is reserved`);continue}if(registeredFields.has(name))emitError(`duplicate-${kind}-field`,{field:name,kind},`Keymap ${kind} field "${name}" is already registered`)}for(let[name,compiler]of entries){if(reservedFields.has(name)||registeredFields.has(name))continue;registeredFields.set(name,compiler),registered.push([name,compiler])}return()=>{for(let[name,compiler]of registered)if(registeredFields.get(name)===compiler)registeredFields.delete(name)}}class EnvironmentService2{state;notify;compiler;layers;constructor(state,notify,compiler,layers){this.state=state,this.notify=notify,this.compiler=compiler,this.layers=layers}prependBindingTransformer(transformer){return this.state.environment.bindingTransformers.prepend(transformer)}appendBindingTransformer(transformer){return this.state.environment.bindingTransformers.append(transformer)}clearBindingTransformers(){this.state.environment.bindingTransformers.clear()}prependBindingParser(parser){return this.state.environment.bindingParsers.prepend(parser)}appendBindingParser(parser){return this.state.environment.bindingParsers.append(parser)}clearBindingParsers(){this.state.environment.bindingParsers.clear()}registerToken(token){let normalizedToken;try{normalizedToken=normalizeBindingTokenName2(token.name)}catch(error2){return this.notify.emitError("token-name-normalize-error",error2,getErrorMessage2(error2,"Failed to register keymap token")),NOOP3}if(this.state.environment.tokens.has(normalizedToken))return this.notify.emitError("duplicate-token",{token:normalizedToken},`Keymap token "${normalizedToken}" is already registered`),NOOP3;let parsedToken;try{parsedToken=this.compiler.parseTokenKey(token.key)}catch(error2){return this.notify.emitError("token-parse-error",error2,getErrorMessage2(error2,`Failed to register keymap token "${normalizedToken}"`)),NOOP3}let registeredToken={stroke:parsedToken.stroke,match:parsedToken.match},nextTokens=new Map(this.state.environment.tokens);nextTokens.set(normalizedToken,registeredToken);try{this.layers.applyTokenState(nextTokens)}catch(error2){return this.notify.emitError("token-register-error",error2,getErrorMessage2(error2,`Failed to register keymap token "${normalizedToken}"`)),NOOP3}return()=>{if(this.state.environment.tokens.get(normalizedToken)!==registeredToken)return;let nextTokens2=new Map(this.state.environment.tokens);nextTokens2.delete(normalizedToken);try{this.layers.applyTokenState(nextTokens2)}catch(error2){this.notify.emitError("token-unregister-error",error2,getErrorMessage2(error2,`Failed to unregister keymap token "${normalizedToken}"`))}}}prependBindingExpander(expander){return this.state.environment.bindingExpanders.prepend(expander)}appendBindingExpander(expander){return this.state.environment.bindingExpanders.append(expander)}clearBindingExpanders(){this.state.environment.bindingExpanders.clear()}registerLayerFields(fields){return registerFieldCompilers2(fields,{kind:"layer",reservedFields:RESERVED_LAYER_FIELDS2,registeredFields:this.state.environment.layerFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}registerBindingFields(fields){return registerFieldCompilers2(fields,{kind:"binding",reservedFields:RESERVED_BINDING_FIELDS2,registeredFields:this.state.environment.bindingFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}registerCommandFields(fields){return registerFieldCompilers2(fields,{kind:"command",reservedFields:RESERVED_COMMAND_FIELDS2,registeredFields:this.state.environment.commandFields,emitError:(code,error2,message)=>{this.notify.emitError(code,error2,message)}})}}function sortLayers2(layers){return[...layers].sort((left,right)=>{let priorityDiff=right.priority-left.priority;if(priorityDiff!==0)return priorityDiff;return right.order-left.order})}function createCommandLookup2(commands){if(commands.length===0)return;let lookup=new Map;for(let command of commands)lookup.set(command.name,command);return lookup}function addRegisteredCommandNames2(target,commands){for(let command of commands)target.set(command.name,(target.get(command.name)??0)+1)}function removeRegisteredCommandNames2(target,commands){for(let command of commands){let count=target.get(command.name);if(!count||count<=1){target.delete(command.name);continue}target.set(command.name,count-1)}}function getSequenceNode2(root,sequence){let node=root;for(let part of sequence)if(node=node.children.get(part.match),!node)return;return node}function buildLayerBindingAnalyses2(root,compiledBindings){return compiledBindings.map((binding)=>{let node=binding.event==="press"?getSequenceNode2(root,binding.sequence):void 0;return{sequence:cloneKeySequence2(binding.sequence),command:binding.command,attrs:binding.attrs,event:binding.event,preventDefault:binding.preventDefault,fallthrough:binding.fallthrough,sourceBinding:snapshotParsedBindingInput2(binding.sourceBinding),sourceTarget:binding.sourceTarget,sourceLayerOrder:binding.sourceLayerOrder,sourceBindingIndex:binding.sourceBindingIndex,hasCommandAtSequence:node?node.bindings.some((candidate)=>candidate.command!==void 0):!1,hasContinuations:node?node.children.size>0:!1}})}class LayerService2{state;notify;conditions;activation;options;constructor(state,notify,conditions,activation,options){this.state=state,this.notify=notify,this.conditions=conditions,this.activation=activation,this.options=options}registerLayer(layer){return this.notify.runWithStateChangeBatch(()=>{let target=layer.target;if(target&&this.options.host.isTargetDestroyed(target))return this.notify.emitError("destroyed-layer-target",{target},"Cannot register a keymap layer for a destroyed keymap target"),NOOP22;let bindingInputs,requires,matchers,conditionKeys,hasUnkeyedMatchers,compileFields,commands,commandLookup,targetMode;try{targetMode=this.normalizeTargetMode(layer),bindingInputs=snapshotBindingInputs2(layer.bindings??[]),commands=!layer.commands||layer.commands.length===0?[]:this.options.commands.normalizeCommands(layer.commands),commandLookup=createCommandLookup2(commands),{requires,matchers,conditionKeys,hasUnkeyedMatchers,compileFields}=this.compileLayerRuntimeState(layer)}catch(error2){return this.notify.emitError("register-layer-failed",error2,getErrorMessage2(error2,"Failed to register keymap layer")),NOOP22}let order=this.state.core.order++,compiledBindings=this.options.compiler.compileBindings(bindingInputs,this.state.environment.tokens,target,order,compileFields);if(compiledBindings.bindings.length===0&&!compiledBindings.hasTokenBindings&&commands.length===0)return NOOP22;this.runLayerAnalyzers({target,order,commandLookup,bindingInputs,compiledBindings:compiledBindings.bindings,root:compiledBindings.root,hasTokenBindings:compiledBindings.hasTokenBindings});let registeredLayer={order,target,targetMode,priority:layer.priority??0,requires,matchers,conditionKeys,hasUnkeyedMatchers,matchCacheDirty:!0,compileFields,commands,commandLookup,bindingInputs,compiledBindings:compiledBindings.bindings,hasUnkeyedCommands:commands.some((command)=>command.hasUnkeyedMatchers),hasUnkeyedBindings:compiledBindings.bindings.some((binding)=>binding.hasUnkeyedMatchers),hasTokenBindings:compiledBindings.hasTokenBindings,root:compiledBindings.root};if(this.state.layers.layers.add(registeredLayer),registeredLayer.commands.length>0)this.state.layers.layersWithCommands+=1,this.state.commands.commandMetadataVersion+=1,addRegisteredCommandNames2(this.state.commands.registeredNames,registeredLayer.commands);if(registeredLayer.requires.length>0||registeredLayer.matchers.length>0)this.state.layers.layersWithConditions+=1;this.connectRuntimeMatchable(registeredLayer);for(let command of registeredLayer.commands)this.connectRuntimeMatchable(command);for(let binding of registeredLayer.compiledBindings)this.connectRuntimeMatchable(binding);if(this.indexLayer(registeredLayer),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(),target){let onTargetDestroy=()=>{this.unregisterLayer(registeredLayer)};registeredLayer.offTargetDestroy=this.options.host.onTargetDestroy(target,onTargetDestroy)}if(registeredLayer.commands.length>0)this.activation.ensureValidPendingSequence();return this.notify.queueStateChange(),()=>{this.unregisterLayer(registeredLayer)}})}applyTokenState(nextTokens){this.notify.runWithStateChangeBatch(()=>{let nextCompilations=new Map;for(let layer of this.state.layers.layers){if(!layer.hasTokenBindings)continue;nextCompilations.set(layer,this.compileLayerBindings(layer,nextTokens))}this.state.environment.tokens=nextTokens;let shouldClearPending=!1;for(let[layer,compilation]of nextCompilations)if(this.applyCompiledBindings(layer,compilation))shouldClearPending=!0;if(shouldClearPending)this.activation.setPendingSequence(null);if(nextCompilations.size>0)this.notify.queueStateChange()})}recompileBindings(){this.notify.runWithStateChangeBatch(()=>{let recompiledLayers=0,shouldClearPending=!1;for(let layer of this.state.layers.layers){if(layer.bindingInputs.length===0)continue;let compilation=this.compileLayerBindings(layer,this.state.environment.tokens);if(this.applyCompiledBindings(layer,compilation))shouldClearPending=!0;recompiledLayers+=1}if(shouldClearPending)this.activation.setPendingSequence(null);if(recompiledLayers>0)this.notify.queueStateChange()})}prependLayerAnalyzer(analyzer){return this.state.layers.layerAnalyzers.prepend(analyzer)}appendLayerAnalyzer(analyzer){return this.state.layers.layerAnalyzers.append(analyzer)}clearLayerAnalyzers(){this.state.layers.layerAnalyzers.clear()}cleanup(){for(let layer of this.state.layers.layers){this.disconnectRuntimeMatchable(layer);for(let command of layer.commands)this.disconnectRuntimeMatchable(command);for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);layer.offTargetDestroy?.(),layer.offTargetDestroy=void 0}}normalizeTargetMode(layer){if(layer.targetMode){if(!layer.target)throw Error(`Keymap targetMode "${layer.targetMode}" requires a target`);return layer.targetMode}return layer.target?"focus-within":void 0}runLayerAnalyzers(options){let analyzers=this.state.layers.layerAnalyzers.values();if(analyzers.length===0)return;let bindings=buildLayerBindingAnalyses2(options.root,options.compiledBindings),ctx={target:options.target,order:options.order,bindingInputs:options.bindingInputs,bindings,hasTokenBindings:options.hasTokenBindings,checkCommandResolution:(command)=>{return this.options.commands.getCommandResolutionStatus(command,options.commandLookup)},warn:(code,warning,message)=>{this.notify.emitWarning(code,warning,message)},warnOnce:(key,code,warning,message)=>{this.notify.warnOnce(key,code,warning,message)},error:(code,error2,message)=>{this.notify.emitError(code,error2,message)}};for(let analyzer of analyzers)try{analyzer(ctx)}catch(error2){this.notify.emitError("layer-analyzer-error",error2,"[Keymap] Error in layer analyzer:")}}compileLayerRuntimeState(layer){let mergedRequires={},matchers=[],compileFields=Object.create(null),conditionKeys=new Set,hasUnkeyedMatchers=!1;for(let[fieldName,value]of Object.entries(layer)){if(RESERVED_LAYER_FIELDS2.has(fieldName))continue;if(value===void 0)continue;compileFields[fieldName]=snapshotDataValue2(value);let compiler=this.state.environment.layerFields.get(fieldName);if(!compiler){this.options.warnUnknownField("layer",fieldName);continue}compiler(value,{require:(name,requiredValue)=>{mergeRequirement2(mergedRequires,name,requiredValue,`field ${fieldName}`),conditionKeys.add(name)},activeWhen:(matcher)=>{let runtimeMatcher=this.conditions.buildRuntimeMatcher(matcher,`field ${fieldName}`);if(!runtimeMatcher.cacheable)hasUnkeyedMatchers=!0;matchers.push(runtimeMatcher)}})}return{requires:Object.entries(mergedRequires),matchers,conditionKeys:[...conditionKeys],hasUnkeyedMatchers,compileFields:Object.keys(compileFields).length>0?Object.freeze(compileFields):void 0}}compileLayerBindings(layer,tokens2){return this.options.compiler.compileBindings(layer.bindingInputs,tokens2,layer.target,layer.order,layer.compileFields)}applyCompiledBindings(layer,compilation){this.runLayerAnalyzers({target:layer.target,order:layer.order,commandLookup:layer.commandLookup,bindingInputs:layer.bindingInputs,compiledBindings:compilation.bindings,root:compilation.root,hasTokenBindings:compilation.hasTokenBindings});for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);layer.root=compilation.root,layer.compiledBindings=compilation.bindings,layer.hasUnkeyedBindings=compilation.bindings.some((binding)=>binding.hasUnkeyedMatchers),layer.hasTokenBindings=compilation.hasTokenBindings;for(let binding of layer.compiledBindings)this.connectRuntimeMatchable(binding);return this.state.projection.pendingSequence?.captures.some((capture2)=>capture2.layer===layer)??!1}indexLayer(layer){this.state.layers.sortedLayers=sortLayers2([...this.state.layers.sortedLayers,layer]),this.state.layers.activeLayersVersion+=1}removeLayerFromIndex(layer){this.state.layers.sortedLayers=this.state.layers.sortedLayers.filter((candidate)=>candidate!==layer),this.state.layers.activeLayersVersion+=1}unregisterLayer(layer){this.notify.runWithStateChangeBatch(()=>{if(!this.state.layers.layers.delete(layer))return;if(layer.requires.length>0||layer.matchers.length>0)this.state.layers.layersWithConditions-=1;if(layer.commands.length>0)this.state.layers.layersWithCommands-=1,this.state.commands.commandMetadataVersion+=1,removeRegisteredCommandNames2(this.state.commands.registeredNames,layer.commands);this.disconnectRuntimeMatchable(layer);for(let command of layer.commands)this.disconnectRuntimeMatchable(command);for(let binding of layer.compiledBindings)this.disconnectRuntimeMatchable(binding);if(this.removeLayerFromIndex(layer),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(),layer.offTargetDestroy?.(),layer.offTargetDestroy=void 0,this.state.projection.pendingSequence?.captures.some((capture2)=>capture2.layer===layer))this.activation.setPendingSequence(null);else if(layer.commands.length>0&&!this.options.host.isDestroyed)this.activation.ensureValidPendingSequence();this.notify.queueStateChange()})}connectRuntimeMatchable(target){this.attachReactiveMatchers(target),this.conditions.indexRuntimeMatchable(target)}disconnectRuntimeMatchable(target){this.detachReactiveMatchers(target),this.conditions.unindexRuntimeMatchable(target)}attachReactiveMatchers(target){for(let matcher of target.matchers){if(!matcher.subscribe)continue;try{matcher.dispose=matcher.subscribe(()=>{if(target.matchCacheDirty=!0,!this.activation.hasPendingSequenceState()){this.notify.queueStateChange();return}this.notify.runWithStateChangeBatch(()=>{this.activation.revalidatePendingSequenceIfNeeded(),this.notify.queueStateChange()})})}catch(error2){this.notify.emitError("reactive-matcher-subscribe-error",error2,getErrorMessage2(error2,`Failed to subscribe to reactive matcher from ${matcher.source}`))}}}detachReactiveMatchers(target){for(let matcher of target.matchers){if(!matcher.dispose)continue;try{matcher.dispose()}catch(error2){this.notify.emitError("reactive-matcher-dispose-error",error2,getErrorMessage2(error2,`Failed to dispose reactive matcher from ${matcher.source}`))}matcher.dispose=void 0}}}class Emitter3{onError;listeners=Object.create(null);constructor(onError){this.onError=onError}hook(name,listener){let current=this.listeners[name]??[];return this.listeners[name]=[...current,listener],()=>{let current2=this.listeners[name];if(!current2||current2.length===0)return;let next=current2.filter((candidate)=>candidate!==listener);if(next.length===0){delete this.listeners[name];return}this.listeners[name]=next}}has(name){return(this.listeners[name]?.length??0)>0}off(name,listener){let current=this.listeners[name];if(!current||current.length===0)return;let next=current.filter((candidate)=>candidate!==listener);if(next.length===current.length)return;if(next.length===0){delete this.listeners[name];return}this.listeners[name]=next}clear(){this.listeners=Object.create(null)}emit(name,...args){let listeners2=this.listeners[name];if(!listeners2||listeners2.length===0)return;for(let listener of listeners2)try{if(args.length===0)listener();else listener(args[0])}catch(error2){this.onError(name,error2)}}}class NotificationService2{state;events;hooks;constructor(state,events,hooks){this.state=state,this.events=events,this.hooks=hooks}runWithStateChangeBatch(fn){this.state.notify.stateChangeDepth+=1;try{return fn()}finally{if(this.state.notify.stateChangeDepth-=1,this.state.notify.stateChangeDepth===0)this.flushStateChange()}}queueStateChange(){if(this.state.notify.derivedStateVersion+=1,!this.hooks.has("state"))return;if(this.state.notify.stateChangePending=!0,this.state.notify.stateChangeDepth===0&&!this.state.notify.flushingStateChange)this.flushStateChange()}emitWarning(code,warning,message){if(!this.events.has("warning")){let consoleMessage=`[${code}] ${message}`;if(warning instanceof Error)console.warn(consoleMessage,warning);else console.warn(consoleMessage);return}this.events.emit("warning",{code,message,warning})}emitError(code,error2,message){if(!this.events.has("error")){let consoleMessage=`[${code}] ${message}`;if(error2 instanceof Error)console.error(consoleMessage,error2);else console.error(consoleMessage);return}this.events.emit("error",{code,message,error:error2})}reportListenerError(name,error2){if(name==="state"){this.emitError("state-listener-error",error2,"[Keymap] Error in state listener:");return}if(name==="pendingSequence"){this.emitError("pending-sequence-listener-error",error2,"[Keymap] Error in pending sequence listener:");return}}warnOnce(key,code,warning,message){if(this.state.notify.usedWarningKeys.has(key))return;this.state.notify.usedWarningKeys.add(key),this.emitWarning(code,warning,message)}flushStateChange(){if(!this.state.notify.stateChangePending||this.state.notify.stateChangeDepth>0||this.state.notify.flushingStateChange)return;this.state.notify.flushingStateChange=!0;try{let iterations=0;while(this.state.notify.stateChangePending&&this.state.notify.stateChangeDepth===0){if(iterations>=MAX_STATE_CHANGE_FLUSH_ITERATIONS2){this.state.notify.stateChangePending=!1,this.emitError("state-change-feedback-loop",{iterations:MAX_STATE_CHANGE_FLUSH_ITERATIONS2},`[Keymap] Possible infinite state listener feedback loop detected after ${MAX_STATE_CHANGE_FLUSH_ITERATIONS2} iterations; pending state notifications were dropped`);break}iterations+=1,this.state.notify.stateChangePending=!1,this.hooks.emit("state")}}finally{this.state.notify.flushingStateChange=!1}}}class RuntimeService2{state;notify;conditions;activation;constructor(state,notify,conditions,activation){this.state=state,this.notify=notify,this.conditions=conditions,this.activation=activation}getData(name){return this.state.runtime.data[name]}setData(name,value){this.notify.runWithStateChangeBatch(()=>{if(value===void 0){if(!(name in this.state.runtime.data))return;delete this.state.runtime.data[name],this.state.runtime.dataVersion+=1,this.conditions.invalidateRuntimeConditionKey(name),this.activation.ensureValidPendingSequence(),this.notify.queueStateChange();return}if(Object.is(this.state.runtime.data[name],value))return;this.state.runtime.data[name]=value,this.state.runtime.dataVersion+=1,this.conditions.invalidateRuntimeConditionKey(name),this.activation.ensureValidPendingSequence(),this.notify.queueStateChange()})}getReadonlyData(){if(this.state.runtime.readonlyDataVersion===this.state.runtime.dataVersion)return this.state.runtime.readonlyData;return this.state.runtime.readonlyData=Object.freeze({...this.state.runtime.data}),this.state.runtime.readonlyDataVersion=this.state.runtime.dataVersion,this.state.runtime.readonlyData}}class CopyOnWriteRegistry2{items=[];getItems(){return this.items}setItems(items){this.items=items}removeItem(value){let current=this.items;if(current.length===0)return!1;let next=current.filter((candidate)=>candidate!==value);if(next.length===current.length)return!1;return this.items=next,!0}has(){return this.items.length>0}clear(){this.items=[]}}function createKeymapState2(){return{core:{order:0},environment:{tokens:new Map,layerFields:new Map,bindingExpanders:new OrderedRegistry2,bindingParsers:new OrderedRegistry2,bindingTransformers:new OrderedRegistry2,bindingFields:new Map,commandFields:new Map},dispatch:{eventMatchResolvers:new OrderedRegistry2,disambiguationResolvers:new OrderedRegistry2,keyHooks:new PriorityRegistry2,rawHooks:new PriorityRegistry2},layers:{layers:new Set,sortedLayers:[],activeLayersVersion:0,activeLayersCacheVersion:-1,activeLayersCacheFocused:void 0,activeLayersCache:[],layersWithConditions:0,layersWithCommands:0,layerAnalyzers:new OrderedRegistry2},commands:{commandMetadataVersion:0,registeredNames:new Map,commandResolvers:new OrderedRegistry2,activeCommandViewVersion:-1,activeCommandView:void 0,registeredCommandViewVersion:-1,registeredCommandView:void 0,registeredCommandEntriesCacheVersion:-1,registeredCommandEntriesCache:[]},projection:{pendingSequence:null,pendingSequenceCacheVersion:-1,pendingSequenceCache:[],activeKeysPlainCacheVersion:-1,activeKeysPlainCache:[],activeKeysBindingsCacheVersion:-1,activeKeysBindingsCache:[],activeKeysMetadataCacheVersion:-1,activeKeysMetadataCache:[],activeKeysBindingsAndMetadataCacheVersion:-1,activeKeysBindingsAndMetadataCache:[]},conditions:{runtimeKeyDependents:new Map},runtime:{data:{},dataVersion:0,readonlyDataVersion:-1,readonlyData:EMPTY_DATA2},notify:{derivedStateVersion:0,stateChangeDepth:0,stateChangePending:!1,flushingStateChange:!1,usedWarningKeys:new Set}}}function getKeyMatchKey2(input){return resolveKeyMatch2(input)}class Keymap2{host;state=createKeymapState2();cleanedUp=!1;resources=new Map;cleanupListeners=[];events=new Emitter3(()=>{});hooks;notify;activation;runtime;conditions;catalog;executor;compiler;dispatch;layers;environment;keypressListener;keyreleaseListener;rawListener;focusedTargetListener;constructor(host){if(this.host=host,host.isDestroyed)throw Error("Cannot create a keymap for a destroyed host");if(this.hooks=new Emitter3((name,error2)=>{this.notify.reportListenerError(name,error2)}),this.notify=new NotificationService2(this.state,this.events,this.hooks),this.conditions=new ConditionService2(this.state,this.notify),this.catalog=new CommandCatalogService2(this.state,this.host,this.notify,this.conditions,{onCommandResolversChanged:()=>{this.activation.ensureValidPendingSequence()}}),this.activation=new ActivationService2(this.state,this.host,this.hooks,this.notify,this.conditions,this.catalog,{onPendingSequenceChanged:(previous,next)=>{this.dispatch?.handlePendingSequenceChange(previous,next)}}),this.runtime=new RuntimeService2(this.state,this.notify,this.conditions,this.activation),this.executor=new CommandExecutorService2(this.notify,this.runtime,this.activation,this.catalog,{keymap:this,createCommandEvent:()=>this.host.createCommandEvent()}),this.compiler=new CompilerService2(this.state,this.notify,this.conditions,{warnUnknownField:(kind,fieldName)=>{this.warnUnknownField(kind,fieldName)},warnUnknownToken:(token,sequence)=>{this.warnUnknownToken(token,sequence)}}),this.layers=new LayerService2(this.state,this.notify,this.conditions,this.activation,{compiler:this.compiler,commands:this.catalog,host:this.host,warnUnknownField:(kind,fieldName)=>{this.warnUnknownField(kind,fieldName)}}),this.environment=new EnvironmentService2(this.state,this.notify,this.compiler,this.layers),this.dispatch=new DispatchService2(this.state,this.notify,this.runtime,this.activation,this.conditions,this.executor,this.compiler,this.catalog,this.layers),this.keypressListener=(event)=>{this.dispatch.handleKeyEvent(event,!1)},this.keyreleaseListener=(event)=>{this.dispatch.handleKeyEvent(event,!0)},this.rawListener=(sequence)=>{return this.dispatch.handleRawSequence(sequence)},this.focusedTargetListener=(focused)=>{this.handleFocusedTargetChange(focused)},this.cleanupListeners.push(this.host.onKeyPress(this.keypressListener)),this.cleanupListeners.push(this.host.onKeyRelease(this.keyreleaseListener)),this.host.onRawInput)this.cleanupListeners.push(this.host.onRawInput(this.rawListener));if(this.cleanupListeners.push(this.host.onFocusChange(this.focusedTargetListener)),this.host.onDestroy)this.cleanupListeners.push(this.host.onDestroy(()=>{this.cleanup()}))}cleanup(){if(this.cleanedUp)return;this.cleanedUp=!0,this.activation.setPendingSequence(null);for(let resource of this.resources.values())resource.dispose();this.resources.clear(),this.layers.cleanup();for(let cleanupListener of this.cleanupListeners.splice(0))cleanupListener()}setData(name,value){this.runtime.setData(name,value)}getData(name){return this.runtime.getData(name)}hasPendingSequence(){return this.activation.ensureValidPendingSequence()!==void 0}getPendingSequence(){return this.activation.getPendingSequence()}createKeyMatcher(key){let match=this.compiler.parseTokenKey(key).match;return(input)=>{if(!input)return!1;return getKeyMatchKey2(input)===match}}clearPendingSequence(){this.activation.setPendingSequence(null)}popPendingSequence(){return this.activation.popPendingSequence()}getActiveKeys(options){return this.activation.getActiveKeys(options)}getCommands(query2){return this.catalog.getCommands(query2)}getCommandEntries(query2){return this.catalog.getCommandEntries(query2)}normalizeCommandName(name){return normalizeCommandName2(name)}normalizeBindings(bindings){return normalizeBindingInputs2(bindings)}acquireResource(key,setup){if(this.cleanedUp||this.host.isDestroyed)throw Error("Cannot use a keymap after its host was destroyed");let existing=this.resources.get(key);if(existing)return existing.count+=1,()=>{this.releaseResource(key,existing)};let resource={count:1,dispose:setup()};return this.resources.set(key,resource),()=>{this.releaseResource(key,resource)}}runCommand(cmd,options){return this.executor.runCommand(cmd,options)}dispatchCommand(cmd,options){return this.executor.dispatchCommand(cmd,options)}on(name,fn){if(name==="warning")return this.events.hook(name,fn);if(name==="error")return this.events.hook(name,fn);return this.hooks.hook(name,fn)}intercept(name,fn,options){if(name==="key")return this.dispatch.intercept(name,fn,options);return this.dispatch.intercept(name,fn,options)}registerLayer(layer){return this.layers.registerLayer(layer)}registerLayerFields(fields){return this.environment.registerLayerFields(fields)}prependBindingTransformer(transformer){return this.environment.prependBindingTransformer(transformer)}appendBindingTransformer(transformer){return this.environment.appendBindingTransformer(transformer)}clearBindingTransformers(){this.environment.clearBindingTransformers()}prependBindingParser(parser){return this.environment.prependBindingParser(parser)}appendBindingParser(parser){return this.environment.appendBindingParser(parser)}clearBindingParsers(){this.environment.clearBindingParsers()}registerToken(token){return this.environment.registerToken(token)}prependBindingExpander(expander){return this.environment.prependBindingExpander(expander)}appendBindingExpander(expander){return this.environment.appendBindingExpander(expander)}clearBindingExpanders(){this.environment.clearBindingExpanders()}registerBindingFields(fields){return this.environment.registerBindingFields(fields)}registerCommandFields(fields){return this.environment.registerCommandFields(fields)}prependCommandResolver(resolver){return this.catalog.prependCommandResolver(resolver)}appendCommandResolver(resolver){return this.catalog.appendCommandResolver(resolver)}clearCommandResolvers(){this.catalog.clearCommandResolvers()}prependLayerAnalyzer(analyzer){return this.layers.prependLayerAnalyzer(analyzer)}appendLayerAnalyzer(analyzer){return this.layers.appendLayerAnalyzer(analyzer)}clearLayerAnalyzers(){this.layers.clearLayerAnalyzers()}prependEventMatchResolver(resolver){return this.dispatch.prependEventMatchResolver(resolver)}appendEventMatchResolver(resolver){return this.dispatch.appendEventMatchResolver(resolver)}clearEventMatchResolvers(){this.dispatch.clearEventMatchResolvers()}prependDisambiguationResolver(resolver){return this.dispatch.prependDisambiguationResolver(resolver)}appendDisambiguationResolver(resolver){return this.dispatch.appendDisambiguationResolver(resolver)}clearDisambiguationResolvers(){this.dispatch.clearDisambiguationResolvers()}handleFocusedTargetChange(_focused){this.notify.runWithStateChangeBatch(()=>{this.activation.setPendingSequence(null),this.activation.invalidateActiveLayers(),this.activation.refreshActiveLayers(_focused),this.notify.queueStateChange()})}warnUnknownField(kind,fieldName){this.notify.warnOnce(`${kind}:${fieldName}`,`unknown-${kind}-field`,{field:fieldName,kind},`[Keymap] Unknown ${kind} field "${fieldName}" was ignored`)}warnUnknownToken(token,sequence){this.notify.warnOnce(`token:${token}`,"unknown-token",{token,sequence},`[Keymap] Unknown token "${token}" in key sequence "${sequence}" was ignored`)}releaseResource(key,resource){if(this.resources.get(key)!==resource)return;if(resource.count-=1,resource.count>0)return;resource.dispose(),this.resources.delete(key)}}function parseObjectKeyInput(ctx,key,display,match,tokenName){return ctx.parseObjectKey(key,{display,match,tokenName})}function isNamedSingleStrokeKey(input,extraNames){let normalized=input.trim().toLowerCase();if(!normalized)return!1;if(namedSingleStrokeKeys.has(normalized))return!0;if(extraNames?.has(normalized))return!0;return/^f\d{1,2}$/i.test(normalized)}function isSingleStrokeString(input,tokens2,normalizeTokenName,extraNames){if(input===" "||input==="+")return!0;if(input.length===1)return!0;if(tokens2.has(normalizeTokenName(input)))return!0;if(input.includes("+"))return!0;return isNamedSingleStrokeKey(input,extraNames)}function parseStringKeyPart(input,ctx){if(input===" ")return ctx.parseObjectKey({name:"space"},{display:"space"});if(input==="+")return ctx.parseObjectKey({name:"+"},{display:"+"});let parts=input.split("+"),name="",displayName="",ctrl=!1,shift=!1,meta=!1,superKey=!1,hyper=!1;for(let rawPart of parts){let part=rawPart.trim();if(!part)continue;let lowered=part.toLowerCase();if(lowered==="ctrl"||lowered==="control"){ctrl=!0;continue}if(lowered==="shift"){shift=!0;continue}if(lowered==="meta"||lowered==="alt"||lowered==="option"){meta=!0;continue}if(lowered==="super"){superKey=!0;continue}if(lowered==="hyper"){hyper=!0;continue}if(name)throw Error(`Invalid key "${input}": multiple key names are not supported`);name=part,displayName=lowered}if(!name)throw Error(`Invalid key "${input}": missing key name`);let displayParts=[];if(ctrl)displayParts.push("ctrl");if(shift)displayParts.push("shift");if(meta)displayParts.push("meta");if(superKey)displayParts.push("super");if(hyper)displayParts.push("hyper");return displayParts.push(displayName),ctx.parseObjectKey({name,ctrl,shift,meta,super:superKey,hyper:hyper||void 0},{display:displayParts.join("+")})}function registerDefaultBindingParser(keymap){return keymap.appendBindingParser(defaultBindingParser)}function registerDefaultEventMatchResolver(keymap){return keymap.appendEventMatchResolver(defaultEventMatchResolver)}function registerDefaultKeys(keymap){let offParser=registerDefaultBindingParser(keymap),offResolver=registerDefaultEventMatchResolver(keymap);return()=>{offResolver(),offParser()}}function isReactiveMatcher22(value){if(!value||typeof value!=="object")return!1;let candidate=value;return typeof candidate.get==="function"&&typeof candidate.subscribe==="function"}function normalizeEnabledValue(fieldName,value){if(typeof value==="boolean")return value;if(typeof value==="function")return value;if(isReactiveMatcher22(value))return value;throw Error(`Keymap enabled field "${fieldName}" must be a boolean, a function, or a reactive matcher`)}function registerEnabledFields(keymap){let offLayerFields=keymap.registerLayerFields({enabled(value,ctx){let normalized=normalizeEnabledValue("enabled",value);if(normalized===!0)return;if(normalized===!1){ctx.activeWhen(()=>!1);return}ctx.activeWhen(normalized)}}),offCommandFields=keymap.registerCommandFields({enabled(value,ctx){let normalized=normalizeEnabledValue("enabled",value);if(normalized===!0)return;if(normalized===!1){ctx.activeWhen(()=>!1);return}ctx.activeWhen(normalized)}});return()=>{offCommandFields(),offLayerFields()}}function normalizeMetadataText(fieldName,value){if(typeof value!=="string")throw Error(`Keymap metadata field "${fieldName}" must be a string`);let trimmed=value.trim();if(!trimmed)throw Error(`Keymap metadata field "${fieldName}" cannot be empty`);return trimmed}function registerMetadataFields(keymap){let offBindingFields=keymap.registerBindingFields({desc(value,ctx){ctx.attr("desc",normalizeMetadataText("desc",value))},group(value,ctx){ctx.attr("group",normalizeMetadataText("group",value))}}),offCommandFields=keymap.registerCommandFields({desc(value,ctx){ctx.attr("desc",normalizeMetadataText("desc",value))},title(value,ctx){ctx.attr("title",normalizeMetadataText("title",value))},category(value,ctx){ctx.attr("category",normalizeMetadataText("category",value))}});return()=>{offCommandFields(),offBindingFields()}}function createSyntheticCommandEvent(){return new KeyEvent({name:"command",ctrl:!1,meta:!1,shift:!1,option:!1,sequence:"",number:!1,raw:"",eventType:"press",source:"raw"})}function createOpenTuiKeymapHost(renderer){return{rootTarget:renderer.root,get isDestroyed(){return renderer.isDestroyed},getFocusedTarget(){let focused=renderer.currentFocusedRenderable;if(!focused||focused.isDestroyed||!focused.focused)return null;return focused},getParentTarget(target){return target.parent},isTargetDestroyed(target){return target.isDestroyed},onKeyPress(listener){return renderer.keyInput.prependListener("keypress",listener),()=>{renderer.keyInput.off("keypress",listener)}},onKeyRelease(listener){return renderer.keyInput.prependListener("keyrelease",listener),()=>{renderer.keyInput.off("keyrelease",listener)}},onFocusChange(listener){return renderer.on(CliRenderEvents.FOCUSED_RENDERABLE,listener),()=>{renderer.off(CliRenderEvents.FOCUSED_RENDERABLE,listener)}},onDestroy(listener){return renderer.once(CliRenderEvents.DESTROY,listener),()=>{renderer.off(CliRenderEvents.DESTROY,listener)}},onTargetDestroy(target,listener){return target.once(RenderableEvents.DESTROYED,listener),()=>{target.off(RenderableEvents.DESTROYED,listener)}},onRawInput(listener){return renderer.prependInputHandler(listener),()=>{renderer.removeInputHandler(listener)}},createCommandEvent(){return createSyntheticCommandEvent()}}}function createOpenTuiKeymap(renderer){if(renderer.isDestroyed)throw Error("Cannot create a keymap for a destroyed renderer");return new Keymap2(createOpenTuiKeymapHost(renderer))}function createDefaultOpenTuiKeymap(renderer){let keymap=createOpenTuiKeymap(renderer);return registerDefaultKeys(keymap),registerEnabledFields(keymap),registerMetadataFields(keymap),keymap}var RESERVED_COMMAND_FIELDS2,RESERVED_BINDING_FIELDS2,RESERVED_LAYER_FIELDS2,DEFAULT_COMMAND_SEARCH_FIELDS2,SNAPSHOT_COMMAND_METADATA_OPTIONS2,SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS2,EMPTY_COMMAND_FIELDS2,EMPTY_COMPILE_FIELDS2,EMPTY_REQUIRES2,EMPTY_MATCHERS2,EMPTY_CONDITION_KEYS2,KEY_DISAMBIGUATION_DECISION2,KEY_DEFERRED_DISAMBIGUATION_DECISION2,NOOP3=()=>{},NOOP22=()=>{},MAX_STATE_CHANGE_FLUSH_ITERATIONS2=1000,OrderedRegistry2,PriorityRegistry2,EMPTY_DATA2,namedSingleStrokeKeys,defaultBindingParser=(ctx)=>{let{input,index,tokens:tokens2,normalizeTokenName}=ctx;if(index===0&&isSingleStrokeString(input,tokens2,normalizeTokenName)){if(input===" "||input==="+")return{parts:[parseStringKeyPart(input,ctx)],nextIndex:input.length};let normalizedToken=normalizeTokenName(input),token=tokens2.get(normalizedToken);if(token)return{parts:[parseObjectKeyInput(ctx,token.stroke,normalizedToken,token.match,normalizedToken)],nextIndex:input.length,usedTokens:[normalizedToken]};return{parts:[parseStringKeyPart(input,ctx)],nextIndex:input.length}}let char=input[index];if(char===void 0)return;if(char==="<"){let end=input.indexOf(">",index);if(end===-1)throw Error(`Invalid key sequence "${input}": unterminated token`);let tokenName=normalizeTokenName(input.slice(index,end+1)),token=tokens2.get(tokenName);if(!token)return{parts:[],nextIndex:end+1,unknownTokens:[tokenName]};return{parts:[parseObjectKeyInput(ctx,token.stroke,tokenName,token.match,tokenName)],nextIndex:end+1,usedTokens:[tokenName]}}return{parts:[parseStringKeyPart(char,ctx)],nextIndex:index+1}},defaultEventMatchResolver=(event,ctx)=>{return[ctx.resolveKey({name:event.name,ctrl:event.ctrl,shift:event.shift,meta:event.meta,super:event.super??!1,hyper:event.hyper||void 0})]};var init_opentui=__esm(async()=>{await init_core();RESERVED_COMMAND_FIELDS2=new Set(["name","run"]),RESERVED_BINDING_FIELDS2=new Set(["key","cmd","event","preventDefault","fallthrough"]),RESERVED_LAYER_FIELDS2=new Set(["target","targetMode","priority","bindings","commands"]);DEFAULT_COMMAND_SEARCH_FIELDS2=["name"],SNAPSHOT_COMMAND_METADATA_OPTIONS2=Object.freeze({deep:!0,preserveNonPlainObjects:!0}),SNAPSHOT_FROZEN_COMMAND_METADATA_OPTIONS2=Object.freeze({deep:!0,freeze:!0,preserveNonPlainObjects:!0}),EMPTY_COMMAND_FIELDS2=Object.freeze({});EMPTY_COMPILE_FIELDS2=Object.freeze({}),EMPTY_REQUIRES2=[],EMPTY_MATCHERS2=[],EMPTY_CONDITION_KEYS2=[];KEY_DISAMBIGUATION_DECISION2=Symbol("keymap-disambiguation-decision"),KEY_DEFERRED_DISAMBIGUATION_DECISION2=Symbol("keymap-deferred-disambiguation-decision");OrderedRegistry2=class OrderedRegistry2 extends CopyOnWriteRegistry2{append(value){return this.setItems([...this.getItems(),value]),()=>{this.remove(value)}}prepend(value){return this.setItems([value,...this.getItems()]),()=>{this.remove(value)}}remove(value){return this.removeItem(value)}values(){return this.getItems()}};PriorityRegistry2=class PriorityRegistry2 extends CopyOnWriteRegistry2{order=0;register(listener,options){let registered={...options,listener,order:this.order++};return this.setItems([...this.getItems(),registered].sort((left,right)=>{let priorityDiff=right.priority-left.priority;if(priorityDiff!==0)return priorityDiff;return left.order-right.order})),()=>{this.removeItem(registered)}}entries(){return this.getItems()}};EMPTY_DATA2=Object.freeze({});namedSingleStrokeKeys=new Set(["up","down","left","right","clear","escape","return","linefeed","enter","tab","backspace","delete","insert","home","end","pageup","pagedown","space","lt","gt","plus","minus","equal","comma","period","slash","backslash","semicolon","quote","backquote","leftbracket","rightbracket","capslock","numlock","scrolllock","printscreen","pause","menu","apps","kp0","kp1","kp2","kp3","kp4","kp5","kp6","kp7","kp8","kp9","kpdecimal","kpdivide","kpmultiply","kpminus","kpplus","kpenter","kpequal","kpseparator","kpleft","kpright","kpup","kpdown","kppageup","kppagedown","kphome","kpend","kpinsert","kpdelete","mediaplay","mediapause","mediaplaypause","mediareverse","mediastop","mediafastforward","mediarewind","medianext","mediaprev","mediarecord","volumedown","volumeup","mute","leftshift","leftctrl","leftalt","leftsuper","lefthyper","leftmeta","rightshift","rightctrl","rightalt","rightsuper","righthyper","rightmeta","iso_level3_shift","iso_level5_shift","option","alt","meta","super","hyper","control","ctrl","shift"])});function createTuiKeymap(renderer){let keymap=createDefaultOpenTuiKeymap(renderer);return registerLeader(keymap,{trigger:{name:"space"}}),registerEscapeClearsPendingSequence(keymap),keymap}var init_keymap=__esm(async()=>{init_addons();await init_opentui()});import{spawnSync as spawnSync10}from"child_process";import{existsSync as existsSync77}from"fs";function resolveTuiTmuxConf(){let tuiConf=`${process.env.GENIE_HOME??`${process.env.HOME}/.genie`}/tui-tmux.conf`;return existsSync77(tuiConf)?tuiConf:"/dev/null"}function safeHex(value,fallback){if(!value)return fallback;let trimmed=value.trim();return HEX_COLOR_RE.test(trimmed)?trimmed:fallback}function resolveThemePalette(snapshot){if(snapshot.mode==="dark")return{bg:palette.bg,bgRaised:palette.bgRaised,text:palette.text,textDim:palette.textDim,textMuted:palette.textMuted,border:palette.border,accent:palette.accent,accentDim:palette.accentDim,accentBright:palette.accentBright,warning:palette.warning,info:palette.info};return{...lightPalette,bg:safeHex(snapshot.terminalBackground,lightPalette.bg),text:safeHex(snapshot.terminalForeground,lightPalette.text)}}function flattenTmuxCommands(commands){let args=[];return commands.forEach((command,index)=>{if(index>0)args.push(";");args.push(...command)}),args}function buildTuiTmuxThemeCommands(snapshot){let theme=resolveThemePalette(snapshot),terminalForeground=safeHex(snapshot.terminalForeground,theme.text),terminalBackground=safeHex(snapshot.terminalBackground,theme.bg);return flattenTmuxCommands([["set-environment","-g","GENIE_TUI_THEME_MODE",snapshot.mode],["set-environment","-g","GENIE_TUI_TERMINAL_FG",terminalForeground],["set-environment","-g","GENIE_TUI_TERMINAL_BG",terminalBackground],["set-environment","-g","GENIE_TUI_TMUX_BG",theme.bg],["set-environment","-g","GENIE_TUI_TMUX_TEXT",theme.text],["set-environment","-g","GENIE_TUI_TMUX_ACCENT",theme.accent],["set-option","-g","pane-border-style",`fg=${theme.border}`],["set-option","-g","pane-active-border-style",`fg=${theme.accent}`],["set-option","-g","message-style",`bg=${theme.bgRaised},fg=${theme.info}`],["set-option","-g","message-command-style",`bg=${theme.bgRaised},fg=${theme.warning}`],["set-option","-g","status-style",`bg=${theme.bg},fg=${theme.text}`],["set-window-option","-g","mode-style",`bg=${theme.accent},fg=${theme.bg}`],["set-window-option","-g","clock-mode-colour",theme.accent]])}function syncTuiTmuxTheme(snapshot,deps={}){let run=deps.spawnSync??spawnSync10,tmux=deps.tmuxBin??tmuxBin(),socketName=deps.socketName??TUI_TMUX_SOCKET,configPath2=deps.configPath??resolveTuiTmuxConf(),timeoutMs=deps.timeoutMs??DEFAULT_TMUX_SYNC_TIMEOUT_MS;return run(tmux,["-L",socketName,"-f",configPath2,...buildTuiTmuxThemeCommands(snapshot)],{stdio:"ignore",timeout:timeoutMs}).status===0}var TUI_TMUX_SOCKET="genie-tui",DEFAULT_TMUX_SYNC_TIMEOUT_MS=300,HEX_COLOR_RE,lightPalette;var init_tmux_theme_sync=__esm(()=>{init_ensure_tmux();init_theme2();HEX_COLOR_RE=/^#[0-9a-f]{6}$/i,lightPalette={bg:"#f5efe4",bgRaised:"#ebe3d7",text:"#24323a",textDim:"#56656d",textMuted:"#718087",border:"#c8bdae",accent:"#2f7a62",accentDim:"#3e9277",accentBright:"#17694f",warning:"#9a651e",info:"#406f8b"}});function readBool(env2,name,fallback){let raw=env2[name];if(!raw)return fallback;let normalized=raw.trim().toLowerCase();if(TRUTHY3.has(normalized))return!0;if(FALSY.has(normalized))return!1;return fallback}function readPositiveInt(env2,name,fallback){let raw=env2[name];if(!raw)return fallback;let parsed=Number.parseInt(raw,10);return Number.isFinite(parsed)&&parsed>0?parsed:fallback}function inferThemeMode(background){if(!background||!/^#[0-9a-f]{6}$/i.test(background))return null;let r=Number.parseInt(background.slice(1,3),16),g2=Number.parseInt(background.slice(3,5),16),b3=Number.parseInt(background.slice(5,7),16);return(0.2126*r+0.7152*g2+0.0722*b3)/255>=0.5?"light":"dark"}function snapshotKey(snapshot){return[snapshot.mode,snapshot.terminalForeground??"",snapshot.terminalBackground??""].join("|")}function buildSnapshot(mode,colors8){let resolvedMode=mode??inferThemeMode(colors8?.defaultBackground);if(!resolvedMode)return null;return{mode:resolvedMode,terminalForeground:colors8?.defaultForeground,terminalBackground:colors8?.defaultBackground}}function installOpenTui20Bridge(renderer,options={}){let env2=options.env??process.env;if(!readBool(env2,"GENIE_TUI_TMUX_THEME_SYNC",!0))return()=>{};let syncTheme=options.syncTheme??syncTuiTmuxTheme,themeQueryTimeoutMs=readPositiveInt(env2,"GENIE_TUI_THEME_QUERY_TIMEOUT_MS",DEFAULT_THEME_QUERY_TIMEOUT_MS),tmuxApplyTimeoutMs=readPositiveInt(env2,"GENIE_TUI_TMUX_THEME_SYNC_TIMEOUT_MS",DEFAULT_TMUX_APPLY_TIMEOUT_MS),disposed=!1,lastSnapshot="",syncSnapshot=(snapshot)=>{if(disposed||!snapshot)return;let key=snapshotKey(snapshot);if(key===lastSnapshot)return;lastSnapshot=key;try{syncTheme(snapshot,{timeoutMs:tmuxApplyTimeoutMs})}catch{}},syncFromMode=(mode,colors8)=>{syncSnapshot(buildSnapshot(mode,colors8))},onThemeMode=(mode)=>syncFromMode(mode);renderer.on("theme_mode",onThemeMode),syncFromMode(renderer.themeMode),renderer.waitForThemeMode(themeQueryTimeoutMs).then((mode)=>syncFromMode(mode)).catch(()=>{});let paletteOptions={size:OPEN_TUI_02_PALETTE_SIZE,timeout:themeQueryTimeoutMs};return renderer.getPalette(paletteOptions).then((colors8)=>syncFromMode(renderer.themeMode,colors8)).catch(()=>{}),()=>{disposed=!0,renderer.off("theme_mode",onThemeMode)}}var TRUTHY3,FALSY,DEFAULT_THEME_QUERY_TIMEOUT_MS=700,DEFAULT_TMUX_APPLY_TIMEOUT_MS=300,OPEN_TUI_02_PALETTE_SIZE=16;var init_opentui_bridge=__esm(()=>{init_tmux_theme_sync();TRUTHY3=new Set(["1","true","yes","on"]),FALSY=new Set(["0","false","no","off"])});var exports_render={};__export(exports_render,{resolveTuiRendererConfig:()=>resolveTuiRendererConfig,renderNav:()=>renderNav});function readBool2(env2,name,fallback){let raw=env2[name];if(!raw)return fallback;let normalized=raw.trim().toLowerCase();if(TRUTHY4.has(normalized))return!0;if(FALSY2.has(normalized))return!1;return fallback}function readPositiveInt2(env2,name){let raw=env2[name];if(!raw)return;let parsed=Number.parseInt(raw,10);return Number.isFinite(parsed)&&parsed>0?parsed:void 0}function resolveTuiRendererConfig(env2=process.env,platform2=process.platform){let isDarwin=platform2==="darwin",targetFps=readPositiveInt2(env2,"GENIE_TUI_TARGET_FPS")??(isDarwin?8:30),configuredMaxFps=readPositiveInt2(env2,"GENIE_TUI_MAX_FPS")??(isDarwin?12:60),maxFps=Math.max(configuredMaxFps,targetFps),useMouse=readBool2(env2,"GENIE_TUI_MOUSE",!0),enableMouseMovement=useMouse&&readBool2(env2,"GENIE_TUI_MOUSE_MOVEMENT",!isDarwin),consoleEnabled=readBool2(env2,"GENIE_TUI_CONSOLE",!0),kittyKeyboardOptIn=readBool2(env2,"GENIE_TUI_KITTY_KEYBOARD",!isDarwin);return{exitOnCtrlC:!1,useThread:!isDarwin,targetFps,maxFps,useMouse,enableMouseMovement,useKittyKeyboard:kittyKeyboardOptIn?void 0:null,consoleMode:consoleEnabled?void 0:"disabled",openConsoleOnError:consoleEnabled&&!isDarwin}}async function renderNav(){let rightPane=process.env.GENIE_TUI_RIGHT||void 0,workspaceRoot=process.env.GENIE_TUI_WORKSPACE||void 0,initialAgent=process.env.GENIE_TUI_AGENT||void 0,renderer=await createCliRenderer(resolveTuiRendererConfig()),disposeOpenTui20Bridge=installOpenTui20Bridge(renderer),keymap=createTuiKeymap(renderer);createRoot(renderer).render(import_jsx_dev_runtime2.jsxDEV(KeymapProvider,{keymap,children:import_jsx_dev_runtime2.jsxDEV(App,{rightPane,workspaceRoot,initialAgent},void 0,!1,void 0,this)},void 0,!1,void 0,this)),await new Promise((resolve23)=>{renderer.once("destroy",()=>{disposeOpenTui20Bridge(),resolve23()})})}var TRUTHY4,FALSY2;var init_render=__esm(async()=>{init_react();init_opentui_bridge();init_jsx_dev_runtime();await __promiseAll([init_core(),init_react2(),init_app(),init_keymap()]);TRUTHY4=new Set(["1","true","yes","on"]),FALSY2=new Set(["0","false","no","off"])});var exports_tui={};__export(exports_tui,{launchTui:()=>launchTui});import{appendFileSync as appendFileSync6,closeSync as closeSync6,mkdirSync as mkdirSync35,openSync as openSync6,readSync as readSync3,statSync as statSync17}from"fs";import{homedir as homedir52}from"os";import{join as join94}from"path";function genieHome6(){return process.env.GENIE_HOME??join94(homedir52(),".genie")}function extractPreviousRunCrashOutput(logPath){let fd=null;try{let size=statSync17(logPath).size;if(size===0)return"";let readSize=Math.min(size,TUI_CRASH_LOG_RECOVERY_MAX_BYTES);fd=openSync6(logPath,"r");let buffer2=Buffer.alloc(readSize);readSync3(fd,buffer2,0,readSize,size-readSize);let text=buffer2.toString("utf-8"),lastBannerIndex=text.lastIndexOf(TUI_CRASH_LOG_BANNER_PREFIX);if(lastBannerIndex<0)return"";let afterBannerNewline=text.indexOf(`
|
|
4014
4014
|
`,lastBannerIndex);if(afterBannerNewline<0)return"";return text.slice(afterBannerNewline+1).trim()}catch{return""}finally{if(fd!==null)try{closeSync6(fd)}catch{}}}async function ingestPreviousRunCrash(logPath){let body=extractPreviousRunCrashOutput(logPath);if(!body)return;let truncated=body.length>TUI_CRASH_LOG_RECOVERY_MAX_MSG_CHARS?`${body.slice(0,TUI_CRASH_LOG_RECOVERY_MAX_MSG_CHARS)}
|
|
4015
4015
|
\u2026[truncated]`:body;try{let{emitEvent:emitEvent2}=await Promise.resolve().then(() => (init_emit(),exports_emit));emitEvent2("error.raised",{error_class:"TuiCrash",message:truncated,subsystem:"tui",severity:"error",retryable:!0})}catch{}}async function recordTuiLaunchBreadcrumb(){try{let logsDir=join94(genieHome6(),"logs");mkdirSync35(logsDir,{recursive:!0});let logPath=join94(logsDir,"tui-crash.log");await ingestPreviousRunCrash(logPath);let ts3=new Date().toISOString(),line=`${TUI_CRASH_LOG_BANNER_PREFIX}${ts3} pid=${process.pid} platform=${process.platform} arch=${process.arch} ---
|
|
4016
4016
|
`;appendFileSync6(logPath,line,{mode:420})}catch{}}function installTuiExitSignals(){let exitOnSignal=(signal)=>{process.exit(signal==="SIGHUP"?0:128+(signal==="SIGINT"?2:15))};process.on("SIGHUP",exitOnSignal),process.on("SIGINT",exitOnSignal),process.on("SIGTERM",exitOnSignal)}async function launchTui(){installTuiExitSignals(),await recordTuiLaunchBreadcrumb();let{renderNav:renderNav2}=await init_render().then(() => exports_render);await renderNav2()}var TUI_CRASH_LOG_BANNER_PREFIX="--- tui-launch ",TUI_CRASH_LOG_RECOVERY_MAX_BYTES=65536,TUI_CRASH_LOG_RECOVERY_MAX_MSG_CHARS=3000;var init_tui=()=>{};var exports_resolve_agent_cwd={};__export(exports_resolve_agent_cwd,{resolveAgentFromCwd:()=>resolveAgentFromCwd});import{existsSync as existsSync78}from"fs";import{basename as basename16,dirname as dirname35,join as join95,relative as relative10,sep as sep3}from"path";function isRelativeWithin(rel,original){return!rel.startsWith("..")&&rel!==original}function resolveFromCanonicalDir(cwd,agentsDir){let relToAgents=relative10(agentsDir,cwd);if(!isRelativeWithin(relToAgents,cwd))return null;let segments=relToAgents.split(sep3).filter(Boolean);if(segments.length===0)return null;let agentName=segments[0];if(!existsSync78(join95(agentsDir,agentName,"AGENTS.md")))return null;let source=segments.length===1?"exact":"parent";return{agent:agentName,source}}function resolveFromWalkUp(cwd,workspaceRoot){let wsRel=relative10(workspaceRoot,cwd);if(!isRelativeWithin(wsRel,cwd))return null;let current=cwd;while(current!==workspaceRoot&¤t!==dirname35(current)){if(existsSync78(join95(current,"AGENTS.md")))return{agent:basename16(current),source:"parent"};current=dirname35(current)}return null}function resolveAgentFromCwd(cwd,workspaceRoot){return resolveFromCanonicalDir(cwd,join95(workspaceRoot,"agents"))??resolveFromWalkUp(cwd,workspaceRoot)??{agent:"genie",source:"default"}}var init_resolve_agent_cwd=()=>{};var import__=__toESM(require_commander(),1),{program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help}=import__.default;init_doctor();import{execFileSync as execFileSync2,spawnSync as spawnSync2}from"child_process";import{existsSync as existsSync21,mkdirSync as mkdirSync11,readFileSync as readFileSync14,writeFileSync as writeFileSync8}from"fs";import{homedir as homedir21}from"os";import{dirname as dirname9,join as join26,resolve as resolve4}from"path";var PM2_PROCESS_NAME="Genie",PM2_LOG_PREFIX="genie-serve",LEGACY_PM2_PROCESS_NAMES=["genie-serve"],HARDENED_DEFAULTS={maxRestarts:50,minUptimeMs:1e4,restartDelayMs:4000,expBackoffRestartDelayMs:100,maxMemory:process.env.GENIE_SERVE_MAX_MEMORY||"4G",killTimeoutMs:60000,logDateFormat:"YYYY-MM-DD HH:mm:ss.SSS"};function getLogsDir(){return join26(homedir21(),".genie","logs")}function ok(msg){process.stdout.write(`genie install: ${msg}
|