@automagik/genie 4.260430.8 → 4.260430.9

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
@@ -675,14 +675,34 @@ ${bin} set-option -w pane-active-border-style "fg=$COLOR"
675
675
  tell.location
676
676
  from (select lo_tell64($1) as location) tell
677
677
  ) seek
678
- `};return resolve3(lo),new Promise(async(r)=>finish=r);async function readable({highWaterMark=16384,start=0,end=1/0}={}){let max=end-start;return start&&await lo.seek(start),new Stream2.Readable({highWaterMark,async read(size){let l=size>max?size-max:size;max-=size;let[{data}]=await lo.read(l);if(this.push(data),data.length<size)this.push(null)}})}async function writable({highWaterMark=16384,start=0}={}){return start&&await lo.seek(start),new Stream2.Writable({highWaterMark,write(chunk,encoding,callback){lo.write(chunk).then(()=>callback(),callback)}})}}).catch(reject)})}var init_large=()=>{};var exports_src={};__export(exports_src,{default:()=>src_default});import os from"os";import fs from"fs";function Postgres(a,b2){let options=parseOptions(a,b2),subscribe=options.no_subscribe||Subscribe(Postgres,{...options}),ending=!1,queries=queue_default(),connecting=queue_default(),reserved=queue_default(),closed=queue_default(),ended=queue_default(),open3=queue_default(),busy=queue_default(),full=queue_default(),queues={connecting,reserved,closed,ended,open:open3,busy,full},connections=[...Array(options.max)].map(()=>connection_default(options,queues,{onopen,onend,onclose})),sql=Sql(handler);return Object.assign(sql,{get parameters(){return options.parameters},largeObject:largeObject.bind(null,sql),subscribe,CLOSE,END:CLOSE,PostgresError,options,reserve,listen,begin,close,end}),sql;function Sql(handler2){return handler2.debug=options.debug,Object.entries(options.types).reduce((acc,[name,type2])=>{return acc[name]=(x)=>new Parameter(x,type2.to),acc},typed),Object.assign(sql2,{types:typed,typed,unsafe,notify,array,json:json2,file}),sql2;function typed(value,type2){return new Parameter(value,type2)}function sql2(strings,...args){return strings&&Array.isArray(strings.raw)?new Query(strings,args,handler2,cancel):typeof strings==="string"&&!args.length?new Identifier(options.transform.column.to?options.transform.column.to(strings):strings):new Builder(strings,args)}function unsafe(string,args=[],options2={}){return arguments.length===2&&!Array.isArray(args)&&(options2=args,args=[]),new Query([string],args,handler2,cancel,{prepare:!1,...options2,simple:"simple"in options2?options2.simple:args.length===0})}function file(path2,args=[],options2={}){return arguments.length===2&&!Array.isArray(args)&&(options2=args,args=[]),new Query([],args,(query2)=>{fs.readFile(path2,"utf8",(err,string)=>{if(err)return query2.reject(err);query2.strings=[string],handler2(query2)})},cancel,{...options2,simple:"simple"in options2?options2.simple:args.length===0})}}async function listen(name,fn,onlisten){let listener={fn,onlisten},sql2=listen.sql||(listen.sql=Postgres({...options,max:1,idle_timeout:null,max_lifetime:null,fetch_types:!1,onclose(){Object.entries(listen.channels).forEach(([name2,{listeners}])=>{delete listen.channels[name2],Promise.all(listeners.map((l)=>listen(name2,l.fn,l.onlisten).catch(()=>{})))})},onnotify(c,x){c in listen.channels&&listen.channels[c].listeners.forEach((l)=>l.fn(x))}})),channels=listen.channels||(listen.channels={});if(name in channels){channels[name].listeners.push(listener);let result3=await channels[name].result;return listener.onlisten&&listener.onlisten(),{state:result3.state,unlisten}}channels[name]={result:sql2`listen ${sql2.unsafe('"'+name.replace(/"/g,'""')+'"')}`,listeners:[listener]};let result2=await channels[name].result;return listener.onlisten&&listener.onlisten(),{state:result2.state,unlisten};async function unlisten(){if(name in channels===!1)return;if(channels[name].listeners=channels[name].listeners.filter((x)=>x!==listener),channels[name].listeners.length)return;return delete channels[name],sql2`unlisten ${sql2.unsafe('"'+name.replace(/"/g,'""')+'"')}`}}async function notify(channel,payload){return await sql`select pg_notify(${channel}, ${""+payload})`}async function reserve(){let queue=queue_default(),c=open3.length?open3.shift():await new Promise((resolve3,reject)=>{let query={reserve:resolve3,reject};queries.push(query),closed.length&&connect(closed.shift(),query)});move(c,reserved),c.reserved=()=>queue.length?c.execute(queue.shift()):move(c,reserved),c.reserved.release=!0;let sql2=Sql(handler2);return sql2.release=()=>{c.reserved=null,onopen(c)},sql2;function handler2(q){c.queue===full?queue.push(q):c.execute(q)||move(c,full)}}async function begin(options2,fn){!fn&&(fn=options2,options2="");let queries2=queue_default(),savepoints=0,connection2,prepare=null;try{return await sql.unsafe("begin "+options2.replace(/[^a-z ]/ig,""),[],{onexecute}).execute(),await Promise.race([scope(connection2,fn),new Promise((_,reject)=>connection2.onclose=reject)])}catch(error){throw error}async function scope(c,fn2,name){let sql2=Sql(handler2);sql2.savepoint=savepoint,sql2.prepare=(x)=>prepare=x.replace(/[^a-z0-9$-_. ]/gi);let uncaughtError,result2;name&&await sql2`savepoint ${sql2(name)}`;try{if(result2=await new Promise((resolve3,reject)=>{let x=fn2(sql2);Promise.resolve(Array.isArray(x)?Promise.all(x):x).then(resolve3,reject)}),uncaughtError)throw uncaughtError}catch(e){throw await(name?sql2`rollback to ${sql2(name)}`:sql2`rollback`),e instanceof PostgresError&&e.code==="25P02"&&uncaughtError||e}if(!name)prepare?await sql2`prepare transaction '${sql2.unsafe(prepare)}'`:await sql2`commit`;return result2;function savepoint(name2,fn3){if(name2&&Array.isArray(name2.raw))return savepoint((sql3)=>sql3.apply(sql3,arguments));return arguments.length===1&&(fn3=name2,name2=null),scope(c,fn3,"s"+savepoints+++(name2?"_"+name2:""))}function handler2(q){q.catch((e)=>uncaughtError||(uncaughtError=e)),c.queue===full?queries2.push(q):c.execute(q)||move(c,full)}}function onexecute(c){connection2=c,move(c,reserved),c.reserved=()=>queries2.length?c.execute(queries2.shift()):move(c,reserved)}}function move(c,queue){return c.queue.remove(c),queue.push(c),c.queue=queue,queue===open3?c.idleTimer.start():c.idleTimer.cancel(),c}function json2(x){return new Parameter(x,3802)}function array(x,type2){if(!Array.isArray(x))return array(Array.from(arguments));return new Parameter(x,type2||(x.length?inferType(x)||25:0),options.shared.typeArrayMap)}function handler(query){if(ending)return query.reject(Errors.connection("CONNECTION_ENDED",options,options));if(open3.length)return go(open3.shift(),query);if(closed.length)return connect(closed.shift(),query);busy.length?go(busy.shift(),query):queries.push(query)}function go(c,query){return c.execute(query)?move(c,busy):move(c,full)}function cancel(query){return new Promise((resolve3,reject)=>{query.state?query.active?connection_default(options).cancel(query.state,resolve3,reject):query.cancelled={resolve:resolve3,reject}:(queries.remove(query),query.cancelled=!0,query.reject(Errors.generic("57014","canceling statement due to user request")),resolve3())})}async function end({timeout=null}={}){if(ending)return ending;await 1;let timer2;return ending=Promise.race([new Promise((r)=>timeout!==null&&(timer2=setTimeout(destroy,timeout*1000,r))),Promise.all(connections.map((c)=>c.end()).concat(listen.sql?listen.sql.end({timeout:0}):[],subscribe.sql?subscribe.sql.end({timeout:0}):[]))]).then(()=>clearTimeout(timer2))}async function close(){await Promise.all(connections.map((c)=>c.end()))}async function destroy(resolve3){await Promise.all(connections.map((c)=>c.terminate()));while(queries.length)queries.shift().reject(Errors.connection("CONNECTION_DESTROYED",options));resolve3()}function connect(c,query){return move(c,connecting),c.connect(query),c}function onend(c){move(c,ended)}function onopen(c){if(queries.length===0)return move(c,open3);let max=Math.ceil(queries.length/(connecting.length+1)),ready=!0;while(ready&&queries.length&&max-- >0){let query=queries.shift();if(query.reserve)return query.reserve(c);ready=c.execute(query)}ready?move(c,busy):move(c,full)}function onclose(c,e){move(c,closed),c.reserved=null,c.onclose&&(c.onclose(e),c.onclose=null),options.onclose&&options.onclose(c.id),queries.length&&connect(c,queries.shift())}}function parseOptions(a,b2){if(a&&a.shared)return a;let env=process.env,o=(!a||typeof a==="string"?b2:a)||{},{url,multihost}=parseUrl(a),query=[...url.searchParams].reduce((a2,[b3,c])=>(a2[b3]=c,a2),{}),host=o.hostname||o.host||multihost||url.hostname||env.PGHOST||"localhost",port=o.port||url.port||env.PGPORT||5432,user=o.user||o.username||url.username||env.PGUSERNAME||env.PGUSER||osUsername();o.no_prepare&&(o.prepare=!1),query.sslmode&&(query.ssl=query.sslmode,delete query.sslmode),"timeout"in o&&(console.log("The timeout option is deprecated, use idle_timeout instead"),o.idle_timeout=o.timeout),query.sslrootcert==="system"&&(query.ssl="verify-full");let ints=["idle_timeout","connect_timeout","max_lifetime","max_pipeline","backoff","keep_alive"],defaults={max:globalThis.Cloudflare?3:10,ssl:!1,sslnegotiation:null,idle_timeout:null,connect_timeout:30,max_lifetime,max_pipeline:100,backoff,keep_alive:60,prepare:!0,debug:!1,fetch_types:!0,publications:"alltables",target_session_attrs:null};return{host:Array.isArray(host)?host:host.split(",").map((x)=>x.split(":")[0]),port:Array.isArray(port)?port:host.split(",").map((x)=>parseInt(x.split(":")[1]||port)),path:o.path||host.indexOf("/")>-1&&host+"/.s.PGSQL."+port,database:o.database||o.db||(url.pathname||"").slice(1)||env.PGDATABASE||user,user,pass:o.pass||o.password||url.password||env.PGPASSWORD||"",...Object.entries(defaults).reduce((acc,[k,d])=>{let value=k in o?o[k]:(k in query)?query[k]==="disable"||query[k]==="false"?!1:query[k]:env["PG"+k.toUpperCase()]||d;return acc[k]=typeof value==="string"&&ints.includes(k)?+value:value,acc},{}),connection:{application_name:env.PGAPPNAME||"postgres.js",...o.connection,...Object.entries(query).reduce((acc,[k,v])=>((k in defaults)||(acc[k]=v),acc),{})},types:o.types||{},target_session_attrs:tsa(o,url,env),onnotice:o.onnotice,onnotify:o.onnotify,onclose:o.onclose,onparameter:o.onparameter,socket:o.socket,transform:parseTransform(o.transform||{undefined:void 0}),parameters:{},shared:{retries:0,typeArrayMap:{}},...mergeUserTypes(o.types)}}function tsa(o,url,env){let x=o.target_session_attrs||url.searchParams.get("target_session_attrs")||env.PGTARGETSESSIONATTRS;if(!x||["read-write","read-only","primary","standby","prefer-standby"].includes(x))return x;throw Error("target_session_attrs "+x+" is not supported")}function backoff(retries){return(0.5+Math.random()/2)*Math.min(3**retries/100,20)}function max_lifetime(){return 60*(30+Math.random()*30)}function parseTransform(x){return{undefined:x.undefined,column:{from:typeof x.column==="function"?x.column:x.column&&x.column.from,to:x.column&&x.column.to},value:{from:typeof x.value==="function"?x.value:x.value&&x.value.from,to:x.value&&x.value.to},row:{from:typeof x.row==="function"?x.row:x.row&&x.row.from,to:x.row&&x.row.to}}}function parseUrl(url){if(!url||typeof url!=="string")return{url:{searchParams:new Map}};let host=url;host=host.slice(host.indexOf("://")+3).split(/[?/]/)[0],host=decodeURIComponent(host.slice(host.indexOf("@")+1));let urlObj=new URL(url.replace(host,host.split(",")[0]));return{url:{username:decodeURIComponent(urlObj.username),password:decodeURIComponent(urlObj.password),host:urlObj.host,hostname:urlObj.hostname,port:urlObj.port,pathname:urlObj.pathname,searchParams:urlObj.searchParams},multihost:host.indexOf(",")>-1&&host}}function osUsername(){try{return os.userInfo().username}catch(_){return process.env.USERNAME||process.env.USER||process.env.LOGNAME}}var src_default;var init_src=__esm(()=>{init_types3();init_connection();init_query();init_queue();init_errors2();init_large();Object.assign(Postgres,{PostgresError,toPascal,pascal,toCamel,camel,toKebab,kebab,fromPascal,fromCamel,fromKebab,BigInt:{to:20,from:[20],parse:(x)=>BigInt(x),serialize:(x)=>x.toString()}});src_default=Postgres});var exports_db={};__export(exports_db,{shutdown:()=>shutdown,runRetention:()=>runRetention,resolveTcpPgPassword:()=>resolveTcpPgPassword,resolvePgserveSocketDir:()=>resolvePgserveSocketDir,resolvePgserveLibpqSocketPath:()=>resolvePgserveLibpqSocketPath,resolvePgserveDaemonPidPath:()=>resolvePgserveDaemonPidPath,resolvePgserveControlSocketPath:()=>resolvePgserveControlSocketPath,resolvePgserveAuthPassword:()=>resolvePgserveAuthPassword,resolveDatabaseName:()=>resolveDatabaseName,resetConnection:()=>resetConnection,probePgserveDaemon:()=>probePgserveDaemon,isSocketMode:()=>isSocketMode,isConnected:()=>isConnected,isAvailable:()=>isAvailable,getOrStartDaemon:()=>getOrStartDaemon,getLockfilePath:()=>getLockfilePath,getDataDir:()=>getDataDir,getConnection:()=>getConnection,getAuxiliaryPortBase:()=>getAuxiliaryPortBase,getActivePort:()=>getActivePort,ensurePgserve:()=>ensurePgserve,checkRootGuard:()=>checkRootGuard,autoStartDaemon:()=>autoStartDaemon,__setSpawnDaemonForTest:()=>__setSpawnDaemonForTest,DB_NAME:()=>DB_NAME});import{execFileSync,execSync as execSync3,spawn}from"child_process";import{existsSync as existsSync13,mkdirSync as mkdirSync6,readFileSync as readFileSync9,renameSync,unlinkSync as unlinkSync3,writeFileSync as writeFileSync6}from"fs";import{createConnection}from"net";import{homedir as homedir11}from"os";import{basename as basename2,dirname as dirname5,join as join17}from"path";import{pathToFileURL}from"url";function resolvePgserveSocketDir(){let xdg=process.env.XDG_RUNTIME_DIR,base=xdg&&xdg.length>0?xdg:"/tmp";return join17(base,"pgserve")}function resolveDatabaseName(){let testDbName=process.env.GENIE_TEST_DB_NAME;if(testDbName&&testDbName.length>0)return testDbName;return DB_NAME}function resolvePgserveAuthPassword(){let password=process.env.PGPASSWORD;return password&&password.length>0?password:DB_NAME}function resolvePgserveTimeoutMs(){let parsed=Number(process.env.GENIE_PGSERVE_TIMEOUT);return Number.isFinite(parsed)&&parsed>0?parsed:16000}function resolvePgConnectTimeoutSeconds(useSocket){let parsed=Number(process.env.GENIE_PG_CONNECT_TIMEOUT);if(Number.isFinite(parsed)&&parsed>0)return Math.ceil(parsed);if(!useSocket)return 5;return Math.max(16,Math.ceil(resolvePgserveTimeoutMs()/1000))}function resolveTcpPgPassword(){return resolvePgserveAuthPassword()}function resolvePgserveLibpqSocketPath(){return join17(resolvePgserveSocketDir(),".s.PGSQL.5432")}function resolvePgserveControlSocketPath(){return join17(resolvePgserveSocketDir(),"control.sock")}function resolvePgserveDaemonPidPath(){return join17(resolvePgserveSocketDir(),"pgserve.pid")}function probePgserveDaemon(){let socketPresent=existsSync13(resolvePgserveLibpqSocketPath()),pid=liveDaemonPid(readDaemonPid(resolvePgserveDaemonPidPath()));if(socketPresent&&pid!==null)return{running:!0,pid,socketPresent:!0};if(!socketPresent&&pid===null)return{running:!1,pid:null,socketPresent:!1,reason:"no daemon"};return{running:!1,pid,socketPresent,reason:socketPresent?"socket present but pid stale":"pid alive but no socket"}}function readDaemonPid(pidPath){if(!existsSync13(pidPath))return null;try{let raw=readFileSync9(pidPath,"utf-8").trim(),parsed=Number.parseInt(raw,10);return Number.isInteger(parsed)&&parsed>0?parsed:null}catch{return null}}function liveDaemonPid(pid){if(pid===null)return null;try{return process.kill(pid,0),pid}catch(err){return err.code==="EPERM"?pid:null}}function findLocalPgserveRoot(){let candidates=[join17(import.meta.dir,"..","node_modules","pgserve"),join17(import.meta.dir,"..","..","node_modules","pgserve")];for(let root of candidates)if(existsSync13(join17(root,"package.json")))return root;return null}function resolveLocalPgserveEntry(){let root=findLocalPgserveRoot();if(root===null)return null;try{let pkg=JSON.parse(readFileSync9(join17(root,"package.json"),"utf-8"));return join17(root,pkg.main??"src/index.js")}catch{return join17(root,"src/index.js")}}async function importPgserveSdk(){let localEntry=resolveLocalPgserveEntry();if(localEntry!==null&&existsSync13(localEntry))try{return await import(pathToFileURL(localEntry).href)}catch{}try{return await import("pgserve")}catch{return null}}function findPgserveDaemonCommand(){let localRoot=findLocalPgserveRoot();if(localRoot!==null){let localCommand=resolvePgservePackageCommand(localRoot);if(localCommand!==null)return localCommand}try{let resolved=__require.resolve("pgserve/bin/pgserve-wrapper.cjs"),packageCommand=resolvePgservePackageCommand(join17(dirname5(resolved),".."));if(packageCommand!==null)return packageCommand}catch{}let globalBin=join17(homedir11(),".bun","bin","pgserve");if(existsSync13(globalBin))return{command:globalBin,argsPrefix:[],display:globalBin};try{let fromPath=execSync3("which pgserve",{encoding:"utf-8",timeout:3000}).trim();if(fromPath.length>0)return{command:fromPath,argsPrefix:[],display:fromPath}}catch{}return null}function resolvePgservePackageCommand(root){let script=join17(root,"bin","postgres-server.js"),bun=findBunRuntime();if(existsSync13(script)&&bun!==null)return{command:bun,argsPrefix:[script],display:`${bun} ${script}`};let wrapper=join17(root,"bin","pgserve-wrapper.cjs");if(existsSync13(wrapper))return{command:wrapper,argsPrefix:[],display:wrapper};return null}function findBunRuntime(){if(process.execPath&&existsSync13(process.execPath)&&basename2(process.execPath).startsWith("bun"))return process.execPath;let homeBun=join17(homedir11(),".bun","bin",process.platform==="win32"?"bun.exe":"bun");if(existsSync13(homeBun))return homeBun;try{let fromPath=execSync3("which bun",{encoding:"utf-8",timeout:3000}).trim();if(fromPath.length>0)return fromPath}catch{}return null}function sleep(ms){return new Promise((r)=>setTimeout(r,ms))}async function getOrStartDaemon(){if(process.env.GENIE_PG_DISABLE_AUTOSTART==="1"||isPgAutostartDisabled()){let state=probePgserveDaemon();if(state.running&&await isPgserveSocketResponsive())return state;throw Error("pgserve daemon unavailable and PG autostart is disabled")}let initial=probePgserveDaemon();if(initial.running){if(await isPgserveSocketResponsive())return initial;await recoverUnresponsivePgserveDaemon(initial)}if(process.env.CI==="true"&&process.env.GENIE_PG_ALLOW_CI_AUTOSTART!=="1")throw Error("pgserve v2 daemon socket not present and CI=true. Either start `pgserve daemon` in the workflow or set GENIE_PG_ALLOW_CI_AUTOSTART=1 to opt in.");let rootErr=checkRootGuard();if(rootErr!==null)throw Error(rootErr);if(initial.reason==="socket present but pid stale"&&await isPgserveSocketResponsive())return{running:!0,pid:null,socketPresent:!0,reason:"socket completes pgserve greeting but pid file is stale"};if(daemonStartPromise)return await daemonStartPromise,probePgserveDaemon();daemonStartPromise=startPgserveDaemonOnce(initial);try{await daemonStartPromise}finally{daemonStartPromise=null}return probePgserveDaemon()}function cleanPartialDaemonState(initial){if(initial.reason==="pid alive but no socket"&&initial.pid!==null)unlinkIfPresent(resolvePgserveDaemonPidPath());if(initial.reason==="socket present but pid stale")removeStalePgserveSocketArtifacts()}async function recoverUnresponsivePgserveDaemon(state){if(state.pid!==null&&isLikelyPgserveDaemonProcess(state.pid)){if(await signalPgserveDaemonPid(state.pid,"SIGTERM"),liveDaemonPid(state.pid)!==null)await signalPgserveDaemonPid(state.pid,"SIGKILL")}removeStalePgserveSocketArtifacts()}function isLikelyPgserveDaemonProcess(pid){try{let command=execFileSync("ps",["-p",String(pid),"-o","command="],{encoding:"utf-8",timeout:1000}).trim();return command.includes("pgserve")||command.includes("postgres-server.js")||command.includes("postgres")&&command.includes(DATA_DIR)}catch{return!1}}async function signalPgserveDaemonPid(pid,signal){let signaled=!1;try{process.kill(-pid,signal),signaled=!0}catch{}try{process.kill(pid,signal),signaled=!0}catch{}if(!signaled)return;let deadline=Date.now()+(signal==="SIGTERM"?1000:250);while(Date.now()<deadline){if(liveDaemonPid(pid)===null)return;await sleep(50)}}async function isPgserveSocketResponsive(){let candidates=[resolvePgserveLibpqSocketPath(),resolvePgserveControlSocketPath()].filter((path2)=>existsSync13(path2));for(let path2 of candidates)if(await canCompletePgserveGreet(path2))return!0;return!1}function canCompletePgserveGreet(path2){return new Promise((resolve3)=>{let settled=!1,timer2=null,socket=null,finish=(ok)=>{if(settled)return;if(settled=!0,timer2)clearTimeout(timer2);socket?.removeAllListeners(),socket?.destroy(),resolve3(ok)},request=Buffer.alloc(8);request.writeUInt32BE(8,0),request.writeUInt32BE(PG_SSL_REQUEST_CODE,4),socket=createConnection(path2),timer2=setTimeout(()=>finish(!1),PGSERVE_GREET_TIMEOUT_MS),timer2.unref(),socket.once("connect",()=>socket?.write(request)),socket.once("data",(chunk)=>finish(chunk[0]===78||chunk[0]===83)),socket.once("error",()=>finish(!1))})}function removeStalePgserveSocketArtifacts(){for(let path2 of[resolvePgserveDaemonPidPath(),resolvePgserveLibpqSocketPath(),resolvePgserveControlSocketPath()])unlinkIfPresent(path2)}function unlinkIfPresent(path2){try{unlinkSync3(path2)}catch{}}async function startPgserveDaemonOnce(initial){cleanPartialDaemonState(initial);let daemonCommand=findPgserveDaemonCommand();if(daemonCommand===null){if(await tryEnsureDaemonWithSdk())return;throw Error("pgserve binary not found. Install with `bun add pgserve@^2.0.2` (or `npm i pgserve@^2.0.2`), or start `pgserve daemon` manually before running genie.")}mkdirSync6(resolvePgserveSocketDir(),{recursive:!0,mode:448});let child=spawn(daemonCommand.command,[...daemonCommand.argsPrefix,"daemon","--data",DATA_DIR,"--log","warn"],{detached:!0,stdio:"ignore",env:{...process.env}});try{await waitForDaemonSocket(daemonCommand,child),child.unref()}catch(err){throw await terminatePgserveTree(child),err}}async function waitForDaemonSocket(daemonCommand,child){let socketPath=resolvePgserveLibpqSocketPath(),timeout=resolvePgserveTimeoutMs(),deadline=Date.now()+timeout,childExit=null;child?.once("exit",(code,signal)=>{childExit=signal?`signal ${signal}`:`exit code ${code??"unknown"}`});while(Date.now()<deadline){if(existsSync13(socketPath)&&await isPgserveSocketResponsive())return;if(childExit!==null)throw Error(`pgserve v2 daemon exited before binding ${socketPath} (${childExit}). Try starting it manually: ${formatPgserveDaemonCommand(daemonCommand)}`);await sleep(250)}throw Error(`pgserve v2 daemon did not bind ${socketPath} within ${Math.round(timeout/1000)}s. Try starting it manually: ${formatPgserveDaemonCommand(daemonCommand)}`)}function formatPgserveDaemonCommand(daemonCommand){return`${daemonCommand.display} daemon --data ${DATA_DIR} --log warn`}async function tryEnsureDaemonWithSdk(){let sdk=await importPgserveSdk();if(sdk===null)return!1;if(typeof sdk.ensureDaemon!=="function")return!1;try{let state=await sdk.ensureDaemon({dataDir:DATA_DIR,logLevel:"warn",timeoutMs:resolvePgserveTimeoutMs(),controlSocketDir:resolvePgserveSocketDir()});if(!state.running||!(state.libpqSocketPresent??state.socketPresent??!0))return!1;if(await isPgserveSocketResponsive())return!0;return await recoverUnresponsivePgserveDaemon(probePgserveDaemon()),!1}catch{let state=probePgserveDaemon();if(state.running)await recoverUnresponsivePgserveDaemon(state);else cleanPartialDaemonState(state);return!1}}function maskCredentials(url){return url.replace(/\/\/.*@/,"//***@")}function checkRootGuard(){if(process.getuid?.()!==0)return null;if(process.env.GENIE_ALLOW_ROOT==="1")return null;return"pgserve cannot start under uid 0 (root) \u2014 PostgreSQL refuses to run as root for security reasons. "+"Run genie as a non-root user, or set GENIE_ALLOW_ROOT=1 to attempt anyway. See: https://github.com/automagik-dev/genie/issues/1226"}function isPgAutostartDisabled(){let value=process.env.GENIE_PG_NO_AUTOSTART;return value!==void 0&&TRUTHY_ENV.has(value.trim().toLowerCase())}function selfHealPostgres(dataDir){try{execSync3(`pkill -9 -f "postgres.*${dataDir.replace(/\//g,"\\/")}" 2>/dev/null || true`,{stdio:"ignore",timeout:5000}),execSync3(`pkill -9 -f "pgserve.*${dataDir.replace(/\//g,"\\/")}" 2>/dev/null || true`,{stdio:"ignore",timeout:5000})}catch{}let pidFile=join17(dataDir,"postmaster.pid");if(existsSync13(pidFile))try{unlinkSync3(pidFile)}catch{}try{execSync3("ipcs -m 2>/dev/null | awk '$6 == 0 {print $2}' | xargs -I{} ipcrm -m {} 2>/dev/null || true",{stdio:"ignore",timeout:5000})}catch{}}function signalPgserveTree(child,signal){let pid=child.pid;if(pid===void 0){try{child.kill(signal)}catch{}return}try{if(process.platform==="win32")child.kill(signal);else process.kill(-pid,signal)}catch{try{child.kill(signal)}catch{}}}async function terminatePgserveTree(child){if(signalPgserveTree(child,"SIGTERM"),!await new Promise((resolve3)=>{if(child.exitCode!==null||child.signalCode!==null){resolve3(!0);return}let timer2=setTimeout(()=>resolve3(!1),1000);timer2.unref(),child.once("exit",()=>{clearTimeout(timer2),resolve3(!0)})}))signalPgserveTree(child,"SIGKILL")}function getPort(){let envPort=process.env.GENIE_PG_PORT;if(envPort){let parsed=Number.parseInt(envPort,10);if(!Number.isNaN(parsed)&&parsed>0&&parsed<65536)return parsed}return DEFAULT_PORT}async function isPostgresHealthy(port){try{return await Promise.race([(async()=>{let pg=(await Promise.resolve().then(() => (init_src(),exports_src))).default,probe=pg({host:DEFAULT_HOST,port,database:DB_NAME,username:DB_NAME,password:resolveTcpPgPassword(),max:1,connect_timeout:3,idle_timeout:1});try{return await probe`SELECT 1`,await probe.end({timeout:2}),!0}catch{try{await probe.end({timeout:1})}catch{}return!1}})(),new Promise((resolve3)=>{setTimeout(()=>resolve3(!1),4000).unref()})])}catch{return!1}}function readLockfile(){try{let content=readFileSync9(LOCKFILE_PATH,"utf-8").trim(),port=Number.parseInt(content,10);if(!Number.isNaN(port)&&port>0&&port<65536)return port}catch{}return null}function writeLockfile(port){try{mkdirSync6(GENIE_HOME,{recursive:!0});let tmpPath=`${LOCKFILE_PATH}.tmp.${process.pid}`;writeFileSync6(tmpPath,String(port),"utf-8"),renameSync(tmpPath,LOCKFILE_PATH)}catch{}}function removeLockfile(){try{unlinkSync3(LOCKFILE_PATH)}catch{}}async function runRetention(sql){if(retentionRan)return;try{await sql.unsafe(`
678
+ `};return resolve3(lo),new Promise(async(r)=>finish=r);async function readable({highWaterMark=16384,start=0,end=1/0}={}){let max=end-start;return start&&await lo.seek(start),new Stream2.Readable({highWaterMark,async read(size){let l=size>max?size-max:size;max-=size;let[{data}]=await lo.read(l);if(this.push(data),data.length<size)this.push(null)}})}async function writable({highWaterMark=16384,start=0}={}){return start&&await lo.seek(start),new Stream2.Writable({highWaterMark,write(chunk,encoding,callback){lo.write(chunk).then(()=>callback(),callback)}})}}).catch(reject)})}var init_large=()=>{};var exports_src={};__export(exports_src,{default:()=>src_default});import os from"os";import fs from"fs";function Postgres(a,b2){let options=parseOptions(a,b2),subscribe=options.no_subscribe||Subscribe(Postgres,{...options}),ending=!1,queries=queue_default(),connecting=queue_default(),reserved=queue_default(),closed=queue_default(),ended=queue_default(),open3=queue_default(),busy=queue_default(),full=queue_default(),queues={connecting,reserved,closed,ended,open:open3,busy,full},connections=[...Array(options.max)].map(()=>connection_default(options,queues,{onopen,onend,onclose})),sql=Sql(handler);return Object.assign(sql,{get parameters(){return options.parameters},largeObject:largeObject.bind(null,sql),subscribe,CLOSE,END:CLOSE,PostgresError,options,reserve,listen,begin,close,end}),sql;function Sql(handler2){return handler2.debug=options.debug,Object.entries(options.types).reduce((acc,[name,type2])=>{return acc[name]=(x)=>new Parameter(x,type2.to),acc},typed),Object.assign(sql2,{types:typed,typed,unsafe,notify,array,json:json2,file}),sql2;function typed(value,type2){return new Parameter(value,type2)}function sql2(strings,...args){return strings&&Array.isArray(strings.raw)?new Query(strings,args,handler2,cancel):typeof strings==="string"&&!args.length?new Identifier(options.transform.column.to?options.transform.column.to(strings):strings):new Builder(strings,args)}function unsafe(string,args=[],options2={}){return arguments.length===2&&!Array.isArray(args)&&(options2=args,args=[]),new Query([string],args,handler2,cancel,{prepare:!1,...options2,simple:"simple"in options2?options2.simple:args.length===0})}function file(path2,args=[],options2={}){return arguments.length===2&&!Array.isArray(args)&&(options2=args,args=[]),new Query([],args,(query2)=>{fs.readFile(path2,"utf8",(err,string)=>{if(err)return query2.reject(err);query2.strings=[string],handler2(query2)})},cancel,{...options2,simple:"simple"in options2?options2.simple:args.length===0})}}async function listen(name,fn,onlisten){let listener={fn,onlisten},sql2=listen.sql||(listen.sql=Postgres({...options,max:1,idle_timeout:null,max_lifetime:null,fetch_types:!1,onclose(){Object.entries(listen.channels).forEach(([name2,{listeners}])=>{delete listen.channels[name2],Promise.all(listeners.map((l)=>listen(name2,l.fn,l.onlisten).catch(()=>{})))})},onnotify(c,x){c in listen.channels&&listen.channels[c].listeners.forEach((l)=>l.fn(x))}})),channels=listen.channels||(listen.channels={});if(name in channels){channels[name].listeners.push(listener);let result3=await channels[name].result;return listener.onlisten&&listener.onlisten(),{state:result3.state,unlisten}}channels[name]={result:sql2`listen ${sql2.unsafe('"'+name.replace(/"/g,'""')+'"')}`,listeners:[listener]};let result2=await channels[name].result;return listener.onlisten&&listener.onlisten(),{state:result2.state,unlisten};async function unlisten(){if(name in channels===!1)return;if(channels[name].listeners=channels[name].listeners.filter((x)=>x!==listener),channels[name].listeners.length)return;return delete channels[name],sql2`unlisten ${sql2.unsafe('"'+name.replace(/"/g,'""')+'"')}`}}async function notify(channel,payload){return await sql`select pg_notify(${channel}, ${""+payload})`}async function reserve(){let queue=queue_default(),c=open3.length?open3.shift():await new Promise((resolve3,reject)=>{let query={reserve:resolve3,reject};queries.push(query),closed.length&&connect(closed.shift(),query)});move(c,reserved),c.reserved=()=>queue.length?c.execute(queue.shift()):move(c,reserved),c.reserved.release=!0;let sql2=Sql(handler2);return sql2.release=()=>{c.reserved=null,onopen(c)},sql2;function handler2(q){c.queue===full?queue.push(q):c.execute(q)||move(c,full)}}async function begin(options2,fn){!fn&&(fn=options2,options2="");let queries2=queue_default(),savepoints=0,connection2,prepare=null;try{return await sql.unsafe("begin "+options2.replace(/[^a-z ]/ig,""),[],{onexecute}).execute(),await Promise.race([scope(connection2,fn),new Promise((_,reject)=>connection2.onclose=reject)])}catch(error){throw error}async function scope(c,fn2,name){let sql2=Sql(handler2);sql2.savepoint=savepoint,sql2.prepare=(x)=>prepare=x.replace(/[^a-z0-9$-_. ]/gi);let uncaughtError,result2;name&&await sql2`savepoint ${sql2(name)}`;try{if(result2=await new Promise((resolve3,reject)=>{let x=fn2(sql2);Promise.resolve(Array.isArray(x)?Promise.all(x):x).then(resolve3,reject)}),uncaughtError)throw uncaughtError}catch(e){throw await(name?sql2`rollback to ${sql2(name)}`:sql2`rollback`),e instanceof PostgresError&&e.code==="25P02"&&uncaughtError||e}if(!name)prepare?await sql2`prepare transaction '${sql2.unsafe(prepare)}'`:await sql2`commit`;return result2;function savepoint(name2,fn3){if(name2&&Array.isArray(name2.raw))return savepoint((sql3)=>sql3.apply(sql3,arguments));return arguments.length===1&&(fn3=name2,name2=null),scope(c,fn3,"s"+savepoints+++(name2?"_"+name2:""))}function handler2(q){q.catch((e)=>uncaughtError||(uncaughtError=e)),c.queue===full?queries2.push(q):c.execute(q)||move(c,full)}}function onexecute(c){connection2=c,move(c,reserved),c.reserved=()=>queries2.length?c.execute(queries2.shift()):move(c,reserved)}}function move(c,queue){return c.queue.remove(c),queue.push(c),c.queue=queue,queue===open3?c.idleTimer.start():c.idleTimer.cancel(),c}function json2(x){return new Parameter(x,3802)}function array(x,type2){if(!Array.isArray(x))return array(Array.from(arguments));return new Parameter(x,type2||(x.length?inferType(x)||25:0),options.shared.typeArrayMap)}function handler(query){if(ending)return query.reject(Errors.connection("CONNECTION_ENDED",options,options));if(open3.length)return go(open3.shift(),query);if(closed.length)return connect(closed.shift(),query);busy.length?go(busy.shift(),query):queries.push(query)}function go(c,query){return c.execute(query)?move(c,busy):move(c,full)}function cancel(query){return new Promise((resolve3,reject)=>{query.state?query.active?connection_default(options).cancel(query.state,resolve3,reject):query.cancelled={resolve:resolve3,reject}:(queries.remove(query),query.cancelled=!0,query.reject(Errors.generic("57014","canceling statement due to user request")),resolve3())})}async function end({timeout=null}={}){if(ending)return ending;await 1;let timer2;return ending=Promise.race([new Promise((r)=>timeout!==null&&(timer2=setTimeout(destroy,timeout*1000,r))),Promise.all(connections.map((c)=>c.end()).concat(listen.sql?listen.sql.end({timeout:0}):[],subscribe.sql?subscribe.sql.end({timeout:0}):[]))]).then(()=>clearTimeout(timer2))}async function close(){await Promise.all(connections.map((c)=>c.end()))}async function destroy(resolve3){await Promise.all(connections.map((c)=>c.terminate()));while(queries.length)queries.shift().reject(Errors.connection("CONNECTION_DESTROYED",options));resolve3()}function connect(c,query){return move(c,connecting),c.connect(query),c}function onend(c){move(c,ended)}function onopen(c){if(queries.length===0)return move(c,open3);let max=Math.ceil(queries.length/(connecting.length+1)),ready=!0;while(ready&&queries.length&&max-- >0){let query=queries.shift();if(query.reserve)return query.reserve(c);ready=c.execute(query)}ready?move(c,busy):move(c,full)}function onclose(c,e){move(c,closed),c.reserved=null,c.onclose&&(c.onclose(e),c.onclose=null),options.onclose&&options.onclose(c.id),queries.length&&connect(c,queries.shift())}}function parseOptions(a,b2){if(a&&a.shared)return a;let env=process.env,o=(!a||typeof a==="string"?b2:a)||{},{url,multihost}=parseUrl(a),query=[...url.searchParams].reduce((a2,[b3,c])=>(a2[b3]=c,a2),{}),host=o.hostname||o.host||multihost||url.hostname||env.PGHOST||"localhost",port=o.port||url.port||env.PGPORT||5432,user=o.user||o.username||url.username||env.PGUSERNAME||env.PGUSER||osUsername();o.no_prepare&&(o.prepare=!1),query.sslmode&&(query.ssl=query.sslmode,delete query.sslmode),"timeout"in o&&(console.log("The timeout option is deprecated, use idle_timeout instead"),o.idle_timeout=o.timeout),query.sslrootcert==="system"&&(query.ssl="verify-full");let ints=["idle_timeout","connect_timeout","max_lifetime","max_pipeline","backoff","keep_alive"],defaults={max:globalThis.Cloudflare?3:10,ssl:!1,sslnegotiation:null,idle_timeout:null,connect_timeout:30,max_lifetime,max_pipeline:100,backoff,keep_alive:60,prepare:!0,debug:!1,fetch_types:!0,publications:"alltables",target_session_attrs:null};return{host:Array.isArray(host)?host:host.split(",").map((x)=>x.split(":")[0]),port:Array.isArray(port)?port:host.split(",").map((x)=>parseInt(x.split(":")[1]||port)),path:o.path||host.indexOf("/")>-1&&host+"/.s.PGSQL."+port,database:o.database||o.db||(url.pathname||"").slice(1)||env.PGDATABASE||user,user,pass:o.pass||o.password||url.password||env.PGPASSWORD||"",...Object.entries(defaults).reduce((acc,[k,d])=>{let value=k in o?o[k]:(k in query)?query[k]==="disable"||query[k]==="false"?!1:query[k]:env["PG"+k.toUpperCase()]||d;return acc[k]=typeof value==="string"&&ints.includes(k)?+value:value,acc},{}),connection:{application_name:env.PGAPPNAME||"postgres.js",...o.connection,...Object.entries(query).reduce((acc,[k,v])=>((k in defaults)||(acc[k]=v),acc),{})},types:o.types||{},target_session_attrs:tsa(o,url,env),onnotice:o.onnotice,onnotify:o.onnotify,onclose:o.onclose,onparameter:o.onparameter,socket:o.socket,transform:parseTransform(o.transform||{undefined:void 0}),parameters:{},shared:{retries:0,typeArrayMap:{}},...mergeUserTypes(o.types)}}function tsa(o,url,env){let x=o.target_session_attrs||url.searchParams.get("target_session_attrs")||env.PGTARGETSESSIONATTRS;if(!x||["read-write","read-only","primary","standby","prefer-standby"].includes(x))return x;throw Error("target_session_attrs "+x+" is not supported")}function backoff(retries){return(0.5+Math.random()/2)*Math.min(3**retries/100,20)}function max_lifetime(){return 60*(30+Math.random()*30)}function parseTransform(x){return{undefined:x.undefined,column:{from:typeof x.column==="function"?x.column:x.column&&x.column.from,to:x.column&&x.column.to},value:{from:typeof x.value==="function"?x.value:x.value&&x.value.from,to:x.value&&x.value.to},row:{from:typeof x.row==="function"?x.row:x.row&&x.row.from,to:x.row&&x.row.to}}}function parseUrl(url){if(!url||typeof url!=="string")return{url:{searchParams:new Map}};let host=url;host=host.slice(host.indexOf("://")+3).split(/[?/]/)[0],host=decodeURIComponent(host.slice(host.indexOf("@")+1));let urlObj=new URL(url.replace(host,host.split(",")[0]));return{url:{username:decodeURIComponent(urlObj.username),password:decodeURIComponent(urlObj.password),host:urlObj.host,hostname:urlObj.hostname,port:urlObj.port,pathname:urlObj.pathname,searchParams:urlObj.searchParams},multihost:host.indexOf(",")>-1&&host}}function osUsername(){try{return os.userInfo().username}catch(_){return process.env.USERNAME||process.env.USER||process.env.LOGNAME}}var src_default;var init_src=__esm(()=>{init_types3();init_connection();init_query();init_queue();init_errors2();init_large();Object.assign(Postgres,{PostgresError,toPascal,pascal,toCamel,camel,toKebab,kebab,fromPascal,fromCamel,fromKebab,BigInt:{to:20,from:[20],parse:(x)=>BigInt(x),serialize:(x)=>x.toString()}});src_default=Postgres});async function maybePromptV1Migration(target){if(promptedThisProcess)return;if(promptedThisProcess=!0,process.env.GENIE_NO_V1_PROMPT==="1")return;if(process.env.GENIE_QUIET==="1")return;if(process.env.GENIE_TEST_DB_NAME)return;if(process.env.GENIE_NO_BANNER==="1")return;let detection;try{detection=await detectV1State(target)}catch{return}if(!detection.v1Exists)return;if(detection.alreadyMigrated)return;let{tasks=0,wishes=0,teams=0,sessions=0}=detection.v1Counts??{};if(!Boolean(process.stderr.isTTY)){process.stderr.write(`[genie] \u24D8 Legacy v1 data detected (${tasks} tasks, ${wishes} wishes, ${teams} teams, ${sessions} sessions).
679
+ Run \`genie db migrate-v1\` to import. Suppress with GENIE_NO_V1_PROMPT=1.
680
+ `);return}process.stderr.write(`[genie] \u26A0 Legacy v1 data detected (${tasks} tasks, ${wishes} wishes, ${teams} teams, ${sessions} sessions, last 30d).
681
+ Run \`genie db migrate-v1\` to import.
682
+ (one-time offer \u2014 silent after first migration; or set GENIE_NO_V1_PROMPT=1)
683
+ `)}async function detectV1State(target){if(await ensureMigrationStateTable(target),(await target`
684
+ SELECT source_db FROM _genie_migration_state WHERE source_db = ${V1_DB_NAME}
685
+ `).length>0)return{v1Exists:!1,alreadyMigrated:!0};let portRows=await target`SHOW port`,port=Number(portRows[0]?.port);if(!Number.isFinite(port)||port<=0)return{v1Exists:!1,alreadyMigrated:!1};let v1=src_default({host:PG_HOST,port,username:PG_USER,password:PG_PASS,database:V1_DB_NAME,max:1,onnotice:()=>{},connect_timeout:3,idle_timeout:1});try{let probe=await v1`
686
+ SELECT relname, n_live_tup FROM pg_stat_user_tables
687
+ WHERE schemaname='public'
688
+ AND relname IN ('tasks','wishes','teams','sessions')
689
+ `;if(probe.length===0)return{v1Exists:!1,alreadyMigrated:!1};let counts={tasks:0,wishes:0,teams:0,sessions:0};for(let r of probe){let n=Number(r.n_live_tup);if(r.relname==="tasks")counts.tasks=n;else if(r.relname==="wishes")counts.wishes=n;else if(r.relname==="teams")counts.teams=n;else if(r.relname==="sessions")counts.sessions=n}return{v1Exists:!0,v1Counts:counts,alreadyMigrated:!1}}catch(_err){return{v1Exists:!1,alreadyMigrated:!1}}finally{try{await v1.end({timeout:1})}catch{}}}async function ensureMigrationStateTable(target){await target.unsafe(`
690
+ CREATE TABLE IF NOT EXISTS _genie_migration_state (
691
+ source_db TEXT PRIMARY KEY,
692
+ completed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
693
+ rows_copied JSONB NOT NULL DEFAULT '{}'::jsonb,
694
+ notes TEXT
695
+ )
696
+ `)}async function recordMigrationComplete(target,sourceDb,rowsCopied){await ensureMigrationStateTable(target),await target.unsafe(`INSERT INTO _genie_migration_state (source_db, rows_copied)
697
+ VALUES ($1, $2::jsonb)
698
+ ON CONFLICT (source_db) DO UPDATE SET completed_at = now(), rows_copied = EXCLUDED.rows_copied`,[sourceDb,JSON.stringify(rowsCopied)])}var V1_DB_NAME="genie",PG_USER="postgres",PG_PASS="postgres",PG_HOST="127.0.0.1",promptedThisProcess=!1;var init_v1_migration_prompt=__esm(()=>{init_src()});var exports_db={};__export(exports_db,{shutdown:()=>shutdown,runRetention:()=>runRetention,resolveTcpPgPassword:()=>resolveTcpPgPassword,resolvePgserveSocketDir:()=>resolvePgserveSocketDir,resolvePgserveLibpqSocketPath:()=>resolvePgserveLibpqSocketPath,resolvePgserveDaemonPidPath:()=>resolvePgserveDaemonPidPath,resolvePgserveControlSocketPath:()=>resolvePgserveControlSocketPath,resolvePgserveAuthPassword:()=>resolvePgserveAuthPassword,resolveDatabaseName:()=>resolveDatabaseName,resetConnection:()=>resetConnection,probePgserveDaemon:()=>probePgserveDaemon,isSocketMode:()=>isSocketMode,isConnected:()=>isConnected,isAvailable:()=>isAvailable,getOrStartDaemon:()=>getOrStartDaemon,getLockfilePath:()=>getLockfilePath,getDataDir:()=>getDataDir,getConnection:()=>getConnection,getAuxiliaryPortBase:()=>getAuxiliaryPortBase,getActivePort:()=>getActivePort,ensurePgserve:()=>ensurePgserve,checkRootGuard:()=>checkRootGuard,autoStartDaemon:()=>autoStartDaemon,__setSpawnDaemonForTest:()=>__setSpawnDaemonForTest,DB_NAME:()=>DB_NAME});import{execFileSync,execSync as execSync3,spawn}from"child_process";import{existsSync as existsSync13,mkdirSync as mkdirSync6,readFileSync as readFileSync9,renameSync,unlinkSync as unlinkSync3,writeFileSync as writeFileSync6}from"fs";import{createConnection}from"net";import{homedir as homedir11}from"os";import{basename as basename2,dirname as dirname5,join as join17}from"path";import{pathToFileURL}from"url";function resolvePgserveSocketDir(){let xdg=process.env.XDG_RUNTIME_DIR,base=xdg&&xdg.length>0?xdg:"/tmp";return join17(base,"pgserve")}function resolveDatabaseName(){let testDbName=process.env.GENIE_TEST_DB_NAME;if(testDbName&&testDbName.length>0)return testDbName;return DB_NAME}function resolvePgserveAuthPassword(){let password=process.env.PGPASSWORD;return password&&password.length>0?password:DB_NAME}function resolvePgserveTimeoutMs(){let parsed=Number(process.env.GENIE_PGSERVE_TIMEOUT);return Number.isFinite(parsed)&&parsed>0?parsed:16000}function resolvePgConnectTimeoutSeconds(useSocket){let parsed=Number(process.env.GENIE_PG_CONNECT_TIMEOUT);if(Number.isFinite(parsed)&&parsed>0)return Math.ceil(parsed);if(!useSocket)return 5;return Math.max(16,Math.ceil(resolvePgserveTimeoutMs()/1000))}function resolveTcpPgPassword(){return resolvePgserveAuthPassword()}function resolvePgserveLibpqSocketPath(){return join17(resolvePgserveSocketDir(),".s.PGSQL.5432")}function resolvePgserveControlSocketPath(){return join17(resolvePgserveSocketDir(),"control.sock")}function resolvePgserveDaemonPidPath(){return join17(resolvePgserveSocketDir(),"pgserve.pid")}function probePgserveDaemon(){let socketPresent=existsSync13(resolvePgserveLibpqSocketPath()),pid=liveDaemonPid(readDaemonPid(resolvePgserveDaemonPidPath()));if(socketPresent&&pid!==null)return{running:!0,pid,socketPresent:!0};if(!socketPresent&&pid===null)return{running:!1,pid:null,socketPresent:!1,reason:"no daemon"};return{running:!1,pid,socketPresent,reason:socketPresent?"socket present but pid stale":"pid alive but no socket"}}function readDaemonPid(pidPath){if(!existsSync13(pidPath))return null;try{let raw=readFileSync9(pidPath,"utf-8").trim(),parsed=Number.parseInt(raw,10);return Number.isInteger(parsed)&&parsed>0?parsed:null}catch{return null}}function liveDaemonPid(pid){if(pid===null)return null;try{return process.kill(pid,0),pid}catch(err){return err.code==="EPERM"?pid:null}}function findLocalPgserveRoot(){let candidates=[join17(import.meta.dir,"..","node_modules","pgserve"),join17(import.meta.dir,"..","..","node_modules","pgserve")];for(let root of candidates)if(existsSync13(join17(root,"package.json")))return root;return null}function resolveLocalPgserveEntry(){let root=findLocalPgserveRoot();if(root===null)return null;try{let pkg=JSON.parse(readFileSync9(join17(root,"package.json"),"utf-8"));return join17(root,pkg.main??"src/index.js")}catch{return join17(root,"src/index.js")}}async function importPgserveSdk(){let localEntry=resolveLocalPgserveEntry();if(localEntry!==null&&existsSync13(localEntry))try{return await import(pathToFileURL(localEntry).href)}catch{}try{return await import("pgserve")}catch{return null}}function findPgserveDaemonCommand(){let localRoot=findLocalPgserveRoot();if(localRoot!==null){let localCommand=resolvePgservePackageCommand(localRoot);if(localCommand!==null)return localCommand}try{let resolved=__require.resolve("pgserve/bin/pgserve-wrapper.cjs"),packageCommand=resolvePgservePackageCommand(join17(dirname5(resolved),".."));if(packageCommand!==null)return packageCommand}catch{}let globalBin=join17(homedir11(),".bun","bin","pgserve");if(existsSync13(globalBin))return{command:globalBin,argsPrefix:[],display:globalBin};try{let fromPath=execSync3("which pgserve",{encoding:"utf-8",timeout:3000}).trim();if(fromPath.length>0)return{command:fromPath,argsPrefix:[],display:fromPath}}catch{}return null}function resolvePgservePackageCommand(root){let script=join17(root,"bin","postgres-server.js"),bun=findBunRuntime();if(existsSync13(script)&&bun!==null)return{command:bun,argsPrefix:[script],display:`${bun} ${script}`};let wrapper=join17(root,"bin","pgserve-wrapper.cjs");if(existsSync13(wrapper))return{command:wrapper,argsPrefix:[],display:wrapper};return null}function findBunRuntime(){if(process.execPath&&existsSync13(process.execPath)&&basename2(process.execPath).startsWith("bun"))return process.execPath;let homeBun=join17(homedir11(),".bun","bin",process.platform==="win32"?"bun.exe":"bun");if(existsSync13(homeBun))return homeBun;try{let fromPath=execSync3("which bun",{encoding:"utf-8",timeout:3000}).trim();if(fromPath.length>0)return fromPath}catch{}return null}function sleep(ms){return new Promise((r)=>setTimeout(r,ms))}async function getOrStartDaemon(){if(process.env.GENIE_PG_DISABLE_AUTOSTART==="1"||isPgAutostartDisabled()){let state=probePgserveDaemon();if(state.running&&await isPgserveSocketResponsive())return state;throw Error("pgserve daemon unavailable and PG autostart is disabled")}let initial=probePgserveDaemon();if(initial.running){if(await isPgserveSocketResponsive())return initial;await recoverUnresponsivePgserveDaemon(initial)}if(process.env.CI==="true"&&process.env.GENIE_PG_ALLOW_CI_AUTOSTART!=="1")throw Error("pgserve v2 daemon socket not present and CI=true. Either start `pgserve daemon` in the workflow or set GENIE_PG_ALLOW_CI_AUTOSTART=1 to opt in.");let rootErr=checkRootGuard();if(rootErr!==null)throw Error(rootErr);if(initial.reason==="socket present but pid stale"&&await isPgserveSocketResponsive())return{running:!0,pid:null,socketPresent:!0,reason:"socket completes pgserve greeting but pid file is stale"};if(daemonStartPromise)return await daemonStartPromise,probePgserveDaemon();daemonStartPromise=startPgserveDaemonOnce(initial);try{await daemonStartPromise}finally{daemonStartPromise=null}return probePgserveDaemon()}function cleanPartialDaemonState(initial){if(initial.reason==="pid alive but no socket"&&initial.pid!==null)unlinkIfPresent(resolvePgserveDaemonPidPath());if(initial.reason==="socket present but pid stale")removeStalePgserveSocketArtifacts()}async function recoverUnresponsivePgserveDaemon(state){if(state.pid!==null&&isLikelyPgserveDaemonProcess(state.pid)){if(await signalPgserveDaemonPid(state.pid,"SIGTERM"),liveDaemonPid(state.pid)!==null)await signalPgserveDaemonPid(state.pid,"SIGKILL")}removeStalePgserveSocketArtifacts()}function isLikelyPgserveDaemonProcess(pid){try{let command=execFileSync("ps",["-p",String(pid),"-o","command="],{encoding:"utf-8",timeout:1000}).trim();return command.includes("pgserve")||command.includes("postgres-server.js")||command.includes("postgres")&&command.includes(DATA_DIR)}catch{return!1}}async function signalPgserveDaemonPid(pid,signal){let signaled=!1;try{process.kill(-pid,signal),signaled=!0}catch{}try{process.kill(pid,signal),signaled=!0}catch{}if(!signaled)return;let deadline=Date.now()+(signal==="SIGTERM"?1000:250);while(Date.now()<deadline){if(liveDaemonPid(pid)===null)return;await sleep(50)}}async function isPgserveSocketResponsive(){let candidates=[resolvePgserveLibpqSocketPath(),resolvePgserveControlSocketPath()].filter((path2)=>existsSync13(path2));for(let path2 of candidates)if(await canCompletePgserveGreet(path2))return!0;return!1}function canCompletePgserveGreet(path2){return new Promise((resolve3)=>{let settled=!1,timer2=null,socket=null,finish=(ok)=>{if(settled)return;if(settled=!0,timer2)clearTimeout(timer2);socket?.removeAllListeners(),socket?.destroy(),resolve3(ok)},request=Buffer.alloc(8);request.writeUInt32BE(8,0),request.writeUInt32BE(PG_SSL_REQUEST_CODE,4),socket=createConnection(path2),timer2=setTimeout(()=>finish(!1),PGSERVE_GREET_TIMEOUT_MS),timer2.unref(),socket.once("connect",()=>socket?.write(request)),socket.once("data",(chunk)=>finish(chunk[0]===78||chunk[0]===83)),socket.once("error",()=>finish(!1))})}function removeStalePgserveSocketArtifacts(){for(let path2 of[resolvePgserveDaemonPidPath(),resolvePgserveLibpqSocketPath(),resolvePgserveControlSocketPath()])unlinkIfPresent(path2)}function unlinkIfPresent(path2){try{unlinkSync3(path2)}catch{}}async function startPgserveDaemonOnce(initial){cleanPartialDaemonState(initial);let daemonCommand=findPgserveDaemonCommand();if(daemonCommand===null){if(await tryEnsureDaemonWithSdk())return;throw Error("pgserve binary not found. Install with `bun add pgserve@^2.0.2` (or `npm i pgserve@^2.0.2`), or start `pgserve daemon` manually before running genie.")}mkdirSync6(resolvePgserveSocketDir(),{recursive:!0,mode:448});let child=spawn(daemonCommand.command,[...daemonCommand.argsPrefix,"daemon","--data",DATA_DIR,"--log","warn"],{detached:!0,stdio:"ignore",env:{...process.env}});try{await waitForDaemonSocket(daemonCommand,child),child.unref()}catch(err){throw await terminatePgserveTree(child),err}}async function waitForDaemonSocket(daemonCommand,child){let socketPath=resolvePgserveLibpqSocketPath(),timeout=resolvePgserveTimeoutMs(),deadline=Date.now()+timeout,childExit=null;child?.once("exit",(code,signal)=>{childExit=signal?`signal ${signal}`:`exit code ${code??"unknown"}`});while(Date.now()<deadline){if(existsSync13(socketPath)&&await isPgserveSocketResponsive())return;if(childExit!==null)throw Error(`pgserve v2 daemon exited before binding ${socketPath} (${childExit}). Try starting it manually: ${formatPgserveDaemonCommand(daemonCommand)}`);await sleep(250)}throw Error(`pgserve v2 daemon did not bind ${socketPath} within ${Math.round(timeout/1000)}s. Try starting it manually: ${formatPgserveDaemonCommand(daemonCommand)}`)}function formatPgserveDaemonCommand(daemonCommand){return`${daemonCommand.display} daemon --data ${DATA_DIR} --log warn`}async function tryEnsureDaemonWithSdk(){let sdk=await importPgserveSdk();if(sdk===null)return!1;if(typeof sdk.ensureDaemon!=="function")return!1;try{let state=await sdk.ensureDaemon({dataDir:DATA_DIR,logLevel:"warn",timeoutMs:resolvePgserveTimeoutMs(),controlSocketDir:resolvePgserveSocketDir()});if(!state.running||!(state.libpqSocketPresent??state.socketPresent??!0))return!1;if(await isPgserveSocketResponsive())return!0;return await recoverUnresponsivePgserveDaemon(probePgserveDaemon()),!1}catch{let state=probePgserveDaemon();if(state.running)await recoverUnresponsivePgserveDaemon(state);else cleanPartialDaemonState(state);return!1}}function maskCredentials(url){return url.replace(/\/\/.*@/,"//***@")}function checkRootGuard(){if(process.getuid?.()!==0)return null;if(process.env.GENIE_ALLOW_ROOT==="1")return null;return"pgserve cannot start under uid 0 (root) \u2014 PostgreSQL refuses to run as root for security reasons. "+"Run genie as a non-root user, or set GENIE_ALLOW_ROOT=1 to attempt anyway. See: https://github.com/automagik-dev/genie/issues/1226"}function isPgAutostartDisabled(){let value=process.env.GENIE_PG_NO_AUTOSTART;return value!==void 0&&TRUTHY_ENV.has(value.trim().toLowerCase())}function selfHealPostgres(dataDir){try{execSync3(`pkill -9 -f "postgres.*${dataDir.replace(/\//g,"\\/")}" 2>/dev/null || true`,{stdio:"ignore",timeout:5000}),execSync3(`pkill -9 -f "pgserve.*${dataDir.replace(/\//g,"\\/")}" 2>/dev/null || true`,{stdio:"ignore",timeout:5000})}catch{}let pidFile=join17(dataDir,"postmaster.pid");if(existsSync13(pidFile))try{unlinkSync3(pidFile)}catch{}try{execSync3("ipcs -m 2>/dev/null | awk '$6 == 0 {print $2}' | xargs -I{} ipcrm -m {} 2>/dev/null || true",{stdio:"ignore",timeout:5000})}catch{}}function signalPgserveTree(child,signal){let pid=child.pid;if(pid===void 0){try{child.kill(signal)}catch{}return}try{if(process.platform==="win32")child.kill(signal);else process.kill(-pid,signal)}catch{try{child.kill(signal)}catch{}}}async function terminatePgserveTree(child){if(signalPgserveTree(child,"SIGTERM"),!await new Promise((resolve3)=>{if(child.exitCode!==null||child.signalCode!==null){resolve3(!0);return}let timer2=setTimeout(()=>resolve3(!1),1000);timer2.unref(),child.once("exit",()=>{clearTimeout(timer2),resolve3(!0)})}))signalPgserveTree(child,"SIGKILL")}function getPort(){let envPort=process.env.GENIE_PG_PORT;if(envPort){let parsed=Number.parseInt(envPort,10);if(!Number.isNaN(parsed)&&parsed>0&&parsed<65536)return parsed}return DEFAULT_PORT}async function isPostgresHealthy(port){try{return await Promise.race([(async()=>{let pg=(await Promise.resolve().then(() => (init_src(),exports_src))).default,probe=pg({host:DEFAULT_HOST,port,database:DB_NAME,username:DB_NAME,password:resolveTcpPgPassword(),max:1,connect_timeout:3,idle_timeout:1});try{return await probe`SELECT 1`,await probe.end({timeout:2}),!0}catch{try{await probe.end({timeout:1})}catch{}return!1}})(),new Promise((resolve3)=>{setTimeout(()=>resolve3(!1),4000).unref()})])}catch{return!1}}function readLockfile(){try{let content=readFileSync9(LOCKFILE_PATH,"utf-8").trim(),port=Number.parseInt(content,10);if(!Number.isNaN(port)&&port>0&&port<65536)return port}catch{}return null}function writeLockfile(port){try{mkdirSync6(GENIE_HOME,{recursive:!0});let tmpPath=`${LOCKFILE_PATH}.tmp.${process.pid}`;writeFileSync6(tmpPath,String(port),"utf-8"),renameSync(tmpPath,LOCKFILE_PATH)}catch{}}function removeLockfile(){try{unlinkSync3(LOCKFILE_PATH)}catch{}}async function runRetention(sql){if(retentionRan)return;try{await sql.unsafe(`
679
699
  DELETE FROM heartbeats WHERE created_at < now() - interval '7 days';
680
700
  DELETE FROM machine_snapshots WHERE created_at < now() - interval '30 days';
681
701
  DELETE FROM audit_events WHERE entity_type LIKE 'otel_%' AND created_at < now() - interval '30 days';
682
702
  DELETE FROM genie_runtime_events WHERE created_at < now() - interval '14 days';
683
703
  `),retentionRan=!0}catch(retErr){retentionRan=!0;let msg=retErr instanceof Error?retErr.message:String(retErr);process.stderr.write(`[genie] retention cleanup warning: ${msg}
684
- `)}}async function ensurePgserve(){if(activePort===null){let testPort=await resolveTestPort();if(testPort!==null)return activePort=testPort,process.env.GENIE_PG_AVAILABLE="true",testPort}if(ensurePromise)return ensurePromise;ensurePromise=_ensurePgserve();try{return await ensurePromise}finally{ensurePromise=null}}function __setSpawnDaemonForTest(fn){spawnDaemon=fn??(()=>{let bunPath=process.execPath??"bun",genieBin=process.argv[1]??"genie";spawn(bunPath,[genieBin,"serve","start","--headless","--foreground"],{detached:!0,stdio:"ignore",env:{...process.env,GENIE_IS_DAEMON:"1"}}).unref()})}function readPidFile(pidPath){try{return readFileSync9(pidPath,"utf-8").trim()||null}catch{return null}}function parsePidFile(raw){let sepIdx=raw.indexOf(":"),pid,recordedStartTime;if(sepIdx<0)pid=Number.parseInt(raw,10),recordedStartTime=null;else{pid=Number.parseInt(raw.slice(0,sepIdx),10);let tail=raw.slice(sepIdx+1).trim();recordedStartTime=tail===""||tail==="unknown"?null:tail}if(Number.isNaN(pid)||pid<=0)return null;return{pid,recordedStartTime}}function isServeAlive(pid,recordedStartTime){try{process.kill(pid,0)}catch{return!1}if(recordedStartTime===null)return!1;let currentStartTime=getProcessStartTime(pid);return currentStartTime!==null&&currentStartTime===recordedStartTime}function unlinkQuiet(path2){try{unlinkSync3(path2)}catch{}}async function autoStartDaemon(){let home=process.env.GENIE_HOME??GENIE_HOME,pidPath=join17(home,"serve.pid"),raw=readPidFile(pidPath);if(!raw){lastAutoStartOutcome="missing",lastAutoStartPid=null,spawnDaemon();return}let parsed=parsePidFile(raw);if(!parsed){unlinkQuiet(pidPath),lastAutoStartOutcome="stale",lastAutoStartPid=null,spawnDaemon();return}if(isServeAlive(parsed.pid,parsed.recordedStartTime)){lastAutoStartOutcome="alive",lastAutoStartPid=parsed.pid;return}unlinkQuiet(pidPath),lastAutoStartOutcome="stale",lastAutoStartPid=parsed.pid,spawnDaemon()}async function resolveTestPort(){let raw=process.env.GENIE_TEST_PG_PORT;if(!raw)return null;let parsed=Number.parseInt(raw,10);if(Number.isNaN(parsed)||parsed<=0||parsed>=65536||!await isPostgresHealthy(parsed))throw Error(`GENIE_TEST_PG_PORT=${raw} set but not reachable`);return parsed}async function tryExistingPort(port){let portFromFile=readLockfile();if(portFromFile!==null&&await isPostgresHealthy(portFromFile))return activePort=portFromFile,process.env.GENIE_PG_AVAILABLE="true",portFromFile;if(await isPostgresHealthy(port))return activePort=port,process.env.GENIE_PG_AVAILABLE="true",writeLockfile(port),port;return null}async function spawnPgserveDirect(port){mkdirSync6(DATA_DIR,{recursive:!0}),selfHealPostgres(DATA_DIR);try{let startedPort=await startPgserveOnPort(port);return registerExitHandler(),startedPort}catch(err){process.env.GENIE_PG_AVAILABLE="false";let message=err instanceof Error?err.message:String(err);throw Error(`pgserve failed to start: ${maskCredentials(message)}`)}}async function waitForDaemonPort(){let deadline=Date.now()+16000;while(Date.now()<deadline){let p=readLockfile();if(p!==null&&await isPostgresHealthy(p))return activePort=p,process.env.GENIE_PG_AVAILABLE="true",p;await new Promise((r)=>setTimeout(r,500))}return null}function throwDaemonTimeout(outcomeAtStart,pidAtStart){process.env.GENIE_PG_AVAILABLE="false";let home=process.env.GENIE_HOME??GENIE_HOME,pidPath=join17(home,"serve.pid"),hasPidFile=existsSync13(pidPath),currentPort=readLockfile()??getPort();if(outcomeAtStart==="stale")throw Error(`Stale ~/.genie/serve.pid (PID ${pidAtStart??"unknown"} was not our serve). Removed and retried \u2014 if this persists, run: genie serve start`);if(!hasPidFile)throw Error("genie serve not running. Run: genie serve start");throw Error(`genie serve is running (PID ${pidAtStart??outcomeAtStart??"unknown"}) but pgserve did not respond on port ${currentPort} within 16s. Try: genie serve restart, or check ~/.genie/logs/scheduler.log`)}async function _ensurePgserve(){if(activePort!==null)return activePort;let port=getPort(),existing=await tryExistingPort(port);if(existing!==null)return existing;if(process.env.CI==="true")throw process.env.GENIE_PG_AVAILABLE="false",Error("pgserve not available in CI");if(isPgAutostartDisabled())throw process.env.GENIE_PG_AVAILABLE="false",Error("pgserve unavailable and GENIE_PG_NO_AUTOSTART=1");let rootErr=checkRootGuard();if(rootErr!==null)throw process.env.GENIE_PG_AVAILABLE="false",Error(rootErr);if(process.env.GENIE_IS_DAEMON==="1")return spawnPgserveDirect(port);await autoStartDaemon();let outcomeAtStart=lastAutoStartOutcome,pidAtStart=lastAutoStartPid,waited=await waitForDaemonPort();if(waited!==null)return waited;throwDaemonTimeout(outcomeAtStart,pidAtStart)}function findPgserveBin(){try{let resolved=__require.resolve("pgserve/bin/pgserve-wrapper.cjs");if(existsSync13(resolved))return resolved}catch{}let globalBin=join17(homedir11(),".bun","bin","pgserve");if(existsSync13(globalBin))return globalBin;try{return execSync3("which pgserve",{encoding:"utf-8",timeout:3000}).trim()}catch{return"pgserve"}}async function startPgserveOnPort(port){mkdirSync6(DATA_DIR,{recursive:!0});let child=spawn(findPgserveBin(),["--port",String(port),"--host",DEFAULT_HOST,"--data",DATA_DIR,"--log","warn","--no-stats","--no-cluster","--pgvector"],{detached:!0,stdio:"ignore"});child.unref(),pgserveChild=child;let timeout=Number(process.env.GENIE_PGSERVE_TIMEOUT)||30000,deadline=Date.now()+timeout;while(Date.now()<deadline){if(await isPostgresHealthy(port))return activePort=port,ownsLockfile=!0,process.env.GENIE_PG_AVAILABLE="true",writeLockfile(port),port;await new Promise((r)=>setTimeout(r,500))}if(await terminatePgserveTree(child),pgserveChild===child)pgserveChild=null;throw selfHealPostgres(DATA_DIR),Error(`pgserve failed to start on port ${port} (timeout after ${timeout/1000}s)`)}function registerExitHandler(){if(exitHandlerRegistered)return;exitHandlerRegistered=!0;let cleanup=()=>{if(pgserveChild)signalPgserveTree(pgserveChild,"SIGTERM"),pgserveChild=null;if(ownsLockfile)removeLockfile(),ownsLockfile=!1};process.on("exit",cleanup),process.on("SIGINT",()=>{cleanup(),process.exit(130)}),process.on("SIGTERM",()=>{cleanup(),process.exit(143)})}async function healthCheckCachedClient(){if(!sqlClient)return null;try{return await sqlClient`SELECT 1`,sqlClient}catch{let dying=sqlClient;if(!dying)return null;return sqlClient=null,activePort=null,dying.end({timeout:5}).catch(()=>{}),null}}async function runPostConnectSetup(client,isTestMode,timings){let _t2=Date.now(),skipBoot=isTestMode||process.env.GENIE_SKIP_DB_BOOT==="1";if(!skipBoot)await runMigrations(client);let _t3=Date.now();if(!skipBoot&&(needsSeed()||await needsSeededTeams(client)))await runSeed(client);let _t4=Date.now(),_t5=_t4;if(process.env.GENIE_PROFILE_DB)console.error(`[db-profile] pgserve=${timings.t1-timings.t0}ms migrate=${_t3-_t2}ms seed=${_t4-_t3}ms retention=skipped total=${_t5-timings.t0}ms`)}async function getConnection(){let cached=await healthCheckCachedClient();if(cached)return cached;if(buildPromise)return buildPromise;buildPromise=_buildConnection();try{return await buildPromise}finally{buildPromise=null}}function shouldUseUnixSocket(){if(process.env.GENIE_PG_FORCE_TCP==="1")return!1;if(process.env.GENIE_TEST_PG_PORT)return!1;return!0}async function maybePrintBanner(client,isTestMode){if(bannerPrinted||isTestMode)return;if(process.env.GENIE_QUIET==="1"||process.env.GENIE_NO_BANNER==="1"){bannerPrinted=!0;return}try{let db=(await client.unsafe("SELECT current_database() AS db"))[0]?.db;if(typeof db==="string"&&db.length>0)process.stderr.write(`[pgserve] connected to ${db}
685
- `)}catch{}bannerPrinted=!0}async function _buildConnection(){let _t0=Date.now(),useSocket=shouldUseUnixSocket();if(useSocket)await getOrStartDaemon();let port=useSocket?5432:await ensurePgserve(),_t1=Date.now(),pgModule=(await Promise.resolve().then(() => (init_src(),exports_src))).default,database=resolveDatabaseName(),isTestMode=Boolean(process.env.GENIE_TEST_DB_NAME),pgWireCredential=useSocket?resolvePgserveAuthPassword():resolveTcpPgPassword(),host=useSocket?resolvePgserveSocketDir():DEFAULT_HOST;sqlClient=pgModule({host,port,database,username:DB_NAME,[PG_AUTH_FIELD]:pgWireCredential,max:50,idle_timeout:1,connect_timeout:resolvePgConnectTimeoutSeconds(useSocket),onnotice:()=>{},connection:{client_min_messages:"warning"}});try{if(await runPostConnectSetup(sqlClient,isTestMode,{t0:_t0,t1:_t1}),await maybePrintBanner(sqlClient,isTestMode),useSocket)activePort=SOCKET_PORT_SENTINEL,process.env.GENIE_PG_AVAILABLE="true"}catch(err){let dying=sqlClient;throw sqlClient=null,activePort=null,dying?.end({timeout:2}).catch(()=>{}),err}return sqlClient}function isConnected(){return sqlClient!==null}async function resetConnection(){if(sqlClient){let dying=sqlClient;sqlClient=null,await dying.end({timeout:5})}}async function isAvailable(){try{return await(await getConnection())`SELECT 1`,!0}catch{return!1}}async function shutdown(){if(sqlClient)await sqlClient.end({timeout:5}),sqlClient=null;if(ownsLockfile)removeLockfile(),ownsLockfile=!1}function getDataDir(){return DATA_DIR}function getActivePort(){return activePort??getPort()}function getAuxiliaryPortBase(){return activePort===SOCKET_PORT_SENTINEL?getPort():getActivePort()}function isSocketMode(){return activePort===SOCKET_PORT_SENTINEL}function getLockfilePath(){return LOCKFILE_PATH}var DEFAULT_PORT=19642,DEFAULT_HOST="127.0.0.1",SOCKET_PORT_SENTINEL=0,GENIE_HOME,DATA_DIR,LOCKFILE_PATH,PG_AUTH_FIELD,PG_SSL_REQUEST_CODE=80877103,PGSERVE_GREET_TIMEOUT_MS=1000,DB_NAME,TRUTHY_ENV,daemonStartPromise=null,pgserveChild=null,sqlClient=null,activePort=null,ensurePromise=null,buildPromise=null,ownsLockfile=!1,exitHandlerRegistered=!1,retentionRan=!1,lastAutoStartOutcome=null,lastAutoStartPid=null,spawnDaemon=()=>{let bunPath=process.execPath??"bun",genieBin=process.argv[1]??"genie";spawn(bunPath,[genieBin,"serve","start","--headless","--foreground"],{detached:!0,stdio:"ignore",env:{...process.env,GENIE_IS_DAEMON:"1"}}).unref()},bannerPrinted=!1;var init_db=__esm(()=>{init_db_migrations();init_pg_seed();init_process_identity();GENIE_HOME=process.env.GENIE_HOME??join17(homedir11(),".genie"),DATA_DIR=join17(GENIE_HOME,"data","pgserve"),LOCKFILE_PATH=join17(GENIE_HOME,"pgserve.port"),PG_AUTH_FIELD=["pass","word"].join(""),DB_NAME=["post","gres"].join(""),TRUTHY_ENV=new Set(["1","true","yes","on"])});import{createHmac as createHmac2}from"crypto";import{homedir as homedir12}from"os";function hashEntity(namespace,value){let key=process.env.GENIE_REDACTION_KEY??"genie-redaction-fallback";return`tier-a:${namespace}:${createHmac2("sha256",key).update(value).digest("hex").slice(0,16)}`}function dropSecretShaped(text){let out=text;for(let{name,pattern}of SECRET_PATTERNS)out=out.replace(pattern,`<REDACTED:${name}>`);return out}function stripEnvVars(text){return text.replace(ENV_ASSIGN,(_m,name)=>`${name}=<REDACTED>`)}function tokenizePath(p){let home=homedir12(),out=p;if(home&&out.startsWith(home))out=`~${out.slice(home.length)}`;let segments=out.split("/").filter(Boolean);if(segments.length>6){let head=segments.slice(0,3).join("/"),tail=segments.slice(-2).join("/");out=`${out.startsWith("/")?"/":""}${head}/\u2026/${tail}`}return out=out.replace(/\b[0-9a-f]{12,}\b/g,"<id>"),out}function redactFreeText(value){return stripEnvVars(dropSecretShaped(value))}function capPayload(body){let serialized;try{serialized=JSON.stringify(body)}catch{return{overflow:!0,content_hash:"unserializable",body:{overflow:!0}}}if(Buffer.byteLength(serialized,"utf8")<=MAX_PAYLOAD_BYTES)return{overflow:!1,body};let key=process.env.GENIE_REDACTION_KEY??"genie-redaction-fallback",digest=createHmac2("sha256",key).update(serialized).digest("hex").slice(0,16);return{overflow:!0,content_hash:digest,body:{overflow:!0,content_hash:digest,original_bytes:Buffer.byteLength(serialized,"utf8")}}}var SECRET_PATTERNS,SENSITIVE_ENV_NAME="[A-Z][A-Z0-9_]*(?:_KEY|_SECRET|_TOKEN|_PASSWORD|_PASS|_AUTH|_API_KEY)",ENV_ASSIGN,MAX_PAYLOAD_BYTES=65536;var init_redactors=__esm(()=>{SECRET_PATTERNS=[{name:"anthropic-key",pattern:/sk-ant-[A-Za-z0-9_-]{20,}/g},{name:"openai-key",pattern:/sk-[A-Za-z0-9]{20,}/g},{name:"github-token",pattern:/gh[pousr]_[A-Za-z0-9]{30,}/g},{name:"aws-access-key",pattern:/AKIA[0-9A-Z]{16}/g},{name:"aws-secret",pattern:/(?<![A-Za-z0-9])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9])/g},{name:"bearer-token",pattern:/(?:Bearer|bearer)\s+[A-Za-z0-9._\-~+/=]{20,}/g},{name:"jwt",pattern:/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g},{name:"pem-header",pattern:/-----BEGIN [A-Z ]+ PRIVATE KEY-----/g},{name:"sensitive-path",pattern:/\/(?:[^\s"',;():]+\/)*\.(?:secrets|ssh|aws|gnupg|keys)(?:\/[^\s"',;():]*)?/g}];ENV_ASSIGN=new RegExp(`\\b(${SENSITIVE_ENV_NAME})\\s*[=:]\\s*([^\\s"',;]+)`,"g")});function tagTier(schema2,tier,note){let desc=`tier:${tier}${note?`; ${note}`:""}`;return schema2.describe(desc)}var exports_agent_lifecycle={};__export(exports_agent_lifecycle,{schema:()=>schema2,TYPE:()=>TYPE,SCHEMA_VERSION:()=>SCHEMA_VERSION,KIND:()=>KIND});var SCHEMA_VERSION=1,TYPE="agent.lifecycle",KIND="span",AgentIdSchema,TeamSchema,ExecutorSchema,SessionIdSchema,CwdSchema,ExitReasonSchema,DurationSchema,schema2;var init_agent_lifecycle=__esm(()=>{init_zod();init_redactors();AgentIdSchema=tagTier(exports_external.string().min(1).max(256),"B","agent name \u2014 public"),TeamSchema=tagTier(exports_external.string().min(1).max(256).optional(),"B"),ExecutorSchema=tagTier(exports_external.enum(["claude-code","claude-sdk","codex","shell"]),"C"),SessionIdSchema=tagTier(exports_external.string().min(1).max(128).transform((v)=>hashEntity("session",v)),"A","session id hashed"),CwdSchema=tagTier(exports_external.string().max(1024).transform(tokenizePath),"B"),ExitReasonSchema=tagTier(exports_external.enum(["stopped","killed","crashed","idle-suspend","completed"]),"C"),DurationSchema=tagTier(exports_external.number().int().min(0),"C","ms"),schema2=exports_external.object({agent_id:AgentIdSchema,team:TeamSchema,executor:ExecutorSchema,session_id:SessionIdSchema.optional(),cwd:CwdSchema.optional(),exit_reason:ExitReasonSchema.optional(),duration_ms:DurationSchema.optional()}).strict()});var exports_agent_resume_attempted={};__export(exports_agent_resume_attempted,{schema:()=>schema3,TYPE:()=>TYPE2,SCHEMA_VERSION:()=>SCHEMA_VERSION2,KIND:()=>KIND2});var SCHEMA_VERSION2=1,TYPE2="agent.resume.attempted",KIND2="event",AGENT_STATES,EntityIdSchema,AttemptNumberSchema,StateSchema,LastErrorSchema,TriggerSchema,schema3;var init_agent_resume_attempted=__esm(()=>{init_zod();init_redactors();AGENT_STATES=["spawning","working","idle","permission","question","done","error","suspended","unknown"],EntityIdSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A","agent id hashed"),AttemptNumberSchema=tagTier(exports_external.number().int().min(1).max(64),"C"),StateSchema=tagTier(exports_external.enum(AGENT_STATES),"C"),LastErrorSchema=tagTier(exports_external.string().max(500).transform((v)=>redactFreeText(v)).optional(),"B","truncated to 500 chars"),TriggerSchema=tagTier(exports_external.enum(["scheduler","manual","boot"]),"C"),schema3=exports_external.object({entity_id:EntityIdSchema,attempt_number:AttemptNumberSchema,state_before:StateSchema,state_after:StateSchema,last_error:LastErrorSchema,trigger:TriggerSchema}).strict()});var exports_agent_resume_failed={};__export(exports_agent_resume_failed,{schema:()=>schema4,TYPE:()=>TYPE3,SCHEMA_VERSION:()=>SCHEMA_VERSION3,KIND:()=>KIND3});var SCHEMA_VERSION3=1,TYPE3="agent.resume.failed",KIND3="event",AGENT_STATES2,EntityIdSchema2,AttemptNumberSchema2,StateSchema2,LastErrorSchema2,TriggerSchema2,ExhaustedSchema,schema4;var init_agent_resume_failed=__esm(()=>{init_zod();init_redactors();AGENT_STATES2=["spawning","working","idle","permission","question","done","error","suspended","unknown"],EntityIdSchema2=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A","agent id hashed"),AttemptNumberSchema2=tagTier(exports_external.number().int().min(1).max(64),"C"),StateSchema2=tagTier(exports_external.enum(AGENT_STATES2),"C"),LastErrorSchema2=tagTier(exports_external.string().max(500).transform((v)=>redactFreeText(v)).optional(),"B","truncated to 500 chars"),TriggerSchema2=tagTier(exports_external.enum(["scheduler","manual","boot"]),"C"),ExhaustedSchema=tagTier(exports_external.boolean(),"C"),schema4=exports_external.object({entity_id:EntityIdSchema2,attempt_number:AttemptNumberSchema2,state_before:StateSchema2,state_after:StateSchema2,last_error:LastErrorSchema2,trigger:TriggerSchema2,exhausted:ExhaustedSchema}).strict()});var exports_agent_resume_succeeded={};__export(exports_agent_resume_succeeded,{schema:()=>schema5,TYPE:()=>TYPE4,SCHEMA_VERSION:()=>SCHEMA_VERSION4,KIND:()=>KIND4});var SCHEMA_VERSION4=1,TYPE4="agent.resume.succeeded",KIND4="event",AGENT_STATES3,EntityIdSchema3,AttemptNumberSchema3,StateSchema3,LastErrorSchema3,TriggerSchema3,schema5;var init_agent_resume_succeeded=__esm(()=>{init_zod();init_redactors();AGENT_STATES3=["spawning","working","idle","permission","question","done","error","suspended","unknown"],EntityIdSchema3=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A","agent id hashed"),AttemptNumberSchema3=tagTier(exports_external.number().int().min(1).max(64),"C"),StateSchema3=tagTier(exports_external.enum(AGENT_STATES3),"C"),LastErrorSchema3=tagTier(exports_external.string().max(500).transform((v)=>redactFreeText(v)).optional(),"B","truncated to 500 chars"),TriggerSchema3=tagTier(exports_external.enum(["scheduler","manual","boot"]),"C"),schema5=exports_external.object({entity_id:EntityIdSchema3,attempt_number:AttemptNumberSchema3,state_before:StateSchema3,state_after:StateSchema3,last_error:LastErrorSchema3,trigger:TriggerSchema3}).strict()});var exports_audit_export={};__export(exports_audit_export,{schema:()=>schema6,TYPE:()=>TYPE5,SCHEMA_VERSION:()=>SCHEMA_VERSION5,KIND:()=>KIND5,DEFAULT_TIER:()=>DEFAULT_TIER});var SCHEMA_VERSION5=1,TYPE5="audit.export",KIND5="event",DEFAULT_TIER="audit",ExporterActorSchema,SinceIdSchema,RowCountSchema,BreakCountSchema,BundleSignaturePrefixSchema,TenantIdSchema,ReasonSchema,schema6;var init_audit_export=__esm(()=>{init_zod();init_redactors();ExporterActorSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("actor",v)),"A"),SinceIdSchema=tagTier(exports_external.number().int().min(0),"C"),RowCountSchema=tagTier(exports_external.number().int().min(0),"C"),BreakCountSchema=tagTier(exports_external.number().int().min(0),"C","chain breaks detected in the exported range"),BundleSignaturePrefixSchema=tagTier(exports_external.string().min(1).max(16),"C","first 16 hex of the bundle HMAC signature (full is on disk)"),TenantIdSchema=tagTier(exports_external.string().min(1).max(128),"C"),ReasonSchema=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)),"B","IR justification for the export"),schema6=exports_external.object({exporter_actor:ExporterActorSchema,since_id:SinceIdSchema,row_count:RowCountSchema,break_count:BreakCountSchema,bundle_signature_prefix:BundleSignaturePrefixSchema,tenant_id:TenantIdSchema,reason:ReasonSchema}).strict()});var exports_audit_un_hash={};__export(exports_audit_un_hash,{schema:()=>schema7,TYPE:()=>TYPE6,SCHEMA_VERSION:()=>SCHEMA_VERSION6,KIND:()=>KIND6,DEFAULT_TIER:()=>DEFAULT_TIER2});var SCHEMA_VERSION6=1,TYPE6="audit.un_hash",KIND6="event",DEFAULT_TIER2="audit",AdminActorSchema,NamespaceSchema,HashedValueSchema,ResolvedMarkerSchema,ReasonSchema2,TicketRefSchema,schema7;var init_audit_un_hash=__esm(()=>{init_zod();init_redactors();AdminActorSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("actor",v)),"A","admin who performed the un-hash (Tier-A hashed)"),NamespaceSchema=tagTier(exports_external.string().min(1).max(64),"C"),HashedValueSchema=tagTier(exports_external.string().min(1).max(256),"B","tier-a:ns:... source hash requested"),ResolvedMarkerSchema=tagTier(exports_external.boolean(),"C","true if un-hash succeeded"),ReasonSchema2=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)),"B","IR justification for the un-hash"),TicketRefSchema=tagTier(exports_external.string().max(128).optional(),"C","incident ticket reference"),schema7=exports_external.object({admin_actor:AdminActorSchema,namespace:NamespaceSchema,hashed_value:HashedValueSchema,resolved:ResolvedMarkerSchema,reason:ReasonSchema2,ticket_ref:TicketRefSchema}).strict()});var exports_cache_hit={};__export(exports_cache_hit,{schema:()=>schema8,TYPE:()=>TYPE7,SCHEMA_VERSION:()=>SCHEMA_VERSION7,KIND:()=>KIND7});var SCHEMA_VERSION7=1,TYPE7="cache.hit",KIND7="event",CacheSchema,HitSchema,KeyHintSchema,LatencyUsSchema,schema8;var init_cache_hit=__esm(()=>{init_zod();init_redactors();CacheSchema=tagTier(exports_external.string().min(1).max(128),"C"),HitSchema=tagTier(exports_external.boolean(),"C"),KeyHintSchema=tagTier(exports_external.string().max(128).transform((v)=>redactFreeText(v)).optional(),"B"),LatencyUsSchema=tagTier(exports_external.number().int().min(0).max(1e7).optional(),"C","microseconds"),schema8=exports_external.object({cache:CacheSchema,hit:HitSchema,key_hint:KeyHintSchema,latency_us:LatencyUsSchema}).strict()});var exports_cache_invalidate={};__export(exports_cache_invalidate,{schema:()=>schema9,TYPE:()=>TYPE8,SCHEMA_VERSION:()=>SCHEMA_VERSION8,KIND:()=>KIND8});var SCHEMA_VERSION8=1,TYPE8="cache.invalidate",KIND8="event",CacheSchema2,KeysInvalidatedSchema,ReasonSchema3,ScopeSchema,schema9;var init_cache_invalidate=__esm(()=>{init_zod();CacheSchema2=tagTier(exports_external.string().min(1).max(128),"C","cache name \u2014 public"),KeysInvalidatedSchema=tagTier(exports_external.number().int().min(0).max(1e7),"C"),ReasonSchema3=tagTier(exports_external.enum(["ttl","manual","capacity","rotation","upstream_change"]).optional(),"C"),ScopeSchema=tagTier(exports_external.enum(["key","bucket","all"]).optional(),"C"),schema9=exports_external.object({cache:CacheSchema2,keys_invalidated:KeysInvalidatedSchema,reason:ReasonSchema3,scope:ScopeSchema}).strict()});var exports_cli_command={};__export(exports_cli_command,{schema:()=>schema10,TYPE:()=>TYPE9,SCHEMA_VERSION:()=>SCHEMA_VERSION9,KIND:()=>KIND9});var SCHEMA_VERSION9=1,TYPE9="cli.command",KIND9="span",CommandSchema,ArgsSchema,CwdSchema2,ExitCodeSchema,DurationSchema2,UserAgentSchema,schema10;var init_cli_command=__esm(()=>{init_zod();init_redactors();CommandSchema=tagTier(exports_external.string().max(256),"C","subcommand name only"),ArgsSchema=tagTier(exports_external.array(exports_external.string()).max(32).transform((args)=>args.map((a)=>redactFreeText(a))),"B","argv \u2014 secrets stripped, paths kept"),CwdSchema2=tagTier(exports_external.string().max(1024).transform(tokenizePath),"B","working directory tokenized"),ExitCodeSchema=tagTier(exports_external.number().int().min(-1).max(255),"C"),DurationSchema2=tagTier(exports_external.number().int().min(0).max(3600000),"C","milliseconds"),UserAgentSchema=tagTier(exports_external.string().max(256).optional(),"C"),schema10=exports_external.object({command:CommandSchema,args:ArgsSchema,cwd:CwdSchema2,exit_code:ExitCodeSchema.optional(),duration_ms:DurationSchema2.optional(),user_agent:UserAgentSchema}).strict().transform((v)=>({...v}))});var exports_consumer_heartbeat={};__export(exports_consumer_heartbeat,{schema:()=>schema11,TYPE:()=>TYPE10,SCHEMA_VERSION:()=>SCHEMA_VERSION10,KIND:()=>KIND10});var SCHEMA_VERSION10=1,TYPE10="consumer.heartbeat",KIND10="event",ConsumerIdSchema,LastEventIdSchema,BacklogDepthSchema,RoleSchema,UptimeSecondsSchema,schema11;var init_consumer_heartbeat=__esm(()=>{init_zod();init_redactors();ConsumerIdSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("consumer",v)),"A"),LastEventIdSchema=tagTier(exports_external.number().int().min(0).max(9007199254740991),"C"),BacklogDepthSchema=tagTier(exports_external.number().int().min(0).max(1e7),"C"),RoleSchema=tagTier(exports_external.enum(["admin","operator","subscriber","audit"]).optional(),"C"),UptimeSecondsSchema=tagTier(exports_external.number().int().min(0).max(31536000).optional(),"C"),schema11=exports_external.object({consumer_id:ConsumerIdSchema,last_event_id_processed:LastEventIdSchema,backlog_depth:BacklogDepthSchema,role:RoleSchema,uptime_seconds:UptimeSecondsSchema}).strict()});var exports_consumer_lagged={};__export(exports_consumer_lagged,{schema:()=>schema12,TYPE:()=>TYPE11,SCHEMA_VERSION:()=>SCHEMA_VERSION11,KIND:()=>KIND11,DEFAULT_TIER:()=>DEFAULT_TIER3});var SCHEMA_VERSION11=1,TYPE11="consumer.lagged",KIND11="event",DEFAULT_TIER3="audit",CountSchema,SpillPathSchema,SeveritySchema,schema12;var init_consumer_lagged=__esm(()=>{init_zod();CountSchema=tagTier(exports_external.number().int().min(0).max(1e7),"C"),SpillPathSchema=tagTier(exports_external.string().max(512),"B"),SeveritySchema=tagTier(exports_external.enum(["warn","error","fatal"]),"C"),schema12=exports_external.object({severity_class:SeveritySchema,spill_path:SpillPathSchema,rows_spilled:CountSchema,queue_depth:CountSchema,queue_cap:CountSchema}).strict()});var exports_correlation_orphan_rate={};__export(exports_correlation_orphan_rate,{schema:()=>schema13,TYPE:()=>TYPE12,SCHEMA_VERSION:()=>SCHEMA_VERSION12,KIND:()=>KIND12});var SCHEMA_VERSION12=1,TYPE12="correlation.orphan.rate",KIND12="event",RateSchema,CountSchema2,schema13;var init_correlation_orphan_rate=__esm(()=>{init_zod();RateSchema=tagTier(exports_external.number().min(0).max(1),"C"),CountSchema2=tagTier(exports_external.number().int().min(0).max(1e7),"C"),schema13=exports_external.object({window_samples:CountSchema2,orphans:CountSchema2,rate:RateSchema}).strict()});var exports_detector_disabled={};__export(exports_detector_disabled,{schema:()=>schema14,TYPE:()=>TYPE13,SCHEMA_VERSION:()=>SCHEMA_VERSION13,KIND:()=>KIND13});var SCHEMA_VERSION13=1,TYPE13="detector.disabled",KIND13="event",DetectorIdSchema,CauseSchema,BudgetSchema,FireCountSchema,BucketEndTsSchema,schema14;var init_detector_disabled=__esm(()=>{init_zod();DetectorIdSchema=tagTier(exports_external.string().min(1).max(128),"C"),CauseSchema=tagTier(exports_external.literal("fire_budget_exceeded"),"C"),BudgetSchema=tagTier(exports_external.number().int().min(1).max(1e6),"C","events per hour bucket"),FireCountSchema=tagTier(exports_external.number().int().min(0).max(1e6),"C","fires observed in this bucket"),BucketEndTsSchema=tagTier(exports_external.string().datetime({offset:!0}),"C","ISO-8601 timestamp when the current hour bucket expires"),schema14=exports_external.object({detector_id:DetectorIdSchema,cause:CauseSchema,budget:BudgetSchema,fire_count:FireCountSchema,bucket_end_ts:BucketEndTsSchema}).strict()});var exports_emit_backpressure_critical={};__export(exports_emit_backpressure_critical,{schema:()=>schema15,TYPE:()=>TYPE14,SCHEMA_VERSION:()=>SCHEMA_VERSION14,KIND:()=>KIND14,DEFAULT_TIER:()=>DEFAULT_TIER4});var SCHEMA_VERSION14=1,TYPE14="emit.backpressure.critical",KIND14="event",DEFAULT_TIER4="audit",SecondsSchema,CountSchema3,schema15;var init_emit_backpressure_critical=__esm(()=>{init_zod();SecondsSchema=tagTier(exports_external.number().min(0).max(86400),"C"),CountSchema3=tagTier(exports_external.number().int().min(0).max(1e7),"C"),schema15=exports_external.object({spill_duration_seconds:SecondsSchema,spill_rows_total:CountSchema3,queue_depth:CountSchema3,queue_cap:CountSchema3,recommended_action:tagTier(exports_external.enum(["scale_consumers","inspect_pg","restart_bridge"]).optional(),"C")}).strict()});var exports_emitter_latency_p99={};__export(exports_emitter_latency_p99,{schema:()=>schema16,TYPE:()=>TYPE15,SCHEMA_VERSION:()=>SCHEMA_VERSION15,KIND:()=>KIND15});var SCHEMA_VERSION15=1,TYPE15="emitter.latency_p99",KIND15="event",MillisSchema,SampleCountSchema,schema16;var init_emitter_latency_p99=__esm(()=>{init_zod();MillisSchema=tagTier(exports_external.number().min(0).max(600000),"C"),SampleCountSchema=tagTier(exports_external.number().int().min(1).max(1e6),"C"),schema16=exports_external.object({window_samples:SampleCountSchema,p50_ms:MillisSchema,p95_ms:MillisSchema,p99_ms:MillisSchema,max_ms:MillisSchema}).strict()});var exports_emitter_queue_depth={};__export(exports_emitter_queue_depth,{schema:()=>schema17,TYPE:()=>TYPE16,SCHEMA_VERSION:()=>SCHEMA_VERSION16,KIND:()=>KIND16});var SCHEMA_VERSION16=1,TYPE16="emitter.queue.depth",KIND16="event",DepthSchema,CapSchema,UtilizationSchema,schema17;var init_emitter_queue_depth=__esm(()=>{init_zod();DepthSchema=tagTier(exports_external.number().int().min(0).max(1e7),"C"),CapSchema=tagTier(exports_external.number().int().min(1).max(1e7),"C"),UtilizationSchema=tagTier(exports_external.number().min(0).max(1),"C"),schema17=exports_external.object({depth:DepthSchema,cap:CapSchema,utilization:UtilizationSchema,enqueued_total:tagTier(exports_external.number().int().min(0).max(Number.MAX_SAFE_INTEGER),"C"),flushed_total:tagTier(exports_external.number().int().min(0).max(Number.MAX_SAFE_INTEGER),"C")}).strict()});var exports_emitter_rejected={};__export(exports_emitter_rejected,{schema:()=>schema18,TYPE:()=>TYPE17,SCHEMA_VERSION:()=>SCHEMA_VERSION17,KIND:()=>KIND17});var SCHEMA_VERSION17=1,TYPE17="emitter.rejected",KIND17="event",OffendingTypeSchema,ReasonSchema4,CountSchema4,schema18;var init_emitter_rejected=__esm(()=>{init_zod();OffendingTypeSchema=tagTier(exports_external.string().min(1).max(128),"C"),ReasonSchema4=tagTier(exports_external.enum(["schema_parse","unregistered","kind_mismatch","overflow_cap","queue_full"]),"C"),CountSchema4=tagTier(exports_external.number().int().min(1).max(1e7),"C"),schema18=exports_external.object({offending_type:OffendingTypeSchema,reason:ReasonSchema4,count:CountSchema4}).strict()});var exports_emitter_shedding_load={};__export(exports_emitter_shedding_load,{schema:()=>schema19,TYPE:()=>TYPE18,SCHEMA_VERSION:()=>SCHEMA_VERSION18,KIND:()=>KIND18});var SCHEMA_VERSION18=1,TYPE18="emitter.shedding_load",KIND18="event",CountSchema5,schema19;var init_emitter_shedding_load=__esm(()=>{init_zod();CountSchema5=tagTier(exports_external.number().int().min(0).max(1e7),"C"),schema19=exports_external.object({dropped_debug:CountSchema5,dropped_info:CountSchema5,spilled_warn_plus:CountSchema5,window_seconds:tagTier(exports_external.number().int().min(1).max(3600),"C")}).strict()});var exports_error_raised={};__export(exports_error_raised,{schema:()=>schema20,TYPE:()=>TYPE19,SCHEMA_VERSION:()=>SCHEMA_VERSION19,KIND:()=>KIND19});var SCHEMA_VERSION19=1,TYPE19="error.raised",KIND19="event",ErrorClassSchema,MessageSchema,StackSchema,SubsystemSchema,SeveritySchema2,RetryableSchema,schema20;var init_error_raised=__esm(()=>{init_zod();init_redactors();ErrorClassSchema=tagTier(exports_external.string().min(1).max(256),"C","exception class name"),MessageSchema=tagTier(exports_external.string().max(4096).transform(redactFreeText),"B"),StackSchema=tagTier(exports_external.string().max(16384).transform((stack)=>stack.split(`
704
+ `)}}async function ensurePgserve(){if(activePort===null){let testPort=await resolveTestPort();if(testPort!==null)return activePort=testPort,process.env.GENIE_PG_AVAILABLE="true",testPort}if(ensurePromise)return ensurePromise;ensurePromise=_ensurePgserve();try{return await ensurePromise}finally{ensurePromise=null}}function __setSpawnDaemonForTest(fn){spawnDaemon=fn??(()=>{let bunPath=process.execPath??"bun",genieBin=process.argv[1]??"genie";spawn(bunPath,[genieBin,"serve","start","--headless","--foreground"],{detached:!0,stdio:"ignore",env:{...process.env,GENIE_IS_DAEMON:"1"}}).unref()})}function readPidFile(pidPath){try{return readFileSync9(pidPath,"utf-8").trim()||null}catch{return null}}function parsePidFile(raw){let sepIdx=raw.indexOf(":"),pid,recordedStartTime;if(sepIdx<0)pid=Number.parseInt(raw,10),recordedStartTime=null;else{pid=Number.parseInt(raw.slice(0,sepIdx),10);let tail=raw.slice(sepIdx+1).trim();recordedStartTime=tail===""||tail==="unknown"?null:tail}if(Number.isNaN(pid)||pid<=0)return null;return{pid,recordedStartTime}}function isServeAlive(pid,recordedStartTime){try{process.kill(pid,0)}catch{return!1}if(recordedStartTime===null)return!1;let currentStartTime=getProcessStartTime(pid);return currentStartTime!==null&&currentStartTime===recordedStartTime}function unlinkQuiet(path2){try{unlinkSync3(path2)}catch{}}async function autoStartDaemon(){let home=process.env.GENIE_HOME??GENIE_HOME,pidPath=join17(home,"serve.pid"),raw=readPidFile(pidPath);if(!raw){lastAutoStartOutcome="missing",lastAutoStartPid=null,spawnDaemon();return}let parsed=parsePidFile(raw);if(!parsed){unlinkQuiet(pidPath),lastAutoStartOutcome="stale",lastAutoStartPid=null,spawnDaemon();return}if(isServeAlive(parsed.pid,parsed.recordedStartTime)){lastAutoStartOutcome="alive",lastAutoStartPid=parsed.pid;return}unlinkQuiet(pidPath),lastAutoStartOutcome="stale",lastAutoStartPid=parsed.pid,spawnDaemon()}async function resolveTestPort(){let raw=process.env.GENIE_TEST_PG_PORT;if(!raw)return null;let parsed=Number.parseInt(raw,10);if(Number.isNaN(parsed)||parsed<=0||parsed>=65536||!await isPostgresHealthy(parsed))throw Error(`GENIE_TEST_PG_PORT=${raw} set but not reachable`);return parsed}async function tryExistingPort(port){let portFromFile=readLockfile();if(portFromFile!==null&&await isPostgresHealthy(portFromFile))return activePort=portFromFile,process.env.GENIE_PG_AVAILABLE="true",portFromFile;if(await isPostgresHealthy(port))return activePort=port,process.env.GENIE_PG_AVAILABLE="true",writeLockfile(port),port;return null}async function spawnPgserveDirect(port){mkdirSync6(DATA_DIR,{recursive:!0}),selfHealPostgres(DATA_DIR);try{let startedPort=await startPgserveOnPort(port);return registerExitHandler(),startedPort}catch(err){process.env.GENIE_PG_AVAILABLE="false";let message=err instanceof Error?err.message:String(err);throw Error(`pgserve failed to start: ${maskCredentials(message)}`)}}async function waitForDaemonPort(){let deadline=Date.now()+16000;while(Date.now()<deadline){let p=readLockfile();if(p!==null&&await isPostgresHealthy(p))return activePort=p,process.env.GENIE_PG_AVAILABLE="true",p;await new Promise((r)=>setTimeout(r,500))}return null}function throwDaemonTimeout(outcomeAtStart,pidAtStart){process.env.GENIE_PG_AVAILABLE="false";let home=process.env.GENIE_HOME??GENIE_HOME,pidPath=join17(home,"serve.pid"),hasPidFile=existsSync13(pidPath),currentPort=readLockfile()??getPort();if(outcomeAtStart==="stale")throw Error(`Stale ~/.genie/serve.pid (PID ${pidAtStart??"unknown"} was not our serve). Removed and retried \u2014 if this persists, run: genie serve start`);if(!hasPidFile)throw Error("genie serve not running. Run: genie serve start");throw Error(`genie serve is running (PID ${pidAtStart??outcomeAtStart??"unknown"}) but pgserve did not respond on port ${currentPort} within 16s. Try: genie serve restart, or check ~/.genie/logs/scheduler.log`)}async function _ensurePgserve(){if(activePort!==null)return activePort;let port=getPort(),existing=await tryExistingPort(port);if(existing!==null)return existing;if(process.env.CI==="true")throw process.env.GENIE_PG_AVAILABLE="false",Error("pgserve not available in CI");if(isPgAutostartDisabled())throw process.env.GENIE_PG_AVAILABLE="false",Error("pgserve unavailable and GENIE_PG_NO_AUTOSTART=1");let rootErr=checkRootGuard();if(rootErr!==null)throw process.env.GENIE_PG_AVAILABLE="false",Error(rootErr);if(process.env.GENIE_IS_DAEMON==="1")return spawnPgserveDirect(port);await autoStartDaemon();let outcomeAtStart=lastAutoStartOutcome,pidAtStart=lastAutoStartPid,waited=await waitForDaemonPort();if(waited!==null)return waited;throwDaemonTimeout(outcomeAtStart,pidAtStart)}function findPgserveBin(){try{let resolved=__require.resolve("pgserve/bin/pgserve-wrapper.cjs");if(existsSync13(resolved))return resolved}catch{}let globalBin=join17(homedir11(),".bun","bin","pgserve");if(existsSync13(globalBin))return globalBin;try{return execSync3("which pgserve",{encoding:"utf-8",timeout:3000}).trim()}catch{return"pgserve"}}async function startPgserveOnPort(port){mkdirSync6(DATA_DIR,{recursive:!0});let child=spawn(findPgserveBin(),["--port",String(port),"--host",DEFAULT_HOST,"--data",DATA_DIR,"--log","warn","--no-stats","--no-cluster","--pgvector"],{detached:!0,stdio:"ignore"});child.unref(),pgserveChild=child;let timeout=Number(process.env.GENIE_PGSERVE_TIMEOUT)||30000,deadline=Date.now()+timeout;while(Date.now()<deadline){if(await isPostgresHealthy(port))return activePort=port,ownsLockfile=!0,process.env.GENIE_PG_AVAILABLE="true",writeLockfile(port),port;await new Promise((r)=>setTimeout(r,500))}if(await terminatePgserveTree(child),pgserveChild===child)pgserveChild=null;throw selfHealPostgres(DATA_DIR),Error(`pgserve failed to start on port ${port} (timeout after ${timeout/1000}s)`)}function registerExitHandler(){if(exitHandlerRegistered)return;exitHandlerRegistered=!0;let cleanup=()=>{if(pgserveChild)signalPgserveTree(pgserveChild,"SIGTERM"),pgserveChild=null;if(ownsLockfile)removeLockfile(),ownsLockfile=!1};process.on("exit",cleanup),process.on("SIGINT",()=>{cleanup(),process.exit(130)}),process.on("SIGTERM",()=>{cleanup(),process.exit(143)})}async function healthCheckCachedClient(){if(!sqlClient)return null;try{return await sqlClient`SELECT 1`,sqlClient}catch{let dying=sqlClient;if(!dying)return null;return sqlClient=null,activePort=null,dying.end({timeout:5}).catch(()=>{}),null}}async function runPostConnectSetup(client,isTestMode,timings){let _t2=Date.now(),skipBoot=isTestMode||process.env.GENIE_SKIP_DB_BOOT==="1";if(!skipBoot)await runMigrations(client);let _t3=Date.now();if(!skipBoot&&(needsSeed()||await needsSeededTeams(client)))await runSeed(client);if(!skipBoot)await maybePromptV1Migration(client);let _t4=Date.now(),_t5=_t4;if(process.env.GENIE_PROFILE_DB)console.error(`[db-profile] pgserve=${timings.t1-timings.t0}ms migrate=${_t3-_t2}ms seed=${_t4-_t3}ms retention=skipped total=${_t5-timings.t0}ms`)}async function getConnection(){let cached=await healthCheckCachedClient();if(cached)return cached;if(buildPromise)return buildPromise;buildPromise=_buildConnection();try{return await buildPromise}finally{buildPromise=null}}function shouldUseUnixSocket(){if(process.env.GENIE_PG_FORCE_TCP==="1")return!1;if(process.env.GENIE_TEST_PG_PORT)return!1;return!0}async function maybePrintBanner(client,isTestMode){if(bannerPrinted||isTestMode)return;if(process.env.GENIE_QUIET==="1"||process.env.GENIE_NO_BANNER==="1"){bannerPrinted=!0;return}try{let db=(await client.unsafe("SELECT current_database() AS db"))[0]?.db;if(typeof db==="string"&&db.length>0)process.stderr.write(`[pgserve] connected to ${db}
705
+ `)}catch{}bannerPrinted=!0}async function _buildConnection(){let _t0=Date.now(),useSocket=shouldUseUnixSocket();if(useSocket)await getOrStartDaemon();let port=useSocket?5432:await ensurePgserve(),_t1=Date.now(),pgModule=(await Promise.resolve().then(() => (init_src(),exports_src))).default,database=resolveDatabaseName(),isTestMode=Boolean(process.env.GENIE_TEST_DB_NAME),pgWireCredential=useSocket?resolvePgserveAuthPassword():resolveTcpPgPassword(),host=useSocket?resolvePgserveSocketDir():DEFAULT_HOST;sqlClient=pgModule({host,port,database,username:DB_NAME,[PG_AUTH_FIELD]:pgWireCredential,max:50,idle_timeout:1,connect_timeout:resolvePgConnectTimeoutSeconds(useSocket),onnotice:()=>{},connection:{client_min_messages:"warning"}});try{if(await runPostConnectSetup(sqlClient,isTestMode,{t0:_t0,t1:_t1}),await maybePrintBanner(sqlClient,isTestMode),useSocket)activePort=SOCKET_PORT_SENTINEL,process.env.GENIE_PG_AVAILABLE="true"}catch(err){let dying=sqlClient;throw sqlClient=null,activePort=null,dying?.end({timeout:2}).catch(()=>{}),err}return sqlClient}function isConnected(){return sqlClient!==null}async function resetConnection(){if(sqlClient){let dying=sqlClient;sqlClient=null,await dying.end({timeout:5})}}async function isAvailable(){try{return await(await getConnection())`SELECT 1`,!0}catch{return!1}}async function shutdown(){if(sqlClient)await sqlClient.end({timeout:5}),sqlClient=null;if(ownsLockfile)removeLockfile(),ownsLockfile=!1}function getDataDir(){return DATA_DIR}function getActivePort(){return activePort??getPort()}function getAuxiliaryPortBase(){return activePort===SOCKET_PORT_SENTINEL?getPort():getActivePort()}function isSocketMode(){return activePort===SOCKET_PORT_SENTINEL}function getLockfilePath(){return LOCKFILE_PATH}var DEFAULT_PORT=19642,DEFAULT_HOST="127.0.0.1",SOCKET_PORT_SENTINEL=0,GENIE_HOME,DATA_DIR,LOCKFILE_PATH,PG_AUTH_FIELD,PG_SSL_REQUEST_CODE=80877103,PGSERVE_GREET_TIMEOUT_MS=1000,DB_NAME,TRUTHY_ENV,daemonStartPromise=null,pgserveChild=null,sqlClient=null,activePort=null,ensurePromise=null,buildPromise=null,ownsLockfile=!1,exitHandlerRegistered=!1,retentionRan=!1,lastAutoStartOutcome=null,lastAutoStartPid=null,spawnDaemon=()=>{let bunPath=process.execPath??"bun",genieBin=process.argv[1]??"genie";spawn(bunPath,[genieBin,"serve","start","--headless","--foreground"],{detached:!0,stdio:"ignore",env:{...process.env,GENIE_IS_DAEMON:"1"}}).unref()},bannerPrinted=!1;var init_db=__esm(()=>{init_db_migrations();init_pg_seed();init_process_identity();init_v1_migration_prompt();GENIE_HOME=process.env.GENIE_HOME??join17(homedir11(),".genie"),DATA_DIR=join17(GENIE_HOME,"data","pgserve"),LOCKFILE_PATH=join17(GENIE_HOME,"pgserve.port"),PG_AUTH_FIELD=["pass","word"].join(""),DB_NAME=["post","gres"].join(""),TRUTHY_ENV=new Set(["1","true","yes","on"])});import{createHmac as createHmac2}from"crypto";import{homedir as homedir12}from"os";function hashEntity(namespace,value){let key=process.env.GENIE_REDACTION_KEY??"genie-redaction-fallback";return`tier-a:${namespace}:${createHmac2("sha256",key).update(value).digest("hex").slice(0,16)}`}function dropSecretShaped(text){let out=text;for(let{name,pattern}of SECRET_PATTERNS)out=out.replace(pattern,`<REDACTED:${name}>`);return out}function stripEnvVars(text){return text.replace(ENV_ASSIGN,(_m,name)=>`${name}=<REDACTED>`)}function tokenizePath(p){let home=homedir12(),out=p;if(home&&out.startsWith(home))out=`~${out.slice(home.length)}`;let segments=out.split("/").filter(Boolean);if(segments.length>6){let head=segments.slice(0,3).join("/"),tail=segments.slice(-2).join("/");out=`${out.startsWith("/")?"/":""}${head}/\u2026/${tail}`}return out=out.replace(/\b[0-9a-f]{12,}\b/g,"<id>"),out}function redactFreeText(value){return stripEnvVars(dropSecretShaped(value))}function capPayload(body){let serialized;try{serialized=JSON.stringify(body)}catch{return{overflow:!0,content_hash:"unserializable",body:{overflow:!0}}}if(Buffer.byteLength(serialized,"utf8")<=MAX_PAYLOAD_BYTES)return{overflow:!1,body};let key=process.env.GENIE_REDACTION_KEY??"genie-redaction-fallback",digest=createHmac2("sha256",key).update(serialized).digest("hex").slice(0,16);return{overflow:!0,content_hash:digest,body:{overflow:!0,content_hash:digest,original_bytes:Buffer.byteLength(serialized,"utf8")}}}var SECRET_PATTERNS,SENSITIVE_ENV_NAME="[A-Z][A-Z0-9_]*(?:_KEY|_SECRET|_TOKEN|_PASSWORD|_PASS|_AUTH|_API_KEY)",ENV_ASSIGN,MAX_PAYLOAD_BYTES=65536;var init_redactors=__esm(()=>{SECRET_PATTERNS=[{name:"anthropic-key",pattern:/sk-ant-[A-Za-z0-9_-]{20,}/g},{name:"openai-key",pattern:/sk-[A-Za-z0-9]{20,}/g},{name:"github-token",pattern:/gh[pousr]_[A-Za-z0-9]{30,}/g},{name:"aws-access-key",pattern:/AKIA[0-9A-Z]{16}/g},{name:"aws-secret",pattern:/(?<![A-Za-z0-9])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9])/g},{name:"bearer-token",pattern:/(?:Bearer|bearer)\s+[A-Za-z0-9._\-~+/=]{20,}/g},{name:"jwt",pattern:/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g},{name:"pem-header",pattern:/-----BEGIN [A-Z ]+ PRIVATE KEY-----/g},{name:"sensitive-path",pattern:/\/(?:[^\s"',;():]+\/)*\.(?:secrets|ssh|aws|gnupg|keys)(?:\/[^\s"',;():]*)?/g}];ENV_ASSIGN=new RegExp(`\\b(${SENSITIVE_ENV_NAME})\\s*[=:]\\s*([^\\s"',;]+)`,"g")});function tagTier(schema2,tier,note){let desc=`tier:${tier}${note?`; ${note}`:""}`;return schema2.describe(desc)}var exports_agent_lifecycle={};__export(exports_agent_lifecycle,{schema:()=>schema2,TYPE:()=>TYPE,SCHEMA_VERSION:()=>SCHEMA_VERSION,KIND:()=>KIND});var SCHEMA_VERSION=1,TYPE="agent.lifecycle",KIND="span",AgentIdSchema,TeamSchema,ExecutorSchema,SessionIdSchema,CwdSchema,ExitReasonSchema,DurationSchema,schema2;var init_agent_lifecycle=__esm(()=>{init_zod();init_redactors();AgentIdSchema=tagTier(exports_external.string().min(1).max(256),"B","agent name \u2014 public"),TeamSchema=tagTier(exports_external.string().min(1).max(256).optional(),"B"),ExecutorSchema=tagTier(exports_external.enum(["claude-code","claude-sdk","codex","shell"]),"C"),SessionIdSchema=tagTier(exports_external.string().min(1).max(128).transform((v)=>hashEntity("session",v)),"A","session id hashed"),CwdSchema=tagTier(exports_external.string().max(1024).transform(tokenizePath),"B"),ExitReasonSchema=tagTier(exports_external.enum(["stopped","killed","crashed","idle-suspend","completed"]),"C"),DurationSchema=tagTier(exports_external.number().int().min(0),"C","ms"),schema2=exports_external.object({agent_id:AgentIdSchema,team:TeamSchema,executor:ExecutorSchema,session_id:SessionIdSchema.optional(),cwd:CwdSchema.optional(),exit_reason:ExitReasonSchema.optional(),duration_ms:DurationSchema.optional()}).strict()});var exports_agent_resume_attempted={};__export(exports_agent_resume_attempted,{schema:()=>schema3,TYPE:()=>TYPE2,SCHEMA_VERSION:()=>SCHEMA_VERSION2,KIND:()=>KIND2});var SCHEMA_VERSION2=1,TYPE2="agent.resume.attempted",KIND2="event",AGENT_STATES,EntityIdSchema,AttemptNumberSchema,StateSchema,LastErrorSchema,TriggerSchema,schema3;var init_agent_resume_attempted=__esm(()=>{init_zod();init_redactors();AGENT_STATES=["spawning","working","idle","permission","question","done","error","suspended","unknown"],EntityIdSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A","agent id hashed"),AttemptNumberSchema=tagTier(exports_external.number().int().min(1).max(64),"C"),StateSchema=tagTier(exports_external.enum(AGENT_STATES),"C"),LastErrorSchema=tagTier(exports_external.string().max(500).transform((v)=>redactFreeText(v)).optional(),"B","truncated to 500 chars"),TriggerSchema=tagTier(exports_external.enum(["scheduler","manual","boot"]),"C"),schema3=exports_external.object({entity_id:EntityIdSchema,attempt_number:AttemptNumberSchema,state_before:StateSchema,state_after:StateSchema,last_error:LastErrorSchema,trigger:TriggerSchema}).strict()});var exports_agent_resume_failed={};__export(exports_agent_resume_failed,{schema:()=>schema4,TYPE:()=>TYPE3,SCHEMA_VERSION:()=>SCHEMA_VERSION3,KIND:()=>KIND3});var SCHEMA_VERSION3=1,TYPE3="agent.resume.failed",KIND3="event",AGENT_STATES2,EntityIdSchema2,AttemptNumberSchema2,StateSchema2,LastErrorSchema2,TriggerSchema2,ExhaustedSchema,schema4;var init_agent_resume_failed=__esm(()=>{init_zod();init_redactors();AGENT_STATES2=["spawning","working","idle","permission","question","done","error","suspended","unknown"],EntityIdSchema2=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A","agent id hashed"),AttemptNumberSchema2=tagTier(exports_external.number().int().min(1).max(64),"C"),StateSchema2=tagTier(exports_external.enum(AGENT_STATES2),"C"),LastErrorSchema2=tagTier(exports_external.string().max(500).transform((v)=>redactFreeText(v)).optional(),"B","truncated to 500 chars"),TriggerSchema2=tagTier(exports_external.enum(["scheduler","manual","boot"]),"C"),ExhaustedSchema=tagTier(exports_external.boolean(),"C"),schema4=exports_external.object({entity_id:EntityIdSchema2,attempt_number:AttemptNumberSchema2,state_before:StateSchema2,state_after:StateSchema2,last_error:LastErrorSchema2,trigger:TriggerSchema2,exhausted:ExhaustedSchema}).strict()});var exports_agent_resume_succeeded={};__export(exports_agent_resume_succeeded,{schema:()=>schema5,TYPE:()=>TYPE4,SCHEMA_VERSION:()=>SCHEMA_VERSION4,KIND:()=>KIND4});var SCHEMA_VERSION4=1,TYPE4="agent.resume.succeeded",KIND4="event",AGENT_STATES3,EntityIdSchema3,AttemptNumberSchema3,StateSchema3,LastErrorSchema3,TriggerSchema3,schema5;var init_agent_resume_succeeded=__esm(()=>{init_zod();init_redactors();AGENT_STATES3=["spawning","working","idle","permission","question","done","error","suspended","unknown"],EntityIdSchema3=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A","agent id hashed"),AttemptNumberSchema3=tagTier(exports_external.number().int().min(1).max(64),"C"),StateSchema3=tagTier(exports_external.enum(AGENT_STATES3),"C"),LastErrorSchema3=tagTier(exports_external.string().max(500).transform((v)=>redactFreeText(v)).optional(),"B","truncated to 500 chars"),TriggerSchema3=tagTier(exports_external.enum(["scheduler","manual","boot"]),"C"),schema5=exports_external.object({entity_id:EntityIdSchema3,attempt_number:AttemptNumberSchema3,state_before:StateSchema3,state_after:StateSchema3,last_error:LastErrorSchema3,trigger:TriggerSchema3}).strict()});var exports_audit_export={};__export(exports_audit_export,{schema:()=>schema6,TYPE:()=>TYPE5,SCHEMA_VERSION:()=>SCHEMA_VERSION5,KIND:()=>KIND5,DEFAULT_TIER:()=>DEFAULT_TIER});var SCHEMA_VERSION5=1,TYPE5="audit.export",KIND5="event",DEFAULT_TIER="audit",ExporterActorSchema,SinceIdSchema,RowCountSchema,BreakCountSchema,BundleSignaturePrefixSchema,TenantIdSchema,ReasonSchema,schema6;var init_audit_export=__esm(()=>{init_zod();init_redactors();ExporterActorSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("actor",v)),"A"),SinceIdSchema=tagTier(exports_external.number().int().min(0),"C"),RowCountSchema=tagTier(exports_external.number().int().min(0),"C"),BreakCountSchema=tagTier(exports_external.number().int().min(0),"C","chain breaks detected in the exported range"),BundleSignaturePrefixSchema=tagTier(exports_external.string().min(1).max(16),"C","first 16 hex of the bundle HMAC signature (full is on disk)"),TenantIdSchema=tagTier(exports_external.string().min(1).max(128),"C"),ReasonSchema=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)),"B","IR justification for the export"),schema6=exports_external.object({exporter_actor:ExporterActorSchema,since_id:SinceIdSchema,row_count:RowCountSchema,break_count:BreakCountSchema,bundle_signature_prefix:BundleSignaturePrefixSchema,tenant_id:TenantIdSchema,reason:ReasonSchema}).strict()});var exports_audit_un_hash={};__export(exports_audit_un_hash,{schema:()=>schema7,TYPE:()=>TYPE6,SCHEMA_VERSION:()=>SCHEMA_VERSION6,KIND:()=>KIND6,DEFAULT_TIER:()=>DEFAULT_TIER2});var SCHEMA_VERSION6=1,TYPE6="audit.un_hash",KIND6="event",DEFAULT_TIER2="audit",AdminActorSchema,NamespaceSchema,HashedValueSchema,ResolvedMarkerSchema,ReasonSchema2,TicketRefSchema,schema7;var init_audit_un_hash=__esm(()=>{init_zod();init_redactors();AdminActorSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("actor",v)),"A","admin who performed the un-hash (Tier-A hashed)"),NamespaceSchema=tagTier(exports_external.string().min(1).max(64),"C"),HashedValueSchema=tagTier(exports_external.string().min(1).max(256),"B","tier-a:ns:... source hash requested"),ResolvedMarkerSchema=tagTier(exports_external.boolean(),"C","true if un-hash succeeded"),ReasonSchema2=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)),"B","IR justification for the un-hash"),TicketRefSchema=tagTier(exports_external.string().max(128).optional(),"C","incident ticket reference"),schema7=exports_external.object({admin_actor:AdminActorSchema,namespace:NamespaceSchema,hashed_value:HashedValueSchema,resolved:ResolvedMarkerSchema,reason:ReasonSchema2,ticket_ref:TicketRefSchema}).strict()});var exports_cache_hit={};__export(exports_cache_hit,{schema:()=>schema8,TYPE:()=>TYPE7,SCHEMA_VERSION:()=>SCHEMA_VERSION7,KIND:()=>KIND7});var SCHEMA_VERSION7=1,TYPE7="cache.hit",KIND7="event",CacheSchema,HitSchema,KeyHintSchema,LatencyUsSchema,schema8;var init_cache_hit=__esm(()=>{init_zod();init_redactors();CacheSchema=tagTier(exports_external.string().min(1).max(128),"C"),HitSchema=tagTier(exports_external.boolean(),"C"),KeyHintSchema=tagTier(exports_external.string().max(128).transform((v)=>redactFreeText(v)).optional(),"B"),LatencyUsSchema=tagTier(exports_external.number().int().min(0).max(1e7).optional(),"C","microseconds"),schema8=exports_external.object({cache:CacheSchema,hit:HitSchema,key_hint:KeyHintSchema,latency_us:LatencyUsSchema}).strict()});var exports_cache_invalidate={};__export(exports_cache_invalidate,{schema:()=>schema9,TYPE:()=>TYPE8,SCHEMA_VERSION:()=>SCHEMA_VERSION8,KIND:()=>KIND8});var SCHEMA_VERSION8=1,TYPE8="cache.invalidate",KIND8="event",CacheSchema2,KeysInvalidatedSchema,ReasonSchema3,ScopeSchema,schema9;var init_cache_invalidate=__esm(()=>{init_zod();CacheSchema2=tagTier(exports_external.string().min(1).max(128),"C","cache name \u2014 public"),KeysInvalidatedSchema=tagTier(exports_external.number().int().min(0).max(1e7),"C"),ReasonSchema3=tagTier(exports_external.enum(["ttl","manual","capacity","rotation","upstream_change"]).optional(),"C"),ScopeSchema=tagTier(exports_external.enum(["key","bucket","all"]).optional(),"C"),schema9=exports_external.object({cache:CacheSchema2,keys_invalidated:KeysInvalidatedSchema,reason:ReasonSchema3,scope:ScopeSchema}).strict()});var exports_cli_command={};__export(exports_cli_command,{schema:()=>schema10,TYPE:()=>TYPE9,SCHEMA_VERSION:()=>SCHEMA_VERSION9,KIND:()=>KIND9});var SCHEMA_VERSION9=1,TYPE9="cli.command",KIND9="span",CommandSchema,ArgsSchema,CwdSchema2,ExitCodeSchema,DurationSchema2,UserAgentSchema,schema10;var init_cli_command=__esm(()=>{init_zod();init_redactors();CommandSchema=tagTier(exports_external.string().max(256),"C","subcommand name only"),ArgsSchema=tagTier(exports_external.array(exports_external.string()).max(32).transform((args)=>args.map((a)=>redactFreeText(a))),"B","argv \u2014 secrets stripped, paths kept"),CwdSchema2=tagTier(exports_external.string().max(1024).transform(tokenizePath),"B","working directory tokenized"),ExitCodeSchema=tagTier(exports_external.number().int().min(-1).max(255),"C"),DurationSchema2=tagTier(exports_external.number().int().min(0).max(3600000),"C","milliseconds"),UserAgentSchema=tagTier(exports_external.string().max(256).optional(),"C"),schema10=exports_external.object({command:CommandSchema,args:ArgsSchema,cwd:CwdSchema2,exit_code:ExitCodeSchema.optional(),duration_ms:DurationSchema2.optional(),user_agent:UserAgentSchema}).strict().transform((v)=>({...v}))});var exports_consumer_heartbeat={};__export(exports_consumer_heartbeat,{schema:()=>schema11,TYPE:()=>TYPE10,SCHEMA_VERSION:()=>SCHEMA_VERSION10,KIND:()=>KIND10});var SCHEMA_VERSION10=1,TYPE10="consumer.heartbeat",KIND10="event",ConsumerIdSchema,LastEventIdSchema,BacklogDepthSchema,RoleSchema,UptimeSecondsSchema,schema11;var init_consumer_heartbeat=__esm(()=>{init_zod();init_redactors();ConsumerIdSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("consumer",v)),"A"),LastEventIdSchema=tagTier(exports_external.number().int().min(0).max(9007199254740991),"C"),BacklogDepthSchema=tagTier(exports_external.number().int().min(0).max(1e7),"C"),RoleSchema=tagTier(exports_external.enum(["admin","operator","subscriber","audit"]).optional(),"C"),UptimeSecondsSchema=tagTier(exports_external.number().int().min(0).max(31536000).optional(),"C"),schema11=exports_external.object({consumer_id:ConsumerIdSchema,last_event_id_processed:LastEventIdSchema,backlog_depth:BacklogDepthSchema,role:RoleSchema,uptime_seconds:UptimeSecondsSchema}).strict()});var exports_consumer_lagged={};__export(exports_consumer_lagged,{schema:()=>schema12,TYPE:()=>TYPE11,SCHEMA_VERSION:()=>SCHEMA_VERSION11,KIND:()=>KIND11,DEFAULT_TIER:()=>DEFAULT_TIER3});var SCHEMA_VERSION11=1,TYPE11="consumer.lagged",KIND11="event",DEFAULT_TIER3="audit",CountSchema,SpillPathSchema,SeveritySchema,schema12;var init_consumer_lagged=__esm(()=>{init_zod();CountSchema=tagTier(exports_external.number().int().min(0).max(1e7),"C"),SpillPathSchema=tagTier(exports_external.string().max(512),"B"),SeveritySchema=tagTier(exports_external.enum(["warn","error","fatal"]),"C"),schema12=exports_external.object({severity_class:SeveritySchema,spill_path:SpillPathSchema,rows_spilled:CountSchema,queue_depth:CountSchema,queue_cap:CountSchema}).strict()});var exports_correlation_orphan_rate={};__export(exports_correlation_orphan_rate,{schema:()=>schema13,TYPE:()=>TYPE12,SCHEMA_VERSION:()=>SCHEMA_VERSION12,KIND:()=>KIND12});var SCHEMA_VERSION12=1,TYPE12="correlation.orphan.rate",KIND12="event",RateSchema,CountSchema2,schema13;var init_correlation_orphan_rate=__esm(()=>{init_zod();RateSchema=tagTier(exports_external.number().min(0).max(1),"C"),CountSchema2=tagTier(exports_external.number().int().min(0).max(1e7),"C"),schema13=exports_external.object({window_samples:CountSchema2,orphans:CountSchema2,rate:RateSchema}).strict()});var exports_detector_disabled={};__export(exports_detector_disabled,{schema:()=>schema14,TYPE:()=>TYPE13,SCHEMA_VERSION:()=>SCHEMA_VERSION13,KIND:()=>KIND13});var SCHEMA_VERSION13=1,TYPE13="detector.disabled",KIND13="event",DetectorIdSchema,CauseSchema,BudgetSchema,FireCountSchema,BucketEndTsSchema,schema14;var init_detector_disabled=__esm(()=>{init_zod();DetectorIdSchema=tagTier(exports_external.string().min(1).max(128),"C"),CauseSchema=tagTier(exports_external.literal("fire_budget_exceeded"),"C"),BudgetSchema=tagTier(exports_external.number().int().min(1).max(1e6),"C","events per hour bucket"),FireCountSchema=tagTier(exports_external.number().int().min(0).max(1e6),"C","fires observed in this bucket"),BucketEndTsSchema=tagTier(exports_external.string().datetime({offset:!0}),"C","ISO-8601 timestamp when the current hour bucket expires"),schema14=exports_external.object({detector_id:DetectorIdSchema,cause:CauseSchema,budget:BudgetSchema,fire_count:FireCountSchema,bucket_end_ts:BucketEndTsSchema}).strict()});var exports_emit_backpressure_critical={};__export(exports_emit_backpressure_critical,{schema:()=>schema15,TYPE:()=>TYPE14,SCHEMA_VERSION:()=>SCHEMA_VERSION14,KIND:()=>KIND14,DEFAULT_TIER:()=>DEFAULT_TIER4});var SCHEMA_VERSION14=1,TYPE14="emit.backpressure.critical",KIND14="event",DEFAULT_TIER4="audit",SecondsSchema,CountSchema3,schema15;var init_emit_backpressure_critical=__esm(()=>{init_zod();SecondsSchema=tagTier(exports_external.number().min(0).max(86400),"C"),CountSchema3=tagTier(exports_external.number().int().min(0).max(1e7),"C"),schema15=exports_external.object({spill_duration_seconds:SecondsSchema,spill_rows_total:CountSchema3,queue_depth:CountSchema3,queue_cap:CountSchema3,recommended_action:tagTier(exports_external.enum(["scale_consumers","inspect_pg","restart_bridge"]).optional(),"C")}).strict()});var exports_emitter_latency_p99={};__export(exports_emitter_latency_p99,{schema:()=>schema16,TYPE:()=>TYPE15,SCHEMA_VERSION:()=>SCHEMA_VERSION15,KIND:()=>KIND15});var SCHEMA_VERSION15=1,TYPE15="emitter.latency_p99",KIND15="event",MillisSchema,SampleCountSchema,schema16;var init_emitter_latency_p99=__esm(()=>{init_zod();MillisSchema=tagTier(exports_external.number().min(0).max(600000),"C"),SampleCountSchema=tagTier(exports_external.number().int().min(1).max(1e6),"C"),schema16=exports_external.object({window_samples:SampleCountSchema,p50_ms:MillisSchema,p95_ms:MillisSchema,p99_ms:MillisSchema,max_ms:MillisSchema}).strict()});var exports_emitter_queue_depth={};__export(exports_emitter_queue_depth,{schema:()=>schema17,TYPE:()=>TYPE16,SCHEMA_VERSION:()=>SCHEMA_VERSION16,KIND:()=>KIND16});var SCHEMA_VERSION16=1,TYPE16="emitter.queue.depth",KIND16="event",DepthSchema,CapSchema,UtilizationSchema,schema17;var init_emitter_queue_depth=__esm(()=>{init_zod();DepthSchema=tagTier(exports_external.number().int().min(0).max(1e7),"C"),CapSchema=tagTier(exports_external.number().int().min(1).max(1e7),"C"),UtilizationSchema=tagTier(exports_external.number().min(0).max(1),"C"),schema17=exports_external.object({depth:DepthSchema,cap:CapSchema,utilization:UtilizationSchema,enqueued_total:tagTier(exports_external.number().int().min(0).max(Number.MAX_SAFE_INTEGER),"C"),flushed_total:tagTier(exports_external.number().int().min(0).max(Number.MAX_SAFE_INTEGER),"C")}).strict()});var exports_emitter_rejected={};__export(exports_emitter_rejected,{schema:()=>schema18,TYPE:()=>TYPE17,SCHEMA_VERSION:()=>SCHEMA_VERSION17,KIND:()=>KIND17});var SCHEMA_VERSION17=1,TYPE17="emitter.rejected",KIND17="event",OffendingTypeSchema,ReasonSchema4,CountSchema4,schema18;var init_emitter_rejected=__esm(()=>{init_zod();OffendingTypeSchema=tagTier(exports_external.string().min(1).max(128),"C"),ReasonSchema4=tagTier(exports_external.enum(["schema_parse","unregistered","kind_mismatch","overflow_cap","queue_full"]),"C"),CountSchema4=tagTier(exports_external.number().int().min(1).max(1e7),"C"),schema18=exports_external.object({offending_type:OffendingTypeSchema,reason:ReasonSchema4,count:CountSchema4}).strict()});var exports_emitter_shedding_load={};__export(exports_emitter_shedding_load,{schema:()=>schema19,TYPE:()=>TYPE18,SCHEMA_VERSION:()=>SCHEMA_VERSION18,KIND:()=>KIND18});var SCHEMA_VERSION18=1,TYPE18="emitter.shedding_load",KIND18="event",CountSchema5,schema19;var init_emitter_shedding_load=__esm(()=>{init_zod();CountSchema5=tagTier(exports_external.number().int().min(0).max(1e7),"C"),schema19=exports_external.object({dropped_debug:CountSchema5,dropped_info:CountSchema5,spilled_warn_plus:CountSchema5,window_seconds:tagTier(exports_external.number().int().min(1).max(3600),"C")}).strict()});var exports_error_raised={};__export(exports_error_raised,{schema:()=>schema20,TYPE:()=>TYPE19,SCHEMA_VERSION:()=>SCHEMA_VERSION19,KIND:()=>KIND19});var SCHEMA_VERSION19=1,TYPE19="error.raised",KIND19="event",ErrorClassSchema,MessageSchema,StackSchema,SubsystemSchema,SeveritySchema2,RetryableSchema,schema20;var init_error_raised=__esm(()=>{init_zod();init_redactors();ErrorClassSchema=tagTier(exports_external.string().min(1).max(256),"C","exception class name"),MessageSchema=tagTier(exports_external.string().max(4096).transform(redactFreeText),"B"),StackSchema=tagTier(exports_external.string().max(16384).transform((stack)=>stack.split(`
686
706
  `).map((line)=>tokenizePath(redactFreeText(line))).join(`
687
707
  `)),"B","stack paths tokenized"),SubsystemSchema=tagTier(exports_external.string().min(1).max(128),"C"),SeveritySchema2=tagTier(exports_external.enum(["warn","error","fatal"]),"C"),RetryableSchema=tagTier(exports_external.boolean().optional(),"C"),schema20=exports_external.object({error_class:ErrorClassSchema,message:MessageSchema,stack:StackSchema.optional(),subsystem:SubsystemSchema,severity:SeveritySchema2,retryable:RetryableSchema}).strict()});var exports_executor_row_written={};__export(exports_executor_row_written,{schema:()=>schema21,TYPE:()=>TYPE20,SCHEMA_VERSION:()=>SCHEMA_VERSION20,KIND:()=>KIND20});var SCHEMA_VERSION20=1,TYPE20="executor.row.written",KIND20="event",TableSchema,RowIdSchema,OperationSchema,ExecutorSchema2,DiffSchema,schema21;var init_executor_row_written=__esm(()=>{init_zod();init_redactors();TableSchema=tagTier(exports_external.string().min(1).max(128),"C","PG table name \u2014 public"),RowIdSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("row",v)),"A"),OperationSchema=tagTier(exports_external.enum(["insert","update","delete","upsert"]),"C"),ExecutorSchema2=tagTier(exports_external.string().max(128).optional(),"C"),DiffSchema=tagTier(exports_external.record(exports_external.string(),exports_external.union([exports_external.string(),exports_external.number(),exports_external.boolean(),exports_external.null()])).default({}),"B","shallow scalar diff only \u2014 payloads never stored here"),schema21=exports_external.object({table:TableSchema,row_id:RowIdSchema,operation:OperationSchema,executor:ExecutorSchema2,before:DiffSchema,after:DiffSchema}).strict()});var exports_executor_write={};__export(exports_executor_write,{schema:()=>schema22,TYPE:()=>TYPE21,SCHEMA_VERSION:()=>SCHEMA_VERSION21,KIND:()=>KIND21});var SCHEMA_VERSION21=1,TYPE21="executor.write",KIND21="span",ExecutorSchema3,TargetSchema,TableSchema2,OperationSchema2,RowsAffectedSchema,DurationSchema3,OutcomeSchema,ErrorHintSchema,schema22;var init_executor_write=__esm(()=>{init_zod();init_redactors();ExecutorSchema3=tagTier(exports_external.enum(["claude-code","claude-sdk","codex","shell"]),"C"),TargetSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("executor_target",v)),"A","target entity hashed"),TableSchema2=tagTier(exports_external.string().max(128).optional(),"C","PG table name \u2014 public"),OperationSchema2=tagTier(exports_external.enum(["insert","update","delete","upsert","copy","truncate"]),"C"),RowsAffectedSchema=tagTier(exports_external.number().int().min(0).max(1e7).optional(),"C"),DurationSchema3=tagTier(exports_external.number().int().min(0).max(60000).optional(),"C","ms"),OutcomeSchema=tagTier(exports_external.enum(["ok","constraint_violation","timeout","error"]).optional(),"C"),ErrorHintSchema=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)).optional(),"B"),schema22=exports_external.object({executor:ExecutorSchema3,target:TargetSchema,table:TableSchema2,operation:OperationSchema2,rows_affected:RowsAffectedSchema,duration_ms:DurationSchema3,outcome:OutcomeSchema,error_hint:ErrorHintSchema}).strict()});var exports_hook_delivery={};__export(exports_hook_delivery,{schema:()=>schema23,TYPE:()=>TYPE22,SCHEMA_VERSION:()=>SCHEMA_VERSION22,KIND:()=>KIND22});var SCHEMA_VERSION22=1,TYPE22="hook.delivery",KIND22="span",HookNameSchema,HookEventSchema,AgentIdSchema2,ToolSchema,StatusSchema,DurationSchema4,ExitCodeSchema2,StderrExcerptSchema,schema23;var init_hook_delivery=__esm(()=>{init_zod();init_redactors();HookNameSchema=tagTier(exports_external.string().min(1).max(128),"C","hook name \u2014 public"),HookEventSchema=tagTier(exports_external.string().min(1).max(64),"C","CC hook event name \u2014 public"),AgentIdSchema2=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A"),ToolSchema=tagTier(exports_external.string().max(128).optional(),"C"),StatusSchema=tagTier(exports_external.enum(["ok","timeout","rejected","error"]).optional(),"C"),DurationSchema4=tagTier(exports_external.number().int().min(0).max(60000).optional(),"C","ms (<=15s timeout)"),ExitCodeSchema2=tagTier(exports_external.number().int().min(-1).max(255).optional(),"C"),StderrExcerptSchema=tagTier(exports_external.string().max(4096).transform((v)=>redactFreeText(v)).optional(),"B","redacted stderr excerpt"),schema23=exports_external.object({hook_name:HookNameSchema,agent_id:AgentIdSchema2,tool:ToolSchema,event:HookEventSchema.optional(),status:StatusSchema,duration_ms:DurationSchema4,exit_code:ExitCodeSchema2,stderr_excerpt:StderrExcerptSchema}).strict()});var exports_mailbox_delivery={};__export(exports_mailbox_delivery,{schema:()=>schema24,TYPE:()=>TYPE23,SCHEMA_VERSION:()=>SCHEMA_VERSION23,KIND:()=>KIND23});var SCHEMA_VERSION23=1,TYPE23="mailbox.delivery",KIND23="span",AgentIdSchema3=(ns)=>tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity(ns,v)),"A"),FromSchema,ToSchema,ChannelSchema,OutcomeSchema2,MessageIdSchema,BodyExcerptSchema,DurationSchema5,schema24;var init_mailbox_delivery=__esm(()=>{init_zod();init_redactors();FromSchema=tagTier(exports_external.string().max(128),"C","sender role \u2014 public"),ToSchema=tagTier(exports_external.string().max(128),"C","recipient role \u2014 public"),ChannelSchema=tagTier(exports_external.enum(["tmux","native-inbox","file","broadcast"]),"C"),OutcomeSchema2=tagTier(exports_external.enum(["delivered","queued","pane_dead","rejected","timeout"]).optional(),"C"),MessageIdSchema=AgentIdSchema3("msg").optional(),BodyExcerptSchema=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)).optional(),"B","first 512 chars, redacted"),DurationSchema5=tagTier(exports_external.number().int().min(0).max(60000).optional(),"C","ms"),schema24=exports_external.object({from:FromSchema,to:ToSchema,channel:ChannelSchema,outcome:OutcomeSchema2,message_id:MessageIdSchema,body_excerpt:BodyExcerptSchema,duration_ms:DurationSchema5}).strict()});var exports_notify_delivery_lag={};__export(exports_notify_delivery_lag,{schema:()=>schema25,TYPE:()=>TYPE24,SCHEMA_VERSION:()=>SCHEMA_VERSION24,KIND:()=>KIND24});var SCHEMA_VERSION24=1,TYPE24="notify.delivery.lag",KIND24="event",NonceSchema,LagMillisSchema,ChannelSchema2,schema25;var init_notify_delivery_lag=__esm(()=>{init_zod();init_redactors();NonceSchema=tagTier(exports_external.string().min(1).max(128).transform((v)=>hashEntity("notify-probe",v)),"A"),LagMillisSchema=tagTier(exports_external.number().min(0).max(300000),"C"),ChannelSchema2=tagTier(exports_external.string().min(1).max(128),"C"),schema25=exports_external.object({channel:ChannelSchema2,probe_id:NonceSchema,lag_ms:LagMillisSchema,timed_out:tagTier(exports_external.boolean(),"C")}).strict()});var exports_permissions_deny={};__export(exports_permissions_deny,{schema:()=>schema26,TYPE:()=>TYPE25,SCHEMA_VERSION:()=>SCHEMA_VERSION25,KIND:()=>KIND25});var SCHEMA_VERSION25=1,TYPE25="permissions.deny",KIND25="event",ActorSchema,AttemptedRoleSchema,ScopeSchema2,ReasonSchema5,SourceIpSchema,schema26;var init_permissions_deny=__esm(()=>{init_zod();init_redactors();ActorSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("actor",v)),"A"),AttemptedRoleSchema=tagTier(exports_external.string().min(1).max(64),"C"),ScopeSchema2=tagTier(exports_external.string().min(1).max(128),"C"),ReasonSchema5=tagTier(exports_external.enum(["token_expired","token_invalid","signature_invalid","scope_mismatch","tenant_mismatch","rate_limited","revoked","unknown"]),"C"),SourceIpSchema=tagTier(exports_external.string().max(64).transform((v)=>hashEntity("ip",v)).optional(),"A"),schema26=exports_external.object({actor:ActorSchema,attempted_role:AttemptedRoleSchema,scope:ScopeSchema2,reason:ReasonSchema5,source_ip:SourceIpSchema}).strict()});var exports_permissions_grant={};__export(exports_permissions_grant,{schema:()=>schema27,TYPE:()=>TYPE26,SCHEMA_VERSION:()=>SCHEMA_VERSION26,KIND:()=>KIND26});var SCHEMA_VERSION26=1,TYPE26="permissions.grant",KIND26="event",ActorSchema2,RoleSchema2,ScopeSchema3,ExpiresAtSchema,GrantedBySchema,schema27;var init_permissions_grant=__esm(()=>{init_zod();init_redactors();ActorSchema2=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("actor",v)),"A"),RoleSchema2=tagTier(exports_external.enum(["admin","operator","subscriber","audit"]),"C"),ScopeSchema3=tagTier(exports_external.string().min(1).max(128),"C",'e.g. "genie_events.agent.*" \u2014 public'),ExpiresAtSchema=tagTier(exports_external.string().datetime().optional(),"C"),GrantedBySchema=tagTier(exports_external.string().max(256).transform((v)=>hashEntity("actor",v)).optional(),"A"),schema27=exports_external.object({actor:ActorSchema2,role:RoleSchema2,scope:ScopeSchema3,expires_at:ExpiresAtSchema,granted_by:GrantedBySchema}).strict()});var exports_resume_attempt={};__export(exports_resume_attempt,{schema:()=>schema28,TYPE:()=>TYPE27,SCHEMA_VERSION:()=>SCHEMA_VERSION27,KIND:()=>KIND27});var SCHEMA_VERSION27=1,TYPE27="resume.attempt",KIND27="span",AgentIdSchema4,AttemptNumberSchema4,StrategySchema,SessionIdSchema2,SucceededSchema,FailureReasonSchema,DurationSchema6,schema28;var init_resume_attempt=__esm(()=>{init_zod();init_redactors();AgentIdSchema4=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A"),AttemptNumberSchema4=tagTier(exports_external.number().int().min(1).max(16),"C"),StrategySchema=tagTier(exports_external.enum(["tmux-attach","claude-resume-session","cold-start","session-backfill"]),"C"),SessionIdSchema2=tagTier(exports_external.string().max(128).transform((v)=>hashEntity("session",v)).optional(),"A"),SucceededSchema=tagTier(exports_external.boolean().optional(),"C"),FailureReasonSchema=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)).optional(),"B"),DurationSchema6=tagTier(exports_external.number().int().min(0).max(300000).optional(),"C","ms"),schema28=exports_external.object({agent_id:AgentIdSchema4,attempt_number:AttemptNumberSchema4,strategy:StrategySchema,session_id:SessionIdSchema2,succeeded:SucceededSchema,failure_reason:FailureReasonSchema,duration_ms:DurationSchema6}).strict()});var exports_rot_detected={};__export(exports_rot_detected,{schema:()=>schema29,TYPE:()=>TYPE28,SCHEMA_VERSION:()=>SCHEMA_VERSION28,KIND:()=>KIND28});var SCHEMA_VERSION28=1,TYPE28="rot.detected",KIND28="event",PatternIdSchema,EntityIdSchema4,ObservedValueSchema,ObservedStateSchema,schema29;var init_rot_detected=__esm(()=>{init_zod();init_redactors();PatternIdSchema=tagTier(exports_external.string().min(1).max(128).regex(/^[a-z0-9][a-z0-9._-]*$/,"pattern_id must be kebab/dot/underscore lowercase"),"C"),EntityIdSchema4=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("entity",v)),"A"),ObservedValueSchema=tagTier(exports_external.union([exports_external.string().max(4096).transform(redactFreeText),exports_external.number().finite(),exports_external.boolean(),exports_external.null(),exports_external.array(exports_external.string().max(1024).transform(redactFreeText)).max(256),exports_external.array(exports_external.number().finite()).max(256)]),"B","evidence scalar \u2014 free text runs through redactFreeText"),ObservedStateSchema=tagTier(exports_external.record(exports_external.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"observed_state key must be snake_case"),ObservedValueSchema).refine((obj)=>Object.keys(obj).length<=32,{message:"observed_state_json cannot exceed 32 keys"}),"B","per-pattern evidence record \u2014 keys documented by each detector module"),schema29=exports_external.object({pattern_id:PatternIdSchema,entity_id:EntityIdSchema4,observed_state_json:ObservedStateSchema}).strict()});var exports_rot_executor_ghost_detected={};__export(exports_rot_executor_ghost_detected,{schema:()=>schema30,TYPE:()=>TYPE29,SCHEMA_VERSION:()=>SCHEMA_VERSION29,KIND:()=>KIND29});var SCHEMA_VERSION29=1,TYPE29="rot.executor-ghost.detected",KIND29="event",ResolutionSourceSchema,EnvIdSchema,ResolvedIdSchema,AgentNameSchema,RecoveredSchema,schema30;var init_rot_executor_ghost_detected=__esm(()=>{init_zod();ResolutionSourceSchema=tagTier(exports_external.enum(["resolver","reconciler"]),"C"),EnvIdSchema=tagTier(exports_external.string().uuid(),"C"),ResolvedIdSchema=tagTier(exports_external.string().uuid(),"C"),AgentNameSchema=tagTier(exports_external.string().min(1).max(256),"C"),RecoveredSchema=tagTier(exports_external.boolean(),"C"),schema30=exports_external.object({resolution_source:ResolutionSourceSchema,env_id:EnvIdSchema,resolved_id:ResolvedIdSchema,agent_name:AgentNameSchema,recovered:RecoveredSchema}).strict()});var exports_rot_inbox_watcher_spawn_loop_detected={};__export(exports_rot_inbox_watcher_spawn_loop_detected,{schema:()=>schema31,TYPE:()=>TYPE30,SCHEMA_VERSION:()=>SCHEMA_VERSION30,KIND:()=>KIND30});var SCHEMA_VERSION30=1,TYPE30="rot.inbox-watcher-spawn-loop.detected",KIND30="event",TeamNameSchema,SessionKeySchema,FailureCountSchema,LastErrorMessageSchema,schema31;var init_rot_inbox_watcher_spawn_loop_detected=__esm(()=>{init_zod();init_redactors();TeamNameSchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>redactFreeText(v)),"C"),SessionKeySchema=tagTier(exports_external.string().min(1).max(256).transform((v)=>redactFreeText(v)),"C"),FailureCountSchema=tagTier(exports_external.number().int().min(1).max(100),"C"),LastErrorMessageSchema=tagTier(exports_external.string().min(1).max(2048).transform((v)=>redactFreeText(v)),"B","redacted error message from the final failed ensureTeamLead() call"),schema31=exports_external.object({team_name:TeamNameSchema,session_key:SessionKeySchema,failure_count:FailureCountSchema,last_error_message:LastErrorMessageSchema}).strict()});var exports_rot_team_ls_drift_detected={};__export(exports_rot_team_ls_drift_detected,{schema:()=>schema32,TYPE:()=>TYPE31,SCHEMA_VERSION:()=>SCHEMA_VERSION31,KIND:()=>KIND31});var SCHEMA_VERSION31=1,TYPE31="rot.team-ls-drift.detected",KIND31="event",DivergenceKindSchema,DivergentCountSchema,ObservedStateJsonSchema,ObservedStateJsonTruncatedSchema,schema32;var init_rot_team_ls_drift_detected=__esm(()=>{init_zod();init_redactors();DivergenceKindSchema=tagTier(exports_external.enum(["missing_in_disband","missing_in_ls","status_mismatch"]),"C"),DivergentCountSchema=tagTier(exports_external.number().int().min(1).max(1e4),"C"),ObservedStateJsonSchema=tagTier(exports_external.string().min(2).max(16384).transform((v)=>redactFreeText(v)),"B","JSON-encoded snapshot of both data sources for triage"),ObservedStateJsonTruncatedSchema=tagTier(exports_external.literal(!0).optional(),"C","set when detail was dropped to honor the observed_state_json cap"),schema32=exports_external.object({divergence_kind:DivergenceKindSchema,divergent_count:DivergentCountSchema,observed_state_json:ObservedStateJsonSchema,observed_state_json_truncated:ObservedStateJsonTruncatedSchema}).strict()});var exports_runbook_triggered={};__export(exports_runbook_triggered,{schema:()=>schema33,TYPE:()=>TYPE32,SCHEMA_VERSION:()=>SCHEMA_VERSION32,KIND:()=>KIND32});var SCHEMA_VERSION32=1,TYPE32="runbook.triggered",KIND32="event",RuleSchema,EvidenceCountSchema,CorrelationIdSchema,WindowMinutesSchema,RecommendedSqlSchema,EvidenceSummarySchema,schema33;var init_runbook_triggered=__esm(()=>{init_zod();init_redactors();RuleSchema=tagTier(exports_external.string().min(1).max(64).regex(/^R\d+$/,"rule id must be R<int>"),"C"),EvidenceCountSchema=tagTier(exports_external.number().int().min(1).max(1e6),"C"),CorrelationIdSchema=tagTier(exports_external.string().max(128).transform((v)=>hashEntity("trace",v)).optional(),"A"),WindowMinutesSchema=tagTier(exports_external.number().int().min(1).max(1440).optional(),"C"),RecommendedSqlSchema=tagTier(exports_external.string().max(4096).transform((v)=>redactFreeText(v)).optional(),"B","mitigation SQL \u2014 redacted free text"),EvidenceSummarySchema=tagTier(exports_external.string().max(1024).transform((v)=>redactFreeText(v)).optional(),"B"),schema33=exports_external.object({rule:RuleSchema,evidence_count:EvidenceCountSchema,window_minutes:WindowMinutesSchema,correlation_id:CorrelationIdSchema,recommended_sql:RecommendedSqlSchema,evidence_summary:EvidenceSummarySchema}).strict()});var exports_schema_violation={};__export(exports_schema_violation,{schema:()=>schema34,TYPE:()=>TYPE33,SCHEMA_VERSION:()=>SCHEMA_VERSION33,KIND:()=>KIND33});var SCHEMA_VERSION33=1,TYPE33="schema.violation",KIND33="event",OffendingTypeSchema2,RejectedBytesSchema,IssueSchema,schema34;var init_schema_violation=__esm(()=>{init_zod();init_redactors();OffendingTypeSchema2=tagTier(exports_external.string().min(1).max(128),"C"),RejectedBytesSchema=tagTier(exports_external.number().int().min(0).max(1048576),"C"),IssueSchema=tagTier(exports_external.object({path:exports_external.string().max(256),code:exports_external.string().max(64),message:exports_external.string().max(512).transform(redactFreeText)}),"B"),schema34=exports_external.object({offending_type:OffendingTypeSchema2,issues:tagTier(exports_external.array(IssueSchema).max(32),"B"),rejected_bytes:RejectedBytesSchema,source_subsystem:tagTier(exports_external.string().max(128).optional(),"C")}).strict()});var exports_session_id_written={};__export(exports_session_id_written,{schema:()=>schema35,TYPE:()=>TYPE34,SCHEMA_VERSION:()=>SCHEMA_VERSION34,KIND:()=>KIND34});var SCHEMA_VERSION34=1,TYPE34="session.id.written",KIND34="event",AgentIdSchema5,SessionIdSchema3,ExecutorSchema4,OriginSchema,DiffSchema2,schema35;var init_session_id_written=__esm(()=>{init_zod();init_redactors();AgentIdSchema5=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A"),SessionIdSchema3=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("session",v)),"A"),ExecutorSchema4=tagTier(exports_external.enum(["claude-code","claude-sdk","codex","shell"]),"C"),OriginSchema=tagTier(exports_external.enum(["spawn","resume","backfill","reconcile"]),"C"),DiffSchema2=tagTier(exports_external.record(exports_external.string(),exports_external.union([exports_external.string(),exports_external.number(),exports_external.boolean(),exports_external.null()])).default({}),"B","shallow scalar diff \u2014 session_id hashed before arriving here"),schema35=exports_external.object({agent_id:AgentIdSchema5,session_id:SessionIdSchema3,executor:ExecutorSchema4,origin:OriginSchema,before:DiffSchema2,after:DiffSchema2}).strict()});var exports_session_reconciled={};__export(exports_session_reconciled,{schema:()=>schema36,TYPE:()=>TYPE35,SCHEMA_VERSION:()=>SCHEMA_VERSION35,KIND:()=>KIND35});var SCHEMA_VERSION35=1,TYPE35="session.reconciled",KIND35="event",AgentIdSchema6,SessionIdSchema4,ReasonSchema6,DiffSchema3,schema36;var init_session_reconciled=__esm(()=>{init_zod();init_redactors();AgentIdSchema6=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A"),SessionIdSchema4=tagTier(exports_external.string().max(256).transform((v)=>hashEntity("session",v)),"A"),ReasonSchema6=tagTier(exports_external.enum(["transcript-discovered","stale-pg-session","idle-timeout","manual","backfill"]),"C"),DiffSchema3=tagTier(exports_external.record(exports_external.string(),exports_external.union([exports_external.string(),exports_external.number(),exports_external.boolean(),exports_external.null()])).default({}),"B"),schema36=exports_external.object({agent_id:AgentIdSchema6,old_session_id:SessionIdSchema4.optional(),new_session_id:SessionIdSchema4,reason:ReasonSchema6,before:DiffSchema3,after:DiffSchema3}).strict()});var exports_state_transition={};__export(exports_state_transition,{schema:()=>schema37,TYPE:()=>TYPE36,SCHEMA_VERSION:()=>SCHEMA_VERSION36,KIND:()=>KIND36});var SCHEMA_VERSION36=1,TYPE36="state_transition",KIND36="event",EntityKindSchema,EntityIdSchema5,FromSchema2,ToSchema2,ReasonSchema7,ActorSchema3,DiffSchema4,schema37;var init_state_transition=__esm(()=>{init_zod();init_redactors();EntityKindSchema=tagTier(exports_external.enum(["task","wish","worker","team","team_lead","group","mailbox_message"]),"C"),EntityIdSchema5=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("entity",v)),"A","entity id hashed"),FromSchema2=tagTier(exports_external.string().min(1).max(64),"C"),ToSchema2=tagTier(exports_external.string().min(1).max(64),"C"),ReasonSchema7=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)).optional(),"B","redacted free-text"),ActorSchema3=tagTier(exports_external.string().max(128).transform((v)=>redactFreeText(v)).optional(),"B"),DiffSchema4=tagTier(exports_external.record(exports_external.string(),exports_external.union([exports_external.string(),exports_external.number(),exports_external.boolean(),exports_external.null()])).default({}),"B","shallow scalar diff only"),schema37=exports_external.object({entity_kind:EntityKindSchema,entity_id:EntityIdSchema5,from:FromSchema2,to:ToSchema2,reason:ReasonSchema7,actor:ActorSchema3,before:DiffSchema4,after:DiffSchema4}).strict()});var exports_stream_gap_detected={};__export(exports_stream_gap_detected,{schema:()=>schema38,TYPE:()=>TYPE37,SCHEMA_VERSION:()=>SCHEMA_VERSION37,KIND:()=>KIND37});var SCHEMA_VERSION37=1,TYPE37="stream.gap.detected",KIND37="event",ConsumerIdSchema2,IdSchema,CountSchema6,schema38;var init_stream_gap_detected=__esm(()=>{init_zod();init_redactors();ConsumerIdSchema2=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("consumer",v)),"A"),IdSchema=tagTier(exports_external.number().int().min(0).max(Number.MAX_SAFE_INTEGER),"C"),CountSchema6=tagTier(exports_external.number().int().min(1).max(1e7),"C"),schema38=exports_external.object({consumer_id:ConsumerIdSchema2,from_id:IdSchema,to_id:IdSchema,missing_count:CountSchema6}).strict()});var exports_team_create={};__export(exports_team_create,{schema:()=>schema39,TYPE:()=>TYPE38,SCHEMA_VERSION:()=>SCHEMA_VERSION38,KIND:()=>KIND38,DEFAULT_TIER:()=>DEFAULT_TIER5});var SCHEMA_VERSION38=1,TYPE38="team.create",KIND38="event",DEFAULT_TIER5="audit",TeamNameSchema2,WishSlugSchema,RepoPathHashSchema,ActorSchema4,MemberCountSchema,AutoSchema,schema39;var init_team_create=__esm(()=>{init_zod();init_redactors();TeamNameSchema2=tagTier(exports_external.string().min(1).max(128),"C","team name \u2014 public label"),WishSlugSchema=tagTier(exports_external.string().max(128).optional(),"C"),RepoPathHashSchema=tagTier(exports_external.string().min(1).max(1024).transform((v)=>hashEntity("repo",v)),"A"),ActorSchema4=tagTier(exports_external.string().max(256).transform((v)=>hashEntity("actor",v)),"A"),MemberCountSchema=tagTier(exports_external.number().int().min(0).max(256).optional(),"C"),AutoSchema=tagTier(exports_external.boolean().optional(),"C","true if created by auto-spawn hook"),schema39=exports_external.object({team_name:TeamNameSchema2,wish_slug:WishSlugSchema,repo_path_hash:RepoPathHashSchema,actor:ActorSchema4,member_count:MemberCountSchema,auto:AutoSchema}).strict()});var exports_team_disband={};__export(exports_team_disband,{schema:()=>schema40,TYPE:()=>TYPE39,SCHEMA_VERSION:()=>SCHEMA_VERSION39,KIND:()=>KIND39,DEFAULT_TIER:()=>DEFAULT_TIER6});var SCHEMA_VERSION39=1,TYPE39="team.disband",KIND39="event",DEFAULT_TIER6="audit",TeamNameSchema3,ActorSchema5,RemainingMembersSchema,ReasonSchema8,schema40;var init_team_disband=__esm(()=>{init_zod();init_redactors();TeamNameSchema3=tagTier(exports_external.string().min(1).max(128),"C"),ActorSchema5=tagTier(exports_external.string().max(256).transform((v)=>hashEntity("actor",v)).optional(),"A"),RemainingMembersSchema=tagTier(exports_external.number().int().min(0).max(256).optional(),"C"),ReasonSchema8=tagTier(exports_external.string().max(512).transform((v)=>redactFreeText(v)).optional(),"B"),schema40=exports_external.object({team_name:TeamNameSchema3,actor:ActorSchema5,remaining_members:RemainingMembersSchema,reason:ReasonSchema8}).strict()});var exports_tmux_pane_placed={};__export(exports_tmux_pane_placed,{schema:()=>schema41,TYPE:()=>TYPE40,SCHEMA_VERSION:()=>SCHEMA_VERSION40,KIND:()=>KIND40});var SCHEMA_VERSION40=1,TYPE40="tmux.pane.placed",KIND40="event",AgentIdSchema7,SessionSchema,WindowIndexSchema,PaneIndexSchema,PaneIdSchema,ActionSchema,schema41;var init_tmux_pane_placed=__esm(()=>{init_zod();init_redactors();AgentIdSchema7=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A"),SessionSchema=tagTier(exports_external.string().min(1).max(128),"C","tmux session name \u2014 public"),WindowIndexSchema=tagTier(exports_external.number().int().min(0).max(256),"C"),PaneIndexSchema=tagTier(exports_external.number().int().min(0).max(256),"C"),PaneIdSchema=tagTier(exports_external.string().max(64).optional(),"C","tmux pane id \u2014 public"),ActionSchema=tagTier(exports_external.enum(["spawn","attach","replace","split"]),"C"),schema41=exports_external.object({agent_id:AgentIdSchema7,session:SessionSchema,window_index:WindowIndexSchema,pane_index:PaneIndexSchema,pane_id:PaneIdSchema,action:ActionSchema}).strict()});var exports_wish_dispatch={};__export(exports_wish_dispatch,{schema:()=>schema42,TYPE:()=>TYPE41,SCHEMA_VERSION:()=>SCHEMA_VERSION41,KIND:()=>KIND41});var SCHEMA_VERSION41=1,TYPE41="wish.dispatch",KIND41="span",WishSlugSchema2,WaveSchema,GroupIdSchema,GroupNameSchema,ActorSchema6,OutcomeSchema3,DurationSchema7,DryRunSchema,schema42;var init_wish_dispatch=__esm(()=>{init_zod();init_redactors();WishSlugSchema2=tagTier(exports_external.string().min(1).max(128),"C","wish slug \u2014 public"),WaveSchema=tagTier(exports_external.number().int().min(0).max(32),"C"),GroupIdSchema=tagTier(exports_external.string().min(1).max(128).transform((v)=>hashEntity("group",v)),"A","group id hashed"),GroupNameSchema=tagTier(exports_external.string().max(128),"C"),ActorSchema6=tagTier(exports_external.string().max(128).transform((v)=>redactFreeText(v)).optional(),"B"),OutcomeSchema3=tagTier(exports_external.enum(["started","completed","failed","blocked"]).optional(),"C"),DurationSchema7=tagTier(exports_external.number().int().min(0).max(86400000).optional(),"C","ms"),DryRunSchema=tagTier(exports_external.boolean().optional(),"C"),schema42=exports_external.object({wish_slug:WishSlugSchema2,wave:WaveSchema.optional(),group_id:GroupIdSchema.optional(),group_name:GroupNameSchema.optional(),actor:ActorSchema6,outcome:OutcomeSchema3,duration_ms:DurationSchema7,dry_run:DryRunSchema}).strict()});function entry(mod){return{type:mod.TYPE,kind:mod.KIND,schema:mod.schema,schema_version:mod.SCHEMA_VERSION,tier_defaults:mod.DEFAULT_TIER??"default"}}function getEntry(type2){return EventRegistry[type2]??null}function isRegistered(type2){return Object.hasOwn(EventRegistry,type2)}var EventRegistry;var init_registry=__esm(()=>{init_agent_lifecycle();init_agent_resume_attempted();init_agent_resume_failed();init_agent_resume_succeeded();init_audit_export();init_audit_un_hash();init_cache_hit();init_cache_invalidate();init_cli_command();init_consumer_heartbeat();init_consumer_lagged();init_correlation_orphan_rate();init_detector_disabled();init_emit_backpressure_critical();init_emitter_latency_p99();init_emitter_queue_depth();init_emitter_rejected();init_emitter_shedding_load();init_error_raised();init_executor_row_written();init_executor_write();init_hook_delivery();init_mailbox_delivery();init_notify_delivery_lag();init_permissions_deny();init_permissions_grant();init_resume_attempt();init_rot_detected();init_rot_executor_ghost_detected();init_rot_inbox_watcher_spawn_loop_detected();init_rot_team_ls_drift_detected();init_runbook_triggered();init_schema_violation();init_session_id_written();init_session_reconciled();init_state_transition();init_stream_gap_detected();init_team_create();init_team_disband();init_tmux_pane_placed();init_wish_dispatch();EventRegistry={[TYPE9]:entry(exports_cli_command),[TYPE]:entry(exports_agent_lifecycle),[TYPE41]:entry(exports_wish_dispatch),[TYPE22]:entry(exports_hook_delivery),[TYPE27]:entry(exports_resume_attempt),[TYPE21]:entry(exports_executor_write),[TYPE23]:entry(exports_mailbox_delivery),[TYPE19]:entry(exports_error_raised),[TYPE36]:entry(exports_state_transition),[TYPE33]:entry(exports_schema_violation),[TYPE34]:entry(exports_session_id_written),[TYPE35]:entry(exports_session_reconciled),[TYPE40]:entry(exports_tmux_pane_placed),[TYPE20]:entry(exports_executor_row_written),[TYPE8]:entry(exports_cache_invalidate),[TYPE7]:entry(exports_cache_hit),[TYPE32]:entry(exports_runbook_triggered),[TYPE10]:entry(exports_consumer_heartbeat),[TYPE26]:entry(exports_permissions_grant),[TYPE25]:entry(exports_permissions_deny),[TYPE38]:entry(exports_team_create),[TYPE39]:entry(exports_team_disband),[TYPE6]:entry(exports_audit_un_hash),[TYPE5]:entry(exports_audit_export),[TYPE17]:entry(exports_emitter_rejected),[TYPE16]:entry(exports_emitter_queue_depth),[TYPE15]:entry(exports_emitter_latency_p99),[TYPE24]:entry(exports_notify_delivery_lag),[TYPE37]:entry(exports_stream_gap_detected),[TYPE12]:entry(exports_correlation_orphan_rate),[TYPE18]:entry(exports_emitter_shedding_load),[TYPE11]:entry(exports_consumer_lagged),[TYPE14]:entry(exports_emit_backpressure_critical),[TYPE13]:entry(exports_detector_disabled),[TYPE28]:entry(exports_rot_detected),[TYPE31]:entry(exports_rot_team_ls_drift_detected),[TYPE29]:entry(exports_rot_executor_ghost_detected),[TYPE30]:entry(exports_rot_inbox_watcher_spawn_loop_detected),[TYPE2]:entry(exports_agent_resume_attempted),[TYPE4]:entry(exports_agent_resume_succeeded),[TYPE3]:entry(exports_agent_resume_failed)}});var exports_emit={};__export(exports_emit,{startSpan:()=>startSpan,shutdownEmitter:()=>shutdownEmitter,resumeEmitter:()=>resumeEmitter,isSpillJournalEmpty:()=>isSpillJournalEmpty,getEmitStats:()=>getEmitStats,flushNow:()=>flushNow,endSpan:()=>endSpan,emitEvent:()=>emitEvent,drainSpillJournalNow:()=>drainSpillJournalNow,__setSpillPathForTests:()=>__setSpillPathForTests,__resetEmitForTests:()=>__resetEmitForTests,__TEST_QUEUE_CAP:()=>__TEST_QUEUE_CAP,__TEST_BACKPRESSURE_WAIT_MS:()=>__TEST_BACKPRESSURE_WAIT_MS});import{createHash as createHash2,randomUUID as randomUUID3}from"crypto";import{appendFileSync,closeSync,existsSync as existsSync14,fsyncSync,mkdirSync as mkdirSync7,openSync,readFileSync as readFileSync10,renameSync as renameSync2,statSync as statSync2,unlinkSync as unlinkSync4}from"fs";import{homedir as homedir13}from"os";import{dirname as dirname6,join as join18}from"path";function getEmitStats(){return{...stats,queue_depth:queue.length}}function defaultSpillPath(){let home=process.env.GENIE_HOME??join18(homedir13(),".genie");return join18(home,"data","emit-spill.jsonl")}function __setSpillPathForTests(path2){spillPathOverride=path2}function spillPath(){return spillPathOverride??defaultSpillPath()}function ensureSpillDir(path2){let dir=dirname6(path2);if(!existsSync14(dir))mkdirSync7(dir,{recursive:!0})}function writeSpillRow(row){let path2=spillPath();ensureSpillDir(path2);let line=`${JSON.stringify(row)}
688
708
  `,fd=openSync(path2,"a");try{appendFileSync(fd,line);try{fsyncSync(fd)}catch{}}finally{closeSync(fd)}if(stats.spilled_warn_plus++,firstSpillAt===null)firstSpillAt=Date.now()}function countSpillRows(){let path2=spillPath();if(!existsSync14(path2))return 0;try{let contents=readFileSync10(path2,"utf8");if(!contents)return 0;return contents.split(`
@@ -2829,7 +2849,7 @@ Genie Serve`),console.log("\u2500".repeat(50)),console.log(` Status: ${runn
2829
2849
  `;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));execSync14(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){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(),message=wishComplete?`WISH COMPLETE \u2014 all groups done: [${waveResult.waveGroups.join(", ")}]. Run \`genie team done\` to clean up.`:`${waveResult.waveName} complete. All groups done: [${waveResult.waveGroups.join(", ")}]. Run /review or advance to next wave.`,result2=await protocolRouter.sendMessage(repoPath,"cli",leader,message);if(result2&&typeof result2==="object"&&"delivered"in result2&&!result2.delivered)console.warn(` \u26A0\uFE0F Wave-complete notification to ${leader} may not have been delivered.`);else console.log(` Notified ${leader} of wave completion.`);if(spawner&&spawner!==leader&&spawner!=="cli")await protocolRouter.sendMessage(repoPath,"cli",spawner,message).catch(()=>{}),console.log(` Notified spawner (${spawner}) of wave completion.`)}catch{console.warn(" \u26A0\uFE0F Could not notify leader (messaging unavailable).")}}async function doneCommand(ref){try{let{slug,group}=parseRef(ref),result2=await completeGroup(slug,group);if(console.log(`\u2705 Group "${group}" marked as done in wish "${slug}"`),result2.completedAt)console.log(` Completed at: ${formatTimestamp(result2.completedAt)}`);let state=await getState(slug);if(state){let nowReady=Object.entries(state.groups).filter(([,g])=>g.status==="ready"&&g.dependsOn.includes(group)).map(([name])=>name);if(nowReady.length>0)console.log(` Unblocked: ${nowReady.join(", ")}`)}await ensureWorkPushed(slug,group);let wishComplete=await isWishComplete(slug),waveResult=await detectWaveCompletion(slug,group);if(waveResult)await notifyWaveCompletion(waveResult,wishComplete);if(wishComplete)console.log(" \uD83C\uDF89 Wish fully complete \u2014 all groups done."),await autoCleanupTeam(),await archiveWishNamedAgents(slug);autoKillPane()}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`\u274C ${message}`),process.exit(1)}}async function autoInitWishState(slug){let wishPath=resolveWishPath(slug);if(!wishPath)console.error(`\u274C No state found for wish "${slug}" and no WISH.md found in cwd or repo root`),console.error(` Create it first: genie wish <agent> ${slug}`),process.exit(1);let content=await readFile12(wishPath,"utf-8"),groups=parseWishGroups(content);if(groups.length===0)console.error(`\u274C No execution groups found in ${wishPath}`),process.exit(1);let state=await createState(slug,groups);return console.log(`\uD83D\uDCDD Auto-initialized state for wish "${slug}" (${groups.length} groups)`),state}function parseWishLifecycleStatus(content){let patterns2=[/^\|\s*\*\*Status\*\*\s*\|\s*([^|]+?)\s*\|/im,/^\*\*Status:\*\*\s*([A-Za-z][A-Za-z_-]*)/im,/^Status:\s*([A-Za-z][A-Za-z_-]*)/im];for(let pattern of patterns2){let token=content.match(pattern)?.[1]?.trim().match(/^[A-Za-z][A-Za-z_-]*/)?.[0];if(token)return token.toUpperCase()}return null}async function getTerminalWishLifecycleStatus(slug){let wishPath=resolveWishPath(slug);if(!wishPath)return null;let content=await readFile12(wishPath,"utf-8"),status=parseWishLifecycleStatus(content);if(!status||!TERMINAL_WISH_STATUSES.has(status.toLowerCase()))return null;return{status,wishPath}}function printTerminalWishLifecycleStatus(slug,terminal){console.log(`
2830
2850
  Wish: ${slug}`),console.log("\u2500".repeat(60)),console.log(` Status: ${terminal.status}`),console.log(` Source: ${terminal.wishPath}`),console.log(""),console.log(" No active execution state initialized for terminal wish status."),console.log("")}async function printWishExecutors(slug){try{let{registry:registry3,executorRegistry,assignmentRegistry}=await loadExecutorInfo(),agents=await registry3.listAgents({team:process.env.GENIE_TEAM}),executorInfoLines=[];for(let agent of agents){if(!agent.currentExecutorId)continue;let executor=await executorRegistry.getExecutor(agent.currentExecutorId);if(!executor||executor.state==="terminated"||executor.state==="done")continue;let assignment=await assignmentRegistry.getActiveAssignment(executor.id),taskLabel=assignment?.wishSlug===slug?`Group ${assignment.groupNumber??"?"}`:assignment?.wishSlug??"-",name=agent.customName??agent.role??agent.id.slice(0,12);executorInfoLines.push(` Agent: ${padRight(name,16)} | Executor: ${executor.id.slice(0,12)} (${executor.provider}) | State: ${padRight(executor.state,10)} | Task: ${taskLabel}`)}if(executorInfoLines.length>0){console.log(`
2831
2851
  Active Executors:`),console.log("\u2500".repeat(60));for(let line of executorInfoLines)console.log(line)}}catch{}}async function statusCommand(slug){try{let terminal=await getTerminalWishLifecycleStatus(slug);if(terminal){printTerminalWishLifecycleStatus(slug,terminal);return}let state=await getState(slug)??await autoInitWishState(slug);console.log(`
2832
- Wish: ${state.wish}`),console.log("\u2500".repeat(60));let entries=Object.entries(state.groups),maxNameLen=Math.max(...entries.map(([name])=>name.length),5);console.log(` ${padRight("GROUP",maxNameLen)} STATUS ASSIGNEE STARTED COMPLETED`),console.log(` ${"\u2500".repeat(maxNameLen+62)}`);for(let[name,group]of entries){let icon=STATUS_ICONS[group.status]??"\u2753",status=padRight(`${icon} ${group.status}`,13),assignee=padRight(group.assignee??"-",13),started=padRight(formatTimestamp(group.startedAt)||"-",14),completed=formatTimestamp(group.completedAt)||"-";console.log(` ${padRight(name,maxNameLen)} ${status} ${assignee} ${started} ${completed}`)}let total=entries.length,done=entries.filter(([,g])=>g.status==="done").length,inProgress=entries.filter(([,g])=>g.status==="in_progress").length,ready=entries.filter(([,g])=>g.status==="ready").length,blocked=entries.filter(([,g])=>g.status==="blocked").length;console.log(""),console.log(` Progress: ${done}/${total} done | ${inProgress} in progress | ${ready} ready | ${blocked} blocked`),await printWishExecutors(slug),console.log("")}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`\u274C ${message}`),process.exit(1)}}async function resetAction(ref,options){try{if(ref.includes("#")){let{slug,group}=parseRef(ref),result2=await resetGroup(slug,group);if(console.log(`\uD83D\uDD04 Group "${group}" reset to ready in wish "${slug}"`),result2.status==="ready")console.log(" Status: ready (assignee cleared)");return}await resetWishCommand(ref,options?.yes??!1)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`\u274C ${message}`),process.exit(1)}}function registerStateCommands(_program){}async function confirmWipe(slug,existing,confirmed){let groupCount=Object.keys(existing.groups).length,inProgress=Object.values(existing.groups).filter((g)=>g.status==="in_progress").length,summary=`Wipe all state for "${slug}" (${groupCount} groups, ${inProgress} in-progress)?`;if(!isInteractive()){if(confirmed)return!0;console.error(`\u274C ${summary}`),console.error(" Refusing to wipe in non-interactive mode. Pass --yes to confirm."),process.exit(2)}let{confirm:confirm2}=await Promise.resolve().then(() => (init_esm14(),exports_esm));return confirm2({message:summary,default:!1})}function printResetState(state){console.log(""),console.log(`Wish: ${state.wish}`),console.log("\u2500".repeat(60));for(let[name,group]of Object.entries(state.groups)){let icon=STATUS_ICONS[group.status]??"\u2753";console.log(` ${name} ${icon} ${group.status}`)}}async function resetWishCommand(slug,confirmed){let wishPath=resolveWishPath(slug);if(!wishPath)throw Error(`No WISH.md found for "${slug}" \u2014 searched cwd and repo root`);let content=await readFile12(wishPath,"utf-8"),groups=parseWishGroups(content);if(groups.length===0)throw Error(`No execution groups found in ${wishPath}`);let existing=await getState(slug);if(existing){if(!await confirmWipe(slug,existing,confirmed)){console.log("Aborted.");return}console.log(`\uD83D\uDDD1\uFE0F Replacing existing state for wish "${slug}"`)}else console.log(`\u2139\uFE0F No existing state for wish "${slug}" \u2014 creating fresh`);let state=await createState(slug,groups);console.log(`\uD83D\uDCDD Recreated state from ${wishPath} (${groups.length} groups)`),printResetState(state)}var STATUS_ICONS,TERMINAL_WISH_STATUSES;var init_state=__esm(()=>{init_interactivity();init_term_format();init_wish_state();init_dispatch();STATUS_ICONS={blocked:"\uD83D\uDD12",ready:"\uD83D\uDFE2",in_progress:"\uD83D\uDD04",done:"\u2705"};TERMINAL_WISH_STATUSES=new Set(["shipped","done","complete","completed","archived"])});var exports_team={};__export(exports_team,{registerTeamNamespace:()=>registerTeamNamespace,handleTeamCreate:()=>handleTeamCreate});import{existsSync as existsSync57}from"fs";import{copyFile as copyFile3,cp,mkdir as mkdir8}from"fs/promises";import{join as join68,resolve as resolve14}from"path";function registerTeamNamespace(program2){let team=program2.command("team").description("Team lifecycle management");team.command("create <name>").description("Create a new team with a git worktree").requiredOption("--repo <path>","Path to the git repository").option("--branch <branch>","Base branch to create from","dev").option("--wish <slug>","Wish slug \u2014 auto-spawns a task leader with wish context").option("--tmux-session <name>","Tmux session to place team window in (default: derived from repo path)").option("--session <name>","Alias for --tmux-session (deprecated)").option("--no-spawn","Create team and copy wish without spawning the leader (useful for testing)").addHelpText("after",`
2852
+ Wish: ${state.wish}`),console.log("\u2500".repeat(60));let entries=Object.entries(state.groups),maxNameLen=Math.max(...entries.map(([name])=>name.length),5);console.log(` ${padRight("GROUP",maxNameLen)} STATUS ASSIGNEE STARTED COMPLETED`),console.log(` ${"\u2500".repeat(maxNameLen+62)}`);for(let[name,group]of entries){let icon=STATUS_ICONS[group.status]??"\u2753",status=padRight(`${icon} ${group.status}`,13),assignee=padRight(group.assignee??"-",13),started=padRight(formatTimestamp(group.startedAt)||"-",14),completed=formatTimestamp(group.completedAt)||"-";console.log(` ${padRight(name,maxNameLen)} ${status} ${assignee} ${started} ${completed}`)}let total=entries.length,done=entries.filter(([,g])=>g.status==="done").length,inProgress=entries.filter(([,g])=>g.status==="in_progress").length,ready=entries.filter(([,g])=>g.status==="ready").length,blocked=entries.filter(([,g])=>g.status==="blocked").length;console.log(""),console.log(` Progress: ${done}/${total} done | ${inProgress} in progress | ${ready} ready | ${blocked} blocked`),await printWishExecutors(slug),console.log("")}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`\u274C ${message}`),process.exit(1)}}async function resetAction(ref,options){try{if(ref.includes("#")){let{slug,group}=parseRef(ref),result2=await resetGroup(slug,group);if(console.log(`\uD83D\uDD04 Group "${group}" reset to ready in wish "${slug}"`),result2.status==="ready")console.log(" Status: ready (assignee cleared)");return}await resetWishCommand(ref,options?.yes??!1)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`\u274C ${message}`),process.exit(1)}}function registerStateCommands(_program){}async function confirmWipe(slug,existing,confirmed){let groupCount=Object.keys(existing.groups).length,inProgress=Object.values(existing.groups).filter((g)=>g.status==="in_progress").length,summary=`Wipe all state for "${slug}" (${groupCount} groups, ${inProgress} in-progress)?`;if(!isInteractive()){if(confirmed)return!0;console.error(`\u274C ${summary}`),console.error(" Refusing to wipe in non-interactive mode. Pass --yes to confirm."),process.exit(2)}let{confirm:confirm3}=await Promise.resolve().then(() => (init_esm14(),exports_esm));return confirm3({message:summary,default:!1})}function printResetState(state){console.log(""),console.log(`Wish: ${state.wish}`),console.log("\u2500".repeat(60));for(let[name,group]of Object.entries(state.groups)){let icon=STATUS_ICONS[group.status]??"\u2753";console.log(` ${name} ${icon} ${group.status}`)}}async function resetWishCommand(slug,confirmed){let wishPath=resolveWishPath(slug);if(!wishPath)throw Error(`No WISH.md found for "${slug}" \u2014 searched cwd and repo root`);let content=await readFile12(wishPath,"utf-8"),groups=parseWishGroups(content);if(groups.length===0)throw Error(`No execution groups found in ${wishPath}`);let existing=await getState(slug);if(existing){if(!await confirmWipe(slug,existing,confirmed)){console.log("Aborted.");return}console.log(`\uD83D\uDDD1\uFE0F Replacing existing state for wish "${slug}"`)}else console.log(`\u2139\uFE0F No existing state for wish "${slug}" \u2014 creating fresh`);let state=await createState(slug,groups);console.log(`\uD83D\uDCDD Recreated state from ${wishPath} (${groups.length} groups)`),printResetState(state)}var STATUS_ICONS,TERMINAL_WISH_STATUSES;var init_state=__esm(()=>{init_interactivity();init_term_format();init_wish_state();init_dispatch();STATUS_ICONS={blocked:"\uD83D\uDD12",ready:"\uD83D\uDFE2",in_progress:"\uD83D\uDD04",done:"\u2705"};TERMINAL_WISH_STATUSES=new Set(["shipped","done","complete","completed","archived"])});var exports_team={};__export(exports_team,{registerTeamNamespace:()=>registerTeamNamespace,handleTeamCreate:()=>handleTeamCreate});import{existsSync as existsSync57}from"fs";import{copyFile as copyFile3,cp,mkdir as mkdir8}from"fs/promises";import{join as join68,resolve as resolve14}from"path";function registerTeamNamespace(program2){let team=program2.command("team").description("Team lifecycle management");team.command("create <name>").description("Create a new team with a git worktree").requiredOption("--repo <path>","Path to the git repository").option("--branch <branch>","Base branch to create from","dev").option("--wish <slug>","Wish slug \u2014 auto-spawns a task leader with wish context").option("--tmux-session <name>","Tmux session to place team window in (default: derived from repo path)").option("--session <name>","Alias for --tmux-session (deprecated)").option("--no-spawn","Create team and copy wish without spawning the leader (useful for testing)").addHelpText("after",`
2833
2853
  Examples:
2834
2854
  genie team create my-feature --repo . # Create team in current repo
2835
2855
  genie team create my-feature --repo . --wish my-feature-slug # Create team with a wish
@@ -2920,13 +2940,13 @@ ${label} <TODO>
2920
2940
 
2921
2941
  `};return violations.push(...scanStrayGroupHeaders(lines,null)),violations}function collectPostParseViolations(doc,lines,options){let violations=[],execRange=findExecGroupsRange(lines);if(violations.push(...scanStrayGroupHeaders(lines,execRange)),violations.push(...scanGroupFieldLabels(doc,lines)),violations.push(...scanEmptyFieldContent(doc,lines)),violations.push(...scanValidation(doc,lines)),violations.push(...scanScope(doc,lines)),violations.push(...scanDependsOn(doc,lines)),!options.allowTodoPlaceholders)violations.push(...scanTodoPlaceholders(lines));return WishDocumentSchema.safeParse(doc),violations}function lintWish(docOrError,markdown,options={}){let lines=markdown.replace(/\r\n/g,`
2922
2942
  `).split(`
2923
- `);if(docOrError instanceof WishParseError)return finalize(collectParseErrorViolations(docOrError,lines),docOrError,options);return finalize(collectPostParseViolations(docOrError,lines,options),docOrError,options)}function finalize(violations,docOrError,_options){let seen=new Set,deduped=[];for(let v of violations){let key=`${v.rule}|${v.line}|${v.column}|${v.message}`;if(seen.has(key))continue;seen.add(key),deduped.push(v)}deduped.sort((a,b2)=>a.line-b2.line||a.column-b2.column||a.rule.localeCompare(b2.rule));let wish=docOrError instanceof WishParseError?"":docOrError.metadata.slug,file=docOrError instanceof WishParseError?docOrError.file??"":"";return{wish,file,violations:deduped,summary:buildSummary(deduped)}}function applyFixes(markdown,report){let lines=markdown.replace(/\r\n/g,`
2943
+ `);if(docOrError instanceof WishParseError)return finalize(collectParseErrorViolations(docOrError,lines),docOrError,options);return finalize(collectPostParseViolations(docOrError,lines,options),docOrError,options)}function finalize(violations,docOrError,_options){let seen=new Set,deduped=[];for(let v of violations){let key=`${v.rule}|${v.line}|${v.column}|${v.message}`;if(seen.has(key))continue;seen.add(key),deduped.push(v)}deduped.sort((a,b2)=>a.line-b2.line||a.column-b2.column||a.rule.localeCompare(b2.rule));let wish=docOrError instanceof WishParseError?"":docOrError.metadata.slug,file=docOrError instanceof WishParseError?docOrError.file??"":"";return{wish,file,violations:deduped,summary:buildSummary(deduped)}}function applyFixes(markdown,report2){let lines=markdown.replace(/\r\n/g,`
2924
2944
  `).split(`
2925
- `),fixes=report.violations.filter((v)=>v.fixable&&v.fix!==null).map((v)=>v.fix);fixes.sort((a,b2)=>{let la=a.kind==="insert"?a.at.line:a.at.line;return(b2.kind==="insert"?b2.at.line:b2.at.line)-la});for(let fix of fixes){if(fix.kind==="insert"){let idx=Math.max(0,Math.min(lines.length,fix.at.line-1)),insertLines=(fix.content??"").split(`
2945
+ `),fixes=report2.violations.filter((v)=>v.fixable&&v.fix!==null).map((v)=>v.fix);fixes.sort((a,b2)=>{let la=a.kind==="insert"?a.at.line:a.at.line;return(b2.kind==="insert"?b2.at.line:b2.at.line)-la});for(let fix of fixes){if(fix.kind==="insert"){let idx=Math.max(0,Math.min(lines.length,fix.at.line-1)),insertLines=(fix.content??"").split(`
2926
2946
  `);if(insertLines.length>0&&insertLines[insertLines.length-1]==="")insertLines.pop();lines.splice(idx,0,...insertLines);continue}if(fix.kind==="rewrite"){let startIdx=Math.max(0,fix.at.line-1),endLine=fix.range?.endLine??fix.at.line,endIdx=Math.max(startIdx,endLine-1),newLines=(fix.content??"").split(`
2927
2947
  `);lines.splice(startIdx,endIdx-startIdx+1,...newLines);continue}if(fix.kind==="delete"){let startIdx=Math.max(0,fix.at.line-1),endLine=fix.range?.endLine??fix.at.line,endIdx=Math.max(startIdx,endLine-1);lines.splice(startIdx,endIdx-startIdx+1)}}return lines.join(`
2928
- `)}function lintMarkdown(markdown,options={}){try{let doc=parseWish(markdown);return lintWish(doc,markdown,options)}catch(err){if(err instanceof WishParseError)return lintWish(err,markdown,options);throw err}}function formatLintReport(report,options={}){let color2=options.color??!1,path3=options.path??report.file??"<wish>",red=(s2)=>color2?`\x1B[31m${s2}\x1B[0m`:s2,yellow=(s2)=>color2?`\x1B[33m${s2}\x1B[0m`:s2,dim=(s2)=>color2?`\x1B[2m${s2}\x1B[0m`:s2,lines=[];if(report.violations.length===0)return lines.push(dim(`${path3}: no violations \u2014 wish is structurally clean`)),lines.join(`
2929
- `);for(let v of report.violations){let sev=v.severity==="error"?red(v.severity):yellow(v.severity),fixTag=v.fixable?dim(" (fixable)"):"";lines.push(`${path3}:${v.line}:${v.column}: ${sev} [${v.rule}]${fixTag} \u2014 ${v.message}`)}return lines.push(""),lines.push(`${report.summary.total} violation(s): ${report.summary.fixable} fixable, ${report.summary.unfixable} unfixable`),lines.join(`
2948
+ `)}function lintMarkdown(markdown,options={}){try{let doc=parseWish(markdown);return lintWish(doc,markdown,options)}catch(err){if(err instanceof WishParseError)return lintWish(err,markdown,options);throw err}}function formatLintReport(report2,options={}){let color2=options.color??!1,path3=options.path??report2.file??"<wish>",red=(s2)=>color2?`\x1B[31m${s2}\x1B[0m`:s2,yellow=(s2)=>color2?`\x1B[33m${s2}\x1B[0m`:s2,dim=(s2)=>color2?`\x1B[2m${s2}\x1B[0m`:s2,lines=[];if(report2.violations.length===0)return lines.push(dim(`${path3}: no violations \u2014 wish is structurally clean`)),lines.join(`
2949
+ `);for(let v of report2.violations){let sev=v.severity==="error"?red(v.severity):yellow(v.severity),fixTag=v.fixable?dim(" (fixable)"):"";lines.push(`${path3}:${v.line}:${v.column}: ${sev} [${v.rule}]${fixTag} \u2014 ${v.message}`)}return lines.push(""),lines.push(`${report2.summary.total} violation(s): ${report2.summary.fixable} fixable, ${report2.summary.unfixable} unfixable`),lines.join(`
2930
2950
  `)}var REQUIRED_FIELD_LABELS,STRAY_GROUP_HEADER,CANONICAL_GROUP_HEADER,FIELD_BOUNDARY_REGEX,DEPENDS_REF_PATTERN;var init_wish_lint=__esm(()=>{init_wish_parser();init_wish_schema();REQUIRED_FIELD_LABELS=[{label:"**Goal:**",regex:/^\*\*Goal\s*:\*\*/i,rule:"missing-goal-field"},{label:"**Deliverables:**",regex:/^\*\*Deliverables\s*:\*\*/i,rule:"missing-deliverables-field"},{label:"**Acceptance Criteria:**",regex:/^\*\*Acceptance Criteria\s*:\*\*/i,rule:"missing-acceptance-field"},{label:"**Validation:**",regex:/^\*\*Validation\s*:\*\*/i,rule:"missing-validation-field"},{label:"**depends-on:**",regex:/^\*\*depends-on\s*:\*\*/i,rule:"missing-depends-on-field"}],STRAY_GROUP_HEADER=/^###\s+(group|grupo)\s+(\d+)\s*([-\u2014:])?\s*(.*)$/i,CANONICAL_GROUP_HEADER=/^###\s+Group\s+\d+\s*:/;FIELD_BOUNDARY_REGEX=/^\*\*(Goal|Deliverables|Acceptance Criteria|depends-on)\s*:\*\*/i;DEPENDS_REF_PATTERN=/^(?:Group\s+\d+|[A-Za-z][A-Za-z0-9_-]*(?:\/(?:Group\s+\d+|[A-Za-z][A-Za-z0-9_-]*))*|[A-Za-z][A-Za-z0-9_-]*#\d+)$/i});function resolveExecutorId(opts){let id=opts.executorId??process.env.GENIE_EXECUTOR_ID;if(!id)throw Error("turnClose: no executor id \u2014 set GENIE_EXECUTOR_ID or pass opts.executorId. "+"This usually means the close verb was invoked outside an agent session.");return id}async function defaultAuditInsert(tx,p){await tx`
2931
2951
  INSERT INTO audit_events (entity_type, entity_id, event_type, actor, details)
2932
2952
  VALUES (
@@ -3093,7 +3113,7 @@ Captured external output:
3093
3113
  `)})}).bind(this);warningHandler=((warning)=>{console.warn(JSON.stringify(warning.message,null,2))}).bind(this);get controlState(){return this._controlState}constructor(lib,rendererPtr,stdin,stdout,width,height2,config={}){super();rendererTracker.addRenderer(this),this.stdin=stdin,this.stdout=stdout,this.realStdoutWrite=stdout.write,this.lib=lib,this._terminalWidth=stdout.columns??width,this._terminalHeight=stdout.rows??height2,this._useThread=config.useThread===void 0?!1:config.useThread;let{screenMode,footerHeight,externalOutputMode}=resolveModes(config);this._externalOutputMode=externalOutputMode;let initialGeometry=calculateRenderGeometry(screenMode,this._terminalWidth,this._terminalHeight,footerHeight);this.width=initialGeometry.renderWidth,this.height=initialGeometry.renderHeight,this._splitHeight=initialGeometry.effectiveFooterHeight,this.renderOffset=screenMode==="split-footer"?0:initialGeometry.renderOffset,this._footerHeight=footerHeight,this.rendererPtr=rendererPtr,this.clearOnShutdown=config.clearOnShutdown??!0,this.lib.setClearOnShutdown(this.rendererPtr,this.clearOnShutdown);let forwardEnvKeys=config.forwardEnvKeys??(config.remote?[]:[...DEFAULT_FORWARDED_ENV_KEYS]);for(let key of forwardEnvKeys){let value=process.env[key];if(value===void 0)continue;this.lib.setTerminalEnvVar(this.rendererPtr,key,value)}if(this.exitOnCtrlC=config.exitOnCtrlC===void 0?!0:config.exitOnCtrlC,this.exitSignals=config.exitSignals||["SIGINT","SIGTERM","SIGQUIT","SIGABRT","SIGHUP","SIGBREAK","SIGPIPE","SIGBUS"],this.clipboard=new Clipboard(this.lib,this.rendererPtr),this.resizeDebounceDelay=config.debounceDelay||100,this.targetFps=config.targetFps||30,this.maxFps=config.maxFps||60,this.clock=config.clock??new SystemClock,this.themeModeState=new RendererThemeMode({queryThemeColors:()=>{this.lib.queryThemeColors(this.rendererPtr)}},this.clock),this.themeModeHandler=(sequence)=>{let result2=this.themeModeState.handleSequence(sequence);if(result2.changedMode)this.emit("theme_mode",result2.changedMode);return result2.handled},this.memorySnapshotInterval=config.memorySnapshotInterval??0,this.gatherStats=config.gatherStats||!1,this.maxStatSamples=config.maxStatSamples||300,this.enableMouseMovement=config.enableMouseMovement??!0,this._useMouse=config.useMouse??!0,this.autoFocus=config.autoFocus??!0,this.nextRenderBuffer=this.lib.getNextBuffer(this.rendererPtr),this.currentRenderBuffer=this.lib.getCurrentBuffer(this.rendererPtr),this.postProcessFns=config.postProcessFns||[],this.prependedInputHandlers=config.prependInputHandlers||[],this.root=new RootRenderable(this),this.memorySnapshotInterval>0)this.startMemorySnapshotTimer();process.on("SIGWINCH",this.sigwinchHandler),process.on("warning",this.warningHandler),process.on("uncaughtException",this.handleError),process.on("unhandledRejection",this.handleError),process.on("beforeExit",this.exitHandler);let useKittyForParsing=(config.useKittyKeyboard??{})!==null;this._keyHandler=new InternalKeyHandler,this._keyHandler.on("keypress",(event)=>{if(this.exitOnCtrlC&&matchesKeyBinding(event,{name:"c",ctrl:!0})){process.nextTick(()=>{this.destroy()});return}}),this.addExitListeners();let stdinParserMaxBufferBytes=config.stdinParserMaxBufferBytes??DEFAULT_STDIN_PARSER_MAX_BUFFER_BYTES;if(this.stdinParser=new StdinParser({timeoutMs:20,maxPendingBytes:stdinParserMaxBufferBytes,armTimeouts:!0,onTimeoutFlush:()=>{this.drainStdinParser()},useKittyKeyboard:useKittyForParsing,protocolContext:{kittyKeyboardEnabled:useKittyForParsing,privateCapabilityRepliesActive:!1,pixelResolutionQueryActive:!1,explicitWidthCprActive:!1,startupCursorCprActive:!1},clock:this.clock}),this._console=new TerminalConsole(this,{...config.consoleOptions??{},clock:this.clock}),this.consoleMode=config.consoleMode??"console-overlay",this.applyScreenMode(screenMode,!1,!1),this.stdout.write=externalOutputMode==="capture-stdout"?this.interceptStdoutWrite:this.realStdoutWrite,this._openConsoleOnError=config.openConsoleOnError??!0,this._onDestroy=config.onDestroy,global.requestAnimationFrame=(callback)=>{let id=CliRenderer.animationFrameId++;return this.animationRequest.set(id,callback),this.requestLive(),id},global.cancelAnimationFrame=(handle)=>{this.animationRequest.delete(handle)},!global.window)global.window={};if(global.window.requestAnimationFrame=requestAnimationFrame,env.OTUI_NO_NATIVE_RENDER)this.renderNative=()=>{if(this._splitHeight>0)this.flushStdoutCache(this._splitHeight)};this.setupInput()}addExitListeners(){if(this._exitListenersAdded||this.exitSignals.length===0)return;this.exitSignals.forEach((signal)=>{process.addListener(signal,this.exitHandler)}),this._exitListenersAdded=!0}removeExitListeners(){if(!this._exitListenersAdded||this.exitSignals.length===0)return;this.exitSignals.forEach((signal)=>{process.removeListener(signal,this.exitHandler)}),this._exitListenersAdded=!1}get isDestroyed(){return this._isDestroyed}registerLifecyclePass(renderable){this.lifecyclePasses.add(renderable)}unregisterLifecyclePass(renderable){this.lifecyclePasses.delete(renderable)}getLifecyclePasses(){return this.lifecyclePasses}get currentFocusedRenderable(){return this._currentFocusedRenderable}get currentFocusedEditor(){if(!this._currentFocusedRenderable)return null;if(!isEditBufferRenderable(this._currentFocusedRenderable))return null;return this._currentFocusedRenderable}normalizeClockTime(now,fallback){if(Number.isFinite(now))return now;return Number.isFinite(fallback)?fallback:0}getElapsedMs(now,then){if(!Number.isFinite(now)||!Number.isFinite(then))return 0;return Math.max(now-then,0)}focusRenderable(renderable){if(this._currentFocusedRenderable===renderable)return;let previousRenderable=this._currentFocusedRenderable,previousEditor=this.currentFocusedEditor;this._currentFocusedRenderable=renderable,previousRenderable?.blur();let currentEditor=this.currentFocusedEditor;if(previousEditor!==currentEditor)this.emit("focused_editor",currentEditor,previousEditor);this.emit("focused_renderable",renderable,previousRenderable)}blurRenderable(renderable){if(this._currentFocusedRenderable!==renderable)return;let previousEditor=this.currentFocusedEditor;if(this._currentFocusedRenderable=null,previousEditor!==null)this.emit("focused_editor",null,previousEditor);this.emit("focused_renderable",null,renderable)}setCapturedRenderable(renderable){if(this.capturedRenderable===renderable)return;this.capturedRenderable=renderable}addToHitGrid(x,y,width,height2,id){if(id!==this.capturedRenderable?.num)this.lib.addToHitGrid(this.rendererPtr,x,y,width,height2,id)}pushHitGridScissorRect(x,y,width,height2){this.lib.hitGridPushScissorRect(this.rendererPtr,x,y,width,height2)}popHitGridScissorRect(){this.lib.hitGridPopScissorRect(this.rendererPtr)}clearHitGridScissorRects(){this.lib.hitGridClearScissorRects(this.rendererPtr)}get widthMethod(){return this.capabilities?.unicode==="wcwidth"?"wcwidth":"unicode"}get frameId(){return this._frameId}writeOut(chunk,encoding,callback){if(this.rendererPtr&&this._useThread){let data=typeof chunk==="string"?chunk:chunk?.toString()??"";if(this.lib.writeOut(this.rendererPtr,data),typeof callback==="function")process.nextTick(callback);return!0}return this.realStdoutWrite.call(this.stdout,chunk,encoding,callback)}requestRender(){if(this._controlState==="explicit_suspended")return;if(this._isRunning)return;if(this.rendering){this.immediateRerenderRequested=!0;return}if(!this.updateScheduled&&!this.renderTimeout){this.updateScheduled=!0;let now=this.normalizeClockTime(this.clock.now(),this.lastTime),elapsed=this.getElapsedMs(now,this.lastTime),delay=Math.max(this.minTargetFrameTime-elapsed,0);if(delay===0){process.nextTick(()=>this.activateFrame());return}this.clock.setTimeout(()=>this.activateFrame(),delay)}}async activateFrame(){if(!this.updateScheduled){this.resolveIdleIfNeeded();return}try{await this.loop()}finally{this.updateScheduled=!1,this.resolveIdleIfNeeded()}}get consoleMode(){return this._useConsole?"console-overlay":"disabled"}set consoleMode(mode){if(this._useConsole=mode==="console-overlay",this._useConsole)this.console.activate();else this.console.deactivate()}get isRunning(){return this._isRunning}isIdleNow(){return!this._isRunning&&!this.rendering&&!this.renderTimeout&&!this.updateScheduled&&!this.immediateRerenderRequested}resolveIdleIfNeeded(){if(!this.isIdleNow())return;let resolvers=this.idleResolvers.splice(0);for(let resolve42 of resolvers)resolve42()}idle(){if(this._isDestroyed)return Promise.resolve();if(this.isIdleNow())return Promise.resolve();return new Promise((resolve42)=>{this.idleResolvers.push(resolve42)})}get resolution(){return this._resolution}get console(){return this._console}get keyInput(){return this._keyHandler}get _internalKeyInput(){return this._keyHandler}get terminalWidth(){return this._terminalWidth}get terminalHeight(){return this._terminalHeight}get useThread(){return this._useThread}get targetFps(){return this._targetFps}set targetFps(targetFps){this._targetFps=targetFps,this.targetFrameTime=1000/this._targetFps}get maxFps(){return this._maxFps}set maxFps(maxFps){this._maxFps=maxFps,this.minTargetFrameTime=1000/this._maxFps}get useMouse(){return this._useMouse}set useMouse(useMouse){if(this._useMouse===useMouse)return;if(this._useMouse=useMouse,useMouse)this.enableMouse();else this.disableMouse()}get screenMode(){return this._screenMode}set screenMode(mode){if(this.externalOutputMode==="capture-stdout"&&mode!=="split-footer")throw Error('externalOutputMode "capture-stdout" requires screenMode "split-footer"');this.applyScreenMode(mode)}get footerHeight(){return this._footerHeight}set footerHeight(footerHeight){let normalizedFooterHeight=normalizeFooterHeight(footerHeight);if(normalizedFooterHeight===this._footerHeight)return;if(this._footerHeight=normalizedFooterHeight,this.screenMode==="split-footer")this.applyScreenMode("split-footer")}get externalOutputMode(){return this._externalOutputMode}set externalOutputMode(mode){if(mode==="capture-stdout"&&this.screenMode!=="split-footer")throw Error('externalOutputMode "capture-stdout" requires screenMode "split-footer"');let previousMode=this._externalOutputMode;if(previousMode===mode)return;if(previousMode==="capture-stdout"&&mode==="passthrough"&&this._splitHeight>0)this.flushPendingSplitOutputBeforeTransition();if(this._externalOutputMode=mode,this.stdout.write=mode==="capture-stdout"?this.interceptStdoutWrite:this.realStdoutWrite,this._screenMode==="split-footer"&&this._splitHeight>0&&mode==="capture-stdout"){this.clearPendingSplitFooterTransition(),this.resetSplitScrollback(this.getSplitCursorSeedRows());return}if(this._screenMode==="split-footer"&&this._splitHeight>0&&previousMode==="capture-stdout"&&mode==="passthrough"){this.clearPendingSplitFooterTransition();return}this.syncSplitFooterState()}get liveRequestCount(){return this.liveRequestCounter}get currentControlState(){return this._controlState}get capabilities(){return this._capabilities}get themeMode(){return this.themeModeState.themeMode}waitForThemeMode(timeoutMs=1000){if(!Number.isFinite(timeoutMs)||timeoutMs<0)throw Error("timeoutMs must be a non-negative finite number");return this.themeModeState.waitForThemeMode(timeoutMs,this._isDestroyed)}getDebugInputs(){return[...this._debugInputs]}get useKittyKeyboard(){return this.lib.getKittyKeyboardFlags(this.rendererPtr)>0}set useKittyKeyboard(use){let flags=use?KITTY_FLAG_DISAMBIGUATE|KITTY_FLAG_ALTERNATE_KEYS:0;this.lib.setKittyKeyboardFlags(this.rendererPtr,flags)}createScrollbackSurface(options={}){if(this._screenMode!=="split-footer"||this._externalOutputMode!=="capture-stdout")throw Error('createScrollbackSurface requires screenMode "split-footer" and externalOutputMode "capture-stdout"');let renderer=this,surfaceId=scrollbackSurfaceCounter++,startOnNewLine=options.startOnNewLine??!0,firstLineOffset=!startOnNewLine&&renderer.splitTailColumn>0&&renderer.splitTailColumn<renderer.width?renderer.splitTailColumn:0,snapshotContext=new ScrollbackSnapshotRenderContext(renderer.width,1,renderer.widthMethod),firstLineOffsetOwner=null,renderContext=Object.create(snapshotContext);Object.defineProperty(renderContext,"claimFirstLineOffset",{value:(renderable)=>{if(firstLineOffsetOwner?.isDestroyed)firstLineOffsetOwner=null;if(firstLineOffsetOwner)return 0;return firstLineOffsetOwner=renderable??null,firstLineOffset},enumerable:!0,configurable:!0});let internalRoot=new RootRenderable(renderContext),publicRoot=new BoxRenderable(renderContext,{id:`scrollback-surface-root-${surfaceId}`,position:"absolute",left:0,top:0,width:renderer.width,height:"auto",border:!1,backgroundColor:"transparent",shouldFill:!1,flexDirection:"column"});internalRoot.add(publicRoot);let surfaceWidth=renderer.width,surfaceHeight=1,surfaceWidthMethod=renderer.widthMethod,surfaceDestroyed=!1,hasRendered=!1,nextCommitStartOnNewLine=startOnNewLine,backingBuffer=OptimizedBuffer.create(surfaceWidth,surfaceHeight,surfaceWidthMethod,{id:`scrollback-surface-buffer-${surfaceId}`}),destroyListener=()=>{destroySurface()},assertNotDestroyed=()=>{if(surfaceDestroyed)throw Error("ScrollbackSurface is destroyed")},assertRendered=()=>{if(!hasRendered)throw Error("ScrollbackSurface.commitRows requires render() before commitRows()")},assertGeometryStillCurrent=()=>{if(renderer.width!==surfaceWidth||renderer.widthMethod!==surfaceWidthMethod)throw Error("ScrollbackSurface.commitRows requires render() after renderer geometry changes")},assertRowRange=(startRow,endRowExclusive)=>{if(!Number.isInteger(startRow)||!Number.isInteger(endRowExclusive))throw Error("ScrollbackSurface.commitRows requires finite integer row bounds");if(startRow<0)throw Error("ScrollbackSurface.commitRows requires startRow >= 0");if(endRowExclusive<startRow)throw Error("ScrollbackSurface.commitRows requires endRowExclusive >= startRow");if(endRowExclusive>surfaceHeight)throw Error("ScrollbackSurface.commitRows row range exceeds rendered surface height")},collectPendingCodeRenderables=(node)=>{let pending=[];if(node instanceof CodeRenderable&&node.isHighlighting)pending.push(node);for(let child of node.getChildren())pending.push(...collectPendingCodeRenderables(child));return pending},waitForPendingHighlights=async(pending,timeoutMs)=>{await new Promise((resolve42,reject)=>{let settled=!1,timeoutHandle=renderer.clock.setTimeout(()=>{if(settled)return;settled=!0,reject(Error("ScrollbackSurface.settle timed out waiting for CodeRenderable highlighting"))},timeoutMs);Promise.all(pending.map((renderable)=>renderable.highlightingDone)).then(()=>{if(settled)return;settled=!0,renderer.clock.clearTimeout(timeoutHandle),resolve42()},(error2)=>{if(settled)return;settled=!0,renderer.clock.clearTimeout(timeoutHandle),reject(error2)})})},renderSurface=()=>{assertNotDestroyed();let{width,widthMethod}=renderer;snapshotContext.width=width,snapshotContext.widthMethod=widthMethod,publicRoot.width=width;let renderPass=(height2)=>{snapshotContext.height=height2,internalRoot.resize(width,height2),backingBuffer.resize(width,height2),backingBuffer.clear(TRANSPARENT_RGBA),snapshotContext.frameId+=1,internalRoot.render(backingBuffer,0)},targetHeight=Math.max(1,surfaceHeight);if(surfaceWidthMethod!==widthMethod)backingBuffer.destroy(),backingBuffer=OptimizedBuffer.create(width,targetHeight,widthMethod,{id:`scrollback-surface-buffer-${surfaceId}`});else backingBuffer.resize(width,targetHeight);for(let pass=0;pass<MAX_SCROLLBACK_SURFACE_HEIGHT_PASSES;pass+=1){renderPass(targetHeight);let measuredHeight=Math.max(1,publicRoot.height);if(measuredHeight===targetHeight){surfaceWidth=width,surfaceHeight=measuredHeight,surfaceWidthMethod=widthMethod,hasRendered=!0;return}targetHeight=measuredHeight}renderPass(targetHeight),surfaceWidth=width,surfaceHeight=targetHeight,surfaceWidthMethod=widthMethod,hasRendered=!0},settleSurface=async(timeoutMs=2000)=>{assertNotDestroyed();let startedAt=renderer.clock.now();renderSurface();while(!0){assertNotDestroyed();let pending=collectPendingCodeRenderables(publicRoot);if(pending.length===0)return;let remainingMs=timeoutMs-(renderer.clock.now()-startedAt);if(remainingMs<=0)throw Error("ScrollbackSurface.settle timed out waiting for CodeRenderable highlighting");await waitForPendingHighlights(pending,remainingMs),assertNotDestroyed(),renderSurface()}},commitRows=(startRow,endRowExclusive,commitOptions={})=>{if(assertNotDestroyed(),assertRendered(),assertGeometryStillCurrent(),assertRowRange(startRow,endRowExclusive),startRow===endRowExclusive)return;let rowCount=endRowExclusive-startRow,commitBuffer=OptimizedBuffer.create(surfaceWidth,rowCount,surfaceWidthMethod,{id:`scrollback-surface-commit-${surfaceId}`});try{commitBuffer.drawFrameBuffer(0,0,backingBuffer,0,startRow,surfaceWidth,rowCount),renderer.enqueueRenderedScrollbackCommit({snapshot:commitBuffer,rowColumns:commitOptions.rowColumns,startOnNewLine:nextCommitStartOnNewLine,trailingNewline:commitOptions.trailingNewline??!1}),nextCommitStartOnNewLine=!1}catch(error2){throw commitBuffer.destroy(),error2}},destroySurface=()=>{if(surfaceDestroyed)return;surfaceDestroyed=!0,renderer.off("destroy",destroyListener);let destroyError=null;try{internalRoot.destroyRecursively()}catch(error2){destroyError=error2}try{backingBuffer.destroy()}catch(error2){if(destroyError===null)destroyError=error2}if(renderContext.removeAllListeners(),snapshotContext.removeAllListeners(),destroyError!==null)throw destroyError};return renderer.on("destroy",destroyListener),{get renderContext(){return renderContext},get root(){return publicRoot},get width(){return surfaceWidth},get height(){return surfaceHeight},get isDestroyed(){return surfaceDestroyed},render:renderSurface,settle:settleSurface,commitRows,destroy:destroySurface}}writeToScrollback(write){if(this._screenMode!=="split-footer"||this._externalOutputMode!=="capture-stdout")throw Error('writeToScrollback requires screenMode "split-footer" and externalOutputMode "capture-stdout"');let snapshotContext=new ScrollbackSnapshotRenderContext(this.width,this.height,this.widthMethod),snapshot=write({width:this.width,widthMethod:this.widthMethod,tailColumn:this.splitTailColumn,renderContext:snapshotContext});if(!snapshot||!snapshot.root)throw Error("writeToScrollback must return a snapshot root renderable");let renderFailed=!1,snapshotRoot=null,snapshotBuffer=null;try{let rootRenderable=snapshot.root,snapshotWidth=this.getSnapshotWidth(snapshot.width,rootRenderable.width),snapshotHeight=this.getSnapshotHeight(snapshot.height,rootRenderable.height);snapshotContext.width=snapshotWidth,snapshotContext.height=snapshotHeight,snapshotContext.widthMethod=this.widthMethod,snapshotRoot=new RootRenderable(snapshotContext),snapshotBuffer=OptimizedBuffer.create(snapshotWidth,snapshotHeight,this.widthMethod,{id:"scrollback-snapshot-commit"}),snapshotRoot.add(rootRenderable),snapshotRoot.render(snapshotBuffer,0),this.enqueueRenderedScrollbackCommit({snapshot:snapshotBuffer,rowColumns:snapshot.rowColumns,startOnNewLine:snapshot.startOnNewLine,trailingNewline:snapshot.trailingNewline})}catch(error2){throw renderFailed=!0,snapshotBuffer?.destroy(),error2}finally{let cleanupError=null;try{if(snapshotRoot)snapshotRoot.destroyRecursively();else snapshot.root.destroyRecursively()}catch(error2){cleanupError=error2}try{snapshot.teardown?.()}catch(error2){if(cleanupError===null)cleanupError=error2}if(!renderFailed&&cleanupError)throw cleanupError}}getSnapshotWidth(value,fallback){let rawValue=value??fallback;if(!Number.isFinite(rawValue))throw Error("writeToScrollback produced a non-finite width");return Math.min(Math.max(Math.trunc(rawValue),1),Math.max(this.width,1))}getSnapshotHeight(value,fallback){let rawValue=value??fallback;if(!Number.isFinite(rawValue))throw Error("writeToScrollback produced a non-finite height");return Math.max(Math.trunc(rawValue),1)}getSnapshotRowWidths(snapshot,rowColumns){let widths=[],limit=Math.min(Math.max(Math.trunc(rowColumns),0),snapshot.width),chars=snapshot.buffers.char;for(let y=0;y<snapshot.height;y+=1){let x=limit;while(x>0){let cp3=chars[y*snapshot.width+x-1];if(cp3===0||(cp3&CHAR_FLAG_MASK)===CHAR_FLAG_CONTINUATION){x-=1;continue}break}widths.push(x)}return widths}publishSplitTailColumns(columns){if(columns<=0)return;let width=Math.max(this.width,1),tail=this.splitTailColumn,remaining=columns;while(remaining>0){if(tail>=width)tail=0;let step=Math.min(remaining,width-tail);if(tail+=step,remaining-=step,remaining>0&&tail>=width)tail=0}this.splitTailColumn=tail}recordSplitCommit(commit){if(commit.startOnNewLine&&this.splitTailColumn>0)this.splitTailColumn=0;let rowWidths=this.getSnapshotRowWidths(commit.snapshot,commit.rowColumns);for(let[index,rowWidth]of rowWidths.entries())if(this.publishSplitTailColumns(rowWidth),index<rowWidths.length-1||commit.trailingNewline)this.splitTailColumn=0}enqueueRenderedScrollbackCommit(options){if(this._screenMode!=="split-footer"||this._externalOutputMode!=="capture-stdout")throw Error('scrollback commit requires screenMode "split-footer" and externalOutputMode "capture-stdout"');let rowColumns=Math.min(Math.max(Math.trunc(options.rowColumns??options.snapshot.width),0),options.snapshot.width);this.enqueueSplitCommit({snapshot:options.snapshot,rowColumns,startOnNewLine:options.startOnNewLine??!0,trailingNewline:options.trailingNewline??!0}),this.requestRender()}enqueueSplitCommit(commit){this.recordSplitCommit(commit),this.externalOutputQueue.writeSnapshot(commit)}createStdoutSnapshotCommit(line,trailingNewline){let snapshotContext=new ScrollbackSnapshotRenderContext(this.width,1,this.widthMethod),maxWidth=Math.max(1,this.width),lineCells=[...line],rowColumns=Math.min(lineCells.length,maxWidth),renderedLine=lineCells.slice(0,maxWidth).join(""),snapshotRoot=new RootRenderable(snapshotContext),snapshotRenderable=new TextRenderable(snapshotContext,{id:"captured-stdout-snapshot",position:"absolute",left:0,top:0,width:Math.max(1,rowColumns),height:1,content:renderedLine}),snapshotBuffer=OptimizedBuffer.create(Math.max(1,rowColumns),1,this.widthMethod,{id:"captured-stdout-snapshot"});try{return snapshotRoot.add(snapshotRenderable),snapshotRoot.render(snapshotBuffer,0),{snapshot:snapshotBuffer,rowColumns,startOnNewLine:!1,trailingNewline}}catch(error2){throw snapshotBuffer.destroy(),error2}finally{snapshotRoot.destroyRecursively()}}splitStdoutRows(text){let rows=[],current="";for(let char of text){if(char==="\r"){current="";continue}if(char===`
3094
3114
  `){rows.push({line:current,trailingNewline:!0}),current="";continue}current+=char}if(current.length>0)rows.push({line:current,trailingNewline:!1});return rows}createStdoutSnapshotCommits(text){if(text.length===0)return[];let commits=[],chunkWidth=Math.max(1,this.width);for(let row of this.splitStdoutRows(text)){let rowCells=[...row.line];if(rowCells.length===0){commits.push(this.createStdoutSnapshotCommit("",row.trailingNewline));continue}let offset=0;while(offset<rowCells.length){let chunk=rowCells.slice(offset,offset+chunkWidth).join("");offset+=chunkWidth;let isLastChunk=offset>=rowCells.length;commits.push(this.createStdoutSnapshotCommit(chunk,isLastChunk?row.trailingNewline:!1))}}return commits}flushPendingSplitCommits(forceFooterRepaint=!1){let commits=this.externalOutputQueue.claim(this.maxSplitCommitsPerFrame),hasCommittedOutput=!1,lastCommitIndex=commits.length-1;for(let[index,commit]of commits.entries()){let forceCommit=forceFooterRepaint&&index===lastCommitIndex,beginFrame=index===0,finalizeFrame=index===lastCommitIndex;try{this.renderOffset=this.lib.commitSplitFooterSnapshot(this.rendererPtr,commit.snapshot,commit.rowColumns,commit.startOnNewLine,commit.trailingNewline,this.getSplitPinnedRenderOffset(),forceCommit,beginFrame,finalizeFrame),hasCommittedOutput=!0}finally{commit.snapshot.destroy()}}if(!hasCommittedOutput)this.renderOffset=this.lib.repaintSplitFooter(this.rendererPtr,this.getSplitPinnedRenderOffset(),forceFooterRepaint);if(this.pendingSplitFooterTransition=null,this.externalOutputQueue.size>0)this.requestRender()}interceptStdoutWrite=(chunk,encoding,callback)=>{let resolvedCallback=typeof encoding==="function"?encoding:callback,resolvedEncoding=typeof encoding==="string"?encoding:void 0,text=typeof chunk==="string"?chunk:chunk?.toString(resolvedEncoding)??"";if(this._externalOutputMode==="capture-stdout"&&this._screenMode==="split-footer"&&this._splitHeight>0){let commits=this.createStdoutSnapshotCommits(text);for(let commit of commits)this.enqueueSplitCommit(commit);if(commits.length>0)this.requestRender()}if(typeof resolvedCallback==="function")process.nextTick(resolvedCallback);return!0};getSplitPinnedRenderOffset(){return this._screenMode==="split-footer"?Math.max(this._terminalHeight-this._splitHeight,0):0}getSplitCursorSeedRows(){let cursorState=this.lib.getCursorState(this.rendererPtr),cursorRow=Number.isFinite(cursorState.y)?Math.max(Math.trunc(cursorState.y),1):1;return Math.min(cursorRow,Math.max(this._terminalHeight,1))}flushPendingSplitOutputBeforeTransition(forceFooterRepaint=!1){if(this._screenMode!=="split-footer"||this._splitHeight<=0||this._externalOutputMode!=="capture-stdout")return;if(this.externalOutputQueue.size===0&&!forceFooterRepaint)return;this.flushPendingSplitCommits(forceFooterRepaint)}resetSplitScrollback(seedRows=0){this.splitTailColumn=0,this.renderOffset=this.lib.resetSplitScrollback(this.rendererPtr,seedRows,this.getSplitPinnedRenderOffset())}syncSplitScrollback(){this.renderOffset=this.lib.syncSplitScrollback(this.rendererPtr,this.getSplitPinnedRenderOffset())}clearPendingSplitFooterTransition(){if(this.pendingSplitFooterTransition===null)return;this.pendingSplitFooterTransition=null,this.lib.clearPendingSplitFooterTransition(this.rendererPtr)}setPendingSplitFooterTransition(transition){this.pendingSplitFooterTransition=transition,this.lib.setPendingSplitFooterTransition(this.rendererPtr,transition.mode==="viewport-scroll"?1:2,transition.sourceTopLine,transition.sourceHeight,transition.targetTopLine,transition.targetHeight)}syncSplitFooterState(){if(!(this._screenMode==="split-footer"&&this._splitHeight>0)){this.clearPendingSplitFooterTransition(),this.splitTailColumn=0,this.lib.resetSplitScrollback(this.rendererPtr,0,0),this.renderOffset=0,this.lib.setRenderOffset(this.rendererPtr,this.renderOffset);return}if(this._externalOutputMode==="capture-stdout")this.syncSplitScrollback();else this.clearPendingSplitFooterTransition(),this.splitTailColumn=0,this.lib.resetSplitScrollback(this.rendererPtr,0,0),this.renderOffset=this.getSplitPinnedRenderOffset(),this.lib.setRenderOffset(this.rendererPtr,this.renderOffset)}clearStaleSplitSurfaceRows(previousTopLine,previousHeight,nextTopLine,nextHeight){if(!this._terminalIsSetup||previousHeight<=0||this._terminalHeight<=0)return;let terminalBottom=this._terminalHeight,previousStart=Math.max(1,previousTopLine),previousEnd=Math.min(terminalBottom,previousTopLine+previousHeight-1);if(previousEnd<previousStart)return;let nextStart=Math.max(1,nextTopLine),nextEnd=Math.min(terminalBottom,nextTopLine+Math.max(nextHeight,0)-1),clear="";for(let line=previousStart;line<=previousEnd;line+=1){if(line>=nextStart&&line<=nextEnd)continue;clear+=`${ANSI3.moveCursor(line,1)}\x1B[2K`}if(clear.length>0)this.writeOut(clear)}applyScreenMode(screenMode,emitResize=!0,requestRender=!0){let prevScreenMode=this._screenMode,prevSplitHeight=this._splitHeight,nextGeometry=calculateRenderGeometry(screenMode,this._terminalWidth,this._terminalHeight,this._footerHeight),nextSplitHeight=nextGeometry.effectiveFooterHeight;if(prevScreenMode===screenMode&&prevSplitHeight===nextSplitHeight)return;let prevUseAlternateScreen=prevScreenMode==="alternate-screen",nextUseAlternateScreen=screenMode==="alternate-screen",terminalScreenModeChanged=this._terminalIsSetup&&prevUseAlternateScreen!==nextUseAlternateScreen,leavingSplitFooter=prevSplitHeight>0&&nextSplitHeight===0;if(this._terminalIsSetup&&prevSplitHeight>0)this.flushPendingSplitOutputBeforeTransition();let previousSurfaceTopLine=this.renderOffset+1,previousPinnedRenderOffset=Math.max(this._terminalHeight-prevSplitHeight,0),splitWasSettled=prevSplitHeight===0||this.renderOffset>=previousPinnedRenderOffset,shouldUseViewportScrollTransitions=this._externalOutputMode!=="capture-stdout"||splitWasSettled,shouldDeferSplitFooterResizeTransition=this._terminalIsSetup&&prevScreenMode==="split-footer"&&screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout"&&prevSplitHeight>0&&nextSplitHeight>0&&!terminalScreenModeChanged,splitStartupSeedBlocksFirstNativeFrame=this.pendingSplitStartupCursorSeed&&this.splitStartupSeedTimeoutId!==null,splitTransitionSourceTopLine=this.pendingSplitFooterTransition?.sourceTopLine??previousSurfaceTopLine,splitTransitionSourceHeight=this.pendingSplitFooterTransition?.sourceHeight??prevSplitHeight,splitTransitionMode=this.pendingSplitFooterTransition?.mode??(splitWasSettled?"viewport-scroll":"clear-stale-rows");if(this._terminalIsSetup&&leavingSplitFooter)this.clearPendingSplitFooterTransition(),this.renderOffset=0,this.lib.setRenderOffset(this.rendererPtr,0);if(this._terminalIsSetup&&!terminalScreenModeChanged&&shouldUseViewportScrollTransitions&&!shouldDeferSplitFooterResizeTransition){if(prevSplitHeight===0&&nextSplitHeight>0){let freedLines=this._terminalHeight-nextSplitHeight,scrollDown=ANSI3.scrollDown(freedLines);this.writeOut(scrollDown)}else if(prevSplitHeight>nextSplitHeight&&nextSplitHeight>0){let freedLines=prevSplitHeight-nextSplitHeight,scrollDown=ANSI3.scrollDown(freedLines);this.writeOut(scrollDown)}else if(prevSplitHeight<nextSplitHeight&&prevSplitHeight>0){let additionalLines=nextSplitHeight-prevSplitHeight,scrollUp=ANSI3.scrollUp(additionalLines);this.writeOut(scrollUp)}}if(this._screenMode=screenMode,this._splitHeight=nextSplitHeight,this.width=nextGeometry.renderWidth,this.height=nextGeometry.renderHeight,this.lib.resizeRenderer(this.rendererPtr,this.width,this.height),this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout"){if(prevScreenMode!=="split-footer")this.resetSplitScrollback(this.getSplitCursorSeedRows());else this.syncSplitScrollback();if(shouldDeferSplitFooterResizeTransition){if(splitStartupSeedBlocksFirstNativeFrame)this.clearPendingSplitFooterTransition();else this.setPendingSplitFooterTransition({mode:splitTransitionMode,sourceTopLine:splitTransitionSourceTopLine,sourceHeight:splitTransitionSourceHeight,targetTopLine:this.renderOffset+1,targetHeight:nextSplitHeight});this.forceFullRepaintRequested=!0}else if(!shouldUseViewportScrollTransitions&&prevSplitHeight>0&&nextSplitHeight>0)this.clearPendingSplitFooterTransition(),this.clearStaleSplitSurfaceRows(previousSurfaceTopLine,prevSplitHeight,this.renderOffset+1,nextSplitHeight);else this.clearPendingSplitFooterTransition()}else this.syncSplitFooterState();if(this.nextRenderBuffer=this.lib.getNextBuffer(this.rendererPtr),this.currentRenderBuffer=this.lib.getCurrentBuffer(this.rendererPtr),this._console.resize(this.width,this.height),this.root.resize(this.width,this.height),terminalScreenModeChanged){if(this.lib.suspendRenderer(this.rendererPtr),this.lib.setupTerminal(this.rendererPtr,nextUseAlternateScreen),this._useMouse)this.enableMouse()}if(emitResize)this.emit("resize",this.width,this.height);if(requestRender)this.requestRender()}flushStdoutCache(space,force=!1){if(this.externalOutputQueue.size===0&&!force)return!1;let outputCommits=this.externalOutputQueue.claim(),output="";for(let commit of outputCommits)output+=`[snapshot ${commit.snapshot.width}x${commit.snapshot.height}]
3095
3115
  `,commit.snapshot.destroy();let rendererStartLine=this.renderOffset+1,flush=ANSI3.moveCursorAndClear(rendererStartLine,1),outputLine=this.renderOffset+1,move=ANSI3.moveCursor(outputLine,1),clear="";if(space>0){let backgroundColor=this.backgroundColor.toInts(),newlines=" ".repeat(this.width)+`
3096
- `.repeat(space);if(backgroundColor[3]===0)clear=newlines;else clear=ANSI3.setRgbBackground(backgroundColor[0],backgroundColor[1],backgroundColor[2])+newlines+ANSI3.resetBackground}return this.writeOut(flush+move+output+clear),!0}enableMouse(){this._useMouse=!0,this.lib.enableMouse(this.rendererPtr,this.enableMouseMovement)}disableMouse(){this._useMouse=!1,this.setCapturedRenderable(void 0),this.stdinParser?.resetMouseState(),this.lib.disableMouse(this.rendererPtr)}enableKittyKeyboard(flags=3){this.lib.enableKittyKeyboard(this.rendererPtr,flags),this.updateStdinParserProtocolContext({kittyKeyboardEnabled:!0})}disableKittyKeyboard(){this.lib.disableKittyKeyboard(this.rendererPtr),this.updateStdinParserProtocolContext({kittyKeyboardEnabled:!1},!0)}set useThread(useThread){this._useThread=useThread,this.lib.setUseThread(this.rendererPtr,useThread)}async setupTerminal(){if(this._terminalIsSetup)return;this._terminalIsSetup=!0;let startupCursorCprActive=this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout";if(this.updateStdinParserProtocolContext({privateCapabilityRepliesActive:!0,explicitWidthCprActive:!0,startupCursorCprActive}),this.lib.setupTerminal(this.rendererPtr,this._screenMode==="alternate-screen"),this._capabilities=this.lib.getTerminalCapabilities(this.rendererPtr),this.debugOverlay.enabled){if(this.lib.setDebugOverlay(this.rendererPtr,!0,this.debugOverlay.corner),!this.memorySnapshotInterval)this.memorySnapshotInterval=3000,this.startMemorySnapshotTimer(),this.automaticMemorySnapshot=!0}if(this.capabilityTimeoutId=this.clock.setTimeout(()=>{if(this.capabilityTimeoutId=null,this.pendingSplitStartupCursorSeed=!1,this.splitStartupSeedTimeoutId!==null)this.clock.clearTimeout(this.splitStartupSeedTimeoutId),this.splitStartupSeedTimeoutId=null;if(this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout")this.requestRender();this.removeInputHandler(this.capabilityHandler),this.updateStdinParserProtocolContext({privateCapabilityRepliesActive:!1,explicitWidthCprActive:!1,startupCursorCprActive:!1},!0)},5000),this._useMouse)this.enableMouse();if(this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout"){if(this.pendingSplitStartupCursorSeed=!0,this.splitStartupSeedTimeoutId!==null)this.clock.clearTimeout(this.splitStartupSeedTimeoutId);this.splitStartupSeedTimeoutId=this.clock.setTimeout(()=>{if(this.splitStartupSeedTimeoutId=null,!this.pendingSplitStartupCursorSeed)return;if(this.updateStdinParserProtocolContext({startupCursorCprActive:!1}),this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout")this.requestRender()},120)}this.queryPixelResolution(),this.ensureNativePaletteState()}stdinListener=((chunk)=>{let data=Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk);if(!this.stdinParser)return;try{this.stdinParser.push(data),this.drainStdinParser()}catch(error2){this.handleStdinParserFailure(error2)}}).bind(this);addInputHandler(handler){this.sequenceHandlers.push(handler)}prependInputHandler(handler){this.sequenceHandlers.unshift(handler)}removeInputHandler(handler){this.sequenceHandlers=this.sequenceHandlers.filter((candidate)=>candidate!==handler)}updateStdinParserProtocolContext(patch,drain=!1){if(!this.stdinParser)return;if(this.stdinParser.updateProtocolContext(patch),drain)this.drainStdinParser()}subscribeOsc(handler){return this.oscSubscribers.add(handler),()=>{this.oscSubscribers.delete(handler)}}processCapabilitySequence(sequence,hasCursorReport){let hasStandardCapabilitySignature=isCapabilityResponse(sequence);if(!(hasStandardCapabilitySignature||hasCursorReport&&this.capabilityTimeoutId!==null))return!1;if(this.lib.processCapabilityResponse(this.rendererPtr,sequence),this._capabilities=this.lib.getTerminalCapabilities(this.rendererPtr),hasStandardCapabilitySignature)this.forceFullRepaintRequested=!0,this.requestRender();this.emit("capabilities",this._capabilities);let hadPendingSplitStartupCursorSeed=this.pendingSplitStartupCursorSeed;if(hadPendingSplitStartupCursorSeed&&hasCursorReport&&this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout"){if(this.resetSplitScrollback(this.getSplitCursorSeedRows()),this.clearPendingSplitFooterTransition(),this.pendingSplitStartupCursorSeed=!1,this.updateStdinParserProtocolContext({startupCursorCprActive:!1}),this.splitStartupSeedTimeoutId!==null)this.clock.clearTimeout(this.splitStartupSeedTimeoutId),this.splitStartupSeedTimeoutId=null;this.requestRender()}let consumeStartupCursorReport=hadPendingSplitStartupCursorSeed&&hasCursorReport&&this.splitStartupSeedTimeoutId!==null;return hasStandardCapabilitySignature||consumeStartupCursorReport}capabilityHandler=((sequence)=>{return this.processCapabilitySequence(sequence,!1)}).bind(this);focusHandler=((sequence)=>{if(sequence==="\x1B[I"){if(this.shouldRestoreModesOnNextFocus)this.lib.restoreTerminalModes(this.rendererPtr),this.shouldRestoreModesOnNextFocus=!1;if(this._terminalFocusState!==!0)this._terminalFocusState=!0,this.emit("focus");return!0}if(sequence==="\x1B[O"){if(this.shouldRestoreModesOnNextFocus=!0,this._terminalFocusState!==!1)this._terminalFocusState=!1,this.emit("blur");return!0}return!1}).bind(this);dispatchSequenceHandlers(sequence){if(this._debugModeEnabled)this._debugInputs.push({timestamp:new Date().toISOString(),sequence});for(let handler of this.sequenceHandlers)if(handler(sequence))return!0;return!1}drainStdinParser(){if(!this.stdinParser)return;this.stdinParser.drain((event)=>{this.handleStdinEvent(event)})}handleStdinEvent(event){switch(event.type){case"key":if(this.dispatchSequenceHandlers(event.raw))return;this._keyHandler.processParsedKey(event.key);return;case"mouse":if(this._useMouse&&this.processSingleMouseEvent(event.event))return;this.dispatchSequenceHandlers(event.raw);return;case"paste":this._keyHandler.processPaste(event.bytes,event.metadata);return;case"response":if(event.protocol==="osc")for(let subscriber of this.oscSubscribers)subscriber(event.sequence);if(event.protocol==="cpr"&&this.processCapabilitySequence(event.sequence,!0))return;this.dispatchSequenceHandlers(event.sequence);return}}handleStdinParserFailure(error2){if(!this.hasLoggedStdinParserError)this.hasLoggedStdinParserError=!0,console.error("[stdin-parser-error] parser failure, resetting parser",error2);try{this.stdinParser?.reset()}catch(resetError){console.error("stdin parser reset failed after parser error",resetError)}}setupInput(){for(let handler of this.prependedInputHandlers)this.addInputHandler(handler);if(this.addInputHandler((sequence)=>{if(isPixelResolutionResponse(sequence)&&this.waitingForPixelResolution){let resolution=parsePixelResolution(sequence);if(resolution)this._resolution=resolution;return this.waitingForPixelResolution=!1,this.updateStdinParserProtocolContext({pixelResolutionQueryActive:!1},!0),!0}return!1}),this.addInputHandler(this.capabilityHandler),this.addInputHandler(this.focusHandler),this.addInputHandler(this.themeModeHandler),this.stdin.setRawMode)this.stdin.setRawMode(!0);this.stdin.on("data",this.stdinListener),this.stdin.resume()}dispatchMouseEvent(target,attributes){let event=new MouseEvent(target,attributes);if(target.processMouseEvent(event),this.autoFocus&&event.type==="down"&&event.button===0&&!event.defaultPrevented){let current=target;while(current){if(current.focusable){current.focus();break}current=current.parent}}return event}processSingleMouseEvent(mouseEvent){if(this._splitHeight>0){if(mouseEvent.y<this.renderOffset)return!1;mouseEvent.y-=this.renderOffset}if(this._latestPointer.x=mouseEvent.x,this._latestPointer.y=mouseEvent.y,this._hasPointer=!0,this._lastPointerModifiers=mouseEvent.modifiers,this._console.visible){let consoleBounds=this._console.bounds;if(mouseEvent.x>=consoleBounds.x&&mouseEvent.x<consoleBounds.x+consoleBounds.width&&mouseEvent.y>=consoleBounds.y&&mouseEvent.y<consoleBounds.y+consoleBounds.height){let event2=new MouseEvent(null,mouseEvent);if(this._console.handleMouse(event2))return!0}}if(mouseEvent.type==="scroll"){let maybeRenderableId2=this.hitTest(mouseEvent.x,mouseEvent.y),maybeRenderable2=Renderable.renderablesByNumber.get(maybeRenderableId2),fallbackTarget=this._currentFocusedRenderable&&!this._currentFocusedRenderable.isDestroyed&&this._currentFocusedRenderable.focused?this._currentFocusedRenderable:null,scrollTarget=maybeRenderable2??fallbackTarget;if(scrollTarget){let event2=new MouseEvent(scrollTarget,mouseEvent);scrollTarget.processMouseEvent(event2)}return!0}let maybeRenderableId=this.hitTest(mouseEvent.x,mouseEvent.y),sameElement=maybeRenderableId===this.lastOverRenderableNum;this.lastOverRenderableNum=maybeRenderableId;let maybeRenderable=Renderable.renderablesByNumber.get(maybeRenderableId);if(mouseEvent.type==="down"&&mouseEvent.button===0&&!this.currentSelection?.isDragging&&!mouseEvent.modifiers.ctrl){if(Boolean(maybeRenderable&&maybeRenderable.selectable&&!maybeRenderable.isDestroyed&&maybeRenderable.shouldStartSelection(mouseEvent.x,mouseEvent.y))&&maybeRenderable)return this.startSelection(maybeRenderable,mouseEvent.x,mouseEvent.y),this.dispatchMouseEvent(maybeRenderable,mouseEvent),!0}if(mouseEvent.type==="drag"&&this.currentSelection?.isDragging){if(this.updateSelection(maybeRenderable,mouseEvent.x,mouseEvent.y),maybeRenderable){let event2=new MouseEvent(maybeRenderable,{...mouseEvent,isDragging:!0});maybeRenderable.processMouseEvent(event2)}return!0}if(mouseEvent.type==="up"&&this.currentSelection?.isDragging){if(maybeRenderable){let event2=new MouseEvent(maybeRenderable,{...mouseEvent,isDragging:!0});maybeRenderable.processMouseEvent(event2)}return this.finishSelection(),!0}if(mouseEvent.type==="down"&&mouseEvent.button===0&&this.currentSelection){if(mouseEvent.modifiers.ctrl)return this.currentSelection.isDragging=!0,this.updateSelection(maybeRenderable,mouseEvent.x,mouseEvent.y),!0}if(!sameElement&&(mouseEvent.type==="drag"||mouseEvent.type==="move")){if(this.lastOverRenderable&&this.lastOverRenderable!==this.capturedRenderable&&!this.lastOverRenderable.isDestroyed){let event2=new MouseEvent(this.lastOverRenderable,{...mouseEvent,type:"out"});this.lastOverRenderable.processMouseEvent(event2)}if(this.lastOverRenderable=maybeRenderable,maybeRenderable){let event2=new MouseEvent(maybeRenderable,{...mouseEvent,type:"over",source:this.capturedRenderable});maybeRenderable.processMouseEvent(event2)}}if(this.capturedRenderable&&mouseEvent.type!=="up"){let event2=new MouseEvent(this.capturedRenderable,mouseEvent);return this.capturedRenderable.processMouseEvent(event2),!0}if(this.capturedRenderable&&mouseEvent.type==="up"){let event2=new MouseEvent(this.capturedRenderable,{...mouseEvent,type:"drag-end"});if(this.capturedRenderable.processMouseEvent(event2),this.capturedRenderable.processMouseEvent(new MouseEvent(this.capturedRenderable,mouseEvent)),maybeRenderable){let event3=new MouseEvent(maybeRenderable,{...mouseEvent,type:"drop",source:this.capturedRenderable});maybeRenderable.processMouseEvent(event3)}this.lastOverRenderable=this.capturedRenderable,this.lastOverRenderableNum=this.capturedRenderable.num,this.setCapturedRenderable(void 0),this.requestRender()}let event;if(maybeRenderable){if(mouseEvent.type==="drag"&&mouseEvent.button===0)this.setCapturedRenderable(maybeRenderable);else this.setCapturedRenderable(void 0);event=this.dispatchMouseEvent(maybeRenderable,mouseEvent)}else this.setCapturedRenderable(void 0),this.lastOverRenderable=void 0;if(!event?.defaultPrevented&&mouseEvent.type==="down"&&this.currentSelection)this.clearSelection();return!0}recheckHoverState(){if(this._isDestroyed||!this._hasPointer)return;if(this.capturedRenderable)return;let hitId=this.hitTest(this._latestPointer.x,this._latestPointer.y),hitRenderable=Renderable.renderablesByNumber.get(hitId),lastOver=this.lastOverRenderable;if(lastOver?.num===hitId){this.lastOverRenderableNum=hitId;return}let baseEvent={type:"move",button:0,x:this._latestPointer.x,y:this._latestPointer.y,modifiers:this._lastPointerModifiers};if(lastOver&&!lastOver.isDestroyed){let event=new MouseEvent(lastOver,{...baseEvent,type:"out"});lastOver.processMouseEvent(event)}if(this.lastOverRenderable=hitRenderable,this.lastOverRenderableNum=hitId,hitRenderable){let event=new MouseEvent(hitRenderable,{...baseEvent,type:"over"});hitRenderable.processMouseEvent(event)}}setMousePointer(style){this._currentMousePointerStyle=style,this.lib.setCursorStyleOptions(this.rendererPtr,{cursor:style})}hitTest(x,y){return this.lib.checkHit(this.rendererPtr,x,y)}takeMemorySnapshot(){if(this._isDestroyed)return;let memoryUsage=process.memoryUsage();this.lastMemorySnapshot={heapUsed:memoryUsage.heapUsed,heapTotal:memoryUsage.heapTotal,arrayBuffers:memoryUsage.arrayBuffers},this.lib.updateMemoryStats(this.rendererPtr,this.lastMemorySnapshot.heapUsed,this.lastMemorySnapshot.heapTotal,this.lastMemorySnapshot.arrayBuffers),this.emit("memory:snapshot",this.lastMemorySnapshot)}startMemorySnapshotTimer(){this.stopMemorySnapshotTimer(),this.memorySnapshotTimer=this.clock.setInterval(()=>{this.takeMemorySnapshot()},this.memorySnapshotInterval)}stopMemorySnapshotTimer(){if(this.memorySnapshotTimer)this.clock.clearInterval(this.memorySnapshotTimer),this.memorySnapshotTimer=null}setMemorySnapshotInterval(interval){if(this.memorySnapshotInterval=interval,this._isRunning&&interval>0)this.startMemorySnapshotTimer();else if(interval<=0&&this.memorySnapshotTimer)this.clock.clearInterval(this.memorySnapshotTimer),this.memorySnapshotTimer=null}handleResize(width,height2){if(this._isDestroyed)return;if(this._splitHeight>0){this.processResize(width,height2);return}if(this.resizeTimeoutId!==null)this.clock.clearTimeout(this.resizeTimeoutId),this.resizeTimeoutId=null;this.resizeTimeoutId=this.clock.setTimeout(()=>{this.resizeTimeoutId=null,this.processResize(width,height2)},this.resizeDebounceDelay)}queryPixelResolution(){this.waitingForPixelResolution=!0,this.updateStdinParserProtocolContext({pixelResolutionQueryActive:!0}),this.lib.queryPixelResolution(this.rendererPtr)}processResize(width,height2){if(width===this._terminalWidth&&height2===this._terminalHeight)return;if(this._terminalIsSetup&&this._controlState!=="explicit_suspended")this.flushPendingSplitOutputBeforeTransition();let pendingSplitFooterTransition=this.pendingSplitFooterTransition,previousGeometry=calculateRenderGeometry(this._screenMode,this._terminalWidth,this._terminalHeight,this._footerHeight),prevWidth=this._terminalWidth,previousTerminalHeight=this._terminalHeight,visiblePreviousSplitHeight=pendingSplitFooterTransition?.sourceHeight??previousGeometry.effectiveFooterHeight;this._terminalWidth=width,this._terminalHeight=height2,this.queryPixelResolution(),this.setCapturedRenderable(void 0),this.stdinParser?.resetMouseState();let nextGeometry=calculateRenderGeometry(this._screenMode,this._terminalWidth,this._terminalHeight,this._footerHeight);if(this._screenMode==="split-footer"){let clearStart=null;if(width<prevWidth&&visiblePreviousSplitHeight>0)clearStart=Math.max(previousTerminalHeight-visiblePreviousSplitHeight*2,1);if(pendingSplitFooterTransition!==null)clearStart=clearStart===null?pendingSplitFooterTransition.sourceTopLine:Math.min(clearStart,pendingSplitFooterTransition.sourceTopLine);if(clearStart!==null){let flush=ANSI3.moveCursorAndClear(clearStart,1);this.writeOut(flush)}this.currentRenderBuffer.clear(this.backgroundColor)}if(this.clearPendingSplitFooterTransition(),this._splitHeight=nextGeometry.effectiveFooterHeight,this.width=nextGeometry.renderWidth,this.height=nextGeometry.renderHeight,this.lib.resizeRenderer(this.rendererPtr,this.width,this.height),this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout")this.syncSplitScrollback();else this.syncSplitFooterState();this.nextRenderBuffer=this.lib.getNextBuffer(this.rendererPtr),this.currentRenderBuffer=this.lib.getCurrentBuffer(this.rendererPtr),this._console.resize(this.width,this.height),this.root.resize(this.width,this.height),this.emit("resize",this.width,this.height),this.requestRender()}setBackgroundColor(color2){let parsedColor=parseColor(color2);this.lib.setBackgroundColor(this.rendererPtr,parsedColor),this.backgroundColor=parsedColor,this.nextRenderBuffer.clear(parsedColor),this.requestRender()}toggleDebugOverlay(){let willBeEnabled=!this.debugOverlay.enabled;if(willBeEnabled&&!this.memorySnapshotInterval)this.memorySnapshotInterval=3000,this.startMemorySnapshotTimer(),this.automaticMemorySnapshot=!0;else if(!willBeEnabled&&this.automaticMemorySnapshot)this.stopMemorySnapshotTimer(),this.memorySnapshotInterval=0,this.automaticMemorySnapshot=!1;this.debugOverlay.enabled=!this.debugOverlay.enabled,this.lib.setDebugOverlay(this.rendererPtr,this.debugOverlay.enabled,this.debugOverlay.corner),this.emit("debugOverlay:toggle",this.debugOverlay.enabled),this.requestRender()}configureDebugOverlay(options){this.debugOverlay.enabled=options.enabled??this.debugOverlay.enabled,this.debugOverlay.corner=options.corner??this.debugOverlay.corner,this.lib.setDebugOverlay(this.rendererPtr,this.debugOverlay.enabled,this.debugOverlay.corner),this.requestRender()}setTerminalTitle(title){this.lib.setTerminalTitle(this.rendererPtr,title)}resetTerminalBgColor(){process.stdout.write("\x1B]111\x07")}copyToClipboardOSC52(text,target){return this.clipboard.copyToClipboardOSC52(text,target)}clearClipboardOSC52(target){return this.clipboard.clearClipboardOSC52(target)}isOsc52Supported(){return this._capabilities?.osc52??this.clipboard.isOsc52Supported()}dumpHitGrid(){this.lib.dumpHitGrid(this.rendererPtr)}dumpBuffers(timestamp2){this.lib.dumpBuffers(this.rendererPtr,timestamp2)}dumpStdoutBuffer(timestamp2){this.lib.dumpStdoutBuffer(this.rendererPtr,timestamp2)}static setCursorPosition(renderer,x,y,visible=!0){resolveRenderLib().setCursorPosition(renderer.rendererPtr,x,y,visible)}static setCursorStyle(renderer,options){if(resolveRenderLib().setCursorStyleOptions(renderer.rendererPtr,options),options.cursor!==void 0)renderer._currentMousePointerStyle=options.cursor}static setCursorColor(renderer,color2){resolveRenderLib().setCursorColor(renderer.rendererPtr,color2)}setCursorPosition(x,y,visible=!0){this.lib.setCursorPosition(this.rendererPtr,x,y,visible)}setCursorStyle(options){if(this.lib.setCursorStyleOptions(this.rendererPtr,options),options.cursor!==void 0)this._currentMousePointerStyle=options.cursor}setCursorColor(color2){this.lib.setCursorColor(this.rendererPtr,color2)}getCursorState(){return this.lib.getCursorState(this.rendererPtr)}addPostProcessFn(processFn){this.postProcessFns.push(processFn)}removePostProcessFn(processFn){this.postProcessFns=this.postProcessFns.filter((fn)=>fn!==processFn)}clearPostProcessFns(){this.postProcessFns=[]}setFrameCallback(callback){this.frameCallbacks.push(callback)}removeFrameCallback(callback){this.frameCallbacks=this.frameCallbacks.filter((cb)=>cb!==callback)}clearFrameCallbacks(){this.frameCallbacks=[]}requestLive(){if(this.liveRequestCounter++,this._controlState==="idle"&&this.liveRequestCounter>0)this._controlState="auto_started",this.internalStart()}dropLive(){if(this.liveRequestCounter=Math.max(0,this.liveRequestCounter-1),this._controlState==="auto_started"&&this.liveRequestCounter===0)this._controlState="idle",this.internalPause()}start(){this._controlState="explicit_started",this.internalStart()}auto(){this._controlState=this._isRunning?"auto_started":"idle"}internalStart(){if(!this._isRunning&&!this._isDestroyed){if(this._isRunning=!0,this.updateScheduled=!1,this.memorySnapshotInterval>0)this.startMemorySnapshotTimer();this.startRenderLoop()}}pause(){this._controlState="explicit_paused",this.internalPause()}suspend(){if(this._previousControlState=this._controlState,this._controlState="explicit_suspended",this.internalPause(),this._terminalIsSetup)this.flushPendingSplitOutputBeforeTransition(!0);if(this._suspendedMouseEnabled=this._useMouse,this.disableMouse(),this.removeExitListeners(),this.waitingForPixelResolution=!1,this.updateStdinParserProtocolContext({privateCapabilityRepliesActive:!1,pixelResolutionQueryActive:!1,explicitWidthCprActive:!1,startupCursorCprActive:!1}),this.stdinParser?.reset(),this.stdin.removeListener("data",this.stdinListener),this.themeModeState.cancelRefresh(),this.lib.suspendRenderer(this.rendererPtr),this.stdin.setRawMode)this.stdin.setRawMode(!1);this.stdin.pause()}resume(){if(this.stdin.setRawMode)this.stdin.setRawMode(!0);while(this.stdin.read()!==null);if(this.stdin.on("data",this.stdinListener),this.stdin.resume(),this.addExitListeners(),this.lib.resumeRenderer(this.rendererPtr),this._screenMode==="split-footer"&&this._splitHeight>0)this.syncSplitFooterState();if(this._suspendedMouseEnabled)this.enableMouse();if(this.currentRenderBuffer.clear(this.backgroundColor),this._controlState=this._previousControlState,this._previousControlState==="auto_started"||this._previousControlState==="explicit_started")this.internalStart();else this.requestRender()}internalPause(){if(this._isRunning=!1,this.renderTimeout)this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null;if(!this.rendering)this.resolveIdleIfNeeded()}stop(){this._controlState="explicit_stopped",this.internalStop()}internalStop(){if(this.isRunning&&!this._isDestroyed){if(this._isRunning=!1,this.memorySnapshotTimer)this.clock.clearInterval(this.memorySnapshotTimer),this.memorySnapshotTimer=null;if(this.renderTimeout)this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null;if(!this.rendering)this.resolveIdleIfNeeded()}}destroy(){if(this._isDestroyed)return;if(this._isDestroyed=!0,this._destroyPending=!0,this.rendering){this.prepareDestroyDuringRender();return}this.finalizeDestroy()}cleanupBeforeDestroy(){if(this._destroyCleanupPrepared)return;if(this._destroyCleanupPrepared=!0,process.removeListener("SIGWINCH",this.sigwinchHandler),process.removeListener("uncaughtException",this.handleError),process.removeListener("unhandledRejection",this.handleError),process.removeListener("warning",this.warningHandler),process.removeListener("beforeExit",this.exitHandler),this.removeExitListeners(),this.resizeTimeoutId!==null)this.clock.clearTimeout(this.resizeTimeoutId),this.resizeTimeoutId=null;if(this.capabilityTimeoutId!==null)this.clock.clearTimeout(this.capabilityTimeoutId),this.capabilityTimeoutId=null;if(this.splitStartupSeedTimeoutId!==null)this.clock.clearTimeout(this.splitStartupSeedTimeoutId),this.splitStartupSeedTimeoutId=null;if(this.memorySnapshotTimer)this.clock.clearInterval(this.memorySnapshotTimer),this.memorySnapshotTimer=null;if(this.renderTimeout)this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null;if(this.themeModeState.cancelRefresh(),this._isRunning=!1,this.waitingForPixelResolution=!1,this.updateStdinParserProtocolContext({privateCapabilityRepliesActive:!1,pixelResolutionQueryActive:!1,explicitWidthCprActive:!1,startupCursorCprActive:!1},!0),this._useMouse=!1,this.setCapturedRenderable(void 0),this.stdin.removeListener("data",this.stdinListener),this.stdin.setRawMode)this.stdin.setRawMode(!1);if(this.externalOutputMode="passthrough",this._splitHeight>0)this.flushStdoutCache(this._splitHeight,!0)}prepareDestroyDuringRender(){this.cleanupBeforeDestroy(),this.lib.suspendRenderer(this.rendererPtr)}finalizeDestroy(){if(this._destroyFinalized)return;if(this._destroyFinalized=!0,this._destroyPending=!1,this.cleanupBeforeDestroy(),this._paletteDetector)this._paletteDetector.cleanup(),this._paletteDetector=null;this._paletteCache.clear(),this._paletteDetectionPromise=null,this._paletteDetectionSize=0,this._cachedPalette=null,this._publishedPaletteSignature=null,this._paletteEpoch=0,this._palettePublishGeneration=0,this.themeModeState.dispose(),this.emit("destroy");try{this.root.destroyRecursively()}catch(e){console.error("Error destroying root renderable:",e instanceof Error?e.stack:String(e))}if(this.stdinParser?.destroy(),this.stdinParser=null,this.oscSubscribers.clear(),this._console.destroy(),this._splitHeight>0&&this._terminalIsSetup&&this._controlState!=="explicit_suspended"){if(this.flushPendingSplitOutputBeforeTransition(!0),this.renderOffset=0,this.clearOnShutdown)this.lib.setRenderOffset(this.rendererPtr,0)}if(this._externalOutputMode="passthrough",this.stdout.write=this.realStdoutWrite,this.externalOutputQueue.clear(),this.lib.destroyRenderer(this.rendererPtr),rendererTracker.removeRenderer(this),this._onDestroy)try{this._onDestroy()}catch(e){console.error("Error in onDestroy callback:",e instanceof Error?e.stack:String(e))}this.resolveIdleIfNeeded()}startRenderLoop(){if(!this._isRunning)return;this.lastTime=this.normalizeClockTime(this.clock.now(),0),this.frameCount=0,this.lastFpsTime=this.lastTime,this.currentFps=0,this.loop()}async loop(){if(this.rendering||this._isDestroyed)return;if(this.renderTimeout=null,this.rendering=!0,this.renderTimeout)this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null;try{this._frameId++;let now=this.normalizeClockTime(this.clock.now(),this.lastTime),deltaTime=this.getElapsedMs(now,this.lastTime);if(this.lastTime=now,this.frameCount++,this.getElapsedMs(now,this.lastFpsTime)>=1000)this.currentFps=this.frameCount,this.frameCount=0,this.lastFpsTime=now;this.renderStats.frameCount++,this.renderStats.fps=this.currentFps;let overallStart=performance.now(),frameRequests=Array.from(this.animationRequest.values());this.animationRequest.clear();let animationRequestStart=performance.now();for(let callback of frameRequests)callback(deltaTime),this.dropLive();let animationRequestTime=performance.now()-animationRequestStart,start3=performance.now();for(let frameCallback of this.frameCallbacks)try{await frameCallback(deltaTime)}catch(error2){console.error("Error in frame callback:",error2)}let end=performance.now();this.renderStats.frameCallbackTime=end-start3,this.root.render(this.nextRenderBuffer,deltaTime);for(let postProcessFn of this.postProcessFns)postProcessFn(this.nextRenderBuffer,deltaTime);if(this._console.renderToBuffer(this.nextRenderBuffer),!this._isDestroyed){if(this.renderNative(),this._useMouse&&this.lib.getHitGridDirty(this.rendererPtr))this.recheckHoverState();let overallFrameTime=performance.now()-overallStart;if(this.lib.updateStats(this.rendererPtr,overallFrameTime,this.renderStats.fps,this.renderStats.frameCallbackTime),this.gatherStats)this.collectStatSample(overallFrameTime);if(this._isRunning||this.immediateRerenderRequested){let targetFrameTime=this.immediateRerenderRequested?this.minTargetFrameTime:this.targetFrameTime,delay=Math.max(1,targetFrameTime-Math.floor(overallFrameTime));this.immediateRerenderRequested=!1,this.renderTimeout=this.clock.setTimeout(()=>{this.renderTimeout=null,this.loop()},delay)}else this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null}}finally{if(this.rendering=!1,this._destroyPending)this.finalizeDestroy();this.resolveIdleIfNeeded()}}intermediateRender(){this.immediateRerenderRequested=!0,this.loop()}renderNative(){if(this.renderingNative)throw console.error("Rendering called concurrently"),Error("Rendering called concurrently");if(this.renderingNative=!0,this.pendingSplitStartupCursorSeed&&this.splitStartupSeedTimeoutId!==null&&this._splitHeight>0&&this._externalOutputMode==="capture-stdout"){this.renderingNative=!1;return}if(this._splitHeight>0&&this._externalOutputMode==="capture-stdout"){let forceSplitRepaint=this.forceFullRepaintRequested;this.forceFullRepaintRequested=!1,this.flushPendingSplitCommits(forceSplitRepaint),this.pendingSplitFooterTransition=null}else{let force=this.forceFullRepaintRequested;this.forceFullRepaintRequested=!1,this.pendingSplitFooterTransition=null,this.lib.render(this.rendererPtr,force)}this.renderingNative=!1}collectStatSample(frameTime){if(this.frameTimes.push(frameTime),this.frameTimes.length>this.maxStatSamples)this.frameTimes.shift()}getStats(){let frameTimes=[...this.frameTimes],sum=frameTimes.reduce((acc,time)=>acc+time,0),avg=frameTimes.length?sum/frameTimes.length:0,min=frameTimes.length?Math.min(...frameTimes):0,max=frameTimes.length?Math.max(...frameTimes):0;return{fps:this.renderStats.fps,frameCount:this.renderStats.frameCount,frameTimes,averageFrameTime:avg,minFrameTime:min,maxFrameTime:max}}resetStats(){this.frameTimes=[],this.renderStats.frameCount=0}setGatherStats(enabled){if(this.gatherStats=enabled,!enabled)this.frameTimes=[]}getSelection(){return this.currentSelection}get hasSelection(){return!!this.currentSelection}getSelectionContainer(){return this.selectionContainers.length>0?this.selectionContainers[this.selectionContainers.length-1]:null}clearSelection(){if(this.currentSelection){for(let renderable of this.currentSelection.touchedRenderables)if(renderable.selectable&&!renderable.isDestroyed)renderable.onSelectionChanged(null);this.currentSelection=null}this.selectionContainers=[]}startSelection(renderable,x,y){if(!renderable.selectable)return;this.clearSelection(),this.selectionContainers.push(renderable.parent||this.root),this.currentSelection=new Selection(renderable,{x,y},{x,y}),this.currentSelection.isStart=!0,this.notifySelectablesOfSelectionChange()}updateSelection(currentRenderable,x,y,options){if(this.currentSelection){if(this.currentSelection.isStart=!1,this.currentSelection.focus={x,y},options?.finishDragging)this.currentSelection.isDragging=!1;if(this.selectionContainers.length>0){let currentContainer=this.selectionContainers[this.selectionContainers.length-1];if(!currentRenderable||!this.isWithinContainer(currentRenderable,currentContainer)){let parentContainer=currentContainer.parent||this.root;this.selectionContainers.push(parentContainer)}else if(currentRenderable&&this.selectionContainers.length>1){let containerIndex=this.selectionContainers.indexOf(currentRenderable);if(containerIndex===-1){let immediateParent=currentRenderable.parent||this.root;containerIndex=this.selectionContainers.indexOf(immediateParent)}if(containerIndex!==-1&&containerIndex<this.selectionContainers.length-1)this.selectionContainers=this.selectionContainers.slice(0,containerIndex+1)}}this.notifySelectablesOfSelectionChange()}}requestSelectionUpdate(){if(this.currentSelection?.isDragging){let pointer=this._latestPointer,maybeRenderableId=this.hitTest(pointer.x,pointer.y),maybeRenderable=Renderable.renderablesByNumber.get(maybeRenderableId);this.updateSelection(maybeRenderable,pointer.x,pointer.y)}}isWithinContainer(renderable,container){let current=renderable;while(current){if(current===container)return!0;current=current.parent}return!1}finishSelection(){if(this.currentSelection)this.currentSelection.isDragging=!1,this.emit("selection",this.currentSelection),this.notifySelectablesOfSelectionChange()}notifySelectablesOfSelectionChange(){let selectedRenderables=[],touchedRenderables=[],currentContainer=this.selectionContainers.length>0?this.selectionContainers[this.selectionContainers.length-1]:this.root;if(this.currentSelection){this.walkSelectableRenderables(currentContainer,this.currentSelection.bounds,selectedRenderables,touchedRenderables);for(let renderable of this.currentSelection.touchedRenderables)if(!touchedRenderables.includes(renderable)&&!renderable.isDestroyed)renderable.onSelectionChanged(null);this.currentSelection.updateSelectedRenderables(selectedRenderables),this.currentSelection.updateTouchedRenderables(touchedRenderables)}}walkSelectableRenderables(container,selectionBounds,selectedRenderables,touchedRenderables){let children=getObjectsInViewport(selectionBounds,container.getChildrenSortedByPrimaryAxis(),container.primaryAxis,0,0);for(let child of children){if(child.selectable){if(child.onSelectionChanged(this.currentSelection))selectedRenderables.push(child);touchedRenderables.push(child)}if(child.getChildrenCount()>0)this.walkSelectableRenderables(child,selectionBounds,selectedRenderables,touchedRenderables)}}get paletteDetectionStatus(){if(this._paletteDetectionPromise)return"detecting";if(this._paletteCache.size>0)return"cached";return"idle"}getCachedPaletteBySize(size){let exactMatch=this._paletteCache.get(size);if(exactMatch)return exactMatch;let largerSize=[...this._paletteCache.keys()].sort((a,b2)=>a-b2).find((candidate)=>candidate>=size);if(largerSize===void 0)return null;let source=this._paletteCache.get(largerSize);if(!source)return null;let projected={...source,palette:source.palette.slice(0,size)};return this._paletteCache.set(size,projected),projected}ensurePaletteDetector(){if(!this._paletteDetector){let isLegacyTmux=this.capabilities?.terminal?.name?.toLowerCase()?.includes("tmux")&&this.capabilities?.terminal?.version?.localeCompare("3.6")<0;this._paletteDetector=createTerminalPalette(this.stdin,this.stdout,this.writeOut.bind(this),isLegacyTmux,{subscribeOsc:this.subscribeOsc.bind(this)},this.clock)}return this._paletteDetector}syncNativePaletteState(colors8){let signature=buildTerminalPaletteSignature(colors8);if(this._publishedPaletteSignature!==signature)this._paletteEpoch=this._paletteEpoch+1>>>0;this._publishedPaletteSignature=signature;let normalized=normalizeTerminalPalette(colors8);this.lib.rendererSetPaletteState(this.rendererPtr,normalized.palette,normalized.defaultForeground,normalized.defaultBackground,this._paletteEpoch)}ensureNativePaletteState(){if(!this._terminalIsSetup||this._isDestroyed)return;let publishGeneration=this._palettePublishGeneration;this.getPalette({size:NATIVE_PALETTE_QUERY_SIZE}).then((colors8)=>{if(this._palettePublishGeneration===publishGeneration)this.syncNativePaletteState(colors8);this.requestRender()}).catch(()=>{})}clearPaletteCache(){this._paletteCache.clear(),this._cachedPalette=null}async getPalette(options){if(this._controlState==="explicit_suspended")throw Error("Cannot detect palette while renderer is suspended");let requestedSize=options?.size??16,detectionTimeout=options?.timeout,cachedPalette=this.getCachedPaletteBySize(requestedSize);if(cachedPalette)return this._cachedPalette=cachedPalette,cachedPalette;if(this._paletteDetectionPromise){if(this._paletteDetectionSize>=requestedSize)return this._paletteDetectionPromise.then((palette2)=>{let cached=this.getCachedPaletteBySize(requestedSize);if(cached)return this._cachedPalette=cached,cached;let projected={...palette2,palette:palette2.palette.slice(0,requestedSize)};return this._paletteCache.set(requestedSize,projected),this._cachedPalette=projected,projected});await this._paletteDetectionPromise;let afterWait=this.getCachedPaletteBySize(requestedSize);if(afterWait)return this._cachedPalette=afterWait,afterWait}let detector=this.ensurePaletteDetector(),publishGeneration=this._palettePublishGeneration;this._paletteDetectionSize=requestedSize,this._paletteDetectionPromise=detector.detect({...options,timeout:detectionTimeout}).then((result2)=>{if(this._paletteCache.set(result2.palette.length,result2),this._cachedPalette=result2,this._paletteDetectionPromise=null,this._paletteDetectionSize=0,this._palettePublishGeneration===publishGeneration){if(result2.palette.length>=NATIVE_PALETTE_QUERY_SIZE)this.syncNativePaletteState(result2);else if(this._terminalIsSetup&&!this._paletteCache.has(NATIVE_PALETTE_QUERY_SIZE))this.ensureNativePaletteState()}return result2}).catch((error2)=>{throw this._paletteDetectionPromise=null,this._paletteDetectionSize=0,error2});let detected=await this._paletteDetectionPromise,finalPalette=this.getCachedPaletteBySize(requestedSize)??detected;return this._cachedPalette=finalPalette,finalPalette}}});import{toArrayBuffer as toArrayBuffer5}from"bun:ffi";function toU82(value){return Math.round(Math.max(0,Math.min(1,Number.isFinite(value)?value:0))*255)}function channel(buffer2,index){return(buffer2[index]&255)/255}function setRgb(buffer2,base,r,g,b2){let a=buffer2[base+3]&255;buffer2[base]=toU82(r),buffer2[base+1]=toU82(g),buffer2[base+2]=toU82(b2),buffer2[base+3]=a}class DistortionEffect{glitchChancePerSecond=0.5;maxGlitchLines=3;minGlitchDuration=0.05;maxGlitchDuration=0.2;maxShiftAmount=10;shiftFlipRatio=0.6;colorGlitchChance=0.2;lastGlitchTime=0;glitchDuration=0;activeGlitches=[];constructor(options){if(options)Object.assign(this,options)}apply(buffer2,deltaTime){let{width,height:height2,buffers:buf}=buffer2;if(this.lastGlitchTime+=deltaTime,this.activeGlitches.length>0&&this.lastGlitchTime>=this.glitchDuration)this.activeGlitches=[],this.glitchDuration=0;if(this.activeGlitches.length===0&&Math.random()<this.glitchChancePerSecond*deltaTime){this.lastGlitchTime=0,this.glitchDuration=this.minGlitchDuration+Math.random()*(this.maxGlitchDuration-this.minGlitchDuration);let numGlitches=1+Math.floor(Math.random()*this.maxGlitchLines);for(let i2=0;i2<numGlitches;i2++){let y=Math.floor(Math.random()*height2),type2,amount=0,typeRoll=Math.random();if(typeRoll<this.colorGlitchChance)type2="color";else if((typeRoll-this.colorGlitchChance)/(1-this.colorGlitchChance)<this.shiftFlipRatio)type2="shift",amount=Math.floor((Math.random()-0.5)*2*this.maxShiftAmount);else type2="flip";if(!this.activeGlitches.some((g)=>g.y===y))this.activeGlitches.push({y,type:type2,amount})}}if(this.activeGlitches.length>0){let tempChar=null,tempFg=null,tempBg=null,tempAttr=null;for(let glitch of this.activeGlitches){let y=glitch.y;if(y<0||y>=height2)continue;let baseIndex=y*width;if(glitch.type==="shift"||glitch.type==="flip"){if(!tempChar)tempChar=new Uint32Array(width),tempFg=new Uint16Array(width*4),tempBg=new Uint16Array(width*4),tempAttr=new Uint8Array(width);try{tempChar.set(buf.char.subarray(baseIndex,baseIndex+width)),tempFg.set(buf.fg.subarray(baseIndex*4,(baseIndex+width)*4)),tempBg.set(buf.bg.subarray(baseIndex*4,(baseIndex+width)*4)),tempAttr.set(buf.attributes.subarray(baseIndex,baseIndex+width))}catch(e){console.error(`Error copying row ${y} for distortion:`,e);continue}if(glitch.type==="shift"){let shift=glitch.amount;for(let x=0;x<width;x++){let srcX=(x-shift+width)%width,destIndex=baseIndex+x,srcTempIndex=srcX;buf.char[destIndex]=tempChar[srcTempIndex],buf.attributes[destIndex]=tempAttr[srcTempIndex];let destColorIndex=destIndex*4,srcTempColorIndex=srcTempIndex*4;buf.fg.set(tempFg.subarray(srcTempColorIndex,srcTempColorIndex+4),destColorIndex),buf.bg.set(tempBg.subarray(srcTempColorIndex,srcTempColorIndex+4),destColorIndex)}}else for(let x=0;x<width;x++){let srcX=width-1-x,destIndex=baseIndex+x,srcTempIndex=srcX;buf.char[destIndex]=tempChar[srcTempIndex],buf.attributes[destIndex]=tempAttr[srcTempIndex];let destColorIndex=destIndex*4,srcTempColorIndex=srcTempIndex*4;buf.fg.set(tempFg.subarray(srcTempColorIndex,srcTempColorIndex+4),destColorIndex),buf.bg.set(tempBg.subarray(srcTempColorIndex,srcTempColorIndex+4),destColorIndex)}}else if(glitch.type==="color"){let glitchStart=Math.floor(Math.random()*width),maxPossibleLength=width-glitchStart,glitchLength=Math.floor(Math.random()*maxPossibleLength)+1;if(Math.random()<0.2)glitchLength=Math.floor(Math.random()*(width/4))+1;glitchLength=Math.min(glitchLength,maxPossibleLength);for(let x=glitchStart;x<glitchStart+glitchLength;x++){if(x>=width)break;let destColorIndex=(baseIndex+x)*4,rFg,gFg,bFg,rBg,gBg,bBg,colorMode=Math.random();if(colorMode<0.33)rFg=Math.random(),gFg=Math.random(),bFg=Math.random(),rBg=Math.random(),gBg=Math.random(),bBg=Math.random();else if(colorMode<0.66){let emphasis=Math.random();if(emphasis<0.25)rFg=Math.random(),gFg=0,bFg=0;else if(emphasis<0.5)rFg=0,gFg=Math.random(),bFg=0;else if(emphasis<0.75)rFg=0,gFg=0,bFg=Math.random();else{let glitchColorRoll=Math.random();if(glitchColorRoll<0.33)rFg=1,gFg=0,bFg=1;else if(glitchColorRoll<0.66)rFg=0,gFg=1,bFg=1;else rFg=1,gFg=1,bFg=0}if(Math.random()<0.5)rBg=1-rFg,gBg=1-gFg,bBg=1-bFg;else rBg=rFg*(Math.random()*0.5+0.2),gBg=gFg*(Math.random()*0.5+0.2),bBg=bFg*(Math.random()*0.5+0.2)}else rFg=Math.random()>0.5?1:0,gFg=Math.random()>0.5?1:0,bFg=Math.random()>0.5?1:0,rBg=1-rFg,gBg=1-gFg,bBg=1-bFg;setRgb(buf.fg,destColorIndex,rFg,gFg,bFg),setRgb(buf.bg,destColorIndex,rBg,gBg,bBg)}}}}}}class PerlinNoise{perm;grad3=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]];constructor(){this.perm=new Uint8Array(512);let p=new Uint8Array(256);for(let i2=0;i2<256;i2++)p[i2]=i2;for(let i2=255;i2>0;i2--){let r=Math.floor(Math.random()*(i2+1));[p[i2],p[r]]=[p[r],p[i2]]}for(let i2=0;i2<512;i2++)this.perm[i2]=p[i2&255]}dot(g,x,y,z){return g[0]*x+g[1]*y+g[2]*z}mix(a,b2,t2){return a+(b2-a)*t2}fade(t2){return t2*t2*t2*(t2*(t2*6-15)+10)}noise3d(x,y,z){let X=Math.floor(x)&255,Y=Math.floor(y)&255,Z=Math.floor(z)&255,xf=x-Math.floor(x),yf=y-Math.floor(y),zf=z-Math.floor(z),u=this.fade(xf),v=this.fade(yf),w=this.fade(zf),A=this.perm[X]+Y,AA=this.perm[A]+Z,AB=this.perm[A+1]+Z,B=this.perm[X+1]+Y,BA=this.perm[B]+Z,BB=this.perm[B+1]+Z;return this.mix(this.mix(this.mix(this.dot(this.grad3[this.perm[AA]%12],xf,yf,zf),this.dot(this.grad3[this.perm[BA]%12],xf-1,yf,zf),u),this.mix(this.dot(this.grad3[this.perm[AB]%12],xf,yf-1,zf),this.dot(this.grad3[this.perm[BB]%12],xf-1,yf-1,zf),u),v),this.mix(this.mix(this.dot(this.grad3[this.perm[AA+1]%12],xf,yf,zf-1),this.dot(this.grad3[this.perm[BA+1]%12],xf-1,yf,zf-1),u),this.mix(this.dot(this.grad3[this.perm[AB+1]%12],xf,yf-1,zf-1),this.dot(this.grad3[this.perm[BB+1]%12],xf-1,yf-1,zf-1),u),v),w)}}class CloudsEffect{noise;_scale;_speed;_density;_darkness;time=0;constructor(scale=0.02,speed=0.5,density=0.6,darkness=0.7){this.noise=new PerlinNoise,this._scale=scale,this._speed=speed,this._density=density,this._darkness=darkness}set scale(newScale){this._scale=Math.max(0.001,newScale)}get scale(){return this._scale}set speed(newSpeed){this._speed=Math.max(0,newSpeed)}get speed(){return this._speed}set density(newDensity){this._density=Math.max(0,Math.min(1,newDensity))}get density(){return this._density}set darkness(newDarkness){this._darkness=Math.max(0,Math.min(1,newDarkness))}get darkness(){return this._darkness}apply(buffer2,deltaTime){let{width,height:height2}=buffer2;this.time+=deltaTime*this._speed;let scale=this._scale,timeOffset=this.time,cellMask=new Float32Array(width*height2*3),maskIdx=0;for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let noiseValue=0,amplitude=1,frequency=1,maxValue=0;for(let i2=0;i2<4;i2++){let nx=(x*scale*frequency+timeOffset)*0.5,ny=y*scale*frequency*0.5,nz=timeOffset*0.3;noiseValue+=this.noise.noise3d(nx,ny,nz)*amplitude,maxValue+=amplitude,amplitude*=0.5,frequency*=2}noiseValue=(noiseValue/maxValue+1)*0.5;let attenuation=Math.max(0,noiseValue-(1-this._density))*this._darkness;cellMask[maskIdx++]=x,cellMask[maskIdx++]=y,cellMask[maskIdx++]=attenuation}let zeroMatrix=new Float32Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);buffer2.colorMatrix(zeroMatrix,cellMask,1,2)}}class FlamesEffect{noise;_scale;_speed;_intensity;time=0;constructor(scale=0.03,speed=0.02,intensity=0.8){this.noise=new PerlinNoise,this._scale=scale,this._speed=speed,this._intensity=intensity}set scale(newScale){this._scale=Math.max(0.001,newScale)}get scale(){return this._scale}set speed(newSpeed){this._speed=Math.max(0,newSpeed)}get speed(){return this._speed}set intensity(newIntensity){this._intensity=Math.max(0,Math.min(1,newIntensity))}get intensity(){return this._intensity}apply(buffer2,deltaTime){let{width,height:height2}=buffer2,bg2=buffer2.buffers.bg;this.time+=deltaTime*this._speed;let scale=this._scale,timeOffset=this.time;for(let y=0;y<height2;y++){let heightFactor=1-y/height2;for(let x=0;x<width;x++){let noiseValue=0,amplitude=1,frequency=1,maxValue=0;for(let i2=0;i2<3;i2++){let nx=(x*scale*frequency+timeOffset)*0.5,ny=(height2-y)*scale*frequency*2*0.5,nz=timeOffset*2;noiseValue+=this.noise.noise3d(nx,ny,nz)*amplitude,maxValue+=amplitude,amplitude*=0.5,frequency*=2}noiseValue=(noiseValue/maxValue+1)*0.5;let flameIntensity=noiseValue*heightFactor*this._intensity;if(flameIntensity>0){let colorIndex=(y*width+x)*4,r,g,b2;if(flameIntensity>0.7)r=1,g=1,b2=0.3+(flameIntensity-0.7)*2.3;else if(flameIntensity>0.4)r=1,g=0.5+(flameIntensity-0.4)*1.67,b2=0;else r=0.3+flameIntensity*1.75,g=flameIntensity*0.5,b2=0;setRgb(bg2,colorIndex,Math.max(channel(bg2,colorIndex),r*flameIntensity),Math.max(channel(bg2,colorIndex+1),g*flameIntensity),Math.max(channel(bg2,colorIndex+2),b2*flameIntensity))}}}}}class CRTRollingBarEffect{_speed;_height;_intensity;_fadeDistance;position=0;constructor(speed=0.5,height2=0.15,intensity=0.3,fadeDistance=0.3){this._speed=speed,this._height=Math.max(0.01,Math.min(0.5,height2)),this._intensity=Math.max(0,Math.min(1,intensity)),this._fadeDistance=Math.max(0,Math.min(1,fadeDistance))}set speed(newSpeed){this._speed=newSpeed}get speed(){return this._speed}set height(newHeight){this._height=Math.max(0.01,Math.min(0.5,newHeight))}get height(){return this._height}set intensity(newIntensity){this._intensity=Math.max(0,Math.min(1,newIntensity))}get intensity(){return this._intensity}set fadeDistance(newFadeDistance){this._fadeDistance=Math.max(0,Math.min(1,newFadeDistance))}get fadeDistance(){return this._fadeDistance}apply(buffer2,deltaTime){let{width,height:height2}=buffer2,fg2=buffer2.buffers.fg,bg2=buffer2.buffers.bg;this.position+=deltaTime/1000*this._speed;let cycleHeight=height2+this._height*height2*2;this.position=this.position%cycleHeight;let barPixelHeight=this._height*height2,fadePixelDistance=this._fadeDistance*barPixelHeight,totalEffectHeight=barPixelHeight+fadePixelDistance*2,effectCenter=this.position-totalEffectHeight/2+barPixelHeight/2;for(let y=0;y<height2;y++){let distFromCenter=Math.abs(y-effectCenter),barFactor=0;if(distFromCenter<=totalEffectHeight/2){let normalizedDist=distFromCenter/(totalEffectHeight/2);barFactor=Math.cos(normalizedDist*Math.PI/2)}if(barFactor>0.001){let rowMultiplier=1+this._intensity*barFactor;for(let x=0;x<width;x++){let colorIndex=(y*width+x)*4;setRgb(fg2,colorIndex,Math.min(1,channel(fg2,colorIndex)*rowMultiplier),Math.min(1,channel(fg2,colorIndex+1)*rowMultiplier),Math.min(1,channel(fg2,colorIndex+2)*rowMultiplier)),setRgb(bg2,colorIndex,Math.min(1,channel(bg2,colorIndex)*rowMultiplier),Math.min(1,channel(bg2,colorIndex+1)*rowMultiplier),Math.min(1,channel(bg2,colorIndex+2)*rowMultiplier))}}}}}class RainbowTextEffect{_speed;_saturation;_value;_repeats;time=0;constructor(speed=0.01,saturation=1,value=1,repeats=3){this._speed=speed,this._saturation=saturation,this._value=value,this._repeats=repeats}set speed(newSpeed){this._speed=Math.max(0,newSpeed)}get speed(){return this._speed}set saturation(newSaturation){this._saturation=Math.max(0,Math.min(1,newSaturation))}get saturation(){return this._saturation}set value(newValue){this._value=Math.max(0,Math.min(1,newValue))}get value(){return this._value}set repeats(newRepeats){this._repeats=Math.max(0.1,newRepeats)}get repeats(){return this._repeats}hsvToRgb(h2,s2,v){let r=0,g=0,b2=0,i2=Math.floor(h2*6),f=h2*6-i2,p=v*(1-s2),q=v*(1-f*s2),t2=v*(1-(1-f)*s2);switch(i2%6){case 0:r=v,g=t2,b2=p;break;case 1:r=q,g=v,b2=p;break;case 2:r=p,g=v,b2=t2;break;case 3:r=p,g=q,b2=v;break;case 4:r=t2,g=p,b2=v;break;case 5:r=v,g=p,b2=q;break}return[r,g,b2]}apply(buffer2,deltaTime){let{width,height:height2}=buffer2,fg2=buffer2.buffers.fg;this.time+=deltaTime*this._speed;let saturation=this._saturation,value=this._value,repeats=this._repeats,angleRad=25*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),whiteThreshold=0.9;for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let colorIndex=(y*width+x)*4,r=channel(fg2,colorIndex),g=channel(fg2,colorIndex+1),b2=channel(fg2,colorIndex+2);if(r>=whiteThreshold&&g>=whiteThreshold&&b2>=whiteThreshold){let projection=x*cosAngle+y*sinAngle,maxProjection=width*cosAngle+height2*sinAngle,hue=(projection/maxProjection*repeats+this.time*0.1)%1,[newR,newG,newB]=this.hsvToRgb(hue,saturation,value);setRgb(fg2,colorIndex,newR,newG,newB)}}}}function toU822(value){return Math.round(Math.max(0,Math.min(1,Number.isFinite(value)?value:0))*255)}function channel2(buffer2,index){return(buffer2[index]&255)/255}function setRgb2(buffer2,base,r,g,b2){let a=buffer2[base+3]&255;buffer2[base]=toU822(r),buffer2[base+1]=toU822(g),buffer2[base+2]=toU822(b2),buffer2[base+3]=a}function applyScanlines(buffer2,strength=0.8,step=2){if(strength===1||step<1)return;let{width,height:height2}=buffer2,affectedRows=Math.ceil(height2/step),cellCount=width*affectedRows,cellMask=new Float32Array(cellCount*3),maskIdx=0;for(let y=0;y<height2;y+=step)for(let x=0;x<width;x++)cellMask[maskIdx++]=x,cellMask[maskIdx++]=y,cellMask[maskIdx++]=1;let s2=strength,matrix=new Float32Array([s2,0,0,0,0,s2,0,0,0,0,s2,0,0,0,0,1]);buffer2.colorMatrix(matrix,cellMask,1,2)}function applyInvert(buffer2,strength=1){if(strength===0)return;let matrix=new Float32Array([-1,0,0,1,0,-1,0,1,0,0,-1,1,0,0,0,1]);buffer2.colorMatrixUniform(matrix,strength,3)}function applyNoise(buffer2,strength=0.1){let{width,height:height2}=buffer2,size=width*height2;if(strength===0)return;let cellMask=new Float32Array(size*3),cellMaskIndex=0;for(let y=0;y<height2;y++)for(let x=0;x<width;x++)cellMask[cellMaskIndex++]=x,cellMask[cellMaskIndex++]=y,cellMask[cellMaskIndex++]=(Math.random()-0.5)*2;let b2=1+strength,matrix=new Float32Array([b2,0,0,0,0,b2,0,0,0,0,b2,0,0,0,0,1]);buffer2.colorMatrix(matrix,cellMask,1,3)}function applyChromaticAberration(buffer2,strength=1){let{width,height:height2}=buffer2,srcFg=Uint16Array.from(buffer2.buffers.fg),destFg=buffer2.buffers.fg,centerX=width/2,centerY=height2/2;for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let dx=x-centerX,dy=y-centerY,offset=Math.round(Math.sqrt(dx*dx+dy*dy)/Math.max(centerX,centerY)*strength),rX=Math.max(0,Math.min(width-1,x-offset)),bX=Math.max(0,Math.min(width-1,x+offset)),rIndex=(y*width+rX)*4,gIndex=(y*width+x)*4,bIndex=(y*width+bX)*4,destIndex=(y*width+x)*4;setRgb2(destFg,destIndex,channel2(srcFg,rIndex),channel2(srcFg,gIndex+1),channel2(srcFg,bIndex+2))}}function applyAsciiArt(buffer2,ramp=' .\'`^"",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',fgColor={r:1,g:1,b:1},bgColor={r:0,g:0,b:0}){let{width,height:height2}=buffer2,chars=buffer2.buffers.char,bg2=buffer2.buffers.bg,rampLength=ramp.length;for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let index=y*width+x,colorIndex=index*4,bgR=channel2(bg2,colorIndex),bgG=channel2(bg2,colorIndex+1),bgB=channel2(bg2,colorIndex+2),lum=0.299*bgR+0.587*bgG+0.114*bgB,rampIndex=Math.min(rampLength-1,Math.floor(lum*rampLength));chars[index]=ramp[rampIndex].charCodeAt(0)}let fgMatrix=new Float32Array([0,0,0,fgColor.r,0,0,0,fgColor.g,0,0,0,fgColor.b,0,0,0,1]),bgMatrix=new Float32Array([0,0,0,bgColor.r,0,0,0,bgColor.g,0,0,0,bgColor.b,0,0,0,1]);buffer2.colorMatrixUniform(fgMatrix,1,1),buffer2.colorMatrixUniform(bgMatrix,1,2)}function applyBrightness(buffer2,brightness=0,cellMask){if(brightness===0)return;let b2=brightness,matrix=new Float32Array([1,0,0,b2,0,1,0,b2,0,0,1,b2,0,0,0,1]);if(!cellMask||cellMask.length===0)buffer2.colorMatrixUniform(matrix,1,3);else buffer2.colorMatrix(matrix,cellMask,1,3)}function applyGain(buffer2,gain=1,cellMask){if(gain===1)return;let g=Math.max(0,gain),matrix=new Float32Array([g,0,0,0,0,g,0,0,0,0,g,0,0,0,0,1]);if(!cellMask||cellMask.length===0)buffer2.colorMatrixUniform(matrix,1,3);else buffer2.colorMatrix(matrix,cellMask,1,3)}function createSaturationMatrix(saturation){let s2=Math.max(0,saturation),sr=0.299*(1-s2),sg=0.587*(1-s2),sb=0.114*(1-s2),m00=sr+s2,m01=sg,m02=sb,m10=sr,m11=sg+s2,m12=sb,m20=sr,m21=sg,m22=sb+s2;return new Float32Array([m00,m01,m02,0,m10,m11,m12,0,m20,m21,m22,0,0,0,0,1])}function applySaturation(buffer2,cellMask,strength=1){if(strength===1||strength===0)return;let matrix=createSaturationMatrix(strength);if(!cellMask||cellMask.length===0)buffer2.colorMatrixUniform(matrix,1,3);else buffer2.colorMatrix(matrix,cellMask,1,3)}class BloomEffect{_threshold;_strength;_radius;constructor(threshold=0.8,strength=0.2,radius=2){this._threshold=Math.max(0,Math.min(1,threshold)),this._strength=Math.max(0,strength),this._radius=Math.max(0,Math.round(radius))}set threshold(newThreshold){this._threshold=Math.max(0,Math.min(1,newThreshold))}get threshold(){return this._threshold}set strength(newStrength){this._strength=Math.max(0,newStrength)}get strength(){return this._strength}set radius(newRadius){this._radius=Math.max(0,Math.round(newRadius))}get radius(){return this._radius}apply(buffer2){let threshold=this._threshold,strength=this._strength,radius=this._radius;if(strength<=0||radius<=0)return;let{width,height:height2}=buffer2,srcFg=Uint16Array.from(buffer2.buffers.fg),srcBg=Uint16Array.from(buffer2.buffers.bg),destFg=buffer2.buffers.fg,destBg=buffer2.buffers.bg,brightPixels=[];for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let index=(y*width+x)*4,fgLum=0.299*channel2(srcFg,index)+0.587*channel2(srcFg,index+1)+0.114*channel2(srcFg,index+2),bgLum=0.299*channel2(srcBg,index)+0.587*channel2(srcBg,index+1)+0.114*channel2(srcBg,index+2),lum=Math.max(fgLum,bgLum);if(lum>threshold){let intensity=(lum-threshold)/(1-threshold+0.000001);brightPixels.push({x,y,intensity:Math.max(0,intensity)})}}if(brightPixels.length===0)return;destFg.set(srcFg),destBg.set(srcBg);for(let bright of brightPixels)for(let ky=-radius;ky<=radius;ky++)for(let kx=-radius;kx<=radius;kx++){if(kx===0&&ky===0)continue;let sampleX=bright.x+kx,sampleY=bright.y+ky;if(sampleX>=0&&sampleX<width&&sampleY>=0&&sampleY<height2){let distSq=kx*kx+ky*ky,radiusSq=radius*radius;if(distSq<=radiusSq){let falloff=1-distSq/radiusSq,bloomAmount=bright.intensity*strength*falloff,destIndex=(sampleY*width+sampleX)*4;setRgb2(destFg,destIndex,Math.min(1,channel2(destFg,destIndex)+bloomAmount),Math.min(1,channel2(destFg,destIndex+1)+bloomAmount),Math.min(1,channel2(destFg,destIndex+2)+bloomAmount)),setRgb2(destBg,destIndex,Math.min(1,channel2(destBg,destIndex)+bloomAmount),Math.min(1,channel2(destBg,destIndex+1)+bloomAmount),Math.min(1,channel2(destBg,destIndex+2)+bloomAmount))}}}}}function captureInitialValues(item){if(!item.properties)return;if(!item.initialValues||item.initialValues.length===0){let initialValues=[];for(let i2=0;i2<item.target.length;i2++){let target=item.target[i2],targetInitialValues={};for(let key of Object.keys(item.properties))if(typeof target[key]==="number")targetInitialValues[key]=target[key];initialValues.push(targetInitialValues)}item.initialValues=initialValues}}function applyAnimationAtProgress(item,progress,reversed,timelineTime,deltaTime=0){if(!item.properties||!item.initialValues)return;let easedProgress=(easingFunctions[item.ease||"linear"]||easingFunctions.linear)(Math.max(0,Math.min(1,progress))),finalProgress=reversed?1-easedProgress:easedProgress;for(let i2=0;i2<item.target.length;i2++){let target=item.target[i2],targetInitialValues=item.initialValues[i2];if(!targetInitialValues)continue;for(let[key,endValue]of Object.entries(item.properties)){let startValue=targetInitialValues[key],newValue=startValue+(endValue-startValue)*finalProgress;target[key]=newValue}}if(item.onUpdate){let animation={targets:item.target,progress:easedProgress,currentTime:timelineTime,deltaTime};item.onUpdate(animation)}}function evaluateAnimation(item,timelineTime,deltaTime=0){if(timelineTime<item.startTime)return;let animationTime=timelineTime-item.startTime,duration=item.duration||0;if(timelineTime>=item.startTime&&!item.started){if(captureInitialValues(item),item.onStart)item.onStart();item.started=!0}if(duration===0){if(!item.completed){if(applyAnimationAtProgress(item,1,!1,timelineTime,deltaTime),item.onComplete)item.onComplete();item.completed=!0}return}let maxLoops=!item.loop||item.loop===1?1:typeof item.loop==="number"?item.loop:1/0,loopDelay=item.loopDelay||0,cycleTime=duration+loopDelay,currentCycle=Math.floor(animationTime/cycleTime),timeInCycle=animationTime%cycleTime;if(item.onLoop&&item.currentLoop!==void 0&&currentCycle>item.currentLoop&&currentCycle<maxLoops)item.onLoop();if(item.currentLoop=currentCycle,item.onComplete&&!item.completed&&currentCycle===maxLoops-1&&timeInCycle>=duration){let finalLoopReversed=(item.alternate||!1)&&currentCycle%2===1;applyAnimationAtProgress(item,1,finalLoopReversed,timelineTime,deltaTime),item.onComplete(),item.completed=!0;return}if(currentCycle>=maxLoops){if(!item.completed){let finalReversed=(item.alternate||!1)&&(maxLoops-1)%2===1;if(applyAnimationAtProgress(item,1,finalReversed,timelineTime,deltaTime),item.onComplete)item.onComplete();item.completed=!0}return}if(timeInCycle===0&&animationTime>0&&currentCycle<maxLoops)currentCycle=currentCycle-1,timeInCycle=cycleTime;if(timeInCycle>=duration){let isReversed2=(item.alternate||!1)&&currentCycle%2===1;applyAnimationAtProgress(item,1,isReversed2,timelineTime,deltaTime);return}let progress=timeInCycle/duration,isReversed=(item.alternate||!1)&&currentCycle%2===1;applyAnimationAtProgress(item,progress,isReversed,timelineTime,deltaTime)}function evaluateCallback(item,timelineTime){if(!item.executed&&timelineTime>=item.startTime&&item.callback)item.callback(),item.executed=!0}function evaluateTimelineSync(item,timelineTime,deltaTime=0){if(!item.timeline)return;if(timelineTime<item.startTime)return;if(!item.timelineStarted){item.timelineStarted=!0,item.timeline.play();let overshoot=timelineTime-item.startTime;item.timeline.update(overshoot);return}item.timeline.update(deltaTime)}function evaluateItem(item,timelineTime,deltaTime=0){if(item.type==="animation")evaluateAnimation(item,timelineTime,deltaTime);else if(item.type==="callback")evaluateCallback(item,timelineTime)}class Timeline{items=[];subTimelines=[];currentTime=0;isPlaying=!1;isComplete=!1;duration;loop;synced=!1;autoplay;onComplete;onPause;stateChangeListeners=[];constructor(options={}){this.duration=options.duration||1000,this.loop=options.loop===!0,this.autoplay=options.autoplay!==!1,this.onComplete=options.onComplete,this.onPause=options.onPause}addStateChangeListener(listener){this.stateChangeListeners.push(listener)}removeStateChangeListener(listener){this.stateChangeListeners=this.stateChangeListeners.filter((l)=>l!==listener)}notifyStateChange(){for(let listener of this.stateChangeListeners)listener(this)}add(target,properties,startTime=0){let resolvedStartTime=typeof startTime==="string"?0:startTime,animationProperties={};for(let key in properties)if(!["duration","ease","onUpdate","onComplete","onStart","onLoop","loop","loopDelay","alternate"].includes(key)){if(typeof properties[key]==="number")animationProperties[key]=properties[key]}return this.items.push({type:"animation",startTime:resolvedStartTime,target:Array.isArray(target)?target:[target],properties:animationProperties,initialValues:[],duration:properties.duration!==void 0?properties.duration:1000,ease:properties.ease||"linear",loop:properties.loop,loopDelay:properties.loopDelay||0,alternate:properties.alternate||!1,onUpdate:properties.onUpdate,onComplete:properties.onComplete,onStart:properties.onStart,onLoop:properties.onLoop,completed:!1,started:!1,currentLoop:0,once:properties.once??!1}),this}once(target,properties){return this.add(target,{...properties,once:!0},this.currentTime),this}call(callback,startTime=0){let resolvedStartTime=typeof startTime==="string"?0:startTime;return this.items.push({type:"callback",startTime:resolvedStartTime,callback,executed:!1}),this}sync(timeline,startTime=0){if(timeline.synced)throw Error("Timeline already synced");return this.subTimelines.push({type:"timeline",startTime,timeline}),timeline.synced=!0,this}play(){if(this.isComplete)return this.restart();return this.subTimelines.forEach((subTimeline)=>{if(subTimeline.timelineStarted)subTimeline.timeline.play()}),this.isPlaying=!0,this.notifyStateChange(),this}pause(){if(this.subTimelines.forEach((subTimeline)=>{subTimeline.timeline.pause()}),this.isPlaying=!1,this.onPause)this.onPause();return this.notifyStateChange(),this}resetItems(){this.items.forEach((item)=>{if(item.type==="callback")item.executed=!1;else if(item.type==="animation")item.completed=!1,item.started=!1,item.currentLoop=0}),this.subTimelines.forEach((subTimeline)=>{if(subTimeline.timelineStarted=!1,subTimeline.timeline)subTimeline.timeline.restart(),subTimeline.timeline.pause()})}restart(){return this.isComplete=!1,this.currentTime=0,this.isPlaying=!0,this.resetItems(),this.notifyStateChange(),this}update(deltaTime){for(let subTimeline of this.subTimelines)evaluateTimelineSync(subTimeline,this.currentTime+deltaTime,deltaTime);if(!this.isPlaying)return;this.currentTime+=deltaTime;for(let item of this.items)evaluateItem(item,this.currentTime,deltaTime);for(let i2=this.items.length-1;i2>=0;i2--){let item=this.items[i2];if(item.type==="animation"&&item.once&&item.completed)this.items.splice(i2,1)}if(this.loop&&this.currentTime>=this.duration){let overshoot=this.currentTime%this.duration;if(this.resetItems(),this.currentTime=0,overshoot>0)this.update(overshoot)}else if(!this.loop&&this.currentTime>=this.duration){if(this.currentTime=this.duration,this.isPlaying=!1,this.isComplete=!0,this.onComplete)this.onComplete();this.notifyStateChange()}}}class TimelineEngine{timelines=new Set;renderer=null;frameCallback=null;isLive=!1;defaults={frameRate:60};attach(renderer){if(this.renderer)this.detach();this.renderer=renderer,this.frameCallback=async(deltaTime)=>{this.update(deltaTime)},renderer.setFrameCallback(this.frameCallback)}detach(){if(this.renderer&&this.frameCallback){if(this.renderer.removeFrameCallback(this.frameCallback),this.isLive)this.renderer.dropLive(),this.isLive=!1}this.renderer=null,this.frameCallback=null}updateLiveState(){if(!this.renderer)return;let hasRunningTimelines=Array.from(this.timelines).some((timeline)=>!timeline.synced&&timeline.isPlaying&&!timeline.isComplete);if(hasRunningTimelines&&!this.isLive)this.renderer.requestLive(),this.isLive=!0;else if(!hasRunningTimelines&&this.isLive)this.renderer.dropLive(),this.isLive=!1}onTimelineStateChange=(timeline)=>{this.updateLiveState()};register(timeline){if(!this.timelines.has(timeline))this.timelines.add(timeline),timeline.addStateChangeListener(this.onTimelineStateChange),this.updateLiveState()}unregister(timeline){if(this.timelines.has(timeline))this.timelines.delete(timeline),timeline.removeStateChangeListener(this.onTimelineStateChange),this.updateLiveState()}clear(){for(let timeline of this.timelines)timeline.removeStateChangeListener(this.onTimelineStateChange);this.timelines.clear(),this.updateLiveState()}update(deltaTime){for(let timeline of this.timelines)if(!timeline.synced)timeline.update(deltaTime)}}function createTimeline(options={}){let timeline=new Timeline(options);if(options.autoplay!==!1)timeline.play();return engine.register(timeline),timeline}function normalizeError(error2){if(error2 instanceof Error)return error2;if(typeof error2==="string")return Error(error2);return Error(`Unknown plugin error: ${String(error2)}`)}class SlotRegistry{plugins=[];sortedPluginsCache=null;listeners=new Set;errorListeners=new Set;pluginErrors=[];registrationOrder=0;batchDepth=0;batchedNotify=!1;rendererInstance;hostContext;options;constructor(renderer,context,options={}){this.rendererInstance=renderer,this.hostContext=context,this.options={debugPluginErrors:options.debugPluginErrors??DEFAULT_DEBUG_PLUGIN_ERRORS,maxPluginErrors:options.maxPluginErrors??DEFAULT_MAX_PLUGIN_ERRORS,onPluginError:options.onPluginError}}get renderer(){return this.rendererInstance}get context(){return this.hostContext}configure(options){if("debugPluginErrors"in options)this.options.debugPluginErrors=options.debugPluginErrors??DEFAULT_DEBUG_PLUGIN_ERRORS;if("maxPluginErrors"in options)this.options.maxPluginErrors=options.maxPluginErrors??DEFAULT_MAX_PLUGIN_ERRORS;if("onPluginError"in options)this.options.onPluginError=options.onPluginError}register(plugin){if(this.plugins.some((entry2)=>entry2.plugin.id===plugin.id))throw Error(`Plugin with id "${plugin.id}" is already registered`);try{plugin.setup?.(this.hostContext,this.rendererInstance)}catch(error2){return this.reportPluginError({pluginId:plugin.id,phase:"setup",source:"registry",error:error2}),noop3}return this.plugins.push({plugin,registrationOrder:this.registrationOrder++,cachedOrder:plugin.order??0,cachedId:plugin.id}),this.invalidateSortedPluginsCache(),this.notifyListeners(),()=>{this.unregister(plugin.id)}}unregister(id){let index=this.plugins.findIndex((entry22)=>entry22.plugin.id===id);if(index===-1)return!1;let[entry2]=this.plugins.splice(index,1);this.invalidateSortedPluginsCache();try{entry2?.plugin.dispose?.()}catch(error2){this.reportPluginError({pluginId:id,phase:"dispose",source:"registry",error:error2})}return this.notifyListeners(),!0}updateOrder(id,order){let entry2=this.plugins.find((pluginEntry)=>pluginEntry.plugin.id===id);if(!entry2)return!1;if((entry2.plugin.order??0)===order)return!0;return entry2.plugin.order=order,entry2.cachedOrder=order,this.invalidateSortedPluginsCache(),this.notifyListeners(),!0}clear(){if(this.plugins.length===0)return;let plugins=[...this.plugins];this.plugins=[],this.invalidateSortedPluginsCache();for(let entry2 of plugins)try{entry2.plugin.dispose?.()}catch(error2){this.reportPluginError({pluginId:entry2.plugin.id,phase:"dispose",source:"registry",error:error2})}this.notifyListeners()}subscribe(listener){return this.listeners.add(listener),()=>{this.listeners.delete(listener)}}onPluginError(listener){return this.errorListeners.add(listener),()=>{this.errorListeners.delete(listener)}}batch(run){this.batchDepth+=1;try{return run()}finally{if(this.batchDepth-=1,this.batchDepth===0&&this.batchedNotify)this.batchedNotify=!1,this.flushListeners()}}getPluginErrors(){return this.pluginErrors}clearPluginErrors(){this.pluginErrors=[]}reportPluginError(report){let event={pluginId:report.pluginId,slot:report.slot,phase:report.phase,source:report.source??"registry",error:normalizeError(report.error),timestamp:Date.now()};if(this.pluginErrors.push(event),this.pluginErrors.length>this.options.maxPluginErrors)this.pluginErrors.splice(0,this.pluginErrors.length-this.options.maxPluginErrors);if(this.options.debugPluginErrors){let slotLabel=event.slot?` slot="${event.slot}"`:"";console.debug(`[SlotRegistry][PluginError] plugin="${event.pluginId}" phase="${event.phase}" source="${event.source}"${slotLabel}`),console.debug(event.error)}for(let listener of this.errorListeners)try{listener(event)}catch(error2){console.error("Error in plugin error listener:",error2)}try{this.options.onPluginError?.(event)}catch(error2){console.error("Error in plugin error callback:",error2)}return event}resolve(slot){return this.resolveEntries(slot).map((entry2)=>entry2.renderer)}resolveEntries(slot){let slotRenderers=[];for(let entry2 of this.getSortedPlugins()){let renderer=entry2.plugin.slots[slot];if(renderer)slotRenderers.push({id:entry2.plugin.id,renderer})}return slotRenderers}getSortedPlugins(){if(this.syncPluginSortMetadata(),this.sortedPluginsCache)return this.sortedPluginsCache;return this.sortedPluginsCache=[...this.plugins].sort((left,right)=>{let leftOrder=left.cachedOrder,rightOrder=right.cachedOrder;if(leftOrder!==rightOrder)return leftOrder-rightOrder;if(left.registrationOrder!==right.registrationOrder)return left.registrationOrder-right.registrationOrder;return left.cachedId.localeCompare(right.cachedId)}),this.sortedPluginsCache}syncPluginSortMetadata(){let hasChanges=!1;for(let entry2 of this.plugins){let nextOrder=entry2.plugin.order??0,nextId=entry2.plugin.id;if(entry2.cachedOrder!==nextOrder||entry2.cachedId!==nextId)entry2.cachedOrder=nextOrder,entry2.cachedId=nextId,hasChanges=!0}if(hasChanges)this.invalidateSortedPluginsCache()}invalidateSortedPluginsCache(){this.sortedPluginsCache=null}notifyListeners(){if(this.batchDepth>0){this.batchedNotify=!0;return}this.flushListeners()}flushListeners(){for(let listener of this.listeners)try{listener()}catch(error2){console.error("Error in slot registry listener:",error2)}}}function getSlotRegistryStore(renderer){let existingStore=slotRegistriesByRenderer.get(renderer);if(existingStore)return existingStore;let createdStore=new Map;return slotRegistriesByRenderer.set(renderer,createdStore),renderer.once("destroy",()=>{for(let registry3 of createdStore.values())try{registry3.clear()}catch(error2){console.error("Error disposing slot registry:",error2)}createdStore.clear(),slotRegistriesByRenderer.delete(renderer)}),createdStore}function createSlotRegistry(renderer,key,context,options={}){let store=getSlotRegistryStore(renderer),existing=store.get(key);if(existing){if(existing.context!==context)throw Error(`createSlotRegistry called with a different context for renderer key "${key}". Reuse the original context object.`);let typedExisting=existing;return typedExisting.configure(options),typedExisting}let created=new SlotRegistry(renderer,context,options);return store.set(key,created),created}function isCoreManagedSlot(contribution){return typeof contribution==="object"&&contribution!==null&&"render"in contribution}function toCorePlugin(plugin){let slots={};for(let[slotName,contribution]of Object.entries(plugin.slots)){let wrappedRenderer=(ctx,data)=>{if(isCoreManagedSlot(contribution))return contribution.render(ctx,data);return contribution(ctx,data)};if(isCoreManagedSlot(contribution))wrappedRenderer.__coreSlotOwnership="plugin",wrappedRenderer.__coreManagedSlot=contribution;else wrappedRenderer.__coreSlotOwnership="host";slots[slotName]=wrappedRenderer}return{id:plugin.id,order:plugin.order,setup:plugin.setup,dispose:plugin.dispose,slots}}function asArray(value){if(!value)return[];return Array.isArray(value)?[...value]:[value]}function ensureValidNode(node,pluginId,mount){if(!node)throw Error(`Plugin "${pluginId}" did not return a renderable node`);if(typeof node.then==="function")throw Error(`Plugin "${pluginId}" returned an async value. Core slots require synchronous renderers.`);if(!(node instanceof BaseRenderable))throw Error(`Plugin "${pluginId}" must return a BaseRenderable`);if(node===mount)throw Error(`Plugin "${pluginId}" returned the slot mount container as its node`);if(node.parent&&node.parent!==mount)throw Error(`Plugin "${pluginId}" returned a renderable already attached to another parent`)}function createCoreSlotRegistry(renderer,context,options={}){return createSlotRegistry(renderer,"core:slot-registry",context,options)}function registerCorePlugin(registry3,plugin){return registry3.register(toCorePlugin(plugin))}function resolveCoreSlot(registry3,slot){return resolveCoreSlotEntries(registry3,slot).map((entry2)=>{return{id:entry2.id,renderer:entry2.renderer}})}function resolveCoreSlotEntries(registry3,slot){return registry3.resolveEntries(slot).map((entry2)=>{let wrappedRenderer=entry2.renderer;return{id:entry2.id,renderer:(ctx,data)=>wrappedRenderer(ctx,data),ownership:wrappedRenderer.__coreSlotOwnership??"host",managedSlot:wrappedRenderer.__coreManagedSlot}})}function toPointer2(value){if(typeof value==="bigint"){if(value>BigInt(Number.MAX_SAFE_INTEGER))throw Error("Pointer exceeds safe integer range");return Number(value)}return value}function toNumber2(value){return typeof value==="bigint"?Number(value):value}class NativeSpanFeed{static create(options){let lib=resolveRenderLib(),streamPtr=lib.createNativeSpanFeed(options),stream=new NativeSpanFeed(streamPtr);lib.registerNativeSpanFeedStream(streamPtr,stream.eventHandler);let status=lib.attachNativeSpanFeed(streamPtr);if(status!==0)throw lib.unregisterNativeSpanFeedStream(streamPtr),lib.destroyNativeSpanFeed(streamPtr),Error(`Failed to attach stream: ${status}`);return stream}static attach(streamPtr,_options){let lib=resolveRenderLib(),ptr5=toPointer2(streamPtr),stream=new NativeSpanFeed(ptr5);lib.registerNativeSpanFeedStream(ptr5,stream.eventHandler);let status=lib.attachNativeSpanFeed(ptr5);if(status!==0)throw lib.unregisterNativeSpanFeedStream(ptr5),Error(`Failed to attach stream: ${status}`);return stream}streamPtr;lib=resolveRenderLib();eventHandler;chunkMap=new Map;chunkSizes=new Map;dataHandlers=new Set;errorHandlers=new Set;drainBuffer=null;stateBuffer=null;closed=!1;destroyed=!1;draining=!1;pendingDataAvailable=!1;pendingClose=!1;closing=!1;pendingAsyncHandlers=0;inCallback=!1;closeQueued=!1;constructor(streamPtr){this.streamPtr=streamPtr,this.eventHandler=(eventId,arg0,arg1)=>{this.handleEvent(eventId,arg0,arg1)},this.ensureDrainBuffer()}ensureDrainBuffer(){if(this.drainBuffer)return;let capacity=256;this.drainBuffer=new Uint8Array(capacity*SpanInfoStruct.size)}onData(handler){if(this.dataHandlers.add(handler),this.pendingDataAvailable)this.pendingDataAvailable=!1,this.drainAll();return()=>this.dataHandlers.delete(handler)}onError(handler){return this.errorHandlers.add(handler),()=>this.errorHandlers.delete(handler)}close(){if(this.destroyed)return;if(this.inCallback||this.draining||this.pendingAsyncHandlers>0){if(this.pendingClose=!0,!this.closeQueued)this.closeQueued=!0,queueMicrotask(()=>{this.closeQueued=!1,this.processPendingClose()});return}this.performClose()}processPendingClose(){if(!this.pendingClose||this.destroyed)return;if(this.inCallback||this.draining||this.pendingAsyncHandlers>0)return;this.pendingClose=!1,this.performClose()}performClose(){if(this.closing)return;if(this.closing=!0,!this.closed){if(this.lib.streamClose(this.streamPtr)!==0){this.closing=!1;return}this.closed=!0}this.finalizeDestroy()}finalizeDestroy(){if(this.destroyed)return;this.lib.unregisterNativeSpanFeedStream(this.streamPtr),this.lib.destroyNativeSpanFeed(this.streamPtr),this.destroyed=!0,this.chunkMap.clear(),this.chunkSizes.clear(),this.stateBuffer=null,this.drainBuffer=null,this.dataHandlers.clear(),this.errorHandlers.clear(),this.pendingDataAvailable=!1}handleEvent(eventId,arg0,arg1){this.inCallback=!0;try{switch(eventId){case 8:{let len=toNumber2(arg1);if(len>0&&arg0){let buffer2=toArrayBuffer5(arg0,0,len);this.stateBuffer=new Uint8Array(buffer2)}break}case 7:{if(this.closing)break;if(this.dataHandlers.size===0){this.pendingDataAvailable=!0;break}this.drainAll();break}case 2:{let chunkLen=toNumber2(arg1);if(chunkLen>0&&arg0){if(!this.chunkMap.has(arg0)){let buffer2=toArrayBuffer5(arg0,0,chunkLen);this.chunkMap.set(arg0,buffer2)}this.chunkSizes.set(arg0,chunkLen)}break}case 6:{let code=arg0;for(let handler of this.errorHandlers)handler(code);break}case 5:{this.closed=!0;break}default:break}}finally{this.inCallback=!1}}decrementRefcount(chunkIndex){if(this.stateBuffer&&chunkIndex<this.stateBuffer.length){let prev=this.stateBuffer[chunkIndex];this.stateBuffer[chunkIndex]=prev>0?prev-1:0}}drainOnce(){if(!this.drainBuffer||this.draining||this.pendingClose)return 0;let capacity=Math.floor(this.drainBuffer.byteLength/SpanInfoStruct.size);if(capacity===0)return 0;let count=this.lib.streamDrainSpans(this.streamPtr,this.drainBuffer,capacity);if(count===0)return 0;this.draining=!0;let spans=SpanInfoStruct.unpackList(this.drainBuffer.buffer,count),firstError=null;try{for(let span of spans){if(span.len===0)continue;let buffer2=this.chunkMap.get(span.chunkPtr);if(!buffer2){let size=this.chunkSizes.get(span.chunkPtr);if(!size)continue;buffer2=toArrayBuffer5(span.chunkPtr,0,size),this.chunkMap.set(span.chunkPtr,buffer2)}if(span.offset+span.len>buffer2.byteLength)continue;let slice=new Uint8Array(buffer2,span.offset,span.len),asyncResults=null;for(let handler of this.dataHandlers)try{let result2=handler(slice);if(result2&&typeof result2.then==="function")asyncResults??=[],asyncResults.push(result2)}catch(e){firstError??=e}let shouldStopAfterThisSpan=this.pendingClose;if(asyncResults){let chunkIndex=span.chunkIndex;this.pendingAsyncHandlers+=1,Promise.allSettled(asyncResults).then(()=>{this.decrementRefcount(chunkIndex),this.pendingAsyncHandlers-=1,this.processPendingClose()})}else this.decrementRefcount(span.chunkIndex);if(shouldStopAfterThisSpan)break}}finally{this.draining=!1}if(firstError)throw firstError;return count}drainAll(){let count=this.drainOnce();while(count>0)count=this.drainOnce()}}function Generic(props,...children){return h(VRenderable,props||{},...children)}function Box(props,...children){return h(BoxRenderable,props||{},...children)}function Text(props,...children){return h(TextRenderable,props||{},...children)}function ASCIIFont(props,...children){return h(ASCIIFontRenderable,props||{},...children)}function Input(props,...children){return h(InputRenderable,props||{},...children)}function Select(props,...children){return h(SelectRenderable,props||{},...children)}function TabSelect(props,...children){return h(TabSelectRenderable,props||{},...children)}function FrameBuffer(props,...children){return h(FrameBufferRenderable,props,...children)}function Code(props,...children){return h(CodeRenderable,props,...children)}function ScrollBox(props,...children){return h(ScrollBoxRenderable,props||{},...children)}function StyledText2(props,...children){let styledProps=props,textNodeOptions={...styledProps,attributes:styledProps?.attributes??0},textNode=new TextNodeRenderable(textNodeOptions);for(let child of children)textNode.add(child);return textNode}function darkenColor(color2){return RGBA.fromValues(color2.r*0.8,color2.g*0.8,color2.b*0.8,color2.a)}function parsePatch(uniDiff){let diffstr=uniDiff.split(/\n/),list2=[],i2=0;function parseIndex(){let index={};list2.push(index);while(i2<diffstr.length){let line=diffstr[i2];if(/^(---|\+\+\+|@@)\s/.test(line))break;let header=/^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line);if(header)index.index=header[1];i2++}parseFileHeader(index),parseFileHeader(index),index.hunks=[];while(i2<diffstr.length){let line=diffstr[i2];if(/^(Index:\s|diff\s|---\s|\+\+\+\s|===================================================================)/.test(line))break;else if(/^@@/.test(line))index.hunks.push(parseHunk());else if(line)throw Error("Unknown line "+(i2+1)+" "+JSON.stringify(line));else i2++}}function parseFileHeader(index){let fileHeader=/^(---|\+\+\+)\s+(.*)\r?$/.exec(diffstr[i2]);if(fileHeader){let data=fileHeader[2].split("\t",2),header=(data[1]||"").trim(),fileName=data[0].replace(/\\\\/g,"\\");if(/^".*"$/.test(fileName))fileName=fileName.substr(1,fileName.length-2);if(fileHeader[1]==="---")index.oldFileName=fileName,index.oldHeader=header;else index.newFileName=fileName,index.newHeader=header;i2++}}function parseHunk(){var _a;let chunkHeaderIndex=i2,chunkHeaderLine=diffstr[i2++],chunkHeader=chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/),hunk={oldStart:+chunkHeader[1],oldLines:typeof chunkHeader[2]>"u"?1:+chunkHeader[2],newStart:+chunkHeader[3],newLines:typeof chunkHeader[4]>"u"?1:+chunkHeader[4],lines:[]};if(hunk.oldLines===0)hunk.oldStart+=1;if(hunk.newLines===0)hunk.newStart+=1;let addCount=0,removeCount=0;for(;i2<diffstr.length&&(removeCount<hunk.oldLines||addCount<hunk.newLines||((_a=diffstr[i2])===null||_a===void 0?void 0:_a.startsWith("\\")));i2++){let operation=diffstr[i2].length==0&&i2!=diffstr.length-1?" ":diffstr[i2][0];if(operation==="+"||operation==="-"||operation===" "||operation==="\\"){if(hunk.lines.push(diffstr[i2]),operation==="+")addCount++;else if(operation==="-")removeCount++;else if(operation===" ")addCount++,removeCount++}else throw Error(`Hunk at line ${chunkHeaderIndex+1} contained invalid line ${diffstr[i2]}`)}if(!addCount&&hunk.newLines===1)hunk.newLines=0;if(!removeCount&&hunk.oldLines===1)hunk.oldLines=0;if(addCount!==hunk.newLines)throw Error("Added line count did not match for hunk at line "+(chunkHeaderIndex+1));if(removeCount!==hunk.oldLines)throw Error("Removed line count did not match for hunk at line "+(chunkHeaderIndex+1));return hunk}while(i2<diffstr.length)parseIndex();return list2}function L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function Z(u){T=u}function k(u,e=""){let t2=typeof u=="string"?u:u.source,n={replace:(r,i2)=>{let s2=typeof i2=="string"?i2:i2.source;return s2=s2.replace(m.caret,"$1"),t2=t2.replace(r,s2),n},getRegex:()=>new RegExp(t2,e)};return n}function w(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function X(u){try{u=encodeURI(u).replace(m.percentDecode,"%")}catch{return null}return u}function J(u,e){let t2=u.replace(m.findPipe,(i2,s2,a)=>{let o=!1,l=s2;for(;--l>=0&&a[l]==="\\";)o=!o;return o?"|":" |"}),n=t2.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push("");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,"|");return n}function z(u,e,t2){let n=u.length;if(n===0)return"";let r=0;for(;r<n;){let i2=u.charAt(n-r-1);if(i2===e&&!t2)r++;else if(i2!==e&&t2)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t2=0;for(let n=0;n<u.length;n++)if(u[n]==="\\")n++;else if(u[n]===e[0])t2++;else if(u[n]===e[1]&&(t2--,t2<0))return n;return t2>0?-2:-1}function ge(u,e,t2,n,r){let i2=e.href,s2=e.title||null,a=u[1].replace(r.other.outputLinkReplace,"$1");n.state.inLink=!0;let o={type:u[0].charAt(0)==="!"?"image":"link",raw:t2,href:i2,title:s2,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function Je(u,e,t2){let n=u.match(t2.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`
3116
+ `.repeat(space);if(backgroundColor[3]===0)clear=newlines;else clear=ANSI3.setRgbBackground(backgroundColor[0],backgroundColor[1],backgroundColor[2])+newlines+ANSI3.resetBackground}return this.writeOut(flush+move+output+clear),!0}enableMouse(){this._useMouse=!0,this.lib.enableMouse(this.rendererPtr,this.enableMouseMovement)}disableMouse(){this._useMouse=!1,this.setCapturedRenderable(void 0),this.stdinParser?.resetMouseState(),this.lib.disableMouse(this.rendererPtr)}enableKittyKeyboard(flags=3){this.lib.enableKittyKeyboard(this.rendererPtr,flags),this.updateStdinParserProtocolContext({kittyKeyboardEnabled:!0})}disableKittyKeyboard(){this.lib.disableKittyKeyboard(this.rendererPtr),this.updateStdinParserProtocolContext({kittyKeyboardEnabled:!1},!0)}set useThread(useThread){this._useThread=useThread,this.lib.setUseThread(this.rendererPtr,useThread)}async setupTerminal(){if(this._terminalIsSetup)return;this._terminalIsSetup=!0;let startupCursorCprActive=this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout";if(this.updateStdinParserProtocolContext({privateCapabilityRepliesActive:!0,explicitWidthCprActive:!0,startupCursorCprActive}),this.lib.setupTerminal(this.rendererPtr,this._screenMode==="alternate-screen"),this._capabilities=this.lib.getTerminalCapabilities(this.rendererPtr),this.debugOverlay.enabled){if(this.lib.setDebugOverlay(this.rendererPtr,!0,this.debugOverlay.corner),!this.memorySnapshotInterval)this.memorySnapshotInterval=3000,this.startMemorySnapshotTimer(),this.automaticMemorySnapshot=!0}if(this.capabilityTimeoutId=this.clock.setTimeout(()=>{if(this.capabilityTimeoutId=null,this.pendingSplitStartupCursorSeed=!1,this.splitStartupSeedTimeoutId!==null)this.clock.clearTimeout(this.splitStartupSeedTimeoutId),this.splitStartupSeedTimeoutId=null;if(this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout")this.requestRender();this.removeInputHandler(this.capabilityHandler),this.updateStdinParserProtocolContext({privateCapabilityRepliesActive:!1,explicitWidthCprActive:!1,startupCursorCprActive:!1},!0)},5000),this._useMouse)this.enableMouse();if(this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout"){if(this.pendingSplitStartupCursorSeed=!0,this.splitStartupSeedTimeoutId!==null)this.clock.clearTimeout(this.splitStartupSeedTimeoutId);this.splitStartupSeedTimeoutId=this.clock.setTimeout(()=>{if(this.splitStartupSeedTimeoutId=null,!this.pendingSplitStartupCursorSeed)return;if(this.updateStdinParserProtocolContext({startupCursorCprActive:!1}),this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout")this.requestRender()},120)}this.queryPixelResolution(),this.ensureNativePaletteState()}stdinListener=((chunk)=>{let data=Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk);if(!this.stdinParser)return;try{this.stdinParser.push(data),this.drainStdinParser()}catch(error2){this.handleStdinParserFailure(error2)}}).bind(this);addInputHandler(handler){this.sequenceHandlers.push(handler)}prependInputHandler(handler){this.sequenceHandlers.unshift(handler)}removeInputHandler(handler){this.sequenceHandlers=this.sequenceHandlers.filter((candidate)=>candidate!==handler)}updateStdinParserProtocolContext(patch,drain=!1){if(!this.stdinParser)return;if(this.stdinParser.updateProtocolContext(patch),drain)this.drainStdinParser()}subscribeOsc(handler){return this.oscSubscribers.add(handler),()=>{this.oscSubscribers.delete(handler)}}processCapabilitySequence(sequence,hasCursorReport){let hasStandardCapabilitySignature=isCapabilityResponse(sequence);if(!(hasStandardCapabilitySignature||hasCursorReport&&this.capabilityTimeoutId!==null))return!1;if(this.lib.processCapabilityResponse(this.rendererPtr,sequence),this._capabilities=this.lib.getTerminalCapabilities(this.rendererPtr),hasStandardCapabilitySignature)this.forceFullRepaintRequested=!0,this.requestRender();this.emit("capabilities",this._capabilities);let hadPendingSplitStartupCursorSeed=this.pendingSplitStartupCursorSeed;if(hadPendingSplitStartupCursorSeed&&hasCursorReport&&this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout"){if(this.resetSplitScrollback(this.getSplitCursorSeedRows()),this.clearPendingSplitFooterTransition(),this.pendingSplitStartupCursorSeed=!1,this.updateStdinParserProtocolContext({startupCursorCprActive:!1}),this.splitStartupSeedTimeoutId!==null)this.clock.clearTimeout(this.splitStartupSeedTimeoutId),this.splitStartupSeedTimeoutId=null;this.requestRender()}let consumeStartupCursorReport=hadPendingSplitStartupCursorSeed&&hasCursorReport&&this.splitStartupSeedTimeoutId!==null;return hasStandardCapabilitySignature||consumeStartupCursorReport}capabilityHandler=((sequence)=>{return this.processCapabilitySequence(sequence,!1)}).bind(this);focusHandler=((sequence)=>{if(sequence==="\x1B[I"){if(this.shouldRestoreModesOnNextFocus)this.lib.restoreTerminalModes(this.rendererPtr),this.shouldRestoreModesOnNextFocus=!1;if(this._terminalFocusState!==!0)this._terminalFocusState=!0,this.emit("focus");return!0}if(sequence==="\x1B[O"){if(this.shouldRestoreModesOnNextFocus=!0,this._terminalFocusState!==!1)this._terminalFocusState=!1,this.emit("blur");return!0}return!1}).bind(this);dispatchSequenceHandlers(sequence){if(this._debugModeEnabled)this._debugInputs.push({timestamp:new Date().toISOString(),sequence});for(let handler of this.sequenceHandlers)if(handler(sequence))return!0;return!1}drainStdinParser(){if(!this.stdinParser)return;this.stdinParser.drain((event)=>{this.handleStdinEvent(event)})}handleStdinEvent(event){switch(event.type){case"key":if(this.dispatchSequenceHandlers(event.raw))return;this._keyHandler.processParsedKey(event.key);return;case"mouse":if(this._useMouse&&this.processSingleMouseEvent(event.event))return;this.dispatchSequenceHandlers(event.raw);return;case"paste":this._keyHandler.processPaste(event.bytes,event.metadata);return;case"response":if(event.protocol==="osc")for(let subscriber of this.oscSubscribers)subscriber(event.sequence);if(event.protocol==="cpr"&&this.processCapabilitySequence(event.sequence,!0))return;this.dispatchSequenceHandlers(event.sequence);return}}handleStdinParserFailure(error2){if(!this.hasLoggedStdinParserError)this.hasLoggedStdinParserError=!0,console.error("[stdin-parser-error] parser failure, resetting parser",error2);try{this.stdinParser?.reset()}catch(resetError){console.error("stdin parser reset failed after parser error",resetError)}}setupInput(){for(let handler of this.prependedInputHandlers)this.addInputHandler(handler);if(this.addInputHandler((sequence)=>{if(isPixelResolutionResponse(sequence)&&this.waitingForPixelResolution){let resolution=parsePixelResolution(sequence);if(resolution)this._resolution=resolution;return this.waitingForPixelResolution=!1,this.updateStdinParserProtocolContext({pixelResolutionQueryActive:!1},!0),!0}return!1}),this.addInputHandler(this.capabilityHandler),this.addInputHandler(this.focusHandler),this.addInputHandler(this.themeModeHandler),this.stdin.setRawMode)this.stdin.setRawMode(!0);this.stdin.on("data",this.stdinListener),this.stdin.resume()}dispatchMouseEvent(target,attributes){let event=new MouseEvent(target,attributes);if(target.processMouseEvent(event),this.autoFocus&&event.type==="down"&&event.button===0&&!event.defaultPrevented){let current=target;while(current){if(current.focusable){current.focus();break}current=current.parent}}return event}processSingleMouseEvent(mouseEvent){if(this._splitHeight>0){if(mouseEvent.y<this.renderOffset)return!1;mouseEvent.y-=this.renderOffset}if(this._latestPointer.x=mouseEvent.x,this._latestPointer.y=mouseEvent.y,this._hasPointer=!0,this._lastPointerModifiers=mouseEvent.modifiers,this._console.visible){let consoleBounds=this._console.bounds;if(mouseEvent.x>=consoleBounds.x&&mouseEvent.x<consoleBounds.x+consoleBounds.width&&mouseEvent.y>=consoleBounds.y&&mouseEvent.y<consoleBounds.y+consoleBounds.height){let event2=new MouseEvent(null,mouseEvent);if(this._console.handleMouse(event2))return!0}}if(mouseEvent.type==="scroll"){let maybeRenderableId2=this.hitTest(mouseEvent.x,mouseEvent.y),maybeRenderable2=Renderable.renderablesByNumber.get(maybeRenderableId2),fallbackTarget=this._currentFocusedRenderable&&!this._currentFocusedRenderable.isDestroyed&&this._currentFocusedRenderable.focused?this._currentFocusedRenderable:null,scrollTarget=maybeRenderable2??fallbackTarget;if(scrollTarget){let event2=new MouseEvent(scrollTarget,mouseEvent);scrollTarget.processMouseEvent(event2)}return!0}let maybeRenderableId=this.hitTest(mouseEvent.x,mouseEvent.y),sameElement=maybeRenderableId===this.lastOverRenderableNum;this.lastOverRenderableNum=maybeRenderableId;let maybeRenderable=Renderable.renderablesByNumber.get(maybeRenderableId);if(mouseEvent.type==="down"&&mouseEvent.button===0&&!this.currentSelection?.isDragging&&!mouseEvent.modifiers.ctrl){if(Boolean(maybeRenderable&&maybeRenderable.selectable&&!maybeRenderable.isDestroyed&&maybeRenderable.shouldStartSelection(mouseEvent.x,mouseEvent.y))&&maybeRenderable)return this.startSelection(maybeRenderable,mouseEvent.x,mouseEvent.y),this.dispatchMouseEvent(maybeRenderable,mouseEvent),!0}if(mouseEvent.type==="drag"&&this.currentSelection?.isDragging){if(this.updateSelection(maybeRenderable,mouseEvent.x,mouseEvent.y),maybeRenderable){let event2=new MouseEvent(maybeRenderable,{...mouseEvent,isDragging:!0});maybeRenderable.processMouseEvent(event2)}return!0}if(mouseEvent.type==="up"&&this.currentSelection?.isDragging){if(maybeRenderable){let event2=new MouseEvent(maybeRenderable,{...mouseEvent,isDragging:!0});maybeRenderable.processMouseEvent(event2)}return this.finishSelection(),!0}if(mouseEvent.type==="down"&&mouseEvent.button===0&&this.currentSelection){if(mouseEvent.modifiers.ctrl)return this.currentSelection.isDragging=!0,this.updateSelection(maybeRenderable,mouseEvent.x,mouseEvent.y),!0}if(!sameElement&&(mouseEvent.type==="drag"||mouseEvent.type==="move")){if(this.lastOverRenderable&&this.lastOverRenderable!==this.capturedRenderable&&!this.lastOverRenderable.isDestroyed){let event2=new MouseEvent(this.lastOverRenderable,{...mouseEvent,type:"out"});this.lastOverRenderable.processMouseEvent(event2)}if(this.lastOverRenderable=maybeRenderable,maybeRenderable){let event2=new MouseEvent(maybeRenderable,{...mouseEvent,type:"over",source:this.capturedRenderable});maybeRenderable.processMouseEvent(event2)}}if(this.capturedRenderable&&mouseEvent.type!=="up"){let event2=new MouseEvent(this.capturedRenderable,mouseEvent);return this.capturedRenderable.processMouseEvent(event2),!0}if(this.capturedRenderable&&mouseEvent.type==="up"){let event2=new MouseEvent(this.capturedRenderable,{...mouseEvent,type:"drag-end"});if(this.capturedRenderable.processMouseEvent(event2),this.capturedRenderable.processMouseEvent(new MouseEvent(this.capturedRenderable,mouseEvent)),maybeRenderable){let event3=new MouseEvent(maybeRenderable,{...mouseEvent,type:"drop",source:this.capturedRenderable});maybeRenderable.processMouseEvent(event3)}this.lastOverRenderable=this.capturedRenderable,this.lastOverRenderableNum=this.capturedRenderable.num,this.setCapturedRenderable(void 0),this.requestRender()}let event;if(maybeRenderable){if(mouseEvent.type==="drag"&&mouseEvent.button===0)this.setCapturedRenderable(maybeRenderable);else this.setCapturedRenderable(void 0);event=this.dispatchMouseEvent(maybeRenderable,mouseEvent)}else this.setCapturedRenderable(void 0),this.lastOverRenderable=void 0;if(!event?.defaultPrevented&&mouseEvent.type==="down"&&this.currentSelection)this.clearSelection();return!0}recheckHoverState(){if(this._isDestroyed||!this._hasPointer)return;if(this.capturedRenderable)return;let hitId=this.hitTest(this._latestPointer.x,this._latestPointer.y),hitRenderable=Renderable.renderablesByNumber.get(hitId),lastOver=this.lastOverRenderable;if(lastOver?.num===hitId){this.lastOverRenderableNum=hitId;return}let baseEvent={type:"move",button:0,x:this._latestPointer.x,y:this._latestPointer.y,modifiers:this._lastPointerModifiers};if(lastOver&&!lastOver.isDestroyed){let event=new MouseEvent(lastOver,{...baseEvent,type:"out"});lastOver.processMouseEvent(event)}if(this.lastOverRenderable=hitRenderable,this.lastOverRenderableNum=hitId,hitRenderable){let event=new MouseEvent(hitRenderable,{...baseEvent,type:"over"});hitRenderable.processMouseEvent(event)}}setMousePointer(style){this._currentMousePointerStyle=style,this.lib.setCursorStyleOptions(this.rendererPtr,{cursor:style})}hitTest(x,y){return this.lib.checkHit(this.rendererPtr,x,y)}takeMemorySnapshot(){if(this._isDestroyed)return;let memoryUsage=process.memoryUsage();this.lastMemorySnapshot={heapUsed:memoryUsage.heapUsed,heapTotal:memoryUsage.heapTotal,arrayBuffers:memoryUsage.arrayBuffers},this.lib.updateMemoryStats(this.rendererPtr,this.lastMemorySnapshot.heapUsed,this.lastMemorySnapshot.heapTotal,this.lastMemorySnapshot.arrayBuffers),this.emit("memory:snapshot",this.lastMemorySnapshot)}startMemorySnapshotTimer(){this.stopMemorySnapshotTimer(),this.memorySnapshotTimer=this.clock.setInterval(()=>{this.takeMemorySnapshot()},this.memorySnapshotInterval)}stopMemorySnapshotTimer(){if(this.memorySnapshotTimer)this.clock.clearInterval(this.memorySnapshotTimer),this.memorySnapshotTimer=null}setMemorySnapshotInterval(interval){if(this.memorySnapshotInterval=interval,this._isRunning&&interval>0)this.startMemorySnapshotTimer();else if(interval<=0&&this.memorySnapshotTimer)this.clock.clearInterval(this.memorySnapshotTimer),this.memorySnapshotTimer=null}handleResize(width,height2){if(this._isDestroyed)return;if(this._splitHeight>0){this.processResize(width,height2);return}if(this.resizeTimeoutId!==null)this.clock.clearTimeout(this.resizeTimeoutId),this.resizeTimeoutId=null;this.resizeTimeoutId=this.clock.setTimeout(()=>{this.resizeTimeoutId=null,this.processResize(width,height2)},this.resizeDebounceDelay)}queryPixelResolution(){this.waitingForPixelResolution=!0,this.updateStdinParserProtocolContext({pixelResolutionQueryActive:!0}),this.lib.queryPixelResolution(this.rendererPtr)}processResize(width,height2){if(width===this._terminalWidth&&height2===this._terminalHeight)return;if(this._terminalIsSetup&&this._controlState!=="explicit_suspended")this.flushPendingSplitOutputBeforeTransition();let pendingSplitFooterTransition=this.pendingSplitFooterTransition,previousGeometry=calculateRenderGeometry(this._screenMode,this._terminalWidth,this._terminalHeight,this._footerHeight),prevWidth=this._terminalWidth,previousTerminalHeight=this._terminalHeight,visiblePreviousSplitHeight=pendingSplitFooterTransition?.sourceHeight??previousGeometry.effectiveFooterHeight;this._terminalWidth=width,this._terminalHeight=height2,this.queryPixelResolution(),this.setCapturedRenderable(void 0),this.stdinParser?.resetMouseState();let nextGeometry=calculateRenderGeometry(this._screenMode,this._terminalWidth,this._terminalHeight,this._footerHeight);if(this._screenMode==="split-footer"){let clearStart=null;if(width<prevWidth&&visiblePreviousSplitHeight>0)clearStart=Math.max(previousTerminalHeight-visiblePreviousSplitHeight*2,1);if(pendingSplitFooterTransition!==null)clearStart=clearStart===null?pendingSplitFooterTransition.sourceTopLine:Math.min(clearStart,pendingSplitFooterTransition.sourceTopLine);if(clearStart!==null){let flush=ANSI3.moveCursorAndClear(clearStart,1);this.writeOut(flush)}this.currentRenderBuffer.clear(this.backgroundColor)}if(this.clearPendingSplitFooterTransition(),this._splitHeight=nextGeometry.effectiveFooterHeight,this.width=nextGeometry.renderWidth,this.height=nextGeometry.renderHeight,this.lib.resizeRenderer(this.rendererPtr,this.width,this.height),this._screenMode==="split-footer"&&this._externalOutputMode==="capture-stdout")this.syncSplitScrollback();else this.syncSplitFooterState();this.nextRenderBuffer=this.lib.getNextBuffer(this.rendererPtr),this.currentRenderBuffer=this.lib.getCurrentBuffer(this.rendererPtr),this._console.resize(this.width,this.height),this.root.resize(this.width,this.height),this.emit("resize",this.width,this.height),this.requestRender()}setBackgroundColor(color2){let parsedColor=parseColor(color2);this.lib.setBackgroundColor(this.rendererPtr,parsedColor),this.backgroundColor=parsedColor,this.nextRenderBuffer.clear(parsedColor),this.requestRender()}toggleDebugOverlay(){let willBeEnabled=!this.debugOverlay.enabled;if(willBeEnabled&&!this.memorySnapshotInterval)this.memorySnapshotInterval=3000,this.startMemorySnapshotTimer(),this.automaticMemorySnapshot=!0;else if(!willBeEnabled&&this.automaticMemorySnapshot)this.stopMemorySnapshotTimer(),this.memorySnapshotInterval=0,this.automaticMemorySnapshot=!1;this.debugOverlay.enabled=!this.debugOverlay.enabled,this.lib.setDebugOverlay(this.rendererPtr,this.debugOverlay.enabled,this.debugOverlay.corner),this.emit("debugOverlay:toggle",this.debugOverlay.enabled),this.requestRender()}configureDebugOverlay(options){this.debugOverlay.enabled=options.enabled??this.debugOverlay.enabled,this.debugOverlay.corner=options.corner??this.debugOverlay.corner,this.lib.setDebugOverlay(this.rendererPtr,this.debugOverlay.enabled,this.debugOverlay.corner),this.requestRender()}setTerminalTitle(title){this.lib.setTerminalTitle(this.rendererPtr,title)}resetTerminalBgColor(){process.stdout.write("\x1B]111\x07")}copyToClipboardOSC52(text,target){return this.clipboard.copyToClipboardOSC52(text,target)}clearClipboardOSC52(target){return this.clipboard.clearClipboardOSC52(target)}isOsc52Supported(){return this._capabilities?.osc52??this.clipboard.isOsc52Supported()}dumpHitGrid(){this.lib.dumpHitGrid(this.rendererPtr)}dumpBuffers(timestamp2){this.lib.dumpBuffers(this.rendererPtr,timestamp2)}dumpStdoutBuffer(timestamp2){this.lib.dumpStdoutBuffer(this.rendererPtr,timestamp2)}static setCursorPosition(renderer,x,y,visible=!0){resolveRenderLib().setCursorPosition(renderer.rendererPtr,x,y,visible)}static setCursorStyle(renderer,options){if(resolveRenderLib().setCursorStyleOptions(renderer.rendererPtr,options),options.cursor!==void 0)renderer._currentMousePointerStyle=options.cursor}static setCursorColor(renderer,color2){resolveRenderLib().setCursorColor(renderer.rendererPtr,color2)}setCursorPosition(x,y,visible=!0){this.lib.setCursorPosition(this.rendererPtr,x,y,visible)}setCursorStyle(options){if(this.lib.setCursorStyleOptions(this.rendererPtr,options),options.cursor!==void 0)this._currentMousePointerStyle=options.cursor}setCursorColor(color2){this.lib.setCursorColor(this.rendererPtr,color2)}getCursorState(){return this.lib.getCursorState(this.rendererPtr)}addPostProcessFn(processFn){this.postProcessFns.push(processFn)}removePostProcessFn(processFn){this.postProcessFns=this.postProcessFns.filter((fn)=>fn!==processFn)}clearPostProcessFns(){this.postProcessFns=[]}setFrameCallback(callback){this.frameCallbacks.push(callback)}removeFrameCallback(callback){this.frameCallbacks=this.frameCallbacks.filter((cb)=>cb!==callback)}clearFrameCallbacks(){this.frameCallbacks=[]}requestLive(){if(this.liveRequestCounter++,this._controlState==="idle"&&this.liveRequestCounter>0)this._controlState="auto_started",this.internalStart()}dropLive(){if(this.liveRequestCounter=Math.max(0,this.liveRequestCounter-1),this._controlState==="auto_started"&&this.liveRequestCounter===0)this._controlState="idle",this.internalPause()}start(){this._controlState="explicit_started",this.internalStart()}auto(){this._controlState=this._isRunning?"auto_started":"idle"}internalStart(){if(!this._isRunning&&!this._isDestroyed){if(this._isRunning=!0,this.updateScheduled=!1,this.memorySnapshotInterval>0)this.startMemorySnapshotTimer();this.startRenderLoop()}}pause(){this._controlState="explicit_paused",this.internalPause()}suspend(){if(this._previousControlState=this._controlState,this._controlState="explicit_suspended",this.internalPause(),this._terminalIsSetup)this.flushPendingSplitOutputBeforeTransition(!0);if(this._suspendedMouseEnabled=this._useMouse,this.disableMouse(),this.removeExitListeners(),this.waitingForPixelResolution=!1,this.updateStdinParserProtocolContext({privateCapabilityRepliesActive:!1,pixelResolutionQueryActive:!1,explicitWidthCprActive:!1,startupCursorCprActive:!1}),this.stdinParser?.reset(),this.stdin.removeListener("data",this.stdinListener),this.themeModeState.cancelRefresh(),this.lib.suspendRenderer(this.rendererPtr),this.stdin.setRawMode)this.stdin.setRawMode(!1);this.stdin.pause()}resume(){if(this.stdin.setRawMode)this.stdin.setRawMode(!0);while(this.stdin.read()!==null);if(this.stdin.on("data",this.stdinListener),this.stdin.resume(),this.addExitListeners(),this.lib.resumeRenderer(this.rendererPtr),this._screenMode==="split-footer"&&this._splitHeight>0)this.syncSplitFooterState();if(this._suspendedMouseEnabled)this.enableMouse();if(this.currentRenderBuffer.clear(this.backgroundColor),this._controlState=this._previousControlState,this._previousControlState==="auto_started"||this._previousControlState==="explicit_started")this.internalStart();else this.requestRender()}internalPause(){if(this._isRunning=!1,this.renderTimeout)this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null;if(!this.rendering)this.resolveIdleIfNeeded()}stop(){this._controlState="explicit_stopped",this.internalStop()}internalStop(){if(this.isRunning&&!this._isDestroyed){if(this._isRunning=!1,this.memorySnapshotTimer)this.clock.clearInterval(this.memorySnapshotTimer),this.memorySnapshotTimer=null;if(this.renderTimeout)this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null;if(!this.rendering)this.resolveIdleIfNeeded()}}destroy(){if(this._isDestroyed)return;if(this._isDestroyed=!0,this._destroyPending=!0,this.rendering){this.prepareDestroyDuringRender();return}this.finalizeDestroy()}cleanupBeforeDestroy(){if(this._destroyCleanupPrepared)return;if(this._destroyCleanupPrepared=!0,process.removeListener("SIGWINCH",this.sigwinchHandler),process.removeListener("uncaughtException",this.handleError),process.removeListener("unhandledRejection",this.handleError),process.removeListener("warning",this.warningHandler),process.removeListener("beforeExit",this.exitHandler),this.removeExitListeners(),this.resizeTimeoutId!==null)this.clock.clearTimeout(this.resizeTimeoutId),this.resizeTimeoutId=null;if(this.capabilityTimeoutId!==null)this.clock.clearTimeout(this.capabilityTimeoutId),this.capabilityTimeoutId=null;if(this.splitStartupSeedTimeoutId!==null)this.clock.clearTimeout(this.splitStartupSeedTimeoutId),this.splitStartupSeedTimeoutId=null;if(this.memorySnapshotTimer)this.clock.clearInterval(this.memorySnapshotTimer),this.memorySnapshotTimer=null;if(this.renderTimeout)this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null;if(this.themeModeState.cancelRefresh(),this._isRunning=!1,this.waitingForPixelResolution=!1,this.updateStdinParserProtocolContext({privateCapabilityRepliesActive:!1,pixelResolutionQueryActive:!1,explicitWidthCprActive:!1,startupCursorCprActive:!1},!0),this._useMouse=!1,this.setCapturedRenderable(void 0),this.stdin.removeListener("data",this.stdinListener),this.stdin.setRawMode)this.stdin.setRawMode(!1);if(this.externalOutputMode="passthrough",this._splitHeight>0)this.flushStdoutCache(this._splitHeight,!0)}prepareDestroyDuringRender(){this.cleanupBeforeDestroy(),this.lib.suspendRenderer(this.rendererPtr)}finalizeDestroy(){if(this._destroyFinalized)return;if(this._destroyFinalized=!0,this._destroyPending=!1,this.cleanupBeforeDestroy(),this._paletteDetector)this._paletteDetector.cleanup(),this._paletteDetector=null;this._paletteCache.clear(),this._paletteDetectionPromise=null,this._paletteDetectionSize=0,this._cachedPalette=null,this._publishedPaletteSignature=null,this._paletteEpoch=0,this._palettePublishGeneration=0,this.themeModeState.dispose(),this.emit("destroy");try{this.root.destroyRecursively()}catch(e){console.error("Error destroying root renderable:",e instanceof Error?e.stack:String(e))}if(this.stdinParser?.destroy(),this.stdinParser=null,this.oscSubscribers.clear(),this._console.destroy(),this._splitHeight>0&&this._terminalIsSetup&&this._controlState!=="explicit_suspended"){if(this.flushPendingSplitOutputBeforeTransition(!0),this.renderOffset=0,this.clearOnShutdown)this.lib.setRenderOffset(this.rendererPtr,0)}if(this._externalOutputMode="passthrough",this.stdout.write=this.realStdoutWrite,this.externalOutputQueue.clear(),this.lib.destroyRenderer(this.rendererPtr),rendererTracker.removeRenderer(this),this._onDestroy)try{this._onDestroy()}catch(e){console.error("Error in onDestroy callback:",e instanceof Error?e.stack:String(e))}this.resolveIdleIfNeeded()}startRenderLoop(){if(!this._isRunning)return;this.lastTime=this.normalizeClockTime(this.clock.now(),0),this.frameCount=0,this.lastFpsTime=this.lastTime,this.currentFps=0,this.loop()}async loop(){if(this.rendering||this._isDestroyed)return;if(this.renderTimeout=null,this.rendering=!0,this.renderTimeout)this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null;try{this._frameId++;let now=this.normalizeClockTime(this.clock.now(),this.lastTime),deltaTime=this.getElapsedMs(now,this.lastTime);if(this.lastTime=now,this.frameCount++,this.getElapsedMs(now,this.lastFpsTime)>=1000)this.currentFps=this.frameCount,this.frameCount=0,this.lastFpsTime=now;this.renderStats.frameCount++,this.renderStats.fps=this.currentFps;let overallStart=performance.now(),frameRequests=Array.from(this.animationRequest.values());this.animationRequest.clear();let animationRequestStart=performance.now();for(let callback of frameRequests)callback(deltaTime),this.dropLive();let animationRequestTime=performance.now()-animationRequestStart,start3=performance.now();for(let frameCallback of this.frameCallbacks)try{await frameCallback(deltaTime)}catch(error2){console.error("Error in frame callback:",error2)}let end=performance.now();this.renderStats.frameCallbackTime=end-start3,this.root.render(this.nextRenderBuffer,deltaTime);for(let postProcessFn of this.postProcessFns)postProcessFn(this.nextRenderBuffer,deltaTime);if(this._console.renderToBuffer(this.nextRenderBuffer),!this._isDestroyed){if(this.renderNative(),this._useMouse&&this.lib.getHitGridDirty(this.rendererPtr))this.recheckHoverState();let overallFrameTime=performance.now()-overallStart;if(this.lib.updateStats(this.rendererPtr,overallFrameTime,this.renderStats.fps,this.renderStats.frameCallbackTime),this.gatherStats)this.collectStatSample(overallFrameTime);if(this._isRunning||this.immediateRerenderRequested){let targetFrameTime=this.immediateRerenderRequested?this.minTargetFrameTime:this.targetFrameTime,delay=Math.max(1,targetFrameTime-Math.floor(overallFrameTime));this.immediateRerenderRequested=!1,this.renderTimeout=this.clock.setTimeout(()=>{this.renderTimeout=null,this.loop()},delay)}else this.clock.clearTimeout(this.renderTimeout),this.renderTimeout=null}}finally{if(this.rendering=!1,this._destroyPending)this.finalizeDestroy();this.resolveIdleIfNeeded()}}intermediateRender(){this.immediateRerenderRequested=!0,this.loop()}renderNative(){if(this.renderingNative)throw console.error("Rendering called concurrently"),Error("Rendering called concurrently");if(this.renderingNative=!0,this.pendingSplitStartupCursorSeed&&this.splitStartupSeedTimeoutId!==null&&this._splitHeight>0&&this._externalOutputMode==="capture-stdout"){this.renderingNative=!1;return}if(this._splitHeight>0&&this._externalOutputMode==="capture-stdout"){let forceSplitRepaint=this.forceFullRepaintRequested;this.forceFullRepaintRequested=!1,this.flushPendingSplitCommits(forceSplitRepaint),this.pendingSplitFooterTransition=null}else{let force=this.forceFullRepaintRequested;this.forceFullRepaintRequested=!1,this.pendingSplitFooterTransition=null,this.lib.render(this.rendererPtr,force)}this.renderingNative=!1}collectStatSample(frameTime){if(this.frameTimes.push(frameTime),this.frameTimes.length>this.maxStatSamples)this.frameTimes.shift()}getStats(){let frameTimes=[...this.frameTimes],sum=frameTimes.reduce((acc,time)=>acc+time,0),avg=frameTimes.length?sum/frameTimes.length:0,min=frameTimes.length?Math.min(...frameTimes):0,max=frameTimes.length?Math.max(...frameTimes):0;return{fps:this.renderStats.fps,frameCount:this.renderStats.frameCount,frameTimes,averageFrameTime:avg,minFrameTime:min,maxFrameTime:max}}resetStats(){this.frameTimes=[],this.renderStats.frameCount=0}setGatherStats(enabled){if(this.gatherStats=enabled,!enabled)this.frameTimes=[]}getSelection(){return this.currentSelection}get hasSelection(){return!!this.currentSelection}getSelectionContainer(){return this.selectionContainers.length>0?this.selectionContainers[this.selectionContainers.length-1]:null}clearSelection(){if(this.currentSelection){for(let renderable of this.currentSelection.touchedRenderables)if(renderable.selectable&&!renderable.isDestroyed)renderable.onSelectionChanged(null);this.currentSelection=null}this.selectionContainers=[]}startSelection(renderable,x,y){if(!renderable.selectable)return;this.clearSelection(),this.selectionContainers.push(renderable.parent||this.root),this.currentSelection=new Selection(renderable,{x,y},{x,y}),this.currentSelection.isStart=!0,this.notifySelectablesOfSelectionChange()}updateSelection(currentRenderable,x,y,options){if(this.currentSelection){if(this.currentSelection.isStart=!1,this.currentSelection.focus={x,y},options?.finishDragging)this.currentSelection.isDragging=!1;if(this.selectionContainers.length>0){let currentContainer=this.selectionContainers[this.selectionContainers.length-1];if(!currentRenderable||!this.isWithinContainer(currentRenderable,currentContainer)){let parentContainer=currentContainer.parent||this.root;this.selectionContainers.push(parentContainer)}else if(currentRenderable&&this.selectionContainers.length>1){let containerIndex=this.selectionContainers.indexOf(currentRenderable);if(containerIndex===-1){let immediateParent=currentRenderable.parent||this.root;containerIndex=this.selectionContainers.indexOf(immediateParent)}if(containerIndex!==-1&&containerIndex<this.selectionContainers.length-1)this.selectionContainers=this.selectionContainers.slice(0,containerIndex+1)}}this.notifySelectablesOfSelectionChange()}}requestSelectionUpdate(){if(this.currentSelection?.isDragging){let pointer=this._latestPointer,maybeRenderableId=this.hitTest(pointer.x,pointer.y),maybeRenderable=Renderable.renderablesByNumber.get(maybeRenderableId);this.updateSelection(maybeRenderable,pointer.x,pointer.y)}}isWithinContainer(renderable,container){let current=renderable;while(current){if(current===container)return!0;current=current.parent}return!1}finishSelection(){if(this.currentSelection)this.currentSelection.isDragging=!1,this.emit("selection",this.currentSelection),this.notifySelectablesOfSelectionChange()}notifySelectablesOfSelectionChange(){let selectedRenderables=[],touchedRenderables=[],currentContainer=this.selectionContainers.length>0?this.selectionContainers[this.selectionContainers.length-1]:this.root;if(this.currentSelection){this.walkSelectableRenderables(currentContainer,this.currentSelection.bounds,selectedRenderables,touchedRenderables);for(let renderable of this.currentSelection.touchedRenderables)if(!touchedRenderables.includes(renderable)&&!renderable.isDestroyed)renderable.onSelectionChanged(null);this.currentSelection.updateSelectedRenderables(selectedRenderables),this.currentSelection.updateTouchedRenderables(touchedRenderables)}}walkSelectableRenderables(container,selectionBounds,selectedRenderables,touchedRenderables){let children=getObjectsInViewport(selectionBounds,container.getChildrenSortedByPrimaryAxis(),container.primaryAxis,0,0);for(let child of children){if(child.selectable){if(child.onSelectionChanged(this.currentSelection))selectedRenderables.push(child);touchedRenderables.push(child)}if(child.getChildrenCount()>0)this.walkSelectableRenderables(child,selectionBounds,selectedRenderables,touchedRenderables)}}get paletteDetectionStatus(){if(this._paletteDetectionPromise)return"detecting";if(this._paletteCache.size>0)return"cached";return"idle"}getCachedPaletteBySize(size){let exactMatch=this._paletteCache.get(size);if(exactMatch)return exactMatch;let largerSize=[...this._paletteCache.keys()].sort((a,b2)=>a-b2).find((candidate)=>candidate>=size);if(largerSize===void 0)return null;let source=this._paletteCache.get(largerSize);if(!source)return null;let projected={...source,palette:source.palette.slice(0,size)};return this._paletteCache.set(size,projected),projected}ensurePaletteDetector(){if(!this._paletteDetector){let isLegacyTmux=this.capabilities?.terminal?.name?.toLowerCase()?.includes("tmux")&&this.capabilities?.terminal?.version?.localeCompare("3.6")<0;this._paletteDetector=createTerminalPalette(this.stdin,this.stdout,this.writeOut.bind(this),isLegacyTmux,{subscribeOsc:this.subscribeOsc.bind(this)},this.clock)}return this._paletteDetector}syncNativePaletteState(colors8){let signature=buildTerminalPaletteSignature(colors8);if(this._publishedPaletteSignature!==signature)this._paletteEpoch=this._paletteEpoch+1>>>0;this._publishedPaletteSignature=signature;let normalized=normalizeTerminalPalette(colors8);this.lib.rendererSetPaletteState(this.rendererPtr,normalized.palette,normalized.defaultForeground,normalized.defaultBackground,this._paletteEpoch)}ensureNativePaletteState(){if(!this._terminalIsSetup||this._isDestroyed)return;let publishGeneration=this._palettePublishGeneration;this.getPalette({size:NATIVE_PALETTE_QUERY_SIZE}).then((colors8)=>{if(this._palettePublishGeneration===publishGeneration)this.syncNativePaletteState(colors8);this.requestRender()}).catch(()=>{})}clearPaletteCache(){this._paletteCache.clear(),this._cachedPalette=null}async getPalette(options){if(this._controlState==="explicit_suspended")throw Error("Cannot detect palette while renderer is suspended");let requestedSize=options?.size??16,detectionTimeout=options?.timeout,cachedPalette=this.getCachedPaletteBySize(requestedSize);if(cachedPalette)return this._cachedPalette=cachedPalette,cachedPalette;if(this._paletteDetectionPromise){if(this._paletteDetectionSize>=requestedSize)return this._paletteDetectionPromise.then((palette2)=>{let cached=this.getCachedPaletteBySize(requestedSize);if(cached)return this._cachedPalette=cached,cached;let projected={...palette2,palette:palette2.palette.slice(0,requestedSize)};return this._paletteCache.set(requestedSize,projected),this._cachedPalette=projected,projected});await this._paletteDetectionPromise;let afterWait=this.getCachedPaletteBySize(requestedSize);if(afterWait)return this._cachedPalette=afterWait,afterWait}let detector=this.ensurePaletteDetector(),publishGeneration=this._palettePublishGeneration;this._paletteDetectionSize=requestedSize,this._paletteDetectionPromise=detector.detect({...options,timeout:detectionTimeout}).then((result2)=>{if(this._paletteCache.set(result2.palette.length,result2),this._cachedPalette=result2,this._paletteDetectionPromise=null,this._paletteDetectionSize=0,this._palettePublishGeneration===publishGeneration){if(result2.palette.length>=NATIVE_PALETTE_QUERY_SIZE)this.syncNativePaletteState(result2);else if(this._terminalIsSetup&&!this._paletteCache.has(NATIVE_PALETTE_QUERY_SIZE))this.ensureNativePaletteState()}return result2}).catch((error2)=>{throw this._paletteDetectionPromise=null,this._paletteDetectionSize=0,error2});let detected=await this._paletteDetectionPromise,finalPalette=this.getCachedPaletteBySize(requestedSize)??detected;return this._cachedPalette=finalPalette,finalPalette}}});import{toArrayBuffer as toArrayBuffer5}from"bun:ffi";function toU82(value){return Math.round(Math.max(0,Math.min(1,Number.isFinite(value)?value:0))*255)}function channel(buffer2,index){return(buffer2[index]&255)/255}function setRgb(buffer2,base,r,g,b2){let a=buffer2[base+3]&255;buffer2[base]=toU82(r),buffer2[base+1]=toU82(g),buffer2[base+2]=toU82(b2),buffer2[base+3]=a}class DistortionEffect{glitchChancePerSecond=0.5;maxGlitchLines=3;minGlitchDuration=0.05;maxGlitchDuration=0.2;maxShiftAmount=10;shiftFlipRatio=0.6;colorGlitchChance=0.2;lastGlitchTime=0;glitchDuration=0;activeGlitches=[];constructor(options){if(options)Object.assign(this,options)}apply(buffer2,deltaTime){let{width,height:height2,buffers:buf}=buffer2;if(this.lastGlitchTime+=deltaTime,this.activeGlitches.length>0&&this.lastGlitchTime>=this.glitchDuration)this.activeGlitches=[],this.glitchDuration=0;if(this.activeGlitches.length===0&&Math.random()<this.glitchChancePerSecond*deltaTime){this.lastGlitchTime=0,this.glitchDuration=this.minGlitchDuration+Math.random()*(this.maxGlitchDuration-this.minGlitchDuration);let numGlitches=1+Math.floor(Math.random()*this.maxGlitchLines);for(let i2=0;i2<numGlitches;i2++){let y=Math.floor(Math.random()*height2),type2,amount=0,typeRoll=Math.random();if(typeRoll<this.colorGlitchChance)type2="color";else if((typeRoll-this.colorGlitchChance)/(1-this.colorGlitchChance)<this.shiftFlipRatio)type2="shift",amount=Math.floor((Math.random()-0.5)*2*this.maxShiftAmount);else type2="flip";if(!this.activeGlitches.some((g)=>g.y===y))this.activeGlitches.push({y,type:type2,amount})}}if(this.activeGlitches.length>0){let tempChar=null,tempFg=null,tempBg=null,tempAttr=null;for(let glitch of this.activeGlitches){let y=glitch.y;if(y<0||y>=height2)continue;let baseIndex=y*width;if(glitch.type==="shift"||glitch.type==="flip"){if(!tempChar)tempChar=new Uint32Array(width),tempFg=new Uint16Array(width*4),tempBg=new Uint16Array(width*4),tempAttr=new Uint8Array(width);try{tempChar.set(buf.char.subarray(baseIndex,baseIndex+width)),tempFg.set(buf.fg.subarray(baseIndex*4,(baseIndex+width)*4)),tempBg.set(buf.bg.subarray(baseIndex*4,(baseIndex+width)*4)),tempAttr.set(buf.attributes.subarray(baseIndex,baseIndex+width))}catch(e){console.error(`Error copying row ${y} for distortion:`,e);continue}if(glitch.type==="shift"){let shift=glitch.amount;for(let x=0;x<width;x++){let srcX=(x-shift+width)%width,destIndex=baseIndex+x,srcTempIndex=srcX;buf.char[destIndex]=tempChar[srcTempIndex],buf.attributes[destIndex]=tempAttr[srcTempIndex];let destColorIndex=destIndex*4,srcTempColorIndex=srcTempIndex*4;buf.fg.set(tempFg.subarray(srcTempColorIndex,srcTempColorIndex+4),destColorIndex),buf.bg.set(tempBg.subarray(srcTempColorIndex,srcTempColorIndex+4),destColorIndex)}}else for(let x=0;x<width;x++){let srcX=width-1-x,destIndex=baseIndex+x,srcTempIndex=srcX;buf.char[destIndex]=tempChar[srcTempIndex],buf.attributes[destIndex]=tempAttr[srcTempIndex];let destColorIndex=destIndex*4,srcTempColorIndex=srcTempIndex*4;buf.fg.set(tempFg.subarray(srcTempColorIndex,srcTempColorIndex+4),destColorIndex),buf.bg.set(tempBg.subarray(srcTempColorIndex,srcTempColorIndex+4),destColorIndex)}}else if(glitch.type==="color"){let glitchStart=Math.floor(Math.random()*width),maxPossibleLength=width-glitchStart,glitchLength=Math.floor(Math.random()*maxPossibleLength)+1;if(Math.random()<0.2)glitchLength=Math.floor(Math.random()*(width/4))+1;glitchLength=Math.min(glitchLength,maxPossibleLength);for(let x=glitchStart;x<glitchStart+glitchLength;x++){if(x>=width)break;let destColorIndex=(baseIndex+x)*4,rFg,gFg,bFg,rBg,gBg,bBg,colorMode=Math.random();if(colorMode<0.33)rFg=Math.random(),gFg=Math.random(),bFg=Math.random(),rBg=Math.random(),gBg=Math.random(),bBg=Math.random();else if(colorMode<0.66){let emphasis=Math.random();if(emphasis<0.25)rFg=Math.random(),gFg=0,bFg=0;else if(emphasis<0.5)rFg=0,gFg=Math.random(),bFg=0;else if(emphasis<0.75)rFg=0,gFg=0,bFg=Math.random();else{let glitchColorRoll=Math.random();if(glitchColorRoll<0.33)rFg=1,gFg=0,bFg=1;else if(glitchColorRoll<0.66)rFg=0,gFg=1,bFg=1;else rFg=1,gFg=1,bFg=0}if(Math.random()<0.5)rBg=1-rFg,gBg=1-gFg,bBg=1-bFg;else rBg=rFg*(Math.random()*0.5+0.2),gBg=gFg*(Math.random()*0.5+0.2),bBg=bFg*(Math.random()*0.5+0.2)}else rFg=Math.random()>0.5?1:0,gFg=Math.random()>0.5?1:0,bFg=Math.random()>0.5?1:0,rBg=1-rFg,gBg=1-gFg,bBg=1-bFg;setRgb(buf.fg,destColorIndex,rFg,gFg,bFg),setRgb(buf.bg,destColorIndex,rBg,gBg,bBg)}}}}}}class PerlinNoise{perm;grad3=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]];constructor(){this.perm=new Uint8Array(512);let p=new Uint8Array(256);for(let i2=0;i2<256;i2++)p[i2]=i2;for(let i2=255;i2>0;i2--){let r=Math.floor(Math.random()*(i2+1));[p[i2],p[r]]=[p[r],p[i2]]}for(let i2=0;i2<512;i2++)this.perm[i2]=p[i2&255]}dot(g,x,y,z){return g[0]*x+g[1]*y+g[2]*z}mix(a,b2,t2){return a+(b2-a)*t2}fade(t2){return t2*t2*t2*(t2*(t2*6-15)+10)}noise3d(x,y,z){let X=Math.floor(x)&255,Y=Math.floor(y)&255,Z=Math.floor(z)&255,xf=x-Math.floor(x),yf=y-Math.floor(y),zf=z-Math.floor(z),u=this.fade(xf),v=this.fade(yf),w=this.fade(zf),A=this.perm[X]+Y,AA=this.perm[A]+Z,AB=this.perm[A+1]+Z,B=this.perm[X+1]+Y,BA=this.perm[B]+Z,BB=this.perm[B+1]+Z;return this.mix(this.mix(this.mix(this.dot(this.grad3[this.perm[AA]%12],xf,yf,zf),this.dot(this.grad3[this.perm[BA]%12],xf-1,yf,zf),u),this.mix(this.dot(this.grad3[this.perm[AB]%12],xf,yf-1,zf),this.dot(this.grad3[this.perm[BB]%12],xf-1,yf-1,zf),u),v),this.mix(this.mix(this.dot(this.grad3[this.perm[AA+1]%12],xf,yf,zf-1),this.dot(this.grad3[this.perm[BA+1]%12],xf-1,yf,zf-1),u),this.mix(this.dot(this.grad3[this.perm[AB+1]%12],xf,yf-1,zf-1),this.dot(this.grad3[this.perm[BB+1]%12],xf-1,yf-1,zf-1),u),v),w)}}class CloudsEffect{noise;_scale;_speed;_density;_darkness;time=0;constructor(scale=0.02,speed=0.5,density=0.6,darkness=0.7){this.noise=new PerlinNoise,this._scale=scale,this._speed=speed,this._density=density,this._darkness=darkness}set scale(newScale){this._scale=Math.max(0.001,newScale)}get scale(){return this._scale}set speed(newSpeed){this._speed=Math.max(0,newSpeed)}get speed(){return this._speed}set density(newDensity){this._density=Math.max(0,Math.min(1,newDensity))}get density(){return this._density}set darkness(newDarkness){this._darkness=Math.max(0,Math.min(1,newDarkness))}get darkness(){return this._darkness}apply(buffer2,deltaTime){let{width,height:height2}=buffer2;this.time+=deltaTime*this._speed;let scale=this._scale,timeOffset=this.time,cellMask=new Float32Array(width*height2*3),maskIdx=0;for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let noiseValue=0,amplitude=1,frequency=1,maxValue=0;for(let i2=0;i2<4;i2++){let nx=(x*scale*frequency+timeOffset)*0.5,ny=y*scale*frequency*0.5,nz=timeOffset*0.3;noiseValue+=this.noise.noise3d(nx,ny,nz)*amplitude,maxValue+=amplitude,amplitude*=0.5,frequency*=2}noiseValue=(noiseValue/maxValue+1)*0.5;let attenuation=Math.max(0,noiseValue-(1-this._density))*this._darkness;cellMask[maskIdx++]=x,cellMask[maskIdx++]=y,cellMask[maskIdx++]=attenuation}let zeroMatrix=new Float32Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);buffer2.colorMatrix(zeroMatrix,cellMask,1,2)}}class FlamesEffect{noise;_scale;_speed;_intensity;time=0;constructor(scale=0.03,speed=0.02,intensity=0.8){this.noise=new PerlinNoise,this._scale=scale,this._speed=speed,this._intensity=intensity}set scale(newScale){this._scale=Math.max(0.001,newScale)}get scale(){return this._scale}set speed(newSpeed){this._speed=Math.max(0,newSpeed)}get speed(){return this._speed}set intensity(newIntensity){this._intensity=Math.max(0,Math.min(1,newIntensity))}get intensity(){return this._intensity}apply(buffer2,deltaTime){let{width,height:height2}=buffer2,bg2=buffer2.buffers.bg;this.time+=deltaTime*this._speed;let scale=this._scale,timeOffset=this.time;for(let y=0;y<height2;y++){let heightFactor=1-y/height2;for(let x=0;x<width;x++){let noiseValue=0,amplitude=1,frequency=1,maxValue=0;for(let i2=0;i2<3;i2++){let nx=(x*scale*frequency+timeOffset)*0.5,ny=(height2-y)*scale*frequency*2*0.5,nz=timeOffset*2;noiseValue+=this.noise.noise3d(nx,ny,nz)*amplitude,maxValue+=amplitude,amplitude*=0.5,frequency*=2}noiseValue=(noiseValue/maxValue+1)*0.5;let flameIntensity=noiseValue*heightFactor*this._intensity;if(flameIntensity>0){let colorIndex=(y*width+x)*4,r,g,b2;if(flameIntensity>0.7)r=1,g=1,b2=0.3+(flameIntensity-0.7)*2.3;else if(flameIntensity>0.4)r=1,g=0.5+(flameIntensity-0.4)*1.67,b2=0;else r=0.3+flameIntensity*1.75,g=flameIntensity*0.5,b2=0;setRgb(bg2,colorIndex,Math.max(channel(bg2,colorIndex),r*flameIntensity),Math.max(channel(bg2,colorIndex+1),g*flameIntensity),Math.max(channel(bg2,colorIndex+2),b2*flameIntensity))}}}}}class CRTRollingBarEffect{_speed;_height;_intensity;_fadeDistance;position=0;constructor(speed=0.5,height2=0.15,intensity=0.3,fadeDistance=0.3){this._speed=speed,this._height=Math.max(0.01,Math.min(0.5,height2)),this._intensity=Math.max(0,Math.min(1,intensity)),this._fadeDistance=Math.max(0,Math.min(1,fadeDistance))}set speed(newSpeed){this._speed=newSpeed}get speed(){return this._speed}set height(newHeight){this._height=Math.max(0.01,Math.min(0.5,newHeight))}get height(){return this._height}set intensity(newIntensity){this._intensity=Math.max(0,Math.min(1,newIntensity))}get intensity(){return this._intensity}set fadeDistance(newFadeDistance){this._fadeDistance=Math.max(0,Math.min(1,newFadeDistance))}get fadeDistance(){return this._fadeDistance}apply(buffer2,deltaTime){let{width,height:height2}=buffer2,fg2=buffer2.buffers.fg,bg2=buffer2.buffers.bg;this.position+=deltaTime/1000*this._speed;let cycleHeight=height2+this._height*height2*2;this.position=this.position%cycleHeight;let barPixelHeight=this._height*height2,fadePixelDistance=this._fadeDistance*barPixelHeight,totalEffectHeight=barPixelHeight+fadePixelDistance*2,effectCenter=this.position-totalEffectHeight/2+barPixelHeight/2;for(let y=0;y<height2;y++){let distFromCenter=Math.abs(y-effectCenter),barFactor=0;if(distFromCenter<=totalEffectHeight/2){let normalizedDist=distFromCenter/(totalEffectHeight/2);barFactor=Math.cos(normalizedDist*Math.PI/2)}if(barFactor>0.001){let rowMultiplier=1+this._intensity*barFactor;for(let x=0;x<width;x++){let colorIndex=(y*width+x)*4;setRgb(fg2,colorIndex,Math.min(1,channel(fg2,colorIndex)*rowMultiplier),Math.min(1,channel(fg2,colorIndex+1)*rowMultiplier),Math.min(1,channel(fg2,colorIndex+2)*rowMultiplier)),setRgb(bg2,colorIndex,Math.min(1,channel(bg2,colorIndex)*rowMultiplier),Math.min(1,channel(bg2,colorIndex+1)*rowMultiplier),Math.min(1,channel(bg2,colorIndex+2)*rowMultiplier))}}}}}class RainbowTextEffect{_speed;_saturation;_value;_repeats;time=0;constructor(speed=0.01,saturation=1,value=1,repeats=3){this._speed=speed,this._saturation=saturation,this._value=value,this._repeats=repeats}set speed(newSpeed){this._speed=Math.max(0,newSpeed)}get speed(){return this._speed}set saturation(newSaturation){this._saturation=Math.max(0,Math.min(1,newSaturation))}get saturation(){return this._saturation}set value(newValue){this._value=Math.max(0,Math.min(1,newValue))}get value(){return this._value}set repeats(newRepeats){this._repeats=Math.max(0.1,newRepeats)}get repeats(){return this._repeats}hsvToRgb(h2,s2,v){let r=0,g=0,b2=0,i2=Math.floor(h2*6),f=h2*6-i2,p=v*(1-s2),q=v*(1-f*s2),t2=v*(1-(1-f)*s2);switch(i2%6){case 0:r=v,g=t2,b2=p;break;case 1:r=q,g=v,b2=p;break;case 2:r=p,g=v,b2=t2;break;case 3:r=p,g=q,b2=v;break;case 4:r=t2,g=p,b2=v;break;case 5:r=v,g=p,b2=q;break}return[r,g,b2]}apply(buffer2,deltaTime){let{width,height:height2}=buffer2,fg2=buffer2.buffers.fg;this.time+=deltaTime*this._speed;let saturation=this._saturation,value=this._value,repeats=this._repeats,angleRad=25*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),whiteThreshold=0.9;for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let colorIndex=(y*width+x)*4,r=channel(fg2,colorIndex),g=channel(fg2,colorIndex+1),b2=channel(fg2,colorIndex+2);if(r>=whiteThreshold&&g>=whiteThreshold&&b2>=whiteThreshold){let projection=x*cosAngle+y*sinAngle,maxProjection=width*cosAngle+height2*sinAngle,hue=(projection/maxProjection*repeats+this.time*0.1)%1,[newR,newG,newB]=this.hsvToRgb(hue,saturation,value);setRgb(fg2,colorIndex,newR,newG,newB)}}}}function toU822(value){return Math.round(Math.max(0,Math.min(1,Number.isFinite(value)?value:0))*255)}function channel2(buffer2,index){return(buffer2[index]&255)/255}function setRgb2(buffer2,base,r,g,b2){let a=buffer2[base+3]&255;buffer2[base]=toU822(r),buffer2[base+1]=toU822(g),buffer2[base+2]=toU822(b2),buffer2[base+3]=a}function applyScanlines(buffer2,strength=0.8,step=2){if(strength===1||step<1)return;let{width,height:height2}=buffer2,affectedRows=Math.ceil(height2/step),cellCount=width*affectedRows,cellMask=new Float32Array(cellCount*3),maskIdx=0;for(let y=0;y<height2;y+=step)for(let x=0;x<width;x++)cellMask[maskIdx++]=x,cellMask[maskIdx++]=y,cellMask[maskIdx++]=1;let s2=strength,matrix=new Float32Array([s2,0,0,0,0,s2,0,0,0,0,s2,0,0,0,0,1]);buffer2.colorMatrix(matrix,cellMask,1,2)}function applyInvert(buffer2,strength=1){if(strength===0)return;let matrix=new Float32Array([-1,0,0,1,0,-1,0,1,0,0,-1,1,0,0,0,1]);buffer2.colorMatrixUniform(matrix,strength,3)}function applyNoise(buffer2,strength=0.1){let{width,height:height2}=buffer2,size=width*height2;if(strength===0)return;let cellMask=new Float32Array(size*3),cellMaskIndex=0;for(let y=0;y<height2;y++)for(let x=0;x<width;x++)cellMask[cellMaskIndex++]=x,cellMask[cellMaskIndex++]=y,cellMask[cellMaskIndex++]=(Math.random()-0.5)*2;let b2=1+strength,matrix=new Float32Array([b2,0,0,0,0,b2,0,0,0,0,b2,0,0,0,0,1]);buffer2.colorMatrix(matrix,cellMask,1,3)}function applyChromaticAberration(buffer2,strength=1){let{width,height:height2}=buffer2,srcFg=Uint16Array.from(buffer2.buffers.fg),destFg=buffer2.buffers.fg,centerX=width/2,centerY=height2/2;for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let dx=x-centerX,dy=y-centerY,offset=Math.round(Math.sqrt(dx*dx+dy*dy)/Math.max(centerX,centerY)*strength),rX=Math.max(0,Math.min(width-1,x-offset)),bX=Math.max(0,Math.min(width-1,x+offset)),rIndex=(y*width+rX)*4,gIndex=(y*width+x)*4,bIndex=(y*width+bX)*4,destIndex=(y*width+x)*4;setRgb2(destFg,destIndex,channel2(srcFg,rIndex),channel2(srcFg,gIndex+1),channel2(srcFg,bIndex+2))}}function applyAsciiArt(buffer2,ramp=' .\'`^"",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',fgColor={r:1,g:1,b:1},bgColor={r:0,g:0,b:0}){let{width,height:height2}=buffer2,chars=buffer2.buffers.char,bg2=buffer2.buffers.bg,rampLength=ramp.length;for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let index=y*width+x,colorIndex=index*4,bgR=channel2(bg2,colorIndex),bgG=channel2(bg2,colorIndex+1),bgB=channel2(bg2,colorIndex+2),lum=0.299*bgR+0.587*bgG+0.114*bgB,rampIndex=Math.min(rampLength-1,Math.floor(lum*rampLength));chars[index]=ramp[rampIndex].charCodeAt(0)}let fgMatrix=new Float32Array([0,0,0,fgColor.r,0,0,0,fgColor.g,0,0,0,fgColor.b,0,0,0,1]),bgMatrix=new Float32Array([0,0,0,bgColor.r,0,0,0,bgColor.g,0,0,0,bgColor.b,0,0,0,1]);buffer2.colorMatrixUniform(fgMatrix,1,1),buffer2.colorMatrixUniform(bgMatrix,1,2)}function applyBrightness(buffer2,brightness=0,cellMask){if(brightness===0)return;let b2=brightness,matrix=new Float32Array([1,0,0,b2,0,1,0,b2,0,0,1,b2,0,0,0,1]);if(!cellMask||cellMask.length===0)buffer2.colorMatrixUniform(matrix,1,3);else buffer2.colorMatrix(matrix,cellMask,1,3)}function applyGain(buffer2,gain=1,cellMask){if(gain===1)return;let g=Math.max(0,gain),matrix=new Float32Array([g,0,0,0,0,g,0,0,0,0,g,0,0,0,0,1]);if(!cellMask||cellMask.length===0)buffer2.colorMatrixUniform(matrix,1,3);else buffer2.colorMatrix(matrix,cellMask,1,3)}function createSaturationMatrix(saturation){let s2=Math.max(0,saturation),sr=0.299*(1-s2),sg=0.587*(1-s2),sb=0.114*(1-s2),m00=sr+s2,m01=sg,m02=sb,m10=sr,m11=sg+s2,m12=sb,m20=sr,m21=sg,m22=sb+s2;return new Float32Array([m00,m01,m02,0,m10,m11,m12,0,m20,m21,m22,0,0,0,0,1])}function applySaturation(buffer2,cellMask,strength=1){if(strength===1||strength===0)return;let matrix=createSaturationMatrix(strength);if(!cellMask||cellMask.length===0)buffer2.colorMatrixUniform(matrix,1,3);else buffer2.colorMatrix(matrix,cellMask,1,3)}class BloomEffect{_threshold;_strength;_radius;constructor(threshold=0.8,strength=0.2,radius=2){this._threshold=Math.max(0,Math.min(1,threshold)),this._strength=Math.max(0,strength),this._radius=Math.max(0,Math.round(radius))}set threshold(newThreshold){this._threshold=Math.max(0,Math.min(1,newThreshold))}get threshold(){return this._threshold}set strength(newStrength){this._strength=Math.max(0,newStrength)}get strength(){return this._strength}set radius(newRadius){this._radius=Math.max(0,Math.round(newRadius))}get radius(){return this._radius}apply(buffer2){let threshold=this._threshold,strength=this._strength,radius=this._radius;if(strength<=0||radius<=0)return;let{width,height:height2}=buffer2,srcFg=Uint16Array.from(buffer2.buffers.fg),srcBg=Uint16Array.from(buffer2.buffers.bg),destFg=buffer2.buffers.fg,destBg=buffer2.buffers.bg,brightPixels=[];for(let y=0;y<height2;y++)for(let x=0;x<width;x++){let index=(y*width+x)*4,fgLum=0.299*channel2(srcFg,index)+0.587*channel2(srcFg,index+1)+0.114*channel2(srcFg,index+2),bgLum=0.299*channel2(srcBg,index)+0.587*channel2(srcBg,index+1)+0.114*channel2(srcBg,index+2),lum=Math.max(fgLum,bgLum);if(lum>threshold){let intensity=(lum-threshold)/(1-threshold+0.000001);brightPixels.push({x,y,intensity:Math.max(0,intensity)})}}if(brightPixels.length===0)return;destFg.set(srcFg),destBg.set(srcBg);for(let bright of brightPixels)for(let ky=-radius;ky<=radius;ky++)for(let kx=-radius;kx<=radius;kx++){if(kx===0&&ky===0)continue;let sampleX=bright.x+kx,sampleY=bright.y+ky;if(sampleX>=0&&sampleX<width&&sampleY>=0&&sampleY<height2){let distSq=kx*kx+ky*ky,radiusSq=radius*radius;if(distSq<=radiusSq){let falloff=1-distSq/radiusSq,bloomAmount=bright.intensity*strength*falloff,destIndex=(sampleY*width+sampleX)*4;setRgb2(destFg,destIndex,Math.min(1,channel2(destFg,destIndex)+bloomAmount),Math.min(1,channel2(destFg,destIndex+1)+bloomAmount),Math.min(1,channel2(destFg,destIndex+2)+bloomAmount)),setRgb2(destBg,destIndex,Math.min(1,channel2(destBg,destIndex)+bloomAmount),Math.min(1,channel2(destBg,destIndex+1)+bloomAmount),Math.min(1,channel2(destBg,destIndex+2)+bloomAmount))}}}}}function captureInitialValues(item){if(!item.properties)return;if(!item.initialValues||item.initialValues.length===0){let initialValues=[];for(let i2=0;i2<item.target.length;i2++){let target=item.target[i2],targetInitialValues={};for(let key of Object.keys(item.properties))if(typeof target[key]==="number")targetInitialValues[key]=target[key];initialValues.push(targetInitialValues)}item.initialValues=initialValues}}function applyAnimationAtProgress(item,progress,reversed,timelineTime,deltaTime=0){if(!item.properties||!item.initialValues)return;let easedProgress=(easingFunctions[item.ease||"linear"]||easingFunctions.linear)(Math.max(0,Math.min(1,progress))),finalProgress=reversed?1-easedProgress:easedProgress;for(let i2=0;i2<item.target.length;i2++){let target=item.target[i2],targetInitialValues=item.initialValues[i2];if(!targetInitialValues)continue;for(let[key,endValue]of Object.entries(item.properties)){let startValue=targetInitialValues[key],newValue=startValue+(endValue-startValue)*finalProgress;target[key]=newValue}}if(item.onUpdate){let animation={targets:item.target,progress:easedProgress,currentTime:timelineTime,deltaTime};item.onUpdate(animation)}}function evaluateAnimation(item,timelineTime,deltaTime=0){if(timelineTime<item.startTime)return;let animationTime=timelineTime-item.startTime,duration=item.duration||0;if(timelineTime>=item.startTime&&!item.started){if(captureInitialValues(item),item.onStart)item.onStart();item.started=!0}if(duration===0){if(!item.completed){if(applyAnimationAtProgress(item,1,!1,timelineTime,deltaTime),item.onComplete)item.onComplete();item.completed=!0}return}let maxLoops=!item.loop||item.loop===1?1:typeof item.loop==="number"?item.loop:1/0,loopDelay=item.loopDelay||0,cycleTime=duration+loopDelay,currentCycle=Math.floor(animationTime/cycleTime),timeInCycle=animationTime%cycleTime;if(item.onLoop&&item.currentLoop!==void 0&&currentCycle>item.currentLoop&&currentCycle<maxLoops)item.onLoop();if(item.currentLoop=currentCycle,item.onComplete&&!item.completed&&currentCycle===maxLoops-1&&timeInCycle>=duration){let finalLoopReversed=(item.alternate||!1)&&currentCycle%2===1;applyAnimationAtProgress(item,1,finalLoopReversed,timelineTime,deltaTime),item.onComplete(),item.completed=!0;return}if(currentCycle>=maxLoops){if(!item.completed){let finalReversed=(item.alternate||!1)&&(maxLoops-1)%2===1;if(applyAnimationAtProgress(item,1,finalReversed,timelineTime,deltaTime),item.onComplete)item.onComplete();item.completed=!0}return}if(timeInCycle===0&&animationTime>0&&currentCycle<maxLoops)currentCycle=currentCycle-1,timeInCycle=cycleTime;if(timeInCycle>=duration){let isReversed2=(item.alternate||!1)&&currentCycle%2===1;applyAnimationAtProgress(item,1,isReversed2,timelineTime,deltaTime);return}let progress=timeInCycle/duration,isReversed=(item.alternate||!1)&&currentCycle%2===1;applyAnimationAtProgress(item,progress,isReversed,timelineTime,deltaTime)}function evaluateCallback(item,timelineTime){if(!item.executed&&timelineTime>=item.startTime&&item.callback)item.callback(),item.executed=!0}function evaluateTimelineSync(item,timelineTime,deltaTime=0){if(!item.timeline)return;if(timelineTime<item.startTime)return;if(!item.timelineStarted){item.timelineStarted=!0,item.timeline.play();let overshoot=timelineTime-item.startTime;item.timeline.update(overshoot);return}item.timeline.update(deltaTime)}function evaluateItem(item,timelineTime,deltaTime=0){if(item.type==="animation")evaluateAnimation(item,timelineTime,deltaTime);else if(item.type==="callback")evaluateCallback(item,timelineTime)}class Timeline{items=[];subTimelines=[];currentTime=0;isPlaying=!1;isComplete=!1;duration;loop;synced=!1;autoplay;onComplete;onPause;stateChangeListeners=[];constructor(options={}){this.duration=options.duration||1000,this.loop=options.loop===!0,this.autoplay=options.autoplay!==!1,this.onComplete=options.onComplete,this.onPause=options.onPause}addStateChangeListener(listener){this.stateChangeListeners.push(listener)}removeStateChangeListener(listener){this.stateChangeListeners=this.stateChangeListeners.filter((l)=>l!==listener)}notifyStateChange(){for(let listener of this.stateChangeListeners)listener(this)}add(target,properties,startTime=0){let resolvedStartTime=typeof startTime==="string"?0:startTime,animationProperties={};for(let key in properties)if(!["duration","ease","onUpdate","onComplete","onStart","onLoop","loop","loopDelay","alternate"].includes(key)){if(typeof properties[key]==="number")animationProperties[key]=properties[key]}return this.items.push({type:"animation",startTime:resolvedStartTime,target:Array.isArray(target)?target:[target],properties:animationProperties,initialValues:[],duration:properties.duration!==void 0?properties.duration:1000,ease:properties.ease||"linear",loop:properties.loop,loopDelay:properties.loopDelay||0,alternate:properties.alternate||!1,onUpdate:properties.onUpdate,onComplete:properties.onComplete,onStart:properties.onStart,onLoop:properties.onLoop,completed:!1,started:!1,currentLoop:0,once:properties.once??!1}),this}once(target,properties){return this.add(target,{...properties,once:!0},this.currentTime),this}call(callback,startTime=0){let resolvedStartTime=typeof startTime==="string"?0:startTime;return this.items.push({type:"callback",startTime:resolvedStartTime,callback,executed:!1}),this}sync(timeline,startTime=0){if(timeline.synced)throw Error("Timeline already synced");return this.subTimelines.push({type:"timeline",startTime,timeline}),timeline.synced=!0,this}play(){if(this.isComplete)return this.restart();return this.subTimelines.forEach((subTimeline)=>{if(subTimeline.timelineStarted)subTimeline.timeline.play()}),this.isPlaying=!0,this.notifyStateChange(),this}pause(){if(this.subTimelines.forEach((subTimeline)=>{subTimeline.timeline.pause()}),this.isPlaying=!1,this.onPause)this.onPause();return this.notifyStateChange(),this}resetItems(){this.items.forEach((item)=>{if(item.type==="callback")item.executed=!1;else if(item.type==="animation")item.completed=!1,item.started=!1,item.currentLoop=0}),this.subTimelines.forEach((subTimeline)=>{if(subTimeline.timelineStarted=!1,subTimeline.timeline)subTimeline.timeline.restart(),subTimeline.timeline.pause()})}restart(){return this.isComplete=!1,this.currentTime=0,this.isPlaying=!0,this.resetItems(),this.notifyStateChange(),this}update(deltaTime){for(let subTimeline of this.subTimelines)evaluateTimelineSync(subTimeline,this.currentTime+deltaTime,deltaTime);if(!this.isPlaying)return;this.currentTime+=deltaTime;for(let item of this.items)evaluateItem(item,this.currentTime,deltaTime);for(let i2=this.items.length-1;i2>=0;i2--){let item=this.items[i2];if(item.type==="animation"&&item.once&&item.completed)this.items.splice(i2,1)}if(this.loop&&this.currentTime>=this.duration){let overshoot=this.currentTime%this.duration;if(this.resetItems(),this.currentTime=0,overshoot>0)this.update(overshoot)}else if(!this.loop&&this.currentTime>=this.duration){if(this.currentTime=this.duration,this.isPlaying=!1,this.isComplete=!0,this.onComplete)this.onComplete();this.notifyStateChange()}}}class TimelineEngine{timelines=new Set;renderer=null;frameCallback=null;isLive=!1;defaults={frameRate:60};attach(renderer){if(this.renderer)this.detach();this.renderer=renderer,this.frameCallback=async(deltaTime)=>{this.update(deltaTime)},renderer.setFrameCallback(this.frameCallback)}detach(){if(this.renderer&&this.frameCallback){if(this.renderer.removeFrameCallback(this.frameCallback),this.isLive)this.renderer.dropLive(),this.isLive=!1}this.renderer=null,this.frameCallback=null}updateLiveState(){if(!this.renderer)return;let hasRunningTimelines=Array.from(this.timelines).some((timeline)=>!timeline.synced&&timeline.isPlaying&&!timeline.isComplete);if(hasRunningTimelines&&!this.isLive)this.renderer.requestLive(),this.isLive=!0;else if(!hasRunningTimelines&&this.isLive)this.renderer.dropLive(),this.isLive=!1}onTimelineStateChange=(timeline)=>{this.updateLiveState()};register(timeline){if(!this.timelines.has(timeline))this.timelines.add(timeline),timeline.addStateChangeListener(this.onTimelineStateChange),this.updateLiveState()}unregister(timeline){if(this.timelines.has(timeline))this.timelines.delete(timeline),timeline.removeStateChangeListener(this.onTimelineStateChange),this.updateLiveState()}clear(){for(let timeline of this.timelines)timeline.removeStateChangeListener(this.onTimelineStateChange);this.timelines.clear(),this.updateLiveState()}update(deltaTime){for(let timeline of this.timelines)if(!timeline.synced)timeline.update(deltaTime)}}function createTimeline(options={}){let timeline=new Timeline(options);if(options.autoplay!==!1)timeline.play();return engine.register(timeline),timeline}function normalizeError(error2){if(error2 instanceof Error)return error2;if(typeof error2==="string")return Error(error2);return Error(`Unknown plugin error: ${String(error2)}`)}class SlotRegistry{plugins=[];sortedPluginsCache=null;listeners=new Set;errorListeners=new Set;pluginErrors=[];registrationOrder=0;batchDepth=0;batchedNotify=!1;rendererInstance;hostContext;options;constructor(renderer,context,options={}){this.rendererInstance=renderer,this.hostContext=context,this.options={debugPluginErrors:options.debugPluginErrors??DEFAULT_DEBUG_PLUGIN_ERRORS,maxPluginErrors:options.maxPluginErrors??DEFAULT_MAX_PLUGIN_ERRORS,onPluginError:options.onPluginError}}get renderer(){return this.rendererInstance}get context(){return this.hostContext}configure(options){if("debugPluginErrors"in options)this.options.debugPluginErrors=options.debugPluginErrors??DEFAULT_DEBUG_PLUGIN_ERRORS;if("maxPluginErrors"in options)this.options.maxPluginErrors=options.maxPluginErrors??DEFAULT_MAX_PLUGIN_ERRORS;if("onPluginError"in options)this.options.onPluginError=options.onPluginError}register(plugin){if(this.plugins.some((entry2)=>entry2.plugin.id===plugin.id))throw Error(`Plugin with id "${plugin.id}" is already registered`);try{plugin.setup?.(this.hostContext,this.rendererInstance)}catch(error2){return this.reportPluginError({pluginId:plugin.id,phase:"setup",source:"registry",error:error2}),noop3}return this.plugins.push({plugin,registrationOrder:this.registrationOrder++,cachedOrder:plugin.order??0,cachedId:plugin.id}),this.invalidateSortedPluginsCache(),this.notifyListeners(),()=>{this.unregister(plugin.id)}}unregister(id){let index=this.plugins.findIndex((entry22)=>entry22.plugin.id===id);if(index===-1)return!1;let[entry2]=this.plugins.splice(index,1);this.invalidateSortedPluginsCache();try{entry2?.plugin.dispose?.()}catch(error2){this.reportPluginError({pluginId:id,phase:"dispose",source:"registry",error:error2})}return this.notifyListeners(),!0}updateOrder(id,order){let entry2=this.plugins.find((pluginEntry)=>pluginEntry.plugin.id===id);if(!entry2)return!1;if((entry2.plugin.order??0)===order)return!0;return entry2.plugin.order=order,entry2.cachedOrder=order,this.invalidateSortedPluginsCache(),this.notifyListeners(),!0}clear(){if(this.plugins.length===0)return;let plugins=[...this.plugins];this.plugins=[],this.invalidateSortedPluginsCache();for(let entry2 of plugins)try{entry2.plugin.dispose?.()}catch(error2){this.reportPluginError({pluginId:entry2.plugin.id,phase:"dispose",source:"registry",error:error2})}this.notifyListeners()}subscribe(listener){return this.listeners.add(listener),()=>{this.listeners.delete(listener)}}onPluginError(listener){return this.errorListeners.add(listener),()=>{this.errorListeners.delete(listener)}}batch(run){this.batchDepth+=1;try{return run()}finally{if(this.batchDepth-=1,this.batchDepth===0&&this.batchedNotify)this.batchedNotify=!1,this.flushListeners()}}getPluginErrors(){return this.pluginErrors}clearPluginErrors(){this.pluginErrors=[]}reportPluginError(report2){let event={pluginId:report2.pluginId,slot:report2.slot,phase:report2.phase,source:report2.source??"registry",error:normalizeError(report2.error),timestamp:Date.now()};if(this.pluginErrors.push(event),this.pluginErrors.length>this.options.maxPluginErrors)this.pluginErrors.splice(0,this.pluginErrors.length-this.options.maxPluginErrors);if(this.options.debugPluginErrors){let slotLabel=event.slot?` slot="${event.slot}"`:"";console.debug(`[SlotRegistry][PluginError] plugin="${event.pluginId}" phase="${event.phase}" source="${event.source}"${slotLabel}`),console.debug(event.error)}for(let listener of this.errorListeners)try{listener(event)}catch(error2){console.error("Error in plugin error listener:",error2)}try{this.options.onPluginError?.(event)}catch(error2){console.error("Error in plugin error callback:",error2)}return event}resolve(slot){return this.resolveEntries(slot).map((entry2)=>entry2.renderer)}resolveEntries(slot){let slotRenderers=[];for(let entry2 of this.getSortedPlugins()){let renderer=entry2.plugin.slots[slot];if(renderer)slotRenderers.push({id:entry2.plugin.id,renderer})}return slotRenderers}getSortedPlugins(){if(this.syncPluginSortMetadata(),this.sortedPluginsCache)return this.sortedPluginsCache;return this.sortedPluginsCache=[...this.plugins].sort((left,right)=>{let leftOrder=left.cachedOrder,rightOrder=right.cachedOrder;if(leftOrder!==rightOrder)return leftOrder-rightOrder;if(left.registrationOrder!==right.registrationOrder)return left.registrationOrder-right.registrationOrder;return left.cachedId.localeCompare(right.cachedId)}),this.sortedPluginsCache}syncPluginSortMetadata(){let hasChanges=!1;for(let entry2 of this.plugins){let nextOrder=entry2.plugin.order??0,nextId=entry2.plugin.id;if(entry2.cachedOrder!==nextOrder||entry2.cachedId!==nextId)entry2.cachedOrder=nextOrder,entry2.cachedId=nextId,hasChanges=!0}if(hasChanges)this.invalidateSortedPluginsCache()}invalidateSortedPluginsCache(){this.sortedPluginsCache=null}notifyListeners(){if(this.batchDepth>0){this.batchedNotify=!0;return}this.flushListeners()}flushListeners(){for(let listener of this.listeners)try{listener()}catch(error2){console.error("Error in slot registry listener:",error2)}}}function getSlotRegistryStore(renderer){let existingStore=slotRegistriesByRenderer.get(renderer);if(existingStore)return existingStore;let createdStore=new Map;return slotRegistriesByRenderer.set(renderer,createdStore),renderer.once("destroy",()=>{for(let registry3 of createdStore.values())try{registry3.clear()}catch(error2){console.error("Error disposing slot registry:",error2)}createdStore.clear(),slotRegistriesByRenderer.delete(renderer)}),createdStore}function createSlotRegistry(renderer,key,context,options={}){let store=getSlotRegistryStore(renderer),existing=store.get(key);if(existing){if(existing.context!==context)throw Error(`createSlotRegistry called with a different context for renderer key "${key}". Reuse the original context object.`);let typedExisting=existing;return typedExisting.configure(options),typedExisting}let created=new SlotRegistry(renderer,context,options);return store.set(key,created),created}function isCoreManagedSlot(contribution){return typeof contribution==="object"&&contribution!==null&&"render"in contribution}function toCorePlugin(plugin){let slots={};for(let[slotName,contribution]of Object.entries(plugin.slots)){let wrappedRenderer=(ctx,data)=>{if(isCoreManagedSlot(contribution))return contribution.render(ctx,data);return contribution(ctx,data)};if(isCoreManagedSlot(contribution))wrappedRenderer.__coreSlotOwnership="plugin",wrappedRenderer.__coreManagedSlot=contribution;else wrappedRenderer.__coreSlotOwnership="host";slots[slotName]=wrappedRenderer}return{id:plugin.id,order:plugin.order,setup:plugin.setup,dispose:plugin.dispose,slots}}function asArray(value){if(!value)return[];return Array.isArray(value)?[...value]:[value]}function ensureValidNode(node,pluginId,mount){if(!node)throw Error(`Plugin "${pluginId}" did not return a renderable node`);if(typeof node.then==="function")throw Error(`Plugin "${pluginId}" returned an async value. Core slots require synchronous renderers.`);if(!(node instanceof BaseRenderable))throw Error(`Plugin "${pluginId}" must return a BaseRenderable`);if(node===mount)throw Error(`Plugin "${pluginId}" returned the slot mount container as its node`);if(node.parent&&node.parent!==mount)throw Error(`Plugin "${pluginId}" returned a renderable already attached to another parent`)}function createCoreSlotRegistry(renderer,context,options={}){return createSlotRegistry(renderer,"core:slot-registry",context,options)}function registerCorePlugin(registry3,plugin){return registry3.register(toCorePlugin(plugin))}function resolveCoreSlot(registry3,slot){return resolveCoreSlotEntries(registry3,slot).map((entry2)=>{return{id:entry2.id,renderer:entry2.renderer}})}function resolveCoreSlotEntries(registry3,slot){return registry3.resolveEntries(slot).map((entry2)=>{let wrappedRenderer=entry2.renderer;return{id:entry2.id,renderer:(ctx,data)=>wrappedRenderer(ctx,data),ownership:wrappedRenderer.__coreSlotOwnership??"host",managedSlot:wrappedRenderer.__coreManagedSlot}})}function toPointer2(value){if(typeof value==="bigint"){if(value>BigInt(Number.MAX_SAFE_INTEGER))throw Error("Pointer exceeds safe integer range");return Number(value)}return value}function toNumber2(value){return typeof value==="bigint"?Number(value):value}class NativeSpanFeed{static create(options){let lib=resolveRenderLib(),streamPtr=lib.createNativeSpanFeed(options),stream=new NativeSpanFeed(streamPtr);lib.registerNativeSpanFeedStream(streamPtr,stream.eventHandler);let status=lib.attachNativeSpanFeed(streamPtr);if(status!==0)throw lib.unregisterNativeSpanFeedStream(streamPtr),lib.destroyNativeSpanFeed(streamPtr),Error(`Failed to attach stream: ${status}`);return stream}static attach(streamPtr,_options){let lib=resolveRenderLib(),ptr5=toPointer2(streamPtr),stream=new NativeSpanFeed(ptr5);lib.registerNativeSpanFeedStream(ptr5,stream.eventHandler);let status=lib.attachNativeSpanFeed(ptr5);if(status!==0)throw lib.unregisterNativeSpanFeedStream(ptr5),Error(`Failed to attach stream: ${status}`);return stream}streamPtr;lib=resolveRenderLib();eventHandler;chunkMap=new Map;chunkSizes=new Map;dataHandlers=new Set;errorHandlers=new Set;drainBuffer=null;stateBuffer=null;closed=!1;destroyed=!1;draining=!1;pendingDataAvailable=!1;pendingClose=!1;closing=!1;pendingAsyncHandlers=0;inCallback=!1;closeQueued=!1;constructor(streamPtr){this.streamPtr=streamPtr,this.eventHandler=(eventId,arg0,arg1)=>{this.handleEvent(eventId,arg0,arg1)},this.ensureDrainBuffer()}ensureDrainBuffer(){if(this.drainBuffer)return;let capacity=256;this.drainBuffer=new Uint8Array(capacity*SpanInfoStruct.size)}onData(handler){if(this.dataHandlers.add(handler),this.pendingDataAvailable)this.pendingDataAvailable=!1,this.drainAll();return()=>this.dataHandlers.delete(handler)}onError(handler){return this.errorHandlers.add(handler),()=>this.errorHandlers.delete(handler)}close(){if(this.destroyed)return;if(this.inCallback||this.draining||this.pendingAsyncHandlers>0){if(this.pendingClose=!0,!this.closeQueued)this.closeQueued=!0,queueMicrotask(()=>{this.closeQueued=!1,this.processPendingClose()});return}this.performClose()}processPendingClose(){if(!this.pendingClose||this.destroyed)return;if(this.inCallback||this.draining||this.pendingAsyncHandlers>0)return;this.pendingClose=!1,this.performClose()}performClose(){if(this.closing)return;if(this.closing=!0,!this.closed){if(this.lib.streamClose(this.streamPtr)!==0){this.closing=!1;return}this.closed=!0}this.finalizeDestroy()}finalizeDestroy(){if(this.destroyed)return;this.lib.unregisterNativeSpanFeedStream(this.streamPtr),this.lib.destroyNativeSpanFeed(this.streamPtr),this.destroyed=!0,this.chunkMap.clear(),this.chunkSizes.clear(),this.stateBuffer=null,this.drainBuffer=null,this.dataHandlers.clear(),this.errorHandlers.clear(),this.pendingDataAvailable=!1}handleEvent(eventId,arg0,arg1){this.inCallback=!0;try{switch(eventId){case 8:{let len=toNumber2(arg1);if(len>0&&arg0){let buffer2=toArrayBuffer5(arg0,0,len);this.stateBuffer=new Uint8Array(buffer2)}break}case 7:{if(this.closing)break;if(this.dataHandlers.size===0){this.pendingDataAvailable=!0;break}this.drainAll();break}case 2:{let chunkLen=toNumber2(arg1);if(chunkLen>0&&arg0){if(!this.chunkMap.has(arg0)){let buffer2=toArrayBuffer5(arg0,0,chunkLen);this.chunkMap.set(arg0,buffer2)}this.chunkSizes.set(arg0,chunkLen)}break}case 6:{let code=arg0;for(let handler of this.errorHandlers)handler(code);break}case 5:{this.closed=!0;break}default:break}}finally{this.inCallback=!1}}decrementRefcount(chunkIndex){if(this.stateBuffer&&chunkIndex<this.stateBuffer.length){let prev=this.stateBuffer[chunkIndex];this.stateBuffer[chunkIndex]=prev>0?prev-1:0}}drainOnce(){if(!this.drainBuffer||this.draining||this.pendingClose)return 0;let capacity=Math.floor(this.drainBuffer.byteLength/SpanInfoStruct.size);if(capacity===0)return 0;let count=this.lib.streamDrainSpans(this.streamPtr,this.drainBuffer,capacity);if(count===0)return 0;this.draining=!0;let spans=SpanInfoStruct.unpackList(this.drainBuffer.buffer,count),firstError=null;try{for(let span of spans){if(span.len===0)continue;let buffer2=this.chunkMap.get(span.chunkPtr);if(!buffer2){let size=this.chunkSizes.get(span.chunkPtr);if(!size)continue;buffer2=toArrayBuffer5(span.chunkPtr,0,size),this.chunkMap.set(span.chunkPtr,buffer2)}if(span.offset+span.len>buffer2.byteLength)continue;let slice=new Uint8Array(buffer2,span.offset,span.len),asyncResults=null;for(let handler of this.dataHandlers)try{let result2=handler(slice);if(result2&&typeof result2.then==="function")asyncResults??=[],asyncResults.push(result2)}catch(e){firstError??=e}let shouldStopAfterThisSpan=this.pendingClose;if(asyncResults){let chunkIndex=span.chunkIndex;this.pendingAsyncHandlers+=1,Promise.allSettled(asyncResults).then(()=>{this.decrementRefcount(chunkIndex),this.pendingAsyncHandlers-=1,this.processPendingClose()})}else this.decrementRefcount(span.chunkIndex);if(shouldStopAfterThisSpan)break}}finally{this.draining=!1}if(firstError)throw firstError;return count}drainAll(){let count=this.drainOnce();while(count>0)count=this.drainOnce()}}function Generic(props,...children){return h(VRenderable,props||{},...children)}function Box(props,...children){return h(BoxRenderable,props||{},...children)}function Text(props,...children){return h(TextRenderable,props||{},...children)}function ASCIIFont(props,...children){return h(ASCIIFontRenderable,props||{},...children)}function Input(props,...children){return h(InputRenderable,props||{},...children)}function Select(props,...children){return h(SelectRenderable,props||{},...children)}function TabSelect(props,...children){return h(TabSelectRenderable,props||{},...children)}function FrameBuffer(props,...children){return h(FrameBufferRenderable,props,...children)}function Code(props,...children){return h(CodeRenderable,props,...children)}function ScrollBox(props,...children){return h(ScrollBoxRenderable,props||{},...children)}function StyledText2(props,...children){let styledProps=props,textNodeOptions={...styledProps,attributes:styledProps?.attributes??0},textNode=new TextNodeRenderable(textNodeOptions);for(let child of children)textNode.add(child);return textNode}function darkenColor(color2){return RGBA.fromValues(color2.r*0.8,color2.g*0.8,color2.b*0.8,color2.a)}function parsePatch(uniDiff){let diffstr=uniDiff.split(/\n/),list2=[],i2=0;function parseIndex(){let index={};list2.push(index);while(i2<diffstr.length){let line=diffstr[i2];if(/^(---|\+\+\+|@@)\s/.test(line))break;let header=/^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line);if(header)index.index=header[1];i2++}parseFileHeader(index),parseFileHeader(index),index.hunks=[];while(i2<diffstr.length){let line=diffstr[i2];if(/^(Index:\s|diff\s|---\s|\+\+\+\s|===================================================================)/.test(line))break;else if(/^@@/.test(line))index.hunks.push(parseHunk());else if(line)throw Error("Unknown line "+(i2+1)+" "+JSON.stringify(line));else i2++}}function parseFileHeader(index){let fileHeader=/^(---|\+\+\+)\s+(.*)\r?$/.exec(diffstr[i2]);if(fileHeader){let data=fileHeader[2].split("\t",2),header=(data[1]||"").trim(),fileName=data[0].replace(/\\\\/g,"\\");if(/^".*"$/.test(fileName))fileName=fileName.substr(1,fileName.length-2);if(fileHeader[1]==="---")index.oldFileName=fileName,index.oldHeader=header;else index.newFileName=fileName,index.newHeader=header;i2++}}function parseHunk(){var _a;let chunkHeaderIndex=i2,chunkHeaderLine=diffstr[i2++],chunkHeader=chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/),hunk={oldStart:+chunkHeader[1],oldLines:typeof chunkHeader[2]>"u"?1:+chunkHeader[2],newStart:+chunkHeader[3],newLines:typeof chunkHeader[4]>"u"?1:+chunkHeader[4],lines:[]};if(hunk.oldLines===0)hunk.oldStart+=1;if(hunk.newLines===0)hunk.newStart+=1;let addCount=0,removeCount=0;for(;i2<diffstr.length&&(removeCount<hunk.oldLines||addCount<hunk.newLines||((_a=diffstr[i2])===null||_a===void 0?void 0:_a.startsWith("\\")));i2++){let operation=diffstr[i2].length==0&&i2!=diffstr.length-1?" ":diffstr[i2][0];if(operation==="+"||operation==="-"||operation===" "||operation==="\\"){if(hunk.lines.push(diffstr[i2]),operation==="+")addCount++;else if(operation==="-")removeCount++;else if(operation===" ")addCount++,removeCount++}else throw Error(`Hunk at line ${chunkHeaderIndex+1} contained invalid line ${diffstr[i2]}`)}if(!addCount&&hunk.newLines===1)hunk.newLines=0;if(!removeCount&&hunk.oldLines===1)hunk.oldLines=0;if(addCount!==hunk.newLines)throw Error("Added line count did not match for hunk at line "+(chunkHeaderIndex+1));if(removeCount!==hunk.oldLines)throw Error("Removed line count did not match for hunk at line "+(chunkHeaderIndex+1));return hunk}while(i2<diffstr.length)parseIndex();return list2}function L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function Z(u){T=u}function k(u,e=""){let t2=typeof u=="string"?u:u.source,n={replace:(r,i2)=>{let s2=typeof i2=="string"?i2:i2.source;return s2=s2.replace(m.caret,"$1"),t2=t2.replace(r,s2),n},getRegex:()=>new RegExp(t2,e)};return n}function w(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function X(u){try{u=encodeURI(u).replace(m.percentDecode,"%")}catch{return null}return u}function J(u,e){let t2=u.replace(m.findPipe,(i2,s2,a)=>{let o=!1,l=s2;for(;--l>=0&&a[l]==="\\";)o=!o;return o?"|":" |"}),n=t2.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push("");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,"|");return n}function z(u,e,t2){let n=u.length;if(n===0)return"";let r=0;for(;r<n;){let i2=u.charAt(n-r-1);if(i2===e&&!t2)r++;else if(i2!==e&&t2)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t2=0;for(let n=0;n<u.length;n++)if(u[n]==="\\")n++;else if(u[n]===e[0])t2++;else if(u[n]===e[1]&&(t2--,t2<0))return n;return t2>0?-2:-1}function ge(u,e,t2,n,r){let i2=e.href,s2=e.title||null,a=u[1].replace(r.other.outputLinkReplace,"$1");n.state.inLink=!0;let o={type:u[0].charAt(0)==="!"?"image":"link",raw:t2,href:i2,title:s2,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function Je(u,e,t2){let n=u.match(t2.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`
3097
3117
  `).map((i2)=>{let s2=i2.match(t2.other.beginningSpace);if(s2===null)return i2;let[a]=s2;return a.length>=r.length?i2.slice(r.length):i2}).join(`
3098
3118
  `)}function d(u3,e){return _.parse(u3,e)}function parseMarkdownIncremental(newContent,prevState,trailingUnstable=2){if(!prevState||prevState.tokens.length===0)try{let tokens2=x.lex(newContent,{gfm:!0});return{content:newContent,tokens:tokens2,stableTokenCount:Math.max(0,tokens2.length-trailingUnstable)}}catch{return{content:newContent,tokens:[],stableTokenCount:0}}let offset=0,reuseCount=0;for(let token of prevState.tokens){let tokenLength=token.raw.length;if(offset+tokenLength<=newContent.length&&newContent.startsWith(token.raw,offset))reuseCount++,offset+=tokenLength;else break}reuseCount=Math.max(0,reuseCount-trailingUnstable),offset=0;for(let i2=0;i2<reuseCount;i2++)offset+=prevState.tokens[i2].raw.length;let stableTokens=prevState.tokens.slice(0,reuseCount),remainingContent=newContent.slice(offset);if(!remainingContent)return{content:newContent,tokens:stableTokens,stableTokenCount:stableTokens.length};try{let newTokens=x.lex(remainingContent,{gfm:!0});return{content:newContent,tokens:[...stableTokens,...newTokens],stableTokenCount:trailingUnstable===0?stableTokens.length+newTokens.length:stableTokens.length}}catch{try{let fullTokens=x.lex(newContent,{gfm:!0});return{content:newContent,tokens:fullTokens,stableTokenCount:0}}catch{return{content:newContent,tokens:[],stableTokenCount:0}}}}function colorsEqual(left,right){if(!left||!right)return left===right;return left.equals(right)}function pickScrollBoxPadding(options){if(!options)return{};let picked={};for(let key of SCROLLBOX_PADDING_KEYS){let value=options[key];if(value!==void 0)picked[key]=value}return picked}function stripScrollBoxPadding(options){let sanitized={...options};for(let key of SCROLLBOX_PADDING_KEYS)delete sanitized[key];return sanitized}function calculateDynamicHeight(showUnderline,showDescription){let height2=1;if(showUnderline)height2+=1;if(showDescription)height2+=1;return height2}var exports_src22,VignetteEffect,SEPIA_MATRIX,PROTANOPIA_SIM_MATRIX,DEUTERANOPIA_SIM_MATRIX,TRITANOPIA_SIM_MATRIX,ACHROMATOPSIA_MATRIX,PROTANOPIA_COMP_MATRIX,DEUTERANOPIA_COMP_MATRIX,TRITANOPIA_COMP_MATRIX,TECHNICOLOR_MATRIX,SOLARIZATION_MATRIX,SYNTHWAVE_MATRIX,GREENSCALE_MATRIX,GRAYSCALE_MATRIX,INVERT_MATRIX,easingFunctions,engine,noop3=()=>{},DEFAULT_DEBUG_PLUGIN_ERRORS=!1,DEFAULT_MAX_PLUGIN_ERRORS=100,slotRegistriesByRenderer,SlotRenderable,FrameBufferRenderable,ASCIIFontRenderable,vstyles,VRenderable,DEFAULT_GUTTER_FG="#888888",DEFAULT_GUTTER_BG="transparent",GutterRenderable,LineNumberRenderable,DiffRenderable,defaultTextareaKeyBindings,TextareaRenderable,InputRenderableEvents,InputRenderable,MEASURE_HEIGHT=1e4,TextTableRenderable,T,C,me,m,xe,be,Re,I,Te,N,re,se,Oe,Q,we,F,ye,Pe,v="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",j,Se,ie,$e,U,te,_e,Le,Me,ze,oe,Ae,D,K,ae,Ce,le,Ie,Ee,Be,ue,qe,ve,pe="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",De,He,Ze,Ge,Ne,Qe,Fe,q,je,ce,he,Ue,ne,W,Ke,G,We,E,M,Xe,ke=(u)=>Xe[u],y=class{options;rules;lexer;constructor(e){this.options=e||T}space(e){let t2=this.rules.block.newline.exec(e);if(t2&&t2[0].length>0)return{type:"space",raw:t2[0]}}code(e){let t2=this.rules.block.code.exec(e);if(t2){let n=t2[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t2[0],codeBlockStyle:"indented",text:this.options.pedantic?n:z(n,`
3099
3119
  `)}}}fences(e){let t2=this.rules.block.fences.exec(e);if(t2){let n=t2[0],r=Je(n,t2[3]||"",this.rules);return{type:"code",raw:n,lang:t2[2]?t2[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t2[2],text:r}}}heading(e){let t2=this.rules.block.heading.exec(e);if(t2){let n=t2[2].trim();if(this.rules.other.endingHash.test(n)){let r=z(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:t2[0],depth:t2[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t2=this.rules.block.hr.exec(e);if(t2)return{type:"hr",raw:z(t2[0],`
@@ -4161,7 +4181,30 @@ Genie Scheduler Daemon`),console.log("\u2500".repeat(50)),console.log(` Status:
4161
4181
  (showing last ${lines} of ${allLines.length} entries)`)}async function tailFollow(filePath,initialLines){let{watch:watch2}=await import("fs");tailStatic(filePath,initialLines),console.log(`
4162
4182
  --- following (Ctrl+C to exit) ---
4163
4183
  `);let lastSize=existsSync52(filePath)?readFileSync34(filePath).length:0,watcher2=watch2(filePath,()=>{try{let content=readFileSync34(filePath,"utf-8");if(content.length>lastSize){let newLines=content.slice(lastSize).trim().split(`
4164
- `).filter(Boolean);for(let line of newLines)printLogLine(line);lastSize=content.length}}catch{}});process.on("SIGINT",()=>{watcher2.close(),process.exit(0)}),await new Promise(()=>{})}function printLogLine(raw){try{let entry2=JSON.parse(raw),ts3=entry2.timestamp?new Date(entry2.timestamp).toLocaleTimeString("en-US",{hour12:!1}):"??:??:??",level=(entry2.level??"info").toUpperCase().padEnd(5),event=entry2.event??"unknown",extras=Object.entries(entry2).filter(([k])=>!["timestamp","level","event"].includes(k)).map(([k,v])=>`${k}=${typeof v==="object"?JSON.stringify(v):v}`).join(" ");console.log(`${ts3} ${level} ${event}${extras?` ${extras}`:""}`)}catch{console.log(raw)}}function formatUptime(ms){let seconds=Math.floor(ms/1000),minutes=Math.floor(seconds/60),hours=Math.floor(minutes/60),days=Math.floor(hours/24);if(days>0)return`${days}d ${hours%24}h ${minutes%60}m`;if(hours>0)return`${hours}h ${minutes%60}m`;if(minutes>0)return`${minutes}m ${seconds%60}s`;return`${seconds}s`}function registerDaemonCommands(program2){let daemon=program2.command("daemon").description("Manage scheduler daemon lifecycle (redirects to genie serve --headless)");daemon.command("install").description("Generate systemd service unit and enable it").action(async()=>{await daemonInstallCommand()}),daemon.command("start").description("Start the scheduler daemon (alias for genie serve --headless)").option("--foreground","Run in foreground (for systemd ExecStart)").action(async(options)=>{await daemonStartCommand(options)}),daemon.command("stop").description("Stop genie serve gracefully").action(async()=>{await daemonStopCommand()}),daemon.command("status").description("Show daemon state, PID, uptime, and trigger stats").action(async()=>{await daemonStatusCommand()}),daemon.command("logs").description("Tail structured JSON scheduler log").option("--follow, -f","Follow log output").option("--lines <n>","Number of lines to show (default: 20)",Number.parseInt).action(async(options)=>{await daemonLogsCommand(options)})}init_cron();import{existsSync as existsSync54,readFileSync as readFileSync36}from"fs";import{dirname as dirname19,join as join65}from"path";import{createInterface as createInterface3}from"readline";init_db();init_wish_state();import{spawnSync as spawnSync7}from"child_process";import{existsSync as existsSync53,mkdirSync as mkdirSync24,readFileSync as readFileSync35,renameSync as renameSync8,statSync as statSync11,writeFileSync as writeFileSync24}from"fs";import{homedir as homedir42}from"os";import{basename as basename11,join as join64,relative as relative4,resolve as resolve13}from"path";import{gunzipSync,gzipSync}from"zlib";var SNAPSHOT_FILE="snapshot.sql.gz";function getSnapshotPath(cwd){let repoRoot=resolveRepoPath(cwd),genieHome6=process.env.GENIE_HOME??join64(homedir42(),".genie");return join64(genieHome6,"backups",basename11(repoRoot),SNAPSHOT_FILE)}function assertOutsideRepo(snapshotPath,cwd){let repoRoot=resolveRepoPath(cwd),rel=relative4(repoRoot,resolve13(snapshotPath));if(!rel.startsWith("..")&&rel!==""&&!rel.startsWith("/"))throw Error(`Refusing to write snapshot inside repo tree: ${snapshotPath}. Snapshots must live outside the repo (default: ~/.genie/backups/<repo>/).`)}function pgEnv(database){let forceTcp=process.env.GENIE_PG_FORCE_TCP==="1",testPort=process.env.GENIE_TEST_PG_PORT,useSocket=!forceTcp&&!testPort,resolvedDatabase=database??resolveDatabaseName();if(useSocket)return{...process.env,PGHOST:resolvePgserveSocketDir(),PGUSER:DB_NAME,PGPASSWORD:resolvePgserveAuthPassword(),PGDATABASE:resolvedDatabase};let port=testPort&&testPort.length>0?testPort:String(getActivePort());return{...process.env,PGHOST:"127.0.0.1",PGPORT:port,PGUSER:DB_NAME,PGPASSWORD:resolveTcpPgPassword(),PGDATABASE:resolvedDatabase}}function backup(cwd){let snapshotPath=getSnapshotPath(cwd);assertOutsideRepo(snapshotPath,cwd);let snapshotDir=snapshotPath.slice(0,snapshotPath.lastIndexOf("/")),tmpPath=`${snapshotPath}.tmp`;mkdirSync24(snapshotDir,{recursive:!0});let result2=spawnSync7("pg_dump",["--no-owner","--no-acl","--clean","--if-exists"],{env:pgEnv(),stdio:["pipe","pipe","pipe"],timeout:120000,maxBuffer:1073741824});if(result2.status!==0){let stderr=result2.stderr?.toString().trim()||"unknown error";throw Error(`pg_dump failed (exit ${result2.status}): ${stderr}`)}let compressed=gzipSync(result2.stdout);writeFileSync24(tmpPath,compressed),renameSync8(tmpPath,snapshotPath);let compressedBytes=statSync11(snapshotPath).size,uncompressedBytes=0;try{let sizeResult=spawnSync7("psql",["-t","-A","-c","SELECT pg_database_size(current_database())"],{env:pgEnv(),encoding:"utf-8",timeout:1e4});if(sizeResult.status===0)uncompressedBytes=Number.parseInt(sizeResult.stdout.trim(),10)||0}catch{}return{path:snapshotPath,compressedBytes,uncompressedBytes}}function restore(snapshotFile,cwd){let filePath=snapshotFile??getSnapshotPath(cwd);if(!existsSync53(filePath))throw Error(`Snapshot not found: ${filePath}`);let env=pgEnv();spawnSync7("psql",["-c","SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid()"],{env,stdio:["pipe","pipe","pipe"],timeout:1e4});let compressed=readFileSync35(filePath),sql=gunzipSync(compressed),restoreResult=spawnSync7("psql",["-v","ON_ERROR_STOP=1"],{env,input:sql,stdio:["pipe","pipe","pipe"],timeout:300000,maxBuffer:1073741824});if(restoreResult.status!==0)throw Error(`psql restore failed (exit ${restoreResult.status}): ${restoreResult.stderr?.toString().trim()}`)}init_db_migrations();init_db();init_term_format();function findNearestPackageJson(start3){let cwd=start3;while(!0){let candidate=join65(cwd,"package.json");if(existsSync54(candidate))return candidate;let parent=dirname19(cwd);if(parent===cwd)return null;cwd=parent}}function readPersistFlag(start3=process.cwd()){let path3=findNearestPackageJson(start3);if(path3===null)return!1;try{return JSON.parse(readFileSync36(path3,"utf8"))?.pgserve?.persist===!0}catch{return!1}}function printTable(rows){if(rows.length===0){console.log("(0 rows)");return}let columns=Object.keys(rows[0]),widths=columns.map((col)=>{let values2=rows.map((r)=>String(r[col]??"NULL"));return Math.max(col.length,...values2.map((v)=>v.length))}),header=columns.map((col,i2)=>padRight(col,widths[i2])).join(" | ");console.log(header),console.log(widths.map((w)=>"-".repeat(w)).join("-+-"));for(let row of rows){let line=columns.map((col,i2)=>padRight(String(row[col]??"NULL"),widths[i2])).join(" | ");console.log(line)}console.log(`(${rows.length} row${rows.length===1?"":"s"})`)}function extractFingerprintFromDbName(db){let match=/_([0-9a-f]{12})$/.exec(db);return match?match[1]:null}async function dbStatusCommand(){if(console.log(`
4184
+ `).filter(Boolean);for(let line of newLines)printLogLine(line);lastSize=content.length}}catch{}});process.on("SIGINT",()=>{watcher2.close(),process.exit(0)}),await new Promise(()=>{})}function printLogLine(raw){try{let entry2=JSON.parse(raw),ts3=entry2.timestamp?new Date(entry2.timestamp).toLocaleTimeString("en-US",{hour12:!1}):"??:??:??",level=(entry2.level??"info").toUpperCase().padEnd(5),event=entry2.event??"unknown",extras=Object.entries(entry2).filter(([k])=>!["timestamp","level","event"].includes(k)).map(([k,v])=>`${k}=${typeof v==="object"?JSON.stringify(v):v}`).join(" ");console.log(`${ts3} ${level} ${event}${extras?` ${extras}`:""}`)}catch{console.log(raw)}}function formatUptime(ms){let seconds=Math.floor(ms/1000),minutes=Math.floor(seconds/60),hours=Math.floor(minutes/60),days=Math.floor(hours/24);if(days>0)return`${days}d ${hours%24}h ${minutes%60}m`;if(hours>0)return`${hours}h ${minutes%60}m`;if(minutes>0)return`${minutes}m ${seconds%60}s`;return`${seconds}s`}function registerDaemonCommands(program2){let daemon=program2.command("daemon").description("Manage scheduler daemon lifecycle (redirects to genie serve --headless)");daemon.command("install").description("Generate systemd service unit and enable it").action(async()=>{await daemonInstallCommand()}),daemon.command("start").description("Start the scheduler daemon (alias for genie serve --headless)").option("--foreground","Run in foreground (for systemd ExecStart)").action(async(options)=>{await daemonStartCommand(options)}),daemon.command("stop").description("Stop genie serve gracefully").action(async()=>{await daemonStopCommand()}),daemon.command("status").description("Show daemon state, PID, uptime, and trigger stats").action(async()=>{await daemonStatusCommand()}),daemon.command("logs").description("Tail structured JSON scheduler log").option("--follow, -f","Follow log output").option("--lines <n>","Number of lines to show (default: 20)",Number.parseInt).action(async(options)=>{await daemonLogsCommand(options)})}init_cron();import{existsSync as existsSync54,readFileSync as readFileSync36}from"fs";import{dirname as dirname19,join as join65}from"path";import{createInterface as createInterface3}from"readline";init_db();init_wish_state();import{spawnSync as spawnSync7}from"child_process";import{existsSync as existsSync53,mkdirSync as mkdirSync24,readFileSync as readFileSync35,renameSync as renameSync8,statSync as statSync11,writeFileSync as writeFileSync24}from"fs";import{homedir as homedir42}from"os";import{basename as basename11,join as join64,relative as relative4,resolve as resolve13}from"path";import{gunzipSync,gzipSync}from"zlib";var SNAPSHOT_FILE="snapshot.sql.gz";function getSnapshotPath(cwd){let repoRoot=resolveRepoPath(cwd),genieHome6=process.env.GENIE_HOME??join64(homedir42(),".genie");return join64(genieHome6,"backups",basename11(repoRoot),SNAPSHOT_FILE)}function assertOutsideRepo(snapshotPath,cwd){let repoRoot=resolveRepoPath(cwd),rel=relative4(repoRoot,resolve13(snapshotPath));if(!rel.startsWith("..")&&rel!==""&&!rel.startsWith("/"))throw Error(`Refusing to write snapshot inside repo tree: ${snapshotPath}. Snapshots must live outside the repo (default: ~/.genie/backups/<repo>/).`)}function pgEnv(database){let forceTcp=process.env.GENIE_PG_FORCE_TCP==="1",testPort=process.env.GENIE_TEST_PG_PORT,useSocket=!forceTcp&&!testPort,resolvedDatabase=database??resolveDatabaseName();if(useSocket)return{...process.env,PGHOST:resolvePgserveSocketDir(),PGUSER:DB_NAME,PGPASSWORD:resolvePgserveAuthPassword(),PGDATABASE:resolvedDatabase};let port=testPort&&testPort.length>0?testPort:String(getActivePort());return{...process.env,PGHOST:"127.0.0.1",PGPORT:port,PGUSER:DB_NAME,PGPASSWORD:resolveTcpPgPassword(),PGDATABASE:resolvedDatabase}}function backup(cwd){let snapshotPath=getSnapshotPath(cwd);assertOutsideRepo(snapshotPath,cwd);let snapshotDir=snapshotPath.slice(0,snapshotPath.lastIndexOf("/")),tmpPath=`${snapshotPath}.tmp`;mkdirSync24(snapshotDir,{recursive:!0});let result2=spawnSync7("pg_dump",["--no-owner","--no-acl","--clean","--if-exists"],{env:pgEnv(),stdio:["pipe","pipe","pipe"],timeout:120000,maxBuffer:1073741824});if(result2.status!==0){let stderr=result2.stderr?.toString().trim()||"unknown error";throw Error(`pg_dump failed (exit ${result2.status}): ${stderr}`)}let compressed=gzipSync(result2.stdout);writeFileSync24(tmpPath,compressed),renameSync8(tmpPath,snapshotPath);let compressedBytes=statSync11(snapshotPath).size,uncompressedBytes=0;try{let sizeResult=spawnSync7("psql",["-t","-A","-c","SELECT pg_database_size(current_database())"],{env:pgEnv(),encoding:"utf-8",timeout:1e4});if(sizeResult.status===0)uncompressedBytes=Number.parseInt(sizeResult.stdout.trim(),10)||0}catch{}return{path:snapshotPath,compressedBytes,uncompressedBytes}}function restore(snapshotFile,cwd){let filePath=snapshotFile??getSnapshotPath(cwd);if(!existsSync53(filePath))throw Error(`Snapshot not found: ${filePath}`);let env=pgEnv();spawnSync7("psql",["-c","SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid()"],{env,stdio:["pipe","pipe","pipe"],timeout:1e4});let compressed=readFileSync35(filePath),sql=gunzipSync(compressed),restoreResult=spawnSync7("psql",["-v","ON_ERROR_STOP=1"],{env,input:sql,stdio:["pipe","pipe","pipe"],timeout:300000,maxBuffer:1073741824});if(restoreResult.status!==0)throw Error(`psql restore failed (exit ${restoreResult.status}): ${restoreResult.stderr?.toString().trim()}`)}init_db_migrations();init_db();init_term_format();init_src();init_db();var PG_USER2="postgres",PG_PASS2="postgres",PG_HOST2="127.0.0.1",SYSTEM_DBS=new Set(["postgres","template0","template1"]),V2_TENANT_DB_PATTERN=/^app_[a-z0-9_]{1,50}_[0-9a-f]{12}$/;async function dbLsCommand(options){if(!await isAvailable())console.error("Database is not running."),process.exit(1);let portRows=await(await getConnection()).unsafe("SHOW port"),port=Number(portRows[0]?.port);if(!Number.isFinite(port)||port<=0)console.error("Could not resolve pgserve TCP port."),await shutdown(),process.exit(1);let admin=src_default({host:PG_HOST2,port,username:PG_USER2,password:PG_PASS2,database:"postgres",max:1,onnotice:()=>{},idle_timeout:5});try{let filtered=await loadAllDbs(admin);if(!options.all)filtered=filtered.filter((r)=>!r.isSystem);if(options.orphans)filtered=filtered.filter((r)=>!r.isV2Pattern&&!r.isSystem&&!r.fingerprint);if(options.counts)for(let row of filtered){if(row.isSystem)continue;try{let c=src_default({host:PG_HOST2,port,username:PG_USER2,password:PG_PASS2,database:row.name,max:1,onnotice:()=>{},idle_timeout:1,connect_timeout:3}),probe=await c`
4185
+ SELECT relname, n_live_tup FROM pg_stat_user_tables
4186
+ WHERE schemaname='public' AND relname IN ('tasks','wishes','teams','sessions')
4187
+ `,counts={};for(let p of probe){let n=Number(p.n_live_tup);if(p.relname==="tasks")counts.tasks=n;else if(p.relname==="wishes")counts.wishes=n;else if(p.relname==="teams")counts.teams=n;else if(p.relname==="sessions")counts.sessions=n}row.counts=counts,await c.end({timeout:1})}catch{}}if(options.json)console.log(JSON.stringify(filtered,null,2));else printTable(filtered,{showCounts:!!options.counts})}finally{await admin.end({timeout:5})}await shutdown()}async function loadAllDbs(admin){return(await admin`
4188
+ SELECT
4189
+ d.datname AS datname,
4190
+ pg_database_size(d.datname) AS size_bytes,
4191
+ m.fingerprint,
4192
+ m.persist,
4193
+ m.last_connection_at,
4194
+ m.package_realpath,
4195
+ m.liveness_pid
4196
+ FROM pg_database d
4197
+ LEFT JOIN pgserve_meta m ON m.database_name = d.datname
4198
+ ORDER BY pg_database_size(d.datname) DESC
4199
+ `).map((r)=>({name:r.datname,sizeBytes:Number(r.size_bytes),fingerprint:r.fingerprint,persist:!!r.persist,lastConnectionAt:r.last_connection_at,packageRealpath:r.package_realpath,livenessPid:r.liveness_pid,isV2Pattern:V2_TENANT_DB_PATTERN.test(r.datname),isSystem:SYSTEM_DBS.has(r.datname)}))}function printTable(rows,opts){if(rows.length===0){console.log("(no databases)");return}let cols=[{header:"NAME",getter:(r)=>r.name},{header:"SIZE",getter:(r)=>formatBytes(r.sizeBytes)},{header:"PERSIST",getter:(r)=>r.persist?"yes":"no"},{header:"LAST CONNECT",getter:(r)=>formatDate2(r.lastConnectionAt)},{header:"FINGERPRINT",getter:(r)=>r.fingerprint??"(no meta row)"},{header:"PACKAGE",getter:(r)=>r.packageRealpath??"(script-mode)"}];if(opts.showCounts)cols.push({header:"TASKS / WISHES / TEAMS / SESSIONS",getter:(r)=>{if(!r.counts)return"-";return`${r.counts.tasks??"-"} / ${r.counts.wishes??"-"} / ${r.counts.teams??"-"} / ${r.counts.sessions??"-"}`}});let widths=cols.map((c)=>Math.max(c.header.length,...rows.map((r)=>c.getter(r).length))),sep2=widths.map((w)=>"-".repeat(w)).join(" ");console.log(cols.map((c,i2)=>c.header.padEnd(widths[i2])).join(" ")),console.log(sep2);for(let r of rows)console.log(cols.map((c,i2)=>c.getter(r).padEnd(widths[i2])).join(" "));console.log();let total=rows.reduce((acc,r)=>acc+r.sizeBytes,0),persistCount=rows.filter((r)=>r.persist).length,orphanCount=rows.filter((r)=>!r.fingerprint&&!r.isSystem).length,v2Count=rows.filter((r)=>r.isV2Pattern).length;console.log(`${rows.length} databases (${formatBytes(total)} total) \u2014 `+`${persistCount} persist, ${orphanCount} orphans, ${v2Count} v2-pattern`)}function formatBytes(n){if(n<1024)return`${n}B`;let u=["KB","MB","GB","TB"],v=n/1024,i2=0;while(v>=1024&&i2<u.length-1)v/=1024,i2++;return`${v.toFixed(1)} ${u[i2]}`}function formatDate2(d){if(!d)return"-";let elapsedMs=Date.now()-d.getTime(),sec=Math.floor(elapsedMs/1000);if(sec<60)return`${sec}s ago`;let min=Math.floor(sec/60);if(min<60)return`${min}m ago`;let hr=Math.floor(min/60);if(hr<24)return`${hr}h ago`;return`${Math.floor(hr/24)}d ago`}function registerDbLsCommand(db){db.command("ls").description("List all pgserve databases on this host").option("--json","Machine-readable JSON output").option("--counts","Probe each DB for tasks/wishes/teams/sessions row counts (slower)").option("--all","Include system DBs (postgres, template0, template1)").option("--orphans","Only show DBs without a pgserve_meta row (legacy / unmanaged)").action(dbLsCommand)}init_src();init_db();init_v1_migration_prompt();var V1_DB_NAME2="genie",V1_USER="postgres",V1_PASS="postgres",V1_HOST="127.0.0.1",FOUNDATION_TABLES=["organizations","projects","executors","agents","agent_projects","teams","board_templates","boards","task_types","wishes","tasks","task_actors","task_dependencies","task_stage_log","tags","task_tags","assignments"],NEVER_MIGRATE=new Set(["tool_events","genie_runtime_events","heartbeats","machine_snapshots","genie_bridge_sessions","mailbox","messages"]);async function dbMigrateV1Command(options){if(!await isAvailable())console.error("Database is not running. Start it with: genie db status"),process.exit(1);let v2=await getConnection(),portRows=await v2.unsafe("SHOW port"),port=Number(portRows[0]?.port);if(!Number.isFinite(port)||port<=0)console.error("Could not resolve pgserve TCP port from runtime connection."),await shutdown(),process.exit(1);console.log("[genie db migrate-v1] Detecting v1 data\u2026");let detected=await detectV1(port);if(!detected){console.log(" No v1 `genie` database found. Nothing to migrate."),await shutdown();return}let targetDb=(await v2.unsafe("SELECT current_database() AS db"))[0]?.db;console.log(` Source: ${V1_DB_NAME2} (v1, port ${port}, ${formatBytes2(detected.totalSizeBytes)} on disk)`),console.log(` Target: ${targetDb} (your v2 workspace)`),console.log();let sessionDays=parseDayWindow(options.includeSessions,30),auditDays=parseDayWindow(options.includeAudit,0);console.log("Row counts in v1:");for(let t of FOUNDATION_TABLES){let c=detected.rowCounts[t];if(typeof c==="number")console.log(` ${t.padEnd(22)} ${c}`)}if(sessionDays>0)console.log(` ${"sessions".padEnd(22)} ${detected.rowCounts.sessions??0} (last ${sessionDays} days)`);if(auditDays>0)console.log(` ${"audit_events".padEnd(22)} ${detected.rowCounts.audit_events??0} (last ${auditDays} days)`);if(options.includeContent)console.log(` ${"session_content".padEnd(22)} ${detected.rowCounts.session_content??0} (last ${sessionDays} days, --include-content)`);if(console.log(),console.log(`Will SKIP: ${[...NEVER_MIGRATE].join(", ")}`),options.archive!==!1)console.log(`Will ARCHIVE: source DB renamed to ${archiveName()} (kept indefinitely; persist=true)`);if(console.log(),options.dryRun){console.log("--dry-run set, exiting."),await shutdown();return}if(!options.yes&&!await confirm("Proceed with migration?")){console.log("Aborted."),await shutdown();return}let v1=src_default({host:V1_HOST,port,username:V1_USER,password:V1_PASS,database:V1_DB_NAME2,max:1,onnotice:()=>{},idle_timeout:5}),v2Bypass=src_default({host:V1_HOST,port,username:V1_USER,password:V1_PASS,database:targetDb,max:1,onnotice:()=>{},idle_timeout:5,connection:{session_replication_role:"replica"}}),summary={},failures=[];try{for(let table of FOUNDATION_TABLES){if(NEVER_MIGRATE.has(table))continue;let r=await migrateOne(v1,v2Bypass,table);if(report(table,r),r.failed)failures.push(`${table}: ${r.failed}`);else summary[table]=r.copied}if(sessionDays>0){let r=await migrateOne(v1,v2Bypass,"sessions",{dateColumn:"created_at",days:sessionDays});if(report("sessions",r),r.failed)failures.push(`sessions: ${r.failed}`);else summary.sessions=r.copied}if(auditDays>0){let r=await migrateOne(v1,v2Bypass,"audit_events",{dateColumn:"created_at",days:auditDays});if(report("audit_events",r),r.failed)failures.push(`audit_events: ${r.failed}`);else summary.audit_events=r.copied}if(options.includeContent&&sessionDays>0){let r=await migrateOne(v1,v2Bypass,"session_content",{dateColumn:"created_at",days:sessionDays});if(report("session_content",r),r.failed)failures.push(`session_content: ${r.failed}`);else summary.session_content=r.copied}}finally{await v1.end({timeout:5}),await v2Bypass.end({timeout:5})}console.log();let total=Object.values(summary).reduce((a,b2)=>a+b2,0);console.log(`Migrated ${total} rows across ${Object.keys(summary).length} tables. ${failures.length} failed.`);for(let f of failures)console.log(` - ${f}`);if(failures.length===0){if(await recordMigrationComplete(v2,V1_DB_NAME2,summary),console.log("Migration recorded in _genie_migration_state \u2014 startup prompt will be silenced."),options.archive!==!1){let archive=archiveName();console.log(`Archiving v1 \u2192 ${archive}`),await archiveV1(port,archive),console.log(`Done. ${archive} renamed and marked persist=true.`)}}else console.log(`Skipping archive due to ${failures.length} failures. Re-run after resolving (idempotent).`);await shutdown()}async function detectV1(port){let v1=src_default({host:V1_HOST,port,username:V1_USER,password:V1_PASS,database:V1_DB_NAME2,max:1,onnotice:()=>{},connect_timeout:5,idle_timeout:1});try{let tableRows=await v1`
4200
+ SELECT relname, n_live_tup FROM pg_stat_user_tables WHERE schemaname='public'
4201
+ `;if(tableRows.length===0)return null;let counts={};for(let r of tableRows)counts[r.relname]=Number(r.n_live_tup);let sizeRows=await v1`SELECT pg_database_size(${V1_DB_NAME2}) AS size`;return{rowCounts:counts,totalSizeBytes:Number(sizeRows[0]?.size??0)}}catch(err){let code=err.code;if(["3D000","08001","08006","ECONNREFUSED"].includes(code??""))return null;throw err}finally{try{await v1.end({timeout:1})}catch{}}}async function getInsertableColumns(client,table){return client`
4202
+ SELECT a.attname AS name, a.attidentity::text AS identity, a.attgenerated::text AS generated
4203
+ FROM pg_attribute a JOIN pg_class c ON c.oid=a.attrelid JOIN pg_namespace n ON n.oid=c.relnamespace
4204
+ WHERE n.nspname='public' AND c.relname=${table} AND a.attnum>0 AND NOT a.attisdropped
4205
+ ORDER BY a.attnum
4206
+ `}async function migrateOne(v1,v2,table,windowOpt){try{let v1Cols=await getInsertableColumns(v1,table),v2Cols=await getInsertableColumns(v2,table);if(v1Cols.length===0)return{copied:0,skipped:0};if(v2Cols.length===0)return{copied:0,skipped:0,failed:"target lacks table"};let v2Map=new Map(v2Cols.map((c)=>[c.name,c])),cols=v1Cols.map((c)=>c.name).filter((name)=>{let v2c=v2Map.get(name);if(!v2c)return!1;if(v2c.identity==="a")return!1;if(v2c.generated==="s")return!1;return!0});if(cols.length===0)return{copied:0,skipped:0,failed:"no insertable shared columns"};let colList=cols.map((c)=>`"${c}"`).join(","),where=windowOpt?`WHERE "${windowOpt.dateColumn}" > now() - interval '${windowOpt.days} days'`:"",rows=await v1.unsafe(`SELECT ${colList} FROM "${table}" ${where}`);if(rows.length===0)return{copied:0,skipped:0};let copied=0,batchSize=200;for(let i2=0;i2<rows.length;i2+=batchSize){let batch=rows.slice(i2,i2+batchSize),placeholders=batch.map((_,ri)=>`(${cols.map((_2,ci)=>`$${ri*cols.length+ci+1}`).join(",")})`).join(","),values2=batch.flatMap((row)=>cols.map((c)=>row[c])),stmt=`INSERT INTO "${table}" (${colList}) VALUES ${placeholders} ON CONFLICT DO NOTHING`,r=await v2.unsafe(stmt,values2);copied+=Number(r.count??0)}return{copied,skipped:rows.length-copied}}catch(err){return{copied:0,skipped:0,failed:err instanceof Error?err.message:String(err)}}}async function archiveV1(port,archive){let admin=src_default({host:V1_HOST,port,username:V1_USER,password:V1_PASS,database:"postgres",max:1,onnotice:()=>{}});try{await admin.unsafe("SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname=$1 AND pid<>pg_backend_pid()",[V1_DB_NAME2]),await admin.unsafe(`ALTER DATABASE "${V1_DB_NAME2}" RENAME TO "${archive}"`),await admin.unsafe(`INSERT INTO pgserve_meta (database_name, fingerprint, peer_uid, persist) VALUES ($1, $2, $3, true)
4207
+ ON CONFLICT (database_name) DO UPDATE SET persist=true`,[archive,"legacy_v1_archive",0])}finally{await admin.end({timeout:5})}}function report(table,r){if(r.failed)console.log(` \u2717 ${table.padEnd(22)} FAILED: ${r.failed}`);else if(r.copied===0&&r.skipped===0)console.log(` - ${table.padEnd(22)} (no rows)`);else console.log(` \u2713 ${table.padEnd(22)} +${r.copied} copied, ${r.skipped} already present`)}function archiveName(){let d=new Date;return`genie_archive_${d.getFullYear()}${String(d.getMonth()+1).padStart(2,"0")}${String(d.getDate()).padStart(2,"0")}`}function parseDayWindow(value,fallback){if(value===void 0)return fallback;let n=Number.parseInt(value,10);return Number.isFinite(n)&&n>=0?n:fallback}function formatBytes2(n){if(n<1024)return`${n} B`;let u=["KB","MB","GB","TB"],v=n/1024,i2=0;while(v>=1024&&i2<u.length-1)v/=1024,i2++;return`${v.toFixed(1)} ${u[i2]}`}async function confirm(prompt2){return process.stdout.write(`${prompt2} [Y/n]: `),new Promise((resolve14)=>{process.stdin.setEncoding("utf8");let onData=(chunk)=>{let v=chunk.trim().toLowerCase();process.stdin.removeListener("data",onData),process.stdin.pause(),resolve14(v===""||v==="y"||v==="yes")};process.stdin.resume(),process.stdin.once("data",onData)})}function registerDbMigrateV1Command(db){db.command("migrate-v1").description("Migrate v1-era genie data into your v2 fingerprinted workspace").option("--dry-run","Show what would migrate without writing").option("-y, --yes","Skip confirmation prompt").option("--include-sessions <days>","Days of session history to migrate (default 30)").option("--include-audit <days>","Days of audit_events to migrate (default 0 = skipped)").option("--include-content","Also migrate session_content (skipped by default \u2014 large)").option("--no-archive","Don't rename source DB to genie_archive_<date> after migration").action(dbMigrateV1Command)}function findNearestPackageJson(start3){let cwd=start3;while(!0){let candidate=join65(cwd,"package.json");if(existsSync54(candidate))return candidate;let parent=dirname19(cwd);if(parent===cwd)return null;cwd=parent}}function readPersistFlag(start3=process.cwd()){let path3=findNearestPackageJson(start3);if(path3===null)return!1;try{return JSON.parse(readFileSync36(path3,"utf8"))?.pgserve?.persist===!0}catch{return!1}}function printTable2(rows){if(rows.length===0){console.log("(0 rows)");return}let columns=Object.keys(rows[0]),widths=columns.map((col)=>{let values2=rows.map((r)=>String(r[col]??"NULL"));return Math.max(col.length,...values2.map((v)=>v.length))}),header=columns.map((col,i2)=>padRight(col,widths[i2])).join(" | ");console.log(header),console.log(widths.map((w)=>"-".repeat(w)).join("-+-"));for(let row of rows){let line=columns.map((col,i2)=>padRight(String(row[col]??"NULL"),widths[i2])).join(" | ");console.log(line)}console.log(`(${rows.length} row${rows.length===1?"":"s"})`)}function extractFingerprintFromDbName(db){let match=/_([0-9a-f]{12})$/.exec(db);return match?match[1]:null}async function dbStatusCommand(){if(console.log(`
4165
4208
  Genie Database Status`),console.log("\u2500".repeat(50)),!await isAvailable()){let socketPath=resolvePgserveLibpqSocketPath();console.log(" Status: stopped"),console.log(` Socket: ${socketPath} (not bound)`),console.log(`
4166
4209
  pgserve daemon is not running. Start it with one of:`),console.log(" npx pgserve daemon # foreground"),console.log(" pm2 start node_modules/pgserve/bin/pgserve-wrapper.cjs -- daemon # background"),console.log(" Genie will also auto-start the daemon on first connect."),console.log("");return}console.log(" Status: running");try{let sql=await getConnection();if(isSocketMode()){let socketDir=resolvePgserveSocketDir(),rows=await sql`SELECT current_database() AS db`,db=String(rows[0]?.db??""),fingerprint=extractFingerprintFromDbName(db),persist=readPersistFlag();console.log(" Mode: socket (pgserve v2)"),console.log(` Socket: ${socketDir}/.s.PGSQL.5432`),console.log(` Database: ${db}`),console.log(` Fingerprint: ${fingerprint??"(non-standard name)"}`),console.log(` Persist: ${persist}${persist?"":" (eligible for 24h TTL reap)"}`)}else{let port=getActivePort();console.log(" Mode: tcp (legacy)"),console.log(" Host: 127.0.0.1"),console.log(` Port: ${port}`),console.log(` Data dir: ${getDataDir()}`)}let sizeResult=await sql`SELECT pg_size_pretty(pg_database_size(current_database())) AS size`;console.log(` DB size: ${sizeResult[0].size}`);let migrations=await getMigrationStatus(sql);console.log(`
4167
4210
  Migrations: ${migrations.applied.length} applied, ${migrations.pending.length} pending`);let tables=await sql`
@@ -4172,14 +4215,14 @@ Genie Database Status`),console.log("\u2500".repeat(50)),!await isAvailable()){l
4172
4215
  Table Row Counts:`);let maxNameLen=Math.max(...tables.map((t)=>t.tablename.length),5);for(let table of tables){let count=(await sql.unsafe(`SELECT count(*) AS cnt FROM "${table.tablename}"`))[0].cnt;console.log(` ${padRight(table.tablename,maxNameLen)} ${count}`)}}console.log(`
4173
4216
  Escape hatches:`),console.log(" GENIE_PG_FORCE_TCP=1 force legacy TCP loopback"),console.log(" GENIE_NO_BANNER=1 suppress connect banner"),console.log(" PGSERVE_DISABLE_FINGERPRINT_ENFORCEMENT=1 bypass per-fingerprint DB check"),await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`
4174
4217
  Error querying database: ${message}`)}console.log("")}async function dbMigrateCommand(){try{let sql=await getConnection(),status=await getMigrationStatus(sql);if(status.pending.length===0){console.log("All migrations are up to date."),console.log(` Applied: ${status.applied.length} migration${status.applied.length===1?"":"s"}`),await shutdown();return}console.log(`Running ${status.pending.length} pending migration${status.pending.length===1?"":"s"}...`);let results=await runMigrations(sql);for(let r of results)console.log(` Applied: ${r.name} (${r.applied_at})`);console.log(`
4175
- Done. ${results.length} migration${results.length===1?"":"s"} applied.`),await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Error running migrations: ${message}`),process.exit(1)}}async function dbQueryCommand(query2){try{let result2=await(await getConnection()).unsafe(query2);if(result2.length===0&&result2.count!==void 0)console.log(`Query OK, ${result2.count} row${result2.count===1?"":"s"} affected.`);else printTable(result2);await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Query error: ${message}`),process.exit(1)}}function formatBytes(bytes){if(bytes===0)return"0B";let units=["B","KB","MB","GB"],i2=Math.min(Math.floor(Math.log(bytes)/Math.log(1024)),units.length-1),value=bytes/1024**i2;return`${value<10?value.toFixed(1):Math.round(value)}${units[i2]}`}async function dbBackupCommand(){if(!await isAvailable())console.error("Database is not running. Start it with: genie db status"),process.exit(1);try{let result2=backup(),compressed=formatBytes(result2.compressedBytes),uncompressed=result2.uncompressedBytes>0?`, ${formatBytes(result2.uncompressedBytes)} uncompressed`:"";console.log(`\u2713 Backup created: ${result2.path} (${compressed}${uncompressed})`),await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Backup failed: ${message}`),process.exit(1)}}function confirm(prompt2){let rl=createInterface3({input:process.stdin,output:process.stdout});return new Promise((resolve14)=>{rl.question(prompt2,(answer)=>{rl.close(),resolve14(/^y(es)?$/i.test(answer.trim()))})})}async function dbRestoreCommand(file,options){let snapshotPath=file??getSnapshotPath();if(!await isAvailable())console.error("Database is not running. Start it with: genie db status"),process.exit(1);if(!options.yes){if(!await confirm("This will replace all data in the genie database. Continue? [y/N] ")){console.log("Restore cancelled.");return}}try{await shutdown(),restore(file),console.log(`\u2713 Database restored from: ${snapshotPath}`)}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Restore failed: ${message}`),process.exit(1)}}async function dbPruneEventsCommand(options){let ms=parseDuration(options.olderThan),intervalSec=Math.floor(ms/1000);if(!await isAvailable())console.error("Database is not running. Start it with: genie db status"),process.exit(1);try{let sql=await getConnection();if(options.dryRun){let rows=await sql`
4218
+ Done. ${results.length} migration${results.length===1?"":"s"} applied.`),await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Error running migrations: ${message}`),process.exit(1)}}async function dbQueryCommand(query2){try{let result2=await(await getConnection()).unsafe(query2);if(result2.length===0&&result2.count!==void 0)console.log(`Query OK, ${result2.count} row${result2.count===1?"":"s"} affected.`);else printTable2(result2);await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Query error: ${message}`),process.exit(1)}}function formatBytes3(bytes){if(bytes===0)return"0B";let units=["B","KB","MB","GB"],i2=Math.min(Math.floor(Math.log(bytes)/Math.log(1024)),units.length-1),value=bytes/1024**i2;return`${value<10?value.toFixed(1):Math.round(value)}${units[i2]}`}async function dbBackupCommand(){if(!await isAvailable())console.error("Database is not running. Start it with: genie db status"),process.exit(1);try{let result2=backup(),compressed=formatBytes3(result2.compressedBytes),uncompressed=result2.uncompressedBytes>0?`, ${formatBytes3(result2.uncompressedBytes)} uncompressed`:"";console.log(`\u2713 Backup created: ${result2.path} (${compressed}${uncompressed})`),await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Backup failed: ${message}`),process.exit(1)}}function confirm2(prompt2){let rl=createInterface3({input:process.stdin,output:process.stdout});return new Promise((resolve14)=>{rl.question(prompt2,(answer)=>{rl.close(),resolve14(/^y(es)?$/i.test(answer.trim()))})})}async function dbRestoreCommand(file,options){let snapshotPath=file??getSnapshotPath();if(!await isAvailable())console.error("Database is not running. Start it with: genie db status"),process.exit(1);if(!options.yes){if(!await confirm2("This will replace all data in the genie database. Continue? [y/N] ")){console.log("Restore cancelled.");return}}try{await shutdown(),restore(file),console.log(`\u2713 Database restored from: ${snapshotPath}`)}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Restore failed: ${message}`),process.exit(1)}}async function dbPruneEventsCommand(options){let ms=parseDuration(options.olderThan),intervalSec=Math.floor(ms/1000);if(!await isAvailable())console.error("Database is not running. Start it with: genie db status"),process.exit(1);try{let sql=await getConnection();if(options.dryRun){let rows=await sql`
4176
4219
  SELECT count(*) AS cnt
4177
4220
  FROM genie_runtime_events
4178
4221
  WHERE created_at < now() - make_interval(secs => ${intervalSec})
4179
4222
  `,count=Number(rows[0].cnt);console.log(`Would delete ${count} event${count===1?"":"s"} older than ${options.olderThan}.`)}else{let result2=await sql`
4180
4223
  DELETE FROM genie_runtime_events
4181
4224
  WHERE created_at < now() - make_interval(secs => ${intervalSec})
4182
- `,count=Number(result2.count);console.log(`Deleted ${count} event${count===1?"":"s"} older than ${options.olderThan}.`)}await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Prune failed: ${message}`),process.exit(1)}}function registerDbCommands(program2){let db=program2.command("db").description("Database management (pgserve)");db.command("status").description("Show pgserve health, port, data dir, and table counts").action(dbStatusCommand),db.command("migrate").description("Run pending database migrations").action(dbMigrateCommand),db.command("query <sql>").description("Execute arbitrary SQL and print results").action(dbQueryCommand),db.command("url").description("Print postgres connection URL for direct access").option("--quiet","Print URL only, no trailing newline (for scripts)").action(async(options)=>{await isAvailable();let url;if(isSocketMode())url=`postgresql:///postgres?host=${resolvePgserveSocketDir()}`;else url=`postgres://postgres:postgres@127.0.0.1:${getActivePort()}/genie`;if(options.quiet)process.stdout.write(url);else console.log(url);await shutdown()}),db.command("prune-events").description("Prune old runtime events beyond retention period").option("--older-than <duration>","Delete events older than (e.g., 30d, 7d)","14d").option("--dry-run","Show count without deleting").action(dbPruneEventsCommand),db.command("backup").description("Dump database to .genie/snapshot.sql.gz").action(dbBackupCommand),db.command("restore [file]").description("Restore database from snapshot (default: .genie/snapshot.sql.gz)").option("-y, --yes","Skip confirmation prompt").action(dbRestoreCommand)}init_dispatch();function registerDispatchGroupCommands(program2){let dispatch3=program2.command("dispatch").description("Framework skill dispatch primitives (brainstorm/wish/review)");dispatch3.command("brainstorm <agent> <slug>").description("Spawn agent with brainstorm DRAFT.md context").action(async(agent,slug)=>{await brainstormCommand(agent,slug)}),dispatch3.command("wish <agent> <slug>").description("Spawn agent with wish DESIGN.md context").action(async(agent,slug)=>{await wishCommand(agent,slug)}),dispatch3.command("review <agent> <ref>").description("Spawn agent with review scope for a wish group (format: <slug>#<group>)").action(async(agent,ref)=>{await reviewCommand(agent,ref)})}init_dispatch();init_export_format();import{existsSync as existsSync61,mkdirSync as mkdirSync25,writeFileSync as writeFileSync25}from"fs";import{dirname as dirname21}from"path";async function getSql(){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db));return getConnection2()}async function getVersion(){let{VERSION:VERSION2}=await Promise.resolve().then(() => (init_version(),exports_version));return VERSION2}async function getActorName(){let{getActor:getActor2}=await Promise.resolve().then(() => (init_audit(),exports_audit));return getActor2()}async function detectTables(sql,tables){let{filterAvailableTables:filterAvailableTables2}=await Promise.resolve().then(() => exports_table_detect);return filterAvailableTables2(sql,tables)}function outputDocument(doc,options){let json2=options.pretty?JSON.stringify(doc,null,2):JSON.stringify(doc);if(options.output){let dir=dirname21(options.output);if(!existsSync61(dir))mkdirSync25(dir,{recursive:!0});writeFileSync25(options.output,`${json2}
4225
+ `,count=Number(result2.count);console.log(`Deleted ${count} event${count===1?"":"s"} older than ${options.olderThan}.`)}await shutdown()}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Prune failed: ${message}`),process.exit(1)}}function registerDbCommands(program2){let db=program2.command("db").description("Database management (pgserve)");db.command("status").description("Show pgserve health, port, data dir, and table counts").action(dbStatusCommand),db.command("migrate").description("Run pending database migrations").action(dbMigrateCommand),db.command("query <sql>").description("Execute arbitrary SQL and print results").action(dbQueryCommand),db.command("url").description("Print postgres connection URL for direct access").option("--quiet","Print URL only, no trailing newline (for scripts)").action(async(options)=>{await isAvailable();let url;if(isSocketMode())url=`postgresql:///postgres?host=${resolvePgserveSocketDir()}`;else url=`postgres://postgres:postgres@127.0.0.1:${getActivePort()}/genie`;if(options.quiet)process.stdout.write(url);else console.log(url);await shutdown()}),db.command("prune-events").description("Prune old runtime events beyond retention period").option("--older-than <duration>","Delete events older than (e.g., 30d, 7d)","14d").option("--dry-run","Show count without deleting").action(dbPruneEventsCommand),db.command("backup").description("Dump database to .genie/snapshot.sql.gz").action(dbBackupCommand),db.command("restore [file]").description("Restore database from snapshot (default: .genie/snapshot.sql.gz)").option("-y, --yes","Skip confirmation prompt").action(dbRestoreCommand),registerDbMigrateV1Command(db),registerDbLsCommand(db)}init_dispatch();function registerDispatchGroupCommands(program2){let dispatch3=program2.command("dispatch").description("Framework skill dispatch primitives (brainstorm/wish/review)");dispatch3.command("brainstorm <agent> <slug>").description("Spawn agent with brainstorm DRAFT.md context").action(async(agent,slug)=>{await brainstormCommand(agent,slug)}),dispatch3.command("wish <agent> <slug>").description("Spawn agent with wish DESIGN.md context").action(async(agent,slug)=>{await wishCommand(agent,slug)}),dispatch3.command("review <agent> <ref>").description("Spawn agent with review scope for a wish group (format: <slug>#<group>)").action(async(agent,ref)=>{await reviewCommand(agent,ref)})}init_dispatch();init_export_format();import{existsSync as existsSync61,mkdirSync as mkdirSync25,writeFileSync as writeFileSync25}from"fs";import{dirname as dirname21}from"path";async function getSql(){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db));return getConnection2()}async function getVersion(){let{VERSION:VERSION2}=await Promise.resolve().then(() => (init_version(),exports_version));return VERSION2}async function getActorName(){let{getActor:getActor2}=await Promise.resolve().then(() => (init_audit(),exports_audit));return getActor2()}async function detectTables(sql,tables){let{filterAvailableTables:filterAvailableTables2}=await Promise.resolve().then(() => exports_table_detect);return filterAvailableTables2(sql,tables)}function outputDocument(doc,options){let json2=options.pretty?JSON.stringify(doc,null,2):JSON.stringify(doc);if(options.output){let dir=dirname21(options.output);if(!existsSync61(dir))mkdirSync25(dir,{recursive:!0});writeFileSync25(options.output,`${json2}
4183
4226
  `);let tables=Object.keys(doc.data),rows=Object.values(doc.data).reduce((sum,arr)=>sum+arr.length,0);if(console.log(`Exported ${tables.length} tables (${rows} rows) to ${options.output}`),doc.skippedTables.length>0)console.log(`Skipped tables (not found): ${doc.skippedTables.join(", ")}`)}else console.log(json2)}function autoOutputName(){let d=new Date;return`genie-backup-${`${d.getFullYear()}${String(d.getMonth()+1).padStart(2,"0")}${String(d.getDate()).padStart(2,"0")}`}.json`}async function exportGroup(sql,group,filter){let tables=GROUP_TABLES[group],{available,skipped}=await detectTables(sql,tables),data={};for(let table of available)if(filter)data[table]=[...await sql.unsafe(`SELECT * FROM ${table} WHERE ${filter.column} = $1`,[filter.value])];else data[table]=[...await sql.unsafe(`SELECT * FROM ${table}`)];return{data,skipped}}async function exportBoards(sql,name){let tables=GROUP_TABLES.boards,{available,skipped}=await detectTables(sql,tables),data={};for(let table of available)if(name&&table==="boards")data[table]=[...await sql`SELECT * FROM boards WHERE name = ${name}`];else if(table==="task_types")data[table]=[...await sql`SELECT * FROM task_types WHERE is_builtin = false`];else data[table]=[...await sql.unsafe(`SELECT * FROM ${table}`)];return{data,skipped}}var TASK_JOIN_ALIASES={task_tags:"tt",task_actors:"ta",task_dependencies:"td",task_stage_log:"tsl"};async function resolveProjectId2(sql,projectName){let projects=await sql`SELECT id FROM projects WHERE name = ${projectName}`;if(projects.length===0)throw Error(`Project not found: ${projectName}`);return projects[0].id}function stripEphemeralFields(rows){return rows.map((r)=>{let{checkout_run_id,execution_locked_at,session_id,pane_id,...rest}=r;return rest})}async function exportTaskTable(sql,table,projectId){let alias=TASK_JOIN_ALIASES[table];if(table==="tasks"){let rows=projectId?[...await sql.unsafe("SELECT * FROM tasks WHERE project_id = $1",[projectId])]:[...await sql`SELECT * FROM tasks`];return stripEphemeralFields(rows)}if(alias&&projectId)return[...await sql.unsafe(`SELECT ${alias}.* FROM ${table} ${alias} JOIN tasks t ON ${alias}.task_id = t.id WHERE t.project_id = $1`,[projectId])];return[...await sql.unsafe(`SELECT * FROM ${table}`)]}async function exportTasks(sql,projectName){let tables=GROUP_TABLES.tasks,{available,skipped}=await detectTables(sql,tables),data={},projectId=projectName?await resolveProjectId2(sql,projectName):null;for(let table of available)data[table]=await exportTaskTable(sql,table,projectId);return{data,skipped}}async function exportSchedules(sql,name){let{available,skipped}=await detectTables(sql,["schedules"]),data={};if(available.includes("schedules"))if(name)data.schedules=[...await sql`SELECT * FROM schedules WHERE name = ${name}`];else data.schedules=[...await sql`SELECT * FROM schedules`];return{data,skipped}}async function exportTags(sql){let{available,skipped}=await detectTables(sql,["tags"]),data={};if(available.includes("tags"))data.tags=[...await sql`SELECT * FROM tags WHERE name NOT LIKE 'test-%'`];return{data,skipped}}async function exportAll(sql){let allSkipped=[],allData={};for(let group of ALL_GROUPS){let result2;switch(group){case"boards":result2=await exportBoards(sql);break;case"tasks":result2=await exportTasks(sql);break;case"tags":result2=await exportTags(sql);break;case"schedules":result2=await exportSchedules(sql);break;default:result2=await exportGroup(sql,group);break}Object.assign(allData,result2.data),allSkipped.push(...result2.skipped)}return{data:allData,skipped:allSkipped}}async function runExport(groups,type2,exportFn,options){let sql=await getSql(),[version,actor]=await Promise.all([getVersion(),getActorName()]),doc=createExportDocument(type2,groups,version,actor),{data,skipped}=await exportFn(sql);doc.data=data,doc.skippedTables=skipped,outputDocument(doc,options)}function registerExportCommands(program2){let exp=program2.command("export").description("Export genie data as JSON").option("--output <file>","Write to file instead of stdout").option("-o <file>","Alias for --output").option("--pretty","Pretty-print JSON").action(async(options)=>{try{if(!options.output)options.output=autoOutputName();await runExport([...ALL_GROUPS],"full",(sql)=>exportAll(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts=(cmd)=>cmd.option("--output <file>","Write to file instead of stdout").option("--pretty","Pretty-print JSON");sharedOpts(exp.command("all").description("Full backup (all present tables)")).action(async(options)=>{try{if(!options.output)options.output=autoOutputName();await runExport([...ALL_GROUPS],"full",(sql)=>exportAll(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("boards [name]").description("Export boards, templates, and task types")).action(async(name,options)=>{try{await runExport(["boards"],"partial",(sql)=>exportBoards(sql,name),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("tasks").description("Export tasks with deps, actors, and stage log").option("--project <name>","Filter by project name")).action(async(options)=>{try{await runExport(["tasks"],"partial",(sql)=>exportTasks(sql,options.project),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("tags").description("Export tags")).action(async(options)=>{try{await runExport(["tags"],"partial",(sql)=>exportTags(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("projects").description("Export projects")).action(async(options)=>{try{await runExport(["projects"],"partial",(sql)=>exportGroup(sql,"projects"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("schedules [name]").description("Export schedules with run_spec")).action(async(name,options)=>{try{await runExport(["schedules"],"partial",(sql)=>exportSchedules(sql,name),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("agents").description("Export agents, templates, and checkpoints")).action(async(options)=>{try{await runExport(["agents"],"partial",(sql)=>exportGroup(sql,"agents"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("comms").description("Export conversations, messages, mailbox")).action(async(options)=>{try{await runExport(["comms"],"partial",(sql)=>exportGroup(sql,"comms"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("config").description("Export OS config (graceful skip if missing)")).action(async(options)=>{try{await runExport(["config"],"partial",(sql)=>exportGroup(sql,"config"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_history();init_export_format();import{readFileSync as readFileSync38}from"fs";var IMPORT_LEVELS=[["schedules","sessions","projects","agent_templates","agent_checkpoints","tags","task_types","notification_preferences","os_config","golden_images","warm_pool","instances"],["triggers","boards","board_templates","agents","conversations"],["tasks","runs","messages","conversation_members","mailbox","team_chat"],["task_tags","task_actors","task_dependencies","task_stage_log","heartbeats","machine_snapshots"]],SELF_REFERENTIAL_COLUMNS={tasks:"parent_id",messages:"reply_to_id",conversations:"parent_message_id"};function getTableLevel(table){for(let i2=0;i2<IMPORT_LEVELS.length;i2++)if(IMPORT_LEVELS[i2].includes(table))return i2;return-1}function sortByImportOrder(tables){return[...tables].sort((a,b2)=>{let la=getTableLevel(a),lb=getTableLevel(b2);return(la===-1?999:la)-(lb===-1?999:lb)})}function getPrimaryKey(table){return{task_tags:["task_id","tag_id"],task_actors:["task_id","actor_type","actor_id","role"],task_dependencies:["task_id","depends_on_id"],conversation_members:["conversation_id","actor_type","actor_id"],notification_preferences:["actor_type","actor_id","channel"]}[table]??["id"]}var VALID_TABLES=new Set(Object.values(GROUP_TABLES).flat());function assertValidTable(name){if(!VALID_TABLES.has(name))throw Error(`Invalid table name: "${name}" is not in the schema whitelist`)}var VALID_COLUMN_RE=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function assertValidColumnName(name){if(!VALID_COLUMN_RE.test(name))throw Error(`Invalid column name: "${name.slice(0,60)}" contains disallowed characters. Column names must match /^[a-zA-Z_][a-zA-Z0-9_]*$/.`)}async function getSql2(){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db));return getConnection2()}async function getActorName2(){let{getActor:getActor2}=await Promise.resolve().then(() => (init_audit(),exports_audit));return getActor2()}async function detectTables2(sql,tables){let{filterAvailableTables:filterAvailableTables2}=await Promise.resolve().then(() => exports_table_detect);return filterAvailableTables2(sql,tables)}async function detectConflicts(sql,table,rows){if(rows.length===0)return[];assertValidTable(table);let pk=getPrimaryKey(table);if(pk.length===1){let key=pk[0],ids=rows.map((r)=>r[key]),existing=await sql.unsafe(`SELECT ${key} FROM ${table} WHERE ${key} = ANY($1)`,[ids]),existingSet=new Set(existing.map((r)=>String(r[key])));return rows.filter((r)=>existingSet.has(String(r[key])))}let conflicts=[];for(let row of rows){let conditions=pk.map((col,i2)=>`${col} = $${i2+1}`).join(" AND "),values2=pk.map((col)=>row[col]);if((await sql.unsafe(`SELECT 1 FROM ${table} WHERE ${conditions} LIMIT 1`,values2)).length>0)conflicts.push(row)}return conflicts}function prepareRow(row,table,selfRefUpdates){let selfRefCol=SELF_REFERENTIAL_COLUMNS[table],entries=Object.entries(row),columns=entries.map(([k])=>k),values2=entries.map(([,v])=>v);for(let col of columns)assertValidColumnName(col);if(selfRefCol&&row[selfRefCol]!=null){let idx=columns.indexOf(selfRefCol);if(idx!==-1){let originalSelfRef=values2[idx];values2[idx]=null;let pk=getPrimaryKey(table);selfRefUpdates.push({pk:pk.length===1?row[pk[0]]:pk.map((k)=>row[k]),value:originalSelfRef})}}return{columns,values:values2,quotedCols:columns.map((c)=>`"${c}"`).join(", "),placeholders:values2.map((_,i2)=>`$${i2+1}`).join(", ")}}async function insertOneRow(tx,table,row,prepared,mode){assertValidTable(table);let{quotedCols,placeholders,values:values2}=prepared,pk=getPrimaryKey(table);if(mode==="overwrite"){let pkCondition=pk.map((col,i2)=>`"${col}" = $${values2.length+i2+1}`).join(" AND "),pkValues=pk.map((col)=>row[col]);await tx.unsafe(`DELETE FROM ${table} WHERE ${pkCondition}`,pkValues),await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders})`,values2)}else if(mode==="merge"){let onConflict=pk.map((c)=>`"${c}"`).join(", ");await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders}) ON CONFLICT (${onConflict}) DO NOTHING`,values2)}else await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders})`,values2)}async function updateSelfRefs(tx,table,updates){assertValidTable(table);let selfRefCol=SELF_REFERENTIAL_COLUMNS[table],pk=getPrimaryKey(table);if(pk.length!==1)return;for(let{pk:pkVal,value}of updates)await tx.unsafe(`UPDATE ${table} SET "${selfRefCol}" = $1 WHERE "${pk[0]}" = $2`,[value,pkVal])}async function insertRows(tx,table,rows,mode){if(rows.length===0)return 0;let selfRefUpdates=[];for(let row of rows){let prepared=prepareRow(row,table,selfRefUpdates);await insertOneRow(tx,table,row,prepared,mode)}if(selfRefUpdates.length>0)await updateSelfRefs(tx,table,selfRefUpdates);return rows.length}function parseExportFile(filePath){let raw=readFileSync38(filePath,"utf-8"),parsed;try{parsed=JSON.parse(raw)}catch{throw Error(`Invalid JSON in ${filePath}`)}let validation=validateExportDocument(parsed);if(!validation.valid)throw Error(`Invalid export document: ${validation.error}`);return validation.doc}async function filterTablesByGroup(allTables,groupFilter){if(!groupFilter||groupFilter.length===0)return allTables;let{GROUP_TABLES:GROUP_TABLES2}=await Promise.resolve().then(() => (init_export_format(),exports_export_format)),allowedTables=new Set;for(let group of groupFilter){let tables=GROUP_TABLES2[group];if(tables)for(let t of tables)allowedTables.add(t);else console.warn(`Warning: Unknown group "${group}", skipping`)}return allTables.filter((t)=>allowedTables.has(t))}async function checkConflicts(sql,tables,data){for(let table of tables){let rows=data[table];if(!rows||rows.length===0)continue;let conflicts=await detectConflicts(sql,table,rows);if(conflicts.length>0){let pk=getPrimaryKey(table),ids=conflicts.slice(0,5).map((r)=>pk.map((k)=>r[k]).join(",")).join("; ");throw Error(`Conflict in table "${table}": ${conflicts.length} existing row(s) (e.g., ${ids}). Use --merge or --overwrite to resolve.`)}}}async function runImport(filePath,mode,groupFilter){let doc=parseExportFile(filePath),tablesToImport=await filterTablesByGroup(Object.keys(doc.data),groupFilter);if(tablesToImport.length===0){console.log("No tables to import.");return}tablesToImport=sortByImportOrder(tablesToImport);let sql=await getSql2(),{available}=await detectTables2(sql,tablesToImport),skippedTables=tablesToImport.filter((t)=>!available.includes(t));if(tablesToImport=available,skippedTables.length>0)console.log(`Skipping tables not in database: ${skippedTables.join(", ")}`);if(mode==="fail")await checkConflicts(sql,tablesToImport,doc.data);let totalInserted=0,tableStats={};await sql.begin(async(tx)=>{for(let table of tablesToImport){let rows=doc.data[table];if(!rows||rows.length===0)continue;let count=await insertRows(tx,table,rows,mode);tableStats[table]=count,totalInserted+=count}});let actor=await getActorName2(),{recordAuditEvent:recordAuditEvent3}=await Promise.resolve().then(() => (init_audit(),exports_audit));await recordAuditEvent3("import",filePath,"import_complete",actor,{mode,tables:tableStats,totalRows:totalInserted,skippedTables,sourceVersion:doc.version,sourceDate:doc.exportedAt}),console.log(`Import complete: ${totalInserted} rows across ${Object.keys(tableStats).length} tables`);for(let[table,count]of Object.entries(tableStats))if(count>0)console.log(` ${table}: ${count} rows`);if(skippedTables.length>0)console.log(`Skipped (not in DB): ${skippedTables.join(", ")}`)}function registerImportCommands(program2){program2.command("import <file>").description("Import genie data from JSON export").option("--fail","Abort on any conflict (default)").option("--merge","Skip existing rows, import new ones").option("--overwrite","Replace existing rows with imported data").option("--groups <list>","Comma-separated groups to import (e.g., boards,tags)").action(async(file,options)=>{try{let mode="fail";if(options.overwrite)mode="overwrite";else if(options.merge)mode="merge";let groupFilter=options.groups?.split(",").map((g)=>g.trim());await runImport(file,mode,groupFilter)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_esm14();import{existsSync as existsSync65,mkdirSync as mkdirSync28,symlinkSync,writeFileSync as writeFileSync28}from"fs";import{basename as basename13,join as join76,relative as relative7,resolve as resolve15,sep as sep2}from"path";import{cpSync,existsSync as existsSync63,mkdirSync as mkdirSync26,renameSync as renameSync9,rmSync as rmSync4}from"fs";import{join as join73,relative as relative6}from"path";var import_ignore=__toESM(require_ignore(),1);import{existsSync as existsSync62,readFileSync as readFileSync39,readdirSync as readdirSync12,statSync as statSync12}from"fs";import{join as join72,relative as relative5}from"path";var GENIEIGNORE_DEFAULTS=`node_modules
4184
4227
  .git
4185
4228
  .genie/worktrees
@@ -4196,8 +4239,8 @@ coverage
4196
4239
  `;function loadIgnoreRules(ignoreFilePath){let ig=import_ignore.default();if(existsSync62(ignoreFilePath)){let content=readFileSync39(ignoreFilePath,"utf-8");ig.add(content)}return ig}async function*scanForAgents(root,ignoreFilePath){let ig=loadIgnoreRules(ignoreFilePath??join72(root,".genieignore"));ig.add("agents"),yield*walkDir(root,root,ig)}function*walkDir(dir,root,ig){let names;try{names=readdirSync12(dir)}catch{return}for(let name of names){let fullPath=join72(dir,name);try{if(!statSync12(fullPath).isDirectory())continue}catch{continue}let relPath=`${relative5(root,fullPath)}/`;if(ig.ignores(relPath))continue;let agentsMdPath=join72(fullPath,"AGENTS.md");if(existsSync62(agentsMdPath)){let hasSubAgents=hasSubAgentDirs(fullPath);if(yield{path:fullPath,dirName:name,hasSubAgents,isSubAgent:!1},hasSubAgents)yield*scanSubAgents2(fullPath,name)}yield*walkDir(fullPath,root,ig)}}function hasSubAgentDirs(agentDir){let subAgentsDir=join72(agentDir,".genie","agents");if(!existsSync62(subAgentsDir))return!1;try{return readdirSync12(subAgentsDir).some((name)=>{let subPath=join72(subAgentsDir,name);try{return statSync12(subPath).isDirectory()&&existsSync62(join72(subPath,"AGENTS.md"))}catch{return!1}})}catch{return!1}}function*scanSubAgents2(parentDir,parentName){let subAgentsDir=join72(parentDir,".genie","agents");if(!existsSync62(subAgentsDir))return;let names;try{names=readdirSync12(subAgentsDir)}catch{return}for(let name of names){let subDir=join72(subAgentsDir,name);try{if(!statSync12(subDir).isDirectory())continue}catch{continue}if(!existsSync62(join72(subDir,"AGENTS.md")))continue;yield{path:subDir,dirName:name,hasSubAgents:!1,isSubAgent:!0,parentName}}}async function scanForAgentsAll(root,ignoreFilePath){let results=[];for await(let agent of scanForAgents(root,ignoreFilePath))results.push(agent);return results}init_workspace();async function discoverExternalAgents(workspaceRoot){let allScanned=await scanForAgentsAll(workspaceRoot),canonicalNames=new Set(scanAgents(workspaceRoot)),agentsDir=join73(workspaceRoot,"agents"),external2=[];for(let scanned of allScanned){if(scanned.path.startsWith(agentsDir))continue;if(canonicalNames.has(scanned.dirName))continue;external2.push({name:scanned.dirName,path:scanned.path,relativePath:relative6(workspaceRoot,scanned.path),isSubAgent:scanned.isSubAgent,parentName:scanned.parentName})}return external2}function importAgents(workspaceRoot,agents){let agentsDir=join73(workspaceRoot,"agents");mkdirSync26(agentsDir,{recursive:!0});let result2={imported:[],skipped:[],errors:[]};for(let agent of agents){let destName=resolveUniqueName(agentsDir,agent.name),destPath=join73(agentsDir,destName);if(existsSync63(destPath)){result2.skipped.push(agent.name);continue}try{moveDirectory(agent.path,destPath),result2.imported.push(destName)}catch(err){result2.errors.push({name:agent.name,error:err instanceof Error?err.message:String(err)})}}return result2}function moveDirectory(src,dest){try{renameSync9(src,dest)}catch{cpSync(src,dest,{recursive:!0}),rmSync4(src,{recursive:!0,force:!0})}}function resolveUniqueName(agentsDir,name){if(!existsSync63(join73(agentsDir,name)))return name;let suffix=2;while(existsSync63(join73(agentsDir,`${name}-${suffix}`)))suffix++;return`${name}-${suffix}`}init_interactivity();init_defaults();import{readFileSync as readFileSync40,writeFileSync as writeFileSync26}from"fs";import{join as join74}from"path";function formatDefaults(workspaceDefaults){let effective=computeEffectiveDefaults(workspaceDefaults),lines=[];for(let key of Object.keys(BUILTIN_DEFAULTS)){let value=effective[key],source=workspaceDefaults?.[key]!==void 0?"workspace":"built-in";lines.push(` ${key}: ${value} (${source})`)}return lines.join(`
4197
4240
  `)}function formatWelcome(ctx){let lines=["",` Workspace: ${ctx.workspaceName}`,` Agents: ${ctx.canonicalAgentCount} registered`];if(ctx.discovered.length>0)lines.push(` Discovered: ${ctx.discovered.length} external agent(s) found`);return lines.push(""),lines.push(" Effective defaults:"),lines.push(formatDefaults(ctx.config.agents?.defaults)),lines.push(""),lines.join(`
4198
4241
  `)}function formatNextSteps(ctx){let lines=[""," Next steps:"];if(ctx.canonicalAgentCount===0)lines.push(" genie init agent <name> Scaffold your first agent");return lines.push(" genie spawn <agent> Launch an agent"),lines.push(" genie team create <name> Create a multi-agent team"),lines.push(" /wizard Full guided onboarding"),lines.push(""),lines.join(`
4199
- `)}var MODEL_CHOICES=[{name:"opus (most capable)",value:"opus"},{name:"sonnet (balanced)",value:"sonnet"},{name:"haiku (fastest)",value:"haiku"}];async function runMiniWizard(ctx){let{confirm:confirm2}=await Promise.resolve().then(() => (init_esm14(),exports_esm));console.log(formatWelcome(ctx));let wantCustomize=await confirm2({message:"Customize workspace defaults?",default:!1}),result2={customized:!1,importedAgents:[],completed:!0};if(wantCustomize){let newDefaults=await customizeDefaults(ctx.config.agents?.defaults);if(newDefaults)result2.customized=!0,result2.defaults=newDefaults,persistDefaults(ctx.workspaceRoot,newDefaults)}if(ctx.pending.length>0){console.log(`
4200
- Found ${ctx.pending.length} agent(s) in your project tree:`);for(let agent of ctx.pending)console.log(` ${agent.name} (${agent.relativePath})`);if(await confirm2({message:"Import discovered agents into workspace?",default:!0}))result2.importedAgents=ctx.pending.map((a)=>a.name)}return console.log(formatNextSteps(ctx)),result2}async function customizeDefaults(currentDefaults){let{select:select2}=await Promise.resolve().then(() => (init_esm14(),exports_esm)),effective=computeEffectiveDefaults(currentDefaults),updates={},changed=!1,model=await select2({message:"Default model:",choices:MODEL_CHOICES,default:effective.model});if(model!==BUILTIN_DEFAULTS.model)updates.model=model,changed=!0;let permissionMode=await select2({message:"Default permission mode:",choices:[{name:"auto (tool-by-tool judgment \u2014 default)",value:"auto"},{name:"default (ask for risky tools)",value:"default"},{name:"plan (require plan approval)",value:"plan"},{name:"bypassPermissions (auto-approve all)",value:"bypassPermissions"}],default:effective.permissionMode});if(permissionMode!==BUILTIN_DEFAULTS.permissionMode)updates.permissionMode=permissionMode,changed=!0;return changed?updates:null}function persistDefaults(workspaceRoot,newDefaults){let configPath2=join74(workspaceRoot,".genie","workspace.json");try{let raw=readFileSync40(configPath2,"utf-8"),config=JSON.parse(raw);if(!config.agents)config.agents={};if(!config.agents.defaults)config.agents.defaults={};Object.assign(config.agents.defaults,newDefaults),writeFileSync26(configPath2,`${JSON.stringify(config,null,2)}
4242
+ `)}var MODEL_CHOICES=[{name:"opus (most capable)",value:"opus"},{name:"sonnet (balanced)",value:"sonnet"},{name:"haiku (fastest)",value:"haiku"}];async function runMiniWizard(ctx){let{confirm:confirm3}=await Promise.resolve().then(() => (init_esm14(),exports_esm));console.log(formatWelcome(ctx));let wantCustomize=await confirm3({message:"Customize workspace defaults?",default:!1}),result2={customized:!1,importedAgents:[],completed:!0};if(wantCustomize){let newDefaults=await customizeDefaults(ctx.config.agents?.defaults);if(newDefaults)result2.customized=!0,result2.defaults=newDefaults,persistDefaults(ctx.workspaceRoot,newDefaults)}if(ctx.pending.length>0){console.log(`
4243
+ Found ${ctx.pending.length} agent(s) in your project tree:`);for(let agent of ctx.pending)console.log(` ${agent.name} (${agent.relativePath})`);if(await confirm3({message:"Import discovered agents into workspace?",default:!0}))result2.importedAgents=ctx.pending.map((a)=>a.name)}return console.log(formatNextSteps(ctx)),result2}async function customizeDefaults(currentDefaults){let{select:select2}=await Promise.resolve().then(() => (init_esm14(),exports_esm)),effective=computeEffectiveDefaults(currentDefaults),updates={},changed=!1,model=await select2({message:"Default model:",choices:MODEL_CHOICES,default:effective.model});if(model!==BUILTIN_DEFAULTS.model)updates.model=model,changed=!0;let permissionMode=await select2({message:"Default permission mode:",choices:[{name:"auto (tool-by-tool judgment \u2014 default)",value:"auto"},{name:"default (ask for risky tools)",value:"default"},{name:"plan (require plan approval)",value:"plan"},{name:"bypassPermissions (auto-approve all)",value:"bypassPermissions"}],default:effective.permissionMode});if(permissionMode!==BUILTIN_DEFAULTS.permissionMode)updates.permissionMode=permissionMode,changed=!0;return changed?updates:null}function persistDefaults(workspaceRoot,newDefaults){let configPath2=join74(workspaceRoot,".genie","workspace.json");try{let raw=readFileSync40(configPath2,"utf-8"),config=JSON.parse(raw);if(!config.agents)config.agents={};if(!config.agents.defaults)config.agents.defaults={};Object.assign(config.agents.defaults,newDefaults),writeFileSync26(configPath2,`${JSON.stringify(config,null,2)}
4201
4244
  `,"utf-8"),console.log(" Workspace defaults updated.")}catch(err){console.error(` Failed to update workspace.json: ${err instanceof Error?err.message:String(err)}`)}}import{existsSync as existsSync64,mkdirSync as mkdirSync27,readFileSync as readFileSync41,writeFileSync as writeFileSync27}from"fs";import{join as join75}from"path";function pendingPath(workspaceRoot){return join75(workspaceRoot,".genie","pending-agents.json")}function loadPending(workspaceRoot){let filePath=pendingPath(workspaceRoot);if(!existsSync64(filePath))return{agents:[]};try{let raw=readFileSync41(filePath,"utf-8"),parsed=JSON.parse(raw);return{agents:Array.isArray(parsed.agents)?parsed.agents:[]}}catch{return{agents:[]}}}function savePending(workspaceRoot,store){let filePath=pendingPath(workspaceRoot);mkdirSync27(join75(workspaceRoot,".genie"),{recursive:!0}),writeFileSync27(filePath,`${JSON.stringify(store,null,2)}
4202
4245
  `,"utf-8")}function refreshPending(workspaceRoot,discovered){let existing=loadPending(workspaceRoot),dismissedSet=new Set(existing.agents.filter((a)=>a.dismissed).map((a)=>a.path)),now=new Date().toISOString(),store={agents:discovered.map((d)=>({name:d.name,path:d.path,relativePath:d.relativePath,isSubAgent:d.isSubAgent,parentName:d.parentName,discoveredAt:existing.agents.find((a)=>a.path===d.path)?.discoveredAt??now,dismissed:dismissedSet.has(d.path)}))};return savePending(workspaceRoot,store),store}function listPending(workspaceRoot){return loadPending(workspaceRoot).agents.filter((a)=>!a.dismissed)}function removePending(workspaceRoot,agentPath){let store=loadPending(workspaceRoot),idx=store.agents.findIndex((a)=>a.path===agentPath);if(idx===-1)return!1;return store.agents.splice(idx,1),savePending(workspaceRoot,store),!0}init_workspace();init_templates();function detectPgUrl(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;if(process.env.PG_URL)return process.env.PG_URL;try{let{execSync:execSync17}=__require("child_process"),match=execSync17("pgrep -af pgserve 2>/dev/null",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(/postgres(?:ql)?:\/\/[^\s]+/);if(match)return match[0]}catch{}return}async function ensureSetupCompleteForInit(){let{isSetupComplete:isSetupComplete2}=await Promise.resolve().then(() => (init_genie_config2(),exports_genie_config));if(isSetupComplete2())return;console.log("Genie setup not complete. Running `genie setup` before continuing...");let{setupCommand:setupCommand2}=await Promise.resolve().then(() => (init_setup(),exports_setup));await setupCommand2()}function scaffoldAgentInWorkspace(workspaceRoot,name,agentsDir){let baseDir=agentsDir??join76(workspaceRoot,"agents"),agentDir=join76(baseDir,name);if(existsSync65(agentDir))throw Error(`Agent directory already exists: ${agentDir}`);mkdirSync28(agentDir,{recursive:!0}),mkdirSync28(join76(agentDir,"brain","memory"),{recursive:!0}),mkdirSync28(join76(agentDir,".claude"),{recursive:!0});let workspaceDefaults;try{workspaceDefaults=getWorkspaceConfig(workspaceRoot).agents?.defaults}catch{}scaffoldAgentFiles(agentDir,name,workspaceDefaults);let settings={agentName:name,autoMemoryEnabled:!0,autoMemoryDirectory:"./brain/memory"};writeFileSync28(join76(agentDir,".claude","settings.local.json"),`${JSON.stringify(settings,null,2)}
4203
4246
  `),writeFileSync28(join76(agentDir,"brain","memory","MEMORY.md"),`# Memory Index
@@ -4222,12 +4265,12 @@ Event Throughput (last 60s):`),console.log(` Emitted: ${data.events_emitted_la
4222
4265
  Project: ${p.name}`),console.log("\u2500".repeat(50)),console.log(` ID: ${p.id}`),console.log(` Type: ${p.repoPath?"repo":"virtual"}`),p.repoPath)console.log(` Path: ${p.repoPath}`);if(p.description)console.log(` Desc: ${p.description}`);if(console.log(` Created: ${formatDate(p.createdAt)}`),console.log(` Tasks: ${tasks.length}`),tasks.length>0){console.log(`
4223
4266
  By status:`);for(let[status,count]of Object.entries(byStatus).sort())console.log(` ${padRight(status,15)} ${count}`);console.log(`
4224
4267
  By stage:`);for(let[stage,count]of Object.entries(byStage).sort())console.log(` ${padRight(stage,15)} ${count}`)}}function registerProjectCommands(program2){let project=program2.command("project").description("Project management \u2014 named task boards");project.command("list").description("List all projects").option("--all","Include archived projects").option("--json","Output as JSON").action(async(options)=>{try{let ts3=await getTaskService5(),projects=await ts3.listProjectsFiltered(options.all);if(options.json){console.log(JSON.stringify(projects,null,2));return}if(projects.length===0){console.log("No projects found. Projects are auto-created when you run `genie task create`.");return}await printProjectList(ts3,projects)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),project.command("create <name>").description("Create a new project").option("--virtual","Create a virtual project (not tied to a repo)").option("--repo <path>","Repo path for the project").option("--description <text>","Project description").action(async(name,options)=>{try{let ts3=await getTaskService5(),repoPath=options.virtual?null:options.repo??null,p=await ts3.createProject({name,repoPath,description:options.description});if(console.log(`Created project "${p.name}"`),console.log(` ID: ${p.id}`),console.log(` Type: ${p.repoPath?"repo":"virtual"}`),p.repoPath)console.log(` Path: ${p.repoPath}`);if(p.description)console.log(` Desc: ${p.description}`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),project.command("show <name>").description("Show project detail with task stats").option("--json","Output as JSON").action(async(name,options)=>{try{let ts3=await getTaskService5(),p=await ts3.getProjectByName(name);if(!p){console.error(`Error: Project not found: ${name}`),process.exit(1);return}if(options.json){console.log(JSON.stringify(p,null,2));return}let tasks=await ts3.listTasks({projectName:name,allProjects:!0});printProjectDetail(p,tasks)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),project.command("archive <name>").description("Archive a project (cascades to boards and unfinished tasks)").action(async(name)=>{try{await(await getTaskService5()).archiveProject(name),console.log(`Archived project "${name}" and cascaded to boards + unfinished tasks.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),project.command("unarchive <name>").description("Restore an archived project and its boards (tasks stay as-is)").action(async(name)=>{try{await(await getTaskService5()).unarchiveProject(name),console.log(`Unarchived project "${name}" and restored boards.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),project.command("set-default <name>").description("Set default project for when outside any repo").action(async(name)=>{try{if(!await(await getTaskService5()).getProjectByName(name))console.error(`Error: Project not found: ${name}`),process.exit(1);let{loadGenieConfig:loadGenieConfig2,saveGenieConfig:saveGenieConfig2}=await Promise.resolve().then(() => (init_genie_config2(),exports_genie_config)),config=await loadGenieConfig2();config.defaultProject=name,await saveGenieConfig2(config),console.log(`Default project set to "${name}"`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_agent_registry();init_db();function parsePositiveInt(value,name){let parsed=Number.parseInt(value,10);if(!Number.isFinite(parsed)||parsed<=0)throw Error(`Invalid ${name}: ${value} (expected a positive integer)`);return parsed}async function runDryRun(ttlHours){let zombies=await listExhaustedZombies(ttlHours);if(zombies.length===0){console.log(`No exhausted zombies older than ${ttlHours}h.`);return}let plural=zombies.length===1?"":"s";console.log(`Would archive ${zombies.length} zombie agent${plural} older than ${ttlHours}h:`);for(let z of zombies)console.log(` ${z.id} (last state change: ${z.lastStateChange})`)}async function runArchive(ttlHours){let ids=await archiveExhaustedZombies(ttlHours);if(ids.length===0){console.log(`No exhausted zombies older than ${ttlHours}h. Nothing to archive.`);return}let plural=ids.length===1?"":"s";console.log(`Archived ${ids.length} zombie agent${plural} older than ${ttlHours}h:`);for(let id of ids)console.log(` ${id}`)}async function pruneCommand(options){if(!options.zombies)console.error("Error: no prune target specified. Use `--zombies`."),console.error("See `genie prune --help` for available targets."),process.exit(2);let ttlHours=options.ttlHours??24;if(!await isAvailable())console.error("Database is not running. Start it with: genie db status"),process.exit(1);try{await(options.dryRun?runDryRun(ttlHours):runArchive(ttlHours))}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`Prune failed: ${message}`),process.exit(1)}finally{await shutdown().catch(()=>{})}}function registerPruneCommands(program2){program2.command("prune").description("Bulk cleanup of stale or exhausted registry entries").option("--zombies","Archive dead-pane zombies whose auto-resume retries are exhausted").option("--dry-run","List targets that would be affected without mutating").option("--ttl-hours <hours>","Minimum age in hours before a zombie is eligible for archive (default: 24)",(v)=>parsePositiveInt(v,"--ttl-hours")).action(pruneCommand)}init_agent_registry();import{readFile as readFile16,stat as stat10}from"fs/promises";import{join as join80}from"path";import{readFile as readFile14}from"fs/promises";async function parseQaSpec(filePath){let content=await readFile14(filePath,"utf-8");return parseQaSpecContent(content,filePath)}var SECTION_MAP={setup:"setup",actions:"actions",expect:"expect"};function detectSection(line){for(let[keyword,section]of Object.entries(SECTION_MAP))if(new RegExp(`^##\\s+${keyword}`,"i").test(line))return section;if(line.startsWith("## "))return"none";return null}function parseQaSpecContent(content,filePath="<inline>"){let lines=content.split(`
4225
- `),name="",currentSection="none",setup=[],actions=[],expect=[],parsers2={none:()=>{},setup:(line)=>{let step=parseSetupLine(line);if(step)setup.push(step)},actions:(line)=>{let step=parseActionLine(line);if(step)actions.push(step)},expect:(line)=>{let exp=parseExpectLine(line);if(exp)expect.push(exp)}};for(let line of lines){let trimmed=line.trim();if(trimmed.startsWith("# ")&&!trimmed.startsWith("## ")){let match=trimmed.match(/^#\s+(?:Test:\s*)?(.+)$/);if(match)name=match[1].trim();continue}let section=detectSection(trimmed);if(section!==null){currentSection=section;continue}if(!trimmed||trimmed.startsWith("//")||trimmed.startsWith("<!--"))continue;parsers2[currentSection](trimmed)}if(!name)name=filePath.replace(/.*\//,"").replace(/\.md$/,"");return{name,file:filePath,setup,actions,expect}}function parseSetupLine(line){let text=stripListPrefix(line);if(!text)return null;let spawnMatch=text.match(/^spawn\s+(\S+)(?:\s+\((.+)\))?$/i);if(spawnMatch)return{kind:"spawn",target:spawnMatch[1],options:spawnMatch[2]?parseOptions2(spawnMatch[2]):{}};let followMatch=text.match(/^(?:start\s+)?follow(?:\s+(?:on\s+)?(\S+))?(?:\s+\((.+)\))?$/i);if(followMatch)return{kind:"follow",target:followMatch[1]||"team",options:followMatch[2]?parseOptions2(followMatch[2]):{}};return null}function parseActionLine(line){let text=stripListPrefix(line);if(!text)return null;let sendMatch=text.match(/^send\s+"([^"]+)"\s+to\s+(\S+)/i);if(sendMatch)return{kind:"send",message:sendMatch[1],to:sendMatch[2]};let waitMatch=text.match(/^wait\s+(?:for\s+.+?\s+)?\(?(?:max\s+)?(\d+)s\)?/i);if(waitMatch)return{kind:"wait",seconds:Number.parseInt(waitMatch[1],10)};let runMatch=text.match(/^run\s+(.+)$/i);if(runMatch)return{kind:"run",command:runMatch[1]};return null}function detectSource(text){if(/\binbox\b/i.test(text))return"inbox";if(/\blog\b/i.test(text))return"log";if(/\boutput\b/i.test(text))return"output";return"log"}function extractMatchers(text){let matchers={},matcherRegex=/(\w+)\s*([~!]?=)\s*(?:"([^"]+)"|(\S+))/g;for(let match of text.matchAll(matcherRegex)){let op=match[2]==="~="?"~":"",value=(match[3]??match[4]).trim();matchers[match[1]]=`${op}${value}`}return matchers}function parseExpectLine(line){let text=line.replace(/^[-*]\s*\[[ x]\]\s*/i,"").trim();if(!text)return null;return{description:text,source:detectSource(text),matchers:extractMatchers(text)}}function stripListPrefix(line){return line.replace(/^[-*]\s+/,"").replace(/^\d+\.\s+/,"").trim()}function parseOptions2(text){let opts={};for(let pair of text.split(",")){let[key,...rest]=pair.split(":");if(key&&rest.length>0)opts[key.trim()]=rest.join(":").trim()}return opts}import{cp as cp2,mkdir as mkdir11,rm as rm4,writeFile as writeFile10}from"fs/promises";import{tmpdir as tmpdir4}from"os";import{dirname as dirname23,join as join79,resolve as resolve17}from"path";var{$:$4}=globalThis.Bun;import{createHash as createHash9}from"crypto";import{mkdir as mkdir10,readFile as readFile15,readdir as readdir10,stat as stat9,writeFile as writeFile9}from"fs/promises";import{homedir as homedir44}from"os";import{join as join78,relative as relative8,resolve as resolve16}from"path";function repoHash(repoPath){return createHash9("sha256").update(resolve16(repoPath)).digest("hex").slice(0,12)}function resultsDir(repoPath){let base=process.env.GENIE_HOME??join78(homedir44(),".genie");return join78(base,"qa",repoHash(repoPath))}function resultsPath(repoPath){return join78(resultsDir(repoPath),"results.json")}async function loadResults(repoPath){try{let raw=await readFile15(resultsPath(repoPath),"utf-8");return JSON.parse(raw)}catch{return{}}}async function saveResult(repoPath,specKey,report){let dir=resultsDir(repoPath);await mkdir10(dir,{recursive:!0});let results=await loadResults(repoPath),specHash=await hashSpecFile(report.file);results[specKey]={lastRun:new Date().toISOString(),result:report.result,durationMs:report.durationMs,specHash,expectations:report.expectations,error:report.error},await writeFile9(resultsPath(repoPath),JSON.stringify(results,null,2))}async function isStale(repoPath,specKey,specFilePath){let stored=(await loadResults(repoPath))[specKey];if(!stored)return!1;return await hashSpecFile(specFilePath)!==stored.specHash}async function listAllSpecs(specDir){let entries=[];return await walkSpecs(specDir,specDir,entries),entries.sort((a,b2)=>{if(a.domain!==b2.domain)return a.domain.localeCompare(b2.domain);return a.name.localeCompare(b2.name)})}async function hashSpecFile(filePath){try{let content=await readFile15(filePath,"utf-8");return createHash9("sha256").update(content).digest("hex").slice(0,12)}catch{return"unknown"}}async function walkSpecs(baseDir,dir,entries){let items=await readdir10(dir);for(let item of items){let fullPath=join78(dir,item);if((await stat9(fullPath)).isDirectory())await walkSpecs(baseDir,fullPath,entries);else if(item.endsWith(".md")){let rel=relative8(baseDir,fullPath),parts=rel.replace(/\.md$/,"").split("/"),domain=parts.length>1?parts.slice(0,-1).join("/"):"(root)",name=parts[parts.length-1];entries.push({key:rel.replace(/\.md$/,""),domain,name,filePath:fullPath})}}}function specKeyFromPath(specDir,filePath){return relative8(specDir,filePath).replace(/\.md$/,"")}function formatTimeAgo(isoDate){let ms=Date.now()-new Date(isoDate).getTime(),seconds=Math.floor(ms/1000);if(seconds<60)return`${seconds}s ago`;let minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m ago`;let hours=Math.floor(minutes/60);if(hours<24)return`${hours}h ago`;return`${Math.floor(hours/24)}d ago`}init_runtime_events();init_team_manager();function emitNdjson(event){process.stdout.write(`${JSON.stringify(event)}
4268
+ `),name="",currentSection="none",setup=[],actions=[],expect=[],parsers2={none:()=>{},setup:(line)=>{let step=parseSetupLine(line);if(step)setup.push(step)},actions:(line)=>{let step=parseActionLine(line);if(step)actions.push(step)},expect:(line)=>{let exp=parseExpectLine(line);if(exp)expect.push(exp)}};for(let line of lines){let trimmed=line.trim();if(trimmed.startsWith("# ")&&!trimmed.startsWith("## ")){let match=trimmed.match(/^#\s+(?:Test:\s*)?(.+)$/);if(match)name=match[1].trim();continue}let section=detectSection(trimmed);if(section!==null){currentSection=section;continue}if(!trimmed||trimmed.startsWith("//")||trimmed.startsWith("<!--"))continue;parsers2[currentSection](trimmed)}if(!name)name=filePath.replace(/.*\//,"").replace(/\.md$/,"");return{name,file:filePath,setup,actions,expect}}function parseSetupLine(line){let text=stripListPrefix(line);if(!text)return null;let spawnMatch=text.match(/^spawn\s+(\S+)(?:\s+\((.+)\))?$/i);if(spawnMatch)return{kind:"spawn",target:spawnMatch[1],options:spawnMatch[2]?parseOptions2(spawnMatch[2]):{}};let followMatch=text.match(/^(?:start\s+)?follow(?:\s+(?:on\s+)?(\S+))?(?:\s+\((.+)\))?$/i);if(followMatch)return{kind:"follow",target:followMatch[1]||"team",options:followMatch[2]?parseOptions2(followMatch[2]):{}};return null}function parseActionLine(line){let text=stripListPrefix(line);if(!text)return null;let sendMatch=text.match(/^send\s+"([^"]+)"\s+to\s+(\S+)/i);if(sendMatch)return{kind:"send",message:sendMatch[1],to:sendMatch[2]};let waitMatch=text.match(/^wait\s+(?:for\s+.+?\s+)?\(?(?:max\s+)?(\d+)s\)?/i);if(waitMatch)return{kind:"wait",seconds:Number.parseInt(waitMatch[1],10)};let runMatch=text.match(/^run\s+(.+)$/i);if(runMatch)return{kind:"run",command:runMatch[1]};return null}function detectSource(text){if(/\binbox\b/i.test(text))return"inbox";if(/\blog\b/i.test(text))return"log";if(/\boutput\b/i.test(text))return"output";return"log"}function extractMatchers(text){let matchers={},matcherRegex=/(\w+)\s*([~!]?=)\s*(?:"([^"]+)"|(\S+))/g;for(let match of text.matchAll(matcherRegex)){let op=match[2]==="~="?"~":"",value=(match[3]??match[4]).trim();matchers[match[1]]=`${op}${value}`}return matchers}function parseExpectLine(line){let text=line.replace(/^[-*]\s*\[[ x]\]\s*/i,"").trim();if(!text)return null;return{description:text,source:detectSource(text),matchers:extractMatchers(text)}}function stripListPrefix(line){return line.replace(/^[-*]\s+/,"").replace(/^\d+\.\s+/,"").trim()}function parseOptions2(text){let opts={};for(let pair of text.split(",")){let[key,...rest]=pair.split(":");if(key&&rest.length>0)opts[key.trim()]=rest.join(":").trim()}return opts}import{cp as cp2,mkdir as mkdir11,rm as rm4,writeFile as writeFile10}from"fs/promises";import{tmpdir as tmpdir4}from"os";import{dirname as dirname23,join as join79,resolve as resolve17}from"path";var{$:$4}=globalThis.Bun;import{createHash as createHash9}from"crypto";import{mkdir as mkdir10,readFile as readFile15,readdir as readdir10,stat as stat9,writeFile as writeFile9}from"fs/promises";import{homedir as homedir44}from"os";import{join as join78,relative as relative8,resolve as resolve16}from"path";function repoHash(repoPath){return createHash9("sha256").update(resolve16(repoPath)).digest("hex").slice(0,12)}function resultsDir(repoPath){let base=process.env.GENIE_HOME??join78(homedir44(),".genie");return join78(base,"qa",repoHash(repoPath))}function resultsPath(repoPath){return join78(resultsDir(repoPath),"results.json")}async function loadResults(repoPath){try{let raw=await readFile15(resultsPath(repoPath),"utf-8");return JSON.parse(raw)}catch{return{}}}async function saveResult(repoPath,specKey,report2){let dir=resultsDir(repoPath);await mkdir10(dir,{recursive:!0});let results=await loadResults(repoPath),specHash=await hashSpecFile(report2.file);results[specKey]={lastRun:new Date().toISOString(),result:report2.result,durationMs:report2.durationMs,specHash,expectations:report2.expectations,error:report2.error},await writeFile9(resultsPath(repoPath),JSON.stringify(results,null,2))}async function isStale(repoPath,specKey,specFilePath){let stored=(await loadResults(repoPath))[specKey];if(!stored)return!1;return await hashSpecFile(specFilePath)!==stored.specHash}async function listAllSpecs(specDir){let entries=[];return await walkSpecs(specDir,specDir,entries),entries.sort((a,b2)=>{if(a.domain!==b2.domain)return a.domain.localeCompare(b2.domain);return a.name.localeCompare(b2.name)})}async function hashSpecFile(filePath){try{let content=await readFile15(filePath,"utf-8");return createHash9("sha256").update(content).digest("hex").slice(0,12)}catch{return"unknown"}}async function walkSpecs(baseDir,dir,entries){let items=await readdir10(dir);for(let item of items){let fullPath=join78(dir,item);if((await stat9(fullPath)).isDirectory())await walkSpecs(baseDir,fullPath,entries);else if(item.endsWith(".md")){let rel=relative8(baseDir,fullPath),parts=rel.replace(/\.md$/,"").split("/"),domain=parts.length>1?parts.slice(0,-1).join("/"):"(root)",name=parts[parts.length-1];entries.push({key:rel.replace(/\.md$/,""),domain,name,filePath:fullPath})}}}function specKeyFromPath(specDir,filePath){return relative8(specDir,filePath).replace(/\.md$/,"")}function formatTimeAgo(isoDate){let ms=Date.now()-new Date(isoDate).getTime(),seconds=Math.floor(ms/1000);if(seconds<60)return`${seconds}s ago`;let minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m ago`;let hours=Math.floor(minutes/60);if(hours<24)return`${hours}h ago`;return`${Math.floor(hours/24)}d ago`}init_runtime_events();init_team_manager();function emitNdjson(event){process.stdout.write(`${JSON.stringify(event)}
4226
4269
  `)}async function publishQaEvent(repoPath,qaType,payload){let{specKey,domain,team,...rest}=payload;await publishSubjectEvent(repoPath,`genie.qa.${qaType}`,{kind:"qa",agent:"qa",team,text:`${qaType}: ${specKey}`,data:{qaType,specKey,domain,...rest},source:"hook"})}async function emitQaEvent(repoPath,qaType,payload,ndjson){if(await publishQaEvent(repoPath,qaType,payload),ndjson)emitNdjson(payload)}function parseStatusEntry(status,parts,index){if(status.startsWith("R")){let from=parts[index]??"",to=parts[index+1]??"";if(from&&to)return{op:{kind:"rename",from,to},nextIndex:index+2};return{op:null,nextIndex:index+2}}let path3=parts[index]??"";if(!path3)return{op:null,nextIndex:index+1};return{op:{kind:status.startsWith("D")?"delete":"copy",path:path3},nextIndex:index+1}}function parseNameStatusZ(output){if(!output)return[];let parts=output.split("\x00").filter(Boolean),ops=[],i2=0;while(i2<parts.length){let status=parts[i2++]??"";if(!status)break;let{op,nextIndex}=parseStatusEntry(status,parts,i2);if(i2=nextIndex,op)ops.push(op)}return ops}async function overlayDirtyWorkingTree(repoPath,worktreePath){let tracked=(await $4`git -C ${repoPath} diff --name-status --find-renames -z HEAD --`.quiet().nothrow().text()).trim(),untracked=(await $4`git -C ${repoPath} ls-files --others --exclude-standard -z`.quiet().nothrow().text()).trim(),ops=parseNameStatusZ(tracked);for(let path3 of untracked.split("\x00").filter(Boolean))ops.push({kind:"copy",path:path3});for(let op of ops){if(op.kind==="delete"){await rm4(join79(worktreePath,op.path),{recursive:!0,force:!0});continue}if(op.kind==="rename"){await rm4(join79(worktreePath,op.from),{recursive:!0,force:!0});let src2=join79(repoPath,op.to),dest2=join79(worktreePath,op.to);await mkdir11(dirname23(dest2),{recursive:!0}),await cp2(src2,dest2,{recursive:!0,force:!0});continue}let src=join79(repoPath,op.path),dest=join79(worktreePath,op.path);await mkdir11(dirname23(dest),{recursive:!0}),await cp2(src,dest,{recursive:!0,force:!0})}}async function runAllSpecs(specDir,options){let entries=await listAllSpecs(specDir);return runSpecEntries(entries,specDir,options)}async function runDomainSpecs(specDir,domain,options){let filtered=(await listAllSpecs(specDir)).filter((e)=>e.domain===domain);return runSpecEntries(filtered,specDir,options)}async function prepareTeams(entries,repoPath,ndjson){let prepared=[];console.error(`
4227
- [qa] Creating ${entries.length} teams...`);for(let entry2 of entries){let teamName=`qa-${Date.now().toString(36)}-${entry2.name.slice(0,8)}`;try{let spec=await parseQaSpec(entry2.filePath),config=await createTeam(teamName,repoPath);await overlayDirtyWorkingTree(repoPath,config.worktreePath),await hireAgent(teamName,"qa");let prompt2=buildTeamLeadPrompt(spec,teamName,repoPath),promptFile=join79(tmpdir4(),`genie-qa-${teamName}.md`);await writeFile10(promptFile,prompt2),prepared.push({entry:entry2,spec,teamName,worktreePath:config.worktreePath,promptFile}),console.error(` \u2713 ${entry2.name}`),await emitQaEvent(repoPath,"team-created",{type:"qa:team-created",specKey:entry2.key,domain:entry2.domain,team:teamName},ndjson)}catch(err){console.error(` \u2717 ${entry2.name}: ${err instanceof Error?err.message:err}`)}await new Promise((r)=>setTimeout(r,200))}return prepared}async function emitSpecDone(repoPath,specKey,domain,team,report,ndjson){await emitQaEvent(repoPath,"spec-done",{type:"qa:spec-done",specKey,domain,team,result:report.result,durationMs:report.durationMs,expectations:report.expectations,error:report.error},ndjson)}async function runSpecEntries(entries,specDir,options){let repoPath=resolve17(options?.repoPath??process.cwd()),maxConcurrency=options?.parallel??5,timeoutMs=(options?.timeout??3600)*1000,ndjson=options?.ndjson??!1,GREEN="\x1B[32m",RED="\x1B[31m",RESET2="\x1B[0m",DIM2="\x1B[90m",prepared=await prepareTeams(entries,repoPath,ndjson);if(prepared.length===0)return[];let timelineSub=await followRuntimeEvents({repoPath,teamPrefix:"qa-"},(event)=>{if(!event?.timestamp||!event?.kind)return;let team=event.team??"";if(!team.startsWith("qa-"))return;let match=prepared.find((p)=>p.teamName===team),specKey=match?.entry.key??team,specName=match?.entry.name??team,domain=match?.entry.domain??"",time=new Date(event.timestamp).toLocaleTimeString("en-US",{hour12:!1}),text=(event.text??"").slice(0,100);if(console.error(` \x1B[90m${time}\x1B[0m \x1B[90m[${event.kind}]\x1B[0m ${specName} \x1B[90m${text}\x1B[0m`),ndjson)emitNdjson({type:"qa:event",specKey,domain,team,event:{timestamp:event.timestamp,kind:event.kind,agent:event.agent??"",text:event.text??""}})},{pollIntervalMs:250});console.error(`
4270
+ [qa] Creating ${entries.length} teams...`);for(let entry2 of entries){let teamName=`qa-${Date.now().toString(36)}-${entry2.name.slice(0,8)}`;try{let spec=await parseQaSpec(entry2.filePath),config=await createTeam(teamName,repoPath);await overlayDirtyWorkingTree(repoPath,config.worktreePath),await hireAgent(teamName,"qa");let prompt2=buildTeamLeadPrompt(spec,teamName,repoPath),promptFile=join79(tmpdir4(),`genie-qa-${teamName}.md`);await writeFile10(promptFile,prompt2),prepared.push({entry:entry2,spec,teamName,worktreePath:config.worktreePath,promptFile}),console.error(` \u2713 ${entry2.name}`),await emitQaEvent(repoPath,"team-created",{type:"qa:team-created",specKey:entry2.key,domain:entry2.domain,team:teamName},ndjson)}catch(err){console.error(` \u2717 ${entry2.name}: ${err instanceof Error?err.message:err}`)}await new Promise((r)=>setTimeout(r,200))}return prepared}async function emitSpecDone(repoPath,specKey,domain,team,report2,ndjson){await emitQaEvent(repoPath,"spec-done",{type:"qa:spec-done",specKey,domain,team,result:report2.result,durationMs:report2.durationMs,expectations:report2.expectations,error:report2.error},ndjson)}async function runSpecEntries(entries,specDir,options){let repoPath=resolve17(options?.repoPath??process.cwd()),maxConcurrency=options?.parallel??5,timeoutMs=(options?.timeout??3600)*1000,ndjson=options?.ndjson??!1,GREEN="\x1B[32m",RED="\x1B[31m",RESET2="\x1B[0m",DIM2="\x1B[90m",prepared=await prepareTeams(entries,repoPath,ndjson);if(prepared.length===0)return[];let timelineSub=await followRuntimeEvents({repoPath,teamPrefix:"qa-"},(event)=>{if(!event?.timestamp||!event?.kind)return;let team=event.team??"";if(!team.startsWith("qa-"))return;let match=prepared.find((p)=>p.teamName===team),specKey=match?.entry.key??team,specName=match?.entry.name??team,domain=match?.entry.domain??"",time=new Date(event.timestamp).toLocaleTimeString("en-US",{hour12:!1}),text=(event.text??"").slice(0,100);if(console.error(` \x1B[90m${time}\x1B[0m \x1B[90m[${event.kind}]\x1B[0m ${specName} \x1B[90m${text}\x1B[0m`),ndjson)emitNdjson({type:"qa:event",specKey,domain,team,event:{timestamp:event.timestamp,kind:event.kind,agent:event.agent??"",text:event.text??""}})},{pollIntervalMs:250});console.error(`
4228
4271
  [qa] Running ${prepared.length} specs (max ${maxConcurrency} parallel)
4229
- `);let reports=[],running2=0,nextIdx=0,startTime=Date.now();await new Promise((resolveAll)=>{let tryStartNext=()=>{while(running2<maxConcurrency&&nextIdx<prepared.length){let p=prepared[nextIdx++];running2++,emitQaEvent(repoPath,"spec-started",{type:"qa:spec-started",specKey:p.entry.key,domain:p.entry.domain,team:p.teamName},ndjson),runPreparedSpec(repoPath,p.spec,p.teamName,p.worktreePath,p.promptFile,timeoutMs).then(async(report)=>{let key=specKeyFromPath(specDir,p.entry.filePath);await saveResult(repoPath,key,report);let icon=report.result==="pass"?`${"\x1B[32m"}\u2713${"\x1B[0m"}`:`${"\x1B[31m"}\u2717${"\x1B[0m"}`,elapsed=((Date.now()-startTime)/1000).toFixed(0);console.error(` ${icon} ${p.entry.name} (${(report.durationMs/1000).toFixed(0)}s) [${elapsed}s total]`),await emitSpecDone(repoPath,p.entry.key,p.entry.domain,p.teamName,report,ndjson),reports.push(report)}).catch((err)=>{let errorReport=makeErrorReport(p.spec,Date.now(),String(err));reports.push(errorReport),console.error(` ${"\x1B[31m"}\u2717${"\x1B[0m"} ${p.entry.name}: ${err}`),emitSpecDone(repoPath,p.entry.key,p.entry.domain,p.teamName,errorReport,ndjson)}).finally(()=>{if(running2--,reports.length===prepared.length)resolveAll();else tryStartNext()})}};tryStartNext()}),await timelineSub.stop(),console.error(`
4230
- [qa] Cleaning up ${prepared.length} teams...`);for(let p of prepared)try{await disbandTeam(p.teamName)}catch{}return reports}async function runSpec(spec,options){let repoPath=resolve17(options?.repoPath??process.cwd()),timeoutMs=(options?.timeout??3600)*1000,ndjson=options?.ndjson??!1,specKey=options?.specKey??spec.name,domain=specKey.includes("/")?specKey.split("/").slice(0,-1).join("/"):"(root)",teamName=`qa-${Date.now().toString(36)}-${spec.name.slice(0,8).replace(/\s+/g,"-")}`,start3=Date.now();try{let config=await createTeam(teamName,repoPath);await overlayDirtyWorkingTree(repoPath,config.worktreePath),await hireAgent(teamName,"qa"),await emitQaEvent(repoPath,"team-created",{type:"qa:team-created",specKey,domain,team:teamName},ndjson);let prompt2=buildTeamLeadPrompt(spec,teamName,repoPath),promptFile=join79(tmpdir4(),`genie-qa-${teamName}.md`);await writeFile10(promptFile,prompt2),await emitQaEvent(repoPath,"spec-started",{type:"qa:spec-started",specKey,domain,team:teamName},ndjson);let report=await runPreparedSpec(repoPath,spec,teamName,config.worktreePath,promptFile,timeoutMs);return await emitSpecDone(repoPath,specKey,domain,teamName,report,ndjson),await disbandTeam(teamName),report}catch(err){try{await disbandTeam(teamName)}catch{}let errorReport=makeErrorReport(spec,start3,String(err));return await emitSpecDone(repoPath,specKey,domain,teamName,errorReport,ndjson),errorReport}}async function runPreparedSpec(repoPath,spec,teamName,worktreePath,promptFile,timeoutMs){let start3=Date.now(),effectiveTimeoutMs=computeEffectiveTimeoutMs(spec,timeoutMs);try{let{handleWorkerSpawn:handleWorkerSpawn2}=await Promise.resolve().then(() => (init_agents(),exports_agents)),_paneId=await handleWorkerSpawn2("qa",{provider:"claude",team:teamName,session:teamName,cwd:worktreePath,role:"qa",extraArgs:["--append-system-prompt-file",promptFile],initialPrompt:`Execute the QA spec "${spec.name}" end-to-end right now. Do not stop after partial progress or a wait step. Continue until you validate the expectations, publish qa-report, and run team done. Your full instructions are in the system prompt.`});return console.error(` [qa] Spawned qa for "${spec.name}" in ${teamName}`),await waitForResult(spec,repoPath,teamName,effectiveTimeoutMs,start3)}catch(err){return makeErrorReport(spec,start3,String(err))}}function buildQaPromptArtifacts(teamName){let base=`genie-qa-${teamName}`;return{followFile:join79(tmpdir4(),`${base}-follow.ndjson`),followPidFile:join79(tmpdir4(),`${base}-follow.pid`),followSinceFile:join79(tmpdir4(),`${base}-follow.since`),snapshotFile:join79(tmpdir4(),`${base}-snapshot.ndjson`)}}function buildTeamLeadPrompt(spec,teamName,repoPath){let genieEntry=join79(repoPath,"src/genie.ts"),genieCmd=`bun run "${genieEntry}"`,{followFile,followPidFile,followSinceFile,snapshotFile}=buildQaPromptArtifacts(teamName),qaCheckCmd=buildQaCheckCommand(genieCmd,spec.file,teamName,followSinceFile),specSummary=formatSpecForPrompt(spec),setupInstructions=formatSetupInstructions(spec,teamName,genieCmd,followFile,followPidFile,followSinceFile),actionInstructions=formatActionInstructions(spec,teamName,genieCmd,qaCheckCmd),expectInstructions=spec.expect.map((e)=>`- ${e.description} (source: ${e.source}, matchers: ${JSON.stringify(e.matchers)})`).join(`
4272
+ `);let reports=[],running2=0,nextIdx=0,startTime=Date.now();await new Promise((resolveAll)=>{let tryStartNext=()=>{while(running2<maxConcurrency&&nextIdx<prepared.length){let p=prepared[nextIdx++];running2++,emitQaEvent(repoPath,"spec-started",{type:"qa:spec-started",specKey:p.entry.key,domain:p.entry.domain,team:p.teamName},ndjson),runPreparedSpec(repoPath,p.spec,p.teamName,p.worktreePath,p.promptFile,timeoutMs).then(async(report2)=>{let key=specKeyFromPath(specDir,p.entry.filePath);await saveResult(repoPath,key,report2);let icon=report2.result==="pass"?`${"\x1B[32m"}\u2713${"\x1B[0m"}`:`${"\x1B[31m"}\u2717${"\x1B[0m"}`,elapsed=((Date.now()-startTime)/1000).toFixed(0);console.error(` ${icon} ${p.entry.name} (${(report2.durationMs/1000).toFixed(0)}s) [${elapsed}s total]`),await emitSpecDone(repoPath,p.entry.key,p.entry.domain,p.teamName,report2,ndjson),reports.push(report2)}).catch((err)=>{let errorReport=makeErrorReport(p.spec,Date.now(),String(err));reports.push(errorReport),console.error(` ${"\x1B[31m"}\u2717${"\x1B[0m"} ${p.entry.name}: ${err}`),emitSpecDone(repoPath,p.entry.key,p.entry.domain,p.teamName,errorReport,ndjson)}).finally(()=>{if(running2--,reports.length===prepared.length)resolveAll();else tryStartNext()})}};tryStartNext()}),await timelineSub.stop(),console.error(`
4273
+ [qa] Cleaning up ${prepared.length} teams...`);for(let p of prepared)try{await disbandTeam(p.teamName)}catch{}return reports}async function runSpec(spec,options){let repoPath=resolve17(options?.repoPath??process.cwd()),timeoutMs=(options?.timeout??3600)*1000,ndjson=options?.ndjson??!1,specKey=options?.specKey??spec.name,domain=specKey.includes("/")?specKey.split("/").slice(0,-1).join("/"):"(root)",teamName=`qa-${Date.now().toString(36)}-${spec.name.slice(0,8).replace(/\s+/g,"-")}`,start3=Date.now();try{let config=await createTeam(teamName,repoPath);await overlayDirtyWorkingTree(repoPath,config.worktreePath),await hireAgent(teamName,"qa"),await emitQaEvent(repoPath,"team-created",{type:"qa:team-created",specKey,domain,team:teamName},ndjson);let prompt2=buildTeamLeadPrompt(spec,teamName,repoPath),promptFile=join79(tmpdir4(),`genie-qa-${teamName}.md`);await writeFile10(promptFile,prompt2),await emitQaEvent(repoPath,"spec-started",{type:"qa:spec-started",specKey,domain,team:teamName},ndjson);let report2=await runPreparedSpec(repoPath,spec,teamName,config.worktreePath,promptFile,timeoutMs);return await emitSpecDone(repoPath,specKey,domain,teamName,report2,ndjson),await disbandTeam(teamName),report2}catch(err){try{await disbandTeam(teamName)}catch{}let errorReport=makeErrorReport(spec,start3,String(err));return await emitSpecDone(repoPath,specKey,domain,teamName,errorReport,ndjson),errorReport}}async function runPreparedSpec(repoPath,spec,teamName,worktreePath,promptFile,timeoutMs){let start3=Date.now(),effectiveTimeoutMs=computeEffectiveTimeoutMs(spec,timeoutMs);try{let{handleWorkerSpawn:handleWorkerSpawn2}=await Promise.resolve().then(() => (init_agents(),exports_agents)),_paneId=await handleWorkerSpawn2("qa",{provider:"claude",team:teamName,session:teamName,cwd:worktreePath,role:"qa",extraArgs:["--append-system-prompt-file",promptFile],initialPrompt:`Execute the QA spec "${spec.name}" end-to-end right now. Do not stop after partial progress or a wait step. Continue until you validate the expectations, publish qa-report, and run team done. Your full instructions are in the system prompt.`});return console.error(` [qa] Spawned qa for "${spec.name}" in ${teamName}`),await waitForResult(spec,repoPath,teamName,effectiveTimeoutMs,start3)}catch(err){return makeErrorReport(spec,start3,String(err))}}function buildQaPromptArtifacts(teamName){let base=`genie-qa-${teamName}`;return{followFile:join79(tmpdir4(),`${base}-follow.ndjson`),followPidFile:join79(tmpdir4(),`${base}-follow.pid`),followSinceFile:join79(tmpdir4(),`${base}-follow.since`),snapshotFile:join79(tmpdir4(),`${base}-snapshot.ndjson`)}}function buildTeamLeadPrompt(spec,teamName,repoPath){let genieEntry=join79(repoPath,"src/genie.ts"),genieCmd=`bun run "${genieEntry}"`,{followFile,followPidFile,followSinceFile,snapshotFile}=buildQaPromptArtifacts(teamName),qaCheckCmd=buildQaCheckCommand(genieCmd,spec.file,teamName,followSinceFile),specSummary=formatSpecForPrompt(spec),setupInstructions=formatSetupInstructions(spec,teamName,genieCmd,followFile,followPidFile,followSinceFile),actionInstructions=formatActionInstructions(spec,teamName,genieCmd,qaCheckCmd),expectInstructions=spec.expect.map((e)=>`- ${e.description} (source: ${e.source}, matchers: ${JSON.stringify(e.matchers)})`).join(`
4231
4274
  `);return`You are a QA team-lead for team "${teamName}". Your job is to execute the following QA spec and report PASS or FAIL.
4232
4275
 
4233
4276
  ## QA Spec: ${spec.name}
@@ -4301,8 +4344,8 @@ Team: ${teamName}
4301
4344
  `}function formatSetupInstructions(spec,teamName,genieCmd,followFile,followPidFile,followSinceFile){return spec.setup.map((s2)=>{if(s2.kind==="spawn"){let provider=s2.options.provider||"claude";return`- Spawn agent: \`${genieCmd} spawn ${s2.target} --provider ${provider} --team ${teamName}\``}if(s2.kind==="follow")return`- Start detached runtime follow with this exact command (do not use Claude background tasks): \`date -u +"%Y-%m-%dT%H:%M:%SZ" > "${followSinceFile}" && nohup ${genieCmd} log --follow --team ${teamName} --ndjson > "${followFile}" 2>&1 < /dev/null & echo $! > "${followPidFile}" && sleep 2\``;return`- Unknown setup step: ${s2.kind}`}).join(`
4302
4345
  `)}function buildQaCheckCommand(genieCmd,specFile,teamName,followSinceFile){return`${genieCmd} qa check "${specFile}" --team ${teamName} --since-file "${followSinceFile}"`}function formatActionInstructions(spec,teamName,genieCmd,qaCheckCmd){return spec.actions.map((a,i2)=>{let isFinalAction=i2===spec.actions.length-1;if(a.kind==="send")return`${i2+1}. Send message: \`${genieCmd} send '${a.message}' --to ${a.to} --team ${teamName}\``;if(a.kind==="wait"){if(isFinalAction)return`${i2+1}. Finalize in one command: \`sleep ${a.seconds??1} && ${qaCheckCmd}\``;return`${i2+1}. Wait ${a.seconds??1} seconds`}if(a.kind==="run")return`${i2+1}. Run command: \`${rewriteRunCommand(a.command??"",genieCmd)}\``;return`${i2+1}. Unknown action: ${a.kind}`}).join(`
4303
4346
  `)}function rewriteRunCommand(command,genieCmd){if(!command)return command;return command.replace(/(^|[;&|()\s])genie(?=\s|$)/g,`$1${genieCmd}`)}function formatSpecForPrompt(spec){return["### Setup",...spec.setup.map(formatSetupStep),"### Actions",...spec.actions.map(formatActionStep),"### Expectations",...spec.expect.map((e)=>`- [ ] ${e.description}`)].join(`
4304
- `)}function formatSetupStep(s2){if(s2.kind==="spawn"){let opts=Object.entries(s2.options).map(([k,v])=>`${k}: ${v}`).join(", ");return`- spawn ${s2.target}${opts?` (${opts})`:""}`}return`- follow ${s2.target}`}function formatActionStep(a){if(a.kind==="send")return`- send "${a.message}" to ${a.to}`;if(a.kind==="wait")return`- wait ${a.seconds??1}s`;if(a.kind==="run")return`- run ${a.command}`;return`- ${a.kind}`}async function waitForResult(spec,repoPath,teamName,timeoutMs,start3){let subject=`genie.qa.${teamName}.result`,remainingMs=Math.max(timeoutMs-(Date.now()-start3),1),event=await waitForRuntimeEvent({repoPath,subject,team:teamName},remainingMs);if(!event)return makeErrorReport(spec,start3,`Timeout after ${timeoutMs}ms waiting for team-lead report in PG event log`);return parseTeamLeadReport(spec,event.data??{},start3)}function parseTeamLeadReport(spec,payload,start3){try{let data=payload;return{name:spec.name,file:spec.file,result:data.result==="pass"?"pass":"fail",expectations:data.expectations??[],collectedEvents:data.collectedEvents??[],durationMs:Date.now()-start3}}catch(err){return makeErrorReport(spec,start3,`Failed to parse team-lead report: ${err}`)}}function makeErrorReport(spec,start3,error2){return{name:spec.name,file:spec.file,result:"error",expectations:[],collectedEvents:[],durationMs:Date.now()-start3,error:error2}}function computeEffectiveTimeoutMs(spec,requestedTimeoutMs){let totalWaitMs=spec.actions.reduce((sum,action)=>sum+(action.kind==="wait"?(action.seconds??0)*1000:0),0),setupSpawnCount=spec.setup.filter((step)=>step.kind==="spawn").length,orchestrationSlackMs=Math.max(30000,Math.min(90000,15000+Math.floor(totalWaitMs/2)+setupSpawnCount*15000));return requestedTimeoutMs+orchestrationSlackMs}function defaultSpecDir(repoPath){return join79(resolve17(repoPath??process.cwd()),".genie","qa")}init_runtime_events();async function qaCommand(target,options){let specDir=defaultSpecDir(),runnerOpts={timeout:options.timeout??3600,parallel:options.parallel??5,verbose:options.verbose??!1,repoPath:process.cwd(),ndjson:options.ndjson??!1},reports;if(target)reports=await resolveAndRun(specDir,target,runnerOpts);else reports=await runAllSpecs(specDir,runnerOpts);if(reports.length===0){console.error(`\x1B[33mNo QA specs found for "${target??"all"}"\x1B[0m`),process.exitCode=1;return}if(options.ndjson)for(let report of reports)console.log(JSON.stringify(report));else printRunResults(reports,options.verbose??!1);if(!reports.every((r)=>r.result==="pass"))process.exitCode=1}async function qaCheckCommand(specFile,options){let team=options.team??process.env.GENIE_TEAM;if(!team){console.error("Error: QA team not set. Use --team <name> or run inside a QA worker."),process.exitCode=1;return}let repoPath=process.cwd(),spec=await parseQaSpec(specFile),since=options.since??(options.sinceFile?await readSinceValue(options.sinceFile):void 0),teamAgents=(await list()).filter((agent)=>agent.team===team),events=await readTeamLog(teamAgents,repoPath,team,buildQaCheckLogFilter(since)),expectations=evaluateExpectations(spec.expect,events),collectedEvents=toCollectedEvents(events),result2=expectations.every((exp)=>exp.result==="pass")?"pass":"fail";await publishSubjectEvent(repoPath,`genie.qa.${team}.result`,{kind:"qa",agent:"qa",team,text:`QA result: ${result2}`,data:{result:result2,expectations,collectedEvents},source:"hook"}),console.log(`QA result published to PG event log as genie.qa.${team}.result`)}async function qaStatusCommand(options){let specDir=defaultSpecDir(),repoPath=process.cwd(),specs=await listAllSpecs(specDir),results=await loadResults(repoPath);if(specs.length===0){if(options?.json)console.log(JSON.stringify({specs:[],summary:{total:0,pass:0,fail:0,stale:0,never:0}}));else console.error("\x1B[33mNo QA specs found.\x1B[0m");return}if(options?.json)await printJsonStatus(specs,results,repoPath);else await printHumanStatus(specs,results,repoPath)}async function printJsonStatus(specs,results,repoPath){let jsonSpecs=[];for(let spec of specs){let stored=results[spec.key],stale=stored?await isStale(repoPath,spec.key,spec.filePath):!1,status=!stored?"never":stale?"stale":stored.result;jsonSpecs.push({key:spec.key,domain:spec.domain,name:spec.name,status,durationMs:stored?.durationMs??null,lastRun:stored?.lastRun??null,expectations:stored?.expectations??[],error:stored?.error??null})}let counts={total:specs.length,pass:jsonSpecs.filter((s2)=>s2.status==="pass").length,fail:jsonSpecs.filter((s2)=>s2.status==="fail"||s2.status==="error").length,stale:jsonSpecs.filter((s2)=>s2.status==="stale").length,never:jsonSpecs.filter((s2)=>s2.status==="never").length};console.log(JSON.stringify({specs:jsonSpecs,summary:counts}))}async function printHumanStatus(specs,results,repoPath){console.log(),console.log("\x1B[1m QA Status\x1B[0m"),console.log(" \x1B[2m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\x1B[0m"),console.log();let currentDomain="",counts={pass:0,fail:0,stale:0,never:0};for(let spec of specs){if(spec.domain!==currentDomain)currentDomain=spec.domain,console.log(` \x1B[1m${currentDomain}/\x1B[0m`);let stored=results[spec.key],stale=stored?await isStale(repoPath,spec.key,spec.filePath):!1;console.log(formatStatusLine(spec,stored,stale)),tallyResult(counts,stored,stale)}printStatusSummary(specs.length,counts)}function tallyResult(counts,stored,stale){if(!stored)counts.never++;else if(stale)counts.stale++;else if(stored.result==="pass")counts.pass++;else counts.fail++}function printStatusSummary(total,counts){console.log();let parts=[`${counts.pass}/${total} pass`,counts.fail?`${counts.fail} fail`:"",counts.stale?`${counts.stale} stale`:"",counts.never?`${counts.never} never`:""].filter(Boolean);console.log(` ${parts.join(" | ")}`),console.log()}async function readSinceValue(path3){try{return(await readFile16(path3,"utf-8")).trim()||void 0}catch{return}}function evaluateExpectations(expectations,events){return expectations.map((expectation)=>{let matched=events.filter((event)=>eventMatchesExpectationSource(event,expectation.source)).find((event)=>eventMatchesExpectation(event,expectation.matchers));if(matched)return{description:expectation.description,result:"pass",evidence:`${matched.kind} ${matched.agent}: ${matched.text.slice(0,120)}`};return{description:expectation.description,result:"fail",reason:"No matching event found in team log/transcript snapshot"}})}function eventMatchesExpectation(event,matchers){return Object.entries(matchers).every(([field,expected])=>matcherMatches(readEventField(event,field),expected,field))}function buildQaCheckLogFilter(since){if(since)return{since};return{last:200}}function eventMatchesExpectationSource(event,source){switch(source){case"inbox":return event.source==="mailbox"&&event.direction==="in";case"output":return event.source==="provider";default:return!0}}function readEventField(event,field){switch(field){case"timestamp":return event.timestamp;case"kind":return event.kind;case"agent":return event.agent;case"team":return event.team;case"direction":return event.direction;case"peer":return event.peer;case"text":return event.text;case"source":return event.source;default:break}return event.data?.[field]}function matcherMatches(actual,expected,field){if(actual==null)return!1;if(field==="kind"&&expected==="message")return["message","assistant","user"].includes(String(actual));let actualText=String(actual);if(expected.startsWith("~"))return actualText.includes(expected.slice(1));return actualText===expected}function toCollectedEvents(events){return events.slice(-50).map((event)=>({timestamp:event.timestamp,kind:event.kind,agent:event.agent,text:event.text}))}async function qaHistoryCommand(){let repoPath=process.cwd(),results=await loadResults(repoPath),entries=Object.entries(results).map(([key,r])=>({key,...r})).sort((a,b2)=>new Date(b2.lastRun).getTime()-new Date(a.lastRun).getTime());if(entries.length===0){console.error("\x1B[33mNo QA history found. Run `genie qa` first.\x1B[0m");return}console.log(),console.log("\x1B[1m QA History\x1B[0m"),console.log();let limit=20;for(let entry2 of entries.slice(0,limit)){let icon=resultIcon(entry2.result),duration=entry2.durationMs?`${(entry2.durationMs/1000).toFixed(1)}s`:"-",ago=formatTimeAgo(entry2.lastRun);console.log(` ${icon} ${entry2.key.padEnd(35)} ${duration.padStart(6)} \x1B[2m${ago}\x1B[0m`)}if(entries.length>limit)console.log(` \x1B[2m... and ${entries.length-limit} more\x1B[0m`);console.log()}async function resolveAndRun(specDir,target,opts){let domainDir=join80(specDir,target);if(await isDirectory(domainDir))return runDomainSpecs(specDir,target,opts);let specPath=await resolveSpecPath(specDir,target);if(specPath){let spec=await parseQaSpec(specPath),key=specKeyFromPath(specDir,specPath),report=await runSpec(spec,{...opts,specKey:key}),repoPath=opts.repoPath??process.cwd();return await saveResult(repoPath,key,report),[report]}console.error(`\x1B[31mSpec or domain not found: ${target}\x1B[0m`),console.error("Available:");let allSpecs=await listAllSpecs(specDir),domains=[...new Set(allSpecs.map((s2)=>s2.domain))];for(let d of domains)console.error(` \x1B[1m${d}/\x1B[0m`);for(let s2 of allSpecs)console.error(` ${s2.key}`);return process.exitCode=1,[]}async function resolveSpecPath(specDir,name){let candidates=[join80(specDir,name),join80(specDir,`${name}.md`)];for(let path3 of candidates)if(await isFile(path3))return path3;return null}function resultIcon(result2){if(result2==="pass")return"\x1B[32m\u2705\x1B[0m";if(result2==="fail")return"\x1B[31m\u274C\x1B[0m";if(result2==="error")return"\x1B[33m\u26A0\uFE0F\x1B[0m";return"\uD83D\uDD18"}function formatStatusLine(spec,stored,stale){if(!stored)return` \uD83D\uDD18 ${spec.name.padEnd(25)} ${"-".padStart(6)} \x1B[2mnever\x1B[0m`;if(stale){let ago2=formatTimeAgo(stored.lastRun);return` \u26A0\uFE0F ${spec.name.padEnd(25)} ${"-".padStart(6)} \x1B[33m${ago2} (stale)\x1B[0m`}let icon=resultIcon(stored.result),duration=stored.durationMs?`${(stored.durationMs/1000).toFixed(0)}s`:"-",ago=formatTimeAgo(stored.lastRun);return` ${icon} ${spec.name.padEnd(25)} ${duration.padStart(6)} \x1B[2m${ago}\x1B[0m`}function printRunResults(reports,verbose){console.log(),console.log("\x1B[1m QA Results\x1B[0m"),console.log();for(let report of reports)printReport2(report,verbose);let passed=reports.filter((r)=>r.result==="pass").length,failed=reports.filter((r)=>r.result==="fail").length,errors3=reports.filter((r)=>r.result==="error").length,total=reports.length,color2=failed+errors3>0?"\x1B[31m":"\x1B[32m",failedStr=failed?` \x1B[31m${failed} failed\x1B[0m`:"",errorsStr=errors3?` \x1B[33m${errors3} errors\x1B[0m`:"";console.log(` ${color2}${passed}/${total} passed\x1B[0m${failedStr}${errorsStr}`),console.log()}function printReport2(report,verbose){let duration=`${(report.durationMs/1000).toFixed(1)}s`;if(console.log(` ${resultIcon(report.result)} ${report.name} \x1B[2m(${duration})\x1B[0m`),report.error)console.log(` \x1B[31mError: ${report.error}\x1B[0m`);for(let exp of report.expectations)printExpectation(exp);if(verbose&&report.collectedEvents.length>0){console.log(` \x1B[2m--- Collected events (${report.collectedEvents.length}) ---\x1B[0m`);for(let event of report.collectedEvents)console.log(` \x1B[2m ${event.timestamp} ${event.kind} ${event.agent}: ${event.text.slice(0,80)}\x1B[0m`)}console.log()}function printExpectation(exp){let icon=exp.result==="pass"?"\x1B[32m\u2713\x1B[0m":"\x1B[31m\u2717\x1B[0m";if(console.log(` ${icon} ${exp.description}`),exp.result==="pass"&&exp.evidence)console.log(` \x1B[2m${exp.evidence}\x1B[0m`);if(exp.result==="fail"&&exp.reason)console.log(` \x1B[31m${exp.reason}\x1B[0m`)}async function isDirectory(path3){try{return(await stat10(path3)).isDirectory()}catch{return!1}}async function isFile(path3){try{return(await stat10(path3)).isFile()}catch{return!1}}init_read();init_term_format();var _taskService6;async function getTaskService6(){if(!_taskService6)_taskService6=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService6}function registerReleaseCommands(program2){let release=program2.command("release").description("Release management");release.command("create <name>").description("Create a release and assign tasks to it").requiredOption("--tasks <ids...>","Task IDs or #seqs to include").action(async(name,options)=>{try{let updated=await(await getTaskService6()).setRelease(options.tasks,name);console.log(`Release "${name}" created with ${updated} task${updated===1?"":"s"}.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),release.command("list").description("List all releases").option("--json","Output as JSON").action(async(options)=>{try{let releases=await(await getTaskService6()).listReleases();if(options.json){console.log(JSON.stringify(releases,null,2));return}if(releases.length===0){console.log("No releases found.");return}console.log(` ${padRight("RELEASE",30)} TASKS`),console.log(` ${"\u2500".repeat(40)}`);for(let r of releases)console.log(` ${padRight(r.releaseId,30)} ${r.count}`);console.log(`
4305
- ${releases.length} release${releases.length===1?"":"s"}`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_cron();init_db();init_term_format();function formatTimestamp2(iso){return formatTimestamp(iso,{seconds:!0})}var defaultScheduleCommandDeps={getConnection,shutdown,exit:(code)=>process.exit(code),stdout:console,stderr:console};function parseAbsoluteTime(input){let date=new Date(input);if(Number.isNaN(date.getTime()))throw Error(`Invalid time: "${input}". Expected ISO 8601 format (e.g., 2026-03-21T09:00)`);return date}function isCronExpression(input){let parts=input.trim().split(/\s+/);return parts.length>=5&&parts.length<=6}function computeFirstDueAt(options){if(options.at){let dueAt=parseAbsoluteTime(options.at);if(dueAt.getTime()<=Date.now())throw Error(`Schedule time is in the past: ${options.at}`);return{dueAt,cronExpr:"@once",scheduleType:"once"}}if(options.after){let delayMs=parseDuration(options.after);return{dueAt:new Date(Date.now()+delayMs),cronExpr:"@once",scheduleType:"once"}}if(options.every){if(isCronExpression(options.every))return{dueAt:computeNextCronDue(options.every,{timezone:options.timezone}),cronExpr:options.every,scheduleType:"cron"};let intervalMs=parseDuration(options.every);return{dueAt:new Date(Date.now()+intervalMs),cronExpr:`@every ${options.every.trim()}`,scheduleType:"interval"}}throw Error("One of --at, --every, or --after is required")}function generateId(){return crypto.randomUUID()}function formatDuration4(ms){if(ms==null||ms<0)return"-";if(ms<1000)return`${ms}ms`;if(ms<60000)return`${(ms/1000).toFixed(1)}s`;if(ms<3600000)return`${(ms/60000).toFixed(1)}m`;return`${(ms/3600000).toFixed(1)}h`}function printTable2(headers,rows){let widths=headers.map((h,i2)=>{let colValues=rows.map((r)=>(r[i2]??"").length);return Math.max(h.length,...colValues)}),headerLine=headers.map((h,i2)=>padRight(h,widths[i2])).join(" ");console.log(headerLine),console.log(widths.map((w)=>"\u2500".repeat(w)).join("\u2500\u2500"));for(let row of rows){let line=row.map((val,i2)=>padRight(val??"",widths[i2])).join(" ");console.log(line)}console.log(`(${rows.length} row${rows.length===1?"":"s"})`)}async function scheduleCreateCommand(name,options){if(!options.command)console.error("Error: --command is required"),process.exit(1);if(!options.at&&!options.every&&!options.after)console.error("Error: one of --at, --every, or --after is required"),process.exit(1);try{let{dueAt,cronExpr,scheduleType}=computeFirstDueAt(options),sql=await getConnection();if((await sql`SELECT id FROM schedules WHERE name = ${name} AND status = 'active'`).length>0)console.error(`Error: schedule "${name}" already exists. Cancel it first or use a different name.`),process.exit(1);let scheduleId=generateId(),triggerId=generateId(),runSpec2=options.leaseTimeout?{lease_timeout_ms:parseDuration(options.leaseTimeout)}:{},metadata={type:scheduleType,original_spec:options.at??options.every??options.after,timezone:options.timezone??"UTC"};await sql.begin(async(tx)=>{await tx`
4347
+ `)}function formatSetupStep(s2){if(s2.kind==="spawn"){let opts=Object.entries(s2.options).map(([k,v])=>`${k}: ${v}`).join(", ");return`- spawn ${s2.target}${opts?` (${opts})`:""}`}return`- follow ${s2.target}`}function formatActionStep(a){if(a.kind==="send")return`- send "${a.message}" to ${a.to}`;if(a.kind==="wait")return`- wait ${a.seconds??1}s`;if(a.kind==="run")return`- run ${a.command}`;return`- ${a.kind}`}async function waitForResult(spec,repoPath,teamName,timeoutMs,start3){let subject=`genie.qa.${teamName}.result`,remainingMs=Math.max(timeoutMs-(Date.now()-start3),1),event=await waitForRuntimeEvent({repoPath,subject,team:teamName},remainingMs);if(!event)return makeErrorReport(spec,start3,`Timeout after ${timeoutMs}ms waiting for team-lead report in PG event log`);return parseTeamLeadReport(spec,event.data??{},start3)}function parseTeamLeadReport(spec,payload,start3){try{let data=payload;return{name:spec.name,file:spec.file,result:data.result==="pass"?"pass":"fail",expectations:data.expectations??[],collectedEvents:data.collectedEvents??[],durationMs:Date.now()-start3}}catch(err){return makeErrorReport(spec,start3,`Failed to parse team-lead report: ${err}`)}}function makeErrorReport(spec,start3,error2){return{name:spec.name,file:spec.file,result:"error",expectations:[],collectedEvents:[],durationMs:Date.now()-start3,error:error2}}function computeEffectiveTimeoutMs(spec,requestedTimeoutMs){let totalWaitMs=spec.actions.reduce((sum,action)=>sum+(action.kind==="wait"?(action.seconds??0)*1000:0),0),setupSpawnCount=spec.setup.filter((step)=>step.kind==="spawn").length,orchestrationSlackMs=Math.max(30000,Math.min(90000,15000+Math.floor(totalWaitMs/2)+setupSpawnCount*15000));return requestedTimeoutMs+orchestrationSlackMs}function defaultSpecDir(repoPath){return join79(resolve17(repoPath??process.cwd()),".genie","qa")}init_runtime_events();async function qaCommand(target,options){let specDir=defaultSpecDir(),runnerOpts={timeout:options.timeout??3600,parallel:options.parallel??5,verbose:options.verbose??!1,repoPath:process.cwd(),ndjson:options.ndjson??!1},reports;if(target)reports=await resolveAndRun(specDir,target,runnerOpts);else reports=await runAllSpecs(specDir,runnerOpts);if(reports.length===0){console.error(`\x1B[33mNo QA specs found for "${target??"all"}"\x1B[0m`),process.exitCode=1;return}if(options.ndjson)for(let report2 of reports)console.log(JSON.stringify(report2));else printRunResults(reports,options.verbose??!1);if(!reports.every((r)=>r.result==="pass"))process.exitCode=1}async function qaCheckCommand(specFile,options){let team=options.team??process.env.GENIE_TEAM;if(!team){console.error("Error: QA team not set. Use --team <name> or run inside a QA worker."),process.exitCode=1;return}let repoPath=process.cwd(),spec=await parseQaSpec(specFile),since=options.since??(options.sinceFile?await readSinceValue(options.sinceFile):void 0),teamAgents=(await list()).filter((agent)=>agent.team===team),events=await readTeamLog(teamAgents,repoPath,team,buildQaCheckLogFilter(since)),expectations=evaluateExpectations(spec.expect,events),collectedEvents=toCollectedEvents(events),result2=expectations.every((exp)=>exp.result==="pass")?"pass":"fail";await publishSubjectEvent(repoPath,`genie.qa.${team}.result`,{kind:"qa",agent:"qa",team,text:`QA result: ${result2}`,data:{result:result2,expectations,collectedEvents},source:"hook"}),console.log(`QA result published to PG event log as genie.qa.${team}.result`)}async function qaStatusCommand(options){let specDir=defaultSpecDir(),repoPath=process.cwd(),specs=await listAllSpecs(specDir),results=await loadResults(repoPath);if(specs.length===0){if(options?.json)console.log(JSON.stringify({specs:[],summary:{total:0,pass:0,fail:0,stale:0,never:0}}));else console.error("\x1B[33mNo QA specs found.\x1B[0m");return}if(options?.json)await printJsonStatus(specs,results,repoPath);else await printHumanStatus(specs,results,repoPath)}async function printJsonStatus(specs,results,repoPath){let jsonSpecs=[];for(let spec of specs){let stored=results[spec.key],stale=stored?await isStale(repoPath,spec.key,spec.filePath):!1,status=!stored?"never":stale?"stale":stored.result;jsonSpecs.push({key:spec.key,domain:spec.domain,name:spec.name,status,durationMs:stored?.durationMs??null,lastRun:stored?.lastRun??null,expectations:stored?.expectations??[],error:stored?.error??null})}let counts={total:specs.length,pass:jsonSpecs.filter((s2)=>s2.status==="pass").length,fail:jsonSpecs.filter((s2)=>s2.status==="fail"||s2.status==="error").length,stale:jsonSpecs.filter((s2)=>s2.status==="stale").length,never:jsonSpecs.filter((s2)=>s2.status==="never").length};console.log(JSON.stringify({specs:jsonSpecs,summary:counts}))}async function printHumanStatus(specs,results,repoPath){console.log(),console.log("\x1B[1m QA Status\x1B[0m"),console.log(" \x1B[2m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\x1B[0m"),console.log();let currentDomain="",counts={pass:0,fail:0,stale:0,never:0};for(let spec of specs){if(spec.domain!==currentDomain)currentDomain=spec.domain,console.log(` \x1B[1m${currentDomain}/\x1B[0m`);let stored=results[spec.key],stale=stored?await isStale(repoPath,spec.key,spec.filePath):!1;console.log(formatStatusLine(spec,stored,stale)),tallyResult(counts,stored,stale)}printStatusSummary(specs.length,counts)}function tallyResult(counts,stored,stale){if(!stored)counts.never++;else if(stale)counts.stale++;else if(stored.result==="pass")counts.pass++;else counts.fail++}function printStatusSummary(total,counts){console.log();let parts=[`${counts.pass}/${total} pass`,counts.fail?`${counts.fail} fail`:"",counts.stale?`${counts.stale} stale`:"",counts.never?`${counts.never} never`:""].filter(Boolean);console.log(` ${parts.join(" | ")}`),console.log()}async function readSinceValue(path3){try{return(await readFile16(path3,"utf-8")).trim()||void 0}catch{return}}function evaluateExpectations(expectations,events){return expectations.map((expectation)=>{let matched=events.filter((event)=>eventMatchesExpectationSource(event,expectation.source)).find((event)=>eventMatchesExpectation(event,expectation.matchers));if(matched)return{description:expectation.description,result:"pass",evidence:`${matched.kind} ${matched.agent}: ${matched.text.slice(0,120)}`};return{description:expectation.description,result:"fail",reason:"No matching event found in team log/transcript snapshot"}})}function eventMatchesExpectation(event,matchers){return Object.entries(matchers).every(([field,expected])=>matcherMatches(readEventField(event,field),expected,field))}function buildQaCheckLogFilter(since){if(since)return{since};return{last:200}}function eventMatchesExpectationSource(event,source){switch(source){case"inbox":return event.source==="mailbox"&&event.direction==="in";case"output":return event.source==="provider";default:return!0}}function readEventField(event,field){switch(field){case"timestamp":return event.timestamp;case"kind":return event.kind;case"agent":return event.agent;case"team":return event.team;case"direction":return event.direction;case"peer":return event.peer;case"text":return event.text;case"source":return event.source;default:break}return event.data?.[field]}function matcherMatches(actual,expected,field){if(actual==null)return!1;if(field==="kind"&&expected==="message")return["message","assistant","user"].includes(String(actual));let actualText=String(actual);if(expected.startsWith("~"))return actualText.includes(expected.slice(1));return actualText===expected}function toCollectedEvents(events){return events.slice(-50).map((event)=>({timestamp:event.timestamp,kind:event.kind,agent:event.agent,text:event.text}))}async function qaHistoryCommand(){let repoPath=process.cwd(),results=await loadResults(repoPath),entries=Object.entries(results).map(([key,r])=>({key,...r})).sort((a,b2)=>new Date(b2.lastRun).getTime()-new Date(a.lastRun).getTime());if(entries.length===0){console.error("\x1B[33mNo QA history found. Run `genie qa` first.\x1B[0m");return}console.log(),console.log("\x1B[1m QA History\x1B[0m"),console.log();let limit=20;for(let entry2 of entries.slice(0,limit)){let icon=resultIcon(entry2.result),duration=entry2.durationMs?`${(entry2.durationMs/1000).toFixed(1)}s`:"-",ago=formatTimeAgo(entry2.lastRun);console.log(` ${icon} ${entry2.key.padEnd(35)} ${duration.padStart(6)} \x1B[2m${ago}\x1B[0m`)}if(entries.length>limit)console.log(` \x1B[2m... and ${entries.length-limit} more\x1B[0m`);console.log()}async function resolveAndRun(specDir,target,opts){let domainDir=join80(specDir,target);if(await isDirectory(domainDir))return runDomainSpecs(specDir,target,opts);let specPath=await resolveSpecPath(specDir,target);if(specPath){let spec=await parseQaSpec(specPath),key=specKeyFromPath(specDir,specPath),report2=await runSpec(spec,{...opts,specKey:key}),repoPath=opts.repoPath??process.cwd();return await saveResult(repoPath,key,report2),[report2]}console.error(`\x1B[31mSpec or domain not found: ${target}\x1B[0m`),console.error("Available:");let allSpecs=await listAllSpecs(specDir),domains=[...new Set(allSpecs.map((s2)=>s2.domain))];for(let d of domains)console.error(` \x1B[1m${d}/\x1B[0m`);for(let s2 of allSpecs)console.error(` ${s2.key}`);return process.exitCode=1,[]}async function resolveSpecPath(specDir,name){let candidates=[join80(specDir,name),join80(specDir,`${name}.md`)];for(let path3 of candidates)if(await isFile(path3))return path3;return null}function resultIcon(result2){if(result2==="pass")return"\x1B[32m\u2705\x1B[0m";if(result2==="fail")return"\x1B[31m\u274C\x1B[0m";if(result2==="error")return"\x1B[33m\u26A0\uFE0F\x1B[0m";return"\uD83D\uDD18"}function formatStatusLine(spec,stored,stale){if(!stored)return` \uD83D\uDD18 ${spec.name.padEnd(25)} ${"-".padStart(6)} \x1B[2mnever\x1B[0m`;if(stale){let ago2=formatTimeAgo(stored.lastRun);return` \u26A0\uFE0F ${spec.name.padEnd(25)} ${"-".padStart(6)} \x1B[33m${ago2} (stale)\x1B[0m`}let icon=resultIcon(stored.result),duration=stored.durationMs?`${(stored.durationMs/1000).toFixed(0)}s`:"-",ago=formatTimeAgo(stored.lastRun);return` ${icon} ${spec.name.padEnd(25)} ${duration.padStart(6)} \x1B[2m${ago}\x1B[0m`}function printRunResults(reports,verbose){console.log(),console.log("\x1B[1m QA Results\x1B[0m"),console.log();for(let report2 of reports)printReport2(report2,verbose);let passed=reports.filter((r)=>r.result==="pass").length,failed=reports.filter((r)=>r.result==="fail").length,errors3=reports.filter((r)=>r.result==="error").length,total=reports.length,color2=failed+errors3>0?"\x1B[31m":"\x1B[32m",failedStr=failed?` \x1B[31m${failed} failed\x1B[0m`:"",errorsStr=errors3?` \x1B[33m${errors3} errors\x1B[0m`:"";console.log(` ${color2}${passed}/${total} passed\x1B[0m${failedStr}${errorsStr}`),console.log()}function printReport2(report2,verbose){let duration=`${(report2.durationMs/1000).toFixed(1)}s`;if(console.log(` ${resultIcon(report2.result)} ${report2.name} \x1B[2m(${duration})\x1B[0m`),report2.error)console.log(` \x1B[31mError: ${report2.error}\x1B[0m`);for(let exp of report2.expectations)printExpectation(exp);if(verbose&&report2.collectedEvents.length>0){console.log(` \x1B[2m--- Collected events (${report2.collectedEvents.length}) ---\x1B[0m`);for(let event of report2.collectedEvents)console.log(` \x1B[2m ${event.timestamp} ${event.kind} ${event.agent}: ${event.text.slice(0,80)}\x1B[0m`)}console.log()}function printExpectation(exp){let icon=exp.result==="pass"?"\x1B[32m\u2713\x1B[0m":"\x1B[31m\u2717\x1B[0m";if(console.log(` ${icon} ${exp.description}`),exp.result==="pass"&&exp.evidence)console.log(` \x1B[2m${exp.evidence}\x1B[0m`);if(exp.result==="fail"&&exp.reason)console.log(` \x1B[31m${exp.reason}\x1B[0m`)}async function isDirectory(path3){try{return(await stat10(path3)).isDirectory()}catch{return!1}}async function isFile(path3){try{return(await stat10(path3)).isFile()}catch{return!1}}init_read();init_term_format();var _taskService6;async function getTaskService6(){if(!_taskService6)_taskService6=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService6}function registerReleaseCommands(program2){let release=program2.command("release").description("Release management");release.command("create <name>").description("Create a release and assign tasks to it").requiredOption("--tasks <ids...>","Task IDs or #seqs to include").action(async(name,options)=>{try{let updated=await(await getTaskService6()).setRelease(options.tasks,name);console.log(`Release "${name}" created with ${updated} task${updated===1?"":"s"}.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),release.command("list").description("List all releases").option("--json","Output as JSON").action(async(options)=>{try{let releases=await(await getTaskService6()).listReleases();if(options.json){console.log(JSON.stringify(releases,null,2));return}if(releases.length===0){console.log("No releases found.");return}console.log(` ${padRight("RELEASE",30)} TASKS`),console.log(` ${"\u2500".repeat(40)}`);for(let r of releases)console.log(` ${padRight(r.releaseId,30)} ${r.count}`);console.log(`
4348
+ ${releases.length} release${releases.length===1?"":"s"}`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_cron();init_db();init_term_format();function formatTimestamp2(iso){return formatTimestamp(iso,{seconds:!0})}var defaultScheduleCommandDeps={getConnection,shutdown,exit:(code)=>process.exit(code),stdout:console,stderr:console};function parseAbsoluteTime(input){let date=new Date(input);if(Number.isNaN(date.getTime()))throw Error(`Invalid time: "${input}". Expected ISO 8601 format (e.g., 2026-03-21T09:00)`);return date}function isCronExpression(input){let parts=input.trim().split(/\s+/);return parts.length>=5&&parts.length<=6}function computeFirstDueAt(options){if(options.at){let dueAt=parseAbsoluteTime(options.at);if(dueAt.getTime()<=Date.now())throw Error(`Schedule time is in the past: ${options.at}`);return{dueAt,cronExpr:"@once",scheduleType:"once"}}if(options.after){let delayMs=parseDuration(options.after);return{dueAt:new Date(Date.now()+delayMs),cronExpr:"@once",scheduleType:"once"}}if(options.every){if(isCronExpression(options.every))return{dueAt:computeNextCronDue(options.every,{timezone:options.timezone}),cronExpr:options.every,scheduleType:"cron"};let intervalMs=parseDuration(options.every);return{dueAt:new Date(Date.now()+intervalMs),cronExpr:`@every ${options.every.trim()}`,scheduleType:"interval"}}throw Error("One of --at, --every, or --after is required")}function generateId(){return crypto.randomUUID()}function formatDuration4(ms){if(ms==null||ms<0)return"-";if(ms<1000)return`${ms}ms`;if(ms<60000)return`${(ms/1000).toFixed(1)}s`;if(ms<3600000)return`${(ms/60000).toFixed(1)}m`;return`${(ms/3600000).toFixed(1)}h`}function printTable3(headers,rows){let widths=headers.map((h,i2)=>{let colValues=rows.map((r)=>(r[i2]??"").length);return Math.max(h.length,...colValues)}),headerLine=headers.map((h,i2)=>padRight(h,widths[i2])).join(" ");console.log(headerLine),console.log(widths.map((w)=>"\u2500".repeat(w)).join("\u2500\u2500"));for(let row of rows){let line=row.map((val,i2)=>padRight(val??"",widths[i2])).join(" ");console.log(line)}console.log(`(${rows.length} row${rows.length===1?"":"s"})`)}async function scheduleCreateCommand(name,options){if(!options.command)console.error("Error: --command is required"),process.exit(1);if(!options.at&&!options.every&&!options.after)console.error("Error: one of --at, --every, or --after is required"),process.exit(1);try{let{dueAt,cronExpr,scheduleType}=computeFirstDueAt(options),sql=await getConnection();if((await sql`SELECT id FROM schedules WHERE name = ${name} AND status = 'active'`).length>0)console.error(`Error: schedule "${name}" already exists. Cancel it first or use a different name.`),process.exit(1);let scheduleId=generateId(),triggerId=generateId(),runSpec2=options.leaseTimeout?{lease_timeout_ms:parseDuration(options.leaseTimeout)}:{},metadata={type:scheduleType,original_spec:options.at??options.every??options.after,timezone:options.timezone??"UTC"};await sql.begin(async(tx)=>{await tx`
4306
4349
  INSERT INTO schedules (id, name, cron_expression, timezone, command, run_spec, metadata, status)
4307
4350
  VALUES (${scheduleId}, ${name}, ${cronExpr}, ${options.timezone??"UTC"}, ${options.command}, ${JSON.stringify(runSpec2)}, ${JSON.stringify(metadata)}, 'active')
4308
4351
  `,await tx`
@@ -4322,7 +4365,7 @@ Team: ${teamName}
4322
4365
  ) t ON true
4323
4366
  WHERE s.status != 'deleted'
4324
4367
  ORDER BY s.name
4325
- `;if(options.json){let output=rows.map((r)=>({id:r.id,name:r.name,cron_expression:r.cron_expression,command:r.command,status:r.status,type:r.metadata?.type??"unknown",next_due:r.next_due,trigger_status:r.trigger_status}));console.log(JSON.stringify(output,null,2));return}if(rows.length===0){console.log("No schedules found. Create one with: genie schedule create <name> --command <cmd> --every <interval>");return}let tableRows=rows.map((r)=>{let type2=String(r.metadata?.type??"unknown");return[r.name,type2,formatTimestamp2(r.next_due),r.status,r.command??"-"]});printTable2(["NAME","TYPE","NEXT DUE","STATUS","COMMAND"],tableRows)};if(options.watch){let render=async()=>{process.stdout.write("\x1B[2J\x1B[H"),console.log(`Schedules (refreshing every 2s, Ctrl+C to exit)
4368
+ `;if(options.json){let output=rows.map((r)=>({id:r.id,name:r.name,cron_expression:r.cron_expression,command:r.command,status:r.status,type:r.metadata?.type??"unknown",next_due:r.next_due,trigger_status:r.trigger_status}));console.log(JSON.stringify(output,null,2));return}if(rows.length===0){console.log("No schedules found. Create one with: genie schedule create <name> --command <cmd> --every <interval>");return}let tableRows=rows.map((r)=>{let type2=String(r.metadata?.type??"unknown");return[r.name,type2,formatTimestamp2(r.next_due),r.status,r.command??"-"]});printTable3(["NAME","TYPE","NEXT DUE","STATUS","COMMAND"],tableRows)};if(options.watch){let render=async()=>{process.stdout.write("\x1B[2J\x1B[H"),console.log(`Schedules (refreshing every 2s, Ctrl+C to exit)
4326
4369
  `),await renderList()};await render();let interval=setInterval(render,2000);process.on("SIGINT",async()=>{clearInterval(interval),await shutdown(),process.exit(0)});return}await renderList(),await shutdown()}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}async function scheduleCancelCommand(nameOrId,_options,deps=defaultScheduleCommandDeps){try{let sql=await deps.getConnection(),schedules=await sql`
4327
4370
  SELECT id, name, status FROM schedules
4328
4371
  WHERE (name = ${nameOrId} OR id = ${nameOrId}) AND status IN ('active', 'paused')
@@ -4377,7 +4420,7 @@ Team: ${teamName}
4377
4420
  LIMIT ${limit}
4378
4421
  `;if(rows.length===0){console.log(`No execution history for schedule "${schedule.name}"`),await shutdown();return}console.log(`
4379
4422
  History for "${schedule.name}":
4380
- `);let tableRows=rows.map((r)=>[formatTimestamp2(r.due_at),r.trigger_status,r.run_status??"-",formatDuration4(r.duration_ms),r.error?r.error.slice(0,60):"-"]);printTable2(["DUE AT","TRIGGER","RUN","DURATION","ERROR"],tableRows),await shutdown()}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}function registerScheduleCommands(program2){let schedule=program2.command("schedule").description("Manage scheduled triggers");schedule.command("create <name>").description("Create a new schedule").requiredOption("--command <cmd>",'Command to execute (e.g., "genie spawn reviewer")').option("--at <time>","One-time schedule at absolute time (ISO 8601)").option("--every <interval>","Repeating schedule: duration (10m, 2h, 24h) or cron expression").option("--after <duration>","One-time schedule after delay (10m, 2h)").option("--timezone <tz>","Timezone for schedule (default: UTC)","UTC").option("--lease-timeout <duration>","Lease timeout for runs (default: 5m)").action(async(name,options)=>{await scheduleCreateCommand(name,options)}),schedule.command("list").description("List schedules with next due trigger").option("--json","Output as JSON").option("--watch","Refresh every 2s").action(async(options)=>{await scheduleListCommand(options)}),schedule.command("cancel <name>").description("Cancel a schedule and skip pending triggers").option("--filter <expr>","Filter expression (e.g., status=pending)").action(async(name,options)=>{await scheduleCancelCommand(name,options)}),schedule.command("retry <name>").description("Reset a failed trigger to pending").action(async(name)=>{await scheduleRetryCommand(name)}),schedule.command("history <name>").description("Show past executions for a schedule").option("--limit <n>","Max rows to show (default: 20)",Number.parseInt).action(async(name,options)=>{await scheduleHistoryCommand(name,options)})}import{spawnSync as spawnSync8}from"child_process";import{existsSync as existsSync67,readFileSync as readFileSync43,readdirSync as readdirSync13,realpathSync as realpathSync7}from"fs";import{dirname as dirname24,join as join81,resolve as resolve18}from"path";var defaultDeps5={existsSync:existsSync67,realpathSync:realpathSync7,readFileSync:(path3,encoding)=>readFileSync43(path3,encoding),spawnSync:(command,args,options)=>spawnSync8(command,args,options),setExitCode:(exitCode)=>{process.exitCode=exitCode},stdout:(line)=>process.stdout.write(`${line}
4423
+ `);let tableRows=rows.map((r)=>[formatTimestamp2(r.due_at),r.trigger_status,r.run_status??"-",formatDuration4(r.duration_ms),r.error?r.error.slice(0,60):"-"]);printTable3(["DUE AT","TRIGGER","RUN","DURATION","ERROR"],tableRows),await shutdown()}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}function registerScheduleCommands(program2){let schedule=program2.command("schedule").description("Manage scheduled triggers");schedule.command("create <name>").description("Create a new schedule").requiredOption("--command <cmd>",'Command to execute (e.g., "genie spawn reviewer")').option("--at <time>","One-time schedule at absolute time (ISO 8601)").option("--every <interval>","Repeating schedule: duration (10m, 2h, 24h) or cron expression").option("--after <duration>","One-time schedule after delay (10m, 2h)").option("--timezone <tz>","Timezone for schedule (default: UTC)","UTC").option("--lease-timeout <duration>","Lease timeout for runs (default: 5m)").action(async(name,options)=>{await scheduleCreateCommand(name,options)}),schedule.command("list").description("List schedules with next due trigger").option("--json","Output as JSON").option("--watch","Refresh every 2s").action(async(options)=>{await scheduleListCommand(options)}),schedule.command("cancel <name>").description("Cancel a schedule and skip pending triggers").option("--filter <expr>","Filter expression (e.g., status=pending)").action(async(name,options)=>{await scheduleCancelCommand(name,options)}),schedule.command("retry <name>").description("Reset a failed trigger to pending").action(async(name)=>{await scheduleRetryCommand(name)}),schedule.command("history <name>").description("Show past executions for a schedule").option("--limit <n>","Max rows to show (default: 20)",Number.parseInt).action(async(name,options)=>{await scheduleHistoryCommand(name,options)})}import{spawnSync as spawnSync8}from"child_process";import{existsSync as existsSync67,readFileSync as readFileSync43,readdirSync as readdirSync13,realpathSync as realpathSync7}from"fs";import{dirname as dirname24,join as join81,resolve as resolve18}from"path";var defaultDeps5={existsSync:existsSync67,realpathSync:realpathSync7,readFileSync:(path3,encoding)=>readFileSync43(path3,encoding),spawnSync:(command,args,options)=>spawnSync8(command,args,options),setExitCode:(exitCode)=>{process.exitCode=exitCode},stdout:(line)=>process.stdout.write(`${line}
4381
4424
  `),stderr:(line)=>process.stderr.write(`${line}
4382
4425
  `),now:()=>new Date};function collectRepeatedOption(value,previous){return[...previous,value]}function collectKillPid(value,previous){let pid=Number.parseInt(value,10);if(!Number.isFinite(pid)||pid<=0)throw Error(`--kill-pid expects a positive integer, got "${value}"`);return[...previous,pid]}function resolveGenieRoot2(argv1=process.argv[1],deps=defaultDeps5){try{if(argv1){let scriptDir=dirname24(deps.realpathSync(argv1)),candidates=[resolve18(scriptDir,".."),resolve18(scriptDir,"..","..")];for(let candidate of candidates)if(deps.existsSync(join81(candidate,"package.json")))return candidate}}catch{}return resolve18(import.meta.dir,"..","..")}function resolveSecScanScript(argv1=process.argv[1],deps=defaultDeps5){let root=resolveGenieRoot2(argv1,deps),scriptPath=join81(root,"scripts","sec-scan.cjs");if(!deps.existsSync(scriptPath))throw Error(`Security scanner payload not found at ${scriptPath}`);return scriptPath}function resolveSecRemediateScript(argv1=process.argv[1],deps=defaultDeps5){let root=resolveGenieRoot2(argv1,deps),scriptPath=join81(root,"scripts","sec-remediate.cjs");if(!deps.existsSync(scriptPath))throw Error(`Security remediation payload not found at ${scriptPath}`);return scriptPath}function resolveSecFixScript(argv1=process.argv[1],deps=defaultDeps5){let root=resolveGenieRoot2(argv1,deps),scriptPath=join81(root,"scripts","sec-fix.cjs");if(!deps.existsSync(scriptPath))throw Error(`Security fix payload not found at ${scriptPath}`);return scriptPath}function buildSecFixArgv(options){let args=[];if(options.yes)args.push("--yes");if(options.json)args.push("--json");if(options.skipReinstall)args.push("--skip-reinstall");if(options.skipRescan)args.push("--skip-rescan");if(options.dryRun)args.push("--dry-run");if(options.unsafeUnverified)args.push("--unsafe-unverified",options.unsafeUnverified);return args}function runSecFix(options,deps=defaultDeps5){let args=[resolveSecFixScript(process.argv[1],deps),...buildSecFixArgv(options)],result2=deps.spawnSync(process.execPath,args,{stdio:"inherit"});if(result2.error)throw result2.error;return result2.status??1}var BOOLEAN_FLAG_MAP=[["json","--json"],["allHomes","--all-homes"],["noProgress","--no-progress"],["quiet","--quiet"],["verbose","--verbose"],["progressJson","--progress-json"],["redact","--redact"],["impactSurface","--impact-surface"]],REPEATED_FLAG_MAP=[["home","--home"],["root","--root"],["phaseBudget","--phase-budget"]],STRING_FLAG_MAP=[["progressInterval","--progress-interval"],["eventsFile","--events-file"]];function buildSecScanArgv(options){let args=[];for(let[key,flag]of BOOLEAN_FLAG_MAP)if(options[key])args.push(flag);for(let[key,flag]of REPEATED_FLAG_MAP){let values2=options[key]??[];for(let value of values2)args.push(flag,value)}for(let[key,flag]of STRING_FLAG_MAP){let value=options[key];if(value)args.push(flag,value)}if(options.persist===!1)args.push("--no-persist");return args}function buildSecRemediateArgv(options){let args=[];if(options.dryRun)args.push("--dry-run");if(options.apply)args.push("--apply");if(options.resume)args.push("--resume",options.resume);if(options.scanReport)args.push("--scan-report",options.scanReport);if(options.scanId)args.push("--scan-id",options.scanId);if(options.plan)args.push("--plan",options.plan);if(options.quarantineDir)args.push("--quarantine-dir",options.quarantineDir);if(options.unsafeUnverified)args.push("--unsafe-unverified",options.unsafeUnverified);if(options.remediatePartial)args.push("--remediate-partial");if(options.confirmIncompleteScan)args.push("--confirm-incomplete-scan",options.confirmIncompleteScan);for(let pid of options.killPid??[])args.push("--kill-pid",String(pid));if(options.autoConfirmFrom)args.push("--auto-confirm-from",options.autoConfirmFrom);if(options.json)args.push("--json");return args}function runSecScan(options,deps=defaultDeps5){let args=[resolveSecScanScript(process.argv[1],deps),...buildSecScanArgv(options)],result2=deps.spawnSync(process.execPath,args,{stdio:"inherit"});if(result2.error)throw result2.error;return result2.status??1}function runSecRemediate(options,deps=defaultDeps5){let args=[resolveSecRemediateScript(process.argv[1],deps),...buildSecRemediateArgv(options)],result2=deps.spawnSync(process.execPath,args,{stdio:"inherit"});if(result2.error)throw result2.error;return result2.status??1}function runSecRestore(quarantineId,deps=defaultDeps5){let args=[resolveSecRemediateScript(process.argv[1],deps),"--restore",quarantineId],result2=deps.spawnSync(process.execPath,args,{stdio:"inherit"});if(result2.error)throw result2.error;return result2.status??1}function buildSecRollbackArgv(scanId,options){let args=["--rollback",scanId];if(options.json)args.push("--json");return args}function buildSecQuarantineListArgv(options){let args=["--quarantine-list"];if(options.json)args.push("--json");return args}function buildSecQuarantineGcArgv(options){let args=["--quarantine-gc"];if(options.olderThan)args.push("--older-than",options.olderThan);if(options.confirmGc)args.push("--confirm-gc",options.confirmGc);if(options.json)args.push("--json");return args}function runSecRollback(scanId,options,deps=defaultDeps5){let args=[resolveSecRemediateScript(process.argv[1],deps),...buildSecRollbackArgv(scanId,options)],result2=deps.spawnSync(process.execPath,args,{stdio:"inherit"});if(result2.error)throw result2.error;return result2.status??1}function runSecQuarantineList(options,deps=defaultDeps5){let args=[resolveSecRemediateScript(process.argv[1],deps),...buildSecQuarantineListArgv(options)],result2=deps.spawnSync(process.execPath,args,{stdio:"inherit"});if(result2.error)throw result2.error;return result2.status??1}function runSecQuarantineGc(options,deps=defaultDeps5){let args=[resolveSecRemediateScript(process.argv[1],deps),...buildSecQuarantineGcArgv(options)],result2=deps.spawnSync(process.execPath,args,{stdio:"inherit"});if(result2.error)throw result2.error;return result2.status??1}function applySecScanExitCode(exitCode,deps=defaultDeps5){if(exitCode!==0)deps.setExitCode(exitCode)}var VERIFY_EXIT={VERIFIED:0,SIGNATURE_INVALID:2,SIGNER_IDENTITY_MISMATCH:3,PROVENANCE_INVALID:4,NO_SIGNATURE_MATERIAL:5,MISSING_BINARY:127},SIGNER_IDENTITY_REGEXP="^https://github.com/automagik-dev/genie/.github/workflows/release.yml@",SIGNER_OIDC_ISSUER="https://token.actions.githubusercontent.com",PROVENANCE_SOURCE_URI="github.com/automagik-dev/genie",COSIGN_NO_KEY_SENTINEL="BEGIN COSIGN NO-PINNED-KEY SENTINEL";function discoverSignatureBundle(bundleDir,deps=defaultDeps5){if(!deps.existsSync(bundleDir))return null;let candidates=[];try{for(let entry2 of readdirSync13(bundleDir))if(entry2.endsWith(".tgz"))candidates.push(entry2)}catch{return null}for(let tarballName of candidates){let tarball=join81(bundleDir,tarballName),signature=`${tarball}.sig`,certificate=`${tarball}.cert`;if(!deps.existsSync(signature))continue;if(!deps.existsSync(certificate))continue;let provenancePath=join81(bundleDir,"provenance.intoto.jsonl"),provenance=deps.existsSync(provenancePath)?provenancePath:null;return{tarball,signature,certificate,provenance}}return null}function readsAsCosignSentinel(path3,deps=defaultDeps5){if(!deps.existsSync(path3))return!1;try{return deps.readFileSync(path3,"utf8").includes(COSIGN_NO_KEY_SENTINEL)}catch{return!1}}function ensureBinary(name,deps){let result2=deps.spawnSync(name,["--version"],{stdio:"pipe",encoding:"utf8"});if(result2.error)return{ok:!1,binary:name,reason:result2.error.message};if((result2.status??1)!==0)return{ok:!1,binary:name,reason:`${name} --version exited non-zero`};return{ok:!0,binary:name}}function buildVerifyResult(exitCode,ctx){return{exitCode,json:{verified:exitCode===VERIFY_EXIT.VERIFIED,exit_code:exitCode,signer_identity:SIGNER_IDENTITY_REGEXP,signer_oidc_issuer:SIGNER_OIDC_ISSUER,signature_source:ctx.bundle?.signature??null,provenance_source:ctx.bundle?.provenance??null,tarball_path:ctx.bundle?.tarball??null,verified_at:ctx.verifiedAt,pinned_key_fingerprint:null,signing_mode:"cosign-keyless",offline:ctx.offline,errors:ctx.errors}}}function classifyCosignFailure(stderr){let lower=stderr.toLowerCase();return lower.includes("certificate identity")||lower.includes("subject does not match")||lower.includes("oidc issuer")?VERIFY_EXIT.SIGNER_IDENTITY_MISMATCH:VERIFY_EXIT.SIGNATURE_INVALID}function runCosignStep(bundle,offline,errors3,deps){let cosignCheck=ensureBinary("cosign",deps);if(!cosignCheck.ok)return errors3.push(`cosign not available in PATH (${cosignCheck.reason??"unknown"}). Install from https://docs.sigstore.dev/cosign/installation/.`),VERIFY_EXIT.MISSING_BINARY;let cosignArgs=["verify-blob","--certificate-identity-regexp",SIGNER_IDENTITY_REGEXP,"--certificate-oidc-issuer",SIGNER_OIDC_ISSUER,"--signature",bundle.signature,"--certificate",bundle.certificate,bundle.tarball];if(offline)cosignArgs.push("--insecure-ignore-tlog","--offline");let result2=deps.spawnSync("cosign",cosignArgs,{stdio:"pipe",encoding:"utf8"});if(result2.error)return errors3.push(`cosign spawn failed: ${result2.error.message}`),VERIFY_EXIT.MISSING_BINARY;if((result2.status??1)===0)return VERIFY_EXIT.VERIFIED;let stderr=typeof result2.stderr==="string"?result2.stderr:"";if(stderr)errors3.push(stderr.trim());return classifyCosignFailure(stderr)}function runSlsaStep(bundle,errors3,deps){if(!bundle.provenance)return errors3.push(`provenance.intoto.jsonl missing alongside ${bundle.tarball} \u2014 cosign passed but SLSA provenance cannot be checked.`),VERIFY_EXIT.PROVENANCE_INVALID;let slsaCheck=ensureBinary("slsa-verifier",deps);if(!slsaCheck.ok)return errors3.push(`slsa-verifier not available in PATH (${slsaCheck.reason??"unknown"}). Install from https://github.com/slsa-framework/slsa-verifier.`),VERIFY_EXIT.MISSING_BINARY;let result2=deps.spawnSync("slsa-verifier",["verify-artifact",bundle.tarball,"--provenance-path",bundle.provenance,"--source-uri",PROVENANCE_SOURCE_URI],{stdio:"pipe",encoding:"utf8"});if(result2.error)return errors3.push(`slsa-verifier spawn failed: ${result2.error.message}`),VERIFY_EXIT.MISSING_BINARY;if((result2.status??1)===0)return VERIFY_EXIT.VERIFIED;let stderr=typeof result2.stderr==="string"?result2.stderr:"";if(stderr)errors3.push(stderr.trim());return VERIFY_EXIT.PROVENANCE_INVALID}function resolveBundleDir(options,genieRoot){if(options.bundleDir)return options.bundleDir;if(options.tarball)return dirname24(resolve18(options.tarball));return resolve18(genieRoot)}function runVerifyInstall(options,deps=defaultDeps5){let errors3=[],verifiedAt=deps.now().toISOString(),offline=options.offline===!0,genieRoot=resolveGenieRoot2(process.argv[1],deps),bundleDir=resolveBundleDir(options,genieRoot),bundle=discoverSignatureBundle(bundleDir,deps),ctx={bundle,verifiedAt,offline,errors:errors3};if(!bundle){if(errors3.push(`No signed release bundle found under ${bundleDir}. Expected <pkg>.tgz + .sig + .cert + provenance.intoto.jsonl.`),readsAsCosignSentinel(join81(genieRoot,".github","cosign.pub"),deps))errors3.push(".github/cosign.pub is the documented NO-KEY sentinel \u2014 release signing is cosign KEYLESS ONLY; there is no public key to pin.");return buildVerifyResult(VERIFY_EXIT.NO_SIGNATURE_MATERIAL,ctx)}let cosignExit=runCosignStep(bundle,offline,errors3,deps);if(cosignExit!==VERIFY_EXIT.VERIFIED)return buildVerifyResult(cosignExit,ctx);let slsaExit=runSlsaStep(bundle,errors3,deps);return buildVerifyResult(slsaExit,ctx)}function emitHumanReport(result2,options,deps){let{json:json2,exitCode}=result2,status=json2.verified?"OK":"FAIL";if(deps.stdout(`verify-install: ${status} (exit ${exitCode})`),deps.stdout(` signing mode: ${json2.signing_mode}`),deps.stdout(` signer identity: ${json2.signer_identity}`),deps.stdout(` OIDC issuer: ${json2.signer_oidc_issuer}`),deps.stdout(` provenance source: ${PROVENANCE_SOURCE_URI}`),deps.stdout(` tarball: ${json2.tarball_path??"(not found)"}`),deps.stdout(` signature: ${json2.signature_source??"(not found)"}`),deps.stdout(` provenance: ${json2.provenance_source??"(not found)"}`),deps.stdout(` verified_at: ${json2.verified_at}`),deps.stdout(` offline: ${json2.offline?"yes (skips Rekor tlog)":"no"}`),options.offline)deps.stdout(" warning: offline mode skips the Rekor transparency log; revoked certs are not detected.");if(json2.errors.length>0){deps.stderr("verify-install errors:");for(let err of json2.errors)deps.stderr(` - ${err}`)}}function runVerifyInstallCommand(options,deps=defaultDeps5){let result2=runVerifyInstall(options,deps);if(options.json)deps.stdout(JSON.stringify(result2.json));else emitHumanReport(result2,options,deps);return result2.exitCode}function registerSecCommands(program2,deps=defaultDeps5){let sec=program2.command("sec").description("Security tooling \u2014 host compromise triage and IOC hunts");sec.command("scan",{isDefault:!0}).description("Scan host for TeamPCP/CanisterWorm-style package compromise indicators (read-only)").option("--json","Emit machine-readable report on stdout (for archival, CI, or piping to jq)").option("--all-homes","Blast-radius flag \u2014 scan every /root, /home/*, /Users/*, and WSL Windows home found on the host. When to reach for this: incident-response on a multi-tenant box or CI runner where per-user material must all be assessed in one pass.").option("--home <path>","Add one extra home directory to scan. When to reach for this: the scanner did not auto-discover a non-standard home (e.g. /var/lib/service-user) but you know it holds at-risk material.",collectRepeatedOption,[]).option("--root <path>","Blast-radius flag \u2014 add an application root (repeatable) to scan for lockfiles, node_modules, and project evidence. When to reach for this: a multi-service host where each service lives under its own prefix (e.g. --root /srv/app --root /opt/worker).",collectRepeatedOption,[]).option("--no-progress","Suppress progress output on stderr").option("--quiet","Suppress progress and banners on stderr").option("--verbose","Emit extra diagnostics on stderr").option("--progress-json","Emit progress as NDJSON events to stderr").option("--progress-interval <ms>","Progress tick interval in milliseconds").option("--events-file <path>","Append structured NDJSON events to a 0600-mode file").option("--redact","Hash $HOME-prefixed paths; scrub AWS/GitHub/npm/JWT patterns").option("--no-persist","Do not persist the report to $GENIE_HOME/sec-scan/").option("--impact-surface","Scan for at-risk local material (secrets, wallets, browsers)").option("--phase-budget <name=ms>","Budget (ms) for a named phase (repeatable)",collectRepeatedOption,[]).addHelpText("after",`
4383
4426
  Examples:
@@ -4550,7 +4593,7 @@ docs/incident-response/canisterworm.md for the legitimate --unsafe-unverified co
4550
4593
  ORDER BY sc.timestamp DESC
4551
4594
  LIMIT ${limit}
4552
4595
  `;if(options.json){console.log(JSON.stringify(rows,null,2));return}if(rows.length===0){console.log(`No results for "${query2}".`);return}for(let r of rows)console.log(`[${formatRelativeTimestamp(r.timestamp)}] ${r.agent_label??"orphaned"} / ${r.session_id.slice(0,12)}`),console.log(` ${r.role}${r.tool_name?` [${r.tool_name}]`:""}: ${r.headline}`);console.log(`
4553
- (${rows.length} result${rows.length===1?"":"s"})`)}async function sessionsSyncStatusCommand(){if(!await isAvailable())console.error("Database not available."),process.exit(1);let sql=await getConnection(),status=await getBackfillStatus(sql);if(!status){console.log("No backfill has been started. It runs automatically on first daemon start.");return}let pct=status.totalFiles>0?(status.processedFiles/status.totalFiles*100).toFixed(1):"0.0",mbRead=(status.processedBytes/1024/1024).toFixed(1),mbTotal=(status.totalBytes/1024/1024).toFixed(1);console.log(`Session backfill: ${status.processedFiles} / ${status.totalFiles} files (${pct}%)`),console.log(`Bytes read: ${mbRead} MB / ${mbTotal} MB`),console.log(`Errors: ${status.errors}`),console.log(`Status: ${status.status}`)}function registerSessionsCommands(program2){let sessions2=program2.command("sessions").description("Session history \u2014 list, replay, search");sessions2.command("list",{isDefault:!0}).description("List Claude Code sessions").option("--active","Show only active sessions").option("--orphaned","Show only orphaned sessions").option("--agent <name>","Filter by agent").option("--source <name>","Filter by executor metadata source (e.g. omni)").option("--limit <n>","Max number of sessions to return (default: 50)").option("--json","Output as JSON").action(async(options)=>{await sessionsListCommand(options)}),sessions2.command("replay <session-id>").description("Replay a session \u2014 interleave content + events").option("--json","Output as JSON").action(async(sessionId,options)=>{await sessionsReplayCommand(sessionId,options)}),sessions2.command("search <query>").description("Full-text search across session content").option("--json","Output as JSON").option("--limit <n>","Max results","20").action(async(query2,options)=>{await sessionsSearchCommand(query2,options)}),sessions2.command("sync").description("Check session backfill progress").action(async()=>{await sessionsSyncStatusCommand()})}init_state();init_observability_health();init_agent_registry();init_agent_registry();init_derived_signals();init_derived_signals();init_executor_registry();init_should_resume();init_term_format();var ANSI2={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",cyan:"\x1B[36m",magenta:"\x1B[35m"};function colorize(text,color2){if(process.env.NO_COLOR||!process.stdout.isTTY)return text;return`${ANSI2[color2]}${text}${ANSI2.reset}`}async function aggregateAgentDecisions(includeArchived){let agents=await listAgentsForRender({includeArchived}),results=Array(agents.length),cursor=0,cap=Math.min(BOOT_PASS_CONCURRENCY_CAP,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],decision=await shouldResume(a.id).catch(()=>({resume:!1,reason:"no_session_id",rehydrate:"lazy"})),name=a.customName??a.role??a.id,sessionPreview=decision.sessionId?decision.sessionId.slice(0,8):null,lastWriteAt=null;if(a.currentExecutorId){let exec3=await getExecutor(a.currentExecutorId).catch(()=>null);lastWriteAt=exec3?.updatedAt??exec3?.startedAt??null}results[i2]={agentId:a.id,name,kind:a.kind??null,decision,sessionPreview,lastWriteAt}}});return await Promise.all(workers),results}async function collectHealthChecks(){let report=await collectObservabilityHealth();return[{name:"partition",status:report.partition_health,message:report.next_rotation_at?`next rotation: ${report.next_rotation_at}`:void 0},{name:"watchdog",status:report.watchdog,message:report.watchdog_detail},{name:"spill journal",status:report.spill_journal==="pending"?"warn":report.spill_journal==="unknown"?"unknown":"ok",message:report.spill_path},{name:"watcher metrics",status:report.watcher_metrics,message:report.watcher_metrics==="ok"?"all six recently seen":"one or more meta-events missing"}]}function statusIcon(status){switch(status){case"ok":return colorize("\u2713","green");case"warn":return colorize("!","yellow");case"fail":return colorize("\u2717","red");default:return colorize("?","dim")}}function severityBadge(sev){if(sev==="critical")return colorize("[CRITICAL]","red");if(sev==="warn")return colorize("[WARN]","yellow");return colorize("[INFO]","dim")}function formatAgentLine(line){let kindTag=line.kind==="permanent"?colorize("p","magenta"):colorize("t","cyan"),session=line.sessionPreview?colorize(line.sessionPreview,"dim"):colorize("no-session","yellow"),lastWrite=line.lastWriteAt?formatRelativeTimestamp(line.lastWriteAt):"-",reason=line.decision.reason==="ok"?colorize("resume ready","green"):colorize(line.decision.reason,"yellow");return` [${kindTag}] ${line.name.padEnd(28).slice(0,28)} ${session.padEnd(8)} last:${lastWrite.padEnd(10)} ${reason}`}function renderResumableSection(lines){let resumable=lines.filter((l)=>l.decision.resume);if(resumable.length===0){console.log(colorize(" (no in-flight agents \u2014 every prior anchor is closed or paused)","dim"));return}for(let line of resumable)console.log(formatAgentLine(line))}function renderStuckSection(lines){let stuck=lines.filter((l)=>!l.decision.resume&&l.decision.reason!=="assignment_closed"&&l.decision.reason!=="unknown_agent");if(stuck.length===0)return;console.log(""),console.log(colorize("STUCK / NEEDS ATTENTION","bold")),console.log("-".repeat(60));for(let line of stuck)if(console.log(formatAgentLine(line)),line.decision.reason==="auto_resume_disabled")console.log(colorize(` \u2192 genie agent resume ${line.name}`,"dim"));else if(line.decision.reason==="no_session_id")console.log(colorize(` \u2192 genie agent show ${line.name} # inspect; consider archive`,"dim"))}function renderArchivedSection(lines){let done=lines.filter((l)=>l.decision.reason==="assignment_closed");if(done.length===0)return;console.log(""),console.log(colorize("DONE / ARCHIVED","bold")),console.log("-".repeat(60));for(let line of done)console.log(formatAgentLine(line))}function renderSignalsSection(signals2){if(signals2.length===0){console.log(colorize(" (no active alerts)","dim"));return}for(let sig of signals2){console.log(` ${severityBadge(sig.severity)} ${colorize(sig.type,"bold")} on ${sig.subject}`);let drilldown=SIGNAL_DRILLDOWN[sig.type];if(drilldown)console.log(colorize(` \u2192 ${drilldown}`,"dim"));if(sig.triggeredAt)console.log(colorize(` ${formatRelativeTimestamp(sig.triggeredAt)}`,"dim"))}}function renderHealthSection(checks){for(let check2 of checks){let detail=check2.message?colorize(` ${check2.message}`,"dim"):"";console.log(` ${statusIcon(check2.status)} ${check2.name.padEnd(18)} ${detail}`)}}async function renderDebugSection(){let audit=await auditAgentKind();if(console.log(""),console.log(colorize("DEBUG \u2014 kind audit","bold")),console.log("-".repeat(60)),console.log(` rows scanned: ${audit.total}`),console.log(` drift count : ${audit.drifted.length}`),audit.drifted.length>0)for(let d of audit.drifted.slice(0,10))console.log(colorize(` drift: ${d.id} stored=${d.kind??"null"} expected=${d.expected}`,"yellow"))}async function buildReport(opts){let includeArchived=opts.all===!0,[agents,signals2]=await Promise.all([aggregateAgentDecisions(includeArchived),listActiveDerivedSignals()]),partitionSignal=await detectPartitionMissing().catch(()=>null);if(partitionSignal)await recordDerivedSignal(partitionSignal).catch(()=>{}),signals2.unshift(partitionSignal);let report={agents,signals:signals2};if(opts.health)report.health=await collectHealthChecks();return report}async function statusCommand2(opts={}){let t0=Date.now(),report=await buildReport(opts);if(opts.json){console.log(JSON.stringify(report,null,2));return}if(console.log(""),console.log(colorize("IN-FLIGHT \u2014 should resume","bold")),console.log("-".repeat(60)),renderResumableSection(report.agents),renderStuckSection(report.agents),opts.all)renderArchivedSection(report.agents);if(console.log(""),console.log(colorize("ACTIVE SIGNALS","bold")),console.log("-".repeat(60)),renderSignalsSection(report.signals),report.health)console.log(""),console.log(colorize("HEALTH","bold")),console.log("-".repeat(60)),renderHealthSection(report.health);if(opts.debug)await renderDebugSection();console.log(""),console.log(colorize(` rendered in ${Date.now()-t0}ms \u2014 ${report.agents.length} agents, ${report.signals.length} signals`,"dim")),console.log("")}init_genie_tokens();init_term_format();var _taskService7;async function getTaskService7(){if(!_taskService7)_taskService7=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService7}function registerTagCommands(program2){let tag=program2.command("tag").description("Tag management");tag.command("list").description("List all tags").option("--type <typeId>","Filter by task type").option("--json","Output as JSON").action(async(options)=>{try{let tags=await(await getTaskService7()).listTags(options.type);if(options.json){console.log(JSON.stringify(tags,null,2));return}console.log(` ${padRight("ID",20)} ${padRight("NAME",20)} ${padRight("COLOR",10)} TYPE`),console.log(` ${"\u2500".repeat(55)}`);for(let t of tags)console.log(` ${padRight(t.id,20)} ${padRight(t.name,20)} ${padRight(t.color,10)} ${t.typeId??"-"}`);console.log(`
4596
+ (${rows.length} result${rows.length===1?"":"s"})`)}async function sessionsSyncStatusCommand(){if(!await isAvailable())console.error("Database not available."),process.exit(1);let sql=await getConnection(),status=await getBackfillStatus(sql);if(!status){console.log("No backfill has been started. It runs automatically on first daemon start.");return}let pct=status.totalFiles>0?(status.processedFiles/status.totalFiles*100).toFixed(1):"0.0",mbRead=(status.processedBytes/1024/1024).toFixed(1),mbTotal=(status.totalBytes/1024/1024).toFixed(1);console.log(`Session backfill: ${status.processedFiles} / ${status.totalFiles} files (${pct}%)`),console.log(`Bytes read: ${mbRead} MB / ${mbTotal} MB`),console.log(`Errors: ${status.errors}`),console.log(`Status: ${status.status}`)}function registerSessionsCommands(program2){let sessions2=program2.command("sessions").description("Session history \u2014 list, replay, search");sessions2.command("list",{isDefault:!0}).description("List Claude Code sessions").option("--active","Show only active sessions").option("--orphaned","Show only orphaned sessions").option("--agent <name>","Filter by agent").option("--source <name>","Filter by executor metadata source (e.g. omni)").option("--limit <n>","Max number of sessions to return (default: 50)").option("--json","Output as JSON").action(async(options)=>{await sessionsListCommand(options)}),sessions2.command("replay <session-id>").description("Replay a session \u2014 interleave content + events").option("--json","Output as JSON").action(async(sessionId,options)=>{await sessionsReplayCommand(sessionId,options)}),sessions2.command("search <query>").description("Full-text search across session content").option("--json","Output as JSON").option("--limit <n>","Max results","20").action(async(query2,options)=>{await sessionsSearchCommand(query2,options)}),sessions2.command("sync").description("Check session backfill progress").action(async()=>{await sessionsSyncStatusCommand()})}init_state();init_observability_health();init_agent_registry();init_agent_registry();init_derived_signals();init_derived_signals();init_executor_registry();init_should_resume();init_term_format();var ANSI2={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",cyan:"\x1B[36m",magenta:"\x1B[35m"};function colorize(text,color2){if(process.env.NO_COLOR||!process.stdout.isTTY)return text;return`${ANSI2[color2]}${text}${ANSI2.reset}`}async function aggregateAgentDecisions(includeArchived){let agents=await listAgentsForRender({includeArchived}),results=Array(agents.length),cursor=0,cap=Math.min(BOOT_PASS_CONCURRENCY_CAP,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],decision=await shouldResume(a.id).catch(()=>({resume:!1,reason:"no_session_id",rehydrate:"lazy"})),name=a.customName??a.role??a.id,sessionPreview=decision.sessionId?decision.sessionId.slice(0,8):null,lastWriteAt=null;if(a.currentExecutorId){let exec3=await getExecutor(a.currentExecutorId).catch(()=>null);lastWriteAt=exec3?.updatedAt??exec3?.startedAt??null}results[i2]={agentId:a.id,name,kind:a.kind??null,decision,sessionPreview,lastWriteAt}}});return await Promise.all(workers),results}async function collectHealthChecks(){let report2=await collectObservabilityHealth();return[{name:"partition",status:report2.partition_health,message:report2.next_rotation_at?`next rotation: ${report2.next_rotation_at}`:void 0},{name:"watchdog",status:report2.watchdog,message:report2.watchdog_detail},{name:"spill journal",status:report2.spill_journal==="pending"?"warn":report2.spill_journal==="unknown"?"unknown":"ok",message:report2.spill_path},{name:"watcher metrics",status:report2.watcher_metrics,message:report2.watcher_metrics==="ok"?"all six recently seen":"one or more meta-events missing"}]}function statusIcon(status){switch(status){case"ok":return colorize("\u2713","green");case"warn":return colorize("!","yellow");case"fail":return colorize("\u2717","red");default:return colorize("?","dim")}}function severityBadge(sev){if(sev==="critical")return colorize("[CRITICAL]","red");if(sev==="warn")return colorize("[WARN]","yellow");return colorize("[INFO]","dim")}function formatAgentLine(line){let kindTag=line.kind==="permanent"?colorize("p","magenta"):colorize("t","cyan"),session=line.sessionPreview?colorize(line.sessionPreview,"dim"):colorize("no-session","yellow"),lastWrite=line.lastWriteAt?formatRelativeTimestamp(line.lastWriteAt):"-",reason=line.decision.reason==="ok"?colorize("resume ready","green"):colorize(line.decision.reason,"yellow");return` [${kindTag}] ${line.name.padEnd(28).slice(0,28)} ${session.padEnd(8)} last:${lastWrite.padEnd(10)} ${reason}`}function renderResumableSection(lines){let resumable=lines.filter((l)=>l.decision.resume);if(resumable.length===0){console.log(colorize(" (no in-flight agents \u2014 every prior anchor is closed or paused)","dim"));return}for(let line of resumable)console.log(formatAgentLine(line))}function renderStuckSection(lines){let stuck=lines.filter((l)=>!l.decision.resume&&l.decision.reason!=="assignment_closed"&&l.decision.reason!=="unknown_agent");if(stuck.length===0)return;console.log(""),console.log(colorize("STUCK / NEEDS ATTENTION","bold")),console.log("-".repeat(60));for(let line of stuck)if(console.log(formatAgentLine(line)),line.decision.reason==="auto_resume_disabled")console.log(colorize(` \u2192 genie agent resume ${line.name}`,"dim"));else if(line.decision.reason==="no_session_id")console.log(colorize(` \u2192 genie agent show ${line.name} # inspect; consider archive`,"dim"))}function renderArchivedSection(lines){let done=lines.filter((l)=>l.decision.reason==="assignment_closed");if(done.length===0)return;console.log(""),console.log(colorize("DONE / ARCHIVED","bold")),console.log("-".repeat(60));for(let line of done)console.log(formatAgentLine(line))}function renderSignalsSection(signals2){if(signals2.length===0){console.log(colorize(" (no active alerts)","dim"));return}for(let sig of signals2){console.log(` ${severityBadge(sig.severity)} ${colorize(sig.type,"bold")} on ${sig.subject}`);let drilldown=SIGNAL_DRILLDOWN[sig.type];if(drilldown)console.log(colorize(` \u2192 ${drilldown}`,"dim"));if(sig.triggeredAt)console.log(colorize(` ${formatRelativeTimestamp(sig.triggeredAt)}`,"dim"))}}function renderHealthSection(checks){for(let check2 of checks){let detail=check2.message?colorize(` ${check2.message}`,"dim"):"";console.log(` ${statusIcon(check2.status)} ${check2.name.padEnd(18)} ${detail}`)}}async function renderDebugSection(){let audit=await auditAgentKind();if(console.log(""),console.log(colorize("DEBUG \u2014 kind audit","bold")),console.log("-".repeat(60)),console.log(` rows scanned: ${audit.total}`),console.log(` drift count : ${audit.drifted.length}`),audit.drifted.length>0)for(let d of audit.drifted.slice(0,10))console.log(colorize(` drift: ${d.id} stored=${d.kind??"null"} expected=${d.expected}`,"yellow"))}async function buildReport(opts){let includeArchived=opts.all===!0,[agents,signals2]=await Promise.all([aggregateAgentDecisions(includeArchived),listActiveDerivedSignals()]),partitionSignal=await detectPartitionMissing().catch(()=>null);if(partitionSignal)await recordDerivedSignal(partitionSignal).catch(()=>{}),signals2.unshift(partitionSignal);let report2={agents,signals:signals2};if(opts.health)report2.health=await collectHealthChecks();return report2}async function statusCommand2(opts={}){let t0=Date.now(),report2=await buildReport(opts);if(opts.json){console.log(JSON.stringify(report2,null,2));return}if(console.log(""),console.log(colorize("IN-FLIGHT \u2014 should resume","bold")),console.log("-".repeat(60)),renderResumableSection(report2.agents),renderStuckSection(report2.agents),opts.all)renderArchivedSection(report2.agents);if(console.log(""),console.log(colorize("ACTIVE SIGNALS","bold")),console.log("-".repeat(60)),renderSignalsSection(report2.signals),report2.health)console.log(""),console.log(colorize("HEALTH","bold")),console.log("-".repeat(60)),renderHealthSection(report2.health);if(opts.debug)await renderDebugSection();console.log(""),console.log(colorize(` rendered in ${Date.now()-t0}ms \u2014 ${report2.agents.length} agents, ${report2.signals.length} signals`,"dim")),console.log("")}init_genie_tokens();init_term_format();var _taskService7;async function getTaskService7(){if(!_taskService7)_taskService7=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService7}function registerTagCommands(program2){let tag=program2.command("tag").description("Tag management");tag.command("list").description("List all tags").option("--type <typeId>","Filter by task type").option("--json","Output as JSON").action(async(options)=>{try{let tags=await(await getTaskService7()).listTags(options.type);if(options.json){console.log(JSON.stringify(tags,null,2));return}console.log(` ${padRight("ID",20)} ${padRight("NAME",20)} ${padRight("COLOR",10)} TYPE`),console.log(` ${"\u2500".repeat(55)}`);for(let t of tags)console.log(` ${padRight(t.id,20)} ${padRight(t.name,20)} ${padRight(t.color,10)} ${t.typeId??"-"}`);console.log(`
4554
4597
  ${tags.length} tag${tags.length===1?"":"s"}`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),tag.command("create <name>").description("Create a custom tag").option("--color <hex>","Tag color (hex)",palette.textDim).option("--type <typeId>","Associate with a task type").action(async(name,options)=>{try{let ts3=await getTaskService7(),id=name.toLowerCase().replace(/\s+/g,"-"),t=await ts3.createTag({id,name,color:options.color,typeId:options.type});console.log(`Created tag "${t.name}" (${t.id}) with color ${t.color}.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_term_format();var _taskService8;async function getTaskService8(){if(!_taskService8)_taskService8=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService8}var _boardService2;async function getBoardService2(){if(!_boardService2)_boardService2=await Promise.resolve().then(() => (init_board_service(),exports_board_service));return _boardService2}var _closeMergedService;async function getCloseMergedService(){if(!_closeMergedService)_closeMergedService=await Promise.resolve().then(() => (init_task_close_merged(),exports_task_close_merged));return _closeMergedService}function localActor2(name){return{actorType:"local",actorId:name}}function currentActor3(){let name=process.env.GENIE_AGENT_NAME??"cli";return localActor2(name)}function getRunId(){return process.env.GENIE_RUN_ID??`run-${Date.now()}`}var PRIORITY_COLORS={urgent:"\x1B[31m",high:"\x1B[33m",normal:"\x1B[0m",low:"\x1B[90m"},RESET2="\x1B[0m";async function resolveDefaultBoardId(){try{let{execSync:execSync18}=await import("child_process"),repoRoot=execSync18("git rev-parse --show-toplevel",{encoding:"utf-8"}).trim(),{join:join82}=await import("path"),configPath2=join82(repoRoot,".genie","config.json"),{existsSync:existsSync68,readFileSync:readFileSync44}=await import("fs");if(existsSync68(configPath2)){let config=JSON.parse(readFileSync44(configPath2,"utf-8"));if(config.activeBoard)return config.activeBoard}}catch{}return null}async function handleInvalidStageError(taskId,message){try{let task=await(await getTaskService8()).getTask(taskId);if(!task?.boardId)return;let board=await(await getBoardService2()).getBoard(task.boardId);if(!board)return;let validCols=board.columns.sort((a,b2)=>a.position-b2.position).map((c)=>c.name).join(" \u2192 ");console.error(`Error: ${message}
4555
4598
  Valid columns for board "${board.name}": ${validCols}`),process.exit(1)}catch{}}async function resolveBoardOption(boardName){if(boardName){let board=await(await getBoardService2()).getBoard(boardName);if(!board)console.error(`Error: Board not found: ${boardName}`),process.exit(1);return board.id}return await resolveDefaultBoardId()??void 0}function getProjectName(repoPath){let parts=repoPath.split("/");return parts[parts.length-1]||repoPath}function formatTaskRow(t,showProject,hasExternal){let seq2=showProject?`${getProjectName(t.repoPath)}#${t.seq}`:`#${t.seq}`,title=truncate2(t.title,38),color2=t.status==="archived"?"\x1B[90m":PRIORITY_COLORS[t.priority]??"",due=formatDate(t.dueDate),proj=showProject?`${padRight(getProjectName(t.repoPath),16)} `:"",ext=hasExternal?`${padRight(truncate2(t.externalId??"",25),27)} `:"",statusLabel=t.status==="archived"?"\x1B[90m[archived]\x1B[0m":t.status;return` ${padRight(seq2,showProject?22:6)} ${proj}${padRight(title,40)} ${ext}${padRight(t.stage,12)} ${padRight(statusLabel,12)} ${color2}${padRight(t.priority,10)}${RESET2} ${padRight(due,12)}`}function printTaskList(tasks,showProject=!1){if(tasks.length===0){console.log("No tasks found.");return}let hasExternal=tasks.some((t)=>t.externalId),extCol=hasExternal?`${padRight("EXTERNAL",27)} `:"",projCol=showProject?`${padRight("PROJECT",16)} `:"",header=` ${padRight("#",6)} ${projCol}${padRight("TITLE",40)} ${extCol}${padRight("STAGE",12)} ${padRight("STATUS",12)} ${padRight("PRIORITY",10)} ${padRight("DUE",12)}`,lineLen=(showProject?108:92)+(hasExternal?28:0);console.log(header),console.log(` ${"\u2500".repeat(lineLen)}`);for(let t of tasks)console.log(formatTaskRow(t,showProject,hasExternal));console.log(`
4556
4599
  ${tasks.length} task${tasks.length===1?"":"s"}`)}function printTaskFields(task){console.log(""),console.log(`Task #${task.seq}: ${task.title}`),console.log("\u2500".repeat(60)),console.log(` ID: ${task.id}`),console.log(` Type: ${task.typeId}`),console.log(` Stage: ${task.stage}`),console.log(` Status: ${task.status}`),console.log(` Priority: ${task.priority}`);let optionalFields=[["Description",task.description],["Criteria",task.acceptanceCriteria],["Effort",task.estimatedEffort],["Start",task.startDate?formatDate(task.startDate):null],["Due",task.dueDate?formatDate(task.dueDate):null],["Blocked",task.blockedReason],["Parent",task.parentId],["Release",task.releaseId],["Wish",task.wishFile],["External",task.externalId],["Ext URL",task.externalUrl]];for(let[label,value]of optionalFields)if(value)console.log(` ${padRight(`${label}:`,12)} ${value}`);if(task.checkoutRunId)console.log(` Checkout: ${task.checkoutRunId} (since ${formatTimestamp(task.executionLockedAt)})`);if(console.log(` Created: ${formatTimestamp(task.createdAt)}`),task.startedAt)console.log(` Started: ${formatTimestamp(task.startedAt)}`);if(task.endedAt)console.log(` Ended: ${formatTimestamp(task.endedAt)}`)}async function printTaskRelations(task){let ts3=await getTaskService8(),actors=await ts3.getTaskActors(task.id,task.repoPath);if(actors.length>0){console.log(`
@@ -4630,14 +4673,14 @@ Stage Pipeline:`);let stages=t.stages;for(let i2=0;i2<stages.length;i2++){let s2
4630
4673
  `;function renderTemplate(raw,slug,date){return raw.replace(/\{\{slug\}\}/g,slug).replace(/\{\{date\}\}/g,date)}function today(){let d=new Date,yyyy=d.getUTCFullYear(),mm=String(d.getUTCMonth()+1).padStart(2,"0"),dd=String(d.getUTCDate()).padStart(2,"0");return`${yyyy}-${mm}-${dd}`}async function wishNewCommand(slug,options){if(!/^[a-z0-9][a-z0-9-]*$/.test(slug))console.error(`\u274C Invalid slug "${slug}" \u2014 use lowercase letters, digits, and hyphens`),process.exit(1);let wishDir=join83(process.cwd(),".genie","wishes",slug),wishPath=join83(wishDir,"WISH.md");if(existsSync69(wishPath)&&!options.force)console.error(`\u274C Wish already exists: ${wishPath}`),console.error(" Pass --force to overwrite"),process.exit(1);let templatePath=resolveTemplatePath(),raw=templatePath?await readFile17(templatePath,"utf-8"):FALLBACK_TEMPLATE;if(!templatePath)console.warn("\u26A0\uFE0F templates/wish-template.md not found \u2014 using inline fallback skeleton");let rendered=renderTemplate(raw,slug,today());await mkdir12(wishDir,{recursive:!0}),await writeFile11(wishPath,rendered,"utf-8"),console.log(`\uD83D\uDCDD Created wish scaffold: ${wishPath}`),console.log(` Template: ${templatePath??"<inline fallback>"}`),console.log(` Next: edit the wish, then run \`genie wish lint ${slug}\` before dispatching`)}function renderDiff(before,after){let beforeLines=before.split(`
4631
4674
  `),afterLines=after.split(`
4632
4675
  `),len=Math.max(beforeLines.length,afterLines.length),out=[];for(let i2=0;i2<len;i2++){let b2=beforeLines[i2],a=afterLines[i2];if(b2===a)continue;if(b2!==void 0)out.push(`- ${b2}`);if(a!==void 0)out.push(`+ ${a}`)}return out.join(`
4633
- `)}function parseWishOrError(markdown){try{return parseWish(markdown)}catch(err){if(err instanceof WishParseError)return err;throw err}}function reportWishFileMissing(slug,wishPath,jsonMode){if(jsonMode)console.log(JSON.stringify({error:`Wish file not found: ${wishPath}`,rule:"missing-title",wish:slug,file:wishPath}));else console.error(`\u274C Wish file not found: ${wishPath}`);process.exit(1)}function emitLintReport(report,wishPath,jsonMode){if(jsonMode)console.log(JSON.stringify(report));else console.log(formatLintReport(report,{color:process.stdout.isTTY??!1,path:wishPath}))}function exitWithErrorCount(report){let errors3=report.violations.filter((v)=>v.severity==="error").length;process.exit(errors3>0?1:0)}function handleNoFixableViolations(report,wishPath,jsonMode){if(jsonMode)console.log(JSON.stringify({...report,fixedViolations:0}));else console.log(formatLintReport(report,{color:process.stdout.isTTY??!1,path:wishPath})),console.log(`
4634
- No fixable violations to apply.`);process.exit(report.summary.total>0?1:0)}function handleDryRunFix(report,markdown,fixed,wishPath,jsonMode){if(jsonMode)console.log(JSON.stringify({...report,dryRun:!0,diff:renderDiff(markdown,fixed)}));else console.log(formatLintReport(report,{color:process.stdout.isTTY??!1,path:wishPath})),console.log(`
4676
+ `)}function parseWishOrError(markdown){try{return parseWish(markdown)}catch(err){if(err instanceof WishParseError)return err;throw err}}function reportWishFileMissing(slug,wishPath,jsonMode){if(jsonMode)console.log(JSON.stringify({error:`Wish file not found: ${wishPath}`,rule:"missing-title",wish:slug,file:wishPath}));else console.error(`\u274C Wish file not found: ${wishPath}`);process.exit(1)}function emitLintReport(report2,wishPath,jsonMode){if(jsonMode)console.log(JSON.stringify(report2));else console.log(formatLintReport(report2,{color:process.stdout.isTTY??!1,path:wishPath}))}function exitWithErrorCount(report2){let errors3=report2.violations.filter((v)=>v.severity==="error").length;process.exit(errors3>0?1:0)}function handleNoFixableViolations(report2,wishPath,jsonMode){if(jsonMode)console.log(JSON.stringify({...report2,fixedViolations:0}));else console.log(formatLintReport(report2,{color:process.stdout.isTTY??!1,path:wishPath})),console.log(`
4677
+ No fixable violations to apply.`);process.exit(report2.summary.total>0?1:0)}function handleDryRunFix(report2,markdown,fixed,wishPath,jsonMode){if(jsonMode)console.log(JSON.stringify({...report2,dryRun:!0,diff:renderDiff(markdown,fixed)}));else console.log(formatLintReport(report2,{color:process.stdout.isTTY??!1,path:wishPath})),console.log(`
4635
4678
  --- Dry-run diff (${wishPath}) ---`),console.log(renderDiff(markdown,fixed)),console.log(`
4636
- File not modified (--dry-run).`);process.exit(report.summary.total>0?1:0)}async function applyAndReportFix(report,fixed,wishPath,slug,lintOpts,jsonMode){await writeFile11(wishPath,fixed,"utf-8");let docOrError2=parseWishOrError(fixed),report2={...lintWish(docOrError2,fixed,lintOpts),wish:slug,file:wishPath},fixedCount=report.summary.fixable;if(jsonMode)console.log(JSON.stringify({...report2,fixedViolations:fixedCount}));else console.log(`\u2705 Applied ${fixedCount} fix(es) to ${wishPath}`),console.log(""),console.log(formatLintReport(report2,{color:process.stdout.isTTY??!1,path:wishPath}));let remainingErrors=report2.violations.filter((v)=>v.severity==="error").length;process.exit(remainingErrors>0?1:0)}async function runLintFix(report,markdown,wishPath,slug,lintOpts,options){let{applyFixes:applyFixes2}=await Promise.resolve().then(() => (init_wish_lint(),exports_wish_lint)),fixed=applyFixes2(markdown,report),jsonMode=options.json??!1;if(fixed===markdown)handleNoFixableViolations(report,wishPath,jsonMode);if(options.dryRun)handleDryRunFix(report,markdown,fixed,wishPath,jsonMode);return applyAndReportFix(report,fixed,wishPath,slug,lintOpts,jsonMode)}async function wishLintCommand(slug,options){let wishPath=join83(process.cwd(),".genie","wishes",slug,"WISH.md"),jsonMode=options.json??!1;if(!existsSync69(wishPath))reportWishFileMissing(slug,wishPath,jsonMode);let markdown=await readFile17(wishPath,"utf-8"),lintOpts={allowTodoPlaceholders:options.allowTodoPlaceholders},docOrError=parseWishOrError(markdown),report={...lintWish(docOrError,markdown,lintOpts),wish:slug,file:wishPath};if(options.fix){await runLintFix(report,markdown,wishPath,slug,lintOpts,options);return}emitLintReport(report,wishPath,jsonMode),exitWithErrorCount(report)}function reportWishParseError(error2,jsonMode){let payload={error:error2.message,rule:error2.rule,line:error2.line,column:error2.column??null,file:error2.file??null};if(jsonMode){console.log(JSON.stringify(payload));return}if(console.error(`\u274C Parse failed (${payload.rule}): ${payload.error}`),payload.file)console.error(` File: ${payload.file}`);if(payload.line)console.error(` Line: ${payload.line}`)}async function wishParseCommand(slug,options){try{let doc=parseWishFile(slug);console.log(options.json?JSON.stringify(doc):JSON.stringify(doc,null,2));return}catch(error2){if(error2 instanceof WishParseError)reportWishParseError(error2,options.json??!1),process.exit(1);let message=error2 instanceof Error?error2.message:String(error2);console.error(`\u274C ${message}`),process.exit(1)}}async function isWishFile(wishPath){try{return(await stat11(wishPath)).isFile()}catch{return!1}}function parseWishSummary(slug){try{let doc=parseWishFile(slug);return{status:doc.metadata.status??"-",groupCount:String(doc.executionGroups.length)}}catch(error2){return{status:error2 instanceof WishParseError?"malformed":"error",groupCount:"-"}}}async function loadStateCounts(slug){try{let state=await(await Promise.resolve().then(() => (init_wish_state(),exports_wish_state))).getState(slug);if(!state)return{ready:0,inProgress:0,done:0};let ready=0,inProgress=0,done=0;for(let g of Object.values(state.groups))if(g.status==="ready")ready++;else if(g.status==="in_progress")inProgress++;else if(g.status==="done")done++;return{ready,inProgress,done}}catch{return{ready:0,inProgress:0,done:0}}}async function wishListCommand(){let wishesRoot=join83(process.cwd(),".genie","wishes");if(!existsSync69(wishesRoot))console.error(`\u274C Wishes directory not found: ${wishesRoot}`),process.exit(1);let entries=await readdir11(wishesRoot),rows=[];for(let entry2 of entries.sort()){if(entry2.startsWith("_")||entry2.startsWith("."))continue;if(!await isWishFile(join83(wishesRoot,entry2,"WISH.md")))continue;let{status,groupCount}=parseWishSummary(entry2),{ready,inProgress,done}=await loadStateCounts(entry2);rows.push({slug:entry2,status,groupCount,ready,inProgress,done})}if(rows.length===0){console.log("No wishes found under .genie/wishes/");return}let slugW=Math.max(4,...rows.map((r)=>r.slug.length)),statusW=Math.max(6,...rows.map((r)=>r.status.length)),pad=(s2,n)=>s2+" ".repeat(Math.max(0,n-s2.length));console.log(` ${pad("SLUG",slugW)} ${pad("STATUS",statusW)} GROUPS READY IN-PROG DONE`),console.log(` ${"\u2500".repeat(slugW+statusW+32)}`);for(let r of rows)console.log(` ${pad(r.slug,slugW)} ${pad(r.status,statusW)} ${pad(r.groupCount,6)} ${pad(String(r.ready),5)} ${pad(String(r.inProgress),7)} ${r.done}`);console.log(""),console.log(` Total: ${rows.length} wishes`)}function registerWishCommands(program2){let wish=program2.command("wish").description("Wish lifecycle management");wish.command("new <slug>").description("Scaffold a new WISH.md from templates/wish-template.md").option("--force","Overwrite an existing wish directory").action(async(slug,options)=>{await wishNewCommand(slug,options)}),wish.command("lint <slug>").description("Structural health check (stub \u2014 full implementation in Group 3)").option("--json","Emit machine-readable JSON output").option("--fix","Auto-repair deterministic violations").option("--dry-run","With --fix: print diff without writing").option("--allow-todo-placeholders","Pass <TODO> placeholders without emitting todo-placeholder-remaining").action(async(slug,options)=>{await wishLintCommand(slug,options)}),wish.command("parse <slug>").description("Parse WISH.md and emit the WishDocument as JSON").option("--json","One-line JSON output (default: pretty-printed)").action(async(slug,options)=>{await wishParseCommand(slug,options)}),wish.command("status <slug>").description("Show wish state overview for all groups").action(async(slug)=>{await statusCommand(slug)}),wish.command("done <ref>").description("Mark a wish group as done (format: <slug>#<group>)").action(async(ref)=>{await doneCommand(ref)}),wish.command("reset <ref>").option("-y, --yes","Skip confirmation prompt (required in non-interactive mode)").description("Reset wish state. <slug>#<group> resets one in-progress group; bare <slug> wipes the wish and recreates from current WISH.md").action(async(ref,options)=>{await resetAction(ref,options)}),wish.command("list").description("Enumerate all wishes with status, group counts, and progress").action(async()=>{await wishListCommand()})}var _T_BOOT=Date.now();try{let{execSync:execSyncStartup}=__require("child_process");if(execSyncStartup("git config core.bare",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()==="true")execSyncStartup("git config core.bare false",{stdio:["pipe","pipe","pipe"]})}catch{}function parseNumericFlag2(flagName){return(value)=>{let n=Number(value);if(Number.isNaN(n))throw Error(`${flagName} must be a number, got: ${value}`);return n}}if(process.env.GENIE_PROFILE_DB)console.error(`[profile] imports=${Date.now()-_T_BOOT}ms`);var program2=new Command;program2.name("genie").description("Genie CLI - AI-assisted development").version(VERSION);program2.option("--no-interactive","Disable interactive prompts (exit 2 instead of prompting)");program2.option("--no-tui","Skip TUI bootstrap (or set GENIE_TUI_DISABLE=1)");program2.configureHelp({sortSubcommands:!0,showGlobalOptions:!0});program2.configureOutput({outputError:(str5,write)=>{let cmd=program2.commands.find((c)=>process.argv.slice(2,6).includes(c.name())),prefix=cmd?`genie ${cmd.name()}`:"genie";write(`\x1B[31mError (${prefix}): ${str5}\x1B[0m
4679
+ File not modified (--dry-run).`);process.exit(report2.summary.total>0?1:0)}async function applyAndReportFix(report2,fixed,wishPath,slug,lintOpts,jsonMode){await writeFile11(wishPath,fixed,"utf-8");let docOrError2=parseWishOrError(fixed),report22={...lintWish(docOrError2,fixed,lintOpts),wish:slug,file:wishPath},fixedCount=report2.summary.fixable;if(jsonMode)console.log(JSON.stringify({...report22,fixedViolations:fixedCount}));else console.log(`\u2705 Applied ${fixedCount} fix(es) to ${wishPath}`),console.log(""),console.log(formatLintReport(report22,{color:process.stdout.isTTY??!1,path:wishPath}));let remainingErrors=report22.violations.filter((v)=>v.severity==="error").length;process.exit(remainingErrors>0?1:0)}async function runLintFix(report2,markdown,wishPath,slug,lintOpts,options){let{applyFixes:applyFixes2}=await Promise.resolve().then(() => (init_wish_lint(),exports_wish_lint)),fixed=applyFixes2(markdown,report2),jsonMode=options.json??!1;if(fixed===markdown)handleNoFixableViolations(report2,wishPath,jsonMode);if(options.dryRun)handleDryRunFix(report2,markdown,fixed,wishPath,jsonMode);return applyAndReportFix(report2,fixed,wishPath,slug,lintOpts,jsonMode)}async function wishLintCommand(slug,options){let wishPath=join83(process.cwd(),".genie","wishes",slug,"WISH.md"),jsonMode=options.json??!1;if(!existsSync69(wishPath))reportWishFileMissing(slug,wishPath,jsonMode);let markdown=await readFile17(wishPath,"utf-8"),lintOpts={allowTodoPlaceholders:options.allowTodoPlaceholders},docOrError=parseWishOrError(markdown),report2={...lintWish(docOrError,markdown,lintOpts),wish:slug,file:wishPath};if(options.fix){await runLintFix(report2,markdown,wishPath,slug,lintOpts,options);return}emitLintReport(report2,wishPath,jsonMode),exitWithErrorCount(report2)}function reportWishParseError(error2,jsonMode){let payload={error:error2.message,rule:error2.rule,line:error2.line,column:error2.column??null,file:error2.file??null};if(jsonMode){console.log(JSON.stringify(payload));return}if(console.error(`\u274C Parse failed (${payload.rule}): ${payload.error}`),payload.file)console.error(` File: ${payload.file}`);if(payload.line)console.error(` Line: ${payload.line}`)}async function wishParseCommand(slug,options){try{let doc=parseWishFile(slug);console.log(options.json?JSON.stringify(doc):JSON.stringify(doc,null,2));return}catch(error2){if(error2 instanceof WishParseError)reportWishParseError(error2,options.json??!1),process.exit(1);let message=error2 instanceof Error?error2.message:String(error2);console.error(`\u274C ${message}`),process.exit(1)}}async function isWishFile(wishPath){try{return(await stat11(wishPath)).isFile()}catch{return!1}}function parseWishSummary(slug){try{let doc=parseWishFile(slug);return{status:doc.metadata.status??"-",groupCount:String(doc.executionGroups.length)}}catch(error2){return{status:error2 instanceof WishParseError?"malformed":"error",groupCount:"-"}}}async function loadStateCounts(slug){try{let state=await(await Promise.resolve().then(() => (init_wish_state(),exports_wish_state))).getState(slug);if(!state)return{ready:0,inProgress:0,done:0};let ready=0,inProgress=0,done=0;for(let g of Object.values(state.groups))if(g.status==="ready")ready++;else if(g.status==="in_progress")inProgress++;else if(g.status==="done")done++;return{ready,inProgress,done}}catch{return{ready:0,inProgress:0,done:0}}}async function wishListCommand(){let wishesRoot=join83(process.cwd(),".genie","wishes");if(!existsSync69(wishesRoot))console.error(`\u274C Wishes directory not found: ${wishesRoot}`),process.exit(1);let entries=await readdir11(wishesRoot),rows=[];for(let entry2 of entries.sort()){if(entry2.startsWith("_")||entry2.startsWith("."))continue;if(!await isWishFile(join83(wishesRoot,entry2,"WISH.md")))continue;let{status,groupCount}=parseWishSummary(entry2),{ready,inProgress,done}=await loadStateCounts(entry2);rows.push({slug:entry2,status,groupCount,ready,inProgress,done})}if(rows.length===0){console.log("No wishes found under .genie/wishes/");return}let slugW=Math.max(4,...rows.map((r)=>r.slug.length)),statusW=Math.max(6,...rows.map((r)=>r.status.length)),pad=(s2,n)=>s2+" ".repeat(Math.max(0,n-s2.length));console.log(` ${pad("SLUG",slugW)} ${pad("STATUS",statusW)} GROUPS READY IN-PROG DONE`),console.log(` ${"\u2500".repeat(slugW+statusW+32)}`);for(let r of rows)console.log(` ${pad(r.slug,slugW)} ${pad(r.status,statusW)} ${pad(r.groupCount,6)} ${pad(String(r.ready),5)} ${pad(String(r.inProgress),7)} ${r.done}`);console.log(""),console.log(` Total: ${rows.length} wishes`)}function registerWishCommands(program2){let wish=program2.command("wish").description("Wish lifecycle management");wish.command("new <slug>").description("Scaffold a new WISH.md from templates/wish-template.md").option("--force","Overwrite an existing wish directory").action(async(slug,options)=>{await wishNewCommand(slug,options)}),wish.command("lint <slug>").description("Structural health check (stub \u2014 full implementation in Group 3)").option("--json","Emit machine-readable JSON output").option("--fix","Auto-repair deterministic violations").option("--dry-run","With --fix: print diff without writing").option("--allow-todo-placeholders","Pass <TODO> placeholders without emitting todo-placeholder-remaining").action(async(slug,options)=>{await wishLintCommand(slug,options)}),wish.command("parse <slug>").description("Parse WISH.md and emit the WishDocument as JSON").option("--json","One-line JSON output (default: pretty-printed)").action(async(slug,options)=>{await wishParseCommand(slug,options)}),wish.command("status <slug>").description("Show wish state overview for all groups").action(async(slug)=>{await statusCommand(slug)}),wish.command("done <ref>").description("Mark a wish group as done (format: <slug>#<group>)").action(async(ref)=>{await doneCommand(ref)}),wish.command("reset <ref>").option("-y, --yes","Skip confirmation prompt (required in non-interactive mode)").description("Reset wish state. <slug>#<group> resets one in-progress group; bare <slug> wipes the wish and recreates from current WISH.md").action(async(ref,options)=>{await resetAction(ref,options)}),wish.command("list").description("Enumerate all wishes with status, group counts, and progress").action(async()=>{await wishListCommand()})}var _T_BOOT=Date.now();try{let{execSync:execSyncStartup}=__require("child_process");if(execSyncStartup("git config core.bare",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()==="true")execSyncStartup("git config core.bare false",{stdio:["pipe","pipe","pipe"]})}catch{}function parseNumericFlag2(flagName){return(value)=>{let n=Number(value);if(Number.isNaN(n))throw Error(`${flagName} must be a number, got: ${value}`);return n}}if(process.env.GENIE_PROFILE_DB)console.error(`[profile] imports=${Date.now()-_T_BOOT}ms`);var program2=new Command;program2.name("genie").description("Genie CLI - AI-assisted development").version(VERSION);program2.option("--no-interactive","Disable interactive prompts (exit 2 instead of prompting)");program2.option("--no-tui","Skip TUI bootstrap (or set GENIE_TUI_DISABLE=1)");program2.configureHelp({sortSubcommands:!0,showGlobalOptions:!0});program2.configureOutput({outputError:(str5,write)=>{let cmd=program2.commands.find((c)=>process.argv.slice(2,6).includes(c.name())),prefix=cmd?`genie ${cmd.name()}`:"genie";write(`\x1B[31mError (${prefix}): ${str5}\x1B[0m
4637
4680
  `)}});async function startNamedSession(name){let{randomUUID:randomUUID14}=await import("crypto"),{buildTeamLeadCommand:buildTeamLeadCommand2}=await Promise.resolve().then(() => (init_team_lead_command(),exports_team_lead_command)),{getAgentsFilePath:getAgentsFilePath2}=await Promise.resolve().then(() => (init_session(),exports_session)),systemPromptFile=getAgentsFilePath2(),sessionId=randomUUID14(),cmd=buildTeamLeadCommand2(name,{systemPromptFile:systemPromptFile??void 0,sessionId});console.log(`Starting new session: ${name}`);let{spawnSync:spawnSync10}=await import("child_process"),result2=spawnSync10("sh",["-c",cmd],{stdio:"inherit"});if(result2.status)process.exit(result2.status)}program2.command("setup").description("Configure genie settings").option("--quick","Accept all defaults").option("--shortcuts","Only configure keyboard shortcuts").option("--codex","Only configure Codex integration").option("--terminal","Only configure terminal defaults").option("--session","Only configure session settings").option("--reset","Reset configuration to defaults").option("--show","Show current configuration").action(async(options)=>{await setupCommand(options)});program2.command("doctor").description("Run diagnostic checks on genie installation").option("--fix","Auto-fix: kill zombie postgres, clean shared memory, restart daemon").option("--observability","Report partition health + GENIE_WIDE_EMIT flag state").option("--perf","Report rolling per-handler P50/P99 from hook_perf_baseline + flag P99 regressions and recent fallback-log entries").option("--fix-team-orphans","Archive stale Claude-team config dirs missing config.json (paired with invincible-genie wish migration 050)").option("--dry-run","Pair with --fix-team-orphans to preview archive moves without mutating").option("--json","Emit JSON instead of human output (pairs with --observability)").action(doctorCommand);program2.command("update").description("Update Genie CLI to the latest version").option("--next","Switch to dev builds (npm @next tag)").option("--stable","Switch to stable releases (npm @latest tag)").option("--skip-maintenance","Skip post-update maintenance (or set GENIE_UPDATE_SKIP_MAINTENANCE=1)").action(updateCommand);program2.command("uninstall").description("Remove Genie CLI and clean up hooks").action(uninstallCommand);var shortcuts=program2.command("shortcuts").description("Manage tmux keyboard shortcuts");shortcuts.action(shortcutsShowCommand);shortcuts.command("show").description("Show available shortcuts and installation status").action(shortcutsShowCommand);shortcuts.command("install").description("Install shortcuts to config files (~/.tmux.conf, shell rc)").action(shortcutsInstallCommand);shortcuts.command("uninstall").description("Remove shortcuts from config files").action(shortcutsUninstallCommand);registerServeCommands(program2);registerAppCommand(program2);registerInitCommands(program2);registerTeamNamespace(program2);registerDirNamespace(program2);registerAgentCommands(program2);registerOmniNamespace(program2);registerSendInboxCommands(program2);registerStateCommands(program2);registerDispatchCommands(program2);registerDispatchGroupCommands(program2);registerWishCommands(program2);registerHookNamespace(program2);registerDbCommands(program2);registerScheduleCommands(program2);registerDaemonCommands(program2);registerTaskCommands(program2);registerTypeCommands(program2);registerBoardCommands(program2);registerTagCommands(program2);registerReleaseCommands(program2);registerSecCommands(program2);registerProjectCommands(program2);registerPruneCommands(program2);registerNotifyCommands(program2);registerEventsCommands(program2);registerSessionsCommands(program2);registerMetricsCommands(program2);registerExportCommands(program2);registerImportCommands(program2);registerTemplateCommands(program2);registerBrainCommands(program2);registerBriefCommands(program2);registerApprovalCommands(program2);program2.command("done [ref]").description("Close the current turn (inside an agent session) or mark a wish group done (team-lead, <slug>#<group>)").action(async(ref)=>{let{doneAction:doneAction2}=await Promise.resolve().then(() => (init_done(),exports_done));await doneAction2(ref)});program2.command("blocked").description("Close the current turn with outcome=blocked").requiredOption("--reason <message>","Why the turn is blocked").action(async(options)=>{let{blockedAction:blockedAction2}=await Promise.resolve().then(() => (init_blocked(),exports_blocked));await blockedAction2(options)});program2.command("failed").description("Close the current turn with outcome=failed").requiredOption("--reason <message>","Why the turn failed").action(async(options)=>{let{failedAction:failedAction2}=await Promise.resolve().then(() => (init_failed(),exports_failed));await failedAction2(options)});program2.command("pane-trap").description("Internal: write clean_exit_unverified outcome for a dying pane/shell. Invoked by the tmux pane-died hook and the inline shell EXIT trap.").option("--pane-id <id>","tmux pane id (%N) \u2014 resolved to executor via executors.tmux_pane_id").option("--executor-id <id>","explicit executor UUID (preferred when available)").option("--reason <reason>","trap source: pane_died or shell_exit","pane_died").action(async(options)=>{let{paneTrapAction:paneTrapAction2}=await Promise.resolve().then(() => (init_pane_trap2(),exports_pane_trap));await paneTrapAction2(options)});installWorkspaceCheck(program2);var auditTimers=new Map,auditSpans=new Map;program2.hook("preAction",(_thisCommand,actionCommand)=>{let name=actionCommand.name();auditTimers.set(name,Date.now()),Promise.resolve().then(() => (init_db(),exports_db)).then(({isConnected:isConnected2})=>{if(!isConnected2())return;recordAuditEvent("command",name,"command_start",getActor(),{args:actionCommand.args}).catch(()=>{})}).catch(()=>{}),(async()=>{try{let{isWideEmitEnabled:isWideEmitEnabled2}=await Promise.resolve().then(() => exports_observability_flag);if(!isWideEmitEnabled2())return;let{startSpan:startSpan2}=await Promise.resolve().then(() => (init_emit(),exports_emit)),{getAmbient:getAmbient2}=await Promise.resolve().then(() => (init_trace_context(),exports_trace_context)),handle=startSpan2("cli.command",{command:name,args:actionCommand.args??[],cwd:process.cwd()},{severity:"debug",source_subsystem:"cli",ctx:getAmbient2()??void 0,agent:getActor()});auditSpans.set(name,handle)}catch{}})()});program2.hook("postAction",async(_thisCommand,actionCommand)=>{let name=actionCommand.name(),startMs=auditTimers.get(name),durationMs=startMs?Date.now()-startMs:void 0;auditTimers.delete(name);try{let{isConnected:isConnected2}=await Promise.resolve().then(() => (init_db(),exports_db));if(!isConnected2())return;await recordAuditEvent("command",name,"command_success",getActor(),{args:actionCommand.args,duration_ms:durationMs})}catch{}let handle=auditSpans.get(name);auditSpans.delete(name);try{if(handle){let{isWideEmitEnabled:isWideEmitEnabled2}=await Promise.resolve().then(() => exports_observability_flag);if(isWideEmitEnabled2()){let{endSpan:endSpan2}=await Promise.resolve().then(() => (init_emit(),exports_emit));endSpan2(handle,{exit_code:0,duration_ms:durationMs??0},{severity:"debug",source_subsystem:"cli",agent:getActor()})}}}catch{}try{let{flushNow:flushNow2}=await Promise.resolve().then(() => (init_emit(),exports_emit));await flushNow2()}catch{}});program2.command("spawn <name>").description("Spawn a new agent by name (resolves from directory or built-ins)").option("--provider <provider>","Provider: claude or codex","claude").option("--team <team>","Team name").option("--model <model>","Model override (e.g., sonnet, opus)").option("--skill <skill>","Skill to load (optional)").option("--layout <layout>","Layout mode: mosaic (default) or vertical").option("--color <color>","Teammate pane border color").option("--plan-mode","Start teammate in plan mode").option("--permission-mode <mode>","Permission mode (e.g., acceptEdits)").option("--extra-args <args...>","Extra CLI args forwarded to provider").option("--cwd <path>","Working directory for the agent (overrides directory entry)").option("--session <session>","Tmux session name to spawn into").option("--role <role>","Override role name for registration (avoids duplicate guard)").option("--new-window","Create a new tmux window instead of splitting").option("--window <target>","Tmux window to split into (e.g., genie:3)").option("--no-auto-resume","Disable auto-resume on pane death").option("--no-auto-sync","Disable auto-registration from workspace agents directory").option("--stream","Stream SDK messages to stdout in real-time (claude-sdk provider)").option("--stream-format <format>","Streaming output format: text, json, ndjson (default: text)","text").option("--sdk-max-turns <n>","SDK: max conversation turns",parseNumericFlag2("--sdk-max-turns")).option("--sdk-max-budget <usd>","SDK: max budget in USD",parseNumericFlag2("--sdk-max-budget")).option("--sdk-stream","SDK: enable streaming output (shortcut for --stream)").option("--sdk-effort <level>","SDK: reasoning effort level (low, medium, high, max)").option("--sdk-resume <session-id>","SDK: resume a previous session by ID").option("--prompt <text>","Initial prompt to send as the first user message").addHelpText("after",`
4638
4681
  Examples:
4639
4682
  genie spawn engineer # Spawn built-in engineer role
4640
4683
  genie spawn researcher --model sonnet # Spawn with model override
4641
4684
  genie spawn my-agent --team my-feature # Spawn into a specific team
4642
- genie spawn council--questioner --provider codex # Use Codex provider`).action(async(name,options)=>{if(options.autoSync===!1)options.noAutoSync=!0;try{await handleWorkerSpawn(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("kill <name>").description("Force kill an agent by name").action(async(name)=>{try{await handleWorkerKill(name)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("stop <name>").description("Stop an agent (preserves session for resume)").action(async(name)=>{try{await handleWorkerStop(name)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("resume [name]").description("Resume a suspended/failed agent with its Claude session").option("--all","Resume all eligible agents").action(async(name,options)=>{try{await handleWorkerResume(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("history <name>").description("Show compressed session history for an agent").option("--full","Show full conversation without compression").option("--since <n>","Show last N user/assistant exchanges",Number.parseInt).option("--last <n>","Show last N transcript entries",Number.parseInt).option("--type <role>","Filter by role (user, assistant, tool_call)").option("--after <timestamp>","Only entries after ISO timestamp").option("--json","Output as JSON").option("--ndjson","Output as newline-delimited JSON (pipeable to jq)").option("--raw","Output raw JSONL entries").option("--log-file <path>","Direct path to log file (for testing)").action(async(name,options)=>{await historyCommand(name,options)});program2.command("log [agent]").description("Unified observability feed \u2014 aggregates transcript, DMs, team chat").option("--team <name>","Show interleaved feed for all agents in a team").option("--type <kind>","Filter by event kind (transcript, message, tool_call, state, system)").option("--since <timestamp>","Only events after ISO timestamp").option("--last <n>","Show last N events",Number.parseInt).option("--ndjson","Output as newline-delimited JSON (pipeable to jq)").option("--json","Output as pretty JSON").option("-f, --follow","Follow mode \u2014 real-time streaming").action(async(agent,options)=>{await logCommand(agent,options)});var qaCmd=program2.command("qa").description("QA \u2014 self-testing system for genie CLI");qaCmd.command("run [target]",{isDefault:!0}).description("Run QA specs (all, a domain, or a single spec)").option("--timeout <seconds>","Max seconds per spec",(v2)=>Number(v2),3600).option("--parallel <n>","Max specs to run in parallel",(v2)=>Number(v2),5).option("--verbose","Show all collected events").option("--ndjson","Machine-readable NDJSON output").action(async(target,options)=>{await qaCommand(target,options)});qaCmd.command("status").description("Show QA dashboard with last results per spec").option("--json","Output as JSON").action(async(options)=>{await qaStatusCommand(options)});qaCmd.command("history").description("Show recent QA runs").action(async()=>{await qaHistoryCommand()});qaCmd.command("check <specFile>").description("Evaluate a QA spec against current team logs and publish qa-report").option("--team <name>","Team name (defaults to GENIE_TEAM)").option("--since <timestamp>","Only consider events after this ISO timestamp").option("--since-file <path>","Read the lower-bound timestamp from a file").action(async(specFile,options)=>{await qaCheckCommand(specFile,options)});program2.command("qa-report <json>").description("Publish QA result to the PG event log (called by QA team-lead)").action(async(json2)=>{let team=process.env.GENIE_TEAM;if(!team)console.error("Error: GENIE_TEAM not set. This command must be run by a QA team-lead agent."),process.exit(1);try{let data=JSON.parse(json2),{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(process.cwd(),`genie.qa.${team}.result`,{kind:"qa",agent:"qa",team,text:`QA result: ${String(data.result??"unknown")}`,data,source:"hook"}),console.log(`QA result published to PG event log as genie.qa.${team}.result`)}catch(err){console.error(`Failed to publish QA result: ${err}`),process.exit(1)}});program2.command("read <name>").description("Read terminal output from an agent pane").option("-n, --lines <number>","Number of lines to read").option("--from <line>","Start line").option("--to <line>","End line").option("--range <range>",'Line range (e.g., "10-20")').option("--search <text>","Search for text").option("--grep <pattern>","Grep for pattern").option("-f, --follow","Follow mode (like tail -f)").option("--all","Show all output").option("-r, --reverse","Reverse order").option("--json","Output as JSON").action(async(name,options)=>{await readSessionLogs2(name,options)});program2.command("answer <name> <choice>").description('Answer a question for an agent (use "text:..." for text input)').action(async(name,choice)=>{await answerQuestion(name,choice)});program2.command("status").description("Aggregated observability \u2014 agents to resume, active alerts, optional health checklist").option("--health","Add the four-item health checklist (partition, watchdog, spill, watcher metrics)").option("--all","Include archived / done agents").option("--debug","Add structural-inference audit (former `doctor --state`)").option("--json","Emit JSON instead of human output").action(async(options)=>{try{await statusCommand2(options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("ls").description("List registered agents with runtime status").option("--json","Output as JSON").option("--source <name>","Filter by executor metadata source (e.g. omni)").option("--all","Include archived agents (hidden by default)").action(async(options)=>{try{await handleLsCommand(options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});var args=process.argv.slice(2),isTuiPane=process.env.GENIE_TUI_PANE==="left"&&args.length===0,tuiRightPane=process.env.GENIE_TUI_RIGHT;delete process.env.GENIE_TUI_PANE;delete process.env.GENIE_TUI_RIGHT;delete process.env.GENIE_IS_DAEMON;if(isTuiPane){let{isTuiDisabled:isTuiDisabled2,noticeTuiSkipped:noticeTuiSkipped2}=await Promise.resolve().then(() => (init_tui_disable(),exports_tui_disable));if(isTuiDisabled2())noticeTuiSkipped2("renderer"),await new Promise(()=>{}),process.exit(0);if(tuiRightPane)process.env.GENIE_TUI_RIGHT=tuiRightPane;let{launchTui:launchTui2}=await Promise.resolve().then(() => (init_tui(),exports_tui));await launchTui2(),process.exit(0)}if(args.length===0){{let{isTuiDisabled:isTuiDisabled2,noticeTuiSkipped:noticeTuiSkipped2}=await Promise.resolve().then(() => (init_tui_disable(),exports_tui_disable));if(isTuiDisabled2())noticeTuiSkipped2("attach"),console.error(" Use `genie ls`, `genie spawn <agent>`, `genie log`, etc. directly."),console.error(" Unset GENIE_TUI_DISABLE (or omit --no-tui) to re-enable the TUI."),process.exit(0)}if(process.env.TMUX?.includes("genie-tui")){let{findWorkspace:findWorkspace3}=await Promise.resolve().then(() => (init_workspace(),exports_workspace)),ws2=findWorkspace3();if(ws2){let{resolveAgentFromCwd:resolveAgentFromCwd3}=await Promise.resolve().then(() => (init_resolve_agent_cwd(),exports_resolve_agent_cwd)),resolved2=resolveAgentFromCwd3(process.cwd(),ws2.root);if(resolved2.source!=="default"){let{writeFileSync:writeFileSync31}=await import("fs"),{join:join90}=await import("path"),home=process.env.GENIE_HOME??join90((await import("os")).homedir(),".genie");try{writeFileSync31(join90(home,"tui-initial-agent"),resolved2.agent,"utf-8")}catch{}console.log(`Navigating to ${resolved2.agent}...`)}else console.log("Already inside the genie TUI. Use Ctrl-b d to detach, or run genie commands directly.")}else console.log("Already inside the genie TUI. Use Ctrl-b d to detach, or run genie commands directly.");process.exit(0)}if(process.env.TMUX)console.warn("Note: switching to genie TUI from within another tmux session.");let{findWorkspace:findWorkspace2}=await Promise.resolve().then(() => (init_workspace(),exports_workspace)),ws=findWorkspace2();if(!ws){let{isInteractive:isInteractive2}=await Promise.resolve().then(() => (init_interactivity(),exports_interactivity));if(!isInteractive2())console.error("No workspace found. Run `genie init` to set up."),process.exit(2);let{confirm:confirm2}=await Promise.resolve().then(() => (init_esm14(),exports_esm));if(!await confirm2({message:"No workspace found. Initialize? [Y/n]",default:!0}))console.error("No workspace found. Run `genie init` to set up."),process.exit(2);let{mkdirSync:mkdirSync31,writeFileSync:writeFileSync31}=await import("fs"),{basename:basename18,join:join90}=await import("path"),cwd=process.cwd(),genieDir=join90(cwd,".genie");mkdirSync31(genieDir,{recursive:!0});let config={name:basename18(cwd),agents:{defaults:{}},tmux:{socket:"genie"},sdk:{}};if(writeFileSync31(join90(genieDir,"workspace.json"),`${JSON.stringify(config,null,2)}
4685
+ genie spawn council--questioner --provider codex # Use Codex provider`).action(async(name,options)=>{if(options.autoSync===!1)options.noAutoSync=!0;try{await handleWorkerSpawn(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("kill <name>").description("Force kill an agent by name").action(async(name)=>{try{await handleWorkerKill(name)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("stop <name>").description("Stop an agent (preserves session for resume)").action(async(name)=>{try{await handleWorkerStop(name)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("resume [name]").description("Resume a suspended/failed agent with its Claude session").option("--all","Resume all eligible agents").action(async(name,options)=>{try{await handleWorkerResume(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("history <name>").description("Show compressed session history for an agent").option("--full","Show full conversation without compression").option("--since <n>","Show last N user/assistant exchanges",Number.parseInt).option("--last <n>","Show last N transcript entries",Number.parseInt).option("--type <role>","Filter by role (user, assistant, tool_call)").option("--after <timestamp>","Only entries after ISO timestamp").option("--json","Output as JSON").option("--ndjson","Output as newline-delimited JSON (pipeable to jq)").option("--raw","Output raw JSONL entries").option("--log-file <path>","Direct path to log file (for testing)").action(async(name,options)=>{await historyCommand(name,options)});program2.command("log [agent]").description("Unified observability feed \u2014 aggregates transcript, DMs, team chat").option("--team <name>","Show interleaved feed for all agents in a team").option("--type <kind>","Filter by event kind (transcript, message, tool_call, state, system)").option("--since <timestamp>","Only events after ISO timestamp").option("--last <n>","Show last N events",Number.parseInt).option("--ndjson","Output as newline-delimited JSON (pipeable to jq)").option("--json","Output as pretty JSON").option("-f, --follow","Follow mode \u2014 real-time streaming").action(async(agent,options)=>{await logCommand(agent,options)});var qaCmd=program2.command("qa").description("QA \u2014 self-testing system for genie CLI");qaCmd.command("run [target]",{isDefault:!0}).description("Run QA specs (all, a domain, or a single spec)").option("--timeout <seconds>","Max seconds per spec",(v2)=>Number(v2),3600).option("--parallel <n>","Max specs to run in parallel",(v2)=>Number(v2),5).option("--verbose","Show all collected events").option("--ndjson","Machine-readable NDJSON output").action(async(target,options)=>{await qaCommand(target,options)});qaCmd.command("status").description("Show QA dashboard with last results per spec").option("--json","Output as JSON").action(async(options)=>{await qaStatusCommand(options)});qaCmd.command("history").description("Show recent QA runs").action(async()=>{await qaHistoryCommand()});qaCmd.command("check <specFile>").description("Evaluate a QA spec against current team logs and publish qa-report").option("--team <name>","Team name (defaults to GENIE_TEAM)").option("--since <timestamp>","Only consider events after this ISO timestamp").option("--since-file <path>","Read the lower-bound timestamp from a file").action(async(specFile,options)=>{await qaCheckCommand(specFile,options)});program2.command("qa-report <json>").description("Publish QA result to the PG event log (called by QA team-lead)").action(async(json2)=>{let team=process.env.GENIE_TEAM;if(!team)console.error("Error: GENIE_TEAM not set. This command must be run by a QA team-lead agent."),process.exit(1);try{let data=JSON.parse(json2),{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(process.cwd(),`genie.qa.${team}.result`,{kind:"qa",agent:"qa",team,text:`QA result: ${String(data.result??"unknown")}`,data,source:"hook"}),console.log(`QA result published to PG event log as genie.qa.${team}.result`)}catch(err){console.error(`Failed to publish QA result: ${err}`),process.exit(1)}});program2.command("read <name>").description("Read terminal output from an agent pane").option("-n, --lines <number>","Number of lines to read").option("--from <line>","Start line").option("--to <line>","End line").option("--range <range>",'Line range (e.g., "10-20")').option("--search <text>","Search for text").option("--grep <pattern>","Grep for pattern").option("-f, --follow","Follow mode (like tail -f)").option("--all","Show all output").option("-r, --reverse","Reverse order").option("--json","Output as JSON").action(async(name,options)=>{await readSessionLogs2(name,options)});program2.command("answer <name> <choice>").description('Answer a question for an agent (use "text:..." for text input)').action(async(name,choice)=>{await answerQuestion(name,choice)});program2.command("status").description("Aggregated observability \u2014 agents to resume, active alerts, optional health checklist").option("--health","Add the four-item health checklist (partition, watchdog, spill, watcher metrics)").option("--all","Include archived / done agents").option("--debug","Add structural-inference audit (former `doctor --state`)").option("--json","Emit JSON instead of human output").action(async(options)=>{try{await statusCommand2(options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});program2.command("ls").description("List registered agents with runtime status").option("--json","Output as JSON").option("--source <name>","Filter by executor metadata source (e.g. omni)").option("--all","Include archived agents (hidden by default)").action(async(options)=>{try{await handleLsCommand(options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}});var args=process.argv.slice(2),isTuiPane=process.env.GENIE_TUI_PANE==="left"&&args.length===0,tuiRightPane=process.env.GENIE_TUI_RIGHT;delete process.env.GENIE_TUI_PANE;delete process.env.GENIE_TUI_RIGHT;delete process.env.GENIE_IS_DAEMON;if(isTuiPane){let{isTuiDisabled:isTuiDisabled2,noticeTuiSkipped:noticeTuiSkipped2}=await Promise.resolve().then(() => (init_tui_disable(),exports_tui_disable));if(isTuiDisabled2())noticeTuiSkipped2("renderer"),await new Promise(()=>{}),process.exit(0);if(tuiRightPane)process.env.GENIE_TUI_RIGHT=tuiRightPane;let{launchTui:launchTui2}=await Promise.resolve().then(() => (init_tui(),exports_tui));await launchTui2(),process.exit(0)}if(args.length===0){{let{isTuiDisabled:isTuiDisabled2,noticeTuiSkipped:noticeTuiSkipped2}=await Promise.resolve().then(() => (init_tui_disable(),exports_tui_disable));if(isTuiDisabled2())noticeTuiSkipped2("attach"),console.error(" Use `genie ls`, `genie spawn <agent>`, `genie log`, etc. directly."),console.error(" Unset GENIE_TUI_DISABLE (or omit --no-tui) to re-enable the TUI."),process.exit(0)}if(process.env.TMUX?.includes("genie-tui")){let{findWorkspace:findWorkspace3}=await Promise.resolve().then(() => (init_workspace(),exports_workspace)),ws2=findWorkspace3();if(ws2){let{resolveAgentFromCwd:resolveAgentFromCwd3}=await Promise.resolve().then(() => (init_resolve_agent_cwd(),exports_resolve_agent_cwd)),resolved2=resolveAgentFromCwd3(process.cwd(),ws2.root);if(resolved2.source!=="default"){let{writeFileSync:writeFileSync31}=await import("fs"),{join:join90}=await import("path"),home=process.env.GENIE_HOME??join90((await import("os")).homedir(),".genie");try{writeFileSync31(join90(home,"tui-initial-agent"),resolved2.agent,"utf-8")}catch{}console.log(`Navigating to ${resolved2.agent}...`)}else console.log("Already inside the genie TUI. Use Ctrl-b d to detach, or run genie commands directly.")}else console.log("Already inside the genie TUI. Use Ctrl-b d to detach, or run genie commands directly.");process.exit(0)}if(process.env.TMUX)console.warn("Note: switching to genie TUI from within another tmux session.");let{findWorkspace:findWorkspace2}=await Promise.resolve().then(() => (init_workspace(),exports_workspace)),ws=findWorkspace2();if(!ws){let{isInteractive:isInteractive2}=await Promise.resolve().then(() => (init_interactivity(),exports_interactivity));if(!isInteractive2())console.error("No workspace found. Run `genie init` to set up."),process.exit(2);let{confirm:confirm3}=await Promise.resolve().then(() => (init_esm14(),exports_esm));if(!await confirm3({message:"No workspace found. Initialize? [Y/n]",default:!0}))console.error("No workspace found. Run `genie init` to set up."),process.exit(2);let{mkdirSync:mkdirSync31,writeFileSync:writeFileSync31}=await import("fs"),{basename:basename18,join:join90}=await import("path"),cwd=process.cwd(),genieDir=join90(cwd,".genie");mkdirSync31(genieDir,{recursive:!0});let config={name:basename18(cwd),agents:{defaults:{}},tmux:{socket:"genie"},sdk:{}};if(writeFileSync31(join90(genieDir,"workspace.json"),`${JSON.stringify(config,null,2)}
4643
4686
  `),console.log(`Workspace initialized: ${cwd}`),ws=findWorkspace2(),!ws)console.error("Failed to initialize workspace."),process.exit(1)}let{resolveAgentFromCwd:resolveAgentFromCwd2}=await Promise.resolve().then(() => (init_resolve_agent_cwd(),exports_resolve_agent_cwd)),resolved=resolveAgentFromCwd2(process.cwd(),ws.root),initialAgent=resolved.agent,{isServeRunning:isServeRunning2,autoStartServe:autoStartServe2,isTuiSessionReady:isTuiSessionReady2,ensureTuiSession:ensureTuiSession2}=await Promise.resolve().then(() => (init_serve(),exports_serve));if(!isServeRunning2())console.log("Starting genie serve..."),await autoStartServe2();else if(!isTuiSessionReady2())ensureTuiSession2(ws.root);if(ws.root)process.env.GENIE_TUI_WORKSPACE=ws.root;if(initialAgent)process.env.GENIE_TUI_AGENT=initialAgent;if(resolved.source!=="default"){let{execSync:execSync20}=await import("child_process");try{execSync20(`tmux has-session -t =${initialAgent} 2>/dev/null`,{stdio:"pipe"})}catch{console.log(`Spawning ${initialAgent}...`);try{execSync20(`genie spawn ${initialAgent}`,{stdio:"inherit",timeout:15000})}catch{}}}if(initialAgent){let{writeFileSync:writeFileSync31}=await import("fs"),{join:join90}=await import("path"),home=process.env.GENIE_HOME??join90((await import("os")).homedir(),".genie");try{writeFileSync31(join90(home,"tui-initial-agent"),initialAgent,"utf-8")}catch{}}let{attachTuiSession:attachTuiSession2}=await Promise.resolve().then(() => (init_tmux2(),exports_tmux2));attachTuiSession2(),process.exit(0)}if(args.every((a)=>a==="--reset")){let{sessionCommand:sessionCommand2}=await Promise.resolve().then(() => (init_session(),exports_session));await sessionCommand2({reset:!0}),process.exit(0)}var sessionIdx=args.indexOf("--session");if(sessionIdx!==-1&&sessionIdx+1<args.length){let sessionName=args[sessionIdx+1];if(!args.filter((_2,i2)=>i2!==sessionIdx&&i2!==sessionIdx+1).some((a)=>!a.startsWith("-")))try{await startNamedSession(sessionName),process.exit(0)}catch(err){console.error(`Error: ${err instanceof Error?err.message:err}`),process.exit(1)}else try{await program2.parseAsync(process.argv)}finally{await stopOtelReceiver().catch(()=>{}),await shutdown().catch(()=>{})}}else try{let _cmdStart=Date.now();if(await program2.parseAsync(process.argv),process.env.GENIE_PROFILE_DB)console.error(`[profile] parseAsync=${Date.now()-_cmdStart}ms`)}finally{let _shutStart=Date.now();if(await stopOtelReceiver().catch(()=>{}),await shutdown().catch(()=>{}),process.env.GENIE_PROFILE_DB)console.error(`[profile] shutdown=${Date.now()-_shutStart}ms`)}