@automagik/genie 4.260421.7 → 4.260421.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 +126 -117
- package/package.json +1 -1
- package/plugins/genie/.claude-plugin/plugin.json +1 -1
- package/plugins/genie/package.json +1 -1
- package/skills/genie/SKILL.md +44 -1
package/dist/genie.js
CHANGED
|
@@ -486,13 +486,13 @@ ${bin} set-option -w pane-active-border-style "fg=$COLOR"
|
|
|
486
486
|
`),retentionRan=!0}catch(retErr){retentionRan=!0;let msg=retErr instanceof Error?retErr.message:String(retErr);process.stderr.write(`[genie] retention cleanup warning: ${msg}
|
|
487
487
|
`)}}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"],{detached:!0,stdio:"ignore",env:{...process.env}}).unref()})}async function autoStartDaemon(){let home=process.env.GENIE_HOME??GENIE_HOME,pidPath=join14(home,"serve.pid"),raw=null;try{raw=readFileSync7(pidPath,"utf-8").trim()}catch{raw=null}if(!raw){lastAutoStartOutcome="missing",lastAutoStartPid=null,spawnDaemon();return}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){try{unlinkSync3(pidPath)}catch{}lastAutoStartOutcome="stale",lastAutoStartPid=null,spawnDaemon();return}let pidAlive=!1;try{process.kill(pid,0),pidAlive=!0}catch{pidAlive=!1}if(pidAlive&&recordedStartTime!==null){let currentStartTime=getProcessStartTime(pid);if(currentStartTime!==null&¤tStartTime===recordedStartTime){lastAutoStartOutcome="alive",lastAutoStartPid=pid;return}}try{unlinkSync3(pidPath)}catch{}lastAutoStartOutcome="stale",lastAutoStartPid=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 _ensurePgserve(){if(activePort!==null)return activePort;let port=getPort(),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;if(process.env.CI==="true")throw process.env.GENIE_PG_AVAILABLE="false",Error("pgserve not available in CI");if(process.env.GENIE_IS_DAEMON==="1"){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)}`)}}await autoStartDaemon();let outcomeAtStart=lastAutoStartOutcome,pidAtStart=lastAutoStartPid,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))}process.env.GENIE_PG_AVAILABLE="false";let home=process.env.GENIE_HOME??GENIE_HOME,pidPath=join14(home,"serve.pid"),hasPidFile=existsSync12(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`)}function findPgserveBin(){try{let resolved=__require.resolve("pgserve/bin/pgserve-wrapper.cjs");if(existsSync12(resolved))return resolved}catch{}let globalBin=join14(homedir10(),".bun","bin","pgserve");if(existsSync12(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))}try{child.kill("SIGTERM")}catch{}throw Error(`pgserve failed to start on port ${port} (timeout after ${timeout/1000}s)`)}function registerExitHandler(){if(exitHandlerRegistered)return;exitHandlerRegistered=!0;let cleanup=()=>{if(pgserveChild){try{pgserveChild.kill("SIGTERM")}catch{}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;return sqlClient=null,activePort=null,dying.end({timeout:5}).catch(()=>{}),null}}async function runPostConnectSetup(client,testSchema,timings){let _t2=Date.now();if(!testSchema)await runMigrations(client);let _t3=Date.now();if(!testSchema&&needsSeed())await runSeed(client);let _t4=Date.now();if(!testSchema&&!retentionRan)await runRetention(client);let _t5=Date.now();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=${_t5-_t4}ms 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}}async function _buildConnection(){let _t0=Date.now(),port=await ensurePgserve(),_t1=Date.now(),pgModule=(await Promise.resolve().then(() => (init_src(),exports_src))).default,testSchema=process.env.GENIE_TEST_SCHEMA;sqlClient=pgModule({host:DEFAULT_HOST,port,database:DB_NAME,username:"postgres",password:"postgres",max:50,idle_timeout:1,connect_timeout:5,onnotice:()=>{},connection:{client_min_messages:"warning",...testSchema?{search_path:`${testSchema}, public`}:{}}});try{await runPostConnectSetup(sqlClient,testSchema,{t0:_t0,t1:_t1})}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 getLockfilePath(){return LOCKFILE_PATH}var DEFAULT_PORT=19642,DEFAULT_HOST="127.0.0.1",GENIE_HOME,DATA_DIR,LOCKFILE_PATH,DB_NAME="genie",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"],{detached:!0,stdio:"ignore",env:{...process.env}}).unref()};var init_db=__esm(()=>{init_db_migrations();init_pg_seed();init_process_identity();GENIE_HOME=process.env.GENIE_HOME??join14(homedir10(),".genie"),DATA_DIR=join14(GENIE_HOME,"data","pgserve"),LOCKFILE_PATH=join14(GENIE_HOME,"pgserve.port")});import{createHmac as createHmac2}from"crypto";import{homedir as homedir11}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=homedir11(),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_audit_export={};__export(exports_audit_export,{schema:()=>schema3,TYPE:()=>TYPE2,SCHEMA_VERSION:()=>SCHEMA_VERSION2,KIND:()=>KIND2,DEFAULT_TIER:()=>DEFAULT_TIER});var SCHEMA_VERSION2=1,TYPE2="audit.export",KIND2="event",DEFAULT_TIER="audit",ExporterActorSchema,SinceIdSchema,RowCountSchema,BreakCountSchema,BundleSignaturePrefixSchema,TenantIdSchema,ReasonSchema,schema3;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"),schema3=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:()=>schema4,TYPE:()=>TYPE3,SCHEMA_VERSION:()=>SCHEMA_VERSION3,KIND:()=>KIND3,DEFAULT_TIER:()=>DEFAULT_TIER2});var SCHEMA_VERSION3=1,TYPE3="audit.un_hash",KIND3="event",DEFAULT_TIER2="audit",AdminActorSchema,NamespaceSchema,HashedValueSchema,ResolvedMarkerSchema,ReasonSchema2,TicketRefSchema,schema4;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"),schema4=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:()=>schema5,TYPE:()=>TYPE4,SCHEMA_VERSION:()=>SCHEMA_VERSION4,KIND:()=>KIND4});var SCHEMA_VERSION4=1,TYPE4="cache.hit",KIND4="event",CacheSchema,HitSchema,KeyHintSchema,LatencyUsSchema,schema5;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"),schema5=exports_external.object({cache:CacheSchema,hit:HitSchema,key_hint:KeyHintSchema,latency_us:LatencyUsSchema}).strict()});var exports_cache_invalidate={};__export(exports_cache_invalidate,{schema:()=>schema6,TYPE:()=>TYPE5,SCHEMA_VERSION:()=>SCHEMA_VERSION5,KIND:()=>KIND5});var SCHEMA_VERSION5=1,TYPE5="cache.invalidate",KIND5="event",CacheSchema2,KeysInvalidatedSchema,ReasonSchema3,ScopeSchema,schema6;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"),schema6=exports_external.object({cache:CacheSchema2,keys_invalidated:KeysInvalidatedSchema,reason:ReasonSchema3,scope:ScopeSchema}).strict()});var exports_cli_command={};__export(exports_cli_command,{schema:()=>schema7,TYPE:()=>TYPE6,SCHEMA_VERSION:()=>SCHEMA_VERSION6,KIND:()=>KIND6});var SCHEMA_VERSION6=1,TYPE6="cli.command",KIND6="span",CommandSchema,ArgsSchema,CwdSchema2,ExitCodeSchema,DurationSchema2,UserAgentSchema,schema7;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"),schema7=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:()=>schema8,TYPE:()=>TYPE7,SCHEMA_VERSION:()=>SCHEMA_VERSION7,KIND:()=>KIND7});var SCHEMA_VERSION7=1,TYPE7="consumer.heartbeat",KIND7="event",ConsumerIdSchema,LastEventIdSchema,BacklogDepthSchema,RoleSchema,UptimeSecondsSchema,schema8;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"),schema8=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:()=>schema9,TYPE:()=>TYPE8,SCHEMA_VERSION:()=>SCHEMA_VERSION8,KIND:()=>KIND8,DEFAULT_TIER:()=>DEFAULT_TIER3});var SCHEMA_VERSION8=1,TYPE8="consumer.lagged",KIND8="event",DEFAULT_TIER3="audit",CountSchema,SpillPathSchema,SeveritySchema,schema9;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"),schema9=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:()=>schema10,TYPE:()=>TYPE9,SCHEMA_VERSION:()=>SCHEMA_VERSION9,KIND:()=>KIND9});var SCHEMA_VERSION9=1,TYPE9="correlation.orphan.rate",KIND9="event",RateSchema,CountSchema2,schema10;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"),schema10=exports_external.object({window_samples:CountSchema2,orphans:CountSchema2,rate:RateSchema}).strict()});var exports_detector_disabled={};__export(exports_detector_disabled,{schema:()=>schema11,TYPE:()=>TYPE10,SCHEMA_VERSION:()=>SCHEMA_VERSION10,KIND:()=>KIND10});var SCHEMA_VERSION10=1,TYPE10="detector.disabled",KIND10="event",DetectorIdSchema,CauseSchema,BudgetSchema,FireCountSchema,BucketEndTsSchema,schema11;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"),schema11=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:()=>schema12,TYPE:()=>TYPE11,SCHEMA_VERSION:()=>SCHEMA_VERSION11,KIND:()=>KIND11,DEFAULT_TIER:()=>DEFAULT_TIER4});var SCHEMA_VERSION11=1,TYPE11="emit.backpressure.critical",KIND11="event",DEFAULT_TIER4="audit",SecondsSchema,CountSchema3,schema12;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"),schema12=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:()=>schema13,TYPE:()=>TYPE12,SCHEMA_VERSION:()=>SCHEMA_VERSION12,KIND:()=>KIND12});var SCHEMA_VERSION12=1,TYPE12="emitter.latency_p99",KIND12="event",MillisSchema,SampleCountSchema,schema13;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"),schema13=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:()=>schema14,TYPE:()=>TYPE13,SCHEMA_VERSION:()=>SCHEMA_VERSION13,KIND:()=>KIND13});var SCHEMA_VERSION13=1,TYPE13="emitter.queue.depth",KIND13="event",DepthSchema,CapSchema,UtilizationSchema,schema14;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"),schema14=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:()=>schema15,TYPE:()=>TYPE14,SCHEMA_VERSION:()=>SCHEMA_VERSION14,KIND:()=>KIND14});var SCHEMA_VERSION14=1,TYPE14="emitter.rejected",KIND14="event",OffendingTypeSchema,ReasonSchema4,CountSchema4,schema15;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"),schema15=exports_external.object({offending_type:OffendingTypeSchema,reason:ReasonSchema4,count:CountSchema4}).strict()});var exports_emitter_shedding_load={};__export(exports_emitter_shedding_load,{schema:()=>schema16,TYPE:()=>TYPE15,SCHEMA_VERSION:()=>SCHEMA_VERSION15,KIND:()=>KIND15});var SCHEMA_VERSION15=1,TYPE15="emitter.shedding_load",KIND15="event",CountSchema5,schema16;var init_emitter_shedding_load=__esm(()=>{init_zod();CountSchema5=tagTier(exports_external.number().int().min(0).max(1e7),"C"),schema16=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:()=>schema17,TYPE:()=>TYPE16,SCHEMA_VERSION:()=>SCHEMA_VERSION16,KIND:()=>KIND16});var SCHEMA_VERSION16=1,TYPE16="error.raised",KIND16="event",ErrorClassSchema,MessageSchema,StackSchema,SubsystemSchema,SeveritySchema2,RetryableSchema,schema17;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(`
|
|
488
488
|
`).map((line)=>tokenizePath(redactFreeText(line))).join(`
|
|
489
|
-
`)),"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"),schema17=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:()=>schema18,TYPE:()=>TYPE17,SCHEMA_VERSION:()=>SCHEMA_VERSION17,KIND:()=>KIND17});var SCHEMA_VERSION17=1,TYPE17="executor.row.written",KIND17="event",TableSchema,RowIdSchema,OperationSchema,ExecutorSchema2,DiffSchema,schema18;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"),schema18=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:()=>schema19,TYPE:()=>TYPE18,SCHEMA_VERSION:()=>SCHEMA_VERSION18,KIND:()=>KIND18});var SCHEMA_VERSION18=1,TYPE18="executor.write",KIND18="span",ExecutorSchema3,TargetSchema,TableSchema2,OperationSchema2,RowsAffectedSchema,DurationSchema3,OutcomeSchema,ErrorHintSchema,schema19;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"),schema19=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:()=>schema20,TYPE:()=>TYPE19,SCHEMA_VERSION:()=>SCHEMA_VERSION19,KIND:()=>KIND19});var SCHEMA_VERSION19=1,TYPE19="hook.delivery",KIND19="span",HookNameSchema,AgentIdSchema2,ToolSchema,StatusSchema,DurationSchema4,ExitCodeSchema2,StderrExcerptSchema,schema20;var init_hook_delivery=__esm(()=>{init_zod();init_redactors();HookNameSchema=tagTier(exports_external.string().min(1).max(128),"C","hook 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"),schema20=exports_external.object({hook_name:HookNameSchema,agent_id:AgentIdSchema2,tool:ToolSchema,status:StatusSchema,duration_ms:DurationSchema4,exit_code:ExitCodeSchema2,stderr_excerpt:StderrExcerptSchema}).strict()});var exports_mailbox_delivery={};__export(exports_mailbox_delivery,{schema:()=>schema21,TYPE:()=>TYPE20,SCHEMA_VERSION:()=>SCHEMA_VERSION20,KIND:()=>KIND20});var SCHEMA_VERSION20=1,TYPE20="mailbox.delivery",KIND20="span",AgentIdSchema3=(ns)=>tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity(ns,v)),"A"),FromSchema,ToSchema,ChannelSchema,OutcomeSchema2,MessageIdSchema,BodyExcerptSchema,DurationSchema5,schema21;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"),schema21=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:()=>schema22,TYPE:()=>TYPE21,SCHEMA_VERSION:()=>SCHEMA_VERSION21,KIND:()=>KIND21});var SCHEMA_VERSION21=1,TYPE21="notify.delivery.lag",KIND21="event",NonceSchema,LagMillisSchema,ChannelSchema2,schema22;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"),schema22=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:()=>schema23,TYPE:()=>TYPE22,SCHEMA_VERSION:()=>SCHEMA_VERSION22,KIND:()=>KIND22});var SCHEMA_VERSION22=1,TYPE22="permissions.deny",KIND22="event",ActorSchema,AttemptedRoleSchema,ScopeSchema2,ReasonSchema5,SourceIpSchema,schema23;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"),schema23=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:()=>schema24,TYPE:()=>TYPE23,SCHEMA_VERSION:()=>SCHEMA_VERSION23,KIND:()=>KIND23});var SCHEMA_VERSION23=1,TYPE23="permissions.grant",KIND23="event",ActorSchema2,RoleSchema2,ScopeSchema3,ExpiresAtSchema,GrantedBySchema,schema24;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"),schema24=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:()=>schema25,TYPE:()=>TYPE24,SCHEMA_VERSION:()=>SCHEMA_VERSION24,KIND:()=>KIND24});var SCHEMA_VERSION24=1,TYPE24="resume.attempt",KIND24="span",AgentIdSchema4,AttemptNumberSchema,StrategySchema,SessionIdSchema2,SucceededSchema,FailureReasonSchema,DurationSchema6,schema25;var init_resume_attempt=__esm(()=>{init_zod();init_redactors();AgentIdSchema4=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A"),AttemptNumberSchema=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"),schema25=exports_external.object({agent_id:AgentIdSchema4,attempt_number:AttemptNumberSchema,strategy:StrategySchema,session_id:SessionIdSchema2,succeeded:SucceededSchema,failure_reason:FailureReasonSchema,duration_ms:DurationSchema6}).strict()});var exports_rot_detected={};__export(exports_rot_detected,{schema:()=>schema26,TYPE:()=>TYPE25,SCHEMA_VERSION:()=>SCHEMA_VERSION25,KIND:()=>KIND25});var SCHEMA_VERSION25=1,TYPE25="rot.detected",KIND25="event",PatternIdSchema,EntityIdSchema,ObservedValueSchema,ObservedStateSchema,schema26;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"),EntityIdSchema=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"),schema26=exports_external.object({pattern_id:PatternIdSchema,entity_id:EntityIdSchema,observed_state_json:ObservedStateSchema}).strict()});var exports_rot_executor_ghost_detected={};__export(exports_rot_executor_ghost_detected,{schema:()=>schema27,TYPE:()=>TYPE26,SCHEMA_VERSION:()=>SCHEMA_VERSION26,KIND:()=>KIND26});var SCHEMA_VERSION26=1,TYPE26="rot.executor-ghost.detected",KIND26="event",ResolutionSourceSchema,EnvIdSchema,ResolvedIdSchema,AgentNameSchema,RecoveredSchema,schema27;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"),schema27=exports_external.object({resolution_source:ResolutionSourceSchema,env_id:EnvIdSchema,resolved_id:ResolvedIdSchema,agent_name:AgentNameSchema,recovered:RecoveredSchema}).strict()});var exports_rot_team_ls_drift_detected={};__export(exports_rot_team_ls_drift_detected,{schema:()=>schema28,TYPE:()=>TYPE27,SCHEMA_VERSION:()=>SCHEMA_VERSION27,KIND:()=>KIND27});var SCHEMA_VERSION27=1,TYPE27="rot.team-ls-drift.detected",KIND27="event",DivergenceKindSchema,DivergentCountSchema,ObservedStateJsonSchema,schema28;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"),schema28=exports_external.object({divergence_kind:DivergenceKindSchema,divergent_count:DivergentCountSchema,observed_state_json:ObservedStateJsonSchema}).strict()});var exports_runbook_triggered={};__export(exports_runbook_triggered,{schema:()=>schema29,TYPE:()=>TYPE28,SCHEMA_VERSION:()=>SCHEMA_VERSION28,KIND:()=>KIND28});var SCHEMA_VERSION28=1,TYPE28="runbook.triggered",KIND28="event",RuleSchema,EvidenceCountSchema,CorrelationIdSchema,WindowMinutesSchema,RecommendedSqlSchema,EvidenceSummarySchema,schema29;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"),schema29=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:()=>schema30,TYPE:()=>TYPE29,SCHEMA_VERSION:()=>SCHEMA_VERSION29,KIND:()=>KIND29});var SCHEMA_VERSION29=1,TYPE29="schema.violation",KIND29="event",OffendingTypeSchema2,RejectedBytesSchema,IssueSchema,schema30;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"),schema30=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:()=>schema31,TYPE:()=>TYPE30,SCHEMA_VERSION:()=>SCHEMA_VERSION30,KIND:()=>KIND30});var SCHEMA_VERSION30=1,TYPE30="session.id.written",KIND30="event",AgentIdSchema5,SessionIdSchema3,ExecutorSchema4,OriginSchema,DiffSchema2,schema31;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"),schema31=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:()=>schema32,TYPE:()=>TYPE31,SCHEMA_VERSION:()=>SCHEMA_VERSION31,KIND:()=>KIND31});var SCHEMA_VERSION31=1,TYPE31="session.reconciled",KIND31="event",AgentIdSchema6,SessionIdSchema4,ReasonSchema6,DiffSchema3,schema32;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"),schema32=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:()=>schema33,TYPE:()=>TYPE32,SCHEMA_VERSION:()=>SCHEMA_VERSION32,KIND:()=>KIND32});var SCHEMA_VERSION32=1,TYPE32="state_transition",KIND32="event",EntityKindSchema,EntityIdSchema2,FromSchema2,ToSchema2,ReasonSchema7,ActorSchema3,DiffSchema4,schema33;var init_state_transition=__esm(()=>{init_zod();init_redactors();EntityKindSchema=tagTier(exports_external.enum(["task","wish","worker","team","team_lead","group","mailbox_message"]),"C"),EntityIdSchema2=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"),schema33=exports_external.object({entity_kind:EntityKindSchema,entity_id:EntityIdSchema2,from:FromSchema2,to:ToSchema2,reason:ReasonSchema7,actor:ActorSchema3,before:DiffSchema4,after:DiffSchema4}).strict()});var exports_stream_gap_detected={};__export(exports_stream_gap_detected,{schema:()=>schema34,TYPE:()=>TYPE33,SCHEMA_VERSION:()=>SCHEMA_VERSION33,KIND:()=>KIND33});var SCHEMA_VERSION33=1,TYPE33="stream.gap.detected",KIND33="event",ConsumerIdSchema2,IdSchema,CountSchema6,schema34;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"),schema34=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:()=>schema35,TYPE:()=>TYPE34,SCHEMA_VERSION:()=>SCHEMA_VERSION34,KIND:()=>KIND34,DEFAULT_TIER:()=>DEFAULT_TIER5});var SCHEMA_VERSION34=1,TYPE34="team.create",KIND34="event",DEFAULT_TIER5="audit",TeamNameSchema,WishSlugSchema,RepoPathHashSchema,ActorSchema4,MemberCountSchema,AutoSchema,schema35;var init_team_create=__esm(()=>{init_zod();init_redactors();TeamNameSchema=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"),schema35=exports_external.object({team_name:TeamNameSchema,wish_slug:WishSlugSchema,repo_path_hash:RepoPathHashSchema,actor:ActorSchema4,member_count:MemberCountSchema,auto:AutoSchema}).strict()});var exports_team_disband={};__export(exports_team_disband,{schema:()=>schema36,TYPE:()=>TYPE35,SCHEMA_VERSION:()=>SCHEMA_VERSION35,KIND:()=>KIND35,DEFAULT_TIER:()=>DEFAULT_TIER6});var SCHEMA_VERSION35=1,TYPE35="team.disband",KIND35="event",DEFAULT_TIER6="audit",TeamNameSchema2,ActorSchema5,RemainingMembersSchema,ReasonSchema8,schema36;var init_team_disband=__esm(()=>{init_zod();init_redactors();TeamNameSchema2=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"),schema36=exports_external.object({team_name:TeamNameSchema2,actor:ActorSchema5,remaining_members:RemainingMembersSchema,reason:ReasonSchema8}).strict()});var exports_tmux_pane_placed={};__export(exports_tmux_pane_placed,{schema:()=>schema37,TYPE:()=>TYPE36,SCHEMA_VERSION:()=>SCHEMA_VERSION36,KIND:()=>KIND36});var SCHEMA_VERSION36=1,TYPE36="tmux.pane.placed",KIND36="event",AgentIdSchema7,SessionSchema,WindowIndexSchema,PaneIndexSchema,PaneIdSchema,ActionSchema,schema37;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"),schema37=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:()=>schema38,TYPE:()=>TYPE37,SCHEMA_VERSION:()=>SCHEMA_VERSION37,KIND:()=>KIND37});var SCHEMA_VERSION37=1,TYPE37="wish.dispatch",KIND37="span",WishSlugSchema2,WaveSchema,GroupIdSchema,GroupNameSchema,ActorSchema6,OutcomeSchema3,DurationSchema7,DryRunSchema,schema38;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"),schema38=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_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_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={[TYPE6]:entry(exports_cli_command),[TYPE]:entry(exports_agent_lifecycle),[TYPE37]:entry(exports_wish_dispatch),[TYPE19]:entry(exports_hook_delivery),[TYPE24]:entry(exports_resume_attempt),[TYPE18]:entry(exports_executor_write),[TYPE20]:entry(exports_mailbox_delivery),[TYPE16]:entry(exports_error_raised),[TYPE32]:entry(exports_state_transition),[TYPE29]:entry(exports_schema_violation),[TYPE30]:entry(exports_session_id_written),[TYPE31]:entry(exports_session_reconciled),[TYPE36]:entry(exports_tmux_pane_placed),[TYPE17]:entry(exports_executor_row_written),[TYPE5]:entry(exports_cache_invalidate),[TYPE4]:entry(exports_cache_hit),[TYPE28]:entry(exports_runbook_triggered),[TYPE7]:entry(exports_consumer_heartbeat),[TYPE23]:entry(exports_permissions_grant),[TYPE22]:entry(exports_permissions_deny),[TYPE34]:entry(exports_team_create),[TYPE35]:entry(exports_team_disband),[TYPE3]:entry(exports_audit_un_hash),[TYPE2]:entry(exports_audit_export),[TYPE14]:entry(exports_emitter_rejected),[TYPE13]:entry(exports_emitter_queue_depth),[TYPE12]:entry(exports_emitter_latency_p99),[TYPE21]:entry(exports_notify_delivery_lag),[TYPE33]:entry(exports_stream_gap_detected),[TYPE9]:entry(exports_correlation_orphan_rate),[TYPE15]:entry(exports_emitter_shedding_load),[TYPE8]:entry(exports_consumer_lagged),[TYPE11]:entry(exports_emit_backpressure_critical),[TYPE10]:entry(exports_detector_disabled),[TYPE25]:entry(exports_rot_detected),[TYPE27]:entry(exports_rot_team_ls_drift_detected),[TYPE26]:entry(exports_rot_executor_ghost_detected)}});var exports_emit={};__export(exports_emit,{startSpan:()=>startSpan,shutdownEmitter:()=>shutdownEmitter,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 randomUUID4}from"crypto";import{appendFileSync,closeSync,existsSync as existsSync13,fsyncSync,mkdirSync as mkdirSync7,openSync,readFileSync as readFileSync8,renameSync as renameSync2,statSync,unlinkSync as unlinkSync4}from"fs";import{homedir as homedir12}from"os";import{dirname as dirname4,join as join15}from"path";function getEmitStats(){return{...stats,queue_depth:queue.length}}function defaultSpillPath(){let home=process.env.GENIE_HOME??join15(homedir12(),".genie");return join15(home,"data","emit-spill.jsonl")}function __setSpillPathForTests(path2){spillPathOverride=path2}function spillPath(){return spillPathOverride??defaultSpillPath()}function ensureSpillDir(path2){let dir=dirname4(path2);if(!existsSync13(dir))mkdirSync7(dir,{recursive:!0})}function writeSpillRow(row){let path2=spillPath();ensureSpillDir(path2);let line=`${JSON.stringify(row)}
|
|
489
|
+
`)),"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"),schema17=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:()=>schema18,TYPE:()=>TYPE17,SCHEMA_VERSION:()=>SCHEMA_VERSION17,KIND:()=>KIND17});var SCHEMA_VERSION17=1,TYPE17="executor.row.written",KIND17="event",TableSchema,RowIdSchema,OperationSchema,ExecutorSchema2,DiffSchema,schema18;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"),schema18=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:()=>schema19,TYPE:()=>TYPE18,SCHEMA_VERSION:()=>SCHEMA_VERSION18,KIND:()=>KIND18});var SCHEMA_VERSION18=1,TYPE18="executor.write",KIND18="span",ExecutorSchema3,TargetSchema,TableSchema2,OperationSchema2,RowsAffectedSchema,DurationSchema3,OutcomeSchema,ErrorHintSchema,schema19;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"),schema19=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:()=>schema20,TYPE:()=>TYPE19,SCHEMA_VERSION:()=>SCHEMA_VERSION19,KIND:()=>KIND19});var SCHEMA_VERSION19=1,TYPE19="hook.delivery",KIND19="span",HookNameSchema,AgentIdSchema2,ToolSchema,StatusSchema,DurationSchema4,ExitCodeSchema2,StderrExcerptSchema,schema20;var init_hook_delivery=__esm(()=>{init_zod();init_redactors();HookNameSchema=tagTier(exports_external.string().min(1).max(128),"C","hook 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"),schema20=exports_external.object({hook_name:HookNameSchema,agent_id:AgentIdSchema2,tool:ToolSchema,status:StatusSchema,duration_ms:DurationSchema4,exit_code:ExitCodeSchema2,stderr_excerpt:StderrExcerptSchema}).strict()});var exports_mailbox_delivery={};__export(exports_mailbox_delivery,{schema:()=>schema21,TYPE:()=>TYPE20,SCHEMA_VERSION:()=>SCHEMA_VERSION20,KIND:()=>KIND20});var SCHEMA_VERSION20=1,TYPE20="mailbox.delivery",KIND20="span",AgentIdSchema3=(ns)=>tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity(ns,v)),"A"),FromSchema,ToSchema,ChannelSchema,OutcomeSchema2,MessageIdSchema,BodyExcerptSchema,DurationSchema5,schema21;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"),schema21=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:()=>schema22,TYPE:()=>TYPE21,SCHEMA_VERSION:()=>SCHEMA_VERSION21,KIND:()=>KIND21});var SCHEMA_VERSION21=1,TYPE21="notify.delivery.lag",KIND21="event",NonceSchema,LagMillisSchema,ChannelSchema2,schema22;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"),schema22=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:()=>schema23,TYPE:()=>TYPE22,SCHEMA_VERSION:()=>SCHEMA_VERSION22,KIND:()=>KIND22});var SCHEMA_VERSION22=1,TYPE22="permissions.deny",KIND22="event",ActorSchema,AttemptedRoleSchema,ScopeSchema2,ReasonSchema5,SourceIpSchema,schema23;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"),schema23=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:()=>schema24,TYPE:()=>TYPE23,SCHEMA_VERSION:()=>SCHEMA_VERSION23,KIND:()=>KIND23});var SCHEMA_VERSION23=1,TYPE23="permissions.grant",KIND23="event",ActorSchema2,RoleSchema2,ScopeSchema3,ExpiresAtSchema,GrantedBySchema,schema24;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"),schema24=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:()=>schema25,TYPE:()=>TYPE24,SCHEMA_VERSION:()=>SCHEMA_VERSION24,KIND:()=>KIND24});var SCHEMA_VERSION24=1,TYPE24="resume.attempt",KIND24="span",AgentIdSchema4,AttemptNumberSchema,StrategySchema,SessionIdSchema2,SucceededSchema,FailureReasonSchema,DurationSchema6,schema25;var init_resume_attempt=__esm(()=>{init_zod();init_redactors();AgentIdSchema4=tagTier(exports_external.string().min(1).max(256).transform((v)=>hashEntity("agent",v)),"A"),AttemptNumberSchema=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"),schema25=exports_external.object({agent_id:AgentIdSchema4,attempt_number:AttemptNumberSchema,strategy:StrategySchema,session_id:SessionIdSchema2,succeeded:SucceededSchema,failure_reason:FailureReasonSchema,duration_ms:DurationSchema6}).strict()});var exports_rot_detected={};__export(exports_rot_detected,{schema:()=>schema26,TYPE:()=>TYPE25,SCHEMA_VERSION:()=>SCHEMA_VERSION25,KIND:()=>KIND25});var SCHEMA_VERSION25=1,TYPE25="rot.detected",KIND25="event",PatternIdSchema,EntityIdSchema,ObservedValueSchema,ObservedStateSchema,schema26;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"),EntityIdSchema=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"),schema26=exports_external.object({pattern_id:PatternIdSchema,entity_id:EntityIdSchema,observed_state_json:ObservedStateSchema}).strict()});var exports_rot_executor_ghost_detected={};__export(exports_rot_executor_ghost_detected,{schema:()=>schema27,TYPE:()=>TYPE26,SCHEMA_VERSION:()=>SCHEMA_VERSION26,KIND:()=>KIND26});var SCHEMA_VERSION26=1,TYPE26="rot.executor-ghost.detected",KIND26="event",ResolutionSourceSchema,EnvIdSchema,ResolvedIdSchema,AgentNameSchema,RecoveredSchema,schema27;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"),schema27=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:()=>schema28,TYPE:()=>TYPE27,SCHEMA_VERSION:()=>SCHEMA_VERSION27,KIND:()=>KIND27});var SCHEMA_VERSION27=1,TYPE27="rot.inbox-watcher-spawn-loop.detected",KIND27="event",TeamNameSchema,SessionKeySchema,FailureCountSchema,LastErrorMessageSchema,schema28;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"),schema28=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:()=>schema29,TYPE:()=>TYPE28,SCHEMA_VERSION:()=>SCHEMA_VERSION28,KIND:()=>KIND28});var SCHEMA_VERSION28=1,TYPE28="rot.team-ls-drift.detected",KIND28="event",DivergenceKindSchema,DivergentCountSchema,ObservedStateJsonSchema,schema29;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"),schema29=exports_external.object({divergence_kind:DivergenceKindSchema,divergent_count:DivergentCountSchema,observed_state_json:ObservedStateJsonSchema}).strict()});var exports_runbook_triggered={};__export(exports_runbook_triggered,{schema:()=>schema30,TYPE:()=>TYPE29,SCHEMA_VERSION:()=>SCHEMA_VERSION29,KIND:()=>KIND29});var SCHEMA_VERSION29=1,TYPE29="runbook.triggered",KIND29="event",RuleSchema,EvidenceCountSchema,CorrelationIdSchema,WindowMinutesSchema,RecommendedSqlSchema,EvidenceSummarySchema,schema30;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"),schema30=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:()=>schema31,TYPE:()=>TYPE30,SCHEMA_VERSION:()=>SCHEMA_VERSION30,KIND:()=>KIND30});var SCHEMA_VERSION30=1,TYPE30="schema.violation",KIND30="event",OffendingTypeSchema2,RejectedBytesSchema,IssueSchema,schema31;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"),schema31=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:()=>schema32,TYPE:()=>TYPE31,SCHEMA_VERSION:()=>SCHEMA_VERSION31,KIND:()=>KIND31});var SCHEMA_VERSION31=1,TYPE31="session.id.written",KIND31="event",AgentIdSchema5,SessionIdSchema3,ExecutorSchema4,OriginSchema,DiffSchema2,schema32;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"),schema32=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:()=>schema33,TYPE:()=>TYPE32,SCHEMA_VERSION:()=>SCHEMA_VERSION32,KIND:()=>KIND32});var SCHEMA_VERSION32=1,TYPE32="session.reconciled",KIND32="event",AgentIdSchema6,SessionIdSchema4,ReasonSchema6,DiffSchema3,schema33;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"),schema33=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:()=>schema34,TYPE:()=>TYPE33,SCHEMA_VERSION:()=>SCHEMA_VERSION33,KIND:()=>KIND33});var SCHEMA_VERSION33=1,TYPE33="state_transition",KIND33="event",EntityKindSchema,EntityIdSchema2,FromSchema2,ToSchema2,ReasonSchema7,ActorSchema3,DiffSchema4,schema34;var init_state_transition=__esm(()=>{init_zod();init_redactors();EntityKindSchema=tagTier(exports_external.enum(["task","wish","worker","team","team_lead","group","mailbox_message"]),"C"),EntityIdSchema2=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"),schema34=exports_external.object({entity_kind:EntityKindSchema,entity_id:EntityIdSchema2,from:FromSchema2,to:ToSchema2,reason:ReasonSchema7,actor:ActorSchema3,before:DiffSchema4,after:DiffSchema4}).strict()});var exports_stream_gap_detected={};__export(exports_stream_gap_detected,{schema:()=>schema35,TYPE:()=>TYPE34,SCHEMA_VERSION:()=>SCHEMA_VERSION34,KIND:()=>KIND34});var SCHEMA_VERSION34=1,TYPE34="stream.gap.detected",KIND34="event",ConsumerIdSchema2,IdSchema,CountSchema6,schema35;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"),schema35=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:()=>schema36,TYPE:()=>TYPE35,SCHEMA_VERSION:()=>SCHEMA_VERSION35,KIND:()=>KIND35,DEFAULT_TIER:()=>DEFAULT_TIER5});var SCHEMA_VERSION35=1,TYPE35="team.create",KIND35="event",DEFAULT_TIER5="audit",TeamNameSchema2,WishSlugSchema,RepoPathHashSchema,ActorSchema4,MemberCountSchema,AutoSchema,schema36;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"),schema36=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:()=>schema37,TYPE:()=>TYPE36,SCHEMA_VERSION:()=>SCHEMA_VERSION36,KIND:()=>KIND36,DEFAULT_TIER:()=>DEFAULT_TIER6});var SCHEMA_VERSION36=1,TYPE36="team.disband",KIND36="event",DEFAULT_TIER6="audit",TeamNameSchema3,ActorSchema5,RemainingMembersSchema,ReasonSchema8,schema37;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"),schema37=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:()=>schema38,TYPE:()=>TYPE37,SCHEMA_VERSION:()=>SCHEMA_VERSION37,KIND:()=>KIND37});var SCHEMA_VERSION37=1,TYPE37="tmux.pane.placed",KIND37="event",AgentIdSchema7,SessionSchema,WindowIndexSchema,PaneIndexSchema,PaneIdSchema,ActionSchema,schema38;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"),schema38=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:()=>schema39,TYPE:()=>TYPE38,SCHEMA_VERSION:()=>SCHEMA_VERSION38,KIND:()=>KIND38});var SCHEMA_VERSION38=1,TYPE38="wish.dispatch",KIND38="span",WishSlugSchema2,WaveSchema,GroupIdSchema,GroupNameSchema,ActorSchema6,OutcomeSchema3,DurationSchema7,DryRunSchema,schema39;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"),schema39=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_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={[TYPE6]:entry(exports_cli_command),[TYPE]:entry(exports_agent_lifecycle),[TYPE38]:entry(exports_wish_dispatch),[TYPE19]:entry(exports_hook_delivery),[TYPE24]:entry(exports_resume_attempt),[TYPE18]:entry(exports_executor_write),[TYPE20]:entry(exports_mailbox_delivery),[TYPE16]:entry(exports_error_raised),[TYPE33]:entry(exports_state_transition),[TYPE30]:entry(exports_schema_violation),[TYPE31]:entry(exports_session_id_written),[TYPE32]:entry(exports_session_reconciled),[TYPE37]:entry(exports_tmux_pane_placed),[TYPE17]:entry(exports_executor_row_written),[TYPE5]:entry(exports_cache_invalidate),[TYPE4]:entry(exports_cache_hit),[TYPE29]:entry(exports_runbook_triggered),[TYPE7]:entry(exports_consumer_heartbeat),[TYPE23]:entry(exports_permissions_grant),[TYPE22]:entry(exports_permissions_deny),[TYPE35]:entry(exports_team_create),[TYPE36]:entry(exports_team_disband),[TYPE3]:entry(exports_audit_un_hash),[TYPE2]:entry(exports_audit_export),[TYPE14]:entry(exports_emitter_rejected),[TYPE13]:entry(exports_emitter_queue_depth),[TYPE12]:entry(exports_emitter_latency_p99),[TYPE21]:entry(exports_notify_delivery_lag),[TYPE34]:entry(exports_stream_gap_detected),[TYPE9]:entry(exports_correlation_orphan_rate),[TYPE15]:entry(exports_emitter_shedding_load),[TYPE8]:entry(exports_consumer_lagged),[TYPE11]:entry(exports_emit_backpressure_critical),[TYPE10]:entry(exports_detector_disabled),[TYPE25]:entry(exports_rot_detected),[TYPE28]:entry(exports_rot_team_ls_drift_detected),[TYPE26]:entry(exports_rot_executor_ghost_detected),[TYPE27]:entry(exports_rot_inbox_watcher_spawn_loop_detected)}});var exports_emit={};__export(exports_emit,{startSpan:()=>startSpan,shutdownEmitter:()=>shutdownEmitter,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 randomUUID4}from"crypto";import{appendFileSync,closeSync,existsSync as existsSync13,fsyncSync,mkdirSync as mkdirSync7,openSync,readFileSync as readFileSync8,renameSync as renameSync2,statSync,unlinkSync as unlinkSync4}from"fs";import{homedir as homedir12}from"os";import{dirname as dirname4,join as join15}from"path";function getEmitStats(){return{...stats,queue_depth:queue.length}}function defaultSpillPath(){let home=process.env.GENIE_HOME??join15(homedir12(),".genie");return join15(home,"data","emit-spill.jsonl")}function __setSpillPathForTests(path2){spillPathOverride=path2}function spillPath(){return spillPathOverride??defaultSpillPath()}function ensureSpillDir(path2){let dir=dirname4(path2);if(!existsSync13(dir))mkdirSync7(dir,{recursive:!0})}function writeSpillRow(row){let path2=spillPath();ensureSpillDir(path2);let line=`${JSON.stringify(row)}
|
|
490
490
|
`,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(!existsSync13(path2))return 0;try{let contents=readFileSync8(path2,"utf8");if(!contents)return 0;return contents.split(`
|
|
491
491
|
`).filter((l)=>l.length>0).length}catch{return 0}}function isSpillJournalEmpty(){return countSpillRows()===0}function readStagingRows(staging){let contents;try{contents=readFileSync8(staging,"utf8")}catch{return[]}let lines=contents.split(`
|
|
492
492
|
`).filter((l)=>l.length>0),rows=[];for(let line of lines)try{rows.push(JSON.parse(line))}catch{}return rows}function reappendRowsToJournal(path2,rows){let fd=openSync(path2,"a");try{for(let row of rows)appendFileSync(fd,`${JSON.stringify(row)}
|
|
493
493
|
`);try{fsyncSync(fd)}catch{}}finally{closeSync(fd)}}function stageSpillJournal(path2){let size=0;try{size=statSync(path2).size}catch{return null}if(size===0)return null;let staging=`${path2}.draining-${process.pid}`;try{renameSync2(path2,staging)}catch{return null}return staging}async function drainSpillJournal(){let path2=spillPath();if(!existsSync13(path2))return 0;let staging=stageSpillJournal(path2);if(!staging)return 0;let rows=readStagingRows(staging);if(rows.length===0){try{unlinkSync4(staging)}catch{}return 0}try{await writeBatch(rows),stats.flushed+=rows.length}catch(err){return reappendRowsToJournal(path2,rows),process.stderr.write(`[emit] spill drain retry pending: ${err instanceof Error?err.message:String(err)}
|
|
494
494
|
`),0}try{unlinkSync4(staging)}catch{}return firstSpillAt=null,stats.backpressure_active=!1,rows.length}function startSpan(type2,attrs={},opts={}){let entry2=getEntry(type2),kind=entry2?.kind??"span";if(entry2&&kind!=="span")emitSchemaViolation(type2,`startSpan called on '${kind}' type`);let ctx=opts.ctx??{},span_id=newId();return{type:type2,trace_id:ctx.trace_id??newTraceId2(),span_id,parent_span_id:ctx.span_id??ctx.parent_span_id,started_at:Date.now(),start_attrs:attrs,severity:opts.severity??"info",source_subsystem:opts.source_subsystem}}function endSpan(handle,attrs={},opts={}){let duration_ms=Date.now()-handle.started_at,merged={...handle.start_attrs,...attrs,duration_ms};enqueueTyped(handle.type,merged,{severity:opts.severity??handle.severity,source_subsystem:opts.source_subsystem??handle.source_subsystem,ctx:{trace_id:handle.trace_id,span_id:handle.span_id,parent_span_id:handle.parent_span_id},repo_path:opts.repo_path,agent:opts.agent,team:opts.team,entity_id:opts.entity_id},duration_ms)}function emitEvent(type2,payload,opts={}){let entry2=getEntry(type2);if(entry2&&entry2.kind==="span"){emitSchemaViolation(type2,"emitEvent called on 'span' type \u2014 use start/endSpan");return}enqueueTyped(type2,payload,opts,null)}function parsePayload(entry2,type2,payload){if(!entry2)return null;try{let result2=entry2.schema.safeParse(payload);if(!result2.success)return stats.schema_violations++,emitSchemaViolation(type2,"zod parse failure",result2.error.issues),null;return result2.data}catch(err){return stats.schema_violations++,emitSchemaViolation(type2,`zod throw: ${err instanceof Error?err.message:String(err)}`),null}}function classifyAdmission(severity){if(queue.length<QUEUE_CAP)return{action:"admit"};if(severity==="debug")return stats.dropped_debug++,{action:"drop",reason:"debug"};if(severity==="info")return{action:"drop",reason:"info"};return{action:"spill"}}function buildRow(type2,entry2,payload,severity,duration_ms,opts){let ctx=opts.ctx??{};return{type:type2,kind:entry2.kind,schema_version:entry2.schema_version,tier_defaults:entry2.tier_defaults,trace_id:ctx.trace_id??newTraceId2(),span_id:ctx.span_id??newId(),parent_span_id:ctx.parent_span_id??null,severity,source_subsystem:opts.source_subsystem??null,dedup_key:computeDedupKey(type2,opts.entity_id??"",payload),duration_ms,repo_path:opts.repo_path??process.env.GENIE_REPO_PATH??process.cwd(),agent:opts.agent??process.env.GENIE_AGENT_NAME??"system",team:opts.team??process.env.GENIE_TEAM??null,detector_version:opts.detector_version??null,payload,created_at:new Date().toISOString()}}function preparePayload(type2,payload){let entry2=getEntry(type2);if(!entry2)return null;let parsed=parsePayload(entry2,type2,payload);if(!parsed)return null;let capped=capPayload(parsed);if(capped.overflow)stats.dropped_overflow++;return{entry:entry2,effectivePayload:capped.body}}function handleInfoBackpressure(row,t0){if(stats.dropped_info++,Date.now()-t0<BACKPRESSURE_WAIT_MS&&queue.length<QUEUE_CAP)admitToQueue(row)}function handleSpillPath(row,severity){if(queue.length<QUEUE_CAP){admitToQueue(row);return}try{writeSpillRow(row),stats.backpressure_active=!0,raiseLaggedIfNeeded(severity,row),maybeRaiseBackpressureCritical()}catch(err){process.stderr.write(`[emit] spill write failed (event lost): ${err instanceof Error?err.message:String(err)}
|
|
495
|
-
`),stats.dropped_overflow++}}function dispatchDecision(row,severity,decision,t0){if(decision.action==="admit"){admitToQueue(row);return}if(decision.action==="drop"){if(decision.reason==="info")handleInfoBackpressure(row,t0);return}handleSpillPath(row,severity)}function enqueueTyped(type2,payload,opts,duration_ms){let t0=Date.now();if(shuttingDown){stats.dropped_overflow++;return}if(!isRegistered(type2)){emitSchemaViolation(type2,"unregistered event type"),recordLatency(Date.now()-t0);return}let prepared=preparePayload(type2,payload);if(!prepared){recordLatency(Date.now()-t0);return}let severity=opts.severity??"info",row=buildRow(type2,prepared.entry,prepared.effectivePayload,severity,duration_ms,opts);dispatchDecision(row,severity,classifyAdmission(severity),t0),recordLatency(Date.now()-t0)}function admitToQueue(row){if(queue.push(row),stats.enqueued++,stats.queue_depth=queue.length,trackCorrelationSample(row),ensureFlusher(),ensureWatchers(),queue.length>=BATCH_SIZE)triggerFlush()}function recordLatency(ms){if(latencySamples[latencyIdx]=ms,latencyIdx=(latencyIdx+1)%LATENCY_WINDOW,latencyFilled<LATENCY_WINDOW)latencyFilled++;if(latencyFilled===LATENCY_WINDOW&&latencyIdx===0){let p=computePercentiles();enqueueMetaEvent("emitter.latency_p99",{window_samples:latencyFilled,p50_ms:p.p50,p95_ms:p.p95,p99_ms:p.p99,max_ms:p.max})}}function computePercentiles(){let copy=latencySamples.slice(0,latencyFilled).slice().sort((a,b2)=>a-b2),pick=(pct)=>copy.length===0?0:copy[Math.min(copy.length-1,Math.floor(copy.length*pct))];return{p50:pick(0.5),p95:pick(0.95),p99:pick(0.99),max:copy.length===0?0:copy[copy.length-1]}}function trackCorrelationSample(row){if(knownSpanIds.size>=KNOWN_SPAN_CAP){let firstKey=knownSpanIds.values().next().value;if(firstKey)knownSpanIds.delete(firstKey)}knownSpanIds.add(row.span_id);let matched=row.parent_span_id?knownSpanIds.has(row.parent_span_id):!0;if(corrWindow.push({parent_span_id:row.parent_span_id,matched}),corrWindow.length>LATENCY_WINDOW)corrWindow.shift()}function emitSchemaViolation(offendingType,reason,issues){if(offendingType===
|
|
495
|
+
`),stats.dropped_overflow++}}function dispatchDecision(row,severity,decision,t0){if(decision.action==="admit"){admitToQueue(row);return}if(decision.action==="drop"){if(decision.reason==="info")handleInfoBackpressure(row,t0);return}handleSpillPath(row,severity)}function enqueueTyped(type2,payload,opts,duration_ms){let t0=Date.now();if(shuttingDown){stats.dropped_overflow++;return}if(!isRegistered(type2)){emitSchemaViolation(type2,"unregistered event type"),recordLatency(Date.now()-t0);return}let prepared=preparePayload(type2,payload);if(!prepared){recordLatency(Date.now()-t0);return}let severity=opts.severity??"info",row=buildRow(type2,prepared.entry,prepared.effectivePayload,severity,duration_ms,opts);dispatchDecision(row,severity,classifyAdmission(severity),t0),recordLatency(Date.now()-t0)}function admitToQueue(row){if(queue.push(row),stats.enqueued++,stats.queue_depth=queue.length,trackCorrelationSample(row),ensureFlusher(),ensureWatchers(),queue.length>=BATCH_SIZE)triggerFlush()}function recordLatency(ms){if(latencySamples[latencyIdx]=ms,latencyIdx=(latencyIdx+1)%LATENCY_WINDOW,latencyFilled<LATENCY_WINDOW)latencyFilled++;if(latencyFilled===LATENCY_WINDOW&&latencyIdx===0){let p=computePercentiles();enqueueMetaEvent("emitter.latency_p99",{window_samples:latencyFilled,p50_ms:p.p50,p95_ms:p.p95,p99_ms:p.p99,max_ms:p.max})}}function computePercentiles(){let copy=latencySamples.slice(0,latencyFilled).slice().sort((a,b2)=>a-b2),pick=(pct)=>copy.length===0?0:copy[Math.min(copy.length-1,Math.floor(copy.length*pct))];return{p50:pick(0.5),p95:pick(0.95),p99:pick(0.99),max:copy.length===0?0:copy[copy.length-1]}}function trackCorrelationSample(row){if(knownSpanIds.size>=KNOWN_SPAN_CAP){let firstKey=knownSpanIds.values().next().value;if(firstKey)knownSpanIds.delete(firstKey)}knownSpanIds.add(row.span_id);let matched=row.parent_span_id?knownSpanIds.has(row.parent_span_id):!0;if(corrWindow.push({parent_span_id:row.parent_span_id,matched}),corrWindow.length>LATENCY_WINDOW)corrWindow.shift()}function emitSchemaViolation(offendingType,reason,issues){if(offendingType===TYPE30)return;let issueArray=Array.isArray(issues)?issues.slice(0,32).map((i2)=>({path:i2.path.join(".")||"<root>",code:String(i2.code??"unknown"),message:String(i2.message??reason).slice(0,512)})):[{path:"<root>",code:"emit_rejected",message:reason.slice(0,512)}];enqueueTyped(TYPE30,{offending_type:offendingType.slice(0,128),issues:issueArray,rejected_bytes:0},{severity:"warn",source_subsystem:"emit.ts"},null),enqueueMetaEvent("emitter.rejected",{offending_type:offendingType.slice(0,128),reason:"schema_parse",count:1})}function enqueueMetaEvent(type2,payload){if(!isRegistered(type2))return;let entry2=getEntry(type2);if(!entry2)return;let parsed=entry2.schema.safeParse(payload);if(!parsed.success)return;if(queue.length>=QUEUE_CAP)return;let row=buildRow(type2,entry2,parsed.data,"info",null,{source_subsystem:"emit.ts"});queue.push(row),stats.enqueued++,stats.queue_depth=queue.length}function raiseLaggedIfNeeded(severity,_row){if(severity!=="warn"&&severity!=="error"&&severity!=="fatal")return;enqueueMetaEvent("consumer.lagged",{severity_class:severity,spill_path:spillPath(),rows_spilled:1,queue_depth:queue.length,queue_cap:QUEUE_CAP})}function maybeRaiseBackpressureCritical(){if(firstSpillAt===null)return;let duration=Date.now()-firstSpillAt;if(duration<BACKPRESSURE_CRITICAL_MS)return;if(Date.now()-lastCriticalAt<60000)return;lastCriticalAt=Date.now(),enqueueMetaEvent("emit.backpressure.critical",{spill_duration_seconds:Math.round(duration/1000),spill_rows_total:stats.spilled_warn_plus,queue_depth:queue.length,queue_cap:QUEUE_CAP,recommended_action:"inspect_pg"})}function computeDedupKey(type2,entityId,payload){let minuteBucket=Math.floor(Date.now()/60000),digest="";try{digest=createHash2("sha256").update(JSON.stringify(payload)).digest("hex").slice(0,16)}catch{digest="nohash"}return createHash2("sha256").update(`${type2}|${entityId}|${digest}|${minuteBucket}`).digest("hex").slice(0,32)}function newTraceId2(){return randomUUID4().replace(/-/g,"")}function newId(){return randomUUID4().replace(/-/g,"").slice(0,16)}function ensureFlusher(){if(flushTimer)return;if(flushTimer=setInterval(()=>{triggerFlush()},FLUSH_INTERVAL_MS),typeof flushTimer.unref==="function")flushTimer.unref()}function ensureWatchers(){if(watchersStartedAt!==0)return;if(watchersStartedAt=Date.now(),queueDepthTimer=setInterval(()=>{stats.spill_rows_pending=countSpillRows(),enqueueMetaEvent("emitter.queue.depth",{depth:queue.length,cap:QUEUE_CAP,utilization:queue.length/QUEUE_CAP,enqueued_total:stats.enqueued,flushed_total:stats.flushed})},QUEUE_DEPTH_TICK_MS),typeof queueDepthTimer.unref==="function")queueDepthTimer.unref();if(sheddingTimer=setInterval(()=>{if(stats.dropped_debug===0&&stats.dropped_info===0&&stats.spilled_warn_plus===0)return;enqueueMetaEvent("emitter.shedding_load",{dropped_debug:stats.dropped_debug,dropped_info:stats.dropped_info,spilled_warn_plus:stats.spilled_warn_plus,window_seconds:Math.round(SHEDDING_SUMMARY_MS/1000)})},SHEDDING_SUMMARY_MS),typeof sheddingTimer.unref==="function")sheddingTimer.unref();if(correlationTimer=setInterval(()=>{if(corrWindow.length<100)return;let orphans=corrWindow.reduce((acc,e)=>acc+(e.parent_span_id&&!e.matched?1:0),0),rate=orphans/corrWindow.length;enqueueMetaEvent("correlation.orphan.rate",{window_samples:corrWindow.length,orphans,rate})},QUEUE_DEPTH_TICK_MS),typeof correlationTimer.unref==="function")correlationTimer.unref()}function triggerFlush(){if(flushInFlight)return flushInFlight;if(queue.length===0)return Promise.resolve();return flushInFlight=doFlush().finally(()=>{flushInFlight=null}),flushInFlight}async function doFlush(){if(queue.length===0)return;let batch=queue.splice(0,BATCH_SIZE),t0=Date.now();try{if(await writeBatch(batch),stats.flushed+=batch.length,stats.last_flush_rows=batch.length,stats.last_flush_ms=Date.now()-t0,!isSpillJournalEmpty())drainSpillJournal()}catch(err){let reinjectCap=Math.max(0,QUEUE_CAP-queue.length);if(reinjectCap>0)queue.unshift(...batch.slice(0,reinjectCap));process.stderr.write(`[emit] flush failed: ${err instanceof Error?err.message:String(err)} (requeued ${Math.min(batch.length,reinjectCap)}/${batch.length})
|
|
496
496
|
`)}stats.queue_depth=queue.length}async function flushNow(){await triggerFlush();while(queue.length>0&&!shuttingDown)await triggerFlush()}async function drainSpillJournalNow(){return drainSpillJournal()}async function shutdownEmitter(){if(shuttingDown=!0,flushTimer)clearInterval(flushTimer),flushTimer=null;if(queueDepthTimer)clearInterval(queueDepthTimer),queueDepthTimer=null;if(sheddingTimer)clearInterval(sheddingTimer),sheddingTimer=null;if(correlationTimer)clearInterval(correlationTimer),correlationTimer=null;watchersStartedAt=0;try{while(queue.length>0)await triggerFlush()}finally{shuttingDown=!1}}function routeTable(row){if(row.tier_defaults==="audit")return"audit";if(row.tier_defaults==="debug")return"debug";if(row.severity==="debug"){let sampleByte=Number.parseInt(row.dedup_key.slice(-2),16);if(!Number.isNaN(sampleByte)&&sampleByte%100===0)return"main";return"debug"}return"main"}function rowRecord(row){let enrichedData={...row.payload,_trace_id:row.trace_id,_span_id:row.span_id,_parent_span_id:row.parent_span_id,_severity:row.severity,_schema_version:row.schema_version,_duration_ms:row.duration_ms,_dedup_key:row.dedup_key,_source_subsystem:row.source_subsystem,_tier:row.tier_defaults,_kind:row.kind};return{repo_path:row.repo_path,subject:row.type,kind:"system",source:"sdk",agent:row.agent,team:row.team,direction:null,peer:null,text:row.type,data:enrichedData,detector_version:row.detector_version,created_at:row.created_at}}async function writeBatch(batch){let sql=await getConnection(),buckets={main:[],debug:[],audit:[]};for(let row of batch)buckets[routeTable(row)].push(row);let writeBucket=async(table,rows)=>{if(rows.length===0)return;for(let row of rows){let rec=rowRecord(row),data=rec.data;if(table==="genie_runtime_events")await sql`
|
|
497
497
|
INSERT INTO genie_runtime_events
|
|
498
498
|
(repo_path, subject, kind, source, agent, team, direction, peer, text, data, detector_version, created_at)
|
|
@@ -857,8 +857,8 @@ Run 'genie agent list' to list agents.`)}async function resolveTarget(target,opt
|
|
|
857
857
|
`)}var STATE_ICONS;var init_brief=__esm(()=>{init_db();init_mailbox();init_runtime_events();init_team_manager();STATE_ICONS={working:"\u25CF",idle:"\u25CB",error:"\u2718"}});import{readFile as readFile5,rename as rename2,writeFile as writeFile4}from"fs/promises";function stripDerivedFields(config){let out={...config};for(let key of DERIVED_KEYS)delete out[key];return out}async function parseAgentYaml(path3){let raw;try{raw=await readFile5(path3,"utf-8")}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`Failed to read agent.yaml at ${path3}: ${message}`)}let parsed;try{parsed=load(raw)}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`Malformed YAML in ${path3}: ${message}`)}let input=parsed===null||parsed===void 0?{}:parsed;if(typeof input!=="object"||Array.isArray(input))throw Error(`agent.yaml at ${path3} must be a YAML mapping, got ${Array.isArray(input)?"array":typeof input}`);let result2=AgentConfigSchema.safeParse(input);if(!result2.success)throw Error(`Invalid agent.yaml at ${path3}: ${formatZodError(result2.error)}`);return result2.data}function formatZodError(error2){return error2.issues.map((issue)=>{let path3=issue.path.length>0?issue.path.join("."):"(root)";if(issue.code==="unrecognized_keys"){let keys=issue.keys.join(", ");return`unknown field(s) at ${path3}: ${keys}`}return`${path3}: ${issue.message}`}).join("; ")}async function writeAgentYaml(path3,config){let stripped=stripDerivedFields(config),yamlStr=dump(stripped,{lineWidth:-1,noRefs:!0,sortKeys:!1,quotingType:'"'});await acquireLock(path3);try{let tmpPath=`${path3}.tmp`;await writeFile4(tmpPath,yamlStr,"utf-8"),await rename2(tmpPath,path3)}finally{await releaseLock(path3)}}function extractFrontmatterFromAgentsMd(content){if(!content.startsWith(`---
|
|
858
858
|
`))return{frontmatter:null,body:content};let after=content.slice(4),frontmatter,afterClose;if(after.startsWith("---"))frontmatter="",afterClose=after.slice(3);else{let closeIdx=after.indexOf(`
|
|
859
859
|
---`);if(closeIdx===-1)return{frontmatter:null,body:content};frontmatter=after.slice(0,closeIdx),afterClose=after.slice(closeIdx+4)}let body=afterClose.startsWith(`
|
|
860
|
-
`)?afterClose.slice(1):afterClose;return{frontmatter,body}}var SdkPermissionModeSchema,SdkEffortLevelSchema,SdkThinkingConfigSchema,SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema,SdkMcpServerConfigSchema,SdkSubagentConfigSchema,SdkCustomToolConfigSchema,SdkOutputFormatSchema,SdkPluginConfigSchema,SdkSandboxConfigSchema,SdkHookMatcherConfigSchema,SdkHookEventSchema,SdkBetaSchema,SdkSystemPromptSchema,SdkDirectoryConfigSchema,AgentConfigSchema,DERIVED_KEYS;var init_agent_yaml=__esm(()=>{init_js_yaml();init_zod();init_lockfile();SdkPermissionModeSchema=exports_external.enum(["default","acceptEdits","bypassPermissions","plan","dontAsk","auto","remoteApproval"]),SdkEffortLevelSchema=exports_external.union([exports_external.enum(["low","medium","high","max"]),exports_external.number()]),SdkThinkingConfigSchema=exports_external.union([exports_external.object({type:exports_external.literal("adaptive")}).strict(),exports_external.object({type:exports_external.literal("enabled"),budgetTokens:exports_external.number().optional()}).strict(),exports_external.object({type:exports_external.literal("disabled")}).strict()]),SdkMcpStdioServerConfigSchema=exports_external.object({type:exports_external.literal("stdio").optional(),command:exports_external.string(),args:exports_external.array(exports_external.string()).optional(),env:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpSSEServerConfigSchema=exports_external.object({type:exports_external.literal("sse"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpHttpServerConfigSchema=exports_external.object({type:exports_external.literal("http"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpServerConfigSchema=exports_external.union([SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema]),SdkSubagentConfigSchema=exports_external.object({description:exports_external.string(),prompt:exports_external.string(),tools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),model:exports_external.string().optional(),mcpServers:exports_external.array(exports_external.union([exports_external.string(),exports_external.record(SdkMcpStdioServerConfigSchema)])).optional(),skills:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),background:exports_external.boolean().optional(),memory:exports_external.enum(["user","project","local"]).optional(),effort:SdkEffortLevelSchema.optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict(),SdkCustomToolConfigSchema=exports_external.object({name:exports_external.string(),description:exports_external.string(),inputSchema:exports_external.record(exports_external.unknown()),handler:exports_external.string().optional()}).strict(),SdkOutputFormatSchema=exports_external.object({type:exports_external.literal("json_schema"),schema:exports_external.record(exports_external.unknown())}).strict(),SdkPluginConfigSchema=exports_external.object({type:exports_external.literal("local"),path:exports_external.string()}).strict(),SdkSandboxConfigSchema=exports_external.object({enabled:exports_external.boolean().optional(),autoAllowBashIfSandboxed:exports_external.boolean().optional(),failIfUnavailable:exports_external.boolean().optional(),network:exports_external.object({allowLocalBinding:exports_external.boolean().optional(),allowUnixSockets:exports_external.array(exports_external.string()).optional()}).strict().optional()}).strict(),SdkHookMatcherConfigSchema=exports_external.object({toolName:exports_external.string().optional(),agentName:exports_external.string().optional()}).strict(),SdkHookEventSchema=exports_external.enum(["PreToolUse","PostToolUse","PostToolUseFailure","Notification","UserPromptSubmit","SessionStart","SessionEnd","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact","PermissionRequest","PermissionDenied","Setup","TeammateIdle","TaskCreated","TaskCompleted","Elicitation","ElicitationResult","ConfigChange","WorktreeCreate","WorktreeRemove","InstructionsLoaded","CwdChanged","FileChanged"]),SdkBetaSchema=exports_external.enum(["context-1m-2025-08-07"]),SdkSystemPromptSchema=exports_external.union([exports_external.string(),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code"),append:exports_external.string().optional()}).strict()]),SdkDirectoryConfigSchema=exports_external.object({permissionMode:SdkPermissionModeSchema.optional(),tools:exports_external.union([exports_external.array(exports_external.string()),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code")}).strict()]).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),maxBudgetUsd:exports_external.number().optional(),effort:SdkEffortLevelSchema.optional(),thinking:SdkThinkingConfigSchema.optional(),agent:exports_external.string().optional(),agents:exports_external.record(SdkSubagentConfigSchema).optional(),mcpServers:exports_external.record(SdkMcpServerConfigSchema).optional(),plugins:exports_external.array(SdkPluginConfigSchema).optional(),customTools:exports_external.array(SdkCustomToolConfigSchema).optional(),persistSession:exports_external.boolean().optional(),enableFileCheckpointing:exports_external.boolean().optional(),outputFormat:SdkOutputFormatSchema.optional(),includePartialMessages:exports_external.boolean().optional(),includeHookEvents:exports_external.boolean().optional(),promptSuggestions:exports_external.boolean().optional(),agentProgressSummaries:exports_external.boolean().optional(),systemPrompt:SdkSystemPromptSchema.optional(),sandbox:SdkSandboxConfigSchema.optional(),betas:exports_external.array(SdkBetaSchema).optional(),settingSources:exports_external.array(exports_external.enum(["user","project","local"])).optional(),settings:exports_external.union([exports_external.string(),exports_external.record(exports_external.unknown())]).optional(),hooks:exports_external.record(SdkHookEventSchema,exports_external.array(SdkHookMatcherConfigSchema)).optional()}).strict(),AgentConfigSchema=exports_external.object({name:exports_external.string().optional(),dir:exports_external.string().optional(),repo:exports_external.string().optional(),team:exports_external.string().optional(),promptMode:exports_external.enum(["system","append"]).optional(),model:exports_external.string().optional(),roles:exports_external.array(exports_external.string()).optional(),omniAgentId:exports_external.string().optional(),registeredAt:exports_external.string().optional(),description:exports_external.string().optional(),color:exports_external.string().optional(),provider:exports_external.string().optional(),permissions:exports_external.object({preset:exports_external.string().optional(),allow:exports_external.array(exports_external.string()).optional(),deny:exports_external.array(exports_external.string()).optional(),bashAllowPatterns:exports_external.array(exports_external.string()).optional()}).strict().optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),omniScopes:exports_external.array(exports_external.string()).optional(),hooks:exports_external.record(exports_external.unknown()).optional(),sdk:SdkDirectoryConfigSchema.optional()}).strict(),DERIVED_KEYS=["name","dir","registeredAt"]});import{existsSync as existsSync26}from"fs";import{copyFile as copyFile2,readFile as readFile6,writeFile as writeFile5}from"fs/promises";import{join as join28}from"path";async function migrateAgentToYaml(agentDir,dbRow){let yamlPath=join28(agentDir,"agent.yaml"),agentsMdPath=join28(agentDir,"AGENTS.md"),bakPath=`${agentsMdPath}.bak`;if(existsSync26(yamlPath))return{migrated:!1,reason:"already-migrated",yamlPath};let agentsMdRaw=await readFile6(agentsMdPath,"utf-8"),{frontmatter,body}=extractFrontmatterFromAgentsMd(agentsMdRaw);if(frontmatter===null)return{migrated:!1,reason:"no-frontmatter",yamlPath};let fmParsed=parseFrontmatter2(frontmatter,agentsMdPath),fmClean=pickYamlFields(fmParsed),merged={...dbRow?pickYamlFields(dbRow):{},...fmClean},config=AgentConfigSchema.parse(merged);return await writeAgentYaml(yamlPath,config),await copyFile2(agentsMdPath,bakPath),await writeFile5(agentsMdPath,body),{migrated:!0,yamlPath,bakPath}}function parseFrontmatter2(frontmatter,sourcePath){let raw;try{raw=load(frontmatter)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Malformed frontmatter in ${sourcePath}: ${msg}`)}if(raw===null||typeof raw!=="object"||Array.isArray(raw))throw Error(`Malformed frontmatter in ${sourcePath}: expected a YAML mapping at the top level`);return raw}function pickYamlFields(source){let out={};for(let[k,v]of Object.entries(source))if(YAML_ALLOWED_KEYS.has(k)&&v!==null&&v!==void 0)out[k]=v;return out}var YAML_ALLOWED_KEYS;var init_agent_migrate=__esm(()=>{init_js_yaml();init_agent_yaml();YAML_ALLOWED_KEYS=(()=>{let shape=AgentConfigSchema._def.shape(),keys=new Set(Object.keys(shape));return keys.delete("name"),keys.delete("dir"),keys.delete("registeredAt"),keys})()});var exports_agent_sync={};__export(exports_agent_sync,{watchAgentDirectory:()=>watchAgentDirectory,syncSingleAgentByName:()=>syncSingleAgentByName,syncAgentDirectory:()=>syncAgentDirectory,printSyncResult:()=>printSyncResult,healAgentFile:()=>healAgentFile});import{execSync as execSync8}from"child_process";import{existsSync as existsSync27,watch as fsWatch,readFileSync as readFileSync18,readdirSync as readdirSync7,realpathSync as realpathSync3,writeFileSync as writeFileSync10}from"fs";import{join as join29}from"path";function getGitRemoteUrl(dir){try{return execSync8(`git -C "${dir}" config --get remote.origin.url`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}}function extractOrgRepo(remoteUrl){let sshMatch=remoteUrl.match(/[^/:]+\/[^/]+?(?:\.git)?$/);if(sshMatch)return sshMatch[0].replace(/\.git$/,"");return null}function getRepoPathForAgent(agentDir){let reposLink=join29(agentDir,"repos");try{if(!existsSync27(reposLink))return null;let target=realpathSync3(reposLink);if(!existsSync27(target))return null;return target}catch{return null}}function discoverAgents(workspaceRoot){let agentsDir=join29(workspaceRoot,"agents");if(!existsSync27(agentsDir))return[];let agents=[];try{let entries=readdirSync7(agentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let agentDir=join29(agentsDir,entry2.name);if(!existsSync27(join29(agentDir,"AGENTS.md")))continue;agents.push({name:entry2.name,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}),discoverSubAgents(agentDir,entry2.name,agents)}}catch{}return agents}function discoverSubAgents(parentDir,parentName,agents){let subAgentsDir=join29(parentDir,".genie","agents");if(!existsSync27(subAgentsDir))return;try{let entries=readdirSync7(subAgentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let subDir=join29(subAgentsDir,entry2.name);if(!existsSync27(join29(subDir,"AGENTS.md")))continue;agents.push({name:`${parentName}/${entry2.name}`,dir:subDir,repoUrl:getGitRemoteUrl(parentDir),productRepo:getRepoPathForAgent(parentDir)})}}catch{}}function discoverSingleAgent(workspaceRoot,agentName){let agentDir=join29(workspaceRoot,"agents",agentName);if(!existsSync27(join29(agentDir,"AGENTS.md")))return null;return{name:agentName,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}}function healAgentFile(agentsMdPath,agentName,healResult){let content=readFileSync18(agentsMdPath,"utf-8"),fmMatch=content.match(/^(---\n)([\s\S]*?)(\n---)/);if(!fmMatch)return!1;let prefix=fmMatch[1],fmBlock=fmMatch[2],suffix=fmMatch[3],rest=content.slice(fmMatch[0].length),modified=!1,healedBlock=fmBlock;for(let{field,value}of INVALID_LITERALS)if(new RegExp(`^${field}:\\s*${value}\\s*$`,"m").test(healedBlock))healedBlock=healedBlock.replace(new RegExp(`${field}:\\s*${value}\\s*\\n?`,"m"),""),healResult.healed.push({agent:agentName,field,value}),modified=!0;if(!modified)return!1;let newContent=prefix+healedBlock+suffix+rest,tmpPath=`${agentsMdPath}.tmp.${Date.now()}`;writeFileSync10(tmpPath,newContent,"utf-8");let{renameSync:renameSync3}=__require("fs");return renameSync3(tmpPath,agentsMdPath),!0}function buildResolveContext(workspaceRoot,agentName){let workspaceDefaults;try{workspaceDefaults=getWorkspaceConfig(workspaceRoot).agents?.defaults}catch{}let parent;if(agentName.includes("/")){let parentName=agentName.split("/")[0],parentAgentsMd=join29(workspaceRoot,"agents",parentName,"AGENTS.md");if(existsSync27(parentAgentsMd)){let parentContent=readFileSync18(parentAgentsMd,"utf-8"),parentFm=parseFrontmatter(parentContent);parent={name:parentName,fields:parentFm}}}return{workspaceDefaults,parent}}function computeResolvedMetadata(fm,ctx){let declared={},resolved={};for(let field of Object.keys(BUILTIN_DEFAULTS)){let fmValue=fm[field];if(fmValue!==void 0&&fmValue!==null&&fmValue!==""&&fmValue!=="inherit")declared[field]=fmValue;let result2=resolveFieldWithSource(fm,field,ctx);resolved[field]={value:result2.value,source:result2.source}}return{declared,resolved}}async function syncAgentDirectory(workspaceRoot){let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]},agents=discoverAgents(workspaceRoot),discoveredNames=new Set(agents.map((a)=>a.name)),healResult={healed:[]};for(let agent of agents){let agentsMdPath=join29(agent.dir,"AGENTS.md");try{healAgentFile(agentsMdPath,agent.name,healResult)}catch{}}result2.healed=healResult.healed;for(let h of healResult.healed)console.log(`[sync] healed ${h.agent}/AGENTS.md: removed invalid '${h.field}: ${h.value}' line`);for(let agent of agents)try{await syncSingleAgent(agent,result2,workspaceRoot)}catch(err){result2.errors.push({name:agent.name,error:err instanceof Error?err.message:String(err)})}return await removeMissingAgents(discoveredNames,result2),result2}function printSyncResult(result2){if(result2.healed.length>0)console.log(` Healed: ${result2.healed.length} invalid literal(s) removed`);if(result2.migrated.length>0)console.log(` Migrated: ${result2.migrated.join(", ")} (AGENTS.md frontmatter \u2192 agent.yaml)`);if(result2.registered.length>0)console.log(` Registered: ${result2.registered.join(", ")}`);if(result2.updated.length>0)console.log(` Updated: ${result2.updated.join(", ")}`);if(result2.reactivated.length>0)console.log(` Reactivated: ${result2.reactivated.join(", ")}`);if(result2.archived.length>0)console.log(` Removed: ${result2.archived.join(", ")}`);for(let err of result2.errors)console.error(` Error (${err.name}): ${err.error}`);let total=result2.registered.length+result2.updated.length+result2.reactivated.length;console.log(`
|
|
861
|
-
Synced: ${total} agent(s), ${result2.archived.length} removed.`)}async function removeMissingAgents(discoveredNames,result2){try{let entries=await ls();for(let entry2 of entries){if(discoveredNames.has(entry2.name))continue;if(entry2.scope==="built-in")continue;if(!entry2.dir||!entry2.dir.includes("/agents/"))continue;let{removed}=await rm3(entry2.name);if(removed)result2.archived.push(entry2.name)}}catch{}}async function syncSingleAgent(agent,result2,workspaceRoot){let repoPath=(agent.repoUrl?extractOrgRepo(agent.repoUrl):null)??agent.repoUrl??agent.dir,yamlPath=join29(agent.dir,"agent.yaml"),agentsMdPath=join29(agent.dir,"AGENTS.md");if(!existsSync27(yamlPath)&&existsSync27(agentsMdPath)){let agentsMdContent=readFileSync18(agentsMdPath,"utf-8"),{frontmatter}=extractFrontmatterFromAgentsMd(agentsMdContent);if(frontmatter!==null){let existingEntry=await resolve4(agent.name),dbRow=existingEntry&&!existingEntry.builtin?dbRowFromEntry(existingEntry.entry):void 0;if((await migrateAgentToYaml(agent.dir,dbRow)).migrated)result2.migrated.push(agent.name)}}let configFields=existsSync27(yamlPath)?await readYamlAsConfigFields(yamlPath):readFrontmatterAsConfigFields(agentsMdPath);if(workspaceRoot){let ctx=buildResolveContext(workspaceRoot,agent.name);computeResolvedMetadata(configFields.rawForResolution,ctx)}let resolved=await resolve4(agent.name);if(!(resolved&&!resolved.builtin?resolved.entry:null)){await add({name:agent.name,dir:agent.dir,repo:repoPath,promptMode:configFields.promptMode,model:configFields.model,description:configFields.description,color:configFields.color,provider:configFields.provider,permissions:configFields.permissions,disallowedTools:configFields.disallowedTools,omniScopes:configFields.omniScopes,hooks:configFields.hooks,sdk:configFields.sdk}),result2.registered.push(agent.name);return}await edit(agent.name,{dir:agent.dir,repo:repoPath,promptMode:configFields.promptMode,model:configFields.model,description:configFields.description,color:configFields.color,provider:configFields.provider,permissions:configFields.permissions,disallowedTools:configFields.disallowedTools,omniScopes:configFields.omniScopes,hooks:configFields.hooks,sdk:configFields.sdk}),result2.updated.push(agent.name)}async function readYamlAsConfigFields(yamlPath){let cfg=await parseAgentYaml(yamlPath);return{promptMode:cfg.promptMode??"append",model:cfg.model,description:cfg.description,color:cfg.color,provider:cfg.provider,permissions:cfg.permissions,disallowedTools:cfg.disallowedTools,omniScopes:cfg.omniScopes,hooks:cfg.hooks,sdk:cfg.sdk,rawForResolution:cfg}}function readFrontmatterAsConfigFields(agentsMdPath){let content=existsSync27(agentsMdPath)?readFileSync18(agentsMdPath,"utf-8"):"",fm=parseFrontmatter(content);return{promptMode:fm.promptMode??"append",model:fm.model,description:fm.description,color:fm.color,provider:fm.provider,permissions:fm.permissions,disallowedTools:fm.disallowedTools,omniScopes:fm.omniScopes,hooks:fm.hooks,sdk:fm.sdk,rawForResolution:fm}}function dbRowFromEntry(entry2){return{team:entry2.team,model:entry2.model,description:entry2.description,color:entry2.color,provider:entry2.provider,promptMode:entry2.promptMode,permissions:entry2.permissions,disallowedTools:entry2.disallowedTools,omniScopes:entry2.omniScopes,hooks:entry2.hooks,sdk:entry2.sdk}}async function syncSingleAgentByName(workspaceRoot,agentName){let agent=discoverSingleAgent(workspaceRoot,agentName);if(!agent)return"not-found";let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]};if(await syncSingleAgent(agent,result2,workspaceRoot),result2.registered.length>0)return"registered";if(result2.migrated.length>0)return"migrated";if(result2.updated.length>0)return"updated";return"synced"}function watchAgentDirectory(workspaceRoot,options){let agentsDir=join29(workspaceRoot,"agents");if(!existsSync27(agentsDir))return null;let debounceTimer=null,pendingChanges=new Set,processChanges=async()=>{let names=[...pendingChanges];pendingChanges.clear();for(let name of names)try{let action=await processWatchedAgent(workspaceRoot,agentsDir,name);if(action)options?.onSync?.(name,action)}catch{}},watcher=fsWatch(agentsDir,{persistent:!1},(_event,filename)=>{if(!filename)return;let name=filename.split("/")[0];if(!name||name.startsWith("."))return;if(pendingChanges.add(name),debounceTimer)clearTimeout(debounceTimer);debounceTimer=setTimeout(processChanges,2000)});return{close:()=>{if(debounceTimer)clearTimeout(debounceTimer);watcher.close()}}}async function processWatchedAgent(workspaceRoot,agentsDir,name){let agentDir=join29(agentsDir,name);if(existsSync27(agentDir)&&existsSync27(join29(agentDir,"AGENTS.md"))){let action=await syncSingleAgentByName(workspaceRoot,name);return action!=="synced"&&action!=="not-found"?action:null}if(!existsSync27(agentDir)){let{removed}=await rm3(name);if(removed)return"removed"}return null}var INVALID_LITERALS;var init_agent_sync=__esm(()=>{init_agent_directory();init_agent_migrate();init_agent_yaml();init_defaults();init_frontmatter();init_workspace();INVALID_LITERALS=[{field:"model",value:"inherit"}]});var exports_term_format={};__export(exports_term_format,{truncate:()=>truncate2,stripAnsi:()=>stripAnsi2,padRight:()=>padRight,formatTimestamp:()=>formatTimestamp,formatTime:()=>formatTime,formatRelativeTimestamp:()=>formatRelativeTimestamp,formatDate:()=>formatDate,color:()=>color});function padRight(str2,len){return str2.length>=len?str2:str2+" ".repeat(len-str2.length)}function truncate2(str2,len){return str2.length<=len?str2:`${str2.slice(0,len-1)}\u2026`}function formatDate(iso){if(!iso)return"-";return new Date(iso).toLocaleDateString("en-US",{month:"short",day:"numeric"})}function formatRelativeTimestamp(ts3){let d=new Date(ts3),diffMs=Date.now()-d.getTime();if(diffMs<60000)return`${Math.floor(diffMs/1000)}s ago`;if(diffMs<3600000)return`${Math.floor(diffMs/60000)}m ago`;if(diffMs<86400000)return`${Math.floor(diffMs/3600000)}h ago`;return d.toISOString().replace("T"," ").slice(0,19)}function formatTimestamp(iso,opts){if(!iso)return opts?.fallback??"-";let d=iso instanceof Date?iso:new Date(iso),fmt={month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1};if(opts?.seconds)fmt.second="2-digit";return d.toLocaleString("en-US",fmt)}function formatTime(iso,opts){try{let date=new Date(iso),fmt={hour:"2-digit",minute:"2-digit",hour12:!1};if(opts?.seconds)fmt.second="2-digit";return date.toLocaleTimeString("en-US",fmt)}catch{return opts?.fallback??"??:??"}}function color(name,text){return isTTY?`${ANSI[name]}${text}${ANSI.reset}`:text}function stripAnsi2(str2){return str2.replace(ANSI_REGEX,"")}var ANSI,isTTY,ANSI_REGEX;var init_term_format=__esm(()=>{ANSI={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightCyan:"\x1B[96m"},isTTY=process.stdout.isTTY&&!process.env.NO_COLOR;ANSI_REGEX=/\x1b\[[0-9;]*m/g});var exports_task_service={};__export(exports_task_service,{updateTask:()=>updateTask,updateMessage:()=>updateMessage,untagTask:()=>untagTask,unblockTask:()=>unblockTask,unarchiveTask:()=>unarchiveTask,unarchiveProject:()=>unarchiveProject,tagTask:()=>tagTask,setRelease:()=>setRelease,setPreference:()=>setPreference,sendMessage:()=>sendMessage,resolveTaskId:()=>resolveTaskId,resolveChannels:()=>resolveChannels,removeMember:()=>removeMember,removeDependency:()=>removeDependency,removeActor:()=>removeActor,releaseTask:()=>releaseTask,moveTask:()=>moveTask,markDone:()=>markDone,listTypes:()=>listTypes,listTasksForActor:()=>listTasksForActor,listTasks:()=>listTasks,listTags:()=>listTags,listReleases:()=>listReleases,listProjectsFiltered:()=>listProjectsFiltered,listProjects:()=>listProjects,listConversations:()=>listConversations,linkTask:()=>linkTask,getType:()=>getType,getTaskTags:()=>getTaskTags,getTaskActors:()=>getTaskActors,getTask:()=>getTask,getStageLog:()=>getStageLog,getProjectByRepoPath:()=>getProjectByRepoPath,getProjectByName:()=>getProjectByName,getPreferences:()=>getPreferences,getMessages:()=>getMessages,getMessage:()=>getMessage,getMembers:()=>getMembers,getDependents:()=>getDependents,getConversation:()=>getConversation,getCheckoutOwner:()=>getCheckoutOwner,getBlockingDependencies:()=>getBlockingDependencies,getBlockers:()=>getBlockers,forceUnlockTask:()=>forceUnlockTask,findOrCreateConversation:()=>findOrCreateConversation,expireStaleCheckouts:()=>expireStaleCheckouts,ensureProject:()=>ensureProject,deletePreference:()=>deletePreference,createType:()=>createType,createTask:()=>createTask,createTag:()=>createTag,createProject:()=>createProject,commentOnTask:()=>commentOnTask,checkoutTask:()=>checkoutTask,blockTask:()=>blockTask,assignTask:()=>assignTask,archiveTask:()=>archiveTask,archiveProject:()=>archiveProject,archiveBoard:()=>archiveBoard,addMember:()=>addMember,addDependency:()=>addDependency});import{execSync as execSync9}from"child_process";function str2(v){return v!=null?String(v):null}function strOrDefault(v,def){return v!=null?String(v):def}function mapTask(row){return{id:row.id,seq:row.seq,parentId:str2(row.parent_id),repoPath:row.repo_path,projectId:str2(row.project_id),genieOsFolderId:str2(row.genie_os_folder_id),wishFile:str2(row.wish_file),groupName:str2(row.group_name),title:row.title,description:str2(row.description),acceptanceCriteria:str2(row.acceptance_criteria),typeId:row.type_id,stage:row.stage,status:row.status,priority:row.priority,startDate:str2(row.start_date),dueDate:str2(row.due_date),estimatedEffort:str2(row.estimated_effort),startedAt:str2(row.started_at),endedAt:str2(row.ended_at),blockedReason:str2(row.blocked_reason),releaseId:str2(row.release_id),checkoutRunId:str2(row.checkout_run_id),executionLockedAt:str2(row.execution_locked_at),checkoutTimeoutMs:row.checkout_timeout_ms??600000,sessionId:str2(row.session_id),paneId:str2(row.pane_id),traceId:str2(row.trace_id),boardId:str2(row.board_id),columnId:str2(row.column_id),externalId:str2(row.external_id),externalUrl:str2(row.external_url),archivedAt:str2(row.archived_at),metadata:row.metadata??{},createdAt:strOrDefault(row.created_at,""),updatedAt:strOrDefault(row.updated_at,"")}}function mapConversation(row){return{id:row.id,parentMessageId:row.parent_message_id!=null?Number(row.parent_message_id):null,name:row.name??null,type:row.type,linkedEntity:row.linked_entity??null,linkedEntityId:row.linked_entity_id??null,createdByType:row.created_by_type??null,createdById:row.created_by_id??null,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapMessage(row){return{id:Number(row.id),conversationId:row.conversation_id,replyToId:row.reply_to_id!=null?Number(row.reply_to_id):null,senderType:row.sender_type,senderId:row.sender_id,body:row.body,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapTaskActor(row){return{taskId:row.task_id,actorType:row.actor_type,actorId:row.actor_id,role:row.role,permissions:row.permissions??{},createdAt:String(row.created_at)}}function mapDependency(row){return{taskId:row.task_id,dependsOnId:row.depends_on_id,depType:row.dep_type,createdAt:String(row.created_at)}}function mapTag(row){return{id:row.id,name:row.name,color:row.color??"#9ca3af",typeId:row.type_id??null,createdAt:String(row.created_at)}}function mapTaskType(row){return{id:row.id,name:row.name,description:row.description??null,icon:row.icon??null,stages:row.stages,isBuiltin:row.is_builtin,createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapNotificationPref(row){return{actorType:row.actor_type,actorId:row.actor_id,channel:row.channel,priorityThreshold:row.priority_threshold,isDefault:row.is_default,enabled:row.enabled,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapStageLog(row){return{id:Number(row.id),taskId:row.task_id,fromStage:row.from_stage??null,toStage:row.to_stage,actorType:row.actor_type??null,actorId:row.actor_id??null,runId:row.run_id??null,gateType:row.gate_type??null,createdAt:String(row.created_at)}}function mapConversationMember(row){return{conversationId:row.conversation_id,actorType:row.actor_type,actorId:row.actor_id,role:row.role,joinedAt:String(row.joined_at)}}function mapProject(row){return{id:row.id,name:row.name,repoPath:str2(row.repo_path),description:str2(row.description),leaderAgent:str2(row.leader_agent),tmuxSession:str2(row.tmux_session),status:strOrDefault(row.status,"active"),archivedAt:str2(row.archived_at),createdAt:String(row.created_at)}}function getRepoPath(){try{return execSync9("git rev-parse --show-toplevel",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return process.cwd()}}async function resolveTaskId(idOrSeq,repoPath){let sql=await getConnection(),repo=repoPath??getRepoPath(),projectSeqMatch=idOrSeq.match(/^([^#]+)#(\d+)$/);if(projectSeqMatch&&!idOrSeq.startsWith("#")){let[,projectName,seqStr]=projectSeqMatch,seq2=Number.parseInt(seqStr,10);if(Number.isNaN(seq2))return null;let rows2=await sql`
|
|
860
|
+
`)?afterClose.slice(1):afterClose;return{frontmatter,body}}var SdkPermissionModeSchema,SdkEffortLevelSchema,SdkThinkingConfigSchema,SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema,SdkMcpServerConfigSchema,SdkSubagentConfigSchema,SdkCustomToolConfigSchema,SdkOutputFormatSchema,SdkPluginConfigSchema,SdkSandboxConfigSchema,SdkHookMatcherConfigSchema,SdkHookEventSchema,SdkBetaSchema,SdkSystemPromptSchema,SdkDirectoryConfigSchema,AgentConfigSchema,DERIVED_KEYS;var init_agent_yaml=__esm(()=>{init_js_yaml();init_zod();init_lockfile();SdkPermissionModeSchema=exports_external.enum(["default","acceptEdits","bypassPermissions","plan","dontAsk","auto","remoteApproval"]),SdkEffortLevelSchema=exports_external.union([exports_external.enum(["low","medium","high","max"]),exports_external.number()]),SdkThinkingConfigSchema=exports_external.union([exports_external.object({type:exports_external.literal("adaptive")}).strict(),exports_external.object({type:exports_external.literal("enabled"),budgetTokens:exports_external.number().optional()}).strict(),exports_external.object({type:exports_external.literal("disabled")}).strict()]),SdkMcpStdioServerConfigSchema=exports_external.object({type:exports_external.literal("stdio").optional(),command:exports_external.string(),args:exports_external.array(exports_external.string()).optional(),env:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpSSEServerConfigSchema=exports_external.object({type:exports_external.literal("sse"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpHttpServerConfigSchema=exports_external.object({type:exports_external.literal("http"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpServerConfigSchema=exports_external.union([SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema]),SdkSubagentConfigSchema=exports_external.object({description:exports_external.string(),prompt:exports_external.string(),tools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),model:exports_external.string().optional(),mcpServers:exports_external.array(exports_external.union([exports_external.string(),exports_external.record(SdkMcpStdioServerConfigSchema)])).optional(),skills:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),background:exports_external.boolean().optional(),memory:exports_external.enum(["user","project","local"]).optional(),effort:SdkEffortLevelSchema.optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict(),SdkCustomToolConfigSchema=exports_external.object({name:exports_external.string(),description:exports_external.string(),inputSchema:exports_external.record(exports_external.unknown()),handler:exports_external.string().optional()}).strict(),SdkOutputFormatSchema=exports_external.object({type:exports_external.literal("json_schema"),schema:exports_external.record(exports_external.unknown())}).strict(),SdkPluginConfigSchema=exports_external.object({type:exports_external.literal("local"),path:exports_external.string()}).strict(),SdkSandboxConfigSchema=exports_external.object({enabled:exports_external.boolean().optional(),autoAllowBashIfSandboxed:exports_external.boolean().optional(),failIfUnavailable:exports_external.boolean().optional(),network:exports_external.object({allowLocalBinding:exports_external.boolean().optional(),allowUnixSockets:exports_external.array(exports_external.string()).optional()}).strict().optional()}).strict(),SdkHookMatcherConfigSchema=exports_external.object({toolName:exports_external.string().optional(),agentName:exports_external.string().optional()}).strict(),SdkHookEventSchema=exports_external.enum(["PreToolUse","PostToolUse","PostToolUseFailure","Notification","UserPromptSubmit","SessionStart","SessionEnd","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact","PermissionRequest","PermissionDenied","Setup","TeammateIdle","TaskCreated","TaskCompleted","Elicitation","ElicitationResult","ConfigChange","WorktreeCreate","WorktreeRemove","InstructionsLoaded","CwdChanged","FileChanged"]),SdkBetaSchema=exports_external.enum(["context-1m-2025-08-07"]),SdkSystemPromptSchema=exports_external.union([exports_external.string(),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code"),append:exports_external.string().optional()}).strict()]),SdkDirectoryConfigSchema=exports_external.object({permissionMode:SdkPermissionModeSchema.optional(),tools:exports_external.union([exports_external.array(exports_external.string()),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code")}).strict()]).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),maxBudgetUsd:exports_external.number().optional(),effort:SdkEffortLevelSchema.optional(),thinking:SdkThinkingConfigSchema.optional(),agent:exports_external.string().optional(),agents:exports_external.record(SdkSubagentConfigSchema).optional(),mcpServers:exports_external.record(SdkMcpServerConfigSchema).optional(),plugins:exports_external.array(SdkPluginConfigSchema).optional(),customTools:exports_external.array(SdkCustomToolConfigSchema).optional(),persistSession:exports_external.boolean().optional(),enableFileCheckpointing:exports_external.boolean().optional(),outputFormat:SdkOutputFormatSchema.optional(),includePartialMessages:exports_external.boolean().optional(),includeHookEvents:exports_external.boolean().optional(),promptSuggestions:exports_external.boolean().optional(),agentProgressSummaries:exports_external.boolean().optional(),systemPrompt:SdkSystemPromptSchema.optional(),sandbox:SdkSandboxConfigSchema.optional(),betas:exports_external.array(SdkBetaSchema).optional(),settingSources:exports_external.array(exports_external.enum(["user","project","local"])).optional(),settings:exports_external.union([exports_external.string(),exports_external.record(exports_external.unknown())]).optional(),hooks:exports_external.record(SdkHookEventSchema,exports_external.array(SdkHookMatcherConfigSchema)).optional()}).strict(),AgentConfigSchema=exports_external.object({name:exports_external.string().optional(),dir:exports_external.string().optional(),repo:exports_external.string().optional(),team:exports_external.string().optional(),promptMode:exports_external.enum(["system","append"]).optional(),model:exports_external.string().optional(),roles:exports_external.array(exports_external.string()).optional(),omniAgentId:exports_external.string().optional(),registeredAt:exports_external.string().optional(),description:exports_external.string().optional(),color:exports_external.string().optional(),provider:exports_external.string().optional(),permissions:exports_external.object({preset:exports_external.string().optional(),allow:exports_external.array(exports_external.string()).optional(),deny:exports_external.array(exports_external.string()).optional(),bashAllowPatterns:exports_external.array(exports_external.string()).optional()}).strict().optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),omniScopes:exports_external.array(exports_external.string()).optional(),hooks:exports_external.record(exports_external.unknown()).optional(),sdk:SdkDirectoryConfigSchema.optional()}).strict(),DERIVED_KEYS=["name","dir","registeredAt"]});import{existsSync as existsSync26}from"fs";import{copyFile as copyFile2,readFile as readFile6,writeFile as writeFile5}from"fs/promises";import{join as join28}from"path";async function migrateAgentToYaml(agentDir,dbRow){let yamlPath=join28(agentDir,"agent.yaml"),agentsMdPath=join28(agentDir,"AGENTS.md"),bakPath=`${agentsMdPath}.bak`;if(existsSync26(yamlPath))return{migrated:!1,reason:"already-migrated",yamlPath};let agentsMdRaw=await readFile6(agentsMdPath,"utf-8"),{frontmatter,body}=extractFrontmatterFromAgentsMd(agentsMdRaw);if(frontmatter===null)return{migrated:!1,reason:"no-frontmatter",yamlPath};let fmParsed=parseFrontmatter2(frontmatter,agentsMdPath),fmClean=pickYamlFields(fmParsed),merged={...dbRow?pickYamlFields(dbRow):{},...fmClean},config=AgentConfigSchema.parse(merged);return await writeAgentYaml(yamlPath,config),await copyFile2(agentsMdPath,bakPath),await writeFile5(agentsMdPath,body),{migrated:!0,yamlPath,bakPath}}function parseFrontmatter2(frontmatter,sourcePath){let raw;try{raw=load(frontmatter)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Malformed frontmatter in ${sourcePath}: ${msg}`)}if(raw===null||typeof raw!=="object"||Array.isArray(raw))throw Error(`Malformed frontmatter in ${sourcePath}: expected a YAML mapping at the top level`);return raw}function pickYamlFields(source){let out={};for(let[k,v]of Object.entries(source))if(YAML_ALLOWED_KEYS.has(k)&&v!==null&&v!==void 0)out[k]=v;return out}var YAML_ALLOWED_KEYS;var init_agent_migrate=__esm(()=>{init_js_yaml();init_agent_yaml();YAML_ALLOWED_KEYS=(()=>{let shape=AgentConfigSchema._def.shape(),keys=new Set(Object.keys(shape));return keys.delete("name"),keys.delete("dir"),keys.delete("registeredAt"),keys})()});var exports_agent_sync={};__export(exports_agent_sync,{watchAgentDirectory:()=>watchAgentDirectory,syncSingleAgentByName:()=>syncSingleAgentByName,syncAgentDirectory:()=>syncAgentDirectory,printSyncResult:()=>printSyncResult,healAgentFile:()=>healAgentFile});import{execSync as execSync7}from"child_process";import{existsSync as existsSync27,watch as fsWatch,readFileSync as readFileSync18,readdirSync as readdirSync7,realpathSync as realpathSync3,writeFileSync as writeFileSync10}from"fs";import{join as join29}from"path";function getGitRemoteUrl(dir){try{return execSync7(`git -C "${dir}" config --get remote.origin.url`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}}function extractOrgRepo(remoteUrl){let sshMatch=remoteUrl.match(/[^/:]+\/[^/]+?(?:\.git)?$/);if(sshMatch)return sshMatch[0].replace(/\.git$/,"");return null}function getRepoPathForAgent(agentDir){let reposLink=join29(agentDir,"repos");try{if(!existsSync27(reposLink))return null;let target=realpathSync3(reposLink);if(!existsSync27(target))return null;return target}catch{return null}}function discoverAgents(workspaceRoot){let agentsDir=join29(workspaceRoot,"agents");if(!existsSync27(agentsDir))return[];let agents=[];try{let entries=readdirSync7(agentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let agentDir=join29(agentsDir,entry2.name);if(!existsSync27(join29(agentDir,"AGENTS.md")))continue;agents.push({name:entry2.name,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}),discoverSubAgents(agentDir,entry2.name,agents)}}catch{}return agents}function discoverSubAgents(parentDir,parentName,agents){let subAgentsDir=join29(parentDir,".genie","agents");if(!existsSync27(subAgentsDir))return;try{let entries=readdirSync7(subAgentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let subDir=join29(subAgentsDir,entry2.name);if(!existsSync27(join29(subDir,"AGENTS.md")))continue;agents.push({name:`${parentName}/${entry2.name}`,dir:subDir,repoUrl:getGitRemoteUrl(parentDir),productRepo:getRepoPathForAgent(parentDir)})}}catch{}}function discoverSingleAgent(workspaceRoot,agentName){let agentDir=join29(workspaceRoot,"agents",agentName);if(!existsSync27(join29(agentDir,"AGENTS.md")))return null;return{name:agentName,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}}function healAgentFile(agentsMdPath,agentName,healResult){let content=readFileSync18(agentsMdPath,"utf-8"),fmMatch=content.match(/^(---\n)([\s\S]*?)(\n---)/);if(!fmMatch)return!1;let prefix=fmMatch[1],fmBlock=fmMatch[2],suffix=fmMatch[3],rest=content.slice(fmMatch[0].length),modified=!1,healedBlock=fmBlock;for(let{field,value}of INVALID_LITERALS)if(new RegExp(`^${field}:\\s*${value}\\s*$`,"m").test(healedBlock))healedBlock=healedBlock.replace(new RegExp(`${field}:\\s*${value}\\s*\\n?`,"m"),""),healResult.healed.push({agent:agentName,field,value}),modified=!0;if(!modified)return!1;let newContent=prefix+healedBlock+suffix+rest,tmpPath=`${agentsMdPath}.tmp.${Date.now()}`;writeFileSync10(tmpPath,newContent,"utf-8");let{renameSync:renameSync3}=__require("fs");return renameSync3(tmpPath,agentsMdPath),!0}function buildResolveContext(workspaceRoot,agentName){let workspaceDefaults;try{workspaceDefaults=getWorkspaceConfig(workspaceRoot).agents?.defaults}catch{}let parent;if(agentName.includes("/")){let parentName=agentName.split("/")[0],parentAgentsMd=join29(workspaceRoot,"agents",parentName,"AGENTS.md");if(existsSync27(parentAgentsMd)){let parentContent=readFileSync18(parentAgentsMd,"utf-8"),parentFm=parseFrontmatter(parentContent);parent={name:parentName,fields:parentFm}}}return{workspaceDefaults,parent}}function computeResolvedMetadata(fm,ctx){let declared={},resolved={};for(let field of Object.keys(BUILTIN_DEFAULTS)){let fmValue=fm[field];if(fmValue!==void 0&&fmValue!==null&&fmValue!==""&&fmValue!=="inherit")declared[field]=fmValue;let result2=resolveFieldWithSource(fm,field,ctx);resolved[field]={value:result2.value,source:result2.source}}return{declared,resolved}}async function syncAgentDirectory(workspaceRoot){let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]},agents=discoverAgents(workspaceRoot),discoveredNames=new Set(agents.map((a)=>a.name)),healResult={healed:[]};for(let agent of agents){let agentsMdPath=join29(agent.dir,"AGENTS.md");try{healAgentFile(agentsMdPath,agent.name,healResult)}catch{}}result2.healed=healResult.healed;for(let h of healResult.healed)console.log(`[sync] healed ${h.agent}/AGENTS.md: removed invalid '${h.field}: ${h.value}' line`);for(let agent of agents)try{await syncSingleAgent(agent,result2,workspaceRoot)}catch(err){result2.errors.push({name:agent.name,error:err instanceof Error?err.message:String(err)})}return await removeMissingAgents(discoveredNames,result2),result2}function printSyncResult(result2){if(result2.healed.length>0)console.log(` Healed: ${result2.healed.length} invalid literal(s) removed`);if(result2.migrated.length>0)console.log(` Migrated: ${result2.migrated.join(", ")} (AGENTS.md frontmatter \u2192 agent.yaml)`);if(result2.registered.length>0)console.log(` Registered: ${result2.registered.join(", ")}`);if(result2.updated.length>0)console.log(` Updated: ${result2.updated.join(", ")}`);if(result2.reactivated.length>0)console.log(` Reactivated: ${result2.reactivated.join(", ")}`);if(result2.archived.length>0)console.log(` Removed: ${result2.archived.join(", ")}`);for(let err of result2.errors)console.error(` Error (${err.name}): ${err.error}`);let total=result2.registered.length+result2.updated.length+result2.reactivated.length;console.log(`
|
|
861
|
+
Synced: ${total} agent(s), ${result2.archived.length} removed.`)}async function removeMissingAgents(discoveredNames,result2){try{let entries=await ls();for(let entry2 of entries){if(discoveredNames.has(entry2.name))continue;if(entry2.scope==="built-in")continue;if(!entry2.dir||!entry2.dir.includes("/agents/"))continue;let{removed}=await rm3(entry2.name);if(removed)result2.archived.push(entry2.name)}}catch{}}async function syncSingleAgent(agent,result2,workspaceRoot){let repoPath=(agent.repoUrl?extractOrgRepo(agent.repoUrl):null)??agent.repoUrl??agent.dir,yamlPath=join29(agent.dir,"agent.yaml"),agentsMdPath=join29(agent.dir,"AGENTS.md");if(!existsSync27(yamlPath)&&existsSync27(agentsMdPath)){let agentsMdContent=readFileSync18(agentsMdPath,"utf-8"),{frontmatter}=extractFrontmatterFromAgentsMd(agentsMdContent);if(frontmatter!==null){let existingEntry=await resolve4(agent.name),dbRow=existingEntry&&!existingEntry.builtin?dbRowFromEntry(existingEntry.entry):void 0;if((await migrateAgentToYaml(agent.dir,dbRow)).migrated)result2.migrated.push(agent.name)}}let configFields=existsSync27(yamlPath)?await readYamlAsConfigFields(yamlPath):readFrontmatterAsConfigFields(agentsMdPath);if(workspaceRoot){let ctx=buildResolveContext(workspaceRoot,agent.name);computeResolvedMetadata(configFields.rawForResolution,ctx)}let resolved=await resolve4(agent.name);if(!(resolved&&!resolved.builtin?resolved.entry:null)){await add({name:agent.name,dir:agent.dir,repo:repoPath,promptMode:configFields.promptMode,model:configFields.model,description:configFields.description,color:configFields.color,provider:configFields.provider,permissions:configFields.permissions,disallowedTools:configFields.disallowedTools,omniScopes:configFields.omniScopes,hooks:configFields.hooks,sdk:configFields.sdk}),result2.registered.push(agent.name);return}await edit(agent.name,{dir:agent.dir,repo:repoPath,promptMode:configFields.promptMode,model:configFields.model,description:configFields.description,color:configFields.color,provider:configFields.provider,permissions:configFields.permissions,disallowedTools:configFields.disallowedTools,omniScopes:configFields.omniScopes,hooks:configFields.hooks,sdk:configFields.sdk}),result2.updated.push(agent.name)}async function readYamlAsConfigFields(yamlPath){let cfg=await parseAgentYaml(yamlPath);return{promptMode:cfg.promptMode??"append",model:cfg.model,description:cfg.description,color:cfg.color,provider:cfg.provider,permissions:cfg.permissions,disallowedTools:cfg.disallowedTools,omniScopes:cfg.omniScopes,hooks:cfg.hooks,sdk:cfg.sdk,rawForResolution:cfg}}function readFrontmatterAsConfigFields(agentsMdPath){let content=existsSync27(agentsMdPath)?readFileSync18(agentsMdPath,"utf-8"):"",fm=parseFrontmatter(content);return{promptMode:fm.promptMode??"append",model:fm.model,description:fm.description,color:fm.color,provider:fm.provider,permissions:fm.permissions,disallowedTools:fm.disallowedTools,omniScopes:fm.omniScopes,hooks:fm.hooks,sdk:fm.sdk,rawForResolution:fm}}function dbRowFromEntry(entry2){return{team:entry2.team,model:entry2.model,description:entry2.description,color:entry2.color,provider:entry2.provider,promptMode:entry2.promptMode,permissions:entry2.permissions,disallowedTools:entry2.disallowedTools,omniScopes:entry2.omniScopes,hooks:entry2.hooks,sdk:entry2.sdk}}async function syncSingleAgentByName(workspaceRoot,agentName){let agent=discoverSingleAgent(workspaceRoot,agentName);if(!agent)return"not-found";let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]};if(await syncSingleAgent(agent,result2,workspaceRoot),result2.registered.length>0)return"registered";if(result2.migrated.length>0)return"migrated";if(result2.updated.length>0)return"updated";return"synced"}function watchAgentDirectory(workspaceRoot,options){let agentsDir=join29(workspaceRoot,"agents");if(!existsSync27(agentsDir))return null;let debounceTimer=null,pendingChanges=new Set,processChanges=async()=>{let names=[...pendingChanges];pendingChanges.clear();for(let name of names)try{let action=await processWatchedAgent(workspaceRoot,agentsDir,name);if(action)options?.onSync?.(name,action)}catch{}},watcher=fsWatch(agentsDir,{persistent:!1},(_event,filename)=>{if(!filename)return;let name=filename.split("/")[0];if(!name||name.startsWith("."))return;if(pendingChanges.add(name),debounceTimer)clearTimeout(debounceTimer);debounceTimer=setTimeout(processChanges,2000)});return{close:()=>{if(debounceTimer)clearTimeout(debounceTimer);watcher.close()}}}async function processWatchedAgent(workspaceRoot,agentsDir,name){let agentDir=join29(agentsDir,name);if(existsSync27(agentDir)&&existsSync27(join29(agentDir,"AGENTS.md"))){let action=await syncSingleAgentByName(workspaceRoot,name);return action!=="synced"&&action!=="not-found"?action:null}if(!existsSync27(agentDir)){let{removed}=await rm3(name);if(removed)return"removed"}return null}var INVALID_LITERALS;var init_agent_sync=__esm(()=>{init_agent_directory();init_agent_migrate();init_agent_yaml();init_defaults();init_frontmatter();init_workspace();INVALID_LITERALS=[{field:"model",value:"inherit"}]});var exports_term_format={};__export(exports_term_format,{truncate:()=>truncate2,stripAnsi:()=>stripAnsi2,padRight:()=>padRight,formatTimestamp:()=>formatTimestamp,formatTime:()=>formatTime,formatRelativeTimestamp:()=>formatRelativeTimestamp,formatDate:()=>formatDate,color:()=>color});function padRight(str2,len){return str2.length>=len?str2:str2+" ".repeat(len-str2.length)}function truncate2(str2,len){return str2.length<=len?str2:`${str2.slice(0,len-1)}\u2026`}function formatDate(iso){if(!iso)return"-";return new Date(iso).toLocaleDateString("en-US",{month:"short",day:"numeric"})}function formatRelativeTimestamp(ts3){let d=new Date(ts3),diffMs=Date.now()-d.getTime();if(diffMs<60000)return`${Math.floor(diffMs/1000)}s ago`;if(diffMs<3600000)return`${Math.floor(diffMs/60000)}m ago`;if(diffMs<86400000)return`${Math.floor(diffMs/3600000)}h ago`;return d.toISOString().replace("T"," ").slice(0,19)}function formatTimestamp(iso,opts){if(!iso)return opts?.fallback??"-";let d=iso instanceof Date?iso:new Date(iso),fmt={month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1};if(opts?.seconds)fmt.second="2-digit";return d.toLocaleString("en-US",fmt)}function formatTime(iso,opts){try{let date=new Date(iso),fmt={hour:"2-digit",minute:"2-digit",hour12:!1};if(opts?.seconds)fmt.second="2-digit";return date.toLocaleTimeString("en-US",fmt)}catch{return opts?.fallback??"??:??"}}function color(name,text){return isTTY?`${ANSI[name]}${text}${ANSI.reset}`:text}function stripAnsi2(str2){return str2.replace(ANSI_REGEX,"")}var ANSI,isTTY,ANSI_REGEX;var init_term_format=__esm(()=>{ANSI={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightCyan:"\x1B[96m"},isTTY=process.stdout.isTTY&&!process.env.NO_COLOR;ANSI_REGEX=/\x1b\[[0-9;]*m/g});var exports_task_service={};__export(exports_task_service,{updateTask:()=>updateTask,updateMessage:()=>updateMessage,untagTask:()=>untagTask,unblockTask:()=>unblockTask,unarchiveTask:()=>unarchiveTask,unarchiveProject:()=>unarchiveProject,tagTask:()=>tagTask,setRelease:()=>setRelease,setPreference:()=>setPreference,sendMessage:()=>sendMessage,resolveTaskId:()=>resolveTaskId,resolveChannels:()=>resolveChannels,removeMember:()=>removeMember,removeDependency:()=>removeDependency,removeActor:()=>removeActor,releaseTask:()=>releaseTask,moveTask:()=>moveTask,markDone:()=>markDone,listTypes:()=>listTypes,listTasksForActor:()=>listTasksForActor,listTasks:()=>listTasks,listTags:()=>listTags,listReleases:()=>listReleases,listProjectsFiltered:()=>listProjectsFiltered,listProjects:()=>listProjects,listConversations:()=>listConversations,linkTask:()=>linkTask,getType:()=>getType,getTaskTags:()=>getTaskTags,getTaskActors:()=>getTaskActors,getTask:()=>getTask,getStageLog:()=>getStageLog,getProjectByRepoPath:()=>getProjectByRepoPath,getProjectByName:()=>getProjectByName,getPreferences:()=>getPreferences,getMessages:()=>getMessages,getMessage:()=>getMessage,getMembers:()=>getMembers,getDependents:()=>getDependents,getConversation:()=>getConversation,getCheckoutOwner:()=>getCheckoutOwner,getBlockingDependencies:()=>getBlockingDependencies,getBlockers:()=>getBlockers,forceUnlockTask:()=>forceUnlockTask,findOrCreateConversation:()=>findOrCreateConversation,expireStaleCheckouts:()=>expireStaleCheckouts,ensureProject:()=>ensureProject,deletePreference:()=>deletePreference,createType:()=>createType,createTask:()=>createTask,createTag:()=>createTag,createProject:()=>createProject,commentOnTask:()=>commentOnTask,checkoutTask:()=>checkoutTask,blockTask:()=>blockTask,assignTask:()=>assignTask,archiveTask:()=>archiveTask,archiveProject:()=>archiveProject,archiveBoard:()=>archiveBoard,addMember:()=>addMember,addDependency:()=>addDependency});import{execSync as execSync8}from"child_process";function str2(v){return v!=null?String(v):null}function strOrDefault(v,def){return v!=null?String(v):def}function mapTask(row){return{id:row.id,seq:row.seq,parentId:str2(row.parent_id),repoPath:row.repo_path,projectId:str2(row.project_id),genieOsFolderId:str2(row.genie_os_folder_id),wishFile:str2(row.wish_file),groupName:str2(row.group_name),title:row.title,description:str2(row.description),acceptanceCriteria:str2(row.acceptance_criteria),typeId:row.type_id,stage:row.stage,status:row.status,priority:row.priority,startDate:str2(row.start_date),dueDate:str2(row.due_date),estimatedEffort:str2(row.estimated_effort),startedAt:str2(row.started_at),endedAt:str2(row.ended_at),blockedReason:str2(row.blocked_reason),releaseId:str2(row.release_id),checkoutRunId:str2(row.checkout_run_id),executionLockedAt:str2(row.execution_locked_at),checkoutTimeoutMs:row.checkout_timeout_ms??600000,sessionId:str2(row.session_id),paneId:str2(row.pane_id),traceId:str2(row.trace_id),boardId:str2(row.board_id),columnId:str2(row.column_id),externalId:str2(row.external_id),externalUrl:str2(row.external_url),archivedAt:str2(row.archived_at),metadata:row.metadata??{},createdAt:strOrDefault(row.created_at,""),updatedAt:strOrDefault(row.updated_at,"")}}function mapConversation(row){return{id:row.id,parentMessageId:row.parent_message_id!=null?Number(row.parent_message_id):null,name:row.name??null,type:row.type,linkedEntity:row.linked_entity??null,linkedEntityId:row.linked_entity_id??null,createdByType:row.created_by_type??null,createdById:row.created_by_id??null,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapMessage(row){return{id:Number(row.id),conversationId:row.conversation_id,replyToId:row.reply_to_id!=null?Number(row.reply_to_id):null,senderType:row.sender_type,senderId:row.sender_id,body:row.body,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapTaskActor(row){return{taskId:row.task_id,actorType:row.actor_type,actorId:row.actor_id,role:row.role,permissions:row.permissions??{},createdAt:String(row.created_at)}}function mapDependency(row){return{taskId:row.task_id,dependsOnId:row.depends_on_id,depType:row.dep_type,createdAt:String(row.created_at)}}function mapTag(row){return{id:row.id,name:row.name,color:row.color??"#9ca3af",typeId:row.type_id??null,createdAt:String(row.created_at)}}function mapTaskType(row){return{id:row.id,name:row.name,description:row.description??null,icon:row.icon??null,stages:row.stages,isBuiltin:row.is_builtin,createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapNotificationPref(row){return{actorType:row.actor_type,actorId:row.actor_id,channel:row.channel,priorityThreshold:row.priority_threshold,isDefault:row.is_default,enabled:row.enabled,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapStageLog(row){return{id:Number(row.id),taskId:row.task_id,fromStage:row.from_stage??null,toStage:row.to_stage,actorType:row.actor_type??null,actorId:row.actor_id??null,runId:row.run_id??null,gateType:row.gate_type??null,createdAt:String(row.created_at)}}function mapConversationMember(row){return{conversationId:row.conversation_id,actorType:row.actor_type,actorId:row.actor_id,role:row.role,joinedAt:String(row.joined_at)}}function mapProject(row){return{id:row.id,name:row.name,repoPath:str2(row.repo_path),description:str2(row.description),leaderAgent:str2(row.leader_agent),tmuxSession:str2(row.tmux_session),status:strOrDefault(row.status,"active"),archivedAt:str2(row.archived_at),createdAt:String(row.created_at)}}function getRepoPath(){try{return execSync8("git rev-parse --show-toplevel",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return process.cwd()}}async function resolveTaskId(idOrSeq,repoPath){let sql=await getConnection(),repo=repoPath??getRepoPath(),projectSeqMatch=idOrSeq.match(/^([^#]+)#(\d+)$/);if(projectSeqMatch&&!idOrSeq.startsWith("#")){let[,projectName,seqStr]=projectSeqMatch,seq2=Number.parseInt(seqStr,10);if(Number.isNaN(seq2))return null;let rows2=await sql`
|
|
862
862
|
SELECT t.id FROM tasks t
|
|
863
863
|
JOIN projects p ON t.project_id = p.id
|
|
864
864
|
WHERE p.name = ${projectName} AND t.seq = ${seq2}
|
|
@@ -1260,15 +1260,15 @@ Your role adapts based on workspace maturity:
|
|
|
1260
1260
|
</constraints>
|
|
1261
1261
|
`,GENIE_SOUL_TEMPLATE,GENIE_HEARTBEAT_TEMPLATE;var init_templates=__esm(()=>{init_defaults();GENIE_SOUL_TEMPLATE=["# Genie Specialist \u2014 Soul","","You are the genie workspace specialist. You guide users through the genie workflow and orchestrate agents.","","## The Genie Pipeline","","Every idea follows this pipeline:","","```","brainstorm \u2192 wish \u2192 work \u2192 review \u2192 ship","```","","1. **Brainstorm** \u2014 Explore the idea. Use `/brainstorm` to think through scope, tradeoffs, and approach.","2. **Wish** \u2014 Structure the idea into an actionable plan with acceptance criteria, execution groups, and validation commands. Use `/wish` to create one.","3. **Work** \u2014 Execute the wish. Use `/work` to dispatch engineers per execution group.","4. **Review** \u2014 Validate the work against wish criteria. Use `/review` to check compliance.","5. **Ship** \u2014 Merge, release, deploy. The pipeline ensures quality before shipping.","","## Genie Commands Reference","","### Agent Management","```bash","genie spawn <name> # Start an agent","genie kill <name> # Force kill an agent","genie stop <name> # Stop (preserves session)","genie resume [name] # Resume a suspended agent","genie ls # List agents with status","genie log [agent] # Unified observability feed","genie read <name> # Read terminal output","genie history <name> # Compressed session history","genie answer <name> <choice> # Answer a prompt for an agent","```","","### Agent Communication","```bash","genie agent send '<msg>' --to <name> # Direct message","genie agent send '<msg>' --broadcast # Team broadcast","genie agent inbox # View inbox","genie agent brief --team <name> # Cold-start summary","```","","### Team Orchestration","```bash","genie team create <name> --repo <path> --wish <slug> # Launch autonomous team","genie team hire <name> --team <team> # Add to team","genie team fire <name> --team <team> # Remove from team","genie team list # List teams","genie team disband <name> # Disband team","```","","### Task & Wish Management","```bash","genie task create --title 'x' # Create task","genie task list # List tasks","genie task status <slug> # Wish group status","genie task done <ref> # Mark done","genie task board # Planning board","```","","### Workspace","```bash","genie init # Initialize workspace","genie init agent <name> # Scaffold new agent","genie serve # Start infrastructure","genie doctor # Diagnostic checks","```","","## Concierge \u2192 Orchestrator Transition","","Detect workspace maturity and adapt:","","**Concierge mode** activates when:","- Workspace has 0-1 agents (just the default genie agent)","- No wishes exist yet","- User appears new to genie","","In concierge mode:","- Explain concepts with examples","- Suggest creating a first agent or brainstorming a first wish","- Walk through the pipeline step by step","","**Orchestrator mode** activates when:","- Workspace has 2+ agents","- Wishes exist with execution groups","- User gives direct commands","","In orchestrator mode:","- Route work to the right agents","- Monitor progress across teams","- Summarize status concisely","- Suggest next pipeline steps based on current state","","## Agent Analysis Capability","","When invoked in a workspace with existing agents (from genie or other systems), analyze their setup:","","### Analysis Process","1. List all directories under `agents/` (and any discovered via tree scan)","2. For each agent directory, check:"," - Has `AGENTS.md`? (identity file with frontmatter)"," - Has `SOUL.md`? (personality and knowledge)"," - Has `HEARTBEAT.md`? (autonomous checklist)"," - Has `.claude/settings.local.json`? (Claude Code config)"," - Frontmatter fields present vs. missing","3. Compare against genie conventions:"," - Missing files \u2192 propose creation with templates"," - Incomplete frontmatter \u2192 propose mini-wizard"," - Non-standard structure \u2192 explain conventions, offer migration","4. Present proposals as a checklist \u2014 never auto-modify",""].join(`
|
|
1262
1262
|
`),GENIE_HEARTBEAT_TEMPLATE=["# Heartbeat \u2014 Genie Specialist","","Run this checklist on every iteration. Exit early if nothing actionable.","","## Checklist","","### 1. Workspace State Check","Verify workspace health before doing anything else.","- Is `genie serve` running? If not, suggest starting it.","- Are there registered agents? List them with `genie ls`.","- Any agents in error/crashed state? Flag for user attention.","","### 2. Pending Agents Check","Look for agents waiting to be initialized.","- Check `.genie/pending-agents.json` for queued discoveries.","- If pending agents exist, notify the user and offer to initialize them.","- If new `AGENTS.md` files appeared outside `agents/`, flag for import.","","### 3. Wish Status Check","Review active work across the workspace.","- Check `genie task board` for in-progress wishes.","- For each active wish, check execution group progress.","- Flag blocked groups or stale tasks (no progress in 30+ minutes).","- Summarize: X wishes active, Y groups complete, Z blocked.","","### 4. Generate Suggestions","Based on workspace state, suggest the next most valuable action:",'- **Empty workspace** \u2192 "Start with /brainstorm to explore an idea"','- **Has brainstorm, no wish** \u2192 "Ready to structure this? Run /wish"','- **Has wish, no workers** \u2192 "Dispatch workers with /work"','- **Work complete** \u2192 "Time to review: /review"','- **Review passed** \u2192 "Ship it \u2014 merge the PR"','- **Agents from other systems** \u2192 "I can analyze your agents \u2014 want a compatibility report?"',"","### 5. Exit If Nothing Actionable","If workspace is healthy, no pending agents, no active wishes, and no suggestions \u2014 exit.","Don't create busywork. The user will invoke you when needed.",""].join(`
|
|
1263
|
-
`)});var exports_session={};__export(exports_session,{sessionCommand:()=>sessionCommand,sanitizeWindowName:()=>sanitizeWindowName,getAgentsFilePath:()=>getAgentsFilePath,buildClaudeCommand:()=>buildClaudeCommand2});import{spawnSync as spawnSync2}from"child_process";import{createHash as createHash4,randomUUID as randomUUID7}from"crypto";import{existsSync as existsSync28}from"fs";import{basename as basename5,join as join31}from"path";function shortPathHash(p){return createHash4("md5").update(p).digest("hex").slice(0,4)}function getAgentsFilePath(){let agentsPath=join31(process.cwd(),"AGENTS.md");if(existsSync28(agentsPath))return agentsPath;return null}async function resolveSessionLeaderName(teamName){try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return await resolveLeaderName2(teamName)}catch{return teamName}}async function ensureNativeTeamForLeader(teamName,cwd,sessionId){let leaderName=await resolveSessionLeaderName(teamName);await ensureNativeTeamWithSessionId(teamName,`Genie team: ${teamName}`,sessionId,leaderName),await registerNativeMember(teamName,{agentName:basename5(cwd),agentType:leaderName,color:"blue",cwd})}function buildClaudeCommand2(teamName,systemPromptFile,continueName,leaderName,sessionId){return buildTeamLeadCommand(teamName,{systemPromptFile,continueName,leaderName,sessionId})}async function registerSessionInRegistry(sessionName,windowName,workspaceDir){try{let target=`${sessionName}:${windowName}`,paneId=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_id}'`)).trim(),now=new Date().toISOString(),sanitized=sanitizeTeamName(windowName),leaderName=await resolveSessionLeaderName(windowName),sanitizedLeader=sanitizeTeamName(leaderName);await register({id:`${sanitized}-${sanitizedLeader}`,paneId,session:sessionName,team:windowName,role:leaderName,worktree:null,startedAt:now,state:"working",lastStateChange:now,repoPath:workspaceDir,provider:"claude",transport:"tmux",nativeTeamEnabled:!0,nativeAgentId:`${sanitizedLeader}@${sanitized}`});let agentIdentity=await findOrCreateAgent(leaderName,sanitized,leaderName),pid=null;try{let pidStr=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_pid}'`)).trim(),parsed=Number.parseInt(pidStr,10);if(parsed>0)pid=parsed}catch{}await createAndLinkExecutor(agentIdentity.id,"claude","tmux",{pid,tmuxSession:sessionName,tmuxPaneId:paneId,tmuxWindow:windowName,state:"spawning",repoPath:workspaceDir})}catch{}}async function resolveWindowName(sessionName,cwd){let baseName=sanitizeWindowName(basename5(cwd));if(!await findWindowByName(sessionName,baseName))return baseName;if(await getWindowEnv(`${sessionName}:${baseName}`,"GENIE_CWD")===cwd)return baseName;return`${baseName}-${shortPathHash(cwd)}`}async function createSession2(sessionName,windowName,workspaceDir,systemPromptFile,leaderName){let{sessionId,shouldResume}=await resolveOrMintLeadSessionId(windowName,workspaceDir);if(await ensureNativeTeamForLeader(windowName,workspaceDir,sessionId),console.log(`Native team "${windowName}" ready at ~/.claude/teams/${sanitizeTeamName(windowName)}/`),console.log(`Creating session "${sessionName}"...`),!await createSession(sessionName))console.error(`Failed to create session "${sessionName}"`),process.exit(1);let firstWindow=(await listWindows(sessionName))[0];if(!firstWindow)console.error(`Failed to find initial window in session "${sessionName}"`),process.exit(1);await executeTmux2(`rename-window -t ${shellQuote(firstWindow.id)} ${shellQuote(windowName)}`),await executeTmux2(`set-window-option -t ${shellQuote(firstWindow.id)} automatic-rename off`),await setWindowEnv(`${sessionName}:${windowName}`,"GENIE_CWD",workspaceDir);let target=`${sessionName}:${windowName}`,cdCmd=`cd ${shellQuote(workspaceDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`);let agentName=basename5(workspaceDir),continueName=sanitizeTeamName(windowName),cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,shouldResume?continueName:void 0,leaderName,shouldResume?void 0:sessionId);await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),console.log(`Started Claude Code as ${agentName} in ${workspaceDir}`);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workspaceDir)}async function launchWithContinueFallback(target,windowName,workspaceDir,systemPromptFile,leaderName,sessionId,shouldResume){let continueName=sanitizeTeamName(windowName),cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,shouldResume?continueName:void 0,leaderName,shouldResume?void 0:sessionId);if(await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),shouldResume){await new Promise((r)=>setTimeout(r,3000));let afterCmd=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_current_command}'`)).trim();if(["bash","zsh","sh","fish"].includes(afterCmd)){console.log("Resume failed unexpectedly, starting fresh session...");let freshId=randomUUID7();await ensureNativeTeamForLeader(windowName,workspaceDir,freshId);let freshCmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,void 0,leaderName,freshId);await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(freshCmd)} Enter`)}}}async function focusTeamWindow(sessionName,windowName,workingDir,systemPromptFile,leaderName){if((await ensureTeamWindow(sessionName,windowName,workingDir)).created){console.log(`Created team window "${windowName}"`),await setWindowEnv(`${sessionName}:${windowName}`,"GENIE_CWD",workingDir);let{sessionId,shouldResume}=await resolveOrMintLeadSessionId(windowName,workingDir);await ensureNativeTeamForLeader(windowName,workingDir,sessionId);let target=`${sessionName}:${windowName}`,cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`),await launchWithContinueFallback(target,windowName,workingDir,systemPromptFile,leaderName,sessionId,shouldResume),console.log(`Started Claude Code as ${basename5(workingDir)}@${sanitizeTeamName(windowName)} in ${workingDir}`);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workingDir)}else{let target=`${sessionName}:${windowName}`,currentCmd=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_current_command}'`)).trim();if(["bash","zsh","sh","fish"].includes(currentCmd)){console.log(`Claude Code not running in "${windowName}", relaunching...`);let{sessionId,shouldResume}=await resolveOrMintLeadSessionId(windowName,workingDir);await ensureNativeTeamForLeader(windowName,workingDir,sessionId);let cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`),await launchWithContinueFallback(target,windowName,workingDir,systemPromptFile,leaderName,sessionId,shouldResume);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workingDir)}}await executeTmux2(`select-window -t ${shellQuote(`${sessionName}:${windowName}`)}`),console.log(`Focused team window "${windowName}"`)}function sanitizeWindowName(name){return name.replace(/\./g,"-")}async function deriveWindowName(sessionName,workspaceDir,team){if(team)return sanitizeWindowName(team);if(await findSessionByName(sessionName))return sanitizeWindowName(await resolveWindowName(sessionName,workspaceDir));return sanitizeWindowName(basename5(workspaceDir))}async function handleReset(sessionName,windowName){let existing=await findSessionByName(sessionName);if(existing){let windows=await listWindows(existing.id);console.log(`Resetting session "${sessionName}"...`),await killSession(existing.id),await Promise.all(windows.map((w)=>deleteNativeTeam(w.name)))}else await deleteNativeTeam(windowName)}function attachToWindow(sessionName,windowName){console.log("Attaching...");let target=`${sessionName}:${windowName}`,cmd=process.env.TMUX?"switch-client":"attach",{genieTmuxPrefix:genieTmuxPrefix2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper)),{tmuxBin:tmuxBin2}=(init_ensure_tmux(),__toCommonJS(exports_ensure_tmux));spawnSync2(tmuxBin2(),[...genieTmuxPrefix2(),cmd,"-t",target],{stdio:"inherit"})}async function reconcileLeaderConfigs(){try{let{readdirSync:readdirSync8,readFileSync:readFileSync19,writeFileSync:writeFileSync12}=await import("fs"),{join:join32}=await import("path"),{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),teamsDir=join32(process.env.HOME??"/root",".claude","teams"),teams=readdirSync8(teamsDir);for(let team of teams)try{let configPath2=join32(teamsDir,team,"config.json"),raw=readFileSync19(configPath2,"utf-8"),config=JSON.parse(raw);if(config.leadAgentId?.startsWith("team-lead@")){let actualLeader=await resolveLeaderName2(team),sanitized=sanitizeTeamName(team);config.leadAgentId=`${sanitizeTeamName(actualLeader)}@${sanitized}`,writeFileSync12(configPath2,JSON.stringify(config,null,2)),console.log(`[reconcile] Updated leadAgentId for team "${team}": ${config.leadAgentId}`)}}catch{}}catch{}}async function launchInsideTmux(windowName,workspaceDir,systemPromptFile,leaderName){let{sessionId,shouldResume}=await resolveOrMintLeadSessionId(windowName,workspaceDir);if(shouldResume){let continueName=sanitizeTeamName(windowName);await ensureNativeTeamForLeader(windowName,workspaceDir,sessionId);let cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,continueName,leaderName,void 0),{execSync:execSyncCmd}=__require("child_process");execSyncCmd(cmd,{stdio:"inherit",cwd:workspaceDir})}else{let suffix=Date.now().toString(36).slice(-4),currentWindowName=`${windowName}-${suffix}`;await executeTmux2(`rename-window ${shellQuote(currentWindowName)}`),await ensureNativeTeamForLeader(currentWindowName,workspaceDir,sessionId);let cmd=buildClaudeCommand2(currentWindowName,systemPromptFile||void 0,void 0,leaderName,sessionId),{execSync:execSyncCmd}=__require("child_process");execSyncCmd(cmd,{stdio:"inherit",cwd:workspaceDir})}}async function sessionCommand(options={}){await reconcileStaleSpawns(),await reconcileLeaderConfigs();let workspaceDir=options.dir??process.cwd(),sessionName=options.name??sanitizeWindowName(basename5(workspaceDir));try{let windowName=await deriveWindowName(sessionName,workspaceDir,options.team),leaderName=await resolveSessionLeaderName(windowName);if(options.reset)await handleReset(sessionName,windowName);let session=await findSessionByName(sessionName),systemPromptFile=getAgentsFilePath();if(!systemPromptFile)if(await esm_default4({message:"No agent found in this directory. Scaffold one?",default:!0}))scaffoldAgentFiles(workspaceDir),systemPromptFile=join31(workspaceDir,"AGENTS.md"),console.log("Created SOUL.md, HEARTBEAT.md, and AGENTS.md");else console.error("AGENTS.md required. Run `genie` again to scaffold."),process.exit(1);if(!session)await createSession2(sessionName,windowName,workspaceDir,systemPromptFile,leaderName),attachToWindow(sessionName,windowName);else if(process.env.TMUX)await launchInsideTmux(windowName,workspaceDir,systemPromptFile,leaderName);else console.log(`Session "${sessionName}" already exists`),await focusTeamWindow(sessionName,windowName,workspaceDir,systemPromptFile,leaderName),attachToWindow(sessionName,windowName)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}var init_session=__esm(()=>{init_esm14();init_agent_registry();init_agent_registry();init_claude_native_teams();init_executor_registry();init_team_lead_command();init_tmux();init_templates()});var exports_team_auto_spawn={};__export(exports_team_auto_spawn,{isTeamActive:()=>isTeamActive,isAgentAlive:()=>isAgentAlive,ensureTeamLead:()=>ensureTeamLead});import{existsSync as existsSync29}from"fs";import{join as join32}from"path";function getSystemPromptFile(workingDir){let agentsPath=join32(workingDir,"AGENTS.md");if(existsSync29(agentsPath))return agentsPath;return null}async function ensureSession(teamName){let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),teamConfig=await getTeam2(teamName);if(teamConfig?.tmuxSessionName){if(await findSessionByName(teamConfig.tmuxSessionName))return teamConfig.tmuxSessionName}if(!teamConfig){let current=await getCurrentSessionName();if(current)return current}let sessionName=teamConfig?.tmuxSessionName??sanitizeTeamName(teamName);try{await createSession(sessionName)}catch(error2){if(!(error2 instanceof Error?error2.message:String(error2)).includes("duplicate session"))throw error2}return sessionName}async function isTeamActive(teamName){if(!await loadConfig(teamName))return!1;let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),sessionName=(await getTeam2(teamName))?.tmuxSessionName??await getCurrentSessionName()??sanitizeTeamName(teamName);if(!await findSessionByName(sessionName))return!1;try{let windows=await listWindows(sessionName),sanitized=sanitizeTeamName(teamName);return windows.some((w)=>w.name===sanitized||w.name===teamName)}catch{return!1}}async function isAgentAlive(agentName){try{let{list:list2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),match=(await list2()).find((a)=>a.id===agentName||a.role===agentName);if(!match?.paneId)return!1;return resolveWorkerLivenessByTransport(match)}catch{return!1}}async function ensureTeamLead(teamName,workingDir){let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),targetSession=(await getTeam2(teamName))?.tmuxSessionName??await getCurrentSessionName()??sanitizeTeamName(teamName);if(await isTeamActive(teamName))return{created:!1,session:targetSession,window:sanitizeWindowName(teamName)};let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leaderName=await resolveLeaderName2(teamName),{sessionId,shouldResume}=await resolveOrMintLeadSessionId(teamName,workingDir);await ensureNativeTeamWithSessionId(teamName,`Genie team: ${teamName}`,sessionId,leaderName),await registerNativeMember(teamName,{agentName:leaderName,agentType:"general-purpose",color:"blue",cwd:workingDir});let session=await ensureSession(teamName),windowName=sanitizeWindowName(teamName),teamWindow=await ensureTeamWindow(session,windowName,workingDir);if(teamWindow.created){let systemPromptFile=getSystemPromptFile(workingDir),target=`${session}:${windowName}`,cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`);let cmd=buildTeamLeadCommand(teamName,{systemPromptFile:systemPromptFile??void 0,leaderName,sessionId,resume:shouldResume});await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),await recordTeamLeadExecutor({teamName,leaderName,session,windowName,windowId:teamWindow.windowId,paneId:teamWindow.paneId,sessionId,workingDir}).catch(()=>{})}return{created:teamWindow.created,session,window:windowName}}async function recordTeamLeadExecutor(opts){let sanitizedTeam=sanitizeTeamName(opts.teamName),agentIdentity=await findOrCreateAgent(opts.leaderName,sanitizedTeam,opts.leaderName);await terminateActiveExecutor(agentIdentity.id);let pid=null;try{let target=`${opts.session}:${opts.windowName}`,pidStr=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_pid}'`)).trim(),parsed=Number.parseInt(pidStr,10);if(parsed>0)pid=parsed}catch{}await createAndLinkExecutor(agentIdentity.id,"claude","tmux",{pid,tmuxSession:opts.session,tmuxPaneId:opts.paneId,tmuxWindow:opts.windowName,tmuxWindowId:opts.windowId??null,claudeSessionId:opts.sessionId,state:"spawning",repoPath:opts.workingDir})}var init_team_auto_spawn=__esm(()=>{init_session();init_agent_registry();init_claude_native_teams();init_executor_registry();init_team_lead_command();init_tmux()});var exports_inbox_watcher={};__export(exports_inbox_watcher,{stopInboxWatcher:()=>stopInboxWatcher,startInboxWatcher:()=>startInboxWatcher,resetSpawnFailures:()=>resetSpawnFailures,resetNoWorkingDirWarned:()=>resetNoWorkingDirWarned,getInboxPollIntervalMs:()=>getInboxPollIntervalMs,checkInboxes:()=>checkInboxes});function getInboxPollIntervalMs(){let env=process.env.GENIE_INBOX_POLL_MS;if(env!==void 0){if(env==="")return INBOX_POLL_INTERVAL_MS;let parsed=Number(env);if(!Number.isNaN(parsed)&&parsed>=0)return parsed}return INBOX_POLL_INTERVAL_MS}function resetSpawnFailures(){spawnFailures.clear()}function resetNoWorkingDirWarned(){noWorkingDirWarned.clear()}function resolveSessionKeyFromMessage(teamName,firstUnreadText){if(!firstUnreadText)return teamName;let header=parseRoutingHeader(firstUnreadText);return header?resolveSessionKey(teamName,header):teamName}function shouldWarnMissingWorkingDir(teamName){let now=Date.now(),lastWarned=noWorkingDirWarned.get(teamName)??0;if(now-lastWarned<NO_WORKING_DIR_RECHECK_MS)return!1;return noWorkingDirWarned.set(teamName,now),!0}async function attemptSpawn(deps,teamName,workingDir,sessionKey2,currentFailures){try{return await deps.ensureTeamLead(teamName,workingDir),spawnFailures.set(sessionKey2,0),!0}catch(err){let newCount=currentFailures+1;spawnFailures.set(sessionKey2,newCount);let message=err instanceof Error?err.message:String(err);return deps.warn(`[inbox-watcher] Failed to spawn team-lead for "${teamName}" (attempt ${newCount}/${MAX_SPAWN_FAILURES}): ${message}`),!1}}async function checkInboxes(deps=defaultDeps2){if(getInboxPollIntervalMs()===0)return[];let teamsWithUnread=await deps.listTeamsWithUnreadInbox(),spawned=[];for(let{teamName,workingDir,firstUnreadText}of teamsWithUnread){let sessionKey2=resolveSessionKeyFromMessage(teamName,firstUnreadText),failures=spawnFailures.get(sessionKey2)??0;if(failures>=MAX_SPAWN_FAILURES){deps.warn(`[inbox-watcher] Skipping "${sessionKey2}" \u2014 ${failures} consecutive spawn failures`);continue}if(await deps.isTeamActive(teamName))continue;if(!workingDir){if(shouldWarnMissingWorkingDir(teamName))deps.warn(`[inbox-watcher] Cannot spawn team-lead for "${teamName}" \u2014 no workingDir in config`);continue}if(noWorkingDirWarned.delete(teamName),await attemptSpawn(deps,teamName,workingDir,sessionKey2,failures))spawned.push(teamName)}return spawned}function startInboxWatcher(deps=defaultDeps2){return setInterval(()=>{checkInboxes(deps).catch((err)=>{let message=err instanceof Error?err.message:String(err);deps.warn(`[inbox-watcher] Poll error: ${message}`)})},getInboxPollIntervalMs())}function stopInboxWatcher(handle){clearInterval(handle)}var defaultDeps2,INBOX_POLL_INTERVAL_MS=30000,MAX_SPAWN_FAILURES=3,NO_WORKING_DIR_RECHECK_MS=3600000,spawnFailures,noWorkingDirWarned;var init_inbox_watcher=__esm(()=>{init_claude_native_teams();init_routing_header();init_team_auto_spawn();defaultDeps2={listTeamsWithUnreadInbox,isTeamActive:(teamName)=>isTeamActive(teamName),isAgentAlive:(agentName)=>isAgentAlive(agentName),ensureTeamLead:(teamName,workingDir)=>ensureTeamLead(teamName,workingDir),warn:(msg)=>console.warn(msg)};spawnFailures=new Map,noWorkingDirWarned=new Map});var exports_msg={};__export(exports_msg,{suggestRelayLeader:()=>suggestRelayLeader,resolveSenderTeams:()=>resolveSenderTeams,registerSendInboxCommands:()=>registerSendInboxCommands,detectSenderIdentity:()=>detectSenderIdentity,checkSendScope:()=>checkSendScope});import{readFile as readFile7}from"fs/promises";import{homedir as homedir22}from"os";import{join as join33}from"path";async function getRegistry(){if(!_registry)_registry=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));return _registry}async function getTaskService(){if(!_taskService)_taskService=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService}async function getTeamManager(){if(!_teamManager)_teamManager=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return _teamManager}async function getMailbox(){if(!_mailbox)_mailbox=await Promise.resolve().then(() => (init_mailbox(),exports_mailbox));return _mailbox}async function detectSenderIdentity(teamName){let envName=process.env.GENIE_AGENT_NAME;if(envName)return envName;let paneId=process.env.TMUX_PANE;if(!paneId)return"cli";let registry=await getRegistry(),worker=typeof registry.findByPane==="function"?await registry.findByPane(paneId):null;if(worker)return worker.role??worker.id;let resolvedTeam=teamName??process.env.GENIE_TEAM;if(resolvedTeam){let memberName=await findMemberByPane(resolvedTeam,paneId);if(memberName)return memberName}return"cli"}async function findMemberByPane(teamName,paneId){let configDir=process.env.CLAUDE_CONFIG_DIR??join33(homedir22(),".claude"),sanitized=teamName.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase(),cfgPath=join33(configDir,"teams",sanitized,"config.json");try{let raw=await readFile7(cfgPath,"utf-8");return(JSON.parse(raw).members??[]).find((m)=>m.tmuxPaneId===paneId)?.name??null}catch{return null}}async function resolveLeaderAlias(recipient,teamContext){if(recipient!=="team-lead")return recipient;let teamName=teamContext??process.env.GENIE_TEAM;if(teamName)return(await getTeamManager()).resolveLeaderName(teamName);return recipient}async function checkSendScope(_repoPath,sender,recipient){if(sender==="cli")return null;let teams=await(await getTeamManager()).listTeams(),senderTeams=resolveSenderTeams(teams,sender);if(senderTeams.length===0)return null;for(let team of senderTeams)if(isRecipientInTeam(team,recipient))return null;let teamNames=senderTeams.map((t)=>t.name).join(", ");return`Scope violation: "${recipient}" is not in sender's team(s): ${teamNames}`}function childReachbackAllowed(child,parent){if(parent.allowChildReachback?.some((prefix)=>child.name.startsWith(prefix)))return!0;return DEFAULT_REACHBACK_PREFIXES.some((prefix)=>child.name.startsWith(prefix))}function walkParentChain(teams,start,visited,out){let current=start,depth=0;while(current.parentTeam&&depth<PARENT_CHAIN_MAX_DEPTH){if(visited.has(current.parentTeam))return;let parent=teams.find((t)=>t.name===current.parentTeam);if(!parent)return;if(!childReachbackAllowed(current,parent))return;out.push(parent),visited.add(parent.name),current=parent,depth++}}function resolveSenderTeams(teams,sender){let direct=teams.filter((t)=>t.members.includes(sender)),visited=new Set(direct.map((t)=>t.name)),result2=[...direct];for(let team of direct)walkParentChain(teams,team,visited,result2);if(teams.some((t)=>t.leader===sender)||sender==="team-lead"){let envTeam=process.env.GENIE_TEAM;if(envTeam){let leaderTeam=teams.find((t)=>t.name===envTeam);if(leaderTeam&&!visited.has(leaderTeam.name))result2.push(leaderTeam),visited.add(leaderTeam.name),walkParentChain(teams,leaderTeam,visited,result2)}}return result2}async function suggestRelayLeader(sender){if(sender==="cli")return null;let teams=await(await getTeamManager()).listTeams(),reachable=resolveSenderTeams(teams,sender);if(reachable.length===0)return null;let target=reachable[0];return{leader:target.leader??target.name,team:target.name}}function isRecipientInTeam(team,recipient){if(team.members.includes(recipient)||recipient===team.leader||recipient==="team-lead")return!0;if(recipient.startsWith(`${team.name}-`)){let roleOnly=recipient.slice(team.name.length+1);if(team.members.includes(roleOnly))return!0}return!1}async function findAgentTeam(_repoPath,agentName){let teams=await(await getTeamManager()).listTeams(),memberTeam=teams.find((t)=>t.members.includes(agentName));if(memberTeam)return memberTeam;if(agentName==="team-lead"||teams.some((t)=>t.leader===agentName)){let envTeam=process.env.GENIE_TEAM;if(envTeam)return teams.find((t)=>t.name===envTeam)??null;let leaderTeam=teams.find((t)=>t.leader===agentName);if(leaderTeam)return leaderTeam}return null}function localActor(name){return{actorType:"local",actorId:name}}async function resolveTeamName2(explicit,repoPath,from){if(explicit)return explicit;let name=(await findAgentTeam(repoPath,from))?.name??process.env.GENIE_TEAM;if(!name)console.error("Error: Could not auto-detect team. Use --team <name>."),process.exit(1);return name}async function handleInbox(agent,options){let ts3=await getTaskService(),resolvedAgent=agent??await detectSenderIdentity(),actor=localActor(resolvedAgent),conversations=await ts3.listConversations(actor);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log(`No conversations for "${resolvedAgent}".`);return}console.log(""),console.log(`INBOX: ${resolvedAgent}`),console.log("\u2500".repeat(60));for(let conv of conversations)await printConversationSummary(ts3,conv)}async function printConversationSummary(ts3,conv){let messages2=await ts3.getMessages(conv.id,{limit:1}),lastMsg=messages2.length>0?messages2[messages2.length-1]:null,name=conv.name??conv.id,type2=conv.type==="dm"?"DM":"Group",linked=conv.linkedEntity?` [${conv.linkedEntity}:${conv.linkedEntityId}]`:"",preview=lastMsg?truncate2(lastMsg.body,50):"(no messages)",time=lastMsg?formatTime(lastMsg.createdAt):"";if(console.log(` ${padRight(name,30)} ${padRight(type2,6)}${linked}`),lastMsg)console.log(` ${time} ${lastMsg.senderId}: ${preview}`);console.log("")}async function handleChatThread(messageId,options){let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),parentMsgId=Number(messageId),parentMsg=await ts3.getMessage(parentMsgId);if(!parentMsg)console.error(`Error: Message not found: ${messageId}`),process.exit(1);let conv=await ts3.findOrCreateConversation({type:"group",name:options.name??`Thread on message #${parentMsgId}`,parentMessageId:parentMsgId,createdBy:actor,members:[actor]});console.log(`Thread created: ${conv.id}`),console.log(` Parent message: #${parentMsgId} in ${parentMsg.conversationId}`),console.log(` Name: ${conv.name??"(unnamed)"}`)}function printConversationTable(conversations){console.log(` ${padRight("ID",20)} ${padRight("NAME",25)} ${padRight("TYPE",8)} ${padRight("LINKED",20)} UPDATED`),console.log(` ${"\u2500".repeat(80)}`);for(let c of conversations){let name=truncate2(c.name??"(unnamed)",23),linked=c.linkedEntity?`${c.linkedEntity}:${c.linkedEntityId}`:"-",updated=formatTime(c.updatedAt);console.log(` ${padRight(c.id,20)} ${padRight(name,25)} ${padRight(c.type,8)} ${padRight(linked,20)} ${updated}`)}console.log(`
|
|
1263
|
+
`)});var exports_session={};__export(exports_session,{sessionCommand:()=>sessionCommand,sanitizeWindowName:()=>sanitizeWindowName,getAgentsFilePath:()=>getAgentsFilePath,buildClaudeCommand:()=>buildClaudeCommand2});import{spawnSync as spawnSync3}from"child_process";import{createHash as createHash4,randomUUID as randomUUID7}from"crypto";import{existsSync as existsSync28}from"fs";import{basename as basename5,join as join31}from"path";function shortPathHash(p){return createHash4("md5").update(p).digest("hex").slice(0,4)}function getAgentsFilePath(){let agentsPath=join31(process.cwd(),"AGENTS.md");if(existsSync28(agentsPath))return agentsPath;return null}async function resolveSessionLeaderName(teamName){try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return await resolveLeaderName2(teamName)}catch{return teamName}}async function ensureNativeTeamForLeader(teamName,cwd,sessionId){let leaderName=await resolveSessionLeaderName(teamName);await ensureNativeTeamWithSessionId(teamName,`Genie team: ${teamName}`,sessionId,leaderName),await registerNativeMember(teamName,{agentName:basename5(cwd),agentType:leaderName,color:"blue",cwd})}function buildClaudeCommand2(teamName,systemPromptFile,continueName,leaderName,sessionId){return buildTeamLeadCommand(teamName,{systemPromptFile,continueName,leaderName,sessionId})}async function registerSessionInRegistry(sessionName,windowName,workspaceDir){try{let target=`${sessionName}:${windowName}`,paneId=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_id}'`)).trim(),now=new Date().toISOString(),sanitized=sanitizeTeamName(windowName),leaderName=await resolveSessionLeaderName(windowName),sanitizedLeader=sanitizeTeamName(leaderName);await register({id:`${sanitized}-${sanitizedLeader}`,paneId,session:sessionName,team:windowName,role:leaderName,worktree:null,startedAt:now,state:"working",lastStateChange:now,repoPath:workspaceDir,provider:"claude",transport:"tmux",nativeTeamEnabled:!0,nativeAgentId:`${sanitizedLeader}@${sanitized}`});let agentIdentity=await findOrCreateAgent(leaderName,sanitized,leaderName),pid=null;try{let pidStr=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_pid}'`)).trim(),parsed=Number.parseInt(pidStr,10);if(parsed>0)pid=parsed}catch{}await createAndLinkExecutor(agentIdentity.id,"claude","tmux",{pid,tmuxSession:sessionName,tmuxPaneId:paneId,tmuxWindow:windowName,state:"spawning",repoPath:workspaceDir})}catch{}}async function resolveWindowName(sessionName,cwd){let baseName=sanitizeWindowName(basename5(cwd));if(!await findWindowByName(sessionName,baseName))return baseName;if(await getWindowEnv(`${sessionName}:${baseName}`,"GENIE_CWD")===cwd)return baseName;return`${baseName}-${shortPathHash(cwd)}`}async function createSession2(sessionName,windowName,workspaceDir,systemPromptFile,leaderName){let{sessionId,shouldResume}=await resolveOrMintLeadSessionId(windowName,workspaceDir);if(await ensureNativeTeamForLeader(windowName,workspaceDir,sessionId),console.log(`Native team "${windowName}" ready at ~/.claude/teams/${sanitizeTeamName(windowName)}/`),console.log(`Creating session "${sessionName}"...`),!await createSession(sessionName))console.error(`Failed to create session "${sessionName}"`),process.exit(1);let firstWindow=(await listWindows(sessionName))[0];if(!firstWindow)console.error(`Failed to find initial window in session "${sessionName}"`),process.exit(1);await executeTmux2(`rename-window -t ${shellQuote(firstWindow.id)} ${shellQuote(windowName)}`),await executeTmux2(`set-window-option -t ${shellQuote(firstWindow.id)} automatic-rename off`),await setWindowEnv(`${sessionName}:${windowName}`,"GENIE_CWD",workspaceDir);let target=`${sessionName}:${windowName}`,cdCmd=`cd ${shellQuote(workspaceDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`);let agentName=basename5(workspaceDir),continueName=sanitizeTeamName(windowName),cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,shouldResume?continueName:void 0,leaderName,shouldResume?void 0:sessionId);await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),console.log(`Started Claude Code as ${agentName} in ${workspaceDir}`);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workspaceDir)}async function launchWithContinueFallback(target,windowName,workspaceDir,systemPromptFile,leaderName,sessionId,shouldResume){let continueName=sanitizeTeamName(windowName),cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,shouldResume?continueName:void 0,leaderName,shouldResume?void 0:sessionId);if(await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),shouldResume){await new Promise((r)=>setTimeout(r,3000));let afterCmd=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_current_command}'`)).trim();if(["bash","zsh","sh","fish"].includes(afterCmd)){console.log("Resume failed unexpectedly, starting fresh session...");let freshId=randomUUID7();await ensureNativeTeamForLeader(windowName,workspaceDir,freshId);let freshCmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,void 0,leaderName,freshId);await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(freshCmd)} Enter`)}}}async function focusTeamWindow(sessionName,windowName,workingDir,systemPromptFile,leaderName){if((await ensureTeamWindow(sessionName,windowName,workingDir)).created){console.log(`Created team window "${windowName}"`),await setWindowEnv(`${sessionName}:${windowName}`,"GENIE_CWD",workingDir);let{sessionId,shouldResume}=await resolveOrMintLeadSessionId(windowName,workingDir);await ensureNativeTeamForLeader(windowName,workingDir,sessionId);let target=`${sessionName}:${windowName}`,cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`),await launchWithContinueFallback(target,windowName,workingDir,systemPromptFile,leaderName,sessionId,shouldResume),console.log(`Started Claude Code as ${basename5(workingDir)}@${sanitizeTeamName(windowName)} in ${workingDir}`);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workingDir)}else{let target=`${sessionName}:${windowName}`,currentCmd=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_current_command}'`)).trim();if(["bash","zsh","sh","fish"].includes(currentCmd)){console.log(`Claude Code not running in "${windowName}", relaunching...`);let{sessionId,shouldResume}=await resolveOrMintLeadSessionId(windowName,workingDir);await ensureNativeTeamForLeader(windowName,workingDir,sessionId);let cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`),await launchWithContinueFallback(target,windowName,workingDir,systemPromptFile,leaderName,sessionId,shouldResume);try{let sanitized=sanitizeTeamName(windowName),leaderName2=await resolveSessionLeaderName(windowName),agentIdentity=await findOrCreateAgent(leaderName2,sanitized,leaderName2);await terminateActiveExecutor(agentIdentity.id)}catch{}await registerSessionInRegistry(sessionName,windowName,workingDir)}}await executeTmux2(`select-window -t ${shellQuote(`${sessionName}:${windowName}`)}`),console.log(`Focused team window "${windowName}"`)}function sanitizeWindowName(name){return name.replace(/\./g,"-")}async function deriveWindowName(sessionName,workspaceDir,team){if(team)return sanitizeWindowName(team);if(await findSessionByName(sessionName))return sanitizeWindowName(await resolveWindowName(sessionName,workspaceDir));return sanitizeWindowName(basename5(workspaceDir))}async function handleReset(sessionName,windowName){let existing=await findSessionByName(sessionName);if(existing){let windows=await listWindows(existing.id);console.log(`Resetting session "${sessionName}"...`),await killSession(existing.id),await Promise.all(windows.map((w)=>deleteNativeTeam(w.name)))}else await deleteNativeTeam(windowName)}function attachToWindow(sessionName,windowName){console.log("Attaching...");let target=`${sessionName}:${windowName}`,cmd=process.env.TMUX?"switch-client":"attach",{genieTmuxPrefix:genieTmuxPrefix2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper)),{tmuxBin:tmuxBin2}=(init_ensure_tmux(),__toCommonJS(exports_ensure_tmux));spawnSync3(tmuxBin2(),[...genieTmuxPrefix2(),cmd,"-t",target],{stdio:"inherit"})}async function reconcileLeaderConfigs(){try{let{readdirSync:readdirSync8,readFileSync:readFileSync19,writeFileSync:writeFileSync12}=await import("fs"),{join:join32}=await import("path"),{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),teamsDir=join32(process.env.HOME??"/root",".claude","teams"),teams=readdirSync8(teamsDir);for(let team of teams)try{let configPath2=join32(teamsDir,team,"config.json"),raw=readFileSync19(configPath2,"utf-8"),config=JSON.parse(raw);if(config.leadAgentId?.startsWith("team-lead@")){let actualLeader=await resolveLeaderName2(team),sanitized=sanitizeTeamName(team);config.leadAgentId=`${sanitizeTeamName(actualLeader)}@${sanitized}`,writeFileSync12(configPath2,JSON.stringify(config,null,2)),console.log(`[reconcile] Updated leadAgentId for team "${team}": ${config.leadAgentId}`)}}catch{}}catch{}}async function launchInsideTmux(windowName,workspaceDir,systemPromptFile,leaderName){let{sessionId,shouldResume}=await resolveOrMintLeadSessionId(windowName,workspaceDir);if(shouldResume){let continueName=sanitizeTeamName(windowName);await ensureNativeTeamForLeader(windowName,workspaceDir,sessionId);let cmd=buildClaudeCommand2(windowName,systemPromptFile||void 0,continueName,leaderName,void 0),{execSync:execSyncCmd}=__require("child_process");execSyncCmd(cmd,{stdio:"inherit",cwd:workspaceDir})}else{let suffix=Date.now().toString(36).slice(-4),currentWindowName=`${windowName}-${suffix}`;await executeTmux2(`rename-window ${shellQuote(currentWindowName)}`),await ensureNativeTeamForLeader(currentWindowName,workspaceDir,sessionId);let cmd=buildClaudeCommand2(currentWindowName,systemPromptFile||void 0,void 0,leaderName,sessionId),{execSync:execSyncCmd}=__require("child_process");execSyncCmd(cmd,{stdio:"inherit",cwd:workspaceDir})}}async function sessionCommand(options={}){await reconcileStaleSpawns(),await reconcileLeaderConfigs();let workspaceDir=options.dir??process.cwd(),sessionName=options.name??sanitizeWindowName(basename5(workspaceDir));try{let windowName=await deriveWindowName(sessionName,workspaceDir,options.team),leaderName=await resolveSessionLeaderName(windowName);if(options.reset)await handleReset(sessionName,windowName);let session=await findSessionByName(sessionName),systemPromptFile=getAgentsFilePath();if(!systemPromptFile)if(await esm_default4({message:"No agent found in this directory. Scaffold one?",default:!0}))scaffoldAgentFiles(workspaceDir),systemPromptFile=join31(workspaceDir,"AGENTS.md"),console.log("Created SOUL.md, HEARTBEAT.md, and AGENTS.md");else console.error("AGENTS.md required. Run `genie` again to scaffold."),process.exit(1);if(!session)await createSession2(sessionName,windowName,workspaceDir,systemPromptFile,leaderName),attachToWindow(sessionName,windowName);else if(process.env.TMUX)await launchInsideTmux(windowName,workspaceDir,systemPromptFile,leaderName);else console.log(`Session "${sessionName}" already exists`),await focusTeamWindow(sessionName,windowName,workspaceDir,systemPromptFile,leaderName),attachToWindow(sessionName,windowName)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}var init_session=__esm(()=>{init_esm14();init_agent_registry();init_agent_registry();init_claude_native_teams();init_executor_registry();init_team_lead_command();init_tmux();init_templates()});var exports_team_auto_spawn={};__export(exports_team_auto_spawn,{isTeamActive:()=>isTeamActive,isAgentAlive:()=>isAgentAlive,ensureTeamLead:()=>ensureTeamLead});import{existsSync as existsSync29}from"fs";import{join as join32}from"path";function getSystemPromptFile(workingDir){let agentsPath=join32(workingDir,"AGENTS.md");if(existsSync29(agentsPath))return agentsPath;return null}async function ensureSession(teamName){let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),teamConfig=await getTeam2(teamName);if(teamConfig?.tmuxSessionName){if(await findSessionByName(teamConfig.tmuxSessionName))return teamConfig.tmuxSessionName}if(!teamConfig){let current=await getCurrentSessionName();if(current)return current}let sessionName=teamConfig?.tmuxSessionName??sanitizeTeamName(teamName);try{await createSession(sessionName)}catch(error2){if(!(error2 instanceof Error?error2.message:String(error2)).includes("duplicate session"))throw error2}return sessionName}async function isTeamActive(teamName){if(!await loadConfig(teamName))return!1;let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),sessionName=(await getTeam2(teamName))?.tmuxSessionName??await getCurrentSessionName()??sanitizeTeamName(teamName);if(!await findSessionByName(sessionName))return!1;try{let windows=await listWindows(sessionName),sanitized=sanitizeTeamName(teamName);return windows.some((w)=>w.name===sanitized||w.name===teamName)}catch{return!1}}async function isAgentAlive(agentName){try{let{list:list2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),match=(await list2()).find((a)=>a.id===agentName||a.role===agentName);if(!match?.paneId)return!1;return resolveWorkerLivenessByTransport(match)}catch{return!1}}async function ensureTeamLead(teamName,workingDir){let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),targetSession=(await getTeam2(teamName))?.tmuxSessionName??await getCurrentSessionName()??sanitizeTeamName(teamName);if(await isTeamActive(teamName))return{created:!1,session:targetSession,window:sanitizeWindowName(teamName)};let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leaderName=await resolveLeaderName2(teamName),{sessionId,shouldResume}=await resolveOrMintLeadSessionId(teamName,workingDir);await ensureNativeTeamWithSessionId(teamName,`Genie team: ${teamName}`,sessionId,leaderName),await registerNativeMember(teamName,{agentName:leaderName,agentType:"general-purpose",color:"blue",cwd:workingDir});let session=await ensureSession(teamName),windowName=sanitizeWindowName(teamName),teamWindow=await ensureTeamWindow(session,windowName,workingDir);if(teamWindow.created){let systemPromptFile=getSystemPromptFile(workingDir),target=`${session}:${windowName}`,cdCmd=`cd ${shellQuote(workingDir)}`;await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cdCmd)} Enter`);let cmd=buildTeamLeadCommand(teamName,{systemPromptFile:systemPromptFile??void 0,leaderName,sessionId,resume:shouldResume});await executeTmux2(`send-keys -t ${shellQuote(target)} ${shellQuote(cmd)} Enter`),await recordTeamLeadExecutor({teamName,leaderName,session,windowName,windowId:teamWindow.windowId,paneId:teamWindow.paneId,sessionId,workingDir}).catch(()=>{})}return{created:teamWindow.created,session,window:windowName}}async function recordTeamLeadExecutor(opts){let sanitizedTeam=sanitizeTeamName(opts.teamName),agentIdentity=await findOrCreateAgent(opts.leaderName,sanitizedTeam,opts.leaderName);await terminateActiveExecutor(agentIdentity.id);let pid=null;try{let target=`${opts.session}:${opts.windowName}`,pidStr=(await executeTmux2(`display -t ${shellQuote(target)} -p '#{pane_pid}'`)).trim(),parsed=Number.parseInt(pidStr,10);if(parsed>0)pid=parsed}catch{}await createAndLinkExecutor(agentIdentity.id,"claude","tmux",{pid,tmuxSession:opts.session,tmuxPaneId:opts.paneId,tmuxWindow:opts.windowName,tmuxWindowId:opts.windowId??null,claudeSessionId:opts.sessionId,state:"spawning",repoPath:opts.workingDir})}var init_team_auto_spawn=__esm(()=>{init_session();init_agent_registry();init_claude_native_teams();init_executor_registry();init_team_lead_command();init_tmux()});var exports_inbox_watcher={};__export(exports_inbox_watcher,{stopInboxWatcher:()=>stopInboxWatcher,startInboxWatcher:()=>startInboxWatcher,resetSpawnFailures:()=>resetSpawnFailures,resetNoWorkingDirWarned:()=>resetNoWorkingDirWarned,getInboxPollIntervalMs:()=>getInboxPollIntervalMs,checkInboxes:()=>checkInboxes});function getInboxPollIntervalMs(){let env=process.env.GENIE_INBOX_POLL_MS;if(env!==void 0){if(env==="")return INBOX_POLL_INTERVAL_MS;let parsed=Number(env);if(!Number.isNaN(parsed)&&parsed>=0)return parsed}return INBOX_POLL_INTERVAL_MS}function resetSpawnFailures(){spawnFailures.clear()}function resetNoWorkingDirWarned(){noWorkingDirWarned.clear()}function resolveSessionKeyFromMessage(teamName,firstUnreadText){if(!firstUnreadText)return teamName;let header=parseRoutingHeader(firstUnreadText);return header?resolveSessionKey(teamName,header):teamName}function shouldWarnMissingWorkingDir(teamName){let now=Date.now(),lastWarned=noWorkingDirWarned.get(teamName)??0;if(now-lastWarned<NO_WORKING_DIR_RECHECK_MS)return!1;return noWorkingDirWarned.set(teamName,now),!0}async function attemptSpawn(deps,teamName,workingDir,sessionKey2,currentFailures){try{return await deps.ensureTeamLead(teamName,workingDir),spawnFailures.set(sessionKey2,0),!0}catch(err){let newCount=currentFailures+1;spawnFailures.set(sessionKey2,newCount);let message=err instanceof Error?err.message:String(err);if(deps.warn(`[inbox-watcher] Failed to spawn team-lead for "${teamName}" (attempt ${newCount}/${MAX_SPAWN_FAILURES}): ${message}`),newCount===MAX_SPAWN_FAILURES)deps.emitDeadInbox({team_name:teamName,session_key:sessionKey2,failure_count:newCount,last_error_message:message.length>2048?`${message.slice(0,2045)}...`:message});return!1}}async function checkInboxes(deps=defaultDeps2){if(getInboxPollIntervalMs()===0)return[];let teamsWithUnread=await deps.listTeamsWithUnreadInbox(),spawned=[];for(let{teamName,workingDir,firstUnreadText}of teamsWithUnread){let sessionKey2=resolveSessionKeyFromMessage(teamName,firstUnreadText),failures=spawnFailures.get(sessionKey2)??0;if(failures>=MAX_SPAWN_FAILURES){deps.warn(`[inbox-watcher] Skipping "${sessionKey2}" \u2014 ${failures} consecutive spawn failures`);continue}if(await deps.isTeamActive(teamName))continue;if(!workingDir){if(shouldWarnMissingWorkingDir(teamName))deps.warn(`[inbox-watcher] Cannot spawn team-lead for "${teamName}" \u2014 no workingDir in config`);continue}if(noWorkingDirWarned.delete(teamName),await attemptSpawn(deps,teamName,workingDir,sessionKey2,failures))spawned.push(teamName)}return spawned}function startInboxWatcher(deps=defaultDeps2){return setInterval(()=>{checkInboxes(deps).catch((err)=>{let message=err instanceof Error?err.message:String(err);deps.warn(`[inbox-watcher] Poll error: ${message}`)})},getInboxPollIntervalMs())}function stopInboxWatcher(handle){clearInterval(handle)}var defaultDeps2,INBOX_POLL_INTERVAL_MS=30000,MAX_SPAWN_FAILURES=3,NO_WORKING_DIR_RECHECK_MS=3600000,spawnFailures,noWorkingDirWarned;var init_inbox_watcher=__esm(()=>{init_claude_native_teams();init_emit();init_routing_header();init_team_auto_spawn();defaultDeps2={listTeamsWithUnreadInbox,isTeamActive:(teamName)=>isTeamActive(teamName),isAgentAlive:(agentName)=>isAgentAlive(agentName),ensureTeamLead:(teamName,workingDir)=>ensureTeamLead(teamName,workingDir),warn:(msg)=>console.warn(msg),emitDeadInbox:(payload)=>{try{emitEvent("rot.inbox-watcher-spawn-loop.detected",payload)}catch{}}};spawnFailures=new Map,noWorkingDirWarned=new Map});var exports_msg={};__export(exports_msg,{suggestRelayLeader:()=>suggestRelayLeader,resolveSenderTeams:()=>resolveSenderTeams,registerSendInboxCommands:()=>registerSendInboxCommands,detectSenderIdentity:()=>detectSenderIdentity,checkSendScope:()=>checkSendScope});import{readFile as readFile7}from"fs/promises";import{homedir as homedir22}from"os";import{join as join33}from"path";async function getRegistry(){if(!_registry)_registry=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));return _registry}async function getTaskService(){if(!_taskService)_taskService=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService}async function getTeamManager(){if(!_teamManager)_teamManager=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return _teamManager}async function getMailbox(){if(!_mailbox)_mailbox=await Promise.resolve().then(() => (init_mailbox(),exports_mailbox));return _mailbox}async function detectSenderIdentity(teamName){let envName=process.env.GENIE_AGENT_NAME;if(envName)return envName;let paneId=process.env.TMUX_PANE;if(!paneId)return"cli";let registry=await getRegistry(),worker=typeof registry.findByPane==="function"?await registry.findByPane(paneId):null;if(worker)return worker.role??worker.id;let resolvedTeam=teamName??process.env.GENIE_TEAM;if(resolvedTeam){let memberName=await findMemberByPane(resolvedTeam,paneId);if(memberName)return memberName}return"cli"}async function findMemberByPane(teamName,paneId){let configDir=process.env.CLAUDE_CONFIG_DIR??join33(homedir22(),".claude"),sanitized=teamName.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase(),cfgPath=join33(configDir,"teams",sanitized,"config.json");try{let raw=await readFile7(cfgPath,"utf-8");return(JSON.parse(raw).members??[]).find((m)=>m.tmuxPaneId===paneId)?.name??null}catch{return null}}async function resolveLeaderAlias(recipient,teamContext){if(recipient!=="team-lead")return recipient;let teamName=teamContext??process.env.GENIE_TEAM;if(teamName)return(await getTeamManager()).resolveLeaderName(teamName);return recipient}async function checkSendScope(_repoPath,sender,recipient){if(sender==="cli")return null;let teams=await(await getTeamManager()).listTeams(),senderTeams=resolveSenderTeams(teams,sender);if(senderTeams.length===0)return null;for(let team of senderTeams)if(isRecipientInTeam(team,recipient))return null;let teamNames=senderTeams.map((t)=>t.name).join(", ");return`Scope violation: "${recipient}" is not in sender's team(s): ${teamNames}`}function childReachbackAllowed(child,parent){if(parent.allowChildReachback?.some((prefix)=>child.name.startsWith(prefix)))return!0;return DEFAULT_REACHBACK_PREFIXES.some((prefix)=>child.name.startsWith(prefix))}function walkParentChain(teams,start,visited,out){let current=start,depth=0;while(current.parentTeam&&depth<PARENT_CHAIN_MAX_DEPTH){if(visited.has(current.parentTeam))return;let parent=teams.find((t)=>t.name===current.parentTeam);if(!parent)return;if(!childReachbackAllowed(current,parent))return;out.push(parent),visited.add(parent.name),current=parent,depth++}}function resolveSenderTeams(teams,sender){let direct=teams.filter((t)=>t.members.includes(sender)),visited=new Set(direct.map((t)=>t.name)),result2=[...direct];for(let team of direct)walkParentChain(teams,team,visited,result2);if(teams.some((t)=>t.leader===sender)||sender==="team-lead"){let envTeam=process.env.GENIE_TEAM;if(envTeam){let leaderTeam=teams.find((t)=>t.name===envTeam);if(leaderTeam&&!visited.has(leaderTeam.name))result2.push(leaderTeam),visited.add(leaderTeam.name),walkParentChain(teams,leaderTeam,visited,result2)}}return result2}async function suggestRelayLeader(sender){if(sender==="cli")return null;let teams=await(await getTeamManager()).listTeams(),reachable=resolveSenderTeams(teams,sender);if(reachable.length===0)return null;let target=reachable[0];return{leader:target.leader??target.name,team:target.name}}function isRecipientInTeam(team,recipient){if(team.members.includes(recipient)||recipient===team.leader||recipient==="team-lead")return!0;if(recipient.startsWith(`${team.name}-`)){let roleOnly=recipient.slice(team.name.length+1);if(team.members.includes(roleOnly))return!0}return!1}async function findAgentTeam(_repoPath,agentName){let teams=await(await getTeamManager()).listTeams(),memberTeam=teams.find((t)=>t.members.includes(agentName));if(memberTeam)return memberTeam;if(agentName==="team-lead"||teams.some((t)=>t.leader===agentName)){let envTeam=process.env.GENIE_TEAM;if(envTeam)return teams.find((t)=>t.name===envTeam)??null;let leaderTeam=teams.find((t)=>t.leader===agentName);if(leaderTeam)return leaderTeam}return null}function localActor(name){return{actorType:"local",actorId:name}}async function resolveTeamName2(explicit,repoPath,from){if(explicit)return explicit;let name=(await findAgentTeam(repoPath,from))?.name??process.env.GENIE_TEAM;if(!name)console.error("Error: Could not auto-detect team. Use --team <name>."),process.exit(1);return name}async function handleInbox(agent,options){let ts3=await getTaskService(),resolvedAgent=agent??await detectSenderIdentity(),actor=localActor(resolvedAgent),conversations=await ts3.listConversations(actor);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log(`No conversations for "${resolvedAgent}".`);return}console.log(""),console.log(`INBOX: ${resolvedAgent}`),console.log("\u2500".repeat(60));for(let conv of conversations)await printConversationSummary(ts3,conv)}async function printConversationSummary(ts3,conv){let messages2=await ts3.getMessages(conv.id,{limit:1}),lastMsg=messages2.length>0?messages2[messages2.length-1]:null,name=conv.name??conv.id,type2=conv.type==="dm"?"DM":"Group",linked=conv.linkedEntity?` [${conv.linkedEntity}:${conv.linkedEntityId}]`:"",preview=lastMsg?truncate2(lastMsg.body,50):"(no messages)",time=lastMsg?formatTime(lastMsg.createdAt):"";if(console.log(` ${padRight(name,30)} ${padRight(type2,6)}${linked}`),lastMsg)console.log(` ${time} ${lastMsg.senderId}: ${preview}`);console.log("")}async function handleChatThread(messageId,options){let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),parentMsgId=Number(messageId),parentMsg=await ts3.getMessage(parentMsgId);if(!parentMsg)console.error(`Error: Message not found: ${messageId}`),process.exit(1);let conv=await ts3.findOrCreateConversation({type:"group",name:options.name??`Thread on message #${parentMsgId}`,parentMessageId:parentMsgId,createdBy:actor,members:[actor]});console.log(`Thread created: ${conv.id}`),console.log(` Parent message: #${parentMsgId} in ${parentMsg.conversationId}`),console.log(` Name: ${conv.name??"(unnamed)"}`)}function printConversationTable(conversations){console.log(` ${padRight("ID",20)} ${padRight("NAME",25)} ${padRight("TYPE",8)} ${padRight("LINKED",20)} UPDATED`),console.log(` ${"\u2500".repeat(80)}`);for(let c of conversations){let name=truncate2(c.name??"(unnamed)",23),linked=c.linkedEntity?`${c.linkedEntity}:${c.linkedEntityId}`:"-",updated=formatTime(c.updatedAt);console.log(` ${padRight(c.id,20)} ${padRight(name,25)} ${padRight(c.type,8)} ${padRight(linked,20)} ${updated}`)}console.log(`
|
|
1264
1264
|
${conversations.length} conversation${conversations.length===1?"":"s"}`)}async function handleChatList(options){let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),conversations=await ts3.listConversations(actor);if(options.type)conversations=conversations.filter((c)=>c.type===options.type);if(options.linked)conversations=conversations.filter((c)=>c.linkedEntity===options.linked);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log("No conversations found.");return}printConversationTable(conversations)}async function handleChatRead(conversationId,options){let ts3=await getTaskService(),conv=await ts3.getConversation(conversationId);if(!conv)console.error(`Error: Conversation not found: ${conversationId}`),process.exit(1);let messages2=await ts3.getMessages(conversationId,{since:options.since,limit:Number(options.limit)||50});if(options.json){console.log(JSON.stringify(messages2,null,2));return}let name=conv.name??conversationId;if(messages2.length===0){console.log(`No messages in "${name}".`);return}console.log(""),console.log(`CHAT: ${name}`),console.log("\u2500".repeat(60));for(let msg of messages2){let time=formatTime(msg.createdAt),reply=msg.replyToId?` (reply to #${msg.replyToId})`:"";console.log(` [${time}] ${msg.senderId}: ${msg.body}${reply}`)}console.log("")}async function discoverCurrentTeam(nativeTeams,from,explicitTeam){if(explicitTeam)return explicitTeam;let discovered=await nativeTeams.discoverTeamName().catch(()=>null);if(discovered)return discovered;return(await(await getRegistry()).list()).find((w)=>w.role===from||w.id===from||w.customName===from)?.team??null}async function deliverToTeam(nativeTeams,team,recipient,msg){let nativeName=await nativeTeams.resolveNativeMemberName(team,recipient);if(!nativeName)return!1;return await nativeTeams.writeNativeInbox(team,nativeName,msg),!0}async function bridgeToNativeInbox(from,recipient,body,explicitTeam){if(from===recipient)return!1;let nativeTeams=await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams)),nativeMsg={from,text:body,summary:body.length>50?`${body.substring(0,50)}...`:body,timestamp:new Date().toISOString(),color:"blue",read:!1},currentTeam=await discoverCurrentTeam(nativeTeams,from,explicitTeam);if(currentTeam&&await deliverToTeam(nativeTeams,currentTeam,recipient,nativeMsg))return!0;let allTeams=await nativeTeams.listTeams().catch(()=>[]);for(let team of allTeams){if(team===currentTeam)continue;if(await deliverToTeam(nativeTeams,team,recipient,nativeMsg))return!0}return console.warn(`[genie send] Native inbox bridge: could not find native team member for "${recipient}"`),!1}function quoteForShell(value){return`'${value.replace(/'/g,"'\\''")}'`}async function printBridgeSuggestion(sender,recipient,body,scopeError){let suggestion=await suggestRelayLeader(sender);if(console.error(`Scope violation: ${scopeError}`),suggestion)console.error(`Nearest reachable leader: ${suggestion.leader}@${suggestion.team}`),console.error("Relay manually via:"),console.error(` genie send ${quoteForShell(`[relay to ${recipient}] ${body}`)} --to ${suggestion.leader} --team ${suggestion.team}`);else console.error("No reachable leader found \u2014 sender is not bound to any team.")}async function handleSend(body,options){let ts3=await getTaskService(),mailbox=await getMailbox(),repoPath=process.cwd(),from=options.from??await detectSenderIdentity(options.team),to=await resolveLeaderAlias(options.to,options.team),scopeError=await checkSendScope(repoPath,from,to);if(scopeError){if(options.bridge){await printBridgeSuggestion(from,to,body,scopeError);return}console.error(`Error: ${scopeError}`),process.exit(1)}let senderActor=localActor(from),recipientActor=localActor(to),conv=await ts3.findOrCreateConversation({type:"dm",members:[senderActor,recipientActor],createdBy:senderActor});await ts3.addMember(conv.id,senderActor),await ts3.addMember(conv.id,recipientActor);let mailboxMessage=await mailbox.send(repoPath,from,to,body),msg=await ts3.sendMessage(conv.id,senderActor,body);try{let{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,`genie.msg.${to}`,{kind:"message",agent:from,direction:"out",peer:to,text:body,data:{messageId:msg.id,conversationId:conv.id,from,to},source:"mailbox"})}catch{}if(await bridgeToNativeInbox(from,to,body,options.team).catch((err)=>{let reason=err instanceof Error?err.message:String(err);return console.warn(`[genie send] Native inbox bridge failed: ${reason}`),!1}))await mailbox.markDelivered(repoPath,to,mailboxMessage.id).catch(()=>{});console.log(`Message sent to "${to}".`),console.log(` ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`)}function registerSendInboxCommands(program2){program2.command("send <body>").description("Send a direct message to an agent (PG-backed)").option("--to <agent>","Recipient agent name (default: team leader)","team-lead").option("--from <sender>","Sender ID (auto-detected from context)").option("--team <name>","Explicit team context for sender/recipient resolution").option("--bridge","On scope violation, print an advisory + relay command instead of failing (exit 0)").addHelpText("after",`
|
|
1265
1265
|
Examples:
|
|
1266
1266
|
genie send 'start task #3' --to engineer # Message a specific agent
|
|
1267
1267
|
genie send 'status update' --to team-lead # Report to team lead
|
|
1268
1268
|
genie send 'deploy ready' --team my-feature # Message within team context
|
|
1269
1269
|
genie send 'hi felipe' --to felipe-3 --bridge # Scope violation \u2192 print relay hint instead of erroring`).action(async(body,options)=>{try{await handleSend(body,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),program2.command("broadcast <body>").description("Send a message to your team conversation (PG-backed)").option("--from <sender>","Sender ID (auto-detected from context)").option("--team <name>","Team name (auto-detected from context)").action(async(body,options)=>{try{let ts3=await getTaskService(),repoPath=process.cwd(),from=options.from??await detectSenderIdentity(),teamName=await resolveTeamName2(options.team,repoPath,from),senderActor=localActor(from),conv=await ts3.findOrCreateConversation({type:"group",name:`Team: ${teamName}`,linkedEntity:"team",linkedEntityId:teamName,createdBy:senderActor,members:[senderActor]});await ts3.addMember(conv.id,senderActor);let msg=await ts3.sendMessage(conv.id,senderActor,body);try{let{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,"genie.msg.broadcast",{kind:"message",agent:from,direction:"out",peer:teamName,text:body,data:{messageId:msg.id,conversationId:conv.id,from,team:teamName},source:"mailbox"})}catch{}console.log(`Broadcast sent to team "${teamName}".`),console.log(` Message ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}});let inbox2=program2.command("inbox").description("Inbox management \u2014 list messages or watch for new ones");inbox2.command("list [agent]",{isDefault:!0}).description("List conversations with recent messages (PG-backed)").option("--json","Output as JSON").action(async(agent,options)=>{try{await handleInbox(agent,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),inbox2.command("watch").description("Run inbox watcher in foreground (Ctrl+C to stop)").action(async()=>{let{checkInboxes:checkInboxes2,getInboxPollIntervalMs:getInboxPollIntervalMs2,startInboxWatcher:startInboxWatcher2,stopInboxWatcher:stopInboxWatcher2}=await Promise.resolve().then(() => (init_inbox_watcher(),exports_inbox_watcher)),pollMs=getInboxPollIntervalMs2();if(pollMs===0)console.log("Inbox watcher is disabled (GENIE_INBOX_POLL_MS=0)"),process.exit(0);console.log(`Inbox watcher starting (poll every ${pollMs/1000}s)`),console.log(`Press Ctrl+C to stop.
|
|
1270
|
-
`);let initial=await checkInboxes2();if(initial.length>0)console.log(`[inbox-watcher] Spawned team-leads for: ${initial.join(", ")}`);let handle=startInboxWatcher2({listTeamsWithUnreadInbox:(await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams))).listTeamsWithUnreadInbox,isTeamActive:async(teamName)=>{let{isTeamActive:isTeamActive2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn));return isTeamActive2(teamName)},isAgentAlive:async(agentName)=>{let{isAgentAlive:isAgentAlive2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn));return isAgentAlive2(agentName)},ensureTeamLead:async(teamName,workingDir)=>{let{ensureTeamLead:ensureTeamLead2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn)),result2=await ensureTeamLead2(teamName,workingDir);return console.log(`[inbox-watcher] Spawned team-lead for "${teamName}" in ${workingDir}`),result2},warn:(msg)=>console.log(msg)}),shutdown2=()=>{console.log(`
|
|
1271
|
-
Stopping inbox watcher...`),stopInboxWatcher2(handle),process.exit(0)};process.on("SIGINT",shutdown2),process.on("SIGTERM",shutdown2),await new Promise(()=>{})});let chat=program2.command("chat").description("Conversation management (PG-backed)");chat.command("send <conversationId> <message>").description("Send a message to a specific conversation").option("--reply-to <msgId>","Reply to a specific message ID").option("--from <sender>","Sender ID (auto-detected)").action(async(conversationId,message,options)=>{try{let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),replyTo=options.replyTo?Number(options.replyTo):void 0,msg=await ts3.sendMessage(conversationId,actor,message,replyTo);console.log(`Message #${msg.id} sent to conversation ${conversationId}.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),chat.command("thread <messageId>").description("Create a threaded sub-conversation from a message").option("--name <name>","Thread name").option("--from <sender>","Sender ID (auto-detected)").action(async(messageId,options)=>{try{await handleChatThread(messageId,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),chat.command("list").description("List conversations with filters").option("--type <type>","Filter by type: dm, group").option("--linked <entity>","Filter by linked entity: task, team").option("--json","Output as JSON").option("--from <sender>","Actor ID (auto-detected)").action(async(options)=>{try{await handleChatList(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),chat.command("read <conversationId>").description("Read messages in a conversation").option("--since <timestamp>","Show messages since timestamp").option("--limit <n>","Limit number of messages","50").option("--json","Output as JSON").action(async(conversationId,options)=>{try{await handleChatRead(conversationId,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}var _registry,_taskService,_teamManager,_mailbox,PARENT_CHAIN_MAX_DEPTH=3,DEFAULT_REACHBACK_PREFIXES;var init_msg=__esm(()=>{init_term_format();DEFAULT_REACHBACK_PREFIXES=["council-"]});function buildLayoutCommand(windowTarget,mode="mosaic"){return`select-layout -t '${windowTarget}' ${mode==="vertical"?"even-horizontal":"tiled"}`}function resolveLayoutMode(layoutFlag){if(layoutFlag==="vertical")return"vertical";return"mosaic"}var exports_claude_logs={};__export(exports_claude_logs,{projectPathToHash:()=>projectPathToHash,parseLogEntry:()=>parseLogEntry,listSessions:()=>listSessions2,findClaudeProjectDir:()=>findClaudeProjectDir,findActiveSession:()=>findActiveSession,claudeTranscriptProvider:()=>claudeTranscriptProvider,claudeEntryToTranscript:()=>claudeEntryToTranscript});import{access,readFile as readFile8,readdir as readdir3,stat as stat2}from"fs/promises";import{join as join34}from"path";function projectPathToHash(projectPath){let normalized=projectPath.replace(/\/+$/,"");if(!normalized)normalized="/";return normalized.replace(/[/.]/g,"-")}function getClaudeDir(){return join34(process.env.HOME||"",".claude")}function getProjectsDir(claudeDir){return join34(claudeDir||getClaudeDir(),"projects")}async function findClaudeProjectDir(projectPath,claudeDir){let projectsDir=getProjectsDir(claudeDir),expectedHash=projectPathToHash(projectPath);try{await access(projectsDir);let projectDir=join34(projectsDir,expectedHash);return await access(projectDir),projectDir}catch{return null}}async function listSessions2(projectDir){let indexPath=join34(projectDir,"sessions-index.json");try{let content=await readFile8(indexPath,"utf-8");return JSON.parse(content).entries}catch{return await scanForSessions(projectDir)}}async function scanForSessions(projectDir){let sessions=[];try{let entries=await readdir3(projectDir);for(let entry2 of entries)if(entry2.endsWith(".jsonl")&&!entry2.startsWith(".")){let filePath=join34(projectDir,entry2),stats2=await stat2(filePath),sessionId=entry2.replace(".jsonl","");sessions.push({sessionId,fullPath:filePath,fileMtime:stats2.mtimeMs,messageCount:0,created:stats2.birthtime.toISOString(),modified:stats2.mtime.toISOString(),projectPath:"",isSidechain:!1})}}catch{}return sessions}async function findActiveSession(projectDir){let sessions=await listSessions2(projectDir);if(sessions.length===0)return null;return sessions.sort((a,b2)=>{let timeA=new Date(a.modified).getTime();return new Date(b2.modified).getTime()-timeA}),sessions[0]}async function findSessionById(projectDir,sessionId){return(await listSessions2(projectDir)).find((session)=>session.sessionId===sessionId)??null}function extractToolCalls(content){let toolCalls=[];for(let item of content)if(item.type==="tool_use")toolCalls.push({id:item.id||"",name:item.name||"",input:item.input||{}});return toolCalls.length>0?toolCalls:void 0}function populateAssistantFields(entry2,raw){if(raw.type!=="assistant")return;if(Array.isArray(raw.message.content))entry2.toolCalls=extractToolCalls(raw.message.content);if(raw.message.model)entry2.model=raw.message.model;if(raw.message.usage)entry2.usage=raw.message.usage}function parseLogEntry(line){if(!line||!line.trim())return null;try{let raw=JSON.parse(line);if(!raw.type)return null;let entry2={type:raw.type,sessionId:raw.sessionId||"",uuid:raw.uuid||"",parentUuid:raw.parentUuid||null,timestamp:raw.timestamp||"",cwd:raw.cwd||"",gitBranch:raw.gitBranch,version:raw.version,raw};if(raw.message)entry2.message={role:raw.message.role,content:raw.message.content},populateAssistantFields(entry2,raw);if(raw.data)entry2.data=raw.data;return entry2}catch{return null}}async function readLogFile(logPath){let entries=[];try{let lines=(await readFile8(logPath,"utf-8")).split(`
|
|
1270
|
+
`);let initial=await checkInboxes2();if(initial.length>0)console.log(`[inbox-watcher] Spawned team-leads for: ${initial.join(", ")}`);let handle=startInboxWatcher2({listTeamsWithUnreadInbox:(await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams))).listTeamsWithUnreadInbox,isTeamActive:async(teamName)=>{let{isTeamActive:isTeamActive2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn));return isTeamActive2(teamName)},isAgentAlive:async(agentName)=>{let{isAgentAlive:isAgentAlive2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn));return isAgentAlive2(agentName)},ensureTeamLead:async(teamName,workingDir)=>{let{ensureTeamLead:ensureTeamLead2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn)),result2=await ensureTeamLead2(teamName,workingDir);return console.log(`[inbox-watcher] Spawned team-lead for "${teamName}" in ${workingDir}`),result2},warn:(msg)=>console.log(msg),emitDeadInbox:(payload)=>{try{emitEvent("rot.inbox-watcher-spawn-loop.detected",payload)}catch{}}}),shutdown2=()=>{console.log(`
|
|
1271
|
+
Stopping inbox watcher...`),stopInboxWatcher2(handle),process.exit(0)};process.on("SIGINT",shutdown2),process.on("SIGTERM",shutdown2),await new Promise(()=>{})});let chat=program2.command("chat").description("Conversation management (PG-backed)");chat.command("send <conversationId> <message>").description("Send a message to a specific conversation").option("--reply-to <msgId>","Reply to a specific message ID").option("--from <sender>","Sender ID (auto-detected)").action(async(conversationId,message,options)=>{try{let ts3=await getTaskService(),from=options.from??await detectSenderIdentity(),actor=localActor(from),replyTo=options.replyTo?Number(options.replyTo):void 0,msg=await ts3.sendMessage(conversationId,actor,message,replyTo);console.log(`Message #${msg.id} sent to conversation ${conversationId}.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),chat.command("thread <messageId>").description("Create a threaded sub-conversation from a message").option("--name <name>","Thread name").option("--from <sender>","Sender ID (auto-detected)").action(async(messageId,options)=>{try{await handleChatThread(messageId,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),chat.command("list").description("List conversations with filters").option("--type <type>","Filter by type: dm, group").option("--linked <entity>","Filter by linked entity: task, team").option("--json","Output as JSON").option("--from <sender>","Actor ID (auto-detected)").action(async(options)=>{try{await handleChatList(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),chat.command("read <conversationId>").description("Read messages in a conversation").option("--since <timestamp>","Show messages since timestamp").option("--limit <n>","Limit number of messages","50").option("--json","Output as JSON").action(async(conversationId,options)=>{try{await handleChatRead(conversationId,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}var _registry,_taskService,_teamManager,_mailbox,PARENT_CHAIN_MAX_DEPTH=3,DEFAULT_REACHBACK_PREFIXES;var init_msg=__esm(()=>{init_emit();init_term_format();DEFAULT_REACHBACK_PREFIXES=["council-"]});function buildLayoutCommand(windowTarget,mode="mosaic"){return`select-layout -t '${windowTarget}' ${mode==="vertical"?"even-horizontal":"tiled"}`}function resolveLayoutMode(layoutFlag){if(layoutFlag==="vertical")return"vertical";return"mosaic"}var exports_claude_logs={};__export(exports_claude_logs,{projectPathToHash:()=>projectPathToHash,parseLogEntry:()=>parseLogEntry,listSessions:()=>listSessions2,findClaudeProjectDir:()=>findClaudeProjectDir,findActiveSession:()=>findActiveSession,claudeTranscriptProvider:()=>claudeTranscriptProvider,claudeEntryToTranscript:()=>claudeEntryToTranscript});import{access,readFile as readFile8,readdir as readdir3,stat as stat2}from"fs/promises";import{join as join34}from"path";function projectPathToHash(projectPath){let normalized=projectPath.replace(/\/+$/,"");if(!normalized)normalized="/";return normalized.replace(/[/.]/g,"-")}function getClaudeDir(){return join34(process.env.HOME||"",".claude")}function getProjectsDir(claudeDir){return join34(claudeDir||getClaudeDir(),"projects")}async function findClaudeProjectDir(projectPath,claudeDir){let projectsDir=getProjectsDir(claudeDir),expectedHash=projectPathToHash(projectPath);try{await access(projectsDir);let projectDir=join34(projectsDir,expectedHash);return await access(projectDir),projectDir}catch{return null}}async function listSessions2(projectDir){let indexPath=join34(projectDir,"sessions-index.json");try{let content=await readFile8(indexPath,"utf-8");return JSON.parse(content).entries}catch{return await scanForSessions(projectDir)}}async function scanForSessions(projectDir){let sessions=[];try{let entries=await readdir3(projectDir);for(let entry2 of entries)if(entry2.endsWith(".jsonl")&&!entry2.startsWith(".")){let filePath=join34(projectDir,entry2),stats2=await stat2(filePath),sessionId=entry2.replace(".jsonl","");sessions.push({sessionId,fullPath:filePath,fileMtime:stats2.mtimeMs,messageCount:0,created:stats2.birthtime.toISOString(),modified:stats2.mtime.toISOString(),projectPath:"",isSidechain:!1})}}catch{}return sessions}async function findActiveSession(projectDir){let sessions=await listSessions2(projectDir);if(sessions.length===0)return null;return sessions.sort((a,b2)=>{let timeA=new Date(a.modified).getTime();return new Date(b2.modified).getTime()-timeA}),sessions[0]}async function findSessionById(projectDir,sessionId){return(await listSessions2(projectDir)).find((session)=>session.sessionId===sessionId)??null}function extractToolCalls(content){let toolCalls=[];for(let item of content)if(item.type==="tool_use")toolCalls.push({id:item.id||"",name:item.name||"",input:item.input||{}});return toolCalls.length>0?toolCalls:void 0}function populateAssistantFields(entry2,raw){if(raw.type!=="assistant")return;if(Array.isArray(raw.message.content))entry2.toolCalls=extractToolCalls(raw.message.content);if(raw.message.model)entry2.model=raw.message.model;if(raw.message.usage)entry2.usage=raw.message.usage}function parseLogEntry(line){if(!line||!line.trim())return null;try{let raw=JSON.parse(line);if(!raw.type)return null;let entry2={type:raw.type,sessionId:raw.sessionId||"",uuid:raw.uuid||"",parentUuid:raw.parentUuid||null,timestamp:raw.timestamp||"",cwd:raw.cwd||"",gitBranch:raw.gitBranch,version:raw.version,raw};if(raw.message)entry2.message={role:raw.message.role,content:raw.message.content},populateAssistantFields(entry2,raw);if(raw.data)entry2.data=raw.data;return entry2}catch{return null}}async function readLogFile(logPath){let entries=[];try{let lines=(await readFile8(logPath,"utf-8")).split(`
|
|
1272
1272
|
`);for(let line of lines){let entry2=parseLogEntry(line);if(entry2)entries.push(entry2)}}catch{}return entries}async function findLogsForWorkspace(workspacePath,claudeDir){let projectDir=await findClaudeProjectDir(workspacePath,claudeDir);if(!projectDir)return null;let session=await findActiveSession(projectDir);if(!session)return null;return{projectDir,session}}async function getLogsForPane(paneWorkdir,claudeDir){let result2=await findLogsForWorkspace(paneWorkdir,claudeDir);if(!result2)return null;return{logPath:result2.session.fullPath,session:result2.session,projectDir:result2.projectDir}}function extractText(content){if(typeof content==="string")return content;if(!Array.isArray(content))return"";let parts=[];for(let item of content)if(typeof item==="string")parts.push(item);else if(item&&typeof item==="object"&&"text"in item)parts.push(String(item.text));return parts.join(" ")}function convertAssistant(entry2,base){let results=[],text=entry2.message?extractText(entry2.message.content):"";if(text)results.push({...base,role:"assistant",timestamp:entry2.timestamp,text,usage:entry2.usage?{input:entry2.usage.input_tokens,output:entry2.usage.output_tokens}:void 0});if(entry2.toolCalls)for(let tc of entry2.toolCalls)results.push({...base,role:"tool_call",timestamp:entry2.timestamp,text:`${tc.name}: ${JSON.stringify(tc.input).slice(0,200)}`,toolCall:{id:tc.id,name:tc.name,input:tc.input}});return results}function claudeEntryToTranscript(entry2){let base={provider:"claude",model:entry2.model,raw:entry2.raw};if(entry2.type==="user"&&entry2.message){let text=extractText(entry2.message.content);return text?[{...base,role:"user",timestamp:entry2.timestamp,text}]:[]}if(entry2.type==="assistant")return convertAssistant(entry2,base);if(entry2.type==="system"||entry2.type==="progress"){let text=entry2.message?extractText(entry2.message.content):"";return text?[{...base,role:"system",timestamp:entry2.timestamp,text}]:[]}return[]}var claudeTranscriptProvider;var init_claude_logs=__esm(()=>{claudeTranscriptProvider={async discoverLogPath(worker){let workspacePath=worker.worktree||worker.repoPath,projectDir=await findClaudeProjectDir(workspacePath);if(!projectDir)return null;if(worker.claudeSessionId){let directPath=join34(projectDir,`${worker.claudeSessionId}.jsonl`);try{return await access(directPath),directPath}catch{let session=await findSessionById(projectDir,worker.claudeSessionId);if(session?.fullPath)return session.fullPath}}return(await getLogsForPane(workspacePath))?.logPath??null},async readEntries(logPath){return(await readLogFile(logPath)).flatMap(claudeEntryToTranscript)}}});class AppPtyProvider{name="app-pty";transport="process";buildSpawnCommand(ctx){let params=spawnContextToParams(ctx),launch=buildClaudeCommand(params);return{...launch,env:{...launch.env,GENIE_APP_PTY:"true"}}}async extractSession(executor){let sessionId=executor.claudeSessionId;if(!sessionId)return null;let{access:access2,readdir:readdir4}=await import("fs/promises"),{join:join35}=await import("path"),claudeDir=join35(process.env.HOME||"",".claude","projects");try{await access2(claudeDir)}catch{return{sessionId}}let jsonlName=`${sessionId}.jsonl`;if(executor.repoPath||executor.worktree){let{projectPathToHash:projectPathToHash2}=await Promise.resolve().then(() => (init_claude_logs(),exports_claude_logs)),path3=executor.repoPath??executor.worktree,hash=projectPathToHash2(path3),candidate=join35(claudeDir,hash,jsonlName);try{return await access2(candidate),{sessionId,logPath:candidate}}catch{}}try{let dirs=await readdir4(claudeDir);for(let dir of dirs){let candidate=join35(claudeDir,dir,jsonlName);try{return await access2(candidate),{sessionId,logPath:candidate}}catch{}}}catch{}return{sessionId}}async detectState(executor){if(!executor.pid)return"terminated";try{process.kill(executor.pid,0);let metadata=executor.metadata;if(metadata.appPtyState&&typeof metadata.appPtyState==="string")return metadata.appPtyState;return"running"}catch{return"terminated"}}async terminate(executor){if(!executor.pid)return;try{process.kill(executor.pid,"SIGTERM"),await new Promise((r)=>setTimeout(r,500))}catch{}try{process.kill(executor.pid,0),process.kill(executor.pid,"SIGKILL")}catch{}}canResume(){return!0}buildResumeCommand(ctx){let params=resumeContextToParams(ctx),launch=buildClaudeCommand(params);return{...launch,env:{...launch.env,GENIE_APP_PTY:"true"}}}async deliverMessage(executorId,message){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),rows=await(await getConnection2())`
|
|
1273
1273
|
SELECT a.custom_name, a.team
|
|
1274
1274
|
FROM executors e
|
|
@@ -1301,7 +1301,7 @@ Stopping inbox watcher...`),stopInboxWatcher2(handle),process.exit(0)};process.o
|
|
|
1301
1301
|
ORDER BY created_at ASC
|
|
1302
1302
|
`}async function pollApprovalState(approvalId,defaultAction){let sql=await getConnection(),[approval]=await sql`
|
|
1303
1303
|
SELECT decision, timeout_at FROM approvals WHERE id = ${approvalId}
|
|
1304
|
-
`;if(!approval)return"deny";if(approval.decision==="allow"||approval.decision==="deny")return approval.decision;if(new Date(approval.timeout_at)<=new Date)return await resolveApproval(approvalId,defaultAction,"timeout"),defaultAction;return null}async function waitForResolution(approvalId,timeoutAt,defaultAction){let sql=await getConnection();return new Promise((resolve5)=>{let resolved=!1,listener=null,pollTimer=null,finish=(decision)=>{if(resolved)return;if(resolved=!0,listener)listener.unlisten().catch(()=>{});if(pollTimer)clearInterval(pollTimer);resolve5(decision)},checkResolution=async()=>{if(resolved)return;try{let result2=await pollApprovalState(approvalId,defaultAction);if(result2!==null)finish(result2)}catch{finish("deny")}};sql.listen("genie_approval_resolved",(payload)=>{if(payload===approvalId)checkResolution()}).then((l)=>{if(listener=l,resolved)l.unlisten().catch(()=>{})}).catch(()=>{}),pollTimer=setInterval(checkResolution,5000);let msUntilTimeout=Math.max(0,timeoutAt.getTime()-Date.now()+1000);setTimeout(()=>{if(!resolved)resolveApproval(approvalId,defaultAction,"timeout").catch(()=>{}),finish(defaultAction)},msUntilTimeout).unref(),checkResolution()})}function createRemoteApprovalGate(config){let timeoutSec=config.permissions?.timeout??300,defaultAction=config.permissions?.defaultAction??"deny";return async(input)=>{let hookInput=input,toolName=hookInput.tool_name,toolInput=hookInput.tool_input??{},preview=JSON.stringify(toolInput).slice(0,500),timeoutAt=new Date(Date.now()+timeoutSec*1000),approvalId=await insertApproval(config.executorId,config.agentName,toolName,preview,timeoutAt);if(config.permissions?.omniChat&&config.permissions?.omniInstance)sendApprovalToOmni(approvalId,config.agentName,toolName,preview,config.permissions).catch(()=>{});return{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:await waitForResolution(approvalId,timeoutAt,defaultAction)}}}}var recentOmniSends,BATCH_WINDOW_MS=1e4,BATCH_THRESHOLD=3;var init_claude_sdk_remote_approval=__esm(()=>{init_db();recentOmniSends=[]});var exports_claude_sdk={};__export(exports_claude_sdk,{translateSdkConfig:()=>translateSdkConfig,ClaudeSdkProvider:()=>ClaudeSdkProvider});import{readFileSync as readFileSync19}from"fs";import{query}from"@anthropic-ai/claude-agent-sdk";function translateSdkConfig(sdkConfig){let opts={};for(let key of SDK_TRUTHY_FIELDS)if(sdkConfig[key])opts[key]=sdkConfig[key];for(let key of SDK_NULLABLE_FIELDS)if(sdkConfig[key]!=null)opts[key]=sdkConfig[key];for(let key of SDK_CAST_FIELDS)if(sdkConfig[key])opts[key]=sdkConfig[key];return opts}function mergeHooks(...sources){let merged={};for(let src of sources){if(!src)continue;for(let[event,matchers]of Object.entries(src)){if(!matchers)continue;if(!merged[event])merged[event]=[...matchers];else merged[event].push(...matchers)}}return merged}class ClaudeSdkProvider{name="claude-sdk";transport="process";activeQueries=new Map;buildSpawnCommand(ctx){return{command:"claude-sdk-in-process",provider:"claude-sdk",meta:{role:ctx.role,skill:ctx.skill}}}runQuery(ctx,prompt2,permissionConfig,extraOptions,sdkConfig){ensureTeammateBypassPermissions();let abortController=new AbortController,tracker={abortController,done:!1};this.activeQueries.set(ctx.executorId,tracker);let permHooks;if(sdkConfig?.permissionMode==="remoteApproval"){let ws=findWorkspace(ctx.cwd),permissions=ws?getWorkspaceConfig(ws.root).permissions:void 0;permHooks={PreToolUse:[{matcher:"*",hooks:[createRemoteApprovalGate({executorId:ctx.executorId,agentName:ctx.agentId??ctx.role??"unknown",permissions})]}]}}else if(permissionConfig)permHooks={PreToolUse:[{matcher:"*",hooks:[createPermissionGate(permissionConfig)]}]};let translatedSdk=sdkConfig?translateSdkConfig(sdkConfig):void 0,mergedHooks=mergeHooks(permHooks,translatedSdk?.hooks,extraOptions?.hooks),hasHooks=Object.keys(mergedHooks).length>0,resolvedSystemPrompt=ctx.systemPrompt;if(!resolvedSystemPrompt&&ctx.systemPromptFile)try{resolvedSystemPrompt=readFileSync19(ctx.systemPromptFile,"utf-8")}catch{}let options={cwd:ctx.cwd,abortController,...ctx.model&&{model:ctx.model},...resolvedSystemPrompt&&{systemPrompt:resolvedSystemPrompt},...translatedSdk,...extraOptions,...hasHooks&&{hooks:mergedHooks},permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0},messages2=query({prompt:prompt2,options}),originalReturn=messages2.return.bind(messages2);messages2.return=async(value)=>{return tracker.done=!0,this.activeQueries.delete(ctx.executorId),originalReturn(value)};let self2=this,wrappedMessages=async function*(){try{for await(let msg of messages2)yield msg,routeSdkMessage(msg,ctx.executorId,ctx.agentId).catch(()=>{})}finally{tracker.done=!0,self2.activeQueries.delete(ctx.executorId)}}();return wrappedMessages.interrupt=messages2.interrupt.bind(messages2),wrappedMessages.setPermissionMode=messages2.setPermissionMode.bind(messages2),wrappedMessages.setModel=messages2.setModel.bind(messages2),wrappedMessages.return=messages2.return.bind(messages2),wrappedMessages.throw=messages2.throw.bind(messages2),{messages:wrappedMessages,abortController}}async extractSession(executor){let sessionId=executor.claudeSessionId;if(!sessionId)return null;return{sessionId}}async detectState(executor){let tracker=this.activeQueries.get(executor.id);if(!tracker)return"done";return tracker.done?"done":"running"}async terminate(executor){let tracker=this.activeQueries.get(executor.id);if(tracker)tracker.abortController.abort(),tracker.done=!0,this.activeQueries.delete(executor.id)}canResume(){return!1}}var SDK_TRUTHY_FIELDS,SDK_NULLABLE_FIELDS,SDK_CAST_FIELDS;var init_claude_sdk=__esm(()=>{init_claude_settings();init_workspace();init_claude_sdk_events();init_claude_sdk_permissions();init_claude_sdk_remote_approval();SDK_TRUTHY_FIELDS=["tools","allowedTools","disallowedTools","plugins","systemPrompt","betas","settingSources"],SDK_NULLABLE_FIELDS=["maxTurns","maxBudgetUsd","persistSession","enableFileCheckpointing","includePartialMessages","includeHookEvents","promptSuggestions","agentProgressSummaries"],SDK_CAST_FIELDS=["effort","thinking","agents","mcpServers","outputFormat","sandbox","settings"]});class CodexProvider{name="codex";transport="api";buildSpawnCommand(ctx){let params=spawnContextToParams3(ctx);return buildCodexCommand(params)}async extractSession(_executor){return null}async detectState(executor){if(executor.state==="terminated"||executor.endedAt)return"terminated";return"working"}async terminate(executor){if(executor.pid)try{process.kill(executor.pid,"SIGTERM")}catch{}}canResume(){return!1}async deliverMessage(_executorId,_message){}}function spawnContextToParams3(ctx){return{provider:"codex",team:ctx.team,role:ctx.role,skill:ctx.skill,agentId:ctx.agentId,executorId:ctx.executorId,extraArgs:ctx.extraArgs}}var init_codex=__esm(()=>{init_provider_adapters()});function getProvider(name){return providers.get(name)}var providers,claude,codex,appPty,claudeSdk;var init_registry2=__esm(()=>{init_app_pty();init_claude_code();init_claude_sdk();init_codex();providers=new Map;claude=new ClaudeCodeProvider,codex=new CodexProvider,appPty=new AppPtyProvider,claudeSdk=new ClaudeSdkProvider;providers.set("claude",claude);providers.set("codex",codex);providers.set("app-pty",appPty);providers.set("claude-sdk",claudeSdk)});var exports_wish_state={};__export(exports_wish_state,{wipeState:()=>wipeState,startGroup:()=>startGroup,resolveRepoPath:()=>resolveRepoPath,resetInProgressGroups:()=>resetInProgressGroups,resetGroup:()=>resetGroup,isWishComplete:()=>isWishComplete,getState:()=>getState,getOrCreateState:()=>getOrCreateState,getGroupState:()=>getGroupState,findGroupByAssignee:()=>findGroupByAssignee,findAnyGroupByAssignee:()=>findAnyGroupByAssignee,createState:()=>createState,computeGroupsSignature:()=>computeGroupsSignature,completeGroup:()=>completeGroup,WishStateMismatchError:()=>WishStateMismatchError});import{execSync as
|
|
1304
|
+
`;if(!approval)return"deny";if(approval.decision==="allow"||approval.decision==="deny")return approval.decision;if(new Date(approval.timeout_at)<=new Date)return await resolveApproval(approvalId,defaultAction,"timeout"),defaultAction;return null}async function waitForResolution(approvalId,timeoutAt,defaultAction){let sql=await getConnection();return new Promise((resolve5)=>{let resolved=!1,listener=null,pollTimer=null,finish=(decision)=>{if(resolved)return;if(resolved=!0,listener)listener.unlisten().catch(()=>{});if(pollTimer)clearInterval(pollTimer);resolve5(decision)},checkResolution=async()=>{if(resolved)return;try{let result2=await pollApprovalState(approvalId,defaultAction);if(result2!==null)finish(result2)}catch{finish("deny")}};sql.listen("genie_approval_resolved",(payload)=>{if(payload===approvalId)checkResolution()}).then((l)=>{if(listener=l,resolved)l.unlisten().catch(()=>{})}).catch(()=>{}),pollTimer=setInterval(checkResolution,5000);let msUntilTimeout=Math.max(0,timeoutAt.getTime()-Date.now()+1000);setTimeout(()=>{if(!resolved)resolveApproval(approvalId,defaultAction,"timeout").catch(()=>{}),finish(defaultAction)},msUntilTimeout).unref(),checkResolution()})}function createRemoteApprovalGate(config){let timeoutSec=config.permissions?.timeout??300,defaultAction=config.permissions?.defaultAction??"deny";return async(input)=>{let hookInput=input,toolName=hookInput.tool_name,toolInput=hookInput.tool_input??{},preview=JSON.stringify(toolInput).slice(0,500),timeoutAt=new Date(Date.now()+timeoutSec*1000),approvalId=await insertApproval(config.executorId,config.agentName,toolName,preview,timeoutAt);if(config.permissions?.omniChat&&config.permissions?.omniInstance)sendApprovalToOmni(approvalId,config.agentName,toolName,preview,config.permissions).catch(()=>{});return{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:await waitForResolution(approvalId,timeoutAt,defaultAction)}}}}var recentOmniSends,BATCH_WINDOW_MS=1e4,BATCH_THRESHOLD=3;var init_claude_sdk_remote_approval=__esm(()=>{init_db();recentOmniSends=[]});var exports_claude_sdk={};__export(exports_claude_sdk,{translateSdkConfig:()=>translateSdkConfig,ClaudeSdkProvider:()=>ClaudeSdkProvider});import{readFileSync as readFileSync19}from"fs";import{query}from"@anthropic-ai/claude-agent-sdk";function translateSdkConfig(sdkConfig){let opts={};for(let key of SDK_TRUTHY_FIELDS)if(sdkConfig[key])opts[key]=sdkConfig[key];for(let key of SDK_NULLABLE_FIELDS)if(sdkConfig[key]!=null)opts[key]=sdkConfig[key];for(let key of SDK_CAST_FIELDS)if(sdkConfig[key])opts[key]=sdkConfig[key];return opts}function mergeHooks(...sources){let merged={};for(let src of sources){if(!src)continue;for(let[event,matchers]of Object.entries(src)){if(!matchers)continue;if(!merged[event])merged[event]=[...matchers];else merged[event].push(...matchers)}}return merged}class ClaudeSdkProvider{name="claude-sdk";transport="process";activeQueries=new Map;buildSpawnCommand(ctx){return{command:"claude-sdk-in-process",provider:"claude-sdk",meta:{role:ctx.role,skill:ctx.skill}}}runQuery(ctx,prompt2,permissionConfig,extraOptions,sdkConfig){ensureTeammateBypassPermissions();let abortController=new AbortController,tracker={abortController,done:!1};this.activeQueries.set(ctx.executorId,tracker);let permHooks;if(sdkConfig?.permissionMode==="remoteApproval"){let ws=findWorkspace(ctx.cwd),permissions=ws?getWorkspaceConfig(ws.root).permissions:void 0;permHooks={PreToolUse:[{matcher:"*",hooks:[createRemoteApprovalGate({executorId:ctx.executorId,agentName:ctx.agentId??ctx.role??"unknown",permissions})]}]}}else if(permissionConfig)permHooks={PreToolUse:[{matcher:"*",hooks:[createPermissionGate(permissionConfig)]}]};let translatedSdk=sdkConfig?translateSdkConfig(sdkConfig):void 0,mergedHooks=mergeHooks(permHooks,translatedSdk?.hooks,extraOptions?.hooks),hasHooks=Object.keys(mergedHooks).length>0,resolvedSystemPrompt=ctx.systemPrompt;if(!resolvedSystemPrompt&&ctx.systemPromptFile)try{resolvedSystemPrompt=readFileSync19(ctx.systemPromptFile,"utf-8")}catch{}let options={cwd:ctx.cwd,abortController,...ctx.model&&{model:ctx.model},...resolvedSystemPrompt&&{systemPrompt:resolvedSystemPrompt},...translatedSdk,...extraOptions,...hasHooks&&{hooks:mergedHooks},permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0},messages2=query({prompt:prompt2,options}),originalReturn=messages2.return.bind(messages2);messages2.return=async(value)=>{return tracker.done=!0,this.activeQueries.delete(ctx.executorId),originalReturn(value)};let self2=this,wrappedMessages=async function*(){try{for await(let msg of messages2)yield msg,routeSdkMessage(msg,ctx.executorId,ctx.agentId).catch(()=>{})}finally{tracker.done=!0,self2.activeQueries.delete(ctx.executorId)}}();return wrappedMessages.interrupt=messages2.interrupt.bind(messages2),wrappedMessages.setPermissionMode=messages2.setPermissionMode.bind(messages2),wrappedMessages.setModel=messages2.setModel.bind(messages2),wrappedMessages.return=messages2.return.bind(messages2),wrappedMessages.throw=messages2.throw.bind(messages2),{messages:wrappedMessages,abortController}}async extractSession(executor){let sessionId=executor.claudeSessionId;if(!sessionId)return null;return{sessionId}}async detectState(executor){let tracker=this.activeQueries.get(executor.id);if(!tracker)return"done";return tracker.done?"done":"running"}async terminate(executor){let tracker=this.activeQueries.get(executor.id);if(tracker)tracker.abortController.abort(),tracker.done=!0,this.activeQueries.delete(executor.id)}canResume(){return!1}}var SDK_TRUTHY_FIELDS,SDK_NULLABLE_FIELDS,SDK_CAST_FIELDS;var init_claude_sdk=__esm(()=>{init_claude_settings();init_workspace();init_claude_sdk_events();init_claude_sdk_permissions();init_claude_sdk_remote_approval();SDK_TRUTHY_FIELDS=["tools","allowedTools","disallowedTools","plugins","systemPrompt","betas","settingSources"],SDK_NULLABLE_FIELDS=["maxTurns","maxBudgetUsd","persistSession","enableFileCheckpointing","includePartialMessages","includeHookEvents","promptSuggestions","agentProgressSummaries"],SDK_CAST_FIELDS=["effort","thinking","agents","mcpServers","outputFormat","sandbox","settings"]});class CodexProvider{name="codex";transport="api";buildSpawnCommand(ctx){let params=spawnContextToParams3(ctx);return buildCodexCommand(params)}async extractSession(_executor){return null}async detectState(executor){if(executor.state==="terminated"||executor.endedAt)return"terminated";return"working"}async terminate(executor){if(executor.pid)try{process.kill(executor.pid,"SIGTERM")}catch{}}canResume(){return!1}async deliverMessage(_executorId,_message){}}function spawnContextToParams3(ctx){return{provider:"codex",team:ctx.team,role:ctx.role,skill:ctx.skill,agentId:ctx.agentId,executorId:ctx.executorId,extraArgs:ctx.extraArgs}}var init_codex=__esm(()=>{init_provider_adapters()});function getProvider(name){return providers.get(name)}var providers,claude,codex,appPty,claudeSdk;var init_registry2=__esm(()=>{init_app_pty();init_claude_code();init_claude_sdk();init_codex();providers=new Map;claude=new ClaudeCodeProvider,codex=new CodexProvider,appPty=new AppPtyProvider,claudeSdk=new ClaudeSdkProvider;providers.set("claude",claude);providers.set("codex",codex);providers.set("app-pty",appPty);providers.set("claude-sdk",claudeSdk)});var exports_wish_state={};__export(exports_wish_state,{wipeState:()=>wipeState,startGroup:()=>startGroup,resolveRepoPath:()=>resolveRepoPath,resetInProgressGroups:()=>resetInProgressGroups,resetGroup:()=>resetGroup,isWishComplete:()=>isWishComplete,getState:()=>getState,getOrCreateState:()=>getOrCreateState,getGroupState:()=>getGroupState,findGroupByAssignee:()=>findGroupByAssignee,findAnyGroupByAssignee:()=>findAnyGroupByAssignee,createState:()=>createState,computeGroupsSignature:()=>computeGroupsSignature,completeGroup:()=>completeGroup,WishStateMismatchError:()=>WishStateMismatchError});import{execSync as execSync9}from"child_process";import{createHash as createHash5}from"crypto";import{existsSync as existsSync30}from"fs";import{dirname as dirname6}from"path";function computeGroupsSignature(groups){let canonical=groups.map((g)=>({name:g.name,dependsOn:[...g.dependsOn??[]].sort()})).sort((a,b2)=>a.name<b2.name?-1:a.name>b2.name?1:0);return createHash5("sha256").update(JSON.stringify(canonical)).digest("hex")}function diffGroups(prev,next){let prevMap=new Map(prev.map((g)=>[g.name,[...g.dependsOn??[]].sort()])),nextMap=new Map(next.map((g)=>[g.name,[...g.dependsOn??[]].sort()])),added=[],removed=[],changed=[];for(let[name,deps]of nextMap)if(!prevMap.has(name))added.push(name);else if(JSON.stringify(prevMap.get(name))!==JSON.stringify(deps))changed.push(name);for(let name of prevMap.keys())if(!nextMap.has(name))removed.push(name);return{added:added.sort(),removed:removed.sort(),changed:changed.sort()}}function normalizeGitPath(path3){if(process.platform!=="darwin")return path3;if(!path3.startsWith("/private/"))return path3;let logicalPath=path3.slice(8);return existsSync30(logicalPath)?logicalPath:path3}function resolveRepoPath(cwd){if(cwd)return cwd;try{let currentDir=process.cwd(),commonDir=execSync9("git rev-parse --path-format=absolute --git-common-dir",{encoding:"utf-8",stdio:["pipe","pipe","pipe"],env:{...process.env,GIT_CEILING_DIRECTORIES:dirname6(currentDir)}}).trim();return normalizeGitPath(dirname6(commonDir))}catch{return normalizeGitPath(process.cwd())}}function wishFilePath(slug){return`.genie/wishes/${slug}/WISH.md`}function toISO(v){if(v==null)return;if(v instanceof Date)return v.toISOString();return String(v)}async function findParent(sql,slug,repoPath){let wishFile=wishFilePath(slug),rows=await sql`
|
|
1305
1305
|
SELECT * FROM tasks
|
|
1306
1306
|
WHERE wish_file = ${wishFile} AND repo_path = ${repoPath} AND parent_id IS NULL
|
|
1307
1307
|
LIMIT 1
|
|
@@ -1718,9 +1718,9 @@ server.listen(PORT, '127.0.0.1', () => {
|
|
|
1718
1718
|
|
|
1719
1719
|
process.on('SIGTERM', () => { server.close(); process.exit(0); });
|
|
1720
1720
|
process.on('SIGINT', () => { server.close(); process.exit(0); });
|
|
1721
|
-
`,{mode:420});let{spawn:spawnChild}=__require("child_process");spawnChild("node",[scriptFile],{detached:!0,stdio:"ignore"}).unref();for(let i2=0;i2<30;i2++)if(await new Promise((r)=>setTimeout(r,100)),isRelayAlive(pidFile))return!0;return!1}catch{return!1}}async function generateWorkerId2(team,role){let base=role?`${team}-${role}`:team;if(!(await list()).some((w)=>w.id===base))return base;let suffix=crypto.randomUUID().slice(0,8);return`${base}-${suffix}`}async function capturePanePid2(paneId){if(paneId==="inline")return null;try{let{execSync:
|
|
1721
|
+
`,{mode:420});let{spawn:spawnChild}=__require("child_process");spawnChild("node",[scriptFile],{detached:!0,stdio:"ignore"}).unref();for(let i2=0;i2<30;i2++)if(await new Promise((r)=>setTimeout(r,100)),isRelayAlive(pidFile))return!0;return!1}catch{return!1}}async function generateWorkerId2(team,role){let base=role?`${team}-${role}`:team;if(!(await list()).some((w)=>w.id===base))return base;let suffix=crypto.randomUUID().slice(0,8);return`${base}-${suffix}`}async function capturePanePid2(paneId){if(paneId==="inline")return null;try{let{execSync:execSync10}=__require("child_process"),output=execSync10(genieTmuxCmd(`display -t '${paneId}' -p '#{pane_pid}'`),{encoding:"utf-8"}).trim(),pid=Number.parseInt(output,10);return pid>0?pid:null}catch{return null}}function resolveExecutorTransport2(provider,spawnTransport){if(provider==="codex")return"api";if(provider==="claude-sdk")return"process";return spawnTransport==="inline"?"process":"tmux"}async function terminateActiveExecutorWithCleanup(agentIdentityId){try{let currentExec=await getCurrentExecutor(agentIdentityId);if(!currentExec||currentExec.state==="terminated"||currentExec.state==="done")return;let provider=getProvider(currentExec.provider);if(provider)try{await provider.terminate(currentExec)}catch{}await terminateActiveExecutor(agentIdentityId)}catch{}}async function createAndLinkExecutor2(agentIdentityId,provider,transport,opts){try{let executor=await createExecutor(agentIdentityId,provider,transport,opts);return await setCurrentExecutor(agentIdentityId,executor.id),executor.id}catch{return null}}async function registerSpawnWorker(ctx,paneId,windowInfo){let nt=ctx.validated.nativeTeam,workerEntry={id:ctx.workerId,paneId,session:ctx.validated.team,provider:ctx.validated.provider,transport:ctx.transport,role:ctx.validated.role,skill:ctx.validated.skill,team:ctx.validated.team,worktree:null,startedAt:ctx.now,state:"spawning",lastStateChange:ctx.now,repoPath:ctx.cwd,claudeSessionId:ctx.claudeSessionId,nativeTeamEnabled:nt?.enabled??!1,nativeAgentId:`${ctx.agentName}@${ctx.validated.team}`,nativeColor:nt?.color??ctx.spawnColor,parentSessionId:nt?.parentSessionId??ctx.parentSessionId,window:windowInfo?.windowName,windowName:windowInfo?.windowName,windowId:windowInfo?.windowId,autoResume:ctx.autoResume===!1?!1:void 0,resumeAttempts:0};await register(workerEntry);let role=ctx.validated.role??ctx.agentName;if(role!=="council")try{await hireAgent(ctx.validated.team,role)}catch{}return workerEntry}async function notifySpawnJoin(ctx,paneId){let nt=ctx.validated.nativeTeam;if(!nt?.enabled)return;await registerNativeMember(ctx.validated.team,{agentName:ctx.agentName,agentType:nt.agentType??ctx.validated.role??"general-purpose",color:nt.color??ctx.spawnColor??"blue",tmuxPaneId:paneId,cwd:ctx.cwd,planModeRequired:nt.planModeRequired});let leaderName=await resolveTeamLeaderName(ctx.validated.team);await writeNativeInbox(ctx.validated.team,leaderName,{from:ctx.agentName,text:`Worker ${ctx.agentName} (${ctx.validated.provider}) joined team ${ctx.validated.team}. cwd: ${ctx.cwd}. Ready for tasks.`,summary:`${ctx.agentName} (${ctx.validated.provider}) joined`,timestamp:new Date().toISOString(),color:nt.color??ctx.spawnColor??"blue",read:!1})}function registerOtelRelayPane(workerId,paneId,agentName,spawnColor,repoPath){let{writeFileSync:wfs}=__require("fs"),{join:pjoin}=__require("path"),{homedir:hdir}=__require("os"),rd=pjoin(hdir(),".genie","relay");wfs(pjoin(rd,`${workerId}-pane`),paneId),wfs(pjoin(rd,`${workerId}-meta`),JSON.stringify({agent:agentName,color:spawnColor,repoPath}))}function printSpawnInfo(ctx,paneId,workerEntry){let nt=ctx.validated.nativeTeam;if(console.log(`Agent "${ctx.workerId}" spawned.`),console.log(` Provider: ${ctx.launch.provider}`),console.log(` Command: ${ctx.fullCommand}`),console.log(` Team: ${ctx.validated.team}`),console.log(` Pane: ${paneId}`),ctx.validated.role)console.log(` Role: ${ctx.validated.role}`);if(ctx.executorId)console.log(` Executor: ${ctx.executorId}`);if(ctx.validated.skill)console.log(` Skill: ${ctx.validated.skill}`);if(workerEntry.claudeSessionId)console.log(` Session: ${workerEntry.claudeSessionId}`);if(console.log(` Layout: ${ctx.layoutMode}`),nt?.enabled)console.log(" Native: enabled"),console.log(` AgentID: ${workerEntry.nativeAgentId}`),console.log(` Color: ${nt.color}`);if(ctx.otelRelayActive)console.log(` OTel: relay on port ${OTEL_RELAY_PORT}`)}function shellQuote2(arg){return`'${arg.replace(/'/g,"'\\''")}'`}function writeTmuxLaunchScript(workerId,fullCommand){let{chmodSync:chmodSync3,mkdirSync:mkdirSync11,writeFileSync:writeFileSync12}=__require("fs"),{join:join36}=__require("path"),{homedir:homedir23}=__require("os"),dir=join36(homedir23(),".genie","spawn-scripts");mkdirSync11(dir,{recursive:!0});let safeId=workerId.replace(/[^a-zA-Z0-9._-]/g,"-"),scriptPath=join36(dir,`${safeId}-${Date.now().toString(36)}.sh`);return writeFileSync12(scriptPath,`#!/bin/sh
|
|
1722
1722
|
exec ${fullCommand}
|
|
1723
|
-
`,{mode:448}),chmodSync3(scriptPath,448),scriptPath}function buildInitialSplitWindowCommand(windowId,cwd,fullCommand){let cwdFlag=cwd?` -c ${shellQuote2(cwd)}`:"";return genieTmuxCmd(`split-window -d -t ${shellQuote2(windowId)}${cwdFlag} -P -F '#{pane_id}' ${shellQuote2(fullCommand)}`)}async function resolveSpawnTeamWindow(team,cwd,sessionOverride){if(!team)return null;try{let sessionName=sessionOverride;if(!sessionName)sessionName=(await getTeam(team))?.tmuxSessionName;if(!sessionName)sessionName=await resolveRepoSession(cwd);if(!sessionName)sessionName=team;return await ensureTeamWindow(sessionName,team,cwd)}catch(err){return console.warn(`Warning: could not ensure team window for "${team}": ${err instanceof Error?err.message:err}`),null}}async function autoConfirmTrustPrompt(paneId){let{execSync:
|
|
1723
|
+
`,{mode:448}),chmodSync3(scriptPath,448),scriptPath}function buildInitialSplitWindowCommand(windowId,cwd,fullCommand){let cwdFlag=cwd?` -c ${shellQuote2(cwd)}`:"";return genieTmuxCmd(`split-window -d -t ${shellQuote2(windowId)}${cwdFlag} -P -F '#{pane_id}' ${shellQuote2(fullCommand)}`)}async function resolveSpawnTeamWindow(team,cwd,sessionOverride){if(!team)return null;try{let sessionName=sessionOverride;if(!sessionName)sessionName=(await getTeam(team))?.tmuxSessionName;if(!sessionName)sessionName=await resolveRepoSession(cwd);if(!sessionName)sessionName=team;return await ensureTeamWindow(sessionName,team,cwd)}catch(err){return console.warn(`Warning: could not ensure team window for "${team}": ${err instanceof Error?err.message:err}`),null}}async function autoConfirmTrustPrompt(paneId){let{execSync:execSync10}=__require("child_process"),maxWaitMs=15000,pollMs=500,start=Date.now();while(Date.now()-start<15000){await new Promise((r)=>setTimeout(r,500));let content;try{content=execSync10(genieTmuxCmd(`capture-pane -t '${paneId}' -p`),{encoding:"utf-8"})}catch{return}if(content.includes("trust this folder")||content.includes("Quick safety check")){try{execSync10(genieTmuxCmd(`send-keys -t '${paneId}' Enter`),{encoding:"utf-8"})}catch{}return}if(content.includes("Claude Code")||content.includes("\u276F")||content.includes("Churning"))return}}function createTmuxPane(ctx,teamWindow){let{execSync:execSync10}=__require("child_process"),useLaunchScript=ctx.validated.provider==="claude"&&Boolean(ctx.validated.nativeTeam?.enabled),tmuxCommand=useLaunchScript?shellQuote2(writeTmuxLaunchScript(ctx.workerId,ctx.fullCommand)):shellQuote2(ctx.fullCommand),tmuxPrefix=genieTmuxCmd("");if(ctx.validated.windowTarget){let cwdFlag2=ctx.cwd?` -c ${shellQuote2(ctx.cwd)}`:"",cmd=`${tmuxPrefix}split-window -d -t ${shellQuote2(ctx.validated.windowTarget)}${cwdFlag2} -P -F '#{pane_id}' ${tmuxCommand}`;return execSync10(cmd,{encoding:"utf-8"}).trim()}if(ctx.validated.newWindow){let session=ctx.sessionOverride??teamWindow?.windowId?.split(":")[0]??ctx.validated.team,cwdFlag2=ctx.cwd?` -c ${shellQuote2(ctx.cwd)}`:"",sessionExists2=!1;try{execSync10(`${tmuxPrefix}has-session -t ${shellQuote2(`=${session}`)}`,{stdio:"ignore"}),sessionExists2=!0}catch{sessionExists2=!1}if(!sessionExists2)execSync10(`${tmuxPrefix}new-session -d -s ${shellQuote2(session)} -n home${cwdFlag2}`,{stdio:"ignore"});let cmd=`${tmuxPrefix}new-window -a -d -t ${shellQuote2(`${session}:`)} -n claude${cwdFlag2} -P -F '#{pane_id}' ${tmuxCommand}`;return execSync10(cmd,{encoding:"utf-8"}).trim()}if(teamWindow?.created){let cwdFlag2=ctx.cwd?` -c ${shellQuote2(ctx.cwd)}`:"",paneId=execSync10(`${tmuxPrefix}split-window -d -t ${shellQuote2(teamWindow.windowId)}${cwdFlag2} -P -F '#{pane_id}' ${tmuxCommand}`,{encoding:"utf-8"}).trim();try{execSync10(genieTmuxCmd(`kill-pane -t '${teamWindow.paneId}'`),{stdio:"ignore"})}catch{}return paneId}let callerPane=process.env.TMUX_PANE;if(!teamWindow&&!callerPane)throw Error("createTmuxPane: refusing to split with no target \u2014 neither teamWindow nor TMUX_PANE is set. "+"This indicates a missing --team or --window flag, or a caller outside tmux. See ~/.genie/reports/trace-genie-spawn-wrong-window.md");let splitTarget=teamWindow?`-t '${teamWindow.windowId}'`:`-t '${callerPane}'`,cwdFlag=ctx.cwd?`-c '${ctx.cwd}'`:"";if(useLaunchScript){let splitCmd2=`${tmuxPrefix}split-window -d ${splitTarget} ${cwdFlag} -P -F '#{pane_id}' ${tmuxCommand}`;return execSync10(splitCmd2,{encoding:"utf-8"}).trim()}let escapedCmd=ctx.fullCommand.replace(/'/g,"'\\''"),splitCmd=`${tmuxPrefix}split-window -d ${splitTarget} ${cwdFlag} -P -F '#{pane_id}' '${escapedCmd}'`;return execSync10(splitCmd,{encoding:"utf-8"}).trim()}async function applySpawnLayout(ctx,teamWindow){let{execSync:execSync10}=__require("child_process"),session=await getCurrentSessionName()??ctx.validated.team,layoutTarget=`${session}:${teamWindow?.windowName??""}`;if(!teamWindow){let wins=await listWindows(session);layoutTarget=wins[0]?wins[0].id:`${session}:`}try{execSync10(genieTmuxCmd(buildLayoutCommand(layoutTarget,ctx.layoutMode)),{stdio:"ignore"})}catch{}}async function createTmuxExecutor(ctx,paneId,pid,teamWindow){if(!ctx.agentIdentityId||!ctx.executorId)return;await createAndLinkExecutor2(ctx.agentIdentityId,ctx.validated.provider,resolveExecutorTransport2(ctx.validated.provider,"tmux"),{id:ctx.executorId,pid,tmuxSession:ctx.validated.team,tmuxPaneId:paneId,tmuxWindow:teamWindow?.windowName??null,tmuxWindowId:teamWindow?.windowId??null,claudeSessionId:ctx.claudeSessionId??null,state:"spawning",repoPath:ctx.cwd,paneColor:ctx.spawnColor})}async function finalizeTmuxSpawn(ctx,paneId,teamWindow,workerEntry){if(ctx.spawnColor&&paneId!=="inline")await applyPaneColor(paneId,ctx.spawnColor,teamWindow?.windowId);if(await saveTemplate({id:ctx.validated.role??ctx.workerId,provider:ctx.validated.provider,team:ctx.validated.team,role:ctx.validated.role,skill:ctx.validated.skill,cwd:ctx.cwd,extraArgs:ctx.extraArgs,nativeTeamEnabled:workerEntry.nativeTeamEnabled,lastSpawnedAt:new Date().toISOString()}),ctx.otelRelayActive&&paneId!=="%0")registerOtelRelayPane(ctx.workerId,paneId,ctx.agentName,ctx.spawnColor,ctx.cwd);if(teamWindow)console.log(` Window: ${teamWindow.windowName} (${teamWindow.windowId})`);printSpawnInfo(ctx,paneId,workerEntry)}async function awaitAgentReadiness(paneId){if(paneId==="inline")return;let result2=await waitForAgentReady(paneId);if(result2.ready)console.log(` \u2713 Agent ready (${(result2.elapsedMs/1000).toFixed(1)}s)`);else console.log(` \u26A0 Agent readiness timeout (${Math.round(result2.elapsedMs/1000)}s) \u2014 proceeding anyway`)}async function launchTmuxSpawn(ctx){let isolatedSessionSpawn=ctx.validated.newWindow===!0&&Boolean(ctx.sessionOverride),teamWindow=ctx.spawnIntoCurrentWindow||isolatedSessionSpawn?null:await resolveSpawnTeamWindow(ctx.validated.team,ctx.cwd,ctx.sessionOverride),paneId;try{paneId=createTmuxPane(ctx,teamWindow)}catch(err){return console.error(`Failed to create tmux pane: ${err instanceof Error?err.message:"unknown error"}`),process.exit(1)}let pid=await capturePanePid2(paneId);if(await createTmuxExecutor(ctx,paneId,pid,teamWindow),await applySpawnLayout(ctx,teamWindow),ctx.validated.provider==="claude")await autoConfirmTrustPrompt(paneId);let workerEntry=await registerSpawnWorker(ctx,paneId,teamWindow);if(await notifySpawnJoin(ctx,paneId),await finalizeTmuxSpawn(ctx,paneId,teamWindow,workerEntry),await awaitAgentReadiness(paneId),ctx.executorId)await updateExecutorState(ctx.executorId,"running").catch(()=>{});return await update(ctx.workerId,{state:"idle"}).catch(()=>{}),paneId}async function runSdkQuery(ctx,permConfig,streamOpts,sdkConfig,runtimeExtraOptions){let{ClaudeSdkProvider:ClaudeSdkProvider2}=await Promise.resolve().then(() => (init_claude_sdk(),exports_claude_sdk)),{startSession:startSession2,recordTurn:recordTurn2,updateTurnCount:updateTurnCount2,endSession:endSession2}=await Promise.resolve().then(() => exports_sdk_session_capture),{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sdkProvider=new ClaudeSdkProvider2,spawnContext={agentId:ctx.agentIdentityId??ctx.workerId,executorId:ctx.executorId??crypto.randomUUID(),team:ctx.validated.team,role:ctx.validated.role,skill:ctx.validated.skill,cwd:ctx.cwd,model:ctx.validated.model,systemPrompt:ctx.validated.systemPrompt,systemPromptFile:ctx.validated.systemPromptFile,initialPrompt:ctx.validated.initialPrompt,name:ctx.validated.name},safePgCall=async(_op,fn,fallback)=>{try{let sql=await getConnection2();return await fn(sql)}catch{return fallback}},prompt2=ctx.validated.initialPrompt??`You are ${ctx.validated.role??"an agent"} on team "${ctx.validated.team}". Awaiting instructions.`,resumeSessionId=typeof runtimeExtraOptions?.resume==="string"?runtimeExtraOptions.resume:void 0,dbSessionId=null,turnIndex=0;if(resumeSessionId){let resolvedClaudeSessionId=resumeSessionId,byPgId=await safePgCall("resolve-session-resume",(sql)=>sql`
|
|
1724
1724
|
SELECT s.id, s.total_turns, COALESCE(s.claude_session_id, e.claude_session_id) as csid
|
|
1725
1725
|
FROM sessions s
|
|
1726
1726
|
LEFT JOIN executors e ON e.id = s.executor_id
|
|
@@ -1729,14 +1729,14 @@ exec ${fullCommand}
|
|
|
1729
1729
|
`,[]);if(byPgId&&byPgId.length>0){if(dbSessionId=byPgId[0].id,turnIndex=byPgId[0].total_turns??0,byPgId[0].csid)resolvedClaudeSessionId=byPgId[0].csid;await safePgCall("reopen-session",(sql)=>sql`UPDATE sessions SET status = 'active', updated_at = now() WHERE id = ${dbSessionId}`,void 0)}if(runtimeExtraOptions)runtimeExtraOptions.resume=resolvedClaudeSessionId}if(!dbSessionId)dbSessionId=await startSession2(safePgCall,spawnContext.executorId,void 0,ctx.agentIdentityId??null,ctx.validated.team,ctx.validated.role);if(dbSessionId)await recordTurn2(safePgCall,dbSessionId,turnIndex++,"user",prompt2);let streaming=streamOpts?.stream??!1;if(dbSessionId&&streaming){let fmt=streamOpts?.streamFormat??"text";if(fmt==="ndjson"||fmt==="json")process.stdout.write(`${JSON.stringify({type:"genie_session",session_id:dbSessionId})}
|
|
1730
1730
|
`)}let extraOptions={...streaming&&{includePartialMessages:!0},...runtimeExtraOptions},hasExtraOptions=Object.keys(extraOptions).length>0,{messages:messages2}=sdkProvider.runQuery(spawnContext,prompt2,permConfig,hasExtraOptions?extraOptions:void 0,sdkConfig);if(ctx.executorId)await updateExecutorState(ctx.executorId,"running").catch(()=>{});let claudeSessionId,toolNameById=new Map,record=async(role,content,toolName)=>{if(!dbSessionId)return;await recordTurn2(safePgCall,dbSessionId,turnIndex++,role,content,toolName)},processMessage=async(message)=>{if(message.type==="system"&&message.session_id)claudeSessionId=message.session_id;if(message.type==="assistant"&&message.message)for(let block of message.message.content){if(block.type==="tool_use"){let b2=block,name=String(b2.name??""),id=String(b2.id??"");if(id)toolNameById.set(id,name);await record("tool_input",JSON.stringify(b2.input??{}).slice(0,500),name)}if(block.type==="text"&&block.text)await record("assistant",block.text)}if(message.type==="user"&&message.message?.content&&Array.isArray(message.message.content))for(let block of message.message.content){let b2=block;if(b2.type==="tool_result"){let toolId=String(b2.tool_use_id??""),toolName=toolNameById.get(toolId)??"",output=typeof b2.content==="string"?b2.content.slice(0,500):"";await record("tool_output",output,toolName)}}if(message.type==="result"&&message.subtype==="success"){if(message.session_id)claudeSessionId=message.session_id}};if(streaming){let{formatSdkMessage:formatSdkMessage2}=await Promise.resolve().then(() => exports_claude_sdk_stream),format=streamOpts?.streamFormat??"text";try{for await(let message of messages2){let formatted=formatSdkMessage2(message,format);if(formatted!==null){if(process.stdout.write(formatted),format==="json")process.stdout.write(`
|
|
1731
1731
|
`)}await processMessage(message)}}catch(err){if(!(err instanceof Error&&err.name==="AbortError"))console.error(`SDK query error: ${err instanceof Error?err.message:err}`)}}else try{for await(let message of messages2){if(message.type==="assistant"&&message.message){for(let block of message.message.content)if(block.type==="text"&&block.text)process.stdout.write(block.text)}if(message.type==="result"&&message.subtype==="success"&&message.result)console.log(message.result);await processMessage(message)}}catch(err){if(!(err instanceof Error&&err.name==="AbortError"))console.error(`SDK query error: ${err instanceof Error?err.message:err}`)}if(dbSessionId)await updateTurnCount2(safePgCall,dbSessionId,turnIndex),await endSession2(safePgCall,dbSessionId,"completed");if(claudeSessionId&&spawnContext.executorId){let csId=claudeSessionId;await safePgCall("update-claude-session-id",(sql)=>sql`UPDATE executors SET claude_session_id = ${csId} WHERE id = ${spawnContext.executorId}`,void 0)}if(claudeSessionId&&dbSessionId){let csId=claudeSessionId,sessId=dbSessionId;await safePgCall("update-session-claude-id",(sql)=>sql`UPDATE sessions SET claude_session_id = ${csId} WHERE id = ${sessId}`,void 0)}}async function launchSdkSpawn(ctx,permissionsConfig,streamOpts,sdkConfig,runtimeExtraOptions){if(ctx.agentIdentityId&&ctx.executorId)await createAndLinkExecutor2(ctx.agentIdentityId,"claude-sdk","process",{id:ctx.executorId,claudeSessionId:null,state:"spawning",repoPath:ctx.cwd});if(await registerSpawnWorker(ctx,"sdk"),ctx.executorId)process.env.GENIE_EXECUTOR_ID=ctx.executorId;if(console.log(`Agent "${ctx.workerId}" starting via Claude Agent SDK...`),console.log(` Provider: claude-sdk | Team: ${ctx.validated.team} | Role: ${ctx.validated.role??"-"}`),ctx.executorId)console.log(` Executor: ${ctx.executorId}`);console.log("");let{resolvePermissionConfig:resolvePermissionConfig2}=await Promise.resolve().then(() => (init_claude_sdk_permissions(),exports_claude_sdk_permissions)),permConfig=resolvePermissionConfig2(permissionsConfig);if(await runSdkQuery(ctx,permConfig,streamOpts,sdkConfig,runtimeExtraOptions),ctx.executorId)await updateExecutorState(ctx.executorId,"done").catch(()=>{});return await unregister(ctx.workerId),console.log(`
|
|
1732
|
-
Agent "${ctx.workerId}" SDK session ended.`),ctx.workerId}async function launchInlineSpawn(ctx){let nt=ctx.validated.nativeTeam,paneId="inline";if(ctx.agentIdentityId&&ctx.executorId)await createAndLinkExecutor2(ctx.agentIdentityId,ctx.validated.provider,resolveExecutorTransport2(ctx.validated.provider,"inline"),{id:ctx.executorId,claudeSessionId:ctx.claudeSessionId??null,state:"spawning",repoPath:ctx.cwd});let workerEntry=await registerSpawnWorker(ctx,"inline");if(await notifySpawnJoin(ctx,"inline"),console.log(`Agent "${ctx.workerId}" starting inline...`),console.log(` Provider: ${ctx.launch.provider} | Team: ${ctx.validated.team} | Role: ${ctx.validated.role??"-"}`),nt?.enabled)console.log(` Native: enabled | AgentID: ${workerEntry.nativeAgentId}`);console.log("");let{spawnSync:
|
|
1732
|
+
Agent "${ctx.workerId}" SDK session ended.`),ctx.workerId}async function launchInlineSpawn(ctx){let nt=ctx.validated.nativeTeam,paneId="inline";if(ctx.agentIdentityId&&ctx.executorId)await createAndLinkExecutor2(ctx.agentIdentityId,ctx.validated.provider,resolveExecutorTransport2(ctx.validated.provider,"inline"),{id:ctx.executorId,claudeSessionId:ctx.claudeSessionId??null,state:"spawning",repoPath:ctx.cwd});let workerEntry=await registerSpawnWorker(ctx,"inline");if(await notifySpawnJoin(ctx,"inline"),console.log(`Agent "${ctx.workerId}" starting inline...`),console.log(` Provider: ${ctx.launch.provider} | Team: ${ctx.validated.team} | Role: ${ctx.validated.role??"-"}`),nt?.enabled)console.log(` Native: enabled | AgentID: ${workerEntry.nativeAgentId}`);console.log("");let{spawnSync:spawnSync4}=__require("child_process"),envVars={...process.env,...ctx.launch.env??{}},result2=spawnSync4("sh",["-c",ctx.launch.command],{env:envVars,stdio:"inherit"});if(ctx.agentIdentityId&&ctx.executorId)await updateExecutorState(ctx.executorId,"done").catch(()=>{});if(await unregister(ctx.workerId),nt?.enabled&&ctx.agentName)await clearNativeInbox(ctx.validated.team,ctx.agentName).catch(()=>{}),await unregisterNativeMember(ctx.validated.team,ctx.agentName).catch(()=>{});return console.log(`
|
|
1733
1733
|
Agent "${ctx.workerId}" session ended.`),process.exit(result2.status??0)}async function findDeadResumable(team,role){let candidate=(await list()).find((w)=>w.role===role&&w.team===team&&w.claudeSessionId&&w.provider==="claude");if(!candidate)return null;return await isPaneAliveOrDead(candidate.paneId)?null:candidate}async function rejectDuplicateRole(team,role){let existing=await list();for(let w of existing)if(w.role===role&&w.team===team){let alive=await resolveWorkerLivenessByTransport(w);if(alive&&w.session&&/^%\d+$/.test(w.paneId)){if(await getPaneSession(w.paneId)!==w.session){await unregister(w.id);continue}console.error(`Error: Worker with role "${role}" already exists in team "${team}" (state: ${w.state}, pane: ${w.paneId})
|
|
1734
1734
|
Use a different --role name for a second worker, e.g.: --role ${role}-2`),process.exit(1)}if(alive)console.error(`Error: Worker with role "${role}" already exists in team "${team}" (state: ${w.state}, pane: ${w.paneId})
|
|
1735
1735
|
Use a different --role name for a second worker, e.g.: --role ${role}-2`),process.exit(1);await unregister(w.id)}}async function getPaneSession(paneId){try{return(await executeTmux2(`display-message -t '${paneId}' -p '#{session_name}'`)).trim()||null}catch{return null}}async function resolveNativeTeam(team,_repoPath,options){let parentSessionId=(await getTeam(team))?.nativeTeamParentSessionId;if(!parentSessionId)parentSessionId=await discoverClaudeParentSessionId()??`genie-${team}`;await ensureNativeTeam(team,`Genie team: ${team}`,parentSessionId);let spawnColor=options.color??await assignColor(team),nativeTeam;if(options.provider==="claude")nativeTeam={enabled:!0,parentSessionId,color:spawnColor,agentType:options.role??"general-purpose",planModeRequired:options.planMode,permissionMode:options.permissionMode,agentName:options.role};return{parentSessionId,spawnColor,nativeTeam}}async function resolveAgentForSpawn(name,options){let resolved=await resolve4(name);if(!resolved)console.error(`Error: Agent "${name}" not found in directory or built-ins.`),console.error(` Register with: genie dir add ${name} --dir <path>`),console.error(" Or use a built-in: engineer, reviewer, qa, fix, ..."),process.exit(1);let entry2=resolved.entry,identityPath=null;if(resolved.builtin)identityPath=resolveBuiltinAgentPath(name);else if(entry2.dir)identityPath=loadIdentity(entry2);let repoPath=resolveAgentWorkingDir(entry2,options.cwd),model=options.model;if(!model){let ctx=buildSpawnResolveContext(name,entry2);model=resolveField(entry2,"model",ctx)}return{entry:entry2,repoPath,identityPath,model}}function buildSpawnResolveContext(agentName,_entry){let ctx={};try{let ws=findWorkspace();if(ws){let wsConfig=getWorkspaceConfig(ws.root);ctx.workspaceDefaults=wsConfig.agents?.defaults}}catch{}if(agentName.includes("/")){let parentName=agentName.split("/")[0];try{let{readFileSync:readFileSync20,existsSync:existsSync31}=__require("fs"),{join:join36}=__require("path"),ws=findWorkspace();if(ws){let parentAgentsMd=join36(ws.root,"agents",parentName,"AGENTS.md");if(existsSync31(parentAgentsMd)){let{parseFrontmatter:parseFrontmatter3}=(init_frontmatter(),__toCommonJS(exports_frontmatter)),parentFm=parseFrontmatter3(readFileSync20(parentAgentsMd,"utf-8"));ctx.parent={name:parentName,fields:parentFm}}}}catch{}}return ctx}function resolveAgentWorkingDir(entry2,explicitCwd){if(explicitCwd)return explicitCwd;if(entry2.dir)return entry2.dir;let repo=entry2.repo;if(repo&&__require("fs").existsSync(repo))return repo;return process.cwd()}async function buildSpawnParams2(name,team,options,agent,preassignedSessionId){let resolvedProvider=options.provider??agent.entry.provider??"claude",params={provider:resolvedProvider,team,role:name,skill:options.skill,extraArgs:options.extraArgs,model:agent.model,systemPromptFile:agent.identityPath??void 0,promptMode:agent.entry.promptMode,initialPrompt:options.prompt??options.initialPrompt,newWindow:options.newWindow,windowTarget:options.window},{parentSessionId,spawnColor,nativeTeam}=await resolveNativeTeam(team,agent.repoPath,{...options,provider:resolvedProvider,role:name});if(nativeTeam)params.nativeTeam=nativeTeam;try{let{injectTeamHooks:injectTeamHooks2}=await Promise.resolve().then(() => (init_inject(),exports_inject));if(await injectTeamHooks2(team))console.log(` Hooks: injected genie hook dispatch into team "${team}"`)}catch(err){console.warn(`Warning: could not inject hooks for team "${team}": ${err instanceof Error?err.message:err}`)}if(params.provider==="claude")params.sessionId=preassignedSessionId??crypto.randomUUID();if(params.provider==="claude"){if(await startOtelReceiver())params.otelPort=getOtelPort(),params.otelLogPrompts=!0}return{params,parentSessionId,spawnColor}}async function maybeStartOtelRelay(nt,validated,insideTmux){if(!nt?.enabled&&validated.provider==="codex"&&insideTmux)return ensureCodexOtelConfig(),await ensureOtelRelay(validated.team);return!1}function buildSdkRuntimeExtra(options){let extra={};if(options.sdkMaxTurns!=null)extra.maxTurns=options.sdkMaxTurns;if(options.sdkMaxBudget!=null)extra.maxBudgetUsd=options.sdkMaxBudget;if(options.sdkEffort)extra.effort=options.sdkEffort;if(options.sdkResume)extra.resume=options.sdkResume;return Object.keys(extra).length>0?extra:void 0}async function dispatchSpawn(ctx,validated,options,agent,insideTmux){if(validated.provider==="claude-sdk"){let streamFormat=options.streamFormat??"text",streamOpts=options.stream||options.sdkStream?{stream:!0,streamFormat}:void 0;return await launchSdkSpawn(ctx,agent.entry.permissions,streamOpts,agent.entry.sdk,buildSdkRuntimeExtra(options))}if(insideTmux)return await launchTmuxSpawn(ctx);return await launchInlineSpawn(ctx)}async function resolveTeamName3(opts){if(opts.explicitTeam)return opts.explicitTeam;if(opts.entryTeam)return opts.entryTeam;let env=opts.env??process.env;if(env.GENIE_TEAM)return env.GENIE_TEAM;return await(opts.discover??discoverTeamName)()??null}async function pickParallelShortId(baseName,team,uuid){if(!UUID_REGEX.test(uuid))throw Error(`pickParallelShortId: expected a well-formed UUID (8-4-4-4-12 hex), got ${JSON.stringify(uuid)}`);let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2();for(let k=4;k<=uuid.length;k++){let slice=uuid.slice(0,k),id=`${baseName}-${slice}`;if((await sql`
|
|
1736
1736
|
SELECT id FROM agents WHERE id = ${id} LIMIT 1
|
|
1737
1737
|
`).length===0)return slice}return uuid}async function resolveSpawnIdentity(name,team,uuidFactory=()=>crypto.randomUUID(),isAliveFn=(agent)=>resolveWorkerLivenessByTransport(agent)){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),rows=await(await getConnection2())`
|
|
1738
1738
|
SELECT id, pane_id, team FROM agents WHERE id = ${name} LIMIT 1
|
|
1739
|
-
`;if(rows.length===0)return{kind:"canonical",workerId:name,sessionUuid:uuidFactory()};let existing=rows[0];if(existing.team!==null&&existing.team!==team){let sessionUuid2=uuidFactory(),shortId2=await pickParallelShortId(name,team,sessionUuid2);return{kind:"parallel",workerId:`${name}-${shortId2}`,sessionUuid:sessionUuid2,canonicalId:name}}let alive=!1;if(existing.pane_id)try{alive=await isAliveFn({id:existing.id,paneId:existing.pane_id})}catch(err){let message=err instanceof Error?err.message:String(err);if(err instanceof TmuxUnreachableError||message.includes("no server running")||message.includes("server exited")||message.includes("error connecting"))alive=!1;else throw err}if(!alive)return{kind:"canonical",workerId:name,sessionUuid:uuidFactory()};let sessionUuid=uuidFactory(),shortId=await pickParallelShortId(name,team,sessionUuid);return{kind:"parallel",workerId:`${name}-${shortId}`,sessionUuid,canonicalId:name}}async function resolveTeamAndResume(effectiveRole,options,agent){let teamWasExplicit=Boolean(options.team),team=await resolveTeamName3({explicitTeam:options.team,entryTeam:agent.entry?.team});if(!team){let candidates=await findTeamsContainingAgent(effectiveRole);if(candidates.length===1)team=candidates[0];else if(candidates.length>1)return console.error(`Error: agent "${effectiveRole}" is a member of multiple teams (${candidates.join(", ")}). Pass --team <name> to disambiguate.`),process.exit(1)}if(!team){if(await get2(effectiveRole))team=sanitizeTeamName(effectiveRole)}if(!team)return console.error(`Error: --team is required for agent "${effectiveRole}" (or set GENIE_TEAM, run inside a genie session, or register the agent in a team config).`),process.exit(1);let deadResumable=await findDeadResumable(team,effectiveRole);if(deadResumable)return console.log(`Resuming existing session for "${effectiveRole}" (session: ${deadResumable.claudeSessionId?.slice(0,8)}...)`),await resumeAgent(deadResumable),{team,teamWasExplicit,resumed:deadResumable.id};return{team,teamWasExplicit}}async function handleWorkerSpawn(name,options){let effectiveRole=options.role??name,agent=await resolveAgentForSpawn(name,options),{team,teamWasExplicit,resumed}=await resolveTeamAndResume(effectiveRole,options,agent);if(resumed)return resumed;let explicitRole=options.role!==void 0&&options.role!==name,identity=null;if(!explicitRole)identity=await resolveSpawnIdentity(name,team),effectiveRole=identity.workerId;else await rejectDuplicateRole(team,effectiveRole);let teamConfig=await getTeam(team);if(teamConfig?.worktreePath&&!agent.entry?.dir)agent={...agent,repoPath:teamConfig.worktreePath};let{params,parentSessionId,spawnColor}=await buildSpawnParams2(effectiveRole,team,options,agent,identity?.sessionUuid);if(!params.name)params.name=`${params.team}-${effectiveRole}`;let nt=params.nativeTeam,agentName=nt?.agentName??effectiveRole,agentIdentity=await findOrCreateAgent(agentName,team,effectiveRole);await terminateActiveExecutorWithCleanup(agentIdentity.id);let executorId=crypto.randomUUID();params.agentId=agentIdentity.id,params.executorId=executorId;let validated=validateSpawnParams(params),launch=buildLaunchCommand(validated),layoutMode=resolveLayoutMode(options.layout),workerId=identity?.workerId??await generateWorkerId2(validated.team,effectiveRole),insideTmux=Boolean(process.env.TMUX||options.session),now=new Date().toISOString(),otelRelayActive=await maybeStartOtelRelay(nt,validated,insideTmux),fullCommand=prependEnvVars(launch.command,launch.env),ctx={workerId,validated,launch,layoutMode,fullCommand,agentName,spawnColor,parentSessionId,claudeSessionId:validated.sessionId,otelRelayActive,now,transport:insideTmux?"tmux":"inline",extraArgs:options.extraArgs,cwd:agent.repoPath,spawnIntoCurrentWindow:!teamWasExplicit&&!process.env.GENIE_TEAM&&insideTmux&&!options.session,sessionOverride:options.session,autoResume:options.autoResume,agentIdentityId:agentIdentity.id,executorId};return recordAuditEvent("worker",workerId,"spawn",getActor(),{name,team:validated.team,provider:validated.provider}).catch(()=>{}),await dispatchSpawn(ctx,validated,options,agent,insideTmux)}async function cleanupWorkerNativeTeam(w){if(!w.team||!w.nativeAgentId)return;let agentName=w.nativeAgentId.split("@")[0];await clearNativeInbox(w.team,agentName).catch(()=>{}),await unregisterNativeMember(w.team,agentName).catch(()=>{})}function killWorkerPane(w){try{let{execSync:execSync11}=__require("child_process"),currentPane=execSync11(genieTmuxCmd("display-message -p '#{pane_id}'"),{encoding:"utf-8"}).trim();if(w.paneId&&/^(%\d+|inline)$/.test(w.paneId)&&w.paneId!==currentPane)execSync11(genieTmuxCmd(`kill-pane -t ${w.paneId}`),{stdio:"ignore"});else if(w.paneId===currentPane)console.log(" (skipped pane kill \u2014 would kill current session)")}catch{}}function cleanupRelayFiles(id){try{let{join:join36}=__require("path"),{homedir:homedir23}=__require("os"),{unlinkSync:unlinkSync9}=__require("fs"),relayDir=join36(homedir23(),".genie","relay");for(let suffix of["-pane","-meta"])try{unlinkSync9(join36(relayDir,`${id}${suffix}`))}catch{}}catch{}}async function resolveWorkerByName(name){let exact=await get(name);if(exact)return exact;let workers=await list(),byRole=workers.filter((w)=>w.role===name);if(byRole.length===1)return byRole[0];if(byRole.length>1){console.error(`Multiple agents with role "${name}". Specify full ID:`);for(let w of byRole)console.error(` ${w.id} (team: ${w.team})`);process.exit(1)}let bySuffix=workers.filter((w)=>w.id.endsWith(`-${name}`));if(bySuffix.length===1)return bySuffix[0];if(bySuffix.length>1){console.error(`Multiple agents matching "${name}". Specify full ID:`);for(let w of bySuffix)console.error(` ${w.id}`);process.exit(1)}console.error(`Agent "${name}" not found.`),console.error(" Run `genie agent list` to see agents."),process.exit(1)}async function handleWorkerKill(name){let w=await resolveWorkerByName(name);killWorkerPane(w),cleanupRelayFiles(w.id),await cleanupWorkerNativeTeam(w),await unregister(w.id),console.log(`Agent "${w.id}" killed and unregistered (template preserved).`),recordAuditEvent("worker",w.id,"kill",getActor(),{name}).catch(()=>{})}async function handleWorkerStop(name){let w=await resolveWorkerByName(name);if(w.state==="suspended"){console.log(`Agent "${w.id}" is already stopped.`);return}if(!w.currentExecutorId)console.error(`Cannot stop agent "${w.id}" \u2014 no active executor linked.`),console.error(" The agent may have already exited, or was spawned without"),console.error(" executor tracking (e.g. native Claude Code teammate)."),console.error(` To remove the agent row, use: genie kill ${w.id}`),process.exit(1);let{suspendWorker:suspendWorker2}=await Promise.resolve().then(() => (init_idle_timeout(),exports_idle_timeout));if(await suspendWorker2(w.currentExecutorId)){if(console.log(`Agent "${w.id}" stopped.`),w.claudeSessionId)console.log(` Session preserved: ${w.claudeSessionId}`);console.log(` Send a message to auto-resume: genie send '...' --to ${w.id}`),recordAuditEvent("worker",w.id,"stop",getActor(),{name}).catch(()=>{})}else console.error(`Failed to stop agent "${w.id}" \u2014 executor ${w.currentExecutorId} not found in executors table.`),console.error(" This indicates a stale current_executor_id FK. Try:"),console.error(` genie kill ${w.id} # force remove the agent row`),process.exit(1)}async function isResumeEligible(w){if(!w.claudeSessionId)return!1;if(w.state==="done")return!1;let paneAlive=await isPaneAliveOrDead(w.paneId);if((w.state==="suspended"||w.state==="error")&&!paneAlive)return!0;if(!paneAlive&&(w.state==="working"||w.state==="idle"||w.state==="spawning"))return!0;return!1}async function resumeAllAgents(opts={}){let workers=await list(),toResume=[];for(let w of workers)if(await isResumeEligible(w))toResume.push(w);if(toResume.length===0){console.log("No eligible agents to resume.");return}console.log(`Resuming ${toResume.length} agent(s)...`);for(let w of toResume)try{await resumeAgent(w,opts)}catch(err){console.error(` Failed to resume "${w.id}": ${err instanceof Error?err.message:err}`)}}async function handleWorkerResume(name,options){let resumeOpts={resetAttempts:!options.noResetAttempts};if(options.all)return resumeAllAgents(resumeOpts);if(!name)console.error("Error: provide an agent name, or use --all to resume all eligible agents."),process.exit(1);let w=await resolveWorkerByName(name);if(!w.claudeSessionId)console.error(`Error: Agent "${w.id}" has no Claude session ID \u2014 cannot resume.`),console.error(" Only agents spawned with the Claude provider have resumable sessions."),process.exit(1);if(await isPaneAliveOrDead(w.paneId)){console.log(`Agent "${w.id}" is already running (pane ${w.paneId} is alive).`);return}await resumeAgent(w,resumeOpts)}async function buildResumeParams(agent,template,resumeSessionId){let agentName=agent.role??agent.id,provider=template?.provider??agent.provider??"claude",team=template?.team??agent.team??await discoverTeamName();if(!team)throw Error(`Cannot resume agent "${agent.id}": no team context (template, agent record, env, or session). Pass --team or set GENIE_TEAM, or run inside a registered tmux session.`);let systemPromptFile,promptMode,dirEntry=await get2(agentName);if(dirEntry?.dir)systemPromptFile=loadIdentity(dirEntry)??void 0,promptMode=dirEntry.promptMode;return{provider,team,role:agentName,skill:template?.skill??agent.skill,extraArgs:template?.extraArgs,resume:resumeSessionId,name:`${team}-${agentName}`,model:dirEntry?.model,systemPromptFile,promptMode}}function formatGroupStatus(name,group,allGroups){let detail=group.status;if(group.completedAt)detail+=` (completed at ${group.completedAt})`;else if(group.startedAt)detail+=` (started at ${group.startedAt})`;if(group.status==="blocked"&&group.dependsOn.length>0){let pending=group.dependsOn.filter((dep)=>allGroups[dep]?.status!=="done");if(pending.length>0)detail+=` (depends on ${pending.join(", ")})`}return`Group ${name}: ${detail}`}async function buildResumeContext(agent){if((agent.role==="team-lead"||agent.team&&agent.role===await resolveTeamLeaderName(agent.team))&&agent.wishSlug)try{let state=await(await Promise.resolve().then(() => (init_wish_state(),exports_wish_state))).getState(agent.wishSlug,agent.repoPath);if(state){let groupLines=Object.entries(state.groups).map(([name,group])=>formatGroupStatus(name,group,state.groups));return["You were resumed after a crash. Here's where you left off:",`Wish: ${state.wish}`,"",...groupLines,"",`Continue from where you left off. Run \`genie status ${state.wish}\` to verify, then dispatch the next wave.`].join(`
|
|
1739
|
+
`;if(rows.length===0)return{kind:"canonical",workerId:name,sessionUuid:uuidFactory()};let existing=rows[0];if(existing.team!==null&&existing.team!==team){let sessionUuid2=uuidFactory(),shortId2=await pickParallelShortId(name,team,sessionUuid2);return{kind:"parallel",workerId:`${name}-${shortId2}`,sessionUuid:sessionUuid2,canonicalId:name}}let alive=!1;if(existing.pane_id)try{alive=await isAliveFn({id:existing.id,paneId:existing.pane_id})}catch(err){let message=err instanceof Error?err.message:String(err);if(err instanceof TmuxUnreachableError||message.includes("no server running")||message.includes("server exited")||message.includes("error connecting"))alive=!1;else throw err}if(!alive)return{kind:"canonical",workerId:name,sessionUuid:uuidFactory()};let sessionUuid=uuidFactory(),shortId=await pickParallelShortId(name,team,sessionUuid);return{kind:"parallel",workerId:`${name}-${shortId}`,sessionUuid,canonicalId:name}}async function resolveTeamAndResume(effectiveRole,options,agent){let teamWasExplicit=Boolean(options.team),team=await resolveTeamName3({explicitTeam:options.team,entryTeam:agent.entry?.team});if(!team){let candidates=await findTeamsContainingAgent(effectiveRole);if(candidates.length===1)team=candidates[0];else if(candidates.length>1)return console.error(`Error: agent "${effectiveRole}" is a member of multiple teams (${candidates.join(", ")}). Pass --team <name> to disambiguate.`),process.exit(1)}if(!team){if(await get2(effectiveRole))team=sanitizeTeamName(effectiveRole)}if(!team)return console.error(`Error: --team is required for agent "${effectiveRole}" (or set GENIE_TEAM, run inside a genie session, or register the agent in a team config).`),process.exit(1);let deadResumable=await findDeadResumable(team,effectiveRole);if(deadResumable)return console.log(`Resuming existing session for "${effectiveRole}" (session: ${deadResumable.claudeSessionId?.slice(0,8)}...)`),await resumeAgent(deadResumable),{team,teamWasExplicit,resumed:deadResumable.id};return{team,teamWasExplicit}}async function handleWorkerSpawn(name,options){let effectiveRole=options.role??name,agent=await resolveAgentForSpawn(name,options),{team,teamWasExplicit,resumed}=await resolveTeamAndResume(effectiveRole,options,agent);if(resumed)return resumed;let explicitRole=options.role!==void 0&&options.role!==name,identity=null;if(!explicitRole)identity=await resolveSpawnIdentity(name,team),effectiveRole=identity.workerId;else await rejectDuplicateRole(team,effectiveRole);let teamConfig=await getTeam(team);if(teamConfig?.worktreePath&&!agent.entry?.dir)agent={...agent,repoPath:teamConfig.worktreePath};let{params,parentSessionId,spawnColor}=await buildSpawnParams2(effectiveRole,team,options,agent,identity?.sessionUuid);if(!params.name)params.name=`${params.team}-${effectiveRole}`;let nt=params.nativeTeam,agentName=nt?.agentName??effectiveRole,agentIdentity=await findOrCreateAgent(agentName,team,effectiveRole);await terminateActiveExecutorWithCleanup(agentIdentity.id);let executorId=crypto.randomUUID();params.agentId=agentIdentity.id,params.executorId=executorId;let validated=validateSpawnParams(params),launch=buildLaunchCommand(validated),layoutMode=resolveLayoutMode(options.layout),workerId=identity?.workerId??await generateWorkerId2(validated.team,effectiveRole),insideTmux=Boolean(process.env.TMUX||options.session),now=new Date().toISOString(),otelRelayActive=await maybeStartOtelRelay(nt,validated,insideTmux),fullCommand=prependEnvVars(launch.command,launch.env),ctx={workerId,validated,launch,layoutMode,fullCommand,agentName,spawnColor,parentSessionId,claudeSessionId:validated.sessionId,otelRelayActive,now,transport:insideTmux?"tmux":"inline",extraArgs:options.extraArgs,cwd:agent.repoPath,spawnIntoCurrentWindow:!teamWasExplicit&&!process.env.GENIE_TEAM&&insideTmux&&!options.session,sessionOverride:options.session,autoResume:options.autoResume,agentIdentityId:agentIdentity.id,executorId};return recordAuditEvent("worker",workerId,"spawn",getActor(),{name,team:validated.team,provider:validated.provider}).catch(()=>{}),await dispatchSpawn(ctx,validated,options,agent,insideTmux)}async function cleanupWorkerNativeTeam(w){if(!w.team||!w.nativeAgentId)return;let agentName=w.nativeAgentId.split("@")[0];await clearNativeInbox(w.team,agentName).catch(()=>{}),await unregisterNativeMember(w.team,agentName).catch(()=>{})}function killWorkerPane(w){try{let{execSync:execSync10}=__require("child_process"),currentPane=execSync10(genieTmuxCmd("display-message -p '#{pane_id}'"),{encoding:"utf-8"}).trim();if(w.paneId&&/^(%\d+|inline)$/.test(w.paneId)&&w.paneId!==currentPane)execSync10(genieTmuxCmd(`kill-pane -t ${w.paneId}`),{stdio:"ignore"});else if(w.paneId===currentPane)console.log(" (skipped pane kill \u2014 would kill current session)")}catch{}}function cleanupRelayFiles(id){try{let{join:join36}=__require("path"),{homedir:homedir23}=__require("os"),{unlinkSync:unlinkSync9}=__require("fs"),relayDir=join36(homedir23(),".genie","relay");for(let suffix of["-pane","-meta"])try{unlinkSync9(join36(relayDir,`${id}${suffix}`))}catch{}}catch{}}async function resolveWorkerByName(name){let exact=await get(name);if(exact)return exact;let workers=await list(),byRole=workers.filter((w)=>w.role===name);if(byRole.length===1)return byRole[0];if(byRole.length>1){console.error(`Multiple agents with role "${name}". Specify full ID:`);for(let w of byRole)console.error(` ${w.id} (team: ${w.team})`);process.exit(1)}let bySuffix=workers.filter((w)=>w.id.endsWith(`-${name}`));if(bySuffix.length===1)return bySuffix[0];if(bySuffix.length>1){console.error(`Multiple agents matching "${name}". Specify full ID:`);for(let w of bySuffix)console.error(` ${w.id}`);process.exit(1)}console.error(`Agent "${name}" not found.`),console.error(" Run `genie agent list` to see agents."),process.exit(1)}async function handleWorkerKill(name){let w=await resolveWorkerByName(name);killWorkerPane(w),cleanupRelayFiles(w.id),await cleanupWorkerNativeTeam(w),await unregister(w.id),console.log(`Agent "${w.id}" killed and unregistered (template preserved).`),recordAuditEvent("worker",w.id,"kill",getActor(),{name}).catch(()=>{})}async function handleWorkerStop(name){let w=await resolveWorkerByName(name);if(w.state==="suspended"){console.log(`Agent "${w.id}" is already stopped.`);return}if(!w.currentExecutorId)console.error(`Cannot stop agent "${w.id}" \u2014 no active executor linked.`),console.error(" The agent may have already exited, or was spawned without"),console.error(" executor tracking (e.g. native Claude Code teammate)."),console.error(` To remove the agent row, use: genie kill ${w.id}`),process.exit(1);let{suspendWorker:suspendWorker2}=await Promise.resolve().then(() => (init_idle_timeout(),exports_idle_timeout));if(await suspendWorker2(w.currentExecutorId)){if(console.log(`Agent "${w.id}" stopped.`),w.claudeSessionId)console.log(` Session preserved: ${w.claudeSessionId}`);console.log(` Send a message to auto-resume: genie send '...' --to ${w.id}`),recordAuditEvent("worker",w.id,"stop",getActor(),{name}).catch(()=>{})}else console.error(`Failed to stop agent "${w.id}" \u2014 executor ${w.currentExecutorId} not found in executors table.`),console.error(" This indicates a stale current_executor_id FK. Try:"),console.error(` genie kill ${w.id} # force remove the agent row`),process.exit(1)}async function isResumeEligible(w){if(!w.claudeSessionId)return!1;if(w.state==="done")return!1;let paneAlive=await isPaneAliveOrDead(w.paneId);if((w.state==="suspended"||w.state==="error")&&!paneAlive)return!0;if(!paneAlive&&(w.state==="working"||w.state==="idle"||w.state==="spawning"))return!0;return!1}async function resumeAllAgents(opts={}){let workers=await list(),toResume=[];for(let w of workers)if(await isResumeEligible(w))toResume.push(w);if(toResume.length===0){console.log("No eligible agents to resume.");return}console.log(`Resuming ${toResume.length} agent(s)...`);for(let w of toResume)try{await resumeAgent(w,opts)}catch(err){console.error(` Failed to resume "${w.id}": ${err instanceof Error?err.message:err}`)}}async function handleWorkerResume(name,options){let resumeOpts={resetAttempts:!options.noResetAttempts};if(options.all)return resumeAllAgents(resumeOpts);if(!name)console.error("Error: provide an agent name, or use --all to resume all eligible agents."),process.exit(1);let w=await resolveWorkerByName(name);if(!w.claudeSessionId)console.error(`Error: Agent "${w.id}" has no Claude session ID \u2014 cannot resume.`),console.error(" Only agents spawned with the Claude provider have resumable sessions."),process.exit(1);if(await isPaneAliveOrDead(w.paneId)){console.log(`Agent "${w.id}" is already running (pane ${w.paneId} is alive).`);return}await resumeAgent(w,resumeOpts)}async function buildResumeParams(agent,template,resumeSessionId){let agentName=agent.role??agent.id,provider=template?.provider??agent.provider??"claude",team=template?.team??agent.team??await discoverTeamName();if(!team)throw Error(`Cannot resume agent "${agent.id}": no team context (template, agent record, env, or session). Pass --team or set GENIE_TEAM, or run inside a registered tmux session.`);let systemPromptFile,promptMode,dirEntry=await get2(agentName);if(dirEntry?.dir)systemPromptFile=loadIdentity(dirEntry)??void 0,promptMode=dirEntry.promptMode;return{provider,team,role:agentName,skill:template?.skill??agent.skill,extraArgs:template?.extraArgs,resume:resumeSessionId,name:`${team}-${agentName}`,model:dirEntry?.model,systemPromptFile,promptMode}}function formatGroupStatus(name,group,allGroups){let detail=group.status;if(group.completedAt)detail+=` (completed at ${group.completedAt})`;else if(group.startedAt)detail+=` (started at ${group.startedAt})`;if(group.status==="blocked"&&group.dependsOn.length>0){let pending=group.dependsOn.filter((dep)=>allGroups[dep]?.status!=="done");if(pending.length>0)detail+=` (depends on ${pending.join(", ")})`}return`Group ${name}: ${detail}`}async function buildResumeContext(agent){if((agent.role==="team-lead"||agent.team&&agent.role===await resolveTeamLeaderName(agent.team))&&agent.wishSlug)try{let state=await(await Promise.resolve().then(() => (init_wish_state(),exports_wish_state))).getState(agent.wishSlug,agent.repoPath);if(state){let groupLines=Object.entries(state.groups).map(([name,group])=>formatGroupStatus(name,group,state.groups));return["You were resumed after a crash. Here's where you left off:",`Wish: ${state.wish}`,"",...groupLines,"",`Continue from where you left off. Run \`genie status ${state.wish}\` to verify, then dispatch the next wave.`].join(`
|
|
1740
1740
|
`)}}catch{}if(agent.team)return"You were resumed. Check your team's current state with `genie status`.";return}async function buildFullResumeParams(agent,template){if(!agent.claudeSessionId)throw new MissingResumeSessionError(agent.id);let params=await buildResumeParams(agent,template,agent.claudeSessionId),resumeContext=await buildResumeContext(agent);if(resumeContext)params.initialPrompt=resumeContext;if(agent.nativeTeamEnabled){let nativeResult=await resolveNativeTeam(params.team,agent.repoPath,{provider:params.provider,role:params.role,color:agent.nativeColor});if(nativeResult.nativeTeam)params.nativeTeam=nativeResult.nativeTeam}return params}async function createResumeExecutor(agent,params,paneId,teamWindow,cwd,spawnColor){let resumeAgentName=agent.role??agent.id,resumeTeam=agent.team??params.team,agentId=params.agentId??(await findOrCreateAgent(resumeAgentName,resumeTeam,agent.role)).id;await terminateActiveExecutorWithCleanup(agentId);let pid=await capturePanePid2(paneId);await createAndLinkExecutor2(agentId,params.provider,resolveExecutorTransport2(params.provider,"tmux"),{id:params.executorId,pid,tmuxSession:params.team,tmuxPaneId:paneId,tmuxWindow:teamWindow?.windowName??null,tmuxWindowId:teamWindow?.windowId??null,claudeSessionId:agent.claudeSessionId??null,state:"spawning",repoPath:cwd,paneColor:spawnColor})}async function resumeAgent(agent,opts={}){let resetAttempts=opts.resetAttempts!==!1,template=(await listTemplates()).find((t)=>t.id===(agent.role??agent.id));if(resetAttempts)await update(agent.id,{resumeAttempts:0});let params=await buildFullResumeParams(agent,template),resumeAgentName=agent.role??agent.id,resumeTeam=agent.team??params.team,agentIdentity=await findOrCreateAgent(resumeAgentName,resumeTeam,agent.role),executorId=crypto.randomUUID();params.agentId=agentIdentity.id,params.executorId=executorId;let validated=validateSpawnParams(params),launch=buildLaunchCommand(validated),fullCommand=prependEnvVars(launch.command,launch.env),now=new Date().toISOString();if(!process.env.TMUX)console.error("Error: resume requires tmux. Start a tmux session first."),process.exit(1);let ctx={workerId:agent.id,validated,launch,layoutMode:resolveLayoutMode(void 0),fullCommand,agentName:agent.role??agent.id,spawnColor:agent.nativeColor??"blue",parentSessionId:agent.parentSessionId??`genie-${params.team}`,claudeSessionId:agent.claudeSessionId,otelRelayActive:!1,now,transport:"tmux",extraArgs:template?.extraArgs,cwd:template?.cwd??agent.repoPath,spawnIntoCurrentWindow:!1,autoResume:agent.autoResume,agentIdentityId:agentIdentity.id,executorId},teamWindow=await resolveSpawnTeamWindow(validated.team,ctx.cwd),paneId;try{paneId=createTmuxPane(ctx,teamWindow)}catch(err){console.error(`Failed to create tmux pane: ${err instanceof Error?err.message:"unknown error"}`),process.exit(1)}if(await createResumeExecutor(agent,validated,paneId,teamWindow,ctx.cwd,ctx.spawnColor),await applySpawnLayout(ctx,teamWindow),await update(agent.id,{paneId,state:"spawning",startedAt:now,lastStateChange:now,suspendedAt:void 0,windowName:teamWindow?.windowName,windowId:teamWindow?.windowId,window:teamWindow?.windowName}),await notifySpawnJoin(ctx,paneId),await injectResumeContext(ctx.cwd??agent.repoPath??process.cwd(),agent.id,agent.role??agent.id,params.team),ctx.spawnColor&&paneId!=="inline")await applyPaneColor(paneId,ctx.spawnColor,teamWindow?.windowId);if(recordAuditEvent("worker",agent.id,"resumed",getActor(),{claudeSessionId:agent.claudeSessionId,team:agent.team}).catch(()=>{}),console.log(`Agent "${agent.id}" resumed.`),console.log(` Session: ${agent.claudeSessionId}`),console.log(` Pane: ${paneId}`),teamWindow)console.log(` Window: ${teamWindow.windowName} (${teamWindow.windowId})`)}async function resolveWorkerLiveness(w){if(/^%\d+$/.test(w.paneId))return{alive:await isPaneAliveOrDead(w.paneId),state:w.state};let execState=await getLiveExecutorState(w.id);return{alive:execState!==null,state:execState??w.state}}async function buildWorkerStatusMap(workers){let statusMap=new Map;for(let w of workers){let name=w.role||w.id,{alive,state}=await resolveWorkerLiveness(w);if(alive)statusMap.set(name,{state,team:w.team||"-"});else if(w.state==="suspended"||w.state==="error"){let attempts=w.resumeAttempts??0,max=w.maxResumeAttempts??3,autoStr=w.autoResume===!1?"off":"on";statusMap.set(name,{state:`${w.state} (${attempts}/${max} resumes, auto-resume: ${autoStr})`,team:w.team||"-",resumeAttempts:attempts,maxResumeAttempts:max,autoResume:w.autoResume!==!1})}}return statusMap}async function resolveAgentNamesBySource(source){let executorRegistry=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),agentRegistry=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),executors=await executorRegistry.listExecutors(void 0,source),agentIds=new Set(executors.map((e)=>e.agentId)),agents=await agentRegistry.listAgents({});return new Set(agents.filter((a)=>agentIds.has(a.id)).map((a)=>a.customName??a.role??a.id))}async function handleLsCommand(options){let dirEntries=await ls(),workers=await list(),statusMap=await buildWorkerStatusMap(workers),sourceAgentNames=options.source?await resolveAgentNamesBySource(options.source):void 0,entries=[];for(let entry2 of dirEntries){let running=statusMap.get(entry2.name);entries.push({name:entry2.name,dir:entry2.dir||"-",status:running?running.state:"offline",team:running?.team||"-",model:entry2.model||"-",resumeAttempts:running?.resumeAttempts,maxResumeAttempts:running?.maxResumeAttempts,autoResume:running?.autoResume}),statusMap.delete(entry2.name)}for(let[name,info]of statusMap)entries.push({name,dir:"(built-in)",status:info.state,team:info.team,model:"-",resumeAttempts:info.resumeAttempts,maxResumeAttempts:info.maxResumeAttempts,autoResume:info.autoResume});if(sourceAgentNames)entries=entries.filter((e)=>sourceAgentNames.has(e.name));if(options.json){console.log(JSON.stringify(entries,null,2));return}if(entries.length===0){console.log("No agents registered. Use `genie dir add <name> --dir <path>` to register one.");return}console.log(""),console.log(formatLsRow("NAME","DIR","STATUS","TEAM","MODEL")),console.log("-".repeat(106));for(let e of entries)console.log(formatLsRow(e.name,e.dir,e.status,e.team,e.model));console.log("")}function formatLsRow(name,dir,status,team,model){return`${name.padEnd(20).substring(0,20)}${dir.padEnd(30).substring(0,30)}${status.padEnd(44).substring(0,44)}${team.padEnd(12).substring(0,12)}${model}`}var UUID_REGEX;var init_agents=__esm(()=>{init_agent_directory();init_agent_registry();init_audit();init_builtin_agents();init_claude_native_teams();init_codex_config();init_defaults();init_ensure_tmux();init_executor_registry();init_otel_receiver();init_protocol_router_spawn();init_protocol_router();init_provider_adapters();init_registry2();init_spawn_command();init_team_manager();init_tmux_wrapper();init_tmux();init_tmux();init_workspace();UUID_REGEX=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i});var exports_codex_logs={};__export(exports_codex_logs,{parseCodexLine:()=>parseCodexLine,extractCodexContent:()=>extractCodexContent,codexTranscriptProvider:()=>codexTranscriptProvider});import{access as access2,readFile as readFile10,readdir as readdir4}from"fs/promises";import{homedir as homedir23}from"os";import{join as join36}from"path";function getCodexDir(){return join36(homedir23(),".codex")}function getSessionsDir(){return join36(getCodexDir(),"sessions")}function getStateDbPath(){return join36(getCodexDir(),"state_5.sqlite")}async function discoverLogPath(worker){let cwd=worker.worktree||worker.repoPath,sqlitePath=await discoverViaSqlite(cwd);if(sqlitePath)try{return await access2(sqlitePath),sqlitePath}catch{}return discoverViaScan(cwd)}async function discoverViaSqlite(cwd){try{let{Database}=await import("bun:sqlite"),dbPath=getStateDbPath(),db=new Database(dbPath,{readonly:!0});try{return db.query("SELECT rollout_path FROM threads WHERE cwd = ? ORDER BY updated_at DESC LIMIT 1").get(cwd)?.rollout_path??null}finally{db.close()}}catch{return null}}async function listDirsDesc(parent,pattern){return(await readdir4(parent)).filter((d)=>pattern.test(d)).sort().reverse()}async function discoverViaScan(cwd){let sessionsDir=getSessionsDir();try{let years=await listDirsDesc(sessionsDir,/^\d{4}$/);for(let year of years.slice(0,2)){let result2=await scanYear(join36(sessionsDir,year),cwd);if(result2)return result2}}catch{}return null}async function scanYear(yearDir,cwd){let months=await listDirsDesc(yearDir,/^\d{2}$/);for(let month of months.slice(0,2)){let result2=await scanMonth(join36(yearDir,month),cwd);if(result2)return result2}return null}async function scanMonth(monthDir,cwd){let days=await listDirsDesc(monthDir,/^\d{2}$/);for(let day of days.slice(0,3)){let result2=await scanDay(join36(monthDir,day),cwd);if(result2)return result2}return null}async function scanDay(dayDir,cwd){let files=(await readdir4(dayDir)).filter((f)=>f.endsWith(".jsonl")).sort().reverse();for(let file of files.slice(0,5)){let filePath=join36(dayDir,file);if((await readSessionMeta(filePath))?.cwd===cwd)return filePath}return null}async function readSessionMeta(filePath){try{let content=await readFile10(filePath,"utf-8"),nlIdx=content.indexOf(`
|
|
1741
1741
|
`),firstLine=nlIdx===-1?content:content.slice(0,nlIdx),entry2=JSON.parse(firstLine);if(entry2.type==="session_meta"&&entry2.payload?.cwd)return{cwd:entry2.payload.cwd}}catch{}return null}function parseEventMsg(payload,ts3,base){if(payload.type==="user_message"){let text=String(payload.message??"");return text?[{...base,role:"user",timestamp:ts3,text}]:[]}if(payload.type==="agent_message"){let text=String(payload.message??"");return text?[{...base,role:"assistant",timestamp:ts3,text}]:[]}return[]}function parseResponseMessage(payload,ts3,base){let role=payload.role,text=extractCodexContent(payload.content);if(!text)return[];if(role==="user")return[{...base,role:"user",timestamp:ts3,text}];if(role==="developer")return[{...base,role:"system",timestamp:ts3,text}];if(role==="assistant")return[{...base,role:"assistant",timestamp:ts3,text}];return[]}function parseFunctionCall(payload,ts3,base){let name=String(payload.name??payload.type),callId=String(payload.call_id??""),input={};try{input=typeof payload.arguments==="string"?JSON.parse(payload.arguments):{}}catch{input={raw:payload.arguments}}let cmdText=input.command?String(Array.isArray(input.command)?input.command.join(" "):input.command):name;return[{...base,role:"tool_call",timestamp:ts3,text:`${name}: ${cmdText.slice(0,200)}`,toolCall:{id:callId,name,input}}]}function parseWebSearch(payload,ts3,base){let action=payload.action,query2=String(action?.query??"web search");return[{...base,role:"tool_call",timestamp:ts3,text:`web_search: ${query2.slice(0,200)}`,toolCall:{id:"",name:"web_search",input:{query:query2}}}]}function parseResponseItem(payload,ts3,base){if(payload.type==="message")return parseResponseMessage(payload,ts3,base);if(payload.type==="function_call"||payload.type==="shell")return parseFunctionCall(payload,ts3,base);if(payload.type==="function_call_output"){let output=String(payload.output??"").slice(0,500);return[{...base,role:"tool_result",timestamp:ts3,text:output}]}if(payload.type==="web_search_call")return parseWebSearch(payload,ts3,base);return[]}function parseCodexLine(line){if(!line.trim())return[];let raw;try{raw=JSON.parse(line)}catch{return[]}if(!raw.type||!raw.timestamp)return[];let base={provider:"codex",raw};if(!raw.payload||typeof raw.payload!=="object")return[];if(raw.type==="event_msg")return parseEventMsg(raw.payload,raw.timestamp,base);if(raw.type==="response_item")return parseResponseItem(raw.payload,raw.timestamp,base);return[]}function extractCodexContent(content){if(typeof content==="string")return content;if(!Array.isArray(content))return"";let parts=[];for(let item of content)if(typeof item==="string")parts.push(item);else if(item&&typeof item==="object"){if("text"in item)parts.push(String(item.text));else if("input_text"in item)parts.push(String(item.input_text))}return parts.join(" ")}async function readEntries(logPath){let content;try{content=await readFile10(logPath,"utf-8")}catch{return[]}return content.split(`
|
|
1742
1742
|
`).flatMap(parseCodexLine)}var codexTranscriptProvider;var init_codex_logs=__esm(()=>{codexTranscriptProvider={discoverLogPath,readEntries}});var exports_transcript={};__export(exports_transcript,{readTranscript:()=>readTranscript,getProvider:()=>getProvider2,applyFilter:()=>applyFilter});function applyFilter(entries,filter){if(!filter)return entries;let result2=entries;if(filter.since){let sinceMs=new Date(filter.since).getTime();result2=result2.filter((e)=>new Date(e.timestamp).getTime()>=sinceMs)}if(filter.roles&&filter.roles.length>0){let roles=new Set(filter.roles);result2=result2.filter((e)=>roles.has(e.role))}if(filter.last&&filter.last>0)result2=result2.slice(-filter.last);return result2}async function getClaudeProvider(){if(!_claudeProvider)_claudeProvider=(await Promise.resolve().then(() => (init_claude_logs(),exports_claude_logs))).claudeTranscriptProvider;return _claudeProvider}async function getCodexProvider(){if(!_codexProvider)_codexProvider=(await Promise.resolve().then(() => (init_codex_logs(),exports_codex_logs))).codexTranscriptProvider;return _codexProvider}async function getProvider2(worker){if((worker.provider??"claude")==="codex")return getCodexProvider();return getClaudeProvider()}async function readTranscript(worker,filter){let provider=await getProvider2(worker),logPath=await provider.discoverLogPath(worker);if(!logPath)return[];let entries=await provider.readEntries(logPath);return applyFilter(entries,filter)}var _claudeProvider,_codexProvider;function isTmuxMarkerOrNoise(line){let trimmed=line.trim();if(trimmed.includes("TMUX_MCP_START")||trimmed.includes("TMUX_MCP_DONE_"))return!0;if(line.includes('echo "TMUX_MCP_START"')||line.includes('echo "TMUX_MCP_DONE_'))return!0;if(line.includes("-bash:")||line.includes("warning: setlocale:")||line.includes("cannot change locale"))return!0;if(trimmed==="or directory")return!0;return!1}function stripTmuxMarkers(content){let filtered=content.split(`
|
|
@@ -1848,8 +1848,8 @@ ${body}`;writeFileSync12(filePath,output,"utf-8")}function serializeSdkConfig(sd
|
|
|
1848
1848
|
errors = ${progress.errors},
|
|
1849
1849
|
updated_at = now()
|
|
1850
1850
|
`}async function shouldSkipBackfill(sql){try{let existing=await sql`SELECT status FROM session_sync WHERE id = 'backfill'`;if(existing.length>0&&existing[0].status==="complete")return!0}catch{}try{let[{count}]=await sql`SELECT count(*)::int as count FROM sessions`;if(count>0){let existing=await sql`SELECT status FROM session_sync WHERE id = 'backfill'`;if(existing.length===0||existing[0].status==="complete")return!0}}catch{return!0}return!1}async function yieldToLiveWork(){while(liveWorkPending)await sleep2(LIVE_YIELD_POLL_MS)}async function getFileStartOffset(sql,file){let existing=await sql`SELECT last_ingested_offset FROM sessions WHERE id = ${file.sessionId}`;if(existing.length>0)return existing[0].last_ingested_offset??0;return 0}async function processBackfillFile(sql,file,progress,workerMap){let offset=await getFileStartOffset(sql,file);if(offset>=file.fileSize){progress.processedFiles++,progress.processedBytes+=file.fileSize;return}let currentOffset=offset;while(currentOffset<file.fileSize){await yieldToLiveWork();let result2=await ingestFile(sql,file.sessionId,file.jsonlPath,file.projectPath,currentOffset,{chunkSize:CHUNK_SIZE,parentSessionId:file.parentSessionId,isSubagent:file.isSubagent,fileSize:file.fileSize,mtime:file.mtime,workerMap});if(result2.newOffset<=currentOffset)break;progress.processedBytes+=result2.newOffset-currentOffset,currentOffset=result2.newOffset}progress.processedFiles++}async function processAllFiles(sql,allFiles,progress,workerMap){for(let file of allFiles){if(!running)break;await yieldToLiveWork();try{await processBackfillFile(sql,file,progress,workerMap)}catch(err){progress.errors++;let message=err instanceof Error?err.message:String(err);console.error(`[backfill] error on ${file.jsonlPath}: ${message}`)}if(progress.processedFiles%50===0)await updateSyncState(sql,progress);await sleep2(SLEEP_BETWEEN_FILES_MS)}}function resolveBackfillStatus(progress){if(!running)progress.status="paused",console.log(`[backfill] paused: ${progress.processedFiles}/${progress.totalFiles} files (will resume on next daemon start)`);else if(progress.errors>0&&progress.errors>=progress.totalFiles)progress.status="failed",console.error(`[backfill] failed: ${progress.errors}/${progress.totalFiles} files errored \u2014 will retry on next daemon start`);else progress.status="complete",console.log(`[backfill] complete: ${progress.processedFiles}/${progress.totalFiles} files, ${progress.errors} errors`)}async function startBackfill(sql){if(running)return;if(await shouldSkipBackfill(sql))return;running=!0,console.log("[backfill] starting session backfill...");try{let allFiles=await discoverAllJsonlFiles();allFiles.sort(compareBackfillFiles);let totalBytes=allFiles.reduce((sum,f)=>sum+f.fileSize,0),progress={totalFiles:allFiles.length,processedFiles:0,totalBytes,processedBytes:0,errors:0,status:"running"};await updateSyncState(sql,progress),console.log(`[backfill] discovered ${allFiles.length} files (${(totalBytes/1024/1024).toFixed(1)} MB)`);let workerMap=await buildWorkerMap(sql);await processAllFiles(sql,allFiles,progress,workerMap);try{let fixed=await reconcileSubagentParents(sql);if(fixed>0)console.log(`[backfill] reconciled parent_session_id for ${fixed} subagent(s)`)}catch(err){let message=err instanceof Error?err.message:String(err);console.warn(`[backfill] parent reconcile skipped: ${message}`)}resolveBackfillStatus(progress),await updateSyncState(sql,progress)}catch(err){let message=err instanceof Error?err.message:String(err);console.error(`[backfill] fatal error: ${message}`)}finally{running=!1}}function stopBackfill(){running=!1}async function getBackfillStatus(sql){try{let rows=await sql`SELECT * FROM session_sync WHERE id = 'backfill'`;if(rows.length===0)return null;let row=rows[0];return{totalFiles:row.total_files,processedFiles:row.processed_files,totalBytes:row.total_bytes,processedBytes:row.processed_bytes,errors:row.errors,status:row.status}}catch{return null}}var CHUNK_SIZE=65536,SLEEP_BETWEEN_FILES_MS=100,LIVE_YIELD_POLL_MS=200,running=!1;var init_session_backfill=__esm(()=>{init_session_capture()});var exports_scheduler_daemon={};__export(exports_scheduler_daemon,{terminalizeCleanExitUnverified:()=>terminalizeCleanExitUnverified,startDaemon:()=>startDaemon,runAgentRecoveryPass:()=>runAgentRecoveryPass,recoverOnStartup:()=>recoverOnStartup,reconcileUnresumable:()=>reconcileUnresumable,reconcileOrphans:()=>reconcileOrphans,reconcileOrphanedRuns:()=>reconcileOrphanedRuns,reclaimExpiredLeases:()=>reclaimExpiredLeases,processMailboxRetryMessage:()=>processMailboxRetryMessage,logToFile:()=>logToFile,logReconcilerMode:()=>logReconcilerMode,isTurnAwareReconcilerEnabled:()=>isTurnAwareReconcilerEnabled,fireTrigger:()=>fireTrigger,emitWorkerEvents:()=>emitWorkerEvents,collectMachineSnapshot:()=>collectMachineSnapshot,collectHeartbeats:()=>collectHeartbeats,claimDueTriggers:()=>claimDueTriggers,attemptAgentResume:()=>attemptAgentResume,_resetWorkerStatesForTesting:()=>_resetWorkerStatesForTesting,TURN_AWARE_RECONCILER_FLAG:()=>TURN_AWARE_RECONCILER_FLAG,MAX_DELIVERY_ATTEMPTS:()=>MAX_DELIVERY_ATTEMPTS,ESCALATION_RECIPIENT:()=>ESCALATION_RECIPIENT});import{randomUUID as randomUUID9}from"crypto";import{appendFileSync as appendFileSync3,mkdirSync as mkdirSync12}from"fs";import{homedir as homedir26}from"os";import{join as join40}from"path";function isTurnAwareReconcilerEnabled(env=process.env){let raw=env[TURN_AWARE_RECONCILER_FLAG];if(raw===void 0)return!0;let v=raw.trim().toLowerCase();if(v==="")return!0;if(v==="0"||v==="false"||v==="no")return!1;if(v==="1"||v==="true"||v==="yes")return!0;return!0}function logReconcilerMode(deps,daemonId){let enabled=isTurnAwareReconcilerEnabled();deps.log({timestamp:deps.now().toISOString(),level:"info",event:enabled?"reconciler_mode_turn_aware":"reconciler_mode_legacy",daemon_id:daemonId,flag:TURN_AWARE_RECONCILER_FLAG,enabled,message:enabled?"turn-aware reconciler enabled":"flag off, using legacy reconciler"})}function getLogDir2(){return join40(process.env.GENIE_HOME??join40(homedir26(),".genie"),"logs")}function getLogFile(){return join40(getLogDir2(),"scheduler.log")}function logToFile(entry2){let logDir=getLogDir2();mkdirSync12(logDir,{recursive:!0});let enriched=entry2.trace_id?entry2:withAmbientTraceId(entry2);appendFileSync3(getLogFile(),`${JSON.stringify(enriched)}
|
|
1851
|
-
`)}function withAmbientTraceId(entry2){let ctx=getAmbient();if(!ctx)return entry2;return{...entry2,trace_id:ctx.trace_id}}async function defaultSpawnCommand(command,env){return{pid:Bun.spawn(["sh","-c",command],{env:{...process.env,...env},stdio:["ignore","ignore","ignore"]}).pid}}function defaultJitter(maxMs){return Math.floor(Math.random()*maxMs)}function defaultSleep(ms){return new Promise((resolve5)=>setTimeout(resolve5,ms))}async function defaultIsPaneAlive(paneId){let{isPaneAlive:isPaneAlive2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux));return isPaneAlive2(paneId)}async function defaultListWorkers(){let{list:list2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));return(await list2()).map((a)=>({id:a.id,paneId:a.paneId,repoPath:a.repoPath,state:a.state,team:a.team,wishSlug:a.wishSlug,groupNumber:a.groupNumber,autoResume:a.autoResume,resumeAttempts:a.resumeAttempts,maxResumeAttempts:a.maxResumeAttempts,lastResumeAttempt:a.lastResumeAttempt,claudeSessionId:a.claudeSessionId}))}async function defaultPublishEvent(subject,data,repoPath){let payload=data,{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,subject,{timestamp:payload.timestamp,kind:payload.kind??"system",agent:payload.agent??"scheduler",team:payload.team,direction:payload.direction,peer:payload.peer,text:payload.text??subject,data:payload.data,source:payload.source??"registry"})}async function defaultCountTmuxSessions(){try{let{execSync:
|
|
1852
|
-
`).filter(Boolean).length}catch{return 0}}async function defaultResumeAgent(agentId){try{let{execSync:
|
|
1851
|
+
`)}function withAmbientTraceId(entry2){let ctx=getAmbient();if(!ctx)return entry2;return{...entry2,trace_id:ctx.trace_id}}async function defaultSpawnCommand(command,env){return{pid:Bun.spawn(["sh","-c",command],{env:{...process.env,...env},stdio:["ignore","ignore","ignore"]}).pid}}function defaultJitter(maxMs){return Math.floor(Math.random()*maxMs)}function defaultSleep(ms){return new Promise((resolve5)=>setTimeout(resolve5,ms))}async function defaultIsPaneAlive(paneId){let{isPaneAlive:isPaneAlive2}=await Promise.resolve().then(() => (init_tmux(),exports_tmux));return isPaneAlive2(paneId)}async function defaultListWorkers(){let{list:list2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));return(await list2()).map((a)=>({id:a.id,paneId:a.paneId,repoPath:a.repoPath,state:a.state,team:a.team,wishSlug:a.wishSlug,groupNumber:a.groupNumber,autoResume:a.autoResume,resumeAttempts:a.resumeAttempts,maxResumeAttempts:a.maxResumeAttempts,lastResumeAttempt:a.lastResumeAttempt,claudeSessionId:a.claudeSessionId}))}async function defaultPublishEvent(subject,data,repoPath){let payload=data,{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,subject,{timestamp:payload.timestamp,kind:payload.kind??"system",agent:payload.agent??"scheduler",team:payload.team,direction:payload.direction,peer:payload.peer,text:payload.text??subject,data:payload.data,source:payload.source??"registry"})}async function defaultCountTmuxSessions(){try{let{execSync:execSync10}=await import("child_process"),{genieTmuxCmd:genieTmuxCmd2}=await Promise.resolve().then(() => (init_tmux_wrapper(),exports_tmux_wrapper));return execSync10(`${genieTmuxCmd2("list-sessions")} 2>/dev/null`,{encoding:"utf-8"}).trim().split(`
|
|
1852
|
+
`).filter(Boolean).length}catch{return 0}}async function defaultResumeAgent(agentId){try{let{execSync:execSync10}=await import("child_process");return execSync10(`genie agent resume ${agentId} --no-reset-attempts`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}async function defaultUpdateAgent(agentId,updates){let{update:update2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await update2(agentId,updates)}function createDefaultDeps(){return{getConnection:async()=>{let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db));return getConnection2()},spawnCommand:defaultSpawnCommand,log:logToFile,generateId:randomUUID9,now:()=>new Date,sleep:defaultSleep,jitter:defaultJitter,isPaneAlive:defaultIsPaneAlive,listWorkers:defaultListWorkers,countTmuxSessions:defaultCountTmuxSessions,publishEvent:defaultPublishEvent,resumeAgent:defaultResumeAgent,updateAgent:defaultUpdateAgent}}function resolveConfig(overrides){let envMax=process.env.GENIE_MAX_CONCURRENT,maxConcurrent=envMax?Number.parseInt(envMax,10):5;return{maxConcurrent:overrides?.maxConcurrent??(Number.isNaN(maxConcurrent)?5:maxConcurrent),pollIntervalMs:overrides?.pollIntervalMs??30000,maxJitterMs:overrides?.maxJitterMs??30000,jitterThreshold:overrides?.jitterThreshold??3,heartbeatIntervalMs:overrides?.heartbeatIntervalMs??60000,orphanCheckIntervalMs:overrides?.orphanCheckIntervalMs??300000,deadHeartbeatThreshold:overrides?.deadHeartbeatThreshold??2,leaseRecoveryIntervalMs:overrides?.leaseRecoveryIntervalMs??60000}}async function claimDueTriggers(deps,config,daemonId){let sql=await deps.getConnection(),now=deps.now(),leaseUntil=new Date(now.getTime()+300000),runningCount=(await sql`
|
|
1853
1853
|
SELECT count(*)::int AS cnt FROM runs
|
|
1854
1854
|
WHERE status IN ('leased', 'running')
|
|
1855
1855
|
`)[0]?.cnt??0,available=Math.max(0,config.maxConcurrent-runningCount);if(available===0)return deps.log({timestamp:now.toISOString(),level:"debug",event:"concurrency_cap_reached",running:runningCount,max:config.maxConcurrent}),[];let limit=Math.min(available,5),claimed=await sql.begin(async(tx)=>{let rows=await tx`
|
|
@@ -1897,7 +1897,11 @@ ${body}`;writeFileSync12(filePath,output,"utf-8")}function serializeSdkConfig(sd
|
|
|
1897
1897
|
`,await sql`
|
|
1898
1898
|
UPDATE triggers SET status = 'failed', completed_at = ${now}
|
|
1899
1899
|
WHERE id = ${run.trigger_id} AND status = 'executing'
|
|
1900
|
-
`,orphanCount++}if(orphanCount>0)deps.log({timestamp:now.toISOString(),level:"info",event:"orphaned_runs_reconciled",count:orphanCount,daemon_id:daemonId});return orphanCount}async function recoverOnStartup(deps,daemonId,config){let now=deps.now();deps.log({timestamp:now.toISOString(),level:"info",event:"recovery_started",daemon_id:daemonId});let reclaimed=await reclaimExpiredLeases(deps,daemonId),orphans=await reconcileOrphanedRuns(deps,daemonId),{resumed,failed}=await runAgentRecoveryPass(deps,daemonId,config,"boot");if(deps.log({timestamp:deps.now().toISOString(),level:"info",event:"recovery_completed",reclaimed_leases:reclaimed,orphaned_runs:orphans,resumed_agents:resumed,failed_agents:failed,daemon_id:daemonId}),failed>0)deps.log({timestamp:deps.now().toISOString(),level:"info",event:"recovery_retry_scheduled",daemon_id:daemonId,failed_agents:failed,delay_ms:RECOVERY_RETRY_DELAY_MS}),scheduleRecoveryRetry(deps,daemonId,config)}function scheduleRecoveryRetry(deps,daemonId,config){setTimeout(async()=>{try{let retry=await runAgentRecoveryPass(deps,daemonId,config,"boot");deps.log({timestamp:deps.now().toISOString(),level:"info",event:"recovery_retry_completed",daemon_id:daemonId,resumed_agents:retry.resumed,failed_agents:retry.failed})}catch(err){let message=err instanceof Error?err.message:String(err);deps.log({timestamp:deps.now().toISOString(),level:"error",event:"recovery_retry_error",daemon_id:daemonId,error:message})}},RECOVERY_RETRY_DELAY_MS).unref?.()}async function
|
|
1900
|
+
`,orphanCount++}if(orphanCount>0)deps.log({timestamp:now.toISOString(),level:"info",event:"orphaned_runs_reconciled",count:orphanCount,daemon_id:daemonId});return orphanCount}async function recoverOnStartup(deps,daemonId,config){let now=deps.now();deps.log({timestamp:now.toISOString(),level:"info",event:"recovery_started",daemon_id:daemonId});let reclaimed=await reclaimExpiredLeases(deps,daemonId),orphans=await reconcileOrphanedRuns(deps,daemonId),{resumed,failed}=await runAgentRecoveryPass(deps,daemonId,config,"boot");if(deps.log({timestamp:deps.now().toISOString(),level:"info",event:"recovery_completed",reclaimed_leases:reclaimed,orphaned_runs:orphans,resumed_agents:resumed,failed_agents:failed,daemon_id:daemonId}),failed>0)deps.log({timestamp:deps.now().toISOString(),level:"info",event:"recovery_retry_scheduled",daemon_id:daemonId,failed_agents:failed,delay_ms:RECOVERY_RETRY_DELAY_MS}),scheduleRecoveryRetry(deps,daemonId,config)}function scheduleRecoveryRetry(deps,daemonId,config){setTimeout(async()=>{try{let retry=await runAgentRecoveryPass(deps,daemonId,config,"boot");deps.log({timestamp:deps.now().toISOString(),level:"info",event:"recovery_retry_completed",daemon_id:daemonId,resumed_agents:retry.resumed,failed_agents:retry.failed})}catch(err){let message=err instanceof Error?err.message:String(err);deps.log({timestamp:deps.now().toISOString(),level:"error",event:"recovery_retry_error",daemon_id:daemonId,error:message})}},RECOVERY_RETRY_DELAY_MS).unref?.()}async function isLegitimatelyClosed(deps,worker){try{let sql=await deps.getConnection(),executorId=(await sql`
|
|
1901
|
+
SELECT current_executor_id FROM agents WHERE id = ${worker.id}
|
|
1902
|
+
`)[0]?.current_executor_id;if(!executorId)return!1;let execRows=await sql`
|
|
1903
|
+
SELECT closed_at, outcome FROM executors WHERE id = ${executorId}
|
|
1904
|
+
`;if(execRows.length===0)return!1;return execRows[0].closed_at!==null||execRows[0].outcome!==null}catch{return!1}}async function handleDeadPane(deps,config,daemonId,worker,turnAware,mode){if(mode==="boot"){if(turnAware&&await isLegitimatelyClosed(deps,worker))return deps.log({timestamp:deps.now().toISOString(),level:"debug",event:"agent_resume_skipped_boot_terminal",daemon_id:daemonId,agent_id:worker.id,reason:"executor_already_closed"}),"skipped";return await attemptAgentResume(deps,config,worker)==="resumed"?"resumed":"skipped"}if(turnAware&&worker.state==="idle"){let res=await terminalizeCleanExitUnverified(deps,worker,"reconciler_idle_dead_pane");if(res.terminalized)return deps.log({timestamp:deps.now().toISOString(),level:"warn",event:"agent_terminalized_clean_exit_unverified",daemon_id:daemonId,agent_id:worker.id,executor_id:res.executorId,reason:"idle_dead_pane"}),"terminalized";return"skipped"}if(turnAware&&!TURN_AWARE_RESUMABLE_STATES.has(worker.state))return deps.log({timestamp:deps.now().toISOString(),level:"debug",event:"agent_resume_skipped_turn_aware",daemon_id:daemonId,agent_id:worker.id,state:worker.state,reason:"state_not_in_d3"}),"skipped";return await attemptAgentResume(deps,config,worker)==="resumed"?"resumed":"skipped"}function handleRecoveryProbeError(deps,daemonId,workerId,err){let message=err instanceof Error?err.message:String(err);if(message.includes("no server running")||message.includes("server exited")||message.includes("error connecting"))return deps.log({timestamp:deps.now().toISOString(),level:"debug",event:"recovery_worker_skipped_tmux_down",daemon_id:daemonId,worker_id:workerId}),!0;return deps.log({timestamp:deps.now().toISOString(),level:"warn",event:"recovery_worker_failed",daemon_id:daemonId,worker_id:workerId,error:message}),!1}async function runAgentRecoveryPass(deps,daemonId,config,mode="sweep"){let resolvedConfig=config??resolveConfig(),resumable=(await deps.listWorkers()).filter((w)=>w.state!=="suspended"&&w.state!=="done"&&w.claudeSessionId),turnAware=isTurnAwareReconcilerEnabled(),resumed=0,failed=0,terminalized=0;for(let worker of resumable)try{if(await deps.isPaneAlive(worker.paneId))continue;let outcome=await handleDeadPane(deps,resolvedConfig,daemonId,worker,turnAware,mode);if(outcome==="resumed")resumed++;else if(outcome==="terminalized")terminalized++}catch(err){if(handleRecoveryProbeError(deps,daemonId,worker.id,err))continue;failed++}return{resumed,failed,terminalized}}async function terminalizeCleanExitUnverified(deps,worker,reason){let nowIso=deps.now().toISOString();try{return await(await deps.getConnection()).begin(async(tx)=>{let executorId=(await tx`SELECT current_executor_id FROM agents WHERE id = ${worker.id}`)[0]?.current_executor_id??null;if(!executorId)return await tx`
|
|
1901
1905
|
UPDATE agents
|
|
1902
1906
|
SET state = 'error',
|
|
1903
1907
|
last_state_change = ${nowIso}
|
|
@@ -2181,19 +2185,19 @@ ${queryContent}`;let{messages:queryMessages}=state.provider.runQuery({agentId:se
|
|
|
2181
2185
|
`}}class TurnTracker{turns=new Map;open(sessionKey2,turnId,messageId){this.turns.set(sessionKey2,{turnId,sessionKey:sessionKey2,messageId,startedAt:Date.now(),closed:!1})}close(sessionKey2,action){let turn=this.turns.get(sessionKey2);if(turn&&!turn.closed)turn.closed=!0,turn.closedAction=action}isOpen(sessionKey2){let turn=this.turns.get(sessionKey2);return turn!==void 0&&!turn.closed}getTurnId(sessionKey2){return this.turns.get(sessionKey2)?.turnId}getByTurnId(turnId){for(let turn of this.turns.values())if(turn.turnId===turnId)return turn;return}delete(sessionKey2){this.turns.delete(sessionKey2)}}var exports_omni_bridge={};__export(exports_omni_bridge,{OmniBridge:()=>OmniBridge});import{closeSync as closeSync2,existsSync as existsSync34,mkdirSync as mkdirSync13,openSync as openSync2,readFileSync as readFileSync21,unlinkSync as unlinkSync9,writeSync}from"fs";import{dirname as dirname7}from"path";function withTimeout(p,ms,label){return new Promise((resolve5,reject)=>{let timer2=setTimeout(()=>reject(Error(`${label} timed out after ${ms}ms`)),ms);timer2.unref?.(),p.then((v)=>{clearTimeout(timer2),resolve5(v)},(err)=>{clearTimeout(timer2),reject(err)})})}function isPgConnectionError(err){if(!err||typeof err!=="object")return!1;let e=err,code=e.code??"";if(["ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENOTFOUND","EPIPE","EHOSTUNREACH"].includes(code))return!0;let msg=e.message??String(err);return/ECONNREFUSED|ECONNRESET|ETIMEDOUT|ENOTFOUND|EPIPE|connection terminated|connection closed|server closed the connection|the database system is shutting down/i.test(msg)}class OmniBridge{nc=null;sub=null;executor;turnTracker=new TurnTracker;sessions=new Map;messageQueue=[];recentMessageIds=new Map;idleCheckTimer=null;sc=import_nats3.StringCodec();sql=null;pgAvailable=!1;pgProvider;natsConnectFn;queueConfig;queue=null;sessionStore=null;natsUrl;idleTimeoutMs;maxConcurrent;executorType;pidfilePath=null;startedAtMs=0;pingSub=null;signalCleanup=null;constructor(config={}){if(this.natsUrl=config.natsUrl??process.env.GENIE_NATS_URL??DEFAULT_NATS_URL2,this.idleTimeoutMs=config.idleTimeoutMs??(process.env.GENIE_IDLE_TIMEOUT_MS?Number(process.env.GENIE_IDLE_TIMEOUT_MS):DEFAULT_IDLE_TIMEOUT_MS2),this.maxConcurrent=config.maxConcurrent??(process.env.GENIE_MAX_CONCURRENT?Number(process.env.GENIE_MAX_CONCURRENT):DEFAULT_MAX_CONCURRENT),this.pgProvider=config.pgProvider??(async()=>{let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db));return await getConnection2()}),this.natsConnectFn=config.natsConnectFn??import_nats3.connect,this.queueConfig=config.queue??{},this.executorType=resolveExecutorType(config.executorType),this.executorType==="sdk")this.executor=new ClaudeSdkOmniExecutor;else this.executor=new ClaudeCodeOmniExecutor}async start(){if(this.nc){console.log("[omni-bridge] Already running");return}if(console.log(`[omni-bridge] Connecting to NATS at ${this.natsUrl}...`),this.nc=await this.natsConnectFn({servers:this.natsUrl,name:"genie-omni-bridge",reconnect:!0,maxReconnectAttempts:-1,reconnectTimeWait:2000}),console.log("[omni-bridge] Connected to NATS"),await this.probePg(),this.pgAvailable&&this.sql)this.sessionStore=new BridgeSessionStore(this.sql),await this.recoverSessions();if(this.executorType==="sdk"&&this.pgAvailable&&this.sql)this.queue=new OmniQueue(this.sql,(_req,msg)=>this.routeMessage(msg),this.queueConfig),await this.queue.recoverStale(),this.queue.start();this.executor.setSafePgCall(this.safePgCall.bind(this));let sc=this.sc,nc=this.nc;this.executor.setNatsPublish((topic,payload)=>{nc.publish(topic,sc.encode(payload))}),this.sub=this.nc.subscribe("omni.message.>",{queue:"genie-bridge"}),this.processSubscription();let turnSubs=["omni.turn.open.>","omni.turn.done.>","omni.turn.nudge.>","omni.turn.timeout.>"];for(let topic of turnSubs){let sub=this.nc.subscribe(topic,{queue:"genie-bridge"});this.processTurnEvents(sub)}let sessionResetSub=this.nc.subscribe("omni.session.reset.>",{queue:"genie-bridge"});this.processSessionResetEvents(sessionResetSub),this.startedAtMs=Date.now(),this.pingSub=this.nc.subscribe(BRIDGE_PING_SUBJECT);let pingSub=this.pingSub,pingSc=this.sc,pingStart=this.startedAtMs;(async()=>{for await(let m of pingSub){let pong={ok:!0,pid:process.pid,uptimeMs:Date.now()-pingStart,subjects:["omni.message.>","omni.turn.open.>","omni.session.reset.>",BRIDGE_PING_SUBJECT]};try{m.respond(pingSc.encode(JSON.stringify(pong)))}catch{}}})().catch(()=>{}),this.pidfilePath=getBridgePidfilePath();try{if(mkdirSync13(dirname7(this.pidfilePath),{recursive:!0}),existsSync34(this.pidfilePath)){let stalePid=null;try{let raw=readFileSync21(this.pidfilePath,"utf8"),parsed=JSON.parse(raw);if(typeof parsed.pid==="number"&&Number.isFinite(parsed.pid))stalePid=parsed.pid}catch{}if(stalePid!==null){let alive=!1;try{process.kill(stalePid,0),alive=!0}catch(probeErr){alive=probeErr.code!=="ESRCH"}if(alive)throw Error(`pidfile locked by PID ${stalePid}`)}try{unlinkSync9(this.pidfilePath)}catch{}}let fd=openSync2(this.pidfilePath,"wx"),payload=JSON.stringify({pid:process.pid,startedAt:this.startedAtMs,subjects:["omni.message.>","omni.turn.open.>","omni.session.reset.>",BRIDGE_PING_SUBJECT],natsUrl:this.natsUrl});writeSync(fd,payload),closeSync2(fd)}catch(err){this.pidfilePath=null;let detail=err instanceof Error?err.message:String(err);try{if(this.pingSub)this.pingSub.unsubscribe()}catch{}this.pingSub=null;try{await this.nc?.drain()}catch{}throw this.nc=null,Error(`[omni-bridge] pidfile locked at ${getBridgePidfilePath()}: ${detail}`)}let onSignal=()=>{if(this.pidfilePath){try{unlinkSync9(this.pidfilePath)}catch{}this.pidfilePath=null}};process.once("SIGTERM",onSignal),process.once("SIGINT",onSignal),this.signalCleanup=()=>{process.removeListener("SIGTERM",onSignal),process.removeListener("SIGINT",onSignal)},this.idleCheckTimer=setInterval(()=>this.checkIdleSessions(),IDLE_CHECK_INTERVAL_MS),console.log(`[omni-bridge] Listening on omni.message.> (max_concurrent=${this.maxConcurrent}, idle_timeout=${this.idleTimeoutMs}ms)`)}async stop(){if(!this.nc){console.log("[omni-bridge] Not running");return}if(console.log("[omni-bridge] Shutting down..."),this.queue)this.queue.stop(),this.queue=null;if(this.idleCheckTimer)clearInterval(this.idleCheckTimer),this.idleCheckTimer=null;for(let[key,entry2]of this.sessions){if(entry2.idleTimer)clearTimeout(entry2.idleTimer);if(!entry2.spawning&&entry2.session)if(entry2.session.executorType==="tmux")console.log(`[omni-bridge] Detaching from tmux session ${key} (pane stays alive)`);else{try{await this.executor.shutdown(entry2.session)}catch(err){console.warn(`[omni-bridge] Error shutting down session ${key}:`,err)}let closeId=entry2.pgBridgeSessionId;if(closeId&&this.sessionStore)await this.safePgCall("session_close_sdk",(sql)=>new BridgeSessionStore(sql).close(closeId),void 0)}}if(this.sessions.clear(),this.sub)this.sub.unsubscribe(),this.sub=null;if(this.pingSub){try{this.pingSub.unsubscribe()}catch{}this.pingSub=null}if(this.pidfilePath){try{unlinkSync9(this.pidfilePath)}catch{}this.pidfilePath=null}if(this.signalCleanup)this.signalCleanup(),this.signalCleanup=null;try{await this.nc.drain()}catch{}this.nc=null,this.sql=null,this.pgAvailable=!1,this.sessionStore=null,console.log("[omni-bridge] Stopped")}async status(){let now=Date.now(),activeFromPg=null,executorIds=[];if(this.pgAvailable&&this.sql){let rows=await this.safePgCall("status_active_count",async(sql)=>sql`
|
|
2182
2186
|
SELECT id FROM executors
|
|
2183
2187
|
WHERE ended_at IS NULL AND metadata->>'source' = 'omni'
|
|
2184
|
-
`,null);if(rows)activeFromPg=rows.length,executorIds=rows.map((r)=>r.id)}let pgQueue=null;if(this.queue)pgQueue=await this.safePgCall("status_queue_stats",(_sql)=>this.queue?.stats()??Promise.resolve(null),null);return{connected:this.nc!==null,natsUrl:this.natsUrl,pgAvailable:this.pgAvailable,activeSessions:activeFromPg??this.sessions.size,maxConcurrent:this.maxConcurrent,idleTimeoutMs:this.idleTimeoutMs,queueDepth:pgQueue?pgQueue.pending+pgQueue.processing:this.messageQueue.length,executorType:this.executorType,executorIds,pgQueue,sessions:Array.from(this.sessions.entries()).map(([key,entry2])=>({id:key,agentName:entry2.session.agentName,chatId:entry2.session.chatId,instanceId:entry2.instanceId,executorType:entry2.session.executorType,spawning:entry2.spawning,idleMs:now-entry2.session.lastActivityAt,bufferSize:entry2.buffer.length}))}}async probePg(){try{let sql=await withTimeout(this.pgProvider(),PG_STARTUP_PROBE_TIMEOUT_MS,"PG provider startup");await withTimeout(Promise.resolve(sql`SELECT 1`),PG_STARTUP_PROBE_TIMEOUT_MS,"PG SELECT 1 probe"),this.sql=sql,this.pgAvailable=!0,console.log("[omni-bridge] PG reachable \u2014 session recovery enabled")}catch(err){this.sql=null,this.pgAvailable=!1;let msg=err instanceof Error?err.message:String(err);if(isPgConnectionError(err)){console.warn(`[omni-bridge] PG unavailable \u2014 session recovery disabled (${msg})`);return}throw Error(`[omni-bridge] PG schema mismatch or setup error: ${msg}. ${"Run `bun run migrate` (or the equivalent migration command) and retry."}`)}}async recoverSessions(){if(!this.sessionStore)return;let orphanedCount=await this.safePgCall("recover_orphan_all",(sql)=>new BridgeSessionStore(sql).markAllOrphaned(),0);if(orphanedCount>0)console.log(`[omni-bridge] Startup cleanup: orphaned ${orphanedCount} stale session(s) from previous run`)}async safePgCall(op,fn,fallback,ctx){if(!this.pgAvailable||!this.sql)return fallback;let sql=this.sql;try{return await withTimeout(fn(sql),PG_RUNTIME_QUERY_TIMEOUT_MS,`safePgCall(${op})`)}catch(err){let msg=err instanceof Error?err.message:String(err),execPart=ctx?.executorId?` executor_id=${ctx.executorId}`:"",chatPart=ctx?.chatId?` chat_id=${ctx.chatId}`:"";if(console.warn(`[omni-bridge] safePgCall(${op}) failed${execPart}${chatPart}: ${msg}`),isPgConnectionError(err))this.pgAvailable=!1,this.sql=null,console.warn("[omni-bridge] PG connection lost \u2014 switching to degraded mode");return fallback}}async processSubscription(){if(!this.sub)return;for await(let msg of this.sub)try{let data=this.sc.decode(msg.data),parsed=JSON.parse(data),parts=msg.subject.split(".");if(parts.length>=4)parsed.instanceId=parsed.instanceId||parts[2],parsed.chatId=parsed.chatId||parts[3];console.log(`[omni-bridge] NATS message received: ${msg.subject} agent=${parsed.agent} chat=${parsed.chatId}`);let messageId=parsed.messageId;if(messageId&&this.recentMessageIds.has(messageId)){console.log(`[omni-bridge] Dedup: skipping duplicate messageId=${messageId}`);continue}if(messageId){if(this.recentMessageIds.set(messageId,Date.now()),this.recentMessageIds.size>1000){let cutoff=Date.now()-60000;for(let[id,ts3]of this.recentMessageIds)if(ts3<cutoff)this.recentMessageIds.delete(id)}}if(!parsed.chatId||!parsed.agent){console.warn("[omni-bridge] Dropping message: missing chatId or agent",msg.subject);continue}if(this.queue){let env=parsed.env??{};await this.queue.enqueue(parsed,env)}else{let key=`${parsed.agent}:${parsed.chatId}`,hasSession=this.sessions.has(key);console.log(`[omni-bridge] Routing message for ${key} (hasSession=${hasSession}, queue=${!!this.queue})`),await this.routeMessage(parsed),console.log(`[omni-bridge] routeMessage done for ${key}`)}}catch(err){console.error("[omni-bridge] Error processing message:",err)}}async processTurnEvents(sub){for await(let msg of sub)try{let payload=JSON.parse(this.sc.decode(msg.data)),parts=msg.subject.split("."),eventType=parts[2],instanceId=parts[3],chatId=parts.slice(4).join(".");console.log(`[omni-bridge] Turn event: ${eventType} instance=${instanceId} chat=${chatId}`);let sessionKey2=this.findSessionKey(instanceId,chatId);if(!sessionKey2&&payload.turnId){if(sessionKey2=this.findSessionKeyByTurnId(payload.turnId),sessionKey2)console.log(`[omni-bridge] Matched session via turnId fallback: ${sessionKey2}`)}if(sessionKey2)await this.routeTurnEvent(eventType,sessionKey2,payload);else console.log(`[omni-bridge] No session found for turn.${eventType} (instance=${instanceId}, chat=${chatId})`)}catch(err){console.warn("[omni-bridge] Error processing turn event:",err)}}async routeTurnEvent(eventType,sessionKey2,payload){switch(eventType){case"open":this.turnTracker.open(sessionKey2,payload.turnId,payload.messageId);break;case"done":this.turnTracker.close(sessionKey2,payload.action),await this.handleTurnDone(sessionKey2);break;case"nudge":await this.handleTurnNudge(sessionKey2,payload.message);break;case"timeout":await this.handleTurnTimeout(sessionKey2);break}}findSessionKeyByTurnId(turnId){for(let[key]of this.sessions)if(this.turnTracker.getTurnId(key)===turnId)return key;return}chatIdMap=new Map;findSessionKey(instanceId,chatId){let resolvedChatId=this.chatIdMap.get(chatId);for(let[key,entry2]of this.sessions){if(entry2.instanceId!==instanceId)continue;if(entry2.session?.chatId===chatId)return key;if(resolvedChatId&&entry2.session?.chatId===resolvedChatId)return key;if(entry2.spawning&&key.endsWith(`:${chatId}`))return key;if(resolvedChatId&&entry2.spawning&&key.endsWith(`:${resolvedChatId}`))return key}return}async handleTurnNudge(sessionKey2,nudgeText){let entry2=this.sessions.get(sessionKey2);if(!entry2?.session)return;try{await this.executor.injectNudge(entry2.session,nudgeText)}catch(err){console.warn(`[omni-bridge] Failed to inject nudge for ${sessionKey2}:`,err)}}async processSessionResetEvents(sub){for await(let msg of sub)try{let parts=msg.subject.split(".");if(parts.length<5){console.warn(`[omni-bridge] Malformed session-reset subject: ${msg.subject}`);continue}let instanceId=parts[3],chatId=parts.slice(4).join("."),action;try{action=JSON.parse(this.sc.decode(msg.data)).action}catch{}await this.handleSessionReset(instanceId,chatId,action)}catch(err){console.warn("[omni-bridge] Error processing session reset event:",err)}}async handleSessionReset(instanceId,chatId,action){let sessionKey2=this.findSessionKey(instanceId,chatId);if(!sessionKey2){console.log(`[omni-bridge] Session reset for cold chat ${instanceId}/${chatId} \u2014 no-op`);return}let entry2=this.sessions.get(sessionKey2);if(!entry2)return;let actionTag=action?` (action=${action})`:"";if(entry2.spawning){console.log(`[omni-bridge] Session reset for spawning ${sessionKey2}${actionTag}, marking cancelled`),entry2.cancelled=!0,entry2.buffer=[],this.turnTracker.close(sessionKey2,"reset"),await this.removeSession(sessionKey2),await this.drainQueue();return}if(!entry2.session)return;console.log(`[omni-bridge] Session reset for ${sessionKey2}${actionTag}, evicting`),this.turnTracker.close(sessionKey2,"reset");try{await this.executor.shutdown(entry2.session)}catch(err){console.warn(`[omni-bridge] Error shutting down reset session ${sessionKey2}:`,err)}await this.removeSession(sessionKey2),await this.drainQueue()}async handleTurnDone(sessionKey2){if(!this.sessions.get(sessionKey2)?.session)return;console.log(`[omni-bridge] Turn done for ${sessionKey2}, session stays alive for next message`),this.resetIdleTimer(sessionKey2)}async handleTurnTimeout(sessionKey2){let entry2=this.sessions.get(sessionKey2);if(!entry2?.session)return;console.warn(`[omni-bridge] Turn timed out for ${sessionKey2}, evicting session`),this.turnTracker.close(sessionKey2,"timeout");try{await this.executor.shutdown(entry2.session)}catch(err){console.warn(`[omni-bridge] Error shutting down timed-out session ${sessionKey2}:`,err)}this.sessions.delete(sessionKey2)}async routeMessage(message){let key=`${message.agent}:${message.chatId}`,entry2=this.sessions.get(key);if(entry2){if(entry2.spawning){if(entry2.buffer.length<MAX_BUFFER_PER_CHAT)entry2.buffer.push(message);else console.warn(`[omni-bridge] Buffer full (${MAX_BUFFER_PER_CHAT}) for ${key}, dropping message from ${message.sender}`),await this.publishBufferFullReply(message);return}if(await this.executor.isAlive(entry2.session)){await this.executor.deliver(entry2.session,message),this.resetIdleTimer(key);let bsId=entry2.pgBridgeSessionId;if(bsId&&this.sessionStore)this.safePgCall("session_activity",(sql)=>new BridgeSessionStore(sql).recordActivity(bsId),void 0,{chatId:message.chatId});return}await this.removeSession(key)}await this.spawnSession(message)}async spawnSession(message){let key=`${message.agent}:${message.chatId}`,existing=this.sessions.get(key);if(existing){if(existing.buffer.length<MAX_BUFFER_PER_CHAT)existing.buffer.push(message),console.log(`[omni-bridge] Buffered message for existing session ${key} (buffer=${existing.buffer.length})`);return}if(this.sessions.size>=this.maxConcurrent){this.messageQueue.push(message),await this.publishAutoReply(message),console.log(`[omni-bridge] Max concurrent (${this.maxConcurrent}) reached, queued message for ${key}`);return}let placeholder={session:null,instanceId:message.instanceId,spawning:!0,buffer:[message],idleTimer:null};this.sessions.set(key,placeholder);try{let raw=message,payloadEnv=raw.env,spawnEnv={OMNI_API_KEY:payloadEnv?.OMNI_API_KEY??process.env.OMNI_API_KEY??"",OMNI_INSTANCE:payloadEnv?.OMNI_INSTANCE??message.instanceId,OMNI_CHAT:payloadEnv?.OMNI_CHAT??message.chatId,OMNI_MESSAGE:payloadEnv?.OMNI_MESSAGE??raw.messageId??"",OMNI_TURN_ID:payloadEnv?.OMNI_TURN_ID||"",OMNI_SENDER_NAME:payloadEnv?.OMNI_SENDER_NAME??message.sender??""};console.log(`[omni-bridge] Spawning session for ${key}...`);let session=await this.executor.spawn(message.agent,message.chatId,spawnEnv,message.content);if(placeholder.cancelled){console.log(`[omni-bridge] Spawn for ${key} completed but was cancelled by reset, shutting down`);try{await this.executor.shutdown(session)}catch(err){console.warn(`[omni-bridge] Error shutting down cancelled spawn for ${key}:`,err)}return}if(placeholder.session=session,placeholder.spawning=!1,this.sessionStore){let pgId=await this.safePgCall("session_create",(sql)=>new BridgeSessionStore(sql).create({instanceId:message.instanceId,chatId:message.chatId,agentName:message.agent,executorId:session.sdk?.executorId,tmuxPaneId:session.tmux?.paneId,claudeSessionId:session.sdk?.claudeSessionId}),void 0,{chatId:message.chatId});if(pgId)placeholder.pgBridgeSessionId=pgId}for(let buffered of placeholder.buffer)await this.executor.deliver(session,buffered);placeholder.buffer=[],this.resetIdleTimer(key);let sessionTag=session.executorType==="tmux"?`(tmux pane=${session.tmux?.paneId})`:"(executor=sdk)";console.log(`[omni-bridge] Session active: ${key} ${sessionTag}`)}catch(err){console.error(`[omni-bridge] Failed to spawn session for ${key}:`,err);let lostMessages=placeholder.buffer;if(lostMessages.length>0)console.warn(`[omni-bridge] Re-queuing ${lostMessages.length} buffered message(s) from failed spawn for ${key}`),this.messageQueue.push(...lostMessages);this.sessions.delete(key)}}resetIdleTimer(key){let entry2=this.sessions.get(key);if(!entry2)return;if(entry2.idleTimer)clearTimeout(entry2.idleTimer);entry2.idleTimer=setTimeout(async()=>{console.log(`[omni-bridge] Idle timeout for ${key}, shutting down...`);try{await this.executor.shutdown(entry2.session)}catch{}await this.removeSession(key),await this.drainQueue()},this.idleTimeoutMs)}async checkIdleSessions(){let now=Date.now();for(let[key,entry2]of this.sessions){if(entry2.spawning)continue;if(!await this.executor.isAlive(entry2.session)){console.log(`[omni-bridge] Dead session detected: ${key}`),await this.removeSession(key);continue}let idleMs=now-entry2.session.lastActivityAt;if(idleMs>this.idleTimeoutMs){console.log(`[omni-bridge] Forcing idle shutdown: ${key} (idle ${Math.round(idleMs/1000)}s)`);try{await this.executor.shutdown(entry2.session)}catch{}await this.removeSession(key)}}}async removeSession(key){let entry2=this.sessions.get(key);if(entry2?.idleTimer)clearTimeout(entry2.idleTimer);let closeId=entry2?.pgBridgeSessionId;if(closeId&&this.sessionStore)await this.safePgCall("session_close",(sql)=>new BridgeSessionStore(sql).close(closeId),void 0);this.sessions.delete(key)}async drainQueue(){while(this.messageQueue.length>0){if(this.sessions.size>=this.maxConcurrent)break;let message=this.messageQueue.shift();if(message)await this.spawnSession(message)}}async publishBufferFullReply(message){if(!this.nc)return;let topic=`omni.reply.${message.instanceId}.${message.chatId}`,reply={content:"Fila de mensagens cheia, por favor aguarde e tente novamente.",agent:message.agent,chat_id:message.chatId,instance_id:message.instanceId,timestamp:new Date().toISOString(),auto_reply:!0};this.nc.publish(topic,this.sc.encode(JSON.stringify(reply)))}async publishAutoReply(message){if(!this.nc)return;let topic=`omni.reply.${message.instanceId}.${message.chatId}`,reply={content:"Aguarde um momento, estou atendendo outros clientes.",agent:message.agent,chat_id:message.chatId,instance_id:message.instanceId,timestamp:new Date().toISOString(),auto_reply:!0};this.nc.publish(topic,this.sc.encode(JSON.stringify(reply)))}}var import_nats3,DEFAULT_NATS_URL2="localhost:4222",DEFAULT_IDLE_TIMEOUT_MS2=900000,DEFAULT_MAX_CONCURRENT=20,MAX_BUFFER_PER_CHAT=50,IDLE_CHECK_INTERVAL_MS=30000,PG_STARTUP_PROBE_TIMEOUT_MS=5000,PG_RUNTIME_QUERY_TIMEOUT_MS=2000;var init_omni_bridge=__esm(()=>{init_bridge_status();init_executor_config();init_claude_code2();init_claude_sdk2();import_nats3=__toESM(require_mod4(),1)});var exports_serve={};__export(exports_serve,{registerServeCommands:()=>registerServeCommands,isTuiSessionReady:()=>isTuiSessionReady,isServeRunning:()=>isServeRunning,getTuiQuitBindingArgs:()=>getTuiQuitBindingArgs,getTuiKeybindings:()=>getTuiKeybindings,ensureTuiSession:()=>ensureTuiSession,autoStartServe:()=>autoStartServe});import{execSync as execSync11,spawn as spawn4,spawnSync as spawnSync3}from"child_process";import{existsSync as existsSync35,mkdirSync as mkdirSync14,readFileSync as readFileSync22,unlinkSync as unlinkSync10,writeFileSync as writeFileSync14}from"fs";import{homedir as homedir28}from"os";import{join as join42}from"path";function genieHome3(){return process.env.GENIE_HOME??join42(homedir28(),".genie")}function servePidPath(){return join42(genieHome3(),"serve.pid")}function readServePid(){let path3=servePidPath();if(!existsSync35(path3))return null;let raw=readFileSync22(path3,"utf-8").trim();if(raw==="")return null;let sepIdx=raw.indexOf(":");if(sepIdx<0){let pid2=Number.parseInt(raw,10);if(Number.isNaN(pid2)||pid2<=0)return null;return{pid:pid2,startTime:null}}let pidPart=raw.slice(0,sepIdx),startTimePart=raw.slice(sepIdx+1).trim(),pid=Number.parseInt(pidPart,10);if(Number.isNaN(pid)||pid<=0)return null;return{pid,startTime:startTimePart===""||startTimePart==="unknown"?null:startTimePart}}function writeServePid(pid){mkdirSync14(genieHome3(),{recursive:!0});let startTime=getProcessStartTime(pid)??"unknown";writeFileSync14(servePidPath(),`${pid}:${startTime}`,"utf-8")}function removeServePid(){let path3=servePidPath();if(!existsSync35(path3))return;try{let current=readServePid();if(current&¤t.pid!==process.pid)return;unlinkSync10(path3)}catch{}}function isProcessAlive(pid){try{return process.kill(pid,0),!0}catch{return!1}}function tuiTmuxConf(){return[join42(genieHome3(),"tui-tmux.conf")].find((p)=>existsSync35(p))??"/dev/null"}function tuiTmux(subcmd){return`${tmuxBin()} -L genie-tui -f ${tuiTmuxConf()} ${subcmd}`}function isGenieTmuxRunning(){try{return execSync11(genieTmuxCmd("list-sessions"),{stdio:"ignore"}),!0}catch{return!1}}function getTuiKeybindings(sessionName=TUI_SESSION){return[`bind-key -T root Tab if-shell "[ '#{pane_index}' = '0' ]" "select-pane -t ${sessionName}:0.1" "select-pane -t ${sessionName}:0.0"`,`bind-key -T root C-1 select-pane -t ${sessionName}:0.0`,`bind-key -T root C-2 select-pane -t ${sessionName}:0.1`,`bind-key -T root C-b if-shell "[ $(tmux display-message -p '#\\{pane_width\\}' -t ${sessionName}:0.0) -gt 5 ]" "resize-pane -t ${sessionName}:0.0 -x 0" "resize-pane -t ${sessionName}:0.0 -x ${NAV_WIDTH}"`,`bind-key -T root C-t select-pane -t ${sessionName}:0.0 \\; send-keys -t ${sessionName}:0.0 C-t`,"bind-key -T root C-d detach-client",`bind-key -T root C-q select-pane -t ${sessionName}:0.0 \\; send-keys -t ${sessionName}:0.0 C-q`]}function getTuiQuitBindingArgs(sessionName=TUI_SESSION){return["bind-key","-T","root","C-q","select-pane","-t",`${sessionName}:0.0`,"\\;","send-keys","-t",`${sessionName}:0.0`,"C-q"]}function applyTuiStyle(){let cmds=[`set-option -t ${TUI_SESSION} pane-border-style 'fg=${TUI_STYLE.inactiveBorder}'`,`set-option -t ${TUI_SESSION} pane-active-border-style 'fg=${TUI_STYLE.activeBorder}'`,...process.env.GENIE_TMUX_MOUSE!=="off"?[`set-option -t ${TUI_SESSION} mouse on`]:[],`set-option -t ${TUI_SESSION} status off`,`set-option -t ${TUI_SESSION} pane-border-status off`];for(let cmd of cmds)try{execSync11(tuiTmux(cmd),{stdio:"ignore"})}catch{}}function setupTuiKeybindings(){for(let cmd of getTuiKeybindings())try{if(cmd.startsWith("bind-key -T root C-q "))spawnSync3(tmuxBin(),["-L","genie-tui","-f",tuiTmuxConf(),...getTuiQuitBindingArgs()],{stdio:"ignore"});else execSync11(tuiTmux(cmd),{stdio:"ignore"})}catch{}}function startTuiTmuxServer(){try{execSync11(tuiTmux(`has-session -t ${TUI_SESSION}`),{stdio:"ignore"});let panes2=execSync11(tuiTmux(`list-panes -t ${TUI_SESSION}:0 -F '#{pane_id}'`),{encoding:"utf-8"}).trim().split(`
|
|
2185
|
-
`);if(panes2.length>=2){try{
|
|
2186
|
-
`);applyTuiStyle(),setupTuiKeybindings();try{
|
|
2187
|
-
`);applyTuiStyle(),setupTuiKeybindings();try{
|
|
2188
|
+
`,null);if(rows)activeFromPg=rows.length,executorIds=rows.map((r)=>r.id)}let pgQueue=null;if(this.queue)pgQueue=await this.safePgCall("status_queue_stats",(_sql)=>this.queue?.stats()??Promise.resolve(null),null);return{connected:this.nc!==null,natsUrl:this.natsUrl,pgAvailable:this.pgAvailable,activeSessions:activeFromPg??this.sessions.size,maxConcurrent:this.maxConcurrent,idleTimeoutMs:this.idleTimeoutMs,queueDepth:pgQueue?pgQueue.pending+pgQueue.processing:this.messageQueue.length,executorType:this.executorType,executorIds,pgQueue,sessions:Array.from(this.sessions.entries()).map(([key,entry2])=>({id:key,agentName:entry2.session.agentName,chatId:entry2.session.chatId,instanceId:entry2.instanceId,executorType:entry2.session.executorType,spawning:entry2.spawning,idleMs:now-entry2.session.lastActivityAt,bufferSize:entry2.buffer.length}))}}async probePg(){try{let sql=await withTimeout(this.pgProvider(),PG_STARTUP_PROBE_TIMEOUT_MS,"PG provider startup");await withTimeout(Promise.resolve(sql`SELECT 1`),PG_STARTUP_PROBE_TIMEOUT_MS,"PG SELECT 1 probe"),this.sql=sql,this.pgAvailable=!0,console.log("[omni-bridge] PG reachable \u2014 session recovery enabled")}catch(err){this.sql=null,this.pgAvailable=!1;let msg=err instanceof Error?err.message:String(err);if(isPgConnectionError(err)){console.warn(`[omni-bridge] PG unavailable \u2014 session recovery disabled (${msg})`);return}throw Error(`[omni-bridge] PG schema mismatch or setup error: ${msg}. ${"Run `bun run migrate` (or the equivalent migration command) and retry."}`)}}async recoverSessions(){if(!this.sessionStore)return;let orphanedCount=await this.safePgCall("recover_orphan_all",(sql)=>new BridgeSessionStore(sql).markAllOrphaned(),0);if(orphanedCount>0)console.log(`[omni-bridge] Startup cleanup: orphaned ${orphanedCount} stale session(s) from previous run`)}async safePgCall(op,fn,fallback,ctx){if(!this.pgAvailable||!this.sql)return fallback;let sql=this.sql;try{return await withTimeout(fn(sql),PG_RUNTIME_QUERY_TIMEOUT_MS,`safePgCall(${op})`)}catch(err){let msg=err instanceof Error?err.message:String(err),execPart=ctx?.executorId?` executor_id=${ctx.executorId}`:"",chatPart=ctx?.chatId?` chat_id=${ctx.chatId}`:"";if(console.warn(`[omni-bridge] safePgCall(${op}) failed${execPart}${chatPart}: ${msg}`),isPgConnectionError(err))this.pgAvailable=!1,this.sql=null,console.warn("[omni-bridge] PG connection lost \u2014 switching to degraded mode");return fallback}}async processSubscription(){if(!this.sub)return;for await(let msg of this.sub)try{let data=this.sc.decode(msg.data),parsed=JSON.parse(data),parts=msg.subject.split(".");if(parts.length>=4)parsed.instanceId=parsed.instanceId||parts[2],parsed.chatId=parsed.chatId||parts[3];console.log(`[omni-bridge] NATS message received: ${msg.subject} agent=${parsed.agent} chat=${parsed.chatId}`);let messageId=parsed.messageId;if(messageId&&this.recentMessageIds.has(messageId)){console.log(`[omni-bridge] Dedup: skipping duplicate messageId=${messageId}`);continue}if(messageId){if(this.recentMessageIds.set(messageId,Date.now()),this.recentMessageIds.size>1000){let cutoff=Date.now()-60000;for(let[id,ts3]of this.recentMessageIds)if(ts3<cutoff)this.recentMessageIds.delete(id)}}if(!parsed.chatId||!parsed.agent){console.warn("[omni-bridge] Dropping message: missing chatId or agent",msg.subject);continue}if(this.queue){let env=parsed.env??{};await this.queue.enqueue(parsed,env)}else{let key=`${parsed.agent}:${parsed.chatId}`,hasSession=this.sessions.has(key);console.log(`[omni-bridge] Routing message for ${key} (hasSession=${hasSession}, queue=${!!this.queue})`),await this.routeMessage(parsed),console.log(`[omni-bridge] routeMessage done for ${key}`)}}catch(err){console.error("[omni-bridge] Error processing message:",err)}}async processTurnEvents(sub){for await(let msg of sub)try{let payload=JSON.parse(this.sc.decode(msg.data)),parts=msg.subject.split("."),eventType=parts[2],instanceId=parts[3],chatId=parts.slice(4).join(".");console.log(`[omni-bridge] Turn event: ${eventType} instance=${instanceId} chat=${chatId}`);let sessionKey2=this.findSessionKey(instanceId,chatId);if(!sessionKey2&&payload.turnId){if(sessionKey2=this.findSessionKeyByTurnId(payload.turnId),sessionKey2)console.log(`[omni-bridge] Matched session via turnId fallback: ${sessionKey2}`)}if(sessionKey2)await this.routeTurnEvent(eventType,sessionKey2,payload);else console.log(`[omni-bridge] No session found for turn.${eventType} (instance=${instanceId}, chat=${chatId})`)}catch(err){console.warn("[omni-bridge] Error processing turn event:",err)}}async routeTurnEvent(eventType,sessionKey2,payload){switch(eventType){case"open":this.turnTracker.open(sessionKey2,payload.turnId,payload.messageId);break;case"done":this.turnTracker.close(sessionKey2,payload.action),await this.handleTurnDone(sessionKey2);break;case"nudge":await this.handleTurnNudge(sessionKey2,payload.message);break;case"timeout":await this.handleTurnTimeout(sessionKey2);break}}findSessionKeyByTurnId(turnId){for(let[key]of this.sessions)if(this.turnTracker.getTurnId(key)===turnId)return key;return}chatIdMap=new Map;findSessionKey(instanceId,chatId){let resolvedChatId=this.chatIdMap.get(chatId);for(let[key,entry2]of this.sessions){if(entry2.instanceId!==instanceId)continue;if(entry2.session?.chatId===chatId)return key;if(resolvedChatId&&entry2.session?.chatId===resolvedChatId)return key;if(entry2.spawning&&key.endsWith(`:${chatId}`))return key;if(resolvedChatId&&entry2.spawning&&key.endsWith(`:${resolvedChatId}`))return key}return}async handleTurnNudge(sessionKey2,nudgeText){let entry2=this.sessions.get(sessionKey2);if(!entry2?.session)return;try{await this.executor.injectNudge(entry2.session,nudgeText)}catch(err){console.warn(`[omni-bridge] Failed to inject nudge for ${sessionKey2}:`,err)}}async processSessionResetEvents(sub){for await(let msg of sub)try{let parts=msg.subject.split(".");if(parts.length<5){console.warn(`[omni-bridge] Malformed session-reset subject: ${msg.subject}`);continue}let instanceId=parts[3],chatId=parts.slice(4).join("."),action;try{action=JSON.parse(this.sc.decode(msg.data)).action}catch{}await this.handleSessionReset(instanceId,chatId,action)}catch(err){console.warn("[omni-bridge] Error processing session reset event:",err)}}async handleSessionReset(instanceId,chatId,action){let sessionKey2=this.findSessionKey(instanceId,chatId);if(!sessionKey2){console.log(`[omni-bridge] Session reset for cold chat ${instanceId}/${chatId} \u2014 no-op`);return}let entry2=this.sessions.get(sessionKey2);if(!entry2)return;let actionTag=action?` (action=${action})`:"";if(entry2.spawning){console.log(`[omni-bridge] Session reset for spawning ${sessionKey2}${actionTag}, marking cancelled`),entry2.cancelled=!0,entry2.buffer=[],this.turnTracker.close(sessionKey2,"reset"),await this.removeSession(sessionKey2),await this.drainQueue();return}if(!entry2.session)return;console.log(`[omni-bridge] Session reset for ${sessionKey2}${actionTag}, evicting`),this.turnTracker.close(sessionKey2,"reset");try{await this.executor.shutdown(entry2.session)}catch(err){console.warn(`[omni-bridge] Error shutting down reset session ${sessionKey2}:`,err)}await this.removeSession(sessionKey2),await this.drainQueue()}async handleTurnDone(sessionKey2){if(!this.sessions.get(sessionKey2)?.session)return;console.log(`[omni-bridge] Turn done for ${sessionKey2}, session stays alive for next message`),this.resetIdleTimer(sessionKey2)}async handleTurnTimeout(sessionKey2){let entry2=this.sessions.get(sessionKey2);if(!entry2?.session)return;console.warn(`[omni-bridge] Turn timed out for ${sessionKey2}, evicting session`),this.turnTracker.close(sessionKey2,"timeout");try{await this.executor.shutdown(entry2.session)}catch(err){console.warn(`[omni-bridge] Error shutting down timed-out session ${sessionKey2}:`,err)}this.sessions.delete(sessionKey2)}async routeMessage(message){let key=`${message.agent}:${message.chatId}`,entry2=this.sessions.get(key);if(entry2){if(entry2.spawning){if(entry2.buffer.length<MAX_BUFFER_PER_CHAT)entry2.buffer.push(message);else console.warn(`[omni-bridge] Buffer full (${MAX_BUFFER_PER_CHAT}) for ${key}, dropping message from ${message.sender}`),await this.publishBufferFullReply(message);return}if(await this.executor.isAlive(entry2.session)){await this.executor.deliver(entry2.session,message),this.resetIdleTimer(key);let bsId=entry2.pgBridgeSessionId;if(bsId&&this.sessionStore)this.safePgCall("session_activity",(sql)=>new BridgeSessionStore(sql).recordActivity(bsId),void 0,{chatId:message.chatId});return}await this.removeSession(key)}await this.spawnSession(message)}async spawnSession(message){let key=`${message.agent}:${message.chatId}`,existing=this.sessions.get(key);if(existing){if(existing.buffer.length<MAX_BUFFER_PER_CHAT)existing.buffer.push(message),console.log(`[omni-bridge] Buffered message for existing session ${key} (buffer=${existing.buffer.length})`);return}if(this.sessions.size>=this.maxConcurrent){this.messageQueue.push(message),await this.publishAutoReply(message),console.log(`[omni-bridge] Max concurrent (${this.maxConcurrent}) reached, queued message for ${key}`);return}let placeholder={session:null,instanceId:message.instanceId,spawning:!0,buffer:[message],idleTimer:null};this.sessions.set(key,placeholder);try{let raw=message,payloadEnv=raw.env,spawnEnv={OMNI_API_KEY:payloadEnv?.OMNI_API_KEY??process.env.OMNI_API_KEY??"",OMNI_INSTANCE:payloadEnv?.OMNI_INSTANCE??message.instanceId,OMNI_CHAT:payloadEnv?.OMNI_CHAT??message.chatId,OMNI_MESSAGE:payloadEnv?.OMNI_MESSAGE??raw.messageId??"",OMNI_TURN_ID:payloadEnv?.OMNI_TURN_ID||"",OMNI_SENDER_NAME:payloadEnv?.OMNI_SENDER_NAME??message.sender??""};console.log(`[omni-bridge] Spawning session for ${key}...`);let session=await this.executor.spawn(message.agent,message.chatId,spawnEnv,message.content);if(placeholder.cancelled){console.log(`[omni-bridge] Spawn for ${key} completed but was cancelled by reset, shutting down`);try{await this.executor.shutdown(session)}catch(err){console.warn(`[omni-bridge] Error shutting down cancelled spawn for ${key}:`,err)}return}if(placeholder.session=session,placeholder.spawning=!1,this.sessionStore){let pgId=await this.safePgCall("session_create",(sql)=>new BridgeSessionStore(sql).create({instanceId:message.instanceId,chatId:message.chatId,agentName:message.agent,executorId:session.sdk?.executorId,tmuxPaneId:session.tmux?.paneId,claudeSessionId:session.sdk?.claudeSessionId}),void 0,{chatId:message.chatId});if(pgId)placeholder.pgBridgeSessionId=pgId}for(let buffered of placeholder.buffer)await this.executor.deliver(session,buffered);placeholder.buffer=[],this.resetIdleTimer(key);let sessionTag=session.executorType==="tmux"?`(tmux pane=${session.tmux?.paneId})`:"(executor=sdk)";console.log(`[omni-bridge] Session active: ${key} ${sessionTag}`)}catch(err){console.error(`[omni-bridge] Failed to spawn session for ${key}:`,err);let lostMessages=placeholder.buffer;if(lostMessages.length>0)console.warn(`[omni-bridge] Re-queuing ${lostMessages.length} buffered message(s) from failed spawn for ${key}`),this.messageQueue.push(...lostMessages);this.sessions.delete(key)}}resetIdleTimer(key){let entry2=this.sessions.get(key);if(!entry2)return;if(entry2.idleTimer)clearTimeout(entry2.idleTimer);entry2.idleTimer=setTimeout(async()=>{console.log(`[omni-bridge] Idle timeout for ${key}, shutting down...`);try{await this.executor.shutdown(entry2.session)}catch{}await this.removeSession(key),await this.drainQueue()},this.idleTimeoutMs)}async checkIdleSessions(){let now=Date.now();for(let[key,entry2]of this.sessions){if(entry2.spawning)continue;if(!await this.executor.isAlive(entry2.session)){console.log(`[omni-bridge] Dead session detected: ${key}`),await this.removeSession(key);continue}let idleMs=now-entry2.session.lastActivityAt;if(idleMs>this.idleTimeoutMs){console.log(`[omni-bridge] Forcing idle shutdown: ${key} (idle ${Math.round(idleMs/1000)}s)`);try{await this.executor.shutdown(entry2.session)}catch{}await this.removeSession(key)}}}async removeSession(key){let entry2=this.sessions.get(key);if(entry2?.idleTimer)clearTimeout(entry2.idleTimer);let closeId=entry2?.pgBridgeSessionId;if(closeId&&this.sessionStore)await this.safePgCall("session_close",(sql)=>new BridgeSessionStore(sql).close(closeId),void 0);this.sessions.delete(key)}async drainQueue(){while(this.messageQueue.length>0){if(this.sessions.size>=this.maxConcurrent)break;let message=this.messageQueue.shift();if(message)await this.spawnSession(message)}}async publishBufferFullReply(message){if(!this.nc)return;let topic=`omni.reply.${message.instanceId}.${message.chatId}`,reply={content:"Fila de mensagens cheia, por favor aguarde e tente novamente.",agent:message.agent,chat_id:message.chatId,instance_id:message.instanceId,timestamp:new Date().toISOString(),auto_reply:!0};this.nc.publish(topic,this.sc.encode(JSON.stringify(reply)))}async publishAutoReply(message){if(!this.nc)return;let topic=`omni.reply.${message.instanceId}.${message.chatId}`,reply={content:"Aguarde um momento, estou atendendo outros clientes.",agent:message.agent,chat_id:message.chatId,instance_id:message.instanceId,timestamp:new Date().toISOString(),auto_reply:!0};this.nc.publish(topic,this.sc.encode(JSON.stringify(reply)))}}var import_nats3,DEFAULT_NATS_URL2="localhost:4222",DEFAULT_IDLE_TIMEOUT_MS2=900000,DEFAULT_MAX_CONCURRENT=20,MAX_BUFFER_PER_CHAT=50,IDLE_CHECK_INTERVAL_MS=30000,PG_STARTUP_PROBE_TIMEOUT_MS=5000,PG_RUNTIME_QUERY_TIMEOUT_MS=2000;var init_omni_bridge=__esm(()=>{init_bridge_status();init_executor_config();init_claude_code2();init_claude_sdk2();import_nats3=__toESM(require_mod4(),1)});var exports_serve={};__export(exports_serve,{registerServeCommands:()=>registerServeCommands,isTuiSessionReady:()=>isTuiSessionReady,isServeRunning:()=>isServeRunning,getTuiQuitBindingArgs:()=>getTuiQuitBindingArgs,getTuiKeybindings:()=>getTuiKeybindings,ensureTuiSession:()=>ensureTuiSession,autoStartServe:()=>autoStartServe});import{execSync as execSync10,spawn as spawn4,spawnSync as spawnSync4}from"child_process";import{existsSync as existsSync35,mkdirSync as mkdirSync14,readFileSync as readFileSync22,unlinkSync as unlinkSync10,writeFileSync as writeFileSync14}from"fs";import{homedir as homedir28}from"os";import{join as join42}from"path";function genieHome3(){return process.env.GENIE_HOME??join42(homedir28(),".genie")}function servePidPath(){return join42(genieHome3(),"serve.pid")}function readServePid(){let path3=servePidPath();if(!existsSync35(path3))return null;let raw=readFileSync22(path3,"utf-8").trim();if(raw==="")return null;let sepIdx=raw.indexOf(":");if(sepIdx<0){let pid2=Number.parseInt(raw,10);if(Number.isNaN(pid2)||pid2<=0)return null;return{pid:pid2,startTime:null}}let pidPart=raw.slice(0,sepIdx),startTimePart=raw.slice(sepIdx+1).trim(),pid=Number.parseInt(pidPart,10);if(Number.isNaN(pid)||pid<=0)return null;return{pid,startTime:startTimePart===""||startTimePart==="unknown"?null:startTimePart}}function writeServePid(pid){mkdirSync14(genieHome3(),{recursive:!0});let startTime=getProcessStartTime(pid)??"unknown";writeFileSync14(servePidPath(),`${pid}:${startTime}`,"utf-8")}function removeServePid(){let path3=servePidPath();if(!existsSync35(path3))return;try{let current=readServePid();if(current&¤t.pid!==process.pid)return;unlinkSync10(path3)}catch{}}function isProcessAlive(pid){try{return process.kill(pid,0),!0}catch{return!1}}function tuiTmuxConf(){return[join42(genieHome3(),"tui-tmux.conf")].find((p)=>existsSync35(p))??"/dev/null"}function tuiTmux(subcmd){return`${tmuxBin()} -L genie-tui -f ${tuiTmuxConf()} ${subcmd}`}function isGenieTmuxRunning(){try{return execSync10(genieTmuxCmd("list-sessions"),{stdio:"ignore"}),!0}catch{return!1}}function getTuiKeybindings(sessionName=TUI_SESSION){return[`bind-key -T root Tab if-shell "[ '#{pane_index}' = '0' ]" "select-pane -t ${sessionName}:0.1" "select-pane -t ${sessionName}:0.0"`,`bind-key -T root C-1 select-pane -t ${sessionName}:0.0`,`bind-key -T root C-2 select-pane -t ${sessionName}:0.1`,`bind-key -T root C-b if-shell "[ $(tmux display-message -p '#\\{pane_width\\}' -t ${sessionName}:0.0) -gt 5 ]" "resize-pane -t ${sessionName}:0.0 -x 0" "resize-pane -t ${sessionName}:0.0 -x ${NAV_WIDTH}"`,`bind-key -T root C-t select-pane -t ${sessionName}:0.0 \\; send-keys -t ${sessionName}:0.0 C-t`,"bind-key -T root C-d detach-client",`bind-key -T root C-q select-pane -t ${sessionName}:0.0 \\; send-keys -t ${sessionName}:0.0 C-q`]}function getTuiQuitBindingArgs(sessionName=TUI_SESSION){return["bind-key","-T","root","C-q","select-pane","-t",`${sessionName}:0.0`,"\\;","send-keys","-t",`${sessionName}:0.0`,"C-q"]}function applyTuiStyle(){let cmds=[`set-option -t ${TUI_SESSION} pane-border-style 'fg=${TUI_STYLE.inactiveBorder}'`,`set-option -t ${TUI_SESSION} pane-active-border-style 'fg=${TUI_STYLE.activeBorder}'`,...process.env.GENIE_TMUX_MOUSE!=="off"?[`set-option -t ${TUI_SESSION} mouse on`]:[],`set-option -t ${TUI_SESSION} status off`,`set-option -t ${TUI_SESSION} pane-border-status off`];for(let cmd of cmds)try{execSync10(tuiTmux(cmd),{stdio:"ignore"})}catch{}}function setupTuiKeybindings(){for(let cmd of getTuiKeybindings())try{if(cmd.startsWith("bind-key -T root C-q "))spawnSync4(tmuxBin(),["-L","genie-tui","-f",tuiTmuxConf(),...getTuiQuitBindingArgs()],{stdio:"ignore"});else execSync10(tuiTmux(cmd),{stdio:"ignore"})}catch{}}function startTuiTmuxServer(){try{execSync10(tuiTmux(`has-session -t ${TUI_SESSION}`),{stdio:"ignore"});let panes2=execSync10(tuiTmux(`list-panes -t ${TUI_SESSION}:0 -F '#{pane_id}'`),{encoding:"utf-8"}).trim().split(`
|
|
2189
|
+
`);if(panes2.length>=2){try{execSync10(tuiTmux(`respawn-pane -k -t ${panes2[1]} 'cat'`),{stdio:"ignore"})}catch{}return{leftPane:panes2[0],rightPane:panes2[1]}}let cols2=Number.parseInt(execSync10(tuiTmux(`display-message -t ${TUI_SESSION}:0 -p '#{window_width}'`),{encoding:"utf-8"}).trim(),10)||120;execSync10(tuiTmux(`split-window -h -t ${TUI_SESSION}:0 -l ${cols2-NAV_WIDTH-1}`),{stdio:"ignore"});let refreshed=execSync10(tuiTmux(`list-panes -t ${TUI_SESSION}:0 -F '#{pane_id}'`),{encoding:"utf-8"}).trim().split(`
|
|
2190
|
+
`);applyTuiStyle(),setupTuiKeybindings();try{execSync10(tuiTmux(`select-pane -t ${refreshed[0]}`),{stdio:"ignore"})}catch{}return{leftPane:refreshed[0],rightPane:refreshed[1]||refreshed[0]}}catch{}let cols=120;execSync10(tuiTmux(`new-session -d -s ${TUI_SESSION} -x ${cols} -y ${40}`),{stdio:"ignore"}),execSync10(tuiTmux(`split-window -h -t ${TUI_SESSION}:0 -l ${cols-NAV_WIDTH-1}`),{stdio:"ignore"});let panes=execSync10(tuiTmux(`list-panes -t ${TUI_SESSION}:0 -F '#{pane_id}'`),{encoding:"utf-8"}).trim().split(`
|
|
2191
|
+
`);applyTuiStyle(),setupTuiKeybindings();try{execSync10(tuiTmux(`select-pane -t ${panes[0]}`),{stdio:"ignore"})}catch{}return{leftPane:panes[0],rightPane:panes[1]||panes[0]}}function sendTuiLaunchScript(leftPane,rightPane,workspaceRoot){let home=genieHome3(),bunPath=process.execPath||"bun",genieBin=process.argv[1]||"genie",scriptPath=join42(home,"tui-launch.sh"),envVars=["GENIE_TUI_PANE=left",`GENIE_TUI_RIGHT=${rightPane}`];if(workspaceRoot)envVars.push(`GENIE_TUI_WORKSPACE=${workspaceRoot}`);let content=`#!/bin/sh
|
|
2188
2192
|
export ${envVars.join(`
|
|
2189
2193
|
export `)}
|
|
2190
2194
|
exec ${bunPath} ${genieBin}
|
|
2191
|
-
`;writeFileSync14(scriptPath,content,{mode:493});try{
|
|
2192
|
-
`).filter(Boolean)}catch{return[]}}function isServeRunning(){let entry2=readServePid();return entry2!==null&&isProcessAlive(entry2.pid)}async function autoStartServe(){if(isServeRunning())return;let bunPath=process.execPath??"bun",genieBin=process.argv[1]??"genie",{spawn:spawnChild}=await import("child_process");spawnChild(bunPath,[genieBin,"serve","--foreground"],{detached:!0,stdio:"ignore",env:{...process.env,GENIE_IS_DAEMON:"1"}}).unref();let deadline=Date.now()+15000;while(Date.now()<deadline)if(await new Promise((resolve5)=>setTimeout(resolve5,500)),isServeRunning()&&isTuiSessionReady())return;if(!isServeRunning())throw Error("genie serve failed to start within 15s. Run `genie serve` manually.")}function isTuiSessionReady(){try{return
|
|
2195
|
+
`;writeFileSync14(scriptPath,content,{mode:493});try{execSync10(tuiTmux(`send-keys -t '${leftPane}' '${scriptPath}' Enter`),{stdio:"ignore"})}catch{}}function killTuiSession(){try{execSync10(tuiTmux("kill-server"),{stdio:"ignore"})}catch{}}function listAgentSessions(){try{return execSync10(genieTmuxCmd("list-sessions -F '#{session_name}'"),{encoding:"utf-8"}).trim().split(`
|
|
2196
|
+
`).filter(Boolean)}catch{return[]}}function isServeRunning(){let entry2=readServePid();return entry2!==null&&isProcessAlive(entry2.pid)}async function autoStartServe(){if(isServeRunning())return;let bunPath=process.execPath??"bun",genieBin=process.argv[1]??"genie",{spawn:spawnChild}=await import("child_process");spawnChild(bunPath,[genieBin,"serve","--foreground"],{detached:!0,stdio:"ignore",env:{...process.env,GENIE_IS_DAEMON:"1"}}).unref();let deadline=Date.now()+15000;while(Date.now()<deadline)if(await new Promise((resolve5)=>setTimeout(resolve5,500)),isServeRunning()&&isTuiSessionReady())return;if(!isServeRunning())throw Error("genie serve failed to start within 15s. Run `genie serve` manually.")}function isTuiSessionReady(){try{return execSync10(tuiTmux(`has-session -t ${TUI_SESSION}`),{stdio:"ignore"}),!0}catch{return!1}}function ensureTuiSession(workspaceRoot){if(isTuiSessionReady())return;let{leftPane,rightPane}=startTuiTmuxServer();sendTuiLaunchScript(leftPane,rightPane,workspaceRoot)}async function startAgentSync(){try{let{findWorkspace:findWorkspace2,genieHome:genieHome4}=(init_workspace(),__toCommonJS(exports_workspace)),ws=findWorkspace2();if(!ws){let{join:join43}=__require("path"),configPath2=join43(genieHome4(),"config.json");return console.warn(` Agent sync: DISABLED \u2014 no workspace found from cwd or ${configPath2}`),console.warn(" Fix: `cd <workspace> && genie serve restart`, or run `genie init` to bootstrap one"),null}let{syncAgentDirectory:syncAgentDirectory2,watchAgentDirectory:watchAgentDirectory2}=await Promise.resolve().then(() => (init_agent_sync(),exports_agent_sync)),syncResult=await syncAgentDirectory2(ws.root);if(syncResult.registered.length+syncResult.updated.length>0)console.log(` Agent sync: ${syncResult.registered.length} registered, ${syncResult.updated.length} updated (workspace: ${ws.root})`);else console.log(` Agent sync: up to date (workspace: ${ws.root})`);if(syncResult.errors.length>0){console.warn(` Agent sync: ${syncResult.errors.length} error(s) \u2014 these agents were NOT registered:`);for(let e of syncResult.errors)console.warn(` ${e.name}: ${e.error}`)}let watcher2=watchAgentDirectory2(ws.root,{onSync:(name,action)=>{console.log(` [agent-watcher] ${name}: ${action}`)}});if(watcher2)console.log(" Agent watcher started (watching agents/ directory)");else console.warn(" Agent watcher: FAILED to start \u2014 new agents will not be auto-registered");return watcher2}catch(err){let msg=err instanceof Error?err.message:String(err);return console.error(` Agent sync failed: ${msg}`),null}}async function startPgserve(){console.log(" Starting pgserve...");try{let{ensurePgserve:ensurePgserve2}=await Promise.resolve().then(() => (init_db(),exports_db)),port=await ensurePgserve2();console.log(` pgserve ready on port ${port}`);try{let{registerService:registerService2}=await Promise.resolve().then(() => (init_service_registry(),exports_service_registry));registerService2("pgserve-owner",process.pid)}catch{}}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(` pgserve failed: ${msg}`)}}async function startScheduler(){console.log(" Starting scheduler daemon...");try{let{startDaemon:startDaemon2}=await Promise.resolve().then(() => (init_scheduler_daemon(),exports_scheduler_daemon));handles.schedulerHandle=startDaemon2(),console.log(" Scheduler started (includes event-router + inbox-watcher)");try{let{registerService:registerService2}=await Promise.resolve().then(() => (init_service_registry(),exports_service_registry));registerService2("scheduler",process.pid)}catch{}}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(` Scheduler failed: ${msg}`)}}async function startForeground(headless){let existingEntry=readServePid();if(existingEntry&&isProcessAlive(existingEntry.pid))console.log(`genie serve already running (PID ${existingEntry.pid})`),process.exit(0);if(existingEntry)forceRemoveServePid();process.env.GENIE_IS_DAEMON="1",writeServePid(process.pid);let mode=headless?"headless":"full";if(console.log(`genie serve starting (PID ${process.pid}, mode: ${mode})`),!headless)await ensureTmux();await startPgserve();let{loadGenieConfigSync:loadGenieConfigSync2}=await Promise.resolve().then(() => (init_genie_config2(),exports_genie_config));if(!loadGenieConfigSync2().brain.embedded)console.log(" Brain server: skipped (brain.embedded=false \u2014 managed externally)");else try{let brain=await import("@khal-os/brain");if(brain.startEmbeddedBrainServer){let{getActivePort:getActivePort2}=await Promise.resolve().then(() => (init_db(),exports_db)),pgPort=getActivePort2();if(pgPort){console.log(" Starting brain server...");let brainPath;try{let{findWorkspace:findWorkspace2}=(init_workspace(),__toCommonJS(exports_workspace)),ws=findWorkspace2();if(ws?.root){let bp=join42(ws.root,"brain");if(existsSync35(bp)&&existsSync35(join42(bp,"brain.json")))brainPath=bp}}catch{}if(brainPath){let handle=await brain.startEmbeddedBrainServer({brainPath,geniePgPort:pgPort});handles.brainHandle={stop:handle.stop,port:handle.port},console.log(` Brain server ready on port ${handle.port}`)}else console.log(" Brain server: no brain/ found in workspace (skipped)")}else console.log(" Brain server: pgserve not available (skipped)")}}catch{}if(!headless){let sessions=listAgentSessions();if(sessions.length>0)console.log(` Agent server (-L genie): ${sessions.length} sessions`);else console.log(" Agent server (-L genie): no sessions yet (created on first spawn)")}if(handles.agentWatcher=await startAgentSync(),!headless){console.log(" Setting up TUI session...");let{leftPane,rightPane}=startTuiTmuxServer(),ws=(()=>{try{let{findWorkspace:findWorkspace2}=(init_workspace(),__toCommonJS(exports_workspace));return findWorkspace2()}catch{return null}})();sendTuiLaunchScript(leftPane,rightPane,ws?.root),console.log(" TUI server ready (session: genie-tui)")}await startScheduler();try{await Promise.resolve().then(() => (init_built_in(),exports_built_in));let{start:startDetectorScheduler}=await Promise.resolve().then(() => (init_detector_scheduler(),exports_detector_scheduler)),{listDetectors:listDetectors2}=await Promise.resolve().then(() => (init_detectors(),exports_detectors));handles.detectorScheduler=startDetectorScheduler();let registered=listDetectors2().map((d)=>d.id);console.log(` Detector scheduler started (measurement only, 60s \xB1 5s cadence) \u2014 registered: [${registered.join(", ")}]`)}catch(err){let msg=err instanceof Error?err.message:String(err);console.warn(` Detector scheduler: failed \u2014 ${msg}`)}try{let{startExecutorReadEndpoint:startExecutorReadEndpoint2,getExecutorReadPort:getExecutorReadPort2}=await Promise.resolve().then(() => (init_executor_read(),exports_executor_read));if(await startExecutorReadEndpoint2())console.log(` Executor read endpoint ready on port ${getExecutorReadPort2()}`)}catch(err){let msg=err instanceof Error?err.message:String(err);console.warn(` Executor read endpoint: failed \u2014 ${msg}`)}try{let{startOmniApprovalHandler:startOmniApprovalHandler2}=await Promise.resolve().then(() => (init_omni_approval_handler(),exports_omni_approval_handler)),handler=await startOmniApprovalHandler2();if(handler)handles.omniApprovalHandler=handler,console.log(" Omni approval handler started")}catch{}{let{OmniBridge:OmniBridge2}=await Promise.resolve().then(() => (init_omni_bridge(),exports_omni_bridge)),bridge=new OmniBridge2({natsUrl:process.env.GENIE_NATS_URL??"localhost:4222",maxConcurrent:Number(process.env.GENIE_MAX_CONCURRENT??"20"),idleTimeoutMs:Number(process.env.GENIE_IDLE_TIMEOUT_MS??"900000")});try{await bridge.start(),handles.omniBridge=bridge,console.log(" Omni bridge started")}catch(err){let msg=err instanceof Error?err.message:String(err);if(process.env.GENIE_OMNI_REQUIRED==="1")console.error(` Omni bridge: FAILED \u2014 ${msg}`),process.exit(1);console.warn(` Omni bridge: degraded \u2014 ${msg}; set GENIE_OMNI_REQUIRED=1 to make this fatal`)}}console.log(`
|
|
2193
2197
|
genie serve is running (${mode}). ${headless?"Send SIGTERM to stop.":"Press Ctrl+C to stop."}`);let shutdownStarted=!1,shutdown2=async()=>{if(shutdownStarted)return;shutdownStarted=!0,console.log(`
|
|
2194
2198
|
Shutting down genie serve...`),handles.agentWatcher?.close();let schedulerHandle=handles.schedulerHandle;if(schedulerHandle){schedulerHandle.stop();try{await schedulerHandle.done}catch{}handles.schedulerHandle=null}if(handles.detectorScheduler)handles.detectorScheduler.stop(),handles.detectorScheduler=null;if(handles.omniApprovalHandler)await handles.omniApprovalHandler.stop().catch(()=>{}),handles.omniApprovalHandler=null;if(handles.omniBridge)await handles.omniBridge.stop().catch(()=>{}),handles.omniBridge=null;if(Promise.resolve().then(() => (init_executor_read(),exports_executor_read)).then((m)=>m.stopExecutorReadEndpoint().catch(()=>{})),handles.brainHandle)await handles.brainHandle.stop().catch(()=>{}),handles.brainHandle=null;try{let{killAllServices:killAllServices2}=(init_service_registry(),__toCommonJS(exports_service_registry));killAllServices2()}catch{}if(!headless)killTuiSession();try{let lockfilePath=join42(genieHome3(),"pgserve.port");if(existsSync35(lockfilePath))unlinkSync10(lockfilePath)}catch{}removeServePid(),console.log("genie serve stopped.")},gracefulExit=(exitCode)=>{if(shutdownStarted)return;let forceTimer=setTimeout(()=>{console.error("Graceful shutdown timeout (10s). Force-killing remaining processes.");try{let{getRegisteredServices:getRegisteredServices2}=(init_service_registry(),__toCommonJS(exports_service_registry));for(let svc of getRegisteredServices2())try{process.kill(svc.pid,"SIGKILL")}catch{}}catch{}removeServePid(),process.exit(1)},1e4);forceTimer.unref(),shutdown2().catch(()=>{}).finally(()=>{clearTimeout(forceTimer),removeServePid(),process.exit(exitCode)})};if(process.on("SIGTERM",()=>gracefulExit(143)),process.on("SIGINT",()=>gracefulExit(130)),process.on("SIGHUP",()=>gracefulExit(129)),process.on("exit",()=>{removeServePid()}),process.on("uncaughtException",(err)=>{console.error("Uncaught exception in genie serve:",err),gracefulExit(1)}),handles.schedulerHandle)await handles.schedulerHandle.done;else await new Promise(()=>{});removeServePid()}async function startBackground(headless){let existingEntry=readServePid();if(existingEntry&&isProcessAlive(existingEntry.pid))console.log(`genie serve already running (PID ${existingEntry.pid})`),process.exit(0);if(existingEntry)forceRemoveServePid();let bunPath=process.execPath??"bun",args=[process.argv[1]??"genie","serve","--foreground"];if(headless)args.push("--headless");let child=spawn4(bunPath,args,{detached:!0,stdio:"ignore",env:{...process.env,GENIE_IS_DAEMON:"1"}});if(child.unref(),child.pid)if(await new Promise((resolve5)=>setTimeout(resolve5,1000)),isProcessAlive(child.pid))console.log(`genie serve started (PID ${child.pid})`);else console.error("Error: genie serve exited immediately."),process.exit(1);else console.error("Error: failed to spawn genie serve"),process.exit(1)}function forceRemoveServePid(){try{unlinkSync10(servePidPath())}catch{}}async function stopServe(){let entry2=readServePid();if(!entry2){console.log("genie serve is not running (no PID file).");return}let pid=entry2.pid;if(!isProcessAlive(pid)){console.log(`Stale PID file (PID ${pid} not running). Cleaning up.`),forceRemoveServePid(),killTuiSession();return}console.log(`Stopping genie serve (PID ${pid})...`);try{process.kill(-pid,"SIGTERM")}catch{try{process.kill(pid,"SIGTERM")}catch{}}let deadline=Date.now()+1e4;while(Date.now()<deadline&&isProcessAlive(pid))await new Promise((resolve5)=>setTimeout(resolve5,250));if(isProcessAlive(pid)){console.log("Did not stop within 10s. Sending SIGKILL.");try{process.kill(-pid,"SIGKILL")}catch{try{process.kill(pid,"SIGKILL")}catch{}}}killTuiSession(),forceRemoveServePid(),console.log("genie serve stopped.")}async function printPgserveStatus(){try{let{isAvailable:isAvailable2,getActivePort:getActivePort2}=await Promise.resolve().then(() => (init_db(),exports_db)),dbOk=await isAvailable2();console.log(` pgserve: ${dbOk?`healthy (port ${getActivePort2()})`:"unreachable"}`)}catch{console.log(" pgserve: unavailable")}try{let brain=await import("@khal-os/brain"),brainPort=null;try{let{findWorkspace:findWorkspace2}=(init_workspace(),__toCommonJS(exports_workspace)),ws=findWorkspace2();if(ws?.root&&brain.readServerInfo){let info=brain.readServerInfo(join42(ws.root,"brain"));if(info?.port)brainPort=info.port}}catch{}if(!brainPort&&handles.brainHandle)brainPort=handles.brainHandle.port;if(brainPort)try{let resp=await fetch(`http://127.0.0.1:${brainPort}/healthz`);if(resp.ok)console.log(` brain: running (port ${brainPort})`);else console.log(` brain: unhealthy (port ${brainPort}, status ${resp.status})`)}catch{console.log(` brain: stopped (port ${brainPort} unreachable)`)}else console.log(" brain: stopped")}catch{console.log(" brain: not installed")}}function printTmuxStatus(){let agentRunning=isGenieTmuxRunning(),sessions=agentRunning?listAgentSessions():[];if(console.log(` tmux -L genie: ${agentRunning?`running (${sessions.length} sessions)`:"stopped"}`),sessions.length>0)console.log(` ${sessions.join(", ")}`);let tuiReady=isTuiSessionReady();console.log(` tmux -L genie-tui: ${tuiReady?"running":"stopped"}`)}async function printDaemonStatus(serveRunning){try{let schedulerPidPath=join42(genieHome3(),"scheduler.pid");if(existsSync35(schedulerPidPath)){let sPid=Number.parseInt(readFileSync22(schedulerPidPath,"utf-8").trim(),10),sAlive=!Number.isNaN(sPid)&&isProcessAlive(sPid);console.log(` scheduler: ${sAlive?`running (PID ${sPid})`:"stopped"}`)}else if(serveRunning)console.log(" scheduler: integrated (in-process)");else console.log(" scheduler: stopped")}catch{console.log(" scheduler: unknown")}try{let{getInboxPollIntervalMs:getInboxPollIntervalMs2}=await Promise.resolve().then(() => (init_inbox_watcher(),exports_inbox_watcher)),pollMs=getInboxPollIntervalMs2();if(pollMs===0)console.log(" inbox: disabled");else console.log(` inbox: ${serveRunning?"watching":"stopped"} (poll ${pollMs/1000}s)`)}catch{console.log(" inbox: unavailable")}}async function printBridgeStatus(){try{let{getBridgeStatus:getBridgeStatus2}=await Promise.resolve().then(() => (init_bridge_status(),exports_bridge_status)),res=await getBridgeStatus2();if(res.state==="running"&&res.pong){let uptimeSec=Math.round(res.pong.uptimeMs/1000),latency=res.latencyMs??0;console.log(` omni-bridge: running (pid ${res.pong.pid}, uptime ${uptimeSec}s, ping ${latency}ms)`)}else if(res.state==="stale")console.log(` omni-bridge: stale \u2014 ${res.detail}`);else console.log(" omni-bridge: stopped")}catch{console.log(" omni-bridge: unavailable")}}async function statusServe(){let entry2=readServePid(),running2=entry2!==null&&isProcessAlive(entry2.pid);if(console.log(`
|
|
2195
|
-
Genie Serve`),console.log("\u2500".repeat(50)),console.log(` Status: ${running2?"running":"stopped"}`),running2&&entry2)console.log(` PID: ${entry2.pid}`);await printPgserveStatus(),printTmuxStatus(),await printDaemonStatus(running2),await printBridgeStatus(),console.log(` PID file: ${servePidPath()}`),console.log("")}function registerServeCommands(program2){let serve=program2.command("serve").description("Start all genie infrastructure (pgserve, tmux, scheduler)");serve.command("start",{isDefault:!0}).description("Start genie serve").option("--daemon","Run in background").option("--foreground","Run in foreground (default)").option("--headless","Run without TUI (services only: pgserve, scheduler, inbox-watcher)").action(async(options)=>{if(options.daemon)await startBackground(options.headless);else await startForeground(options.headless)}),serve.command("stop").description("Stop genie serve and all services").action(async()=>{await stopServe()}),serve.command("status").description("Show service health").action(async()=>{await statusServe()})}var TUI_SESSION="genie-tui",NAV_WIDTH=30,TUI_STYLE,handles;var init_serve=__esm(()=>{init_ensure_tmux();init_process_identity();init_tmux_wrapper();TUI_STYLE={activeBorder:"#7c3aed",inactiveBorder:"#414868"};handles={schedulerHandle:null,agentWatcher:null,brainHandle:null,omniApprovalHandler:null,omniBridge:null,detectorScheduler:null}});var exports_tmux2={};__export(exports_tmux2,{newAgentWindow:()=>newAgentWindow,hasProjectSession:()=>hasProjectSession,attachTuiSession:()=>attachTuiSession,attachProjectWindow:()=>attachProjectWindow});import{spawnSync as
|
|
2196
|
-
`)??[];return panes[1]||panes[0]||rightPane}function hasProjectSession(targetSession){return runAgentTmux(["has-session","-t",targetSession]).status===0}function attachProjectWindow(rightPane,targetSession,windowIndex){if(targetSession===SESSION_NAME)return;let pane=resolveRightPane(rightPane);if(!hasProjectSession(targetSession))return;if(windowIndex!==void 0)runAgentTmux(["select-window","-t",`${targetSession}:${windowIndex}`]);runAgentTmux(["set-option","-t",targetSession,"status","off"]),runTuiTmux(["respawn-pane","-k","-t",pane,"sh","-lc",buildAttachLoop(targetSession)]),runTuiTmux(["select-pane","-t",`${SESSION_NAME}:0.0`])}function attachTuiSession(){if(process.env.TMUX)runTuiTmux(["switch-client","-t",SESSION_NAME],"inherit");else runTuiTmux(["attach-session","-t",SESSION_NAME],"inherit")}function nextRoleSuffix(baseName){let sessionName=baseName.replace(/\//g,"-"),output=
|
|
2199
|
+
Genie Serve`),console.log("\u2500".repeat(50)),console.log(` Status: ${running2?"running":"stopped"}`),running2&&entry2)console.log(` PID: ${entry2.pid}`);await printPgserveStatus(),printTmuxStatus(),await printDaemonStatus(running2),await printBridgeStatus(),console.log(` PID file: ${servePidPath()}`),console.log("")}function registerServeCommands(program2){let serve=program2.command("serve").description("Start all genie infrastructure (pgserve, tmux, scheduler)");serve.command("start",{isDefault:!0}).description("Start genie serve").option("--daemon","Run in background").option("--foreground","Run in foreground (default)").option("--headless","Run without TUI (services only: pgserve, scheduler, inbox-watcher)").action(async(options)=>{if(options.daemon)await startBackground(options.headless);else await startForeground(options.headless)}),serve.command("stop").description("Stop genie serve and all services").action(async()=>{await stopServe()}),serve.command("status").description("Show service health").action(async()=>{await statusServe()})}var TUI_SESSION="genie-tui",NAV_WIDTH=30,TUI_STYLE,handles;var init_serve=__esm(()=>{init_ensure_tmux();init_process_identity();init_tmux_wrapper();TUI_STYLE={activeBorder:"#7c3aed",inactiveBorder:"#414868"};handles={schedulerHandle:null,agentWatcher:null,brainHandle:null,omniApprovalHandler:null,omniBridge:null,detectorScheduler:null}});var exports_tmux2={};__export(exports_tmux2,{newAgentWindow:()=>newAgentWindow,hasProjectSession:()=>hasProjectSession,attachTuiSession:()=>attachTuiSession,attachProjectWindow:()=>attachProjectWindow});import{spawnSync as spawnSync5}from"child_process";function runTuiTmux(args,stdio="ignore"){return spawnSync5(TMUX_BIN,["-L",TMUX_SOCKET,"-f",TUI_TMUX_CONF,...args],{stdio})}function runTuiTmuxOutput(args){let result2=spawnSync5(TMUX_BIN,["-L",TMUX_SOCKET,"-f",TUI_TMUX_CONF,...args],{encoding:"utf-8"});return result2.status===0?result2.stdout.trim():null}function runAgentTmux(args,stdio="ignore"){return spawnSync5(TMUX_BIN,["-L",GENIE_AGENT_SOCKET,...args],{stdio})}function shellQuote3(value){return`'${value.replace(/'/g,"'\\''")}'`}function buildAttachLoop(targetSession){return`while true; do TMUX='' ${[TMUX_BIN,"-L",GENIE_AGENT_SOCKET,"attach-session","-t",targetSession].map(shellQuote3).join(" ")} 2>/dev/null; sleep 0.3; done`}function resolveRightPane(rightPane){if(runTuiTmux(["display-message","-t",rightPane,"-p",""]).status===0)return rightPane;let panes=runTuiTmuxOutput(["list-panes","-t",`${SESSION_NAME}:0`,"-F","#{pane_id}"])?.split(`
|
|
2200
|
+
`)??[];return panes[1]||panes[0]||rightPane}function hasProjectSession(targetSession){return runAgentTmux(["has-session","-t",targetSession]).status===0}function attachProjectWindow(rightPane,targetSession,windowIndex){if(targetSession===SESSION_NAME)return;let pane=resolveRightPane(rightPane);if(!hasProjectSession(targetSession))return;if(windowIndex!==void 0)runAgentTmux(["select-window","-t",`${targetSession}:${windowIndex}`]);runAgentTmux(["set-option","-t",targetSession,"status","off"]),runTuiTmux(["respawn-pane","-k","-t",pane,"sh","-lc",buildAttachLoop(targetSession)]),runTuiTmux(["select-pane","-t",`${SESSION_NAME}:0.0`])}function attachTuiSession(){if(process.env.TMUX)runTuiTmux(["switch-client","-t",SESSION_NAME],"inherit");else runTuiTmux(["attach-session","-t",SESSION_NAME],"inherit")}function nextRoleSuffix(baseName){let sessionName=baseName.replace(/\//g,"-"),output=spawnSync5(TMUX_BIN,["-L",GENIE_AGENT_SOCKET,"list-windows","-t",`=${sessionName}`,"-F","#{window_name}"],{encoding:"utf-8"}),names=output.status===0?output.stdout.trim().split(`
|
|
2197
2201
|
`):[],max=names.length+1,re=new RegExp(`^${baseName}-(\\d+)$`);for(let n of names){let m=n.match(re);if(m)max=Math.max(max,Number.parseInt(m[1],10)+1)}return max}function newAgentWindow(agentName){(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}let{spawn:spawn5}=__require("child_process"),{join:join43,resolve:resolve5}=__require("path"),{existsSync:existsSync36}=__require("fs"),bunPath=process.execPath||"bun",genieBin=process.argv[1],wsRoot=process.env.GENIE_TUI_WORKSPACE,cwd;if(wsRoot){let parentName=agentName.includes("/")?agentName.slice(0,agentName.indexOf("/")):agentName,agentDir=resolve5(join43(wsRoot,"agents",parentName));if(existsSync36(agentDir))cwd=agentDir}let suffix=nextRoleSuffix(agentName),role=`${agentName}-${suffix}`,sessionName=agentName.replace(/\//g,"-"),args=["spawn",agentName,"--role",role,"--session",sessionName,"--new-window"];(genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{detached:!0,stdio:"ignore",cwd}):spawn5("genie",args,{detached:!0,stdio:"ignore",cwd})).unref()})()}var SESSION_NAME="genie-tui",TMUX_SOCKET="genie-tui",GENIE_AGENT_SOCKET="genie",TUI_TMUX_CONF,TMUX_BIN;var init_tmux2=__esm(()=>{init_ensure_tmux();TUI_TMUX_CONF=(()=>{let{existsSync:existsSync36}=__require("fs"),tuiConf=`${process.env.GENIE_HOME??`${process.env.HOME}/.genie`}/tui-tmux.conf`;return existsSync36(tuiConf)?tuiConf:"/dev/null"})(),TMUX_BIN=tmuxBin()});function s(orgId,path3){return`khal.${orgId}.genie.${path3}`}var GENIE_SUBJECTS;var init_subjects=__esm(()=>{GENIE_SUBJECTS={dashboard:{stats:(orgId)=>s(orgId,"dashboard.stats")},agents:{list:(orgId)=>s(orgId,"agents.list"),show:(orgId)=>s(orgId,"agents.show")},sessions:{list:(orgId)=>s(orgId,"sessions.list"),content:(orgId)=>s(orgId,"sessions.content"),search:(orgId)=>s(orgId,"sessions.search")},tasks:{list:(orgId)=>s(orgId,"tasks.list"),show:(orgId)=>s(orgId,"tasks.show")},boards:{list:(orgId)=>s(orgId,"boards.list"),show:(orgId)=>s(orgId,"boards.show")},costs:{summary:(orgId)=>s(orgId,"costs.summary"),sessions:(orgId)=>s(orgId,"costs.sessions"),tokens:(orgId)=>s(orgId,"costs.tokens"),efficiency:(orgId)=>s(orgId,"costs.efficiency")},schedules:{list:(orgId)=>s(orgId,"schedules.list"),history:(orgId)=>s(orgId,"schedules.history")},system:{health:(orgId)=>s(orgId,"system.health"),snapshots:(orgId)=>s(orgId,"system.snapshots"),tables:(orgId)=>s(orgId,"system.tables"),channels:(orgId)=>s(orgId,"system.channels")},settings:{get:(orgId)=>s(orgId,"settings.get"),set:(orgId)=>s(orgId,"settings.set"),templates:(orgId)=>s(orgId,"settings.templates"),templateSave:(orgId)=>s(orgId,"settings.templates.save"),skills:(orgId)=>s(orgId,"settings.skills"),rules:(orgId)=>s(orgId,"settings.rules"),workspace:(orgId)=>s(orgId,"settings.workspace"),testPg:(orgId)=>s(orgId,"settings.test_pg")},pty:{create:(orgId)=>s(orgId,"pty.create"),input:(orgId,sessionId)=>s(orgId,`pty.${sessionId}.input`),data:(orgId,sessionId)=>s(orgId,`pty.${sessionId}.data`),resize:(orgId,sessionId)=>s(orgId,`pty.${sessionId}.resize`),kill:(orgId,sessionId)=>s(orgId,`pty.${sessionId}.kill`)},fs:{list:(orgId)=>s(orgId,"fs.list"),read:(orgId)=>s(orgId,"fs.read"),write:(orgId)=>s(orgId,"fs.write")},approval:{resolve:(orgId)=>s(orgId,"approval.resolve"),list:(orgId)=>s(orgId,"approval.list")},events:{agentState:(orgId)=>s(orgId,"events.agent_state"),executorState:(orgId)=>s(orgId,"events.executor_state"),taskStage:(orgId)=>s(orgId,"events.task_stage"),runtime:(orgId)=>s(orgId,"events.runtime"),audit:(orgId)=>s(orgId,"events.audit"),message:(orgId)=>s(orgId,"events.message"),mailbox:(orgId)=>s(orgId,"events.mailbox"),taskDep:(orgId)=>s(orgId,"events.task_dep"),trigger:(orgId)=>s(orgId,"events.trigger"),approvalRequest:(orgId)=>s(orgId,"events.approval_request"),approvalResolved:(orgId)=>s(orgId,"events.approval_resolved")}}});function emit2(event){for(let handler of listeners)handler(event)}async function startListening(nats,orgId){if(listenersActive)return;if(listenersActive=!0,nats)natsConn=nats,natsOrgId=orgId??"default";let sql=await getConnection();for(let mapping of CHANNEL_MAP){let listener=await sql.listen(mapping.channel,(payload)=>{let parsed;try{parsed=JSON.parse(payload)}catch{parsed={raw:payload}}if(emit2({type:mapping.eventType,payload:parsed}),natsConn){let subject=mapping.natsSubject(natsOrgId);natsConn.publish(subject,sc.encode(JSON.stringify(parsed)))}});stopFns.push(()=>listener.unlisten())}}async function stopListening(){listenersActive=!1,natsConn=null,await Promise.allSettled(stopFns.map((fn)=>fn())),stopFns=[]}var import_nats4,listeners,natsConn=null,natsOrgId="default",sc,CHANNEL_MAP,listenersActive=!1,stopFns;var init_pg_bridge=__esm(()=>{init_db();init_subjects();import_nats4=__toESM(require_mod4(),1),listeners=new Set;sc=import_nats4.StringCodec(),CHANNEL_MAP=[{channel:"genie_agent_state",eventType:"agent-state-changed",natsSubject:GENIE_SUBJECTS.events.agentState},{channel:"genie_executor_state",eventType:"executor-state-changed",natsSubject:GENIE_SUBJECTS.events.executorState},{channel:"genie_task_stage",eventType:"task-stage-changed",natsSubject:GENIE_SUBJECTS.events.taskStage},{channel:"genie_runtime_event",eventType:"runtime-event",natsSubject:GENIE_SUBJECTS.events.runtime},{channel:"genie_audit_event",eventType:"audit-event",natsSubject:GENIE_SUBJECTS.events.audit},{channel:"genie_message",eventType:"message",natsSubject:GENIE_SUBJECTS.events.message},{channel:"genie_mailbox_delivery",eventType:"mailbox-delivery",natsSubject:GENIE_SUBJECTS.events.mailbox},{channel:"genie_task_dep",eventType:"task-dep-changed",natsSubject:GENIE_SUBJECTS.events.taskDep},{channel:"genie_trigger_due",eventType:"trigger-due",natsSubject:GENIE_SUBJECTS.events.trigger},{channel:"genie_approval_request",eventType:"approval-request",natsSubject:GENIE_SUBJECTS.events.approvalRequest},{channel:"genie_approval_resolved",eventType:"approval-resolved",natsSubject:GENIE_SUBJECTS.events.approvalResolved}],stopFns=[]});import{randomUUID as randomUUID11}from"crypto";function onPtyData(cb){dataCallback=cb}function onPtyExit(cb){exitCallback=cb}async function spawnForAgent(agentName,opts={}){let{buildClaudeCommand:buildClaudeCommand3}=await Promise.resolve().then(() => (init_provider_adapters(),exports_provider_adapters)),{createExecutor:createExecutor2}=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),{findOrCreateAgent:findOrCreateAgent2,setCurrentExecutor:setCurrentExecutor2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),cols=opts.cols??120,rows=opts.rows??40,cwd=opts.cwd??process.cwd(),launch=buildClaudeCommand3({provider:"claude",team:"app",role:"engineer",name:agentName}),agent=await findOrCreateAgent2(agentName,"app","engineer"),executor=await createExecutor2(agent.id,"app-pty","process",{repoPath:cwd,state:"spawning",metadata:{command:launch.command,source:"genie-app"}});await setCurrentExecutor2(agent.id,executor.id);let env={...process.env,...launch.env,GENIE_APP_PTY:"true"},session=spawnPty(launch.command,{cwd,cols,rows,env,agentId:agent.id,executorId:executor.id,taskId:opts.taskId??null}),{updateExecutorState:updateExecutorState2}=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry));return await updateExecutorState2(executor.id,"running"),session}function spawnBash(cwd){let shell=process.env.SHELL??"/bin/bash";return spawnPty(shell,{cwd:cwd??process.cwd(),cols:120,rows:40,env:process.env,agentId:null,executorId:null,taskId:null})}function writeTerminal(sessionId,data){let session=sessions.get(sessionId);if(!session||session.state!=="running")return!1;return session.pty.write(data),!0}function resizeTerminal(sessionId,cols,rows){let session=sessions.get(sessionId);if(!session||session.state!=="running")return!1;return session.pty.resize(cols,rows),session.cols=cols,session.rows=rows,!0}async function killTerminal(sessionId){let session=sessions.get(sessionId);if(!session)return!1;if(session.pty.kill(),session.state="exited",session.executorId)try{let{updateExecutorState:updateExecutorState2}=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry));await updateExecutorState2(session.executorId,"terminated")}catch{}return sessions.delete(sessionId),!0}async function killAll(){let ids=[...sessions.keys()];await Promise.allSettled(ids.map((id)=>killTerminal(id)))}async function pipeStdout(stdout,sessionId,ptyHandle){let reader=stdout.getReader(),decoder=new TextDecoder;try{while(!0){let{done,value}=await reader.read();if(done)break;let text=decoder.decode(value);if(dataCallback)dataCallback(sessionId,text);if(ptyHandle.onData)ptyHandle.onData(text)}}catch{}}function onProcExit(sessionId,code,ptyHandle){let session=sessions.get(sessionId);if(session)session.state="exited";if(exitCallback)exitCallback(sessionId,code);if(ptyHandle.onExit)ptyHandle.onExit(code);handlePtyExit(sessionId,code)}function spawnPty(command,opts){let sessionId=randomUUID11(),ptyHandle;try{let bunPty=(()=>{throw new Error("Cannot require module "+"bun-pty");})(),parts=command.split(" "),raw=bunPty.spawn(parts,{cwd:opts.cwd,env:opts.env,cols:opts.cols,rows:opts.rows});ptyHandle={write:(data)=>raw.write(data),resize:(cols,rows)=>raw.resize(cols,rows),kill:()=>raw.kill(),onData:null,onExit:null},raw.onData=(data)=>{if(dataCallback)dataCallback(sessionId,data);if(ptyHandle.onData)ptyHandle.onData(data)},raw.onExit=(code)=>{let session2=sessions.get(sessionId);if(session2)session2.state="exited";if(exitCallback)exitCallback(sessionId,code);if(ptyHandle.onExit)ptyHandle.onExit(code);handlePtyExit(sessionId,code)}}catch{let parts=command.split(" "),proc=Bun.spawn(parts,{cwd:opts.cwd,env:opts.env,stdin:"pipe",stdout:"pipe",stderr:"pipe"});ptyHandle={write:(data)=>proc.stdin.write(data),resize:()=>{},kill:()=>proc.kill(),onData:null,onExit:null},pipeStdout(proc.stdout,sessionId,ptyHandle),proc.exited.then((code)=>onProcExit(sessionId,code,ptyHandle))}let session={id:sessionId,pty:ptyHandle,agentId:opts.agentId,executorId:opts.executorId,taskId:opts.taskId,command,state:"running",cols:opts.cols,rows:opts.rows,createdAt:new Date().toISOString()};return sessions.set(sessionId,session),session}function handlePtyExit(sessionId,code){let session=sessions.get(sessionId);if(!session?.executorId)return;(async()=>{try{let{updateExecutorState:updateExecutorState2}=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry));await updateExecutorState2(session.executorId,code===0?"done":"error")}catch{}})()}var sessions,dataCallback=null,exitCallback=null;var init_pty=__esm(()=>{sessions=new Map});var exports_src_backend={};import{existsSync as existsSync36,readFileSync as readFileSync23,readdirSync as readdirSync8,writeFileSync as writeFileSync15}from"fs";import{homedir as homedir29}from"os";import{join as join43,resolve as resolve5}from"path";function findSkillsDir(){let genieHome4=process.env.GENIE_HOME??join43(homedir29(),".genie"),candidateDirs=[join43(process.cwd(),"skills"),join43(genieHome4,"..","skills")];for(let d of candidateDirs)if(existsSync36(d))return d;return null}function parseSkillMd(content,fallbackName){let descMatch=content.match(/^description:\s*["']?(.+?)["']?\s*$/m),description="";if(descMatch)description=descMatch[1].trim();else description=content.split(`
|
|
2198
2202
|
`).filter((l)=>l.trim()&&!l.startsWith("---")&&!l.startsWith("#"))[0]?.trim()??"";let nameMatch=content.match(/^name:\s*(.+?)\s*$/m);return{name:nameMatch?nameMatch[1].trim():fallbackName,description}}function scanSkillsDirectory(skillsDir){try{let entries=readdirSync8(skillsDir,{withFileTypes:!0}),skills=[];for(let entry2 of entries){if(!entry2.isDirectory())continue;let skillMdPath=join43(skillsDir,entry2.name,"SKILL.md");if(!existsSync36(skillMdPath))continue;let content=readFileSync23(skillMdPath,"utf-8"),{name,description}=parseSkillMd(content,entry2.name);skills.push({name,slug:entry2.name,description,path:skillMdPath})}return skills.sort((a,b2)=>a.name.localeCompare(b2.name))}catch{return[]}}function scanRuleDirs(){let genieHome4=process.env.GENIE_HOME??join43(homedir29(),".genie"),ruleDirs=[join43(genieHome4,"rules"),join43(homedir29(),".claude","rules")],allRules=[];for(let rulesDir of ruleDirs){if(!existsSync36(rulesDir))continue;try{let files=readdirSync8(rulesDir).filter((f)=>f.endsWith(".md"));for(let f of files){let filePath=join43(rulesDir,f);allRules.push({name:f.replace(".md",""),path:filePath,content:readFileSync23(filePath,"utf-8"),source:rulesDir.includes(".claude")?"claude":"genie"})}}catch{}}return allRules}async function start2(){console.log("[genie-app] Starting backend service..."),console.log(`[genie-app] NATS: ${NATS_URL}`),console.log(`[genie-app] Org: ${ORG_ID}`);let sql=await getConnection();console.log("[genie-app] PG connected"),nc=await import_nats5.connect({servers:NATS_URL,name:"genie-app-backend",reconnect:!0,maxReconnectAttempts:-1,reconnectTimeWait:2000}),console.log("[genie-app] NATS connected"),registerHandlers(sql),await startListening(nc,ORG_ID),console.log("[genie-app] PG LISTEN/NOTIFY active (11 channels)"),onPtyData((sessionId,data)=>{if(!nc)return;nc.publish(GENIE_SUBJECTS.pty.data(ORG_ID,sessionId),sc2.encode(JSON.stringify({data})))}),onPtyExit((sessionId,code)=>{if(!nc)return;nc.publish(GENIE_SUBJECTS.pty.data(ORG_ID,sessionId),sc2.encode(JSON.stringify({code,type:"exit"})))}),console.log("[genie-app] Backend ready")}function registerHandlers(sql){if(!nc)return;let sub=GENIE_SUBJECTS;reply(sub.dashboard.stats(ORG_ID),async()=>{let[agentRows,taskRows,teamRows,costRows,snapshot]=await Promise.all([sql`
|
|
2199
2203
|
SELECT
|
|
@@ -2503,7 +2507,7 @@ Genie Serve`),console.log("\u2500".repeat(50)),console.log(` Status: ${runn
|
|
|
2503
2507
|
SELECT * FROM assignments
|
|
2504
2508
|
WHERE executor_id = ${executorId}
|
|
2505
2509
|
ORDER BY started_at ASC
|
|
2506
|
-
`).map(rowToAssignment)}async function getAssignment(id){let rows=await(await getConnection())`SELECT * FROM assignments WHERE id = ${id}`;return rows.length>0?rowToAssignment(rows[0]):null}var init_assignment_registry=__esm(()=>{init_db()});var exports_state={};__export(exports_state,{statusCommand:()=>statusCommand,resolveWishPath:()=>resolveWishPath,resetAction:()=>resetAction,registerStateCommands:()=>registerStateCommands,parseRef:()=>parseRef,ensureWorkPushed:()=>ensureWorkPushed,doneCommand:()=>doneCommand,detectWaveCompletion:()=>detectWaveCompletion});import{execSync as
|
|
2510
|
+
`).map(rowToAssignment)}async function getAssignment(id){let rows=await(await getConnection())`SELECT * FROM assignments WHERE id = ${id}`;return rows.length>0?rowToAssignment(rows[0]):null}var init_assignment_registry=__esm(()=>{init_db()});var exports_state={};__export(exports_state,{statusCommand:()=>statusCommand,resolveWishPath:()=>resolveWishPath,resetAction:()=>resetAction,registerStateCommands:()=>registerStateCommands,parseRef:()=>parseRef,ensureWorkPushed:()=>ensureWorkPushed,doneCommand:()=>doneCommand,detectWaveCompletion:()=>detectWaveCompletion});import{execSync as execSync13}from"child_process";import{existsSync as existsSync43}from"fs";import{readFile as readFile11}from"fs/promises";import{dirname as dirname10,join as join50}from"path";async function loadExecutorInfo(){let[registryMod,executorMod,assignmentMod]=await Promise.all([Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),Promise.resolve().then(() => (init_assignment_registry(),exports_assignment_registry))]);return{registry:registryMod,executorRegistry:executorMod,assignmentRegistry:assignmentMod}}function normalizeGitPath2(path3){if(process.platform!=="darwin")return path3;if(!path3.startsWith("/private/"))return path3;let logicalPath=path3.slice(8);return existsSync43(logicalPath)?logicalPath:path3}function resolveWishPath(slug,cwd){let base=cwd??process.cwd(),cwdPath=join50(base,".genie","wishes",slug,"WISH.md");if(existsSync43(cwdPath))return cwdPath;try{let commonDir=execSync13("git rev-parse --path-format=absolute --git-common-dir",{encoding:"utf-8",cwd:base,stdio:["pipe","pipe","pipe"]}).trim(),repoRoot=normalizeGitPath2(dirname10(commonDir));if(repoRoot!==base){let repoPath=join50(repoRoot,".genie","wishes",slug,"WISH.md");if(existsSync43(repoPath))return repoPath}}catch{}return null}function parseRef(ref){let hashIdx=ref.indexOf("#");if(hashIdx===-1)throw Error(`Invalid reference "${ref}". Expected format: <slug>#<group>`);let slug=ref.slice(0,hashIdx),group=ref.slice(hashIdx+1);if(!slug||!group)throw Error(`Invalid reference "${ref}". Both slug and group are required.`);return{slug,group}}async function detectWaveCompletion(slug,groupName,cwd){let wishPath=resolveWishPath(slug,cwd);if(!wishPath)return null;let content=await readFile11(wishPath,"utf-8"),targetWave=parseExecutionStrategy(content).find((w)=>w.groups.some((g)=>g.group===groupName));if(!targetWave)return null;let state=await getState(slug,cwd);if(!state)return null;let waveGroupNames=targetWave.groups.map((g)=>g.group);if(!waveGroupNames.every((g)=>state.groups[g]?.status==="done"))return null;return{waveName:targetWave.name,waveGroups:waveGroupNames}}async function ensureWorkPushed(slug,group){try{if(execSync13("git status --porcelain",{encoding:"utf-8"}).trim())console.log(" Committing dirty working tree..."),execSync13("git add -A",{encoding:"utf-8"}),execSync13(`git commit -m "wip: ${slug}#${group}"`,{encoding:"utf-8"}),console.log(` Committed as "wip: ${slug}#${group}"`)}catch{}try{if(execSync13("git log @{u}..HEAD --oneline",{encoding:"utf-8"}).trim())console.log(" Pushing unpushed commits..."),execSync13("git push",{encoding:"utf-8",timeout:30000}),console.log(" Push complete.")}catch{try{let branch=execSync13("git rev-parse --abbrev-ref HEAD",{encoding:"utf-8"}).trim();if(branch&&branch!=="HEAD")execSync13(`git push -u origin ${branch}`,{encoding:"utf-8",timeout:30000}),console.log(" Push complete (set upstream).")}catch{console.log(" \u26A0\uFE0F Push failed \u2014 manual push may be needed.")}}}async function autoCleanupTeam(){let teamName=process.env.GENIE_TEAM;if(!teamName)return;try{let teamManager=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),config=await teamManager.getTeam(teamName);if(!config)return;if(config.status==="done")return;console.log(` \uD83E\uDDF9 Auto-cleaning team "${teamName}"...`),await teamManager.setTeamStatus(teamName,"done"),await teamManager.killTeamMembers(teamName),console.log(` \u2705 Team "${teamName}" marked done, members killed.`)}catch{console.log(` \u26A0\uFE0F Auto-cleanup skipped \u2014 run \`genie team done ${teamName}\` manually.`)}}function autoKillPane(){let paneId=process.env.TMUX_PANE;if(paneId)setTimeout(()=>{try{let{genieTmuxCmd:genieTmuxCmd2}=(init_tmux_wrapper(),__toCommonJS(exports_tmux_wrapper));execSync13(genieTmuxCmd2(`kill-pane -t '${paneId}'`),{encoding:"utf-8"})}catch{process.exit(0)}},1000);else process.exit(0)}async function resolveNotificationTargets(){let teamName=process.env.GENIE_TEAM;if(!teamName)return{leader:"team-lead"};try{let teamManager=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leader=await teamManager.resolveLeaderName(teamName),config=await teamManager.getTeam(teamName);return{leader,spawner:config?.spawner}}catch{return{leader:teamName}}}async function notifyWaveCompletion(waveResult,wishComplete){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();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 readFile11(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}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(`
|
|
2507
2511
|
Active Executors:`),console.log("\u2500".repeat(60));for(let line of executorInfoLines)console.log(line)}}catch{}}async function statusCommand(slug){try{let state=await getState(slug)??await autoInitWishState(slug);console.log(`
|
|
2508
2512
|
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 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 readFile11(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){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)console.error(`\u274C ${summary}`),console.error(" Refusing to wipe in non-interactive mode. Pass --yes to confirm."),process.exit(2)}else{let{confirm:confirm2}=await Promise.resolve().then(() => (init_esm14(),exports_esm));if(!await confirm2({message:summary,default:!1})){console.log("Aborted.");return}}}if(existing)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)`),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}`)}}var STATUS_ICONS;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"}});var exports_team={};__export(exports_team,{registerTeamNamespace:()=>registerTeamNamespace,handleTeamCreate:()=>handleTeamCreate});import{existsSync as existsSync44}from"fs";import{copyFile as copyFile3,cp,mkdir as mkdir5}from"fs/promises";import{join as join51,resolve as resolve8}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",`
|
|
2509
2513
|
Examples:
|
|
@@ -2532,16 +2536,16 @@ ${verb} ${cleaned} window${cleaned===1?"":"s"}.`)}var init_team=__esm(()=>{init_
|
|
|
2532
2536
|
status = EXCLUDED.status,
|
|
2533
2537
|
file_path = EXCLUDED.file_path,
|
|
2534
2538
|
updated_at = now()
|
|
2535
|
-
`;return wishes.length}async function listWishes(filters){let sql=await getConnection();if(filters?.repo&&filters?.status)return sql`SELECT * FROM wishes WHERE repo = ${filters.repo} AND status = ${filters.status} ORDER BY updated_at DESC`;if(filters?.repo)return sql`SELECT * FROM wishes WHERE repo = ${filters.repo} ORDER BY updated_at DESC`;if(filters?.status)return sql`SELECT * FROM wishes WHERE status = ${filters.status} ORDER BY updated_at DESC`;if(filters?.namespace)return sql`SELECT * FROM wishes WHERE namespace = ${filters.namespace} ORDER BY updated_at DESC`;return sql`SELECT * FROM wishes ORDER BY updated_at DESC`}async function getWish(slug,repo){let sql=await getConnection(),rows=repo?await sql`SELECT * FROM wishes WHERE slug = ${slug} AND repo = ${repo} LIMIT 1`:await sql`SELECT * FROM wishes WHERE slug = ${slug} ORDER BY updated_at DESC LIMIT 1`;return rows.length>0?rows[0]:null}var REPOS_BASE2="/home/genie/workspace/repos";var init_wish_sync=__esm(()=>{init_db()});var exports_context_enrichment={};__export(exports_context_enrichment,{enrichContext:()=>enrichContext});import{execSync as
|
|
2536
|
-
`))if(line.includes(agentBrain)){let pathMatch=line.match(/\u2192\s*(.+)/);if(pathMatch)return pathMatch[1].trim()}}catch{}let candidates=[join53(process.cwd(),"brain"),join53(homedir34(),"brain")];for(let candidate of candidates)if(existsSync46(candidate))return candidate;return null}function enrichContext(options){let brainPath=options.brainPath??detectBrainPath();if(!brainPath)return"";try{
|
|
2539
|
+
`;return wishes.length}async function listWishes(filters){let sql=await getConnection();if(filters?.repo&&filters?.status)return sql`SELECT * FROM wishes WHERE repo = ${filters.repo} AND status = ${filters.status} ORDER BY updated_at DESC`;if(filters?.repo)return sql`SELECT * FROM wishes WHERE repo = ${filters.repo} ORDER BY updated_at DESC`;if(filters?.status)return sql`SELECT * FROM wishes WHERE status = ${filters.status} ORDER BY updated_at DESC`;if(filters?.namespace)return sql`SELECT * FROM wishes WHERE namespace = ${filters.namespace} ORDER BY updated_at DESC`;return sql`SELECT * FROM wishes ORDER BY updated_at DESC`}async function getWish(slug,repo){let sql=await getConnection(),rows=repo?await sql`SELECT * FROM wishes WHERE slug = ${slug} AND repo = ${repo} LIMIT 1`:await sql`SELECT * FROM wishes WHERE slug = ${slug} ORDER BY updated_at DESC LIMIT 1`;return rows.length>0?rows[0]:null}var REPOS_BASE2="/home/genie/workspace/repos";var init_wish_sync=__esm(()=>{init_db()});var exports_context_enrichment={};__export(exports_context_enrichment,{enrichContext:()=>enrichContext});import{execSync as execSync14}from"child_process";import{existsSync as existsSync46}from"fs";import{homedir as homedir34}from"os";import{join as join53}from"path";function detectBrainPath(){let agentBrain=process.env.AGENT_BRAIN;if(agentBrain)try{let vaultsOutput=execSync14("qmd vaults 2>/dev/null",{encoding:"utf-8",timeout:5000});for(let line of vaultsOutput.split(`
|
|
2540
|
+
`))if(line.includes(agentBrain)){let pathMatch=line.match(/\u2192\s*(.+)/);if(pathMatch)return pathMatch[1].trim()}}catch{}let candidates=[join53(process.cwd(),"brain"),join53(homedir34(),"brain")];for(let candidate of candidates)if(existsSync46(candidate))return candidate;return null}function enrichContext(options){let brainPath=options.brainPath??detectBrainPath();if(!brainPath)return"";try{execSync14("which rlmx",{encoding:"utf-8",timeout:5000})}catch{return""}let maxCost=options.maxCost??0.01,maxIterations=options.maxIterations??5,timeout=options.timeout??30000,rlmxQuery=`Given this task: "${options.query}"
|
|
2537
2541
|
|
|
2538
2542
|
Find the most relevant prior knowledge, decisions, and context from the brain vault.
|
|
2539
2543
|
Return ONLY a bulleted list of relevant excerpts with their source file paths.
|
|
2540
|
-
Keep it under 500 words. If nothing is relevant, say "No relevant prior context."`;try{let result2=
|
|
2544
|
+
Keep it under 500 words. If nothing is relevant, say "No relevant prior context."`;try{let result2=execSync14(`rlmx ${shellQuote4(rlmxQuery)} --context ${shellQuote4(brainPath)} --output json --max-iterations ${maxIterations} --max-cost ${maxCost}`,{encoding:"utf-8",timeout,env:{...process.env},stdio:["pipe","pipe","pipe"]}),answer=JSON.parse(result2).answer?.trim();if(!answer||answer==="No relevant prior context."||answer.length<20)return"";return`## Prior Context (from brain vault)
|
|
2541
2545
|
|
|
2542
2546
|
${answer}
|
|
2543
|
-
`}catch{return""}}function shellQuote4(s2){return`'${s2.replace(/'/g,"'\\''")}'`}var init_context_enrichment=()=>{};import{execSync as
|
|
2544
|
-
`)}function getGitDiff(){try{let diff=
|
|
2547
|
+
`}catch{return""}}function shellQuote4(s2){return`'${s2.replace(/'/g,"'\\''")}'`}var init_context_enrichment=()=>{};import{execSync as execSync15}from"child_process";import{existsSync as existsSync47}from"fs";import{mkdir as mkdir6,readFile as readFile12,writeFile as writeFile6}from"fs/promises";import{tmpdir as tmpdir3}from"os";import{join as join54}from"path";async function writeContextFile(content){let dir=join54(tmpdir3(),"genie-dispatch");await mkdir6(dir,{recursive:!0});let ts3=Date.now().toString(36),rand=Math.random().toString(36).slice(2,8),filePath=join54(dir,`ctx-${ts3}-${rand}.md`);return await writeFile6(filePath,content),filePath}function extractGroup(content,groupName){let pattern=new RegExp(`^### Group ${escapeRegExp(groupName)}:`,"m"),match=content.match(pattern);if(!match||match.index===void 0)return null;let start3=match.index,nextBoundary=content.slice(start3).slice(1).search(/^### Group \d|^---$/m),end=nextBoundary!==-1?start3+1+nextBoundary:content.length;return content.slice(start3,end).trim()}function extractWishContext(content){let execGroupsIdx=content.indexOf("## Execution Groups");if(execGroupsIdx!==-1)return content.slice(0,execGroupsIdx).trim();return content.slice(0,2000).trim()}function validateSlug(slug){if(!SLUG_PATTERN.test(slug))console.error(`\u274C Invalid slug: "${slug}"`),console.error(" Slugs must match [a-zA-Z0-9._-]+ (no slashes, dots-dots, or special characters)"),process.exit(1)}function escapeRegExp(str5){return str5.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function buildContextPrompt(opts){let parts=[`# Dispatch Context (${opts.command})`,"",`**Source file:** \`${opts.filePath}\``,"(Read the full document at the path above for complete context)",""];if(opts.wishContext)parts.push("## Wish Context","",opts.wishContext,"");if(parts.push("## Assigned Section","",opts.sectionContent,""),opts.enrichedContext)parts.push(opts.enrichedContext);if(opts.skill)parts.push("## Initial Command","",`Run \`/${opts.skill}\` to begin.`,"");return parts.join(`
|
|
2548
|
+
`)}function getGitDiff(){try{let diff=execSync15("git diff HEAD",{encoding:"utf-8",maxBuffer:1048576}),staged=execSync15("git diff --cached",{encoding:"utf-8",maxBuffer:1048576}),combined=[diff,staged].filter(Boolean).join(`
|
|
2545
2549
|
`);if(combined.length>50000)return`${combined.slice(0,50000)}
|
|
2546
2550
|
|
|
2547
2551
|
... (diff truncated at 50KB)`;return combined}catch{return""}}function parseWishGroups(content){let groups=[],groupPattern=/^### Group ([A-Za-z0-9]+):/gim,match=groupPattern.exec(content);while(match!==null){let name=match[1],start3=match.index,rest=content.slice(start3+match[0].length),nextGroupIdx=rest.search(/^### Group [A-Za-z0-9]+:/m),depsMatch=(nextGroupIdx!==-1?rest.slice(0,nextGroupIdx):rest).match(/\*\*depends-on:\*\*\s*(.+)/i),dependsOn=[];if(depsMatch){let depsNormalized=depsMatch[1].trim().replace(/\s*\([^)]*\)/g,"").trim();if(depsNormalized.toLowerCase()!=="none")dependsOn=depsNormalized.split(",").map((d)=>d.trim().replace(/^groups?\s*/i,"").trim()).filter(Boolean)}groups.push({name,dependsOn}),match=groupPattern.exec(content)}return groups}function parseExecutionStrategy(content){let strategyMatch=content.match(/^## Execution Strategy\s*$/m);if(!strategyMatch||strategyMatch.index===void 0)return buildFallbackWaves(content);let strategyStart=strategyMatch.index+strategyMatch[0].length,nextSectionMatch=content.slice(strategyStart).match(/^## /m),strategyEnd=nextSectionMatch?.index!==void 0?strategyStart+nextSectionMatch.index:content.length,strategyContent=content.slice(strategyStart,strategyEnd),waves=[],wavePattern=/^### (Wave \d+[^\n]*)/gm,waveMatch=wavePattern.exec(strategyContent);while(waveMatch!==null){let waveName=waveMatch[1].trim(),waveStart=waveMatch.index+waveMatch[0].length,nextWaveIdx=strategyContent.slice(waveStart).search(/^### /m),waveEnd=nextWaveIdx!==-1?waveStart+nextWaveIdx:strategyContent.length,waveContent=strategyContent.slice(waveStart,waveEnd),waveGroups=[],tableRowPattern=/^\|\s*([^|]+?)\s*\|\s*([^|]+?)\s*\|\s*[^|]*\s*\|$/gm,rowMatch=tableRowPattern.exec(waveContent);while(rowMatch!==null){let groupVal=rowMatch[1].trim(),agentVal=rowMatch[2].trim();if(groupVal!=="Group"&&!groupVal.startsWith("-"))waveGroups.push({group:groupVal,agent:agentVal});rowMatch=tableRowPattern.exec(waveContent)}if(waveGroups.length>0)waves.push({name:waveName,groups:waveGroups});waveMatch=wavePattern.exec(strategyContent)}if(waves.length===0)return buildFallbackWaves(content);return waves}function buildFallbackWaves(content){let groups=parseWishGroups(content);if(groups.length===0)return[];return[{name:"Wave 1 (sequential fallback)",groups:groups.map((g)=>({group:g.name,agent:"engineer"}))}]}async function resolveLeaderTarget(){let teamName=process.env.GENIE_TEAM;if(!teamName)return"team-lead";try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager));return await resolveLeaderName2(teamName)}catch{return teamName}}function detectWorkMode(ref,agent){if(!agent){if(ref.includes("#"))throw Error("Manual dispatch requires an agent: genie work <slug>#<group> <agent>");return{mode:"auto",slug:ref}}if(ref.includes("#"))return{mode:"manual",ref,agent};if(agent.includes("#"))return{mode:"manual",ref:agent,agent:ref};throw Error('Invalid: ref must contain "#" \u2014 use "genie work <slug>" or "genie work <agent> <slug>#<group>"')}async function autoOrchestrateCommand(slug){let wishPath,actualSlug=slug;if(parseWishRef(slug).namespace){let resolved=await resolveWish(slug);wishPath=resolved.wishPath,actualSlug=resolved.slug;let{handleTeamCreate:handleTeamCreate2}=await Promise.resolve().then(() => (init_team(),exports_team));await handleTeamCreate2(actualSlug,{repo:resolved.repo,branch:"dev",wish:actualSlug,tmuxSession:resolved.session});return}if(validateSlug(slug),wishPath=join54(process.cwd(),".genie","wishes",slug,"WISH.md"),!existsSync47(wishPath))console.error(`\u274C Wish not found: ${wishPath}`),console.error(` Create it first: genie wish <agent> ${slug}`),process.exit(1);Promise.resolve().then(() => (init_wish_sync(),exports_wish_sync)).then((ws)=>ws.syncWishes(process.cwd())).catch(()=>{});let content=await readFile12(wishPath,"utf-8"),groups=parseWishGroups(content),waves=parseExecutionStrategy(content);if(waves.length===0)console.error("\u274C No execution groups found in wish"),process.exit(1);let state=await getOrCreateState(slug,groups),nextWave=waves.find((wave)=>wave.groups.some((g)=>{let gs=state?.groups[g.group];return!gs||gs.status==="ready"}));if(!nextWave){console.log(`\u2705 All waves already dispatched for wish "${slug}"`);return}console.log(`\uD83D\uDE80 Dispatching ${nextWave.name} for wish "${slug}" \u2014 ${nextWave.groups.length} group(s)`);let results=await Promise.allSettled(nextWave.groups.map(({group,agent})=>{let ref=`${slug}#${group}`;return workDispatchCommand(agent,ref)})),succeeded=[],failed=[];if(results.forEach((r,i2)=>{let groupName=nextWave.groups[i2].group;if(r.status==="fulfilled")succeeded.push(groupName);else{let reason=r.reason instanceof Error?r.reason.message:String(r.reason);failed.push({group:groupName,reason})}}),succeeded.length>0)console.log(`
|
|
@@ -2564,7 +2568,7 @@ Run: genie send '<SHIP|FIX-FIRST|BLOCKED> \u2014 <summary>' --to ${reviewLeaderT
|
|
|
2564
2568
|
AND table_type = 'BASE TABLE'
|
|
2565
2569
|
AND table_name NOT LIKE '_genie_%'
|
|
2566
2570
|
ORDER BY table_name
|
|
2567
|
-
`).map((r)=>r.table_name)}async function filterAvailableTables(sql,requested){let existing=new Set(await getAvailableTables(sql)),available=[],skipped=[];for(let table of requested)if(existing.has(table))available.push(table);else skipped.push(table);return{available,skipped}}var require_ignore=__commonJS((exports,module)=>{function makeArray(subject){return Array.isArray(subject)?subject:[subject]}var UNDEFINED=void 0,EMPTY="",SPACE=" ",ESCAPE="\\",REGEX_TEST_BLANK_LINE=/^\s+$/,REGEX_INVALID_TRAILING_BACKSLASH=/(?:[^\\]|^)\\$/,REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION=/^\\!/,REGEX_REPLACE_LEADING_EXCAPED_HASH=/^\\#/,REGEX_SPLITALL_CRLF=/\r?\n/g,REGEX_TEST_INVALID_PATH=/^\.{0,2}\/|^\.{1,2}$/,REGEX_TEST_TRAILING_SLASH=/\/$/,SLASH="/",TMP_KEY_IGNORE="node-ignore";if(typeof Symbol<"u")TMP_KEY_IGNORE=Symbol.for("node-ignore");var KEY_IGNORE=TMP_KEY_IGNORE,define2=(object,key,value)=>{return Object.defineProperty(object,key,{value}),value},REGEX_REGEXP_RANGE=/([0-z])-([0-z])/g,RETURN_FALSE=()=>!1,sanitizeRange=(range)=>range.replace(REGEX_REGEXP_RANGE,(match,from,to)=>from.charCodeAt(0)<=to.charCodeAt(0)?match:EMPTY),cleanRangeBackSlash=(slashes)=>{let{length}=slashes;return slashes.slice(0,length-length%2)},REPLACERS=[[/^\uFEFF/,()=>EMPTY],[/((?:\\\\)*?)(\\?\s+)$/,(_,m1,m2)=>m1+(m2.indexOf("\\")===0?SPACE:EMPTY)],[/(\\+?)\s/g,(_,m1)=>{let{length}=m1;return m1.slice(0,length-length%2)+SPACE}],[/[\\$.|*+(){^]/g,(match)=>`\\${match}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return!/\/(?!$)/.test(this)?"(?:^|\\/)":"^"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(_,index,str5)=>index+6<str5.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(_,p1,p2)=>{let unescaped=p2.replace(/\\\*/g,"[^\\/]*");return p1+unescaped}],[/\\\\\\(?=[$.|*+(){^])/g,()=>ESCAPE],[/\\\\/g,()=>ESCAPE],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(match,leadEscape,range,endEscape,close)=>leadEscape===ESCAPE?`\\[${range}${cleanRangeBackSlash(endEscape)}${close}`:close==="]"?endEscape.length%2===0?`[${sanitizeRange(range)}${endEscape}]`:"[]":"[]"],[/(?:[^*])$/,(match)=>/\/$/.test(match)?`${match}$`:`${match}(?=$|\\/$)`]],REGEX_REPLACE_TRAILING_WILDCARD=/(^|\\\/)?\\\*$/,MODE_IGNORE="regex",MODE_CHECK_IGNORE="checkRegex",UNDERSCORE="_",TRAILING_WILD_CARD_REPLACERS={[MODE_IGNORE](_,p1){return`${p1?`${p1}[^/]+`:"[^/]*"}(?=$|\\/$)`},[MODE_CHECK_IGNORE](_,p1){return`${p1?`${p1}[^/]*`:"[^/]*"}(?=$|\\/$)`}},makeRegexPrefix=(pattern)=>REPLACERS.reduce((prev,[matcher,replacer])=>prev.replace(matcher,replacer.bind(pattern)),pattern),isString=(subject)=>typeof subject==="string",checkPattern=(pattern)=>pattern&&isString(pattern)&&!REGEX_TEST_BLANK_LINE.test(pattern)&&!REGEX_INVALID_TRAILING_BACKSLASH.test(pattern)&&pattern.indexOf("#")!==0,splitPattern=(pattern)=>pattern.split(REGEX_SPLITALL_CRLF).filter(Boolean);class IgnoreRule{constructor(pattern,mark,body,ignoreCase,negative,prefix){this.pattern=pattern,this.mark=mark,this.negative=negative,define2(this,"body",body),define2(this,"ignoreCase",ignoreCase),define2(this,"regexPrefix",prefix)}get regex(){let key=UNDERSCORE+MODE_IGNORE;if(this[key])return this[key];return this._make(MODE_IGNORE,key)}get checkRegex(){let key=UNDERSCORE+MODE_CHECK_IGNORE;if(this[key])return this[key];return this._make(MODE_CHECK_IGNORE,key)}_make(mode,key){let str5=this.regexPrefix.replace(REGEX_REPLACE_TRAILING_WILDCARD,TRAILING_WILD_CARD_REPLACERS[mode]),regex=this.ignoreCase?new RegExp(str5,"i"):new RegExp(str5);return define2(this,key,regex)}}var createRule=({pattern,mark},ignoreCase)=>{let negative=!1,body=pattern;if(body.indexOf("!")===0)negative=!0,body=body.substr(1);body=body.replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION,"!").replace(REGEX_REPLACE_LEADING_EXCAPED_HASH,"#");let regexPrefix=makeRegexPrefix(body);return new IgnoreRule(pattern,mark,body,ignoreCase,negative,regexPrefix)};class RuleManager{constructor(ignoreCase){this._ignoreCase=ignoreCase,this._rules=[]}_add(pattern){if(pattern&&pattern[KEY_IGNORE]){this._rules=this._rules.concat(pattern._rules._rules),this._added=!0;return}if(isString(pattern))pattern={pattern};if(checkPattern(pattern.pattern)){let rule=createRule(pattern,this._ignoreCase);this._added=!0,this._rules.push(rule)}}add(pattern){return this._added=!1,makeArray(isString(pattern)?splitPattern(pattern):pattern).forEach(this._add,this),this._added}test(path3,checkUnignored,mode){let ignored=!1,unignored=!1,matchedRule;this._rules.forEach((rule)=>{let{negative}=rule;if(unignored===negative&&ignored!==unignored||negative&&!ignored&&!unignored&&!checkUnignored)return;if(!rule[mode].test(path3))return;ignored=!negative,unignored=negative,matchedRule=negative?UNDEFINED:rule});let ret={ignored,unignored};if(matchedRule)ret.rule=matchedRule;return ret}}var throwError2=(message,Ctor)=>{throw new Ctor(message)},checkPath=(path3,originalPath,doThrow)=>{if(!isString(path3))return doThrow(`path must be a string, but got \`${originalPath}\``,TypeError);if(!path3)return doThrow("path must not be empty",TypeError);if(checkPath.isNotRelative(path3))return doThrow(`path should be a \`path.relative()\`d string, but got "${originalPath}"`,RangeError);return!0},isNotRelative=(path3)=>REGEX_TEST_INVALID_PATH.test(path3);checkPath.isNotRelative=isNotRelative;checkPath.convert=(p)=>p;class Ignore{constructor({ignorecase=!0,ignoreCase=ignorecase,allowRelativePaths=!1}={}){define2(this,KEY_IGNORE,!0),this._rules=new RuleManager(ignoreCase),this._strictPathCheck=!allowRelativePaths,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(pattern){if(this._rules.add(pattern))this._initCache();return this}addPattern(pattern){return this.add(pattern)}_test(originalPath,cache,checkUnignored,slices){let path3=originalPath&&checkPath.convert(originalPath);return checkPath(path3,originalPath,this._strictPathCheck?throwError2:RETURN_FALSE),this._t(path3,cache,checkUnignored,slices)}checkIgnore(path3){if(!REGEX_TEST_TRAILING_SLASH.test(path3))return this.test(path3);let slices=path3.split(SLASH).filter(Boolean);if(slices.pop(),slices.length){let parent=this._t(slices.join(SLASH)+SLASH,this._testCache,!0,slices);if(parent.ignored)return parent}return this._rules.test(path3,!1,MODE_CHECK_IGNORE)}_t(path3,cache,checkUnignored,slices){if(path3 in cache)return cache[path3];if(!slices)slices=path3.split(SLASH).filter(Boolean);if(slices.pop(),!slices.length)return cache[path3]=this._rules.test(path3,checkUnignored,MODE_IGNORE);let parent=this._t(slices.join(SLASH)+SLASH,cache,checkUnignored,slices);return cache[path3]=parent.ignored?parent:this._rules.test(path3,checkUnignored,MODE_IGNORE)}ignores(path3){return this._test(path3,this._ignoreCache,!1).ignored}createFilter(){return(path3)=>!this.ignores(path3)}filter(paths){return makeArray(paths).filter(this.createFilter())}test(path3){return this._test(path3,this._testCache,!0)}}var factory=(options)=>new Ignore(options),isPathValid=(path3)=>checkPath(path3&&checkPath.convert(path3),path3,RETURN_FALSE),setupWindows=()=>{let makePosix=(str5)=>/^\\\\\?\\/.test(str5)||/["<>|\u0000-\u001F]+/u.test(str5)?str5:str5.replace(/\\/g,"/");checkPath.convert=makePosix;let REGEX_TEST_WINDOWS_PATH_ABSOLUTE=/^[a-z]:\//i;checkPath.isNotRelative=(path3)=>REGEX_TEST_WINDOWS_PATH_ABSOLUTE.test(path3)||isNotRelative(path3)};if(typeof process<"u"&&process.platform==="win32")setupWindows();module.exports=factory;factory.default=factory;module.exports.isPathValid=isPathValid;define2(module.exports,Symbol.for("setupWindows"),setupWindows)});var exports_task_close_merged={};__export(exports_task_close_merged,{parseSinceDate:()=>parseSinceDate,matchPRsToSlugs:()=>matchPRsToSlugs,fetchMergedPRs:()=>fetchMergedPRs,extractWishSlug:()=>extractWishSlug,extractSlugFromBranch:()=>extractSlugFromBranch,extractSlugFromBody:()=>extractSlugFromBody,closeMergedTasks:()=>closeMergedTasks});import{execSync as execSync17}from"child_process";function extractSlugFromBody(body){if(!body)return null;let match=body.match(/(?:wish|slug):\s*(\S+)/i);return match?match[1]:null}function extractSlugFromBranch(branch){if(!branch)return null;let match=branch.match(/^(?:feat|fix|chore|docs|refactor|test|dream)\/(.+)$/);return match?match[1]:null}function extractWishSlug(pr){return extractSlugFromBody(pr.body)??extractSlugFromBranch(pr.headRefName)}function parseSinceDate(since){let match=since.match(/^(\d+)([hd])$/);if(!match)throw Error(`Invalid --since format: "${since}". Use e.g. "24h" or "7d".`);let amount=Number.parseInt(match[1],10),unit=match[2],now=new Date;if(unit==="h")now.setHours(now.getHours()-amount);else now.setDate(now.getDate()-amount);return now.toISOString()}function fetchMergedPRs(since,repo){let sinceDate=parseSinceDate(since),cmd=`gh pr list --state merged --json number,title,body,headRefName,mergedAt --limit 100 ${repo?`--repo ${repo}`:""}`.trim(),output;try{output=execSync17(cmd,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`Failed to fetch merged PRs: ${message}`)}return JSON.parse(output).filter((pr)=>new Date(pr.mergedAt)>=new Date(sinceDate))}function matchPRsToSlugs(prs){let matches=[];for(let pr of prs){let slug=extractWishSlug(pr);if(slug)matches.push({prNumber:pr.number,slug,mergedAt:pr.mergedAt})}return matches}async function closeMergedTasks(options={}){let{since="24h",dryRun=!1,repo,repoPath}=options,ts3=await Promise.resolve().then(() => (init_task_service(),exports_task_service)),prs=fetchMergedPRs(since,repo),slugMatches=matchPRsToSlugs(prs),result2={closed:0,alreadyShipped:0,prsScanned:prs.length,details:[]};if(slugMatches.length===0)return result2;let actor={actorType:"local",actorId:process.env.GENIE_AGENT_NAME??"cli"},processedTaskIds=new Set;for(let{prNumber,slug}of slugMatches){let tasks=await findTasksByWishSlug(slug,repoPath);for(let task of tasks){if(processedTaskIds.has(task.id))continue;if(processedTaskIds.add(task.id),task.stage==="ship"){result2.alreadyShipped++;continue}if(!dryRun)await ts3.moveTask(task.id,"ship",actor,void 0,task.repoPath),await ts3.commentOnTask(task.id,actor,`Auto-closed: PR #${prNumber} merged to dev`,task.repoPath);result2.closed++,result2.details.push({taskSeq:task.seq,taskTitle:task.title,prNumber,slug})}}return result2}async function findTasksByWishSlug(slug,repoPath){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2(),repo=repoPath??resolveRepoPath(),pattern=`%${slug}%`;return(await sql`
|
|
2571
|
+
`).map((r)=>r.table_name)}async function filterAvailableTables(sql,requested){let existing=new Set(await getAvailableTables(sql)),available=[],skipped=[];for(let table of requested)if(existing.has(table))available.push(table);else skipped.push(table);return{available,skipped}}var require_ignore=__commonJS((exports,module)=>{function makeArray(subject){return Array.isArray(subject)?subject:[subject]}var UNDEFINED=void 0,EMPTY="",SPACE=" ",ESCAPE="\\",REGEX_TEST_BLANK_LINE=/^\s+$/,REGEX_INVALID_TRAILING_BACKSLASH=/(?:[^\\]|^)\\$/,REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION=/^\\!/,REGEX_REPLACE_LEADING_EXCAPED_HASH=/^\\#/,REGEX_SPLITALL_CRLF=/\r?\n/g,REGEX_TEST_INVALID_PATH=/^\.{0,2}\/|^\.{1,2}$/,REGEX_TEST_TRAILING_SLASH=/\/$/,SLASH="/",TMP_KEY_IGNORE="node-ignore";if(typeof Symbol<"u")TMP_KEY_IGNORE=Symbol.for("node-ignore");var KEY_IGNORE=TMP_KEY_IGNORE,define2=(object,key,value)=>{return Object.defineProperty(object,key,{value}),value},REGEX_REGEXP_RANGE=/([0-z])-([0-z])/g,RETURN_FALSE=()=>!1,sanitizeRange=(range)=>range.replace(REGEX_REGEXP_RANGE,(match,from,to)=>from.charCodeAt(0)<=to.charCodeAt(0)?match:EMPTY),cleanRangeBackSlash=(slashes)=>{let{length}=slashes;return slashes.slice(0,length-length%2)},REPLACERS=[[/^\uFEFF/,()=>EMPTY],[/((?:\\\\)*?)(\\?\s+)$/,(_,m1,m2)=>m1+(m2.indexOf("\\")===0?SPACE:EMPTY)],[/(\\+?)\s/g,(_,m1)=>{let{length}=m1;return m1.slice(0,length-length%2)+SPACE}],[/[\\$.|*+(){^]/g,(match)=>`\\${match}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return!/\/(?!$)/.test(this)?"(?:^|\\/)":"^"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(_,index,str5)=>index+6<str5.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(_,p1,p2)=>{let unescaped=p2.replace(/\\\*/g,"[^\\/]*");return p1+unescaped}],[/\\\\\\(?=[$.|*+(){^])/g,()=>ESCAPE],[/\\\\/g,()=>ESCAPE],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(match,leadEscape,range,endEscape,close)=>leadEscape===ESCAPE?`\\[${range}${cleanRangeBackSlash(endEscape)}${close}`:close==="]"?endEscape.length%2===0?`[${sanitizeRange(range)}${endEscape}]`:"[]":"[]"],[/(?:[^*])$/,(match)=>/\/$/.test(match)?`${match}$`:`${match}(?=$|\\/$)`]],REGEX_REPLACE_TRAILING_WILDCARD=/(^|\\\/)?\\\*$/,MODE_IGNORE="regex",MODE_CHECK_IGNORE="checkRegex",UNDERSCORE="_",TRAILING_WILD_CARD_REPLACERS={[MODE_IGNORE](_,p1){return`${p1?`${p1}[^/]+`:"[^/]*"}(?=$|\\/$)`},[MODE_CHECK_IGNORE](_,p1){return`${p1?`${p1}[^/]*`:"[^/]*"}(?=$|\\/$)`}},makeRegexPrefix=(pattern)=>REPLACERS.reduce((prev,[matcher,replacer])=>prev.replace(matcher,replacer.bind(pattern)),pattern),isString=(subject)=>typeof subject==="string",checkPattern=(pattern)=>pattern&&isString(pattern)&&!REGEX_TEST_BLANK_LINE.test(pattern)&&!REGEX_INVALID_TRAILING_BACKSLASH.test(pattern)&&pattern.indexOf("#")!==0,splitPattern=(pattern)=>pattern.split(REGEX_SPLITALL_CRLF).filter(Boolean);class IgnoreRule{constructor(pattern,mark,body,ignoreCase,negative,prefix){this.pattern=pattern,this.mark=mark,this.negative=negative,define2(this,"body",body),define2(this,"ignoreCase",ignoreCase),define2(this,"regexPrefix",prefix)}get regex(){let key=UNDERSCORE+MODE_IGNORE;if(this[key])return this[key];return this._make(MODE_IGNORE,key)}get checkRegex(){let key=UNDERSCORE+MODE_CHECK_IGNORE;if(this[key])return this[key];return this._make(MODE_CHECK_IGNORE,key)}_make(mode,key){let str5=this.regexPrefix.replace(REGEX_REPLACE_TRAILING_WILDCARD,TRAILING_WILD_CARD_REPLACERS[mode]),regex=this.ignoreCase?new RegExp(str5,"i"):new RegExp(str5);return define2(this,key,regex)}}var createRule=({pattern,mark},ignoreCase)=>{let negative=!1,body=pattern;if(body.indexOf("!")===0)negative=!0,body=body.substr(1);body=body.replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION,"!").replace(REGEX_REPLACE_LEADING_EXCAPED_HASH,"#");let regexPrefix=makeRegexPrefix(body);return new IgnoreRule(pattern,mark,body,ignoreCase,negative,regexPrefix)};class RuleManager{constructor(ignoreCase){this._ignoreCase=ignoreCase,this._rules=[]}_add(pattern){if(pattern&&pattern[KEY_IGNORE]){this._rules=this._rules.concat(pattern._rules._rules),this._added=!0;return}if(isString(pattern))pattern={pattern};if(checkPattern(pattern.pattern)){let rule=createRule(pattern,this._ignoreCase);this._added=!0,this._rules.push(rule)}}add(pattern){return this._added=!1,makeArray(isString(pattern)?splitPattern(pattern):pattern).forEach(this._add,this),this._added}test(path3,checkUnignored,mode){let ignored=!1,unignored=!1,matchedRule;this._rules.forEach((rule)=>{let{negative}=rule;if(unignored===negative&&ignored!==unignored||negative&&!ignored&&!unignored&&!checkUnignored)return;if(!rule[mode].test(path3))return;ignored=!negative,unignored=negative,matchedRule=negative?UNDEFINED:rule});let ret={ignored,unignored};if(matchedRule)ret.rule=matchedRule;return ret}}var throwError2=(message,Ctor)=>{throw new Ctor(message)},checkPath=(path3,originalPath,doThrow)=>{if(!isString(path3))return doThrow(`path must be a string, but got \`${originalPath}\``,TypeError);if(!path3)return doThrow("path must not be empty",TypeError);if(checkPath.isNotRelative(path3))return doThrow(`path should be a \`path.relative()\`d string, but got "${originalPath}"`,RangeError);return!0},isNotRelative=(path3)=>REGEX_TEST_INVALID_PATH.test(path3);checkPath.isNotRelative=isNotRelative;checkPath.convert=(p)=>p;class Ignore{constructor({ignorecase=!0,ignoreCase=ignorecase,allowRelativePaths=!1}={}){define2(this,KEY_IGNORE,!0),this._rules=new RuleManager(ignoreCase),this._strictPathCheck=!allowRelativePaths,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(pattern){if(this._rules.add(pattern))this._initCache();return this}addPattern(pattern){return this.add(pattern)}_test(originalPath,cache,checkUnignored,slices){let path3=originalPath&&checkPath.convert(originalPath);return checkPath(path3,originalPath,this._strictPathCheck?throwError2:RETURN_FALSE),this._t(path3,cache,checkUnignored,slices)}checkIgnore(path3){if(!REGEX_TEST_TRAILING_SLASH.test(path3))return this.test(path3);let slices=path3.split(SLASH).filter(Boolean);if(slices.pop(),slices.length){let parent=this._t(slices.join(SLASH)+SLASH,this._testCache,!0,slices);if(parent.ignored)return parent}return this._rules.test(path3,!1,MODE_CHECK_IGNORE)}_t(path3,cache,checkUnignored,slices){if(path3 in cache)return cache[path3];if(!slices)slices=path3.split(SLASH).filter(Boolean);if(slices.pop(),!slices.length)return cache[path3]=this._rules.test(path3,checkUnignored,MODE_IGNORE);let parent=this._t(slices.join(SLASH)+SLASH,cache,checkUnignored,slices);return cache[path3]=parent.ignored?parent:this._rules.test(path3,checkUnignored,MODE_IGNORE)}ignores(path3){return this._test(path3,this._ignoreCache,!1).ignored}createFilter(){return(path3)=>!this.ignores(path3)}filter(paths){return makeArray(paths).filter(this.createFilter())}test(path3){return this._test(path3,this._testCache,!0)}}var factory=(options)=>new Ignore(options),isPathValid=(path3)=>checkPath(path3&&checkPath.convert(path3),path3,RETURN_FALSE),setupWindows=()=>{let makePosix=(str5)=>/^\\\\\?\\/.test(str5)||/["<>|\u0000-\u001F]+/u.test(str5)?str5:str5.replace(/\\/g,"/");checkPath.convert=makePosix;let REGEX_TEST_WINDOWS_PATH_ABSOLUTE=/^[a-z]:\//i;checkPath.isNotRelative=(path3)=>REGEX_TEST_WINDOWS_PATH_ABSOLUTE.test(path3)||isNotRelative(path3)};if(typeof process<"u"&&process.platform==="win32")setupWindows();module.exports=factory;factory.default=factory;module.exports.isPathValid=isPathValid;define2(module.exports,Symbol.for("setupWindows"),setupWindows)});var exports_task_close_merged={};__export(exports_task_close_merged,{parseSinceDate:()=>parseSinceDate,matchPRsToSlugs:()=>matchPRsToSlugs,fetchMergedPRs:()=>fetchMergedPRs,extractWishSlug:()=>extractWishSlug,extractSlugFromBranch:()=>extractSlugFromBranch,extractSlugFromBody:()=>extractSlugFromBody,closeMergedTasks:()=>closeMergedTasks});import{execSync as execSync16}from"child_process";function extractSlugFromBody(body){if(!body)return null;let match=body.match(/(?:wish|slug):\s*(\S+)/i);return match?match[1]:null}function extractSlugFromBranch(branch){if(!branch)return null;let match=branch.match(/^(?:feat|fix|chore|docs|refactor|test|dream)\/(.+)$/);return match?match[1]:null}function extractWishSlug(pr){return extractSlugFromBody(pr.body)??extractSlugFromBranch(pr.headRefName)}function parseSinceDate(since){let match=since.match(/^(\d+)([hd])$/);if(!match)throw Error(`Invalid --since format: "${since}". Use e.g. "24h" or "7d".`);let amount=Number.parseInt(match[1],10),unit=match[2],now=new Date;if(unit==="h")now.setHours(now.getHours()-amount);else now.setDate(now.getDate()-amount);return now.toISOString()}function fetchMergedPRs(since,repo){let sinceDate=parseSinceDate(since),cmd=`gh pr list --state merged --json number,title,body,headRefName,mergedAt --limit 100 ${repo?`--repo ${repo}`:""}`.trim(),output;try{output=execSync16(cmd,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`Failed to fetch merged PRs: ${message}`)}return JSON.parse(output).filter((pr)=>new Date(pr.mergedAt)>=new Date(sinceDate))}function matchPRsToSlugs(prs){let matches=[];for(let pr of prs){let slug=extractWishSlug(pr);if(slug)matches.push({prNumber:pr.number,slug,mergedAt:pr.mergedAt})}return matches}async function closeMergedTasks(options={}){let{since="24h",dryRun=!1,repo,repoPath}=options,ts3=await Promise.resolve().then(() => (init_task_service(),exports_task_service)),prs=fetchMergedPRs(since,repo),slugMatches=matchPRsToSlugs(prs),result2={closed:0,alreadyShipped:0,prsScanned:prs.length,details:[]};if(slugMatches.length===0)return result2;let actor={actorType:"local",actorId:process.env.GENIE_AGENT_NAME??"cli"},processedTaskIds=new Set;for(let{prNumber,slug}of slugMatches){let tasks=await findTasksByWishSlug(slug,repoPath);for(let task of tasks){if(processedTaskIds.has(task.id))continue;if(processedTaskIds.add(task.id),task.stage==="ship"){result2.alreadyShipped++;continue}if(!dryRun)await ts3.moveTask(task.id,"ship",actor,void 0,task.repoPath),await ts3.commentOnTask(task.id,actor,`Auto-closed: PR #${prNumber} merged to dev`,task.repoPath);result2.closed++,result2.details.push({taskSeq:task.seq,taskTitle:task.title,prNumber,slug})}}return result2}async function findTasksByWishSlug(slug,repoPath){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2(),repo=repoPath??resolveRepoPath(),pattern=`%${slug}%`;return(await sql`
|
|
2568
2572
|
SELECT id, seq, title, stage, repo_path
|
|
2569
2573
|
FROM tasks
|
|
2570
2574
|
WHERE repo_path = ${repo}
|
|
@@ -2612,6 +2616,15 @@ ${label} <TODO>
|
|
|
2612
2616
|
${p.actor},
|
|
2613
2617
|
${tx.json({agent_id:p.agentId,outcome:p.outcome,reason:p.reason})}
|
|
2614
2618
|
)
|
|
2619
|
+
`}async function terminalizeAgentRows(tx,agentId){let ident=(await tx`
|
|
2620
|
+
UPDATE agents
|
|
2621
|
+
SET state = 'done', current_executor_id = NULL
|
|
2622
|
+
WHERE id = ${agentId}
|
|
2623
|
+
RETURNING custom_name, team
|
|
2624
|
+
`)[0];if(!ident?.custom_name||!ident?.team||ident.custom_name===agentId)return;await tx`
|
|
2625
|
+
UPDATE agents
|
|
2626
|
+
SET state = 'done', current_executor_id = NULL
|
|
2627
|
+
WHERE id = ${ident.custom_name} AND team = ${ident.team}
|
|
2615
2628
|
`}async function turnClose(opts){if((opts.outcome==="blocked"||opts.outcome==="failed")&&!opts.reason?.trim())throw Error(`turnClose: --reason is required for outcome '${opts.outcome}'`);let executorId=resolveExecutorId(opts),actor=opts.actor??process.env.GENIE_AGENT_NAME??"cli",reason=opts.reason?.trim()||null,auditInsert=opts.auditInsert??defaultAuditInsert;return(await getConnection()).begin(async(tx)=>{let effectiveId=executorId,rows=await tx`
|
|
2616
2629
|
SELECT state, outcome, agent_id FROM executors
|
|
2617
2630
|
WHERE id = ${executorId}
|
|
@@ -2634,11 +2647,7 @@ ${label} <TODO>
|
|
|
2634
2647
|
state = 'done',
|
|
2635
2648
|
ended_at = ${now}
|
|
2636
2649
|
WHERE id = ${effectiveId}
|
|
2637
|
-
`,await tx`
|
|
2638
|
-
UPDATE agents
|
|
2639
|
-
SET current_executor_id = NULL
|
|
2640
|
-
WHERE current_executor_id = ${effectiveId}
|
|
2641
|
-
`,await auditInsert(tx,{executorId:effectiveId,agentId:row.agent_id,outcome:opts.outcome,reason,actor}),{noop:!1,executorId:effectiveId,outcome:opts.outcome,closedAt:now}})}var TERMINAL_STATES;var init_turn_close=__esm(()=>{init_db();init_emit();TERMINAL_STATES=new Set(["done","terminated","error"])});var exports_done={};__export(exports_done,{doneAction:()=>doneAction});async function doneAction(ref,deps={}){let agentName=process.env.GENIE_AGENT_NAME;if(!ref&&agentName){let result2=await(deps.turnCloseFn??turnClose)({outcome:"done"});if(result2.noop)console.log(`\u2139\uFE0F Executor ${result2.executorId} already closed \u2014 no-op.`);else console.log(`\u2705 Turn closed: outcome=done, executor=${result2.executorId}`);return}if(ref){await(deps.wishDone??(async(r)=>{let{doneCommand:doneCommand2}=await Promise.resolve().then(() => (init_state(),exports_state));await doneCommand2(r)}))(ref);return}console.error("\u274C genie done requires either a <slug>#<group> ref (team-lead) or GENIE_AGENT_NAME (inside agent session)."),process.exit(2)}var init_done=__esm(()=>{init_turn_close()});var exports_blocked={};__export(exports_blocked,{blockedAction:()=>blockedAction});async function blockedAction(options,deps={}){let reason=options.reason?.trim();if(!reason)console.error('\u274C genie blocked requires --reason "<message>"'),process.exit(2);let result2=await(deps.turnCloseFn??turnClose)({outcome:"blocked",reason});if(result2.noop)console.log(`\u2139\uFE0F Executor ${result2.executorId} already closed \u2014 no-op.`);else console.log(`\uD83D\uDD12 Turn closed: outcome=blocked, executor=${result2.executorId}`),console.log(` Reason: ${reason}`)}var init_blocked=__esm(()=>{init_turn_close()});var exports_failed={};__export(exports_failed,{failedAction:()=>failedAction});async function failedAction(options,deps={}){let reason=options.reason?.trim();if(!reason)console.error('\u274C genie failed requires --reason "<message>"'),process.exit(2);let result2=await(deps.turnCloseFn??turnClose)({outcome:"failed",reason});if(result2.noop)console.log(`\u2139\uFE0F Executor ${result2.executorId} already closed \u2014 no-op.`);else console.log(`\uD83D\uDED1 Turn closed: outcome=failed, executor=${result2.executorId}`),console.log(` Reason: ${reason}`)}var init_failed=__esm(()=>{init_turn_close()});async function resolveExecutorId2(sql,opts){if(opts.executorId)return{id:opts.executorId,source:"executorId"};if(opts.paneId){let rows=await sql`
|
|
2650
|
+
`,await terminalizeAgentRows(tx,row.agent_id),await auditInsert(tx,{executorId:effectiveId,agentId:row.agent_id,outcome:opts.outcome,reason,actor}),{noop:!1,executorId:effectiveId,outcome:opts.outcome,closedAt:now}})}var TERMINAL_STATES;var init_turn_close=__esm(()=>{init_db();init_emit();TERMINAL_STATES=new Set(["done","terminated","error"])});var exports_done={};__export(exports_done,{doneAction:()=>doneAction});async function doneAction(ref,deps={}){let agentName=process.env.GENIE_AGENT_NAME;if(!ref&&agentName){let result2=await(deps.turnCloseFn??turnClose)({outcome:"done"});if(result2.noop)console.log(`\u2139\uFE0F Executor ${result2.executorId} already closed \u2014 no-op.`);else console.log(`\u2705 Turn closed: outcome=done, executor=${result2.executorId}`);return}if(ref){await(deps.wishDone??(async(r)=>{let{doneCommand:doneCommand2}=await Promise.resolve().then(() => (init_state(),exports_state));await doneCommand2(r)}))(ref);return}console.error("\u274C genie done requires either a <slug>#<group> ref (team-lead) or GENIE_AGENT_NAME (inside agent session)."),process.exit(2)}var init_done=__esm(()=>{init_turn_close()});var exports_blocked={};__export(exports_blocked,{blockedAction:()=>blockedAction});async function blockedAction(options,deps={}){let reason=options.reason?.trim();if(!reason)console.error('\u274C genie blocked requires --reason "<message>"'),process.exit(2);let result2=await(deps.turnCloseFn??turnClose)({outcome:"blocked",reason});if(result2.noop)console.log(`\u2139\uFE0F Executor ${result2.executorId} already closed \u2014 no-op.`);else console.log(`\uD83D\uDD12 Turn closed: outcome=blocked, executor=${result2.executorId}`),console.log(` Reason: ${reason}`)}var init_blocked=__esm(()=>{init_turn_close()});var exports_failed={};__export(exports_failed,{failedAction:()=>failedAction});async function failedAction(options,deps={}){let reason=options.reason?.trim();if(!reason)console.error('\u274C genie failed requires --reason "<message>"'),process.exit(2);let result2=await(deps.turnCloseFn??turnClose)({outcome:"failed",reason});if(result2.noop)console.log(`\u2139\uFE0F Executor ${result2.executorId} already closed \u2014 no-op.`);else console.log(`\uD83D\uDED1 Turn closed: outcome=failed, executor=${result2.executorId}`),console.log(` Reason: ${reason}`)}var init_failed=__esm(()=>{init_turn_close()});async function resolveExecutorId2(sql,opts){if(opts.executorId)return{id:opts.executorId,source:"executorId"};if(opts.paneId){let rows=await sql`
|
|
2642
2651
|
SELECT id FROM executors
|
|
2643
2652
|
WHERE tmux_pane_id = ${opts.paneId}
|
|
2644
2653
|
ORDER BY started_at DESC
|
|
@@ -3132,17 +3141,17 @@ $ bun add react-devtools-core@7 -d
|
|
|
3132
3141
|
WHERE a.executor_id = ANY(${executorIds})
|
|
3133
3142
|
AND a.ended_at IS NULL
|
|
3134
3143
|
ORDER BY a.started_at DESC
|
|
3135
|
-
`).map(mapAssignment)}function mapExecutor(row){let meta=row.metadata;return{id:String(row.id),agentId:String(row.agent_id),agentName:row.agent_name?String(row.agent_name):null,provider:String(row.provider),transport:String(row.transport),pid:row.pid!=null?Number(row.pid):null,tmuxSession:row.tmux_session?String(row.tmux_session):null,tmuxPaneId:row.tmux_pane_id?String(row.tmux_pane_id):null,state:String(row.state),metadata:typeof meta==="string"?JSON.parse(meta):meta??{},startedAt:row.started_at instanceof Date?row.started_at.toISOString():String(row.started_at),role:row.role?String(row.role):null,team:row.team?String(row.team):null}}function mapAssignment(row){return{id:String(row.id),executorId:String(row.executor_id),taskId:row.task_id?String(row.task_id):null,taskTitle:row.task_title?String(row.task_title):null,wishSlug:row.wish_slug?String(row.wish_slug):null,groupNumber:row.group_number!=null?Number(row.group_number):null,startedAt:row.started_at instanceof Date?row.started_at.toISOString():String(row.started_at)}}import{execSync as
|
|
3136
|
-
`)){if(!line)continue;let parts=line.split("|");if(parts.length<15)continue;let parsed=parsePaneLine(parts);if(!sessionMap.has(parsed.sessionName))sessionMap.set(parsed.sessionName,{...parsed.session,windows:[]});let winKey=`${parsed.sessionName}:${parsed.winIdxStr}`;if(!windowMap.has(winKey)){let win={...parsed.window,panes:[]};windowMap.set(winKey,win),sessionMap.get(parsed.sessionName)?.windows.push(win)}windowMap.get(winKey)?.panes.push(parsed.pane)}return Array.from(sessionMap.values()).sort((a,b3)=>a.name.localeCompare(b3.name))}function isPidAlive3(pid){try{return process.kill(pid,0),!0}catch{return!1}}function allClaudePanes(sessions2){return sessions2.flatMap((s2)=>s2.windows.flatMap((w2)=>w2.panes)).filter((p)=>p.command==="claude"||p.title.includes("claude"))}function detectGaps(executors,sessions2){let deadPidExecutors=executors.filter((e)=>e.pid!=null&&!isPidAlive3(e.pid)),executorPaneIds=new Set(executors.map((e)=>e.tmuxPaneId).filter(Boolean)),claudePanes=allClaudePanes(sessions2),orphanPanes=claudePanes.filter((p)=>!executorPaneIds.has(p.paneId)),linkedCount=executors.filter((e)=>e.tmuxPaneId&&!deadPidExecutors.some((d2)=>d2.id===e.id)).length,deadPaneCount=sessions2.flatMap((s2)=>s2.windows.flatMap((w2)=>w2.panes)).filter((p)=>p.isDead).length;return{deadPidExecutors,orphanPanes,linkedCount,totalExecutors:executors.length,totalClaudePanes:claudePanes.length,deadPaneCount}}async function collectDiagnostics(){let{loadExecutors:loadExecutors2,loadAssignments:loadAssignments2}=await Promise.resolve().then(() => exports_db2),sessions2=getTmuxInventory(),executors=await loadExecutors2(),executorIds=executors.map((e)=>e.id),assignments=await loadAssignments2(executorIds),gaps=detectGaps(executors,sessions2);if(gaps.deadPidExecutors.length>0){let{terminateExecutor:terminateExecutor2}=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2();await Promise.allSettled(gaps.deadPidExecutors.map(async(exec3)=>{if(await terminateExecutor2(exec3.id),exec3.agentId)await sql`UPDATE agents SET current_executor_id = NULL WHERE current_executor_id = ${exec3.id}`}))}return{sessions:sessions2,executors,assignments,gaps,timestamp:Date.now()}}var init_diagnostics=__esm(()=>{init_ensure_tmux()});import{existsSync as existsSync56,readFileSync as readFileSync35,unlinkSync as unlinkSync12}from"fs";import{homedir as homedir36}from"os";import{join as join68}from"path";function getInitialAgentFilePath(){let genieHome6=process.env.GENIE_HOME??join68(homedir36(),".genie");return join68(genieHome6,"tui-initial-agent")}function consumeInitialAgentSignal(){let filePath=getInitialAgentFilePath();if(!existsSync56(filePath))return;try{let agent=readFileSync35(filePath,"utf-8").trim();return unlinkSync12(filePath),agent||void 0}catch{return}}var init_initial_agent=()=>{};function toSessionName(agentName){return agentName.replace(/\//g,"-")}function buildSessionTree(snapshot){let executorByPaneId=new Map;for(let exec3 of snapshot.executors)if(exec3.tmuxPaneId)executorByPaneId.set(exec3.tmuxPaneId,exec3);return snapshot.sessions.filter((s2)=>s2.name!=="genie-tui").map((session)=>sessionToNode(session,executorByPaneId))}function buildWorkspaceTree(input){let{agentNames,sessions:sessions2,executors}=input,sessionByName=new Map;for(let s2 of sessions2)if(s2.name!=="genie-tui")sessionByName.set(s2.name,s2);let executorByPaneId=new Map;for(let exec3 of executors)if(exec3.tmuxPaneId)executorByPaneId.set(exec3.tmuxPaneId,exec3);let executorsByAgent=new Map;for(let exec3 of executors){let name=exec3.agentName??exec3.metadata?.agentName;if(typeof name==="string"){let list2=executorsByAgent.get(name)??[];list2.push(exec3),executorsByAgent.set(name,list2)}}let{topLevel,subsByParent}=groupAgentNames(agentNames),nodes=topLevel.map((name)=>{let node=buildAgentNode(name,sessionByName.get(toSessionName(name)),executorsByAgent.get(name)??[],executorByPaneId);return appendSubAgentNodes(node,subsByParent.get(name),sessionByName,executorsByAgent,executorByPaneId),node}),claimedSessions=new Set(agentNames.map(toSessionName));for(let[name,session]of sessionByName)if(!claimedSessions.has(name))nodes.push(sessionToNode(session,executorByPaneId));return nodes}function resolvePreferredWindowIndex(session,agentName){let windows=[...session.windows].sort((a,b3)=>a.index-b3.index),hasClaudePane=(window2)=>window2.panes.some((pane)=>!pane.isDead&&(pane.command==="claude"||pane.title.includes("claude")));return(windows.find((window2)=>window2.active&&hasClaudePane(window2))??(agentName?windows.find((window2)=>window2.name===agentName):void 0)??windows.find((window2)=>hasClaudePane(window2))??windows.find((window2)=>window2.active&&window2.index!==0)??windows.find((window2)=>window2.index!==0))?.index}function hasLiveClaudeWindow(session){return session.windows.some((window2)=>window2.panes.some((pane)=>!pane.isDead&&(pane.command==="claude"||pane.title.includes("claude"))))}function groupAgentNames(names){let topLevel=[],subsByParent=new Map;for(let name of names){let slashIdx=name.indexOf("/");if(slashIdx===-1)topLevel.push(name);else{let parent=name.slice(0,slashIdx),subs=subsByParent.get(parent)??[];subs.push(name),subsByParent.set(parent,subs)}}return{topLevel,subsByParent}}function appendSubAgentNodes(parent,subs,sessionByName,executorsByAgent,executorByPaneId){if(!subs)return;for(let subName of subs){let subLabel=subName.slice(subName.indexOf("/")+1),subNode=buildAgentNode(subName,sessionByName.get(toSessionName(subName)),executorsByAgent.get(subName)??[],executorByPaneId);subNode.label=subLabel,subNode.depth=1,parent.children.push(subNode)}}function countClaudePanes(session){return session.windows.reduce((sum,w2)=>sum+w2.panes.filter((p)=>p.command==="claude"||p.title.includes("claude")).length,0)}function buildAgentNode(name,session,agentExecutors,executorByPaneId){let wsState=deriveWsAgentState(session,agentExecutors),attachWindowIndex=session?resolvePreferredWindowIndex(session,name):void 0,children=[];if(session)for(let win of session.windows){if(win.index===0)continue;children.push(windowToNode(session.name,win,executorByPaneId))}return{id:`agent:${name}`,type:"agent",label:name,depth:0,expanded:children.length>0,children,data:{sessionName:toSessionName(name),windowCount:session?session.windows.length:0,attachWindowIndex,provider:agentExecutors[0]?.provider??null},activePanes:session?countClaudePanes(session):0,agentState:agentExecutors.length>0?deriveExecutorState(agentExecutors):void 0,wsAgentState:wsState}}function deriveWsAgentState(session,agentExecutors){if(!session)return"stopped";if(hasLiveClaudeWindow(session))return"running";for(let exec3 of agentExecutors){if(exec3.state==="error"||exec3.state==="terminated")return"error";if(exec3.state==="spawning")return"spawning"}if(agentExecutors.length===0)return"stopped";return"running"}function deriveExecutorState(execs){for(let e of execs)if(e.state==="working")return"working";for(let e of execs)if(e.state==="permission")return"permission";for(let e of execs)if(e.state==="error"||e.state==="terminated")return"error";return"idle"}function sessionToNode(session,executorMap){let claudePanes=session.windows.reduce((sum,w2)=>sum+w2.panes.filter((p)=>p.command==="claude"||p.title.includes("claude")).length,0);return{id:`session:${session.name}`,type:"session",label:session.name,depth:0,expanded:!0,children:session.windows.map((w2)=>windowToNode(session.name,w2,executorMap)),data:{attached:session.attached,windowCount:session.windowCount},activePanes:claudePanes,agentState:void 0,wsAgentState:void 0}}function windowToNode(sessionName,window2,executorMap){let activePanes=window2.panes.filter((p)=>!p.isDead&&(p.command==="claude"||p.title.includes("claude"))).length;return{id:`window:${sessionName}:${window2.index}`,type:"window",label:window2.name,depth:1,expanded:!0,children:window2.panes.map((p)=>paneToNode(sessionName,window2.index,p,executorMap)),data:{active:window2.active,paneCount:window2.paneCount},activePanes,agentState:void 0,wsAgentState:void 0}}function paneToNode(sessionName,windowIndex,pane,executorMap){let executor=executorMap.get(pane.paneId),isClaude=pane.command==="claude"||pane.title.includes("claude");return{id:`pane:${pane.paneId}`,type:"pane",label:derivePaneLabel(pane,executor,isClaude),depth:2,expanded:!1,children:[],data:{command:pane.command,isDead:pane.isDead,pid:pane.pid,size:pane.size,paneId:pane.paneId,sessionName,windowIndex},activePanes:0,agentState:derivePaneState(pane,executor),wsAgentState:void 0}}function derivePaneLabel(pane,executor,isClaude){if(executor?.agentName&&executor?.team)return`${executor.team}/${executor.agentName}`;if(executor?.agentName)return executor.agentName;if(pane.title&&pane.title!==pane.command&&!isDefaultPaneTitle(pane.title))return pane.title;if(isClaude)return"claude";return pane.command}function isDefaultPaneTitle(title){let hostname2=__require("os").hostname();return title===hostname2||title.startsWith(`${hostname2}.`)||title.startsWith("\u2733")}function derivePaneState(pane,executor){if(pane.isDead)return"error";if(!executor)return;let s2=executor.state;if(s2==="working")return"working";if(s2==="idle"||s2==="spawning")return"idle";if(s2==="permission")return"permission";if(s2==="error"||s2==="terminated")return"error";return}function getSessionTarget(node){if(node.type==="agent"){let sessionName=node.data.sessionName,attachWindowIndex=node.data.attachWindowIndex;if(typeof attachWindowIndex==="number")return{sessionName,windowIndex:attachWindowIndex};let firstWindowChild=node.children.find((child)=>child.type==="window");if(firstWindowChild){let parts=firstWindowChild.id.split(":");return{sessionName,windowIndex:Number(parts[2])}}return{sessionName}}if(node.type==="session")return{sessionName:node.label};if(node.type==="window"){let parts=node.id.split(":");return{sessionName:parts[1],windowIndex:Number(parts[2])}}if(node.type==="pane"){let data=node.data;return{sessionName:data.sessionName,windowIndex:data.windowIndex}}return null}var palette,icons;var init_theme2=__esm(()=>{palette={purple:"#a855f7",violet:"#7c3aed",cyan:"#22d3ee",emerald:"#34d399",bg:"#1a1028",bgLight:"#241838",bgLighter:"#2e2048",text:"#e2e8f0",textDim:"#94a3b8",textMuted:"#64748b",border:"#414868",borderActive:"#7c3aed",scrollTrack:"#414868",scrollThumb:"#7aa2f7",active:"#22d3ee",success:"#34d399",warning:"#fbbf24",error:"#f87171",idle:"#94a3b8"},icons={org:"\u25C6",project:"\u25B8",projectOpen:"\u25BE",board:"\u2261",boardOpen:"\u2261",column:"\u2502",task:"\u25CB",taskActive:"\u25CF",taskDone:"\u2713",agent:"\u25B6",collapsed:"\u25B8",expanded:"\u25BE"}});function flattenTree(nodes){let result2=[];function walk(node,depth){if(result2.push({node,depth,visible:!0}),node.expanded)for(let child of node.children)walk(child,depth+1)}for(let node of nodes)walk(node,0);return result2}function toggleNode(nodes,id){return nodes.map((node)=>{if(node.id===id)return{...node,expanded:!node.expanded};return{...node,children:toggleNode(node.children,id)}})}var import_jsx_dev_runtime2;var init_jsx_dev_runtime=__esm(()=>{import_jsx_dev_runtime2=__toESM(require_react_jsx_dev_runtime_development(),1)});function CliPreviewLine({intent,hint=DEFAULT_HINT}){let cli=null,errorMessage=null;try{cli=buildSpawnInvocation(intent).cli}catch(err){errorMessage=err instanceof Error?err.message:String(err)}if(errorMessage!==null)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${errorMessage}`},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:hint},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.cyan,children:"\u25B6 "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:cli},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:hint},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}var DEFAULT_HINT="Enter to run \xB7 Esc to cancel";var init_CliPreviewLine=__esm(()=>{init_spawn_invocation();init_theme2();init_jsx_dev_runtime()});async function defaultLoadAgents(){let{spawn:spawn5}=await import("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1],[command,args]=genieBin&&genieBin!=="genie"?[bunPath,[genieBin,"dir","ls","--json"]]:["genie",["dir","ls","--json"]],stdout=await new Promise((resolve14,reject)=>{let child=spawn5(command,args,{stdio:["ignore","pipe","ignore"]}),chunks=[];child.stdout.on("data",(c)=>chunks.push(c)),child.on("error",reject),child.on("close",()=>resolve14(Buffer.concat(chunks).toString("utf-8")))});return JSON.parse(stdout).map((e)=>typeof e?.name==="string"?{name:e.name}:null).filter((e)=>e!==null)}function buildIntent(agentName,target){let intent={kind:"spawn-agent",name:agentName,session:target.session};if(target.window!==void 0&&target.window.length>0)intent.window=target.window;else intent.newWindow=!0;return intent}function applyFilter2(agents,filter){if(filter.length===0)return agents;let needle=filter.toLowerCase();return agents.filter((a)=>a.name.toLowerCase().includes(needle))}function handleControlKey(key,deps){if(key.name==="escape")return deps.onCancel(),!0;if(key.name==="up"&&deps.filteredLength>0)return deps.setSelectedIndex((prev)=>prev<=0?deps.filteredLength-1:prev-1),!0;if(key.name==="down"&&deps.filteredLength>0)return deps.setSelectedIndex((prev)=>prev>=deps.filteredLength-1?0:prev+1),!0;if((key.name==="return"||key.name==="enter")&&deps.highlighted)return deps.onConfirm(buildIntent(deps.highlighted.name,deps.target)),!0;if(key.name==="backspace")return deps.setFilter((prev)=>prev.slice(0,-1)),!0;if(key.name==="up"||key.name==="down"||key.name==="return"||key.name==="enter")return!0;return!1}function appendCharIfPrintable(key,setFilter){let ch=key.sequence??key.name;if(typeof ch==="string"&&ch.length===1&&ch>=" "&&ch!=="\x7F")setFilter((prev)=>prev+ch)}function AgentPicker({target,onConfirm,onCancel,loadAgents=defaultLoadAgents}){let[agents,setAgents]=import_react14.useState(null),[loadError,setLoadError]=import_react14.useState(null),[filter,setFilter]=import_react14.useState(""),[selectedIndex,setSelectedIndex]=import_react14.useState(0);import_react14.useEffect(()=>{let active=!0;return loadAgents().then((list2)=>{if(!active)return;setAgents(list2)}).catch((err)=>{if(!active)return;setLoadError(err instanceof Error?err.message:String(err)),setAgents([])}),()=>{active=!1}},[loadAgents]);let filtered=import_react14.useMemo(()=>agents?applyFilter2(agents,filter):[],[agents,filter]);import_react14.useEffect(()=>{if(filtered.length===0){if(selectedIndex!==0)setSelectedIndex(0);return}if(selectedIndex>=filtered.length)setSelectedIndex(filtered.length-1)},[filtered.length,selectedIndex]);let highlighted=filtered[selectedIndex],previewIntent=highlighted?buildIntent(highlighted.name,target):null,handleKey=import_react14.useCallback((key)=>{if(handleControlKey(key,{onCancel,onConfirm,target,highlighted,filteredLength:filtered.length,setSelectedIndex,setFilter}))return;if(key.ctrl||key.meta)return;appendCharIfPrintable(key,setFilter)},[filtered.length,highlighted,onCancel,onConfirm,target]);useKeyboard(handleKey);let targetLabel=target.window?target.window:target.session,modeHint=target.window?"in window":"new window in session",statusText=agents===null?"Loading agents\u2026":loadError!==null?`Load failed: ${loadError}`:null;return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:"#0a0a0a",children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.violet,backgroundColor:palette.bgLight,width:80,flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"Spawn here"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` \u2014 ${modeHint} `},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:targetLabel},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Filter: "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:filter.length>0?filter:" "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:filter.length>0?"":"(type to narrow)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),statusText!==null?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:loadError!==null?palette.error:palette.textDim,children:statusText},void 0,!1,void 0,this)},void 0,!1,void 0,this):filtered.length===0?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"No agents registered"},void 0,!1,void 0,this)},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:filtered.map((agent,i2)=>import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:i2===selectedIndex?palette.violet:palette.textDim,children:i2===selectedIndex?"\u25B8 ":" "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:i2===selectedIndex?palette.text:palette.textDim,children:agent.name},void 0,!1,void 0,this)]},agent.name,!0,void 0,this))},void 0,!1,void 0,this),previewIntent!==null?import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent:previewIntent},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var import_react14;var init_AgentPicker=__esm(async()=>{init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react();import_react14=__toESM(require_react_development(),1)});function ContextMenu({items,onAction,onClose,positionY=0}){let[selectedIndex,setSelectedIndex]=import_react16.useState(0),[inputMode,setInputMode]=import_react16.useState(!1),inputRef=import_react16.useRef(""),selectOptions=items.map((item)=>({name:`${item.label}${item.shortcut?` ${item.shortcut}`:""}`,description:"",value:item.action}));useKeyboard(import_react16.useCallback((key)=>{if(inputMode)return;if(key.name==="escape"){onClose();return}for(let item of items)if(item.shortcut&&key.name===item.shortcut.toLowerCase()){if(item.needsInput)setInputMode(!0),inputRef.current="",setSelectedIndex(items.indexOf(item));else onAction(item.action);return}},[inputMode,items,onAction,onClose]));let handleSelect=import_react16.useCallback((_index,option)=>{let value=option?.value;if(!value)return;if(items.find((i2)=>i2.action===value)?.needsInput){setInputMode(!0),inputRef.current="";return}onAction(value)},[items,onAction]),handleInputChange=import_react16.useCallback((v2)=>{inputRef.current=v2},[]),handleInputSubmit=import_react16.useCallback(()=>{let item=items[selectedIndex],value=inputRef.current.trim();if(item&&value)onAction(item.action,value);setInputMode(!1),inputRef.current=""},[items,selectedIndex,onAction]);if(items.length===0)return onClose(),null;return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",onMouseDown:()=>onClose(),children:[positionY>0?import_jsx_dev_runtime2.jsxDEV("box",{height:positionY},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.violet,backgroundColor:palette.bgLight,width:32,height:inputMode?items.length+5:items.length+2,flexDirection:"column",onMouseDown:(e)=>e.stopPropagation?.(),children:[import_jsx_dev_runtime2.jsxDEV("select",{options:selectOptions,selectedIndex,onSelect:handleSelect,onChange:(index)=>setSelectedIndex(index),focused:!inputMode,height:items.length,showDescription:!1,selectedBackgroundColor:palette.violet,selectedTextColor:"#ffffff"},void 0,!1,void 0,this),inputMode?import_jsx_dev_runtime2.jsxDEV("box",{paddingX:1,height:3,flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[items[selectedIndex]?.label??"Input",":"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("input",{onChange:handleInputChange,onSubmit:handleInputSubmit,placeholder:"Type and press Enter...",focused:!0,width:28,backgroundColor:palette.bg,textColor:palette.text,placeholderColor:palette.textMuted},void 0,!1,void 0,this)]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}var import_react16;var init_ContextMenu=__esm(async()=>{init_theme2();init_jsx_dev_runtime();await init_react();import_react16=__toESM(require_react_development(),1)});function buildRows(sessions2){let rows=[];for(let session of sessions2){if(session.name===TUI_SESSION2)continue;rows.push({kind:"session",sessionName:session.name,label:`${session.name} (new window)`});for(let win of session.windows){let windowLabel=win.name?` ${win.name}`:"";rows.push({kind:"window",sessionName:session.name,windowIndex:win.index,label:` ${session.name}:${win.index}${windowLabel}`})}}return rows}function pickFromRow(row){if(row.kind==="session")return{kind:"session",sessionName:row.sessionName};return{kind:"window",sessionName:row.sessionName,windowIndex:row.windowIndex}}function picksEqual(a,b3){if(a.kind==="session"&&b3.kind==="session")return a.sessionName===b3.sessionName;if(a.kind==="window"&&b3.kind==="window")return a.sessionName===b3.sessionName&&a.windowIndex===b3.windowIndex;return!1}function pickExists(pick,sessions2){let session=sessions2.find((s2)=>s2.name===pick.sessionName);if(!session)return!1;if(pick.kind==="session")return!0;return session.windows.some((w2)=>w2.index===pick.windowIndex)}function pickToIntent(agentName,pick){if(!pick)return{kind:"spawn-agent",name:agentName};if(pick.kind==="session")return{kind:"spawn-agent",name:agentName,session:pick.sessionName,newWindow:!0};return{kind:"spawn-agent",name:agentName,window:`${pick.sessionName}:${pick.windowIndex}`}}function pickLabel(pick){if(pick.kind==="session")return pick.sessionName;return`${pick.sessionName}:${pick.windowIndex}`}function SpawnTargetPicker({agentName,sessions:sessions2,onConfirm,onCancel}){let rows=import_react18.useMemo(()=>buildRows(sessions2),[sessions2]),[pick,setPick]=import_react18.useState(()=>rows[0]?pickFromRow(rows[0]):null),[staleError,setStaleError]=import_react18.useState(null);if(pick===null&&rows[0])setPick(pickFromRow(rows[0]));let selectedIndex=import_react18.useMemo(()=>{if(!pick)return-1;return rows.findIndex((r)=>picksEqual(pick,r))},[pick,rows]),movePick=import_react18.useCallback((delta)=>{if(rows.length===0)return;let next=((selectedIndex<0?0:selectedIndex)+delta+rows.length)%rows.length;setPick(pickFromRow(rows[next])),setStaleError(null)},[rows,selectedIndex]),handleEnter=import_react18.useCallback(()=>{if(!pick)return;if(!pickExists(pick,sessions2)){setStaleError(`Target "${pickLabel(pick)}" no longer exists \u2014 pick another.`);return}onConfirm(pickToIntent(agentName,pick))},[pick,sessions2,agentName,onConfirm]);useKeyboard(import_react18.useCallback((key)=>{let n=key.name;if(n==="escape"){onCancel();return}if(n==="enter"||n==="return"){handleEnter();return}if(n==="up"||n==="k")movePick(-1);else if(n==="down"||n==="j")movePick(1)},[onCancel,handleEnter,movePick]));let intent=import_react18.useMemo(()=>pickToIntent(agentName,pick),[agentName,pick]);return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:"#0a0a0a",children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.violet,backgroundColor:palette.bgLight,paddingX:2,paddingY:1,flexDirection:"column",width:60,gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:`Spawn "${agentName}" into\u2026`},void 0,!1,void 0,this)},void 0,!1,void 0,this),rows.length===0?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"No tmux sessions available. Press Esc to cancel."},void 0,!1,void 0,this)},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:rows.map((row,i2)=>import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:i2===selectedIndex?palette.cyan:palette.text,children:[i2===selectedIndex?"> ":" ",row.label]},void 0,!0,void 0,this)},`${row.kind}:${row.sessionName}:${row.kind==="window"?row.windowIndex:""}`,!1,void 0,this))},void 0,!1,void 0,this),staleError?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${staleError}`},void 0,!1,void 0,this)},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var import_react18,TUI_SESSION2="genie-tui";var init_SpawnTargetPicker=__esm(async()=>{init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react();import_react18=__toESM(require_react_development(),1)});var require_package=__commonJS((exports,module2)=>{module2.exports={name:"systeminformation",version:"5.31.5",description:"Advanced, lightweight system and OS information library",license:"MIT",author:"Sebastian Hildebrandt <hildebrandt@plus-innovations.com> (https://plus-innovations.com)",homepage:"https://systeminformation.io",main:"./lib/index.js",type:"commonjs",bin:{systeminformation:"lib/cli.js"},types:"./lib/index.d.ts",scripts:{test:"node ./test/test.js",testDeno:"deno run -A ./test/test.js"},files:["lib/"],keywords:["system information","sysinfo","monitor","monitoring","os","linux","osx","windows","freebsd","openbsd","netbsd","cpu","cpuload","physical cores","logical cores","processor","cores","threads","socket type","memory","file system","fsstats","diskio","block devices","netstats","network","network interfaces","network connections","network stats","iface","printer","processes","users","internet","battery","docker","docker stats","docker processes","graphics","graphic card","graphic controller","gpu","display","smart","disk layout","usb","audio","bluetooth","wifi","wifinetworks","virtual box","virtualbox","vm","backend","hardware","BIOS","chassis"],repository:{type:"git",url:"git+https://github.com/sebhildebrandt/systeminformation.git"},funding:{type:"Buy me a coffee",url:"https://www.buymeacoffee.com/systeminfo"},os:["darwin","linux","win32","freebsd","openbsd","netbsd","sunos","android"],engines:{node:">=8.0.0"}}});var require_util3=__commonJS((exports)=>{var os4=__require("os"),fs3=__require("fs"),path6=__require("path"),spawn5=__require("child_process").spawn,exec3=__require("child_process").exec,execSync19=__require("child_process").execSync,util4=__require("util"),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_cores=0,codepage="",_smartMonToolsInstalled=null,_rpi_cpuinfo=null,WINDIR=process.env.WINDIR||"C:\\Windows",_psChild,_psResult="",_psCmds=[],_psPersistent=!1,_powerShell="",_psToUTF8="$OutputEncoding = [System.Console]::OutputEncoding = [System.Console]::InputEncoding = [System.Text.Encoding]::UTF8 ; ",_psCmdStart="--###START###--",_psError="--ERROR--",_psCmdSeperator="--###ENDCMD###--",_psIdSeperator="--##ID##--",execOptsWin={windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})},execOptsLinux={maxBuffer:104857600,encoding:"UTF-8",stdio:["pipe","pipe","ignore"]};function toInt(value){let result2=parseInt(value,10);if(isNaN(result2))result2=0;return result2}function splitByNumber(str5){let numberStarted=!1,num="",cpart="";for(let c of str5)if(c>="0"&&c<="9"||numberStarted)numberStarted=!0,num+=c;else cpart+=c;return[cpart,num]}var stringObj=new String,stringReplace=new String().replace,stringToLower=new String().toLowerCase,stringToString=new String().toString,stringSubstr=new String().substr,stringSubstring=new String().substring,stringTrim=new String().trim,stringStartWith=new String().startsWith,mathMin=Math.min;function isFunction(functionToCheck){return functionToCheck&&{}.toString.call(functionToCheck)==="[object Function]"}function unique(obj){let uniques=[],stringify2={};for(let i2=0;i2<obj.length;i2++){let keys=Object.keys(obj[i2]);keys.sort((a,b3)=>{return a-b3});let str5="";for(let j2=0;j2<keys.length;j2++)str5+=JSON.stringify(keys[j2]),str5+=JSON.stringify(obj[i2][keys[j2]]);if(!{}.hasOwnProperty.call(stringify2,str5))uniques.push(obj[i2]),stringify2[str5]=!0}return uniques}function sortByKey(array,keys){return array.sort((a,b3)=>{let x2="",y2="";return keys.forEach((key)=>{x2=x2+a[key],y2=y2+b3[key]}),x2<y2?-1:x2>y2?1:0})}function cores(){if(_cores===0)_cores=os4.cpus().length;return _cores}function getValue(lines,property,separator,trimmed,lineMatch){separator=separator||":",property=property.toLowerCase(),trimmed=trimmed||!1,lineMatch=lineMatch||!1;let result2="";return lines.some((line)=>{let lineLower=line.toLowerCase().replace(/\t/g,"");if(trimmed)lineLower=lineLower.trim();if(lineLower.startsWith(property)&&(lineMatch?lineLower.match(property+separator)||lineLower.match(property+" "+separator):!0)){let parts=trimmed?line.trim().split(separator):line.split(separator);if(parts.length>=2)return parts.shift(),result2=parts.join(separator).trim(),!0}return!1}),result2}function decodeEscapeSequence(str5,base){return base=base||16,str5.replace(/\\x([0-9A-Fa-f]{2})/g,function(){return String.fromCharCode(parseInt(arguments[1],base))})}function detectSplit(str5){let seperator="",part=0;return str5.split("").forEach((element)=>{if(element>="0"&&element<="9"){if(part===1)part++}else{if(part===0)part++;if(part===1)seperator+=element}}),seperator}function parseTime(t2,pmDesignator){pmDesignator=pmDesignator||"",t2=t2.toUpperCase();let hour=0,min=0,splitter=detectSplit(t2),parts=t2.split(splitter);if(parts.length>=2){if(parts[2])parts[1]+=parts[2];let isPM=parts[1]&&parts[1].toLowerCase().indexOf("pm")>-1||parts[1].toLowerCase().indexOf("p.m.")>-1||parts[1].toLowerCase().indexOf("p. m.")>-1||parts[1].toLowerCase().indexOf("n")>-1||parts[1].toLowerCase().indexOf("ch")>-1||parts[1].toLowerCase().indexOf("\xF6s")>-1||pmDesignator&&parts[1].toLowerCase().indexOf(pmDesignator)>-1;return hour=parseInt(parts[0],10),min=parseInt(parts[1],10),hour=isPM&&hour<12?hour+12:hour,("0"+hour).substr(-2)+":"+("0"+min).substr(-2)}}function parseDateTime(dt,culture){let result2={date:"",time:""};culture=culture||{};let dateFormat=(culture.dateFormat||"").toLowerCase(),pmDesignator=culture.pmDesignator||"",parts=dt.split(" ");if(parts[0]){if(parts[0].indexOf("/")>=0){let dtparts=parts[0].split("/");if(dtparts.length===3)if(dtparts[0].length===4)result2.date=dtparts[0]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[2]).substr(-2);else if(dtparts[2].length===2)if(dateFormat.indexOf("/d/")>-1||dateFormat.indexOf("/dd/")>-1)result2.date="20"+dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2);else result2.date="20"+dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2);else if((dt.toLowerCase().indexOf("pm")>-1||dt.toLowerCase().indexOf("p.m.")>-1||dt.toLowerCase().indexOf("p. m.")>-1||dt.toLowerCase().indexOf("am")>-1||dt.toLowerCase().indexOf("a.m.")>-1||dt.toLowerCase().indexOf("a. m.")>-1||dateFormat.indexOf("/d/")>-1||dateFormat.indexOf("/dd/")>-1)&&dateFormat.indexOf("dd/")!==0)result2.date=dtparts[2]+"-"+("0"+dtparts[0]).substr(-2)+"-"+("0"+dtparts[1]).substr(-2);else result2.date=dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2)}if(parts[0].indexOf(".")>=0){let dtparts=parts[0].split(".");if(dtparts.length===3)if(dateFormat.indexOf(".d.")>-1||dateFormat.indexOf(".dd.")>-1)result2.date=dtparts[2]+"-"+("0"+dtparts[0]).substr(-2)+"-"+("0"+dtparts[1]).substr(-2);else result2.date=dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2)}if(parts[0].indexOf("-")>=0){let dtparts=parts[0].split("-");if(dtparts.length===3)result2.date=dtparts[0]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[2]).substr(-2)}}if(parts[1]){parts.shift();let time=parts.join(" ");result2.time=parseTime(time,pmDesignator)}return result2}function parseHead(head,rights){let space=rights>0,count=1,from=0,to=0,result2=[];for(let i2=0;i2<head.length;i2++)if(count<=rights){if(/\s/.test(head[i2])&&!space)to=i2-1,result2.push({from,to:to+1,cap:head.substring(from,to+1)}),from=to+2,count++;space=head[i2]===" "}else{if(!/\s/.test(head[i2])&&space){if(to=i2-1,from<to)result2.push({from,to,cap:head.substring(from,to)});from=to+1,count++}space=head[i2]===" "}to=5000,result2.push({from,to,cap:head.substring(from,to)});let len=result2.length;for(let i2=0;i2<len;i2++)if(result2[i2].cap.replace(/\s/g,"").length===0){if(i2+1<len)result2[i2].to=result2[i2+1].to,result2[i2].cap=result2[i2].cap+result2[i2+1].cap,result2.splice(i2+1,1),len=len-1}return result2}function findObjectByKey(array,key,value){for(let i2=0;i2<array.length;i2++)if(array[i2][key]===value)return i2;return-1}function getPowershell(){if(_powerShell="powershell.exe",_windows){let defaultPath=`${WINDIR}\\system32\\WindowsPowerShell\\v1.0\\powershell.exe`;if(fs3.existsSync(defaultPath))_powerShell=defaultPath}}function getVboxmanage(){return _windows?`"${process.env.VBOX_INSTALL_PATH||process.env.VBOX_MSI_INSTALL_PATH}\\VBoxManage.exe"`:"vboxmanage"}function powerShellProceedResults(data){let id="",parts,res="";if(data.indexOf(_psCmdStart)>=0){parts=data.split(_psCmdStart);let parts2=parts[1].split(_psIdSeperator);if(id=parts2[0],parts2.length>1)data=parts2.slice(1).join(_psIdSeperator)}if(data.indexOf(_psCmdSeperator)>=0)parts=data.split(_psCmdSeperator),res=parts[0];let remove=-1;for(let i2=0;i2<_psCmds.length;i2++)if(_psCmds[i2].id===id)remove=i2,_psCmds[i2].callback(res);if(remove>=0)_psCmds.splice(remove,1)}function powerShellStart(){if(!_psChild){if(_psChild=spawn5(_powerShell,["-NoProfile","-NoLogo","-InputFormat","Text","-NoExit","-Command","-"],{stdio:"pipe",windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})}),_psChild&&_psChild.pid)_psPersistent=!0,_psChild.stdout.on("data",(data)=>{if(_psResult=_psResult+data.toString("utf8"),data.indexOf(_psCmdSeperator)>=0)powerShellProceedResults(_psResult),_psResult=""}),_psChild.stderr.on("data",()=>{powerShellProceedResults(_psResult+_psError)}),_psChild.on("error",()=>{powerShellProceedResults(_psResult+_psError)}),_psChild.on("close",()=>{if(_psChild)_psChild.kill()})}}function powerShellRelease(){try{if(_psChild)_psChild.stdin.write("exit"+os4.EOL),_psChild.stdin.end()}catch{if(_psChild)_psChild.kill()}_psPersistent=!1,_psChild=null}function powerShell(cmd){if(_psPersistent){let id=Math.random().toString(36).substring(2,12);return new Promise((resolve14)=>{process.nextTick(()=>{function callback(data){resolve14(data)}_psCmds.push({id,cmd,callback,start:new Date});try{if(_psChild&&_psChild.pid)_psChild.stdin.write(_psToUTF8+"echo "+_psCmdStart+id+_psIdSeperator+"; "+os4.EOL+cmd+os4.EOL+"echo "+_psCmdSeperator+os4.EOL)}catch{resolve14("")}})})}else{let result2="";return new Promise((resolve14)=>{process.nextTick(()=>{try{let osVersion=os4.release().split(".").map(Number),spanOptions=osVersion[0]<10?["-NoProfile","-NoLogo","-InputFormat","Text","-NoExit","-ExecutionPolicy","Unrestricted","-Command","-"]:["-NoProfile","-NoLogo","-InputFormat","Text","-ExecutionPolicy","Unrestricted","-Command",_psToUTF8+cmd],child=spawn5(_powerShell,spanOptions,{stdio:"pipe",windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})});if(child&&!child.pid)child.on("error",()=>{resolve14(result2)});if(child&&child.pid){if(child.stdout.on("data",(data)=>{result2=result2+data.toString("utf8")}),child.stderr.on("data",()=>{child.kill(),resolve14(result2)}),child.on("close",()=>{child.kill(),resolve14(result2)}),child.on("error",()=>{child.kill(),resolve14(result2)}),osVersion[0]<10)try{child.stdin.write(_psToUTF8+cmd+os4.EOL),child.stdin.write("exit"+os4.EOL),child.stdin.end()}catch{child.kill(),resolve14(result2)}}else resolve14(result2)}catch{resolve14(result2)}})})}}function execSafe(cmd,args,options){let result2="";return options=options||{},new Promise((resolve14)=>{process.nextTick(()=>{try{let child=spawn5(cmd,args,options);if(child&&!child.pid)child.on("error",()=>{resolve14(result2)});if(child&&child.pid)child.stdout.on("data",(data)=>{result2+=data.toString()}),child.on("close",()=>{child.kill(),resolve14(result2)}),child.on("error",()=>{child.kill(),resolve14(result2)});else resolve14(result2)}catch{resolve14(result2)}})})}function getCodepage(){if(_windows){if(!codepage)try{let parts=execSync19("chcp",execOptsWin).toString().split(`\r
|
|
3137
|
-
`)[0].split(":");codepage=parts.length>1?parts[1].replace(".","").trim():""}catch{codepage="437"}return codepage}if(_linux||_darwin||_freebsd||_openbsd||_netbsd){if(!codepage)try{let parts=
|
|
3138
|
-
`)[0].split(".");if(codepage=parts.length>1?parts[1].trim():"",!codepage)codepage="UTF-8"}catch{codepage="UTF-8"}return codepage}}function smartMonToolsInstalled(){if(_smartMonToolsInstalled!==null)return _smartMonToolsInstalled;if(_smartMonToolsInstalled=!1,_windows)try{let pathArray=
|
|
3139
|
-
`);if(pathArray&&pathArray.length)_smartMonToolsInstalled=pathArray[0].indexOf(":\\")>=0;else _smartMonToolsInstalled=!1}catch{_smartMonToolsInstalled=!1}if(_linux||_darwin||_freebsd||_openbsd||_netbsd)try{_smartMonToolsInstalled=
|
|
3144
|
+
`).map(mapAssignment)}function mapExecutor(row){let meta=row.metadata;return{id:String(row.id),agentId:String(row.agent_id),agentName:row.agent_name?String(row.agent_name):null,provider:String(row.provider),transport:String(row.transport),pid:row.pid!=null?Number(row.pid):null,tmuxSession:row.tmux_session?String(row.tmux_session):null,tmuxPaneId:row.tmux_pane_id?String(row.tmux_pane_id):null,state:String(row.state),metadata:typeof meta==="string"?JSON.parse(meta):meta??{},startedAt:row.started_at instanceof Date?row.started_at.toISOString():String(row.started_at),role:row.role?String(row.role):null,team:row.team?String(row.team):null}}function mapAssignment(row){return{id:String(row.id),executorId:String(row.executor_id),taskId:row.task_id?String(row.task_id):null,taskTitle:row.task_title?String(row.task_title):null,wishSlug:row.wish_slug?String(row.wish_slug):null,groupNumber:row.group_number!=null?Number(row.group_number):null,startedAt:row.started_at instanceof Date?row.started_at.toISOString():String(row.started_at)}}import{execSync as execSync17}from"child_process";function execQuiet(cmd){try{return execSync17(cmd,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return""}}function parsePaneLine(parts){let[sessionName,winIdxStr,winName,winActive,winPanes,paneIdxStr,paneId,panePidStr,paneCmd,paneTitle,paneSize,sessAttached,sessWindows,sessCreated,paneDead]=parts;return{sessionName,winIdxStr,session:{name:sessionName,attached:sessAttached==="1",windowCount:Number.parseInt(sessWindows,10)||0,created:Number.parseInt(sessCreated,10)||0},window:{sessionName,index:Number.parseInt(winIdxStr,10)||0,name:winName,active:winActive==="1",paneCount:Number.parseInt(winPanes,10)||0},pane:{sessionName,windowIndex:Number.parseInt(winIdxStr,10)||0,paneIndex:Number.parseInt(paneIdxStr,10)||0,paneId,pid:Number.parseInt(panePidStr,10)||0,command:paneCmd,title:paneTitle,size:paneSize,isDead:paneDead==="1"}}}function getTmuxInventory(){let paneOutput=execQuiet(`${tmuxBin()} -L genie list-panes -a -F '#{session_name}|#{window_index}|#{window_name}|#{window_active}|#{window_panes}|#{pane_index}|#{pane_id}|#{pane_pid}|#{pane_current_command}|#{pane_title}|#{pane_width}x#{pane_height}|#{session_attached}|#{session_windows}|#{session_created}|#{pane_dead}'`);if(!paneOutput)return[];let sessionMap=new Map,windowMap=new Map;for(let line of paneOutput.split(`
|
|
3145
|
+
`)){if(!line)continue;let parts=line.split("|");if(parts.length<15)continue;let parsed=parsePaneLine(parts);if(!sessionMap.has(parsed.sessionName))sessionMap.set(parsed.sessionName,{...parsed.session,windows:[]});let winKey=`${parsed.sessionName}:${parsed.winIdxStr}`;if(!windowMap.has(winKey)){let win={...parsed.window,panes:[]};windowMap.set(winKey,win),sessionMap.get(parsed.sessionName)?.windows.push(win)}windowMap.get(winKey)?.panes.push(parsed.pane)}return Array.from(sessionMap.values()).sort((a,b3)=>a.name.localeCompare(b3.name))}function isPidAlive3(pid){try{return process.kill(pid,0),!0}catch{return!1}}function allClaudePanes(sessions2){return sessions2.flatMap((s2)=>s2.windows.flatMap((w2)=>w2.panes)).filter((p)=>p.command==="claude"||p.title.includes("claude"))}function detectGaps(executors,sessions2){let deadPidExecutors=executors.filter((e)=>e.pid!=null&&!isPidAlive3(e.pid)),executorPaneIds=new Set(executors.map((e)=>e.tmuxPaneId).filter(Boolean)),claudePanes=allClaudePanes(sessions2),orphanPanes=claudePanes.filter((p)=>!executorPaneIds.has(p.paneId)),linkedCount=executors.filter((e)=>e.tmuxPaneId&&!deadPidExecutors.some((d2)=>d2.id===e.id)).length,deadPaneCount=sessions2.flatMap((s2)=>s2.windows.flatMap((w2)=>w2.panes)).filter((p)=>p.isDead).length;return{deadPidExecutors,orphanPanes,linkedCount,totalExecutors:executors.length,totalClaudePanes:claudePanes.length,deadPaneCount}}async function collectDiagnostics(){let{loadExecutors:loadExecutors2,loadAssignments:loadAssignments2}=await Promise.resolve().then(() => exports_db2),sessions2=getTmuxInventory(),executors=await loadExecutors2(),executorIds=executors.map((e)=>e.id),assignments=await loadAssignments2(executorIds),gaps=detectGaps(executors,sessions2);if(gaps.deadPidExecutors.length>0){let{terminateExecutor:terminateExecutor2}=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2();await Promise.allSettled(gaps.deadPidExecutors.map(async(exec3)=>{if(await terminateExecutor2(exec3.id),exec3.agentId)await sql`UPDATE agents SET current_executor_id = NULL WHERE current_executor_id = ${exec3.id}`}))}return{sessions:sessions2,executors,assignments,gaps,timestamp:Date.now()}}var init_diagnostics=__esm(()=>{init_ensure_tmux()});import{existsSync as existsSync56,readFileSync as readFileSync35,unlinkSync as unlinkSync12}from"fs";import{homedir as homedir36}from"os";import{join as join68}from"path";function getInitialAgentFilePath(){let genieHome6=process.env.GENIE_HOME??join68(homedir36(),".genie");return join68(genieHome6,"tui-initial-agent")}function consumeInitialAgentSignal(){let filePath=getInitialAgentFilePath();if(!existsSync56(filePath))return;try{let agent=readFileSync35(filePath,"utf-8").trim();return unlinkSync12(filePath),agent||void 0}catch{return}}var init_initial_agent=()=>{};function toSessionName(agentName){return agentName.replace(/\//g,"-")}function buildSessionTree(snapshot){let executorByPaneId=new Map;for(let exec3 of snapshot.executors)if(exec3.tmuxPaneId)executorByPaneId.set(exec3.tmuxPaneId,exec3);return snapshot.sessions.filter((s2)=>s2.name!=="genie-tui").map((session)=>sessionToNode(session,executorByPaneId))}function buildWorkspaceTree(input){let{agentNames,sessions:sessions2,executors}=input,sessionByName=new Map;for(let s2 of sessions2)if(s2.name!=="genie-tui")sessionByName.set(s2.name,s2);let executorByPaneId=new Map;for(let exec3 of executors)if(exec3.tmuxPaneId)executorByPaneId.set(exec3.tmuxPaneId,exec3);let executorsByAgent=new Map;for(let exec3 of executors){let name=exec3.agentName??exec3.metadata?.agentName;if(typeof name==="string"){let list2=executorsByAgent.get(name)??[];list2.push(exec3),executorsByAgent.set(name,list2)}}let{topLevel,subsByParent}=groupAgentNames(agentNames),nodes=topLevel.map((name)=>{let node=buildAgentNode(name,sessionByName.get(toSessionName(name)),executorsByAgent.get(name)??[],executorByPaneId);return appendSubAgentNodes(node,subsByParent.get(name),sessionByName,executorsByAgent,executorByPaneId),node}),claimedSessions=new Set(agentNames.map(toSessionName));for(let[name,session]of sessionByName)if(!claimedSessions.has(name))nodes.push(sessionToNode(session,executorByPaneId));return nodes}function resolvePreferredWindowIndex(session,agentName){let windows=[...session.windows].sort((a,b3)=>a.index-b3.index),hasClaudePane=(window2)=>window2.panes.some((pane)=>!pane.isDead&&(pane.command==="claude"||pane.title.includes("claude")));return(windows.find((window2)=>window2.active&&hasClaudePane(window2))??(agentName?windows.find((window2)=>window2.name===agentName):void 0)??windows.find((window2)=>hasClaudePane(window2))??windows.find((window2)=>window2.active&&window2.index!==0)??windows.find((window2)=>window2.index!==0))?.index}function hasLiveClaudeWindow(session){return session.windows.some((window2)=>window2.panes.some((pane)=>!pane.isDead&&(pane.command==="claude"||pane.title.includes("claude"))))}function groupAgentNames(names){let topLevel=[],subsByParent=new Map;for(let name of names){let slashIdx=name.indexOf("/");if(slashIdx===-1)topLevel.push(name);else{let parent=name.slice(0,slashIdx),subs=subsByParent.get(parent)??[];subs.push(name),subsByParent.set(parent,subs)}}return{topLevel,subsByParent}}function appendSubAgentNodes(parent,subs,sessionByName,executorsByAgent,executorByPaneId){if(!subs)return;for(let subName of subs){let subLabel=subName.slice(subName.indexOf("/")+1),subNode=buildAgentNode(subName,sessionByName.get(toSessionName(subName)),executorsByAgent.get(subName)??[],executorByPaneId);subNode.label=subLabel,subNode.depth=1,parent.children.push(subNode)}}function countClaudePanes(session){return session.windows.reduce((sum,w2)=>sum+w2.panes.filter((p)=>p.command==="claude"||p.title.includes("claude")).length,0)}function buildAgentNode(name,session,agentExecutors,executorByPaneId){let wsState=deriveWsAgentState(session,agentExecutors),attachWindowIndex=session?resolvePreferredWindowIndex(session,name):void 0,children=[];if(session)for(let win of session.windows){if(win.index===0)continue;children.push(windowToNode(session.name,win,executorByPaneId))}return{id:`agent:${name}`,type:"agent",label:name,depth:0,expanded:children.length>0,children,data:{sessionName:toSessionName(name),windowCount:session?session.windows.length:0,attachWindowIndex,provider:agentExecutors[0]?.provider??null},activePanes:session?countClaudePanes(session):0,agentState:agentExecutors.length>0?deriveExecutorState(agentExecutors):void 0,wsAgentState:wsState}}function deriveWsAgentState(session,agentExecutors){if(!session)return"stopped";if(hasLiveClaudeWindow(session))return"running";for(let exec3 of agentExecutors){if(exec3.state==="error"||exec3.state==="terminated")return"error";if(exec3.state==="spawning")return"spawning"}if(agentExecutors.length===0)return"stopped";return"running"}function deriveExecutorState(execs){for(let e of execs)if(e.state==="working")return"working";for(let e of execs)if(e.state==="permission")return"permission";for(let e of execs)if(e.state==="error"||e.state==="terminated")return"error";return"idle"}function sessionToNode(session,executorMap){let claudePanes=session.windows.reduce((sum,w2)=>sum+w2.panes.filter((p)=>p.command==="claude"||p.title.includes("claude")).length,0);return{id:`session:${session.name}`,type:"session",label:session.name,depth:0,expanded:!0,children:session.windows.map((w2)=>windowToNode(session.name,w2,executorMap)),data:{attached:session.attached,windowCount:session.windowCount},activePanes:claudePanes,agentState:void 0,wsAgentState:void 0}}function windowToNode(sessionName,window2,executorMap){let activePanes=window2.panes.filter((p)=>!p.isDead&&(p.command==="claude"||p.title.includes("claude"))).length;return{id:`window:${sessionName}:${window2.index}`,type:"window",label:window2.name,depth:1,expanded:!0,children:window2.panes.map((p)=>paneToNode(sessionName,window2.index,p,executorMap)),data:{active:window2.active,paneCount:window2.paneCount},activePanes,agentState:void 0,wsAgentState:void 0}}function paneToNode(sessionName,windowIndex,pane,executorMap){let executor=executorMap.get(pane.paneId),isClaude=pane.command==="claude"||pane.title.includes("claude");return{id:`pane:${pane.paneId}`,type:"pane",label:derivePaneLabel(pane,executor,isClaude),depth:2,expanded:!1,children:[],data:{command:pane.command,isDead:pane.isDead,pid:pane.pid,size:pane.size,paneId:pane.paneId,sessionName,windowIndex},activePanes:0,agentState:derivePaneState(pane,executor),wsAgentState:void 0}}function derivePaneLabel(pane,executor,isClaude){if(executor?.agentName&&executor?.team)return`${executor.team}/${executor.agentName}`;if(executor?.agentName)return executor.agentName;if(pane.title&&pane.title!==pane.command&&!isDefaultPaneTitle(pane.title))return pane.title;if(isClaude)return"claude";return pane.command}function isDefaultPaneTitle(title){let hostname2=__require("os").hostname();return title===hostname2||title.startsWith(`${hostname2}.`)||title.startsWith("\u2733")}function derivePaneState(pane,executor){if(pane.isDead)return"error";if(!executor)return;let s2=executor.state;if(s2==="working")return"working";if(s2==="idle"||s2==="spawning")return"idle";if(s2==="permission")return"permission";if(s2==="error"||s2==="terminated")return"error";return}function getSessionTarget(node){if(node.type==="agent"){let sessionName=node.data.sessionName,attachWindowIndex=node.data.attachWindowIndex;if(typeof attachWindowIndex==="number")return{sessionName,windowIndex:attachWindowIndex};let firstWindowChild=node.children.find((child)=>child.type==="window");if(firstWindowChild){let parts=firstWindowChild.id.split(":");return{sessionName,windowIndex:Number(parts[2])}}return{sessionName}}if(node.type==="session")return{sessionName:node.label};if(node.type==="window"){let parts=node.id.split(":");return{sessionName:parts[1],windowIndex:Number(parts[2])}}if(node.type==="pane"){let data=node.data;return{sessionName:data.sessionName,windowIndex:data.windowIndex}}return null}var palette,icons;var init_theme2=__esm(()=>{palette={purple:"#a855f7",violet:"#7c3aed",cyan:"#22d3ee",emerald:"#34d399",bg:"#1a1028",bgLight:"#241838",bgLighter:"#2e2048",text:"#e2e8f0",textDim:"#94a3b8",textMuted:"#64748b",border:"#414868",borderActive:"#7c3aed",scrollTrack:"#414868",scrollThumb:"#7aa2f7",active:"#22d3ee",success:"#34d399",warning:"#fbbf24",error:"#f87171",idle:"#94a3b8"},icons={org:"\u25C6",project:"\u25B8",projectOpen:"\u25BE",board:"\u2261",boardOpen:"\u2261",column:"\u2502",task:"\u25CB",taskActive:"\u25CF",taskDone:"\u2713",agent:"\u25B6",collapsed:"\u25B8",expanded:"\u25BE"}});function flattenTree(nodes){let result2=[];function walk(node,depth){if(result2.push({node,depth,visible:!0}),node.expanded)for(let child of node.children)walk(child,depth+1)}for(let node of nodes)walk(node,0);return result2}function toggleNode(nodes,id){return nodes.map((node)=>{if(node.id===id)return{...node,expanded:!node.expanded};return{...node,children:toggleNode(node.children,id)}})}var import_jsx_dev_runtime2;var init_jsx_dev_runtime=__esm(()=>{import_jsx_dev_runtime2=__toESM(require_react_jsx_dev_runtime_development(),1)});function CliPreviewLine({intent,hint=DEFAULT_HINT}){let cli=null,errorMessage=null;try{cli=buildSpawnInvocation(intent).cli}catch(err){errorMessage=err instanceof Error?err.message:String(err)}if(errorMessage!==null)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${errorMessage}`},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:hint},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.cyan,children:"\u25B6 "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:cli},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:hint},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}var DEFAULT_HINT="Enter to run \xB7 Esc to cancel";var init_CliPreviewLine=__esm(()=>{init_spawn_invocation();init_theme2();init_jsx_dev_runtime()});async function defaultLoadAgents(){let{spawn:spawn5}=await import("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1],[command,args]=genieBin&&genieBin!=="genie"?[bunPath,[genieBin,"dir","ls","--json"]]:["genie",["dir","ls","--json"]],stdout=await new Promise((resolve14,reject)=>{let child=spawn5(command,args,{stdio:["ignore","pipe","ignore"]}),chunks=[];child.stdout.on("data",(c)=>chunks.push(c)),child.on("error",reject),child.on("close",()=>resolve14(Buffer.concat(chunks).toString("utf-8")))});return JSON.parse(stdout).map((e)=>typeof e?.name==="string"?{name:e.name}:null).filter((e)=>e!==null)}function buildIntent(agentName,target){let intent={kind:"spawn-agent",name:agentName,session:target.session};if(target.window!==void 0&&target.window.length>0)intent.window=target.window;else intent.newWindow=!0;return intent}function applyFilter2(agents,filter){if(filter.length===0)return agents;let needle=filter.toLowerCase();return agents.filter((a)=>a.name.toLowerCase().includes(needle))}function handleControlKey(key,deps){if(key.name==="escape")return deps.onCancel(),!0;if(key.name==="up"&&deps.filteredLength>0)return deps.setSelectedIndex((prev)=>prev<=0?deps.filteredLength-1:prev-1),!0;if(key.name==="down"&&deps.filteredLength>0)return deps.setSelectedIndex((prev)=>prev>=deps.filteredLength-1?0:prev+1),!0;if((key.name==="return"||key.name==="enter")&&deps.highlighted)return deps.onConfirm(buildIntent(deps.highlighted.name,deps.target)),!0;if(key.name==="backspace")return deps.setFilter((prev)=>prev.slice(0,-1)),!0;if(key.name==="up"||key.name==="down"||key.name==="return"||key.name==="enter")return!0;return!1}function appendCharIfPrintable(key,setFilter){let ch=key.sequence??key.name;if(typeof ch==="string"&&ch.length===1&&ch>=" "&&ch!=="\x7F")setFilter((prev)=>prev+ch)}function AgentPicker({target,onConfirm,onCancel,loadAgents=defaultLoadAgents}){let[agents,setAgents]=import_react14.useState(null),[loadError,setLoadError]=import_react14.useState(null),[filter,setFilter]=import_react14.useState(""),[selectedIndex,setSelectedIndex]=import_react14.useState(0);import_react14.useEffect(()=>{let active=!0;return loadAgents().then((list2)=>{if(!active)return;setAgents(list2)}).catch((err)=>{if(!active)return;setLoadError(err instanceof Error?err.message:String(err)),setAgents([])}),()=>{active=!1}},[loadAgents]);let filtered=import_react14.useMemo(()=>agents?applyFilter2(agents,filter):[],[agents,filter]);import_react14.useEffect(()=>{if(filtered.length===0){if(selectedIndex!==0)setSelectedIndex(0);return}if(selectedIndex>=filtered.length)setSelectedIndex(filtered.length-1)},[filtered.length,selectedIndex]);let highlighted=filtered[selectedIndex],previewIntent=highlighted?buildIntent(highlighted.name,target):null,handleKey=import_react14.useCallback((key)=>{if(handleControlKey(key,{onCancel,onConfirm,target,highlighted,filteredLength:filtered.length,setSelectedIndex,setFilter}))return;if(key.ctrl||key.meta)return;appendCharIfPrintable(key,setFilter)},[filtered.length,highlighted,onCancel,onConfirm,target]);useKeyboard(handleKey);let targetLabel=target.window?target.window:target.session,modeHint=target.window?"in window":"new window in session",statusText=agents===null?"Loading agents\u2026":loadError!==null?`Load failed: ${loadError}`:null;return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:"#0a0a0a",children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.violet,backgroundColor:palette.bgLight,width:80,flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"Spawn here"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` \u2014 ${modeHint} `},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:targetLabel},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Filter: "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:filter.length>0?filter:" "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:filter.length>0?"":"(type to narrow)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),statusText!==null?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:loadError!==null?palette.error:palette.textDim,children:statusText},void 0,!1,void 0,this)},void 0,!1,void 0,this):filtered.length===0?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"No agents registered"},void 0,!1,void 0,this)},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:filtered.map((agent,i2)=>import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:i2===selectedIndex?palette.violet:palette.textDim,children:i2===selectedIndex?"\u25B8 ":" "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:i2===selectedIndex?palette.text:palette.textDim,children:agent.name},void 0,!1,void 0,this)]},agent.name,!0,void 0,this))},void 0,!1,void 0,this),previewIntent!==null?import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent:previewIntent},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var import_react14;var init_AgentPicker=__esm(async()=>{init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react();import_react14=__toESM(require_react_development(),1)});function ContextMenu({items,onAction,onClose,positionY=0}){let[selectedIndex,setSelectedIndex]=import_react16.useState(0),[inputMode,setInputMode]=import_react16.useState(!1),inputRef=import_react16.useRef(""),selectOptions=items.map((item)=>({name:`${item.label}${item.shortcut?` ${item.shortcut}`:""}`,description:"",value:item.action}));useKeyboard(import_react16.useCallback((key)=>{if(inputMode)return;if(key.name==="escape"){onClose();return}for(let item of items)if(item.shortcut&&key.name===item.shortcut.toLowerCase()){if(item.needsInput)setInputMode(!0),inputRef.current="",setSelectedIndex(items.indexOf(item));else onAction(item.action);return}},[inputMode,items,onAction,onClose]));let handleSelect=import_react16.useCallback((_index,option)=>{let value=option?.value;if(!value)return;if(items.find((i2)=>i2.action===value)?.needsInput){setInputMode(!0),inputRef.current="";return}onAction(value)},[items,onAction]),handleInputChange=import_react16.useCallback((v2)=>{inputRef.current=v2},[]),handleInputSubmit=import_react16.useCallback(()=>{let item=items[selectedIndex],value=inputRef.current.trim();if(item&&value)onAction(item.action,value);setInputMode(!1),inputRef.current=""},[items,selectedIndex,onAction]);if(items.length===0)return onClose(),null;return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",onMouseDown:()=>onClose(),children:[positionY>0?import_jsx_dev_runtime2.jsxDEV("box",{height:positionY},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.violet,backgroundColor:palette.bgLight,width:32,height:inputMode?items.length+5:items.length+2,flexDirection:"column",onMouseDown:(e)=>e.stopPropagation?.(),children:[import_jsx_dev_runtime2.jsxDEV("select",{options:selectOptions,selectedIndex,onSelect:handleSelect,onChange:(index)=>setSelectedIndex(index),focused:!inputMode,height:items.length,showDescription:!1,selectedBackgroundColor:palette.violet,selectedTextColor:"#ffffff"},void 0,!1,void 0,this),inputMode?import_jsx_dev_runtime2.jsxDEV("box",{paddingX:1,height:3,flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[items[selectedIndex]?.label??"Input",":"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("input",{onChange:handleInputChange,onSubmit:handleInputSubmit,placeholder:"Type and press Enter...",focused:!0,width:28,backgroundColor:palette.bg,textColor:palette.text,placeholderColor:palette.textMuted},void 0,!1,void 0,this)]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}var import_react16;var init_ContextMenu=__esm(async()=>{init_theme2();init_jsx_dev_runtime();await init_react();import_react16=__toESM(require_react_development(),1)});function buildRows(sessions2){let rows=[];for(let session of sessions2){if(session.name===TUI_SESSION2)continue;rows.push({kind:"session",sessionName:session.name,label:`${session.name} (new window)`});for(let win of session.windows){let windowLabel=win.name?` ${win.name}`:"";rows.push({kind:"window",sessionName:session.name,windowIndex:win.index,label:` ${session.name}:${win.index}${windowLabel}`})}}return rows}function pickFromRow(row){if(row.kind==="session")return{kind:"session",sessionName:row.sessionName};return{kind:"window",sessionName:row.sessionName,windowIndex:row.windowIndex}}function picksEqual(a,b3){if(a.kind==="session"&&b3.kind==="session")return a.sessionName===b3.sessionName;if(a.kind==="window"&&b3.kind==="window")return a.sessionName===b3.sessionName&&a.windowIndex===b3.windowIndex;return!1}function pickExists(pick,sessions2){let session=sessions2.find((s2)=>s2.name===pick.sessionName);if(!session)return!1;if(pick.kind==="session")return!0;return session.windows.some((w2)=>w2.index===pick.windowIndex)}function pickToIntent(agentName,pick){if(!pick)return{kind:"spawn-agent",name:agentName};if(pick.kind==="session")return{kind:"spawn-agent",name:agentName,session:pick.sessionName,newWindow:!0};return{kind:"spawn-agent",name:agentName,window:`${pick.sessionName}:${pick.windowIndex}`}}function pickLabel(pick){if(pick.kind==="session")return pick.sessionName;return`${pick.sessionName}:${pick.windowIndex}`}function SpawnTargetPicker({agentName,sessions:sessions2,onConfirm,onCancel}){let rows=import_react18.useMemo(()=>buildRows(sessions2),[sessions2]),[pick,setPick]=import_react18.useState(()=>rows[0]?pickFromRow(rows[0]):null),[staleError,setStaleError]=import_react18.useState(null);if(pick===null&&rows[0])setPick(pickFromRow(rows[0]));let selectedIndex=import_react18.useMemo(()=>{if(!pick)return-1;return rows.findIndex((r)=>picksEqual(pick,r))},[pick,rows]),movePick=import_react18.useCallback((delta)=>{if(rows.length===0)return;let next=((selectedIndex<0?0:selectedIndex)+delta+rows.length)%rows.length;setPick(pickFromRow(rows[next])),setStaleError(null)},[rows,selectedIndex]),handleEnter=import_react18.useCallback(()=>{if(!pick)return;if(!pickExists(pick,sessions2)){setStaleError(`Target "${pickLabel(pick)}" no longer exists \u2014 pick another.`);return}onConfirm(pickToIntent(agentName,pick))},[pick,sessions2,agentName,onConfirm]);useKeyboard(import_react18.useCallback((key)=>{let n=key.name;if(n==="escape"){onCancel();return}if(n==="enter"||n==="return"){handleEnter();return}if(n==="up"||n==="k")movePick(-1);else if(n==="down"||n==="j")movePick(1)},[onCancel,handleEnter,movePick]));let intent=import_react18.useMemo(()=>pickToIntent(agentName,pick),[agentName,pick]);return import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:"#0a0a0a",children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderStyle:"rounded",borderColor:palette.violet,backgroundColor:palette.bgLight,paddingX:2,paddingY:1,flexDirection:"column",width:60,gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:`Spawn "${agentName}" into\u2026`},void 0,!1,void 0,this)},void 0,!1,void 0,this),rows.length===0?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"No tmux sessions available. Press Esc to cancel."},void 0,!1,void 0,this)},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:rows.map((row,i2)=>import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:i2===selectedIndex?palette.cyan:palette.text,children:[i2===selectedIndex?"> ":" ",row.label]},void 0,!0,void 0,this)},`${row.kind}:${row.sessionName}:${row.kind==="window"?row.windowIndex:""}`,!1,void 0,this))},void 0,!1,void 0,this),staleError?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${staleError}`},void 0,!1,void 0,this)},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var import_react18,TUI_SESSION2="genie-tui";var init_SpawnTargetPicker=__esm(async()=>{init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react();import_react18=__toESM(require_react_development(),1)});var require_package=__commonJS((exports,module2)=>{module2.exports={name:"systeminformation",version:"5.31.5",description:"Advanced, lightweight system and OS information library",license:"MIT",author:"Sebastian Hildebrandt <hildebrandt@plus-innovations.com> (https://plus-innovations.com)",homepage:"https://systeminformation.io",main:"./lib/index.js",type:"commonjs",bin:{systeminformation:"lib/cli.js"},types:"./lib/index.d.ts",scripts:{test:"node ./test/test.js",testDeno:"deno run -A ./test/test.js"},files:["lib/"],keywords:["system information","sysinfo","monitor","monitoring","os","linux","osx","windows","freebsd","openbsd","netbsd","cpu","cpuload","physical cores","logical cores","processor","cores","threads","socket type","memory","file system","fsstats","diskio","block devices","netstats","network","network interfaces","network connections","network stats","iface","printer","processes","users","internet","battery","docker","docker stats","docker processes","graphics","graphic card","graphic controller","gpu","display","smart","disk layout","usb","audio","bluetooth","wifi","wifinetworks","virtual box","virtualbox","vm","backend","hardware","BIOS","chassis"],repository:{type:"git",url:"git+https://github.com/sebhildebrandt/systeminformation.git"},funding:{type:"Buy me a coffee",url:"https://www.buymeacoffee.com/systeminfo"},os:["darwin","linux","win32","freebsd","openbsd","netbsd","sunos","android"],engines:{node:">=8.0.0"}}});var require_util3=__commonJS((exports)=>{var os4=__require("os"),fs3=__require("fs"),path6=__require("path"),spawn5=__require("child_process").spawn,exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,util4=__require("util"),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_cores=0,codepage="",_smartMonToolsInstalled=null,_rpi_cpuinfo=null,WINDIR=process.env.WINDIR||"C:\\Windows",_psChild,_psResult="",_psCmds=[],_psPersistent=!1,_powerShell="",_psToUTF8="$OutputEncoding = [System.Console]::OutputEncoding = [System.Console]::InputEncoding = [System.Text.Encoding]::UTF8 ; ",_psCmdStart="--###START###--",_psError="--ERROR--",_psCmdSeperator="--###ENDCMD###--",_psIdSeperator="--##ID##--",execOptsWin={windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})},execOptsLinux={maxBuffer:104857600,encoding:"UTF-8",stdio:["pipe","pipe","ignore"]};function toInt(value){let result2=parseInt(value,10);if(isNaN(result2))result2=0;return result2}function splitByNumber(str5){let numberStarted=!1,num="",cpart="";for(let c of str5)if(c>="0"&&c<="9"||numberStarted)numberStarted=!0,num+=c;else cpart+=c;return[cpart,num]}var stringObj=new String,stringReplace=new String().replace,stringToLower=new String().toLowerCase,stringToString=new String().toString,stringSubstr=new String().substr,stringSubstring=new String().substring,stringTrim=new String().trim,stringStartWith=new String().startsWith,mathMin=Math.min;function isFunction(functionToCheck){return functionToCheck&&{}.toString.call(functionToCheck)==="[object Function]"}function unique(obj){let uniques=[],stringify2={};for(let i2=0;i2<obj.length;i2++){let keys=Object.keys(obj[i2]);keys.sort((a,b3)=>{return a-b3});let str5="";for(let j2=0;j2<keys.length;j2++)str5+=JSON.stringify(keys[j2]),str5+=JSON.stringify(obj[i2][keys[j2]]);if(!{}.hasOwnProperty.call(stringify2,str5))uniques.push(obj[i2]),stringify2[str5]=!0}return uniques}function sortByKey(array,keys){return array.sort((a,b3)=>{let x2="",y2="";return keys.forEach((key)=>{x2=x2+a[key],y2=y2+b3[key]}),x2<y2?-1:x2>y2?1:0})}function cores(){if(_cores===0)_cores=os4.cpus().length;return _cores}function getValue(lines,property,separator,trimmed,lineMatch){separator=separator||":",property=property.toLowerCase(),trimmed=trimmed||!1,lineMatch=lineMatch||!1;let result2="";return lines.some((line)=>{let lineLower=line.toLowerCase().replace(/\t/g,"");if(trimmed)lineLower=lineLower.trim();if(lineLower.startsWith(property)&&(lineMatch?lineLower.match(property+separator)||lineLower.match(property+" "+separator):!0)){let parts=trimmed?line.trim().split(separator):line.split(separator);if(parts.length>=2)return parts.shift(),result2=parts.join(separator).trim(),!0}return!1}),result2}function decodeEscapeSequence(str5,base){return base=base||16,str5.replace(/\\x([0-9A-Fa-f]{2})/g,function(){return String.fromCharCode(parseInt(arguments[1],base))})}function detectSplit(str5){let seperator="",part=0;return str5.split("").forEach((element)=>{if(element>="0"&&element<="9"){if(part===1)part++}else{if(part===0)part++;if(part===1)seperator+=element}}),seperator}function parseTime(t2,pmDesignator){pmDesignator=pmDesignator||"",t2=t2.toUpperCase();let hour=0,min=0,splitter=detectSplit(t2),parts=t2.split(splitter);if(parts.length>=2){if(parts[2])parts[1]+=parts[2];let isPM=parts[1]&&parts[1].toLowerCase().indexOf("pm")>-1||parts[1].toLowerCase().indexOf("p.m.")>-1||parts[1].toLowerCase().indexOf("p. m.")>-1||parts[1].toLowerCase().indexOf("n")>-1||parts[1].toLowerCase().indexOf("ch")>-1||parts[1].toLowerCase().indexOf("\xF6s")>-1||pmDesignator&&parts[1].toLowerCase().indexOf(pmDesignator)>-1;return hour=parseInt(parts[0],10),min=parseInt(parts[1],10),hour=isPM&&hour<12?hour+12:hour,("0"+hour).substr(-2)+":"+("0"+min).substr(-2)}}function parseDateTime(dt,culture){let result2={date:"",time:""};culture=culture||{};let dateFormat=(culture.dateFormat||"").toLowerCase(),pmDesignator=culture.pmDesignator||"",parts=dt.split(" ");if(parts[0]){if(parts[0].indexOf("/")>=0){let dtparts=parts[0].split("/");if(dtparts.length===3)if(dtparts[0].length===4)result2.date=dtparts[0]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[2]).substr(-2);else if(dtparts[2].length===2)if(dateFormat.indexOf("/d/")>-1||dateFormat.indexOf("/dd/")>-1)result2.date="20"+dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2);else result2.date="20"+dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2);else if((dt.toLowerCase().indexOf("pm")>-1||dt.toLowerCase().indexOf("p.m.")>-1||dt.toLowerCase().indexOf("p. m.")>-1||dt.toLowerCase().indexOf("am")>-1||dt.toLowerCase().indexOf("a.m.")>-1||dt.toLowerCase().indexOf("a. m.")>-1||dateFormat.indexOf("/d/")>-1||dateFormat.indexOf("/dd/")>-1)&&dateFormat.indexOf("dd/")!==0)result2.date=dtparts[2]+"-"+("0"+dtparts[0]).substr(-2)+"-"+("0"+dtparts[1]).substr(-2);else result2.date=dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2)}if(parts[0].indexOf(".")>=0){let dtparts=parts[0].split(".");if(dtparts.length===3)if(dateFormat.indexOf(".d.")>-1||dateFormat.indexOf(".dd.")>-1)result2.date=dtparts[2]+"-"+("0"+dtparts[0]).substr(-2)+"-"+("0"+dtparts[1]).substr(-2);else result2.date=dtparts[2]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[0]).substr(-2)}if(parts[0].indexOf("-")>=0){let dtparts=parts[0].split("-");if(dtparts.length===3)result2.date=dtparts[0]+"-"+("0"+dtparts[1]).substr(-2)+"-"+("0"+dtparts[2]).substr(-2)}}if(parts[1]){parts.shift();let time=parts.join(" ");result2.time=parseTime(time,pmDesignator)}return result2}function parseHead(head,rights){let space=rights>0,count=1,from=0,to=0,result2=[];for(let i2=0;i2<head.length;i2++)if(count<=rights){if(/\s/.test(head[i2])&&!space)to=i2-1,result2.push({from,to:to+1,cap:head.substring(from,to+1)}),from=to+2,count++;space=head[i2]===" "}else{if(!/\s/.test(head[i2])&&space){if(to=i2-1,from<to)result2.push({from,to,cap:head.substring(from,to)});from=to+1,count++}space=head[i2]===" "}to=5000,result2.push({from,to,cap:head.substring(from,to)});let len=result2.length;for(let i2=0;i2<len;i2++)if(result2[i2].cap.replace(/\s/g,"").length===0){if(i2+1<len)result2[i2].to=result2[i2+1].to,result2[i2].cap=result2[i2].cap+result2[i2+1].cap,result2.splice(i2+1,1),len=len-1}return result2}function findObjectByKey(array,key,value){for(let i2=0;i2<array.length;i2++)if(array[i2][key]===value)return i2;return-1}function getPowershell(){if(_powerShell="powershell.exe",_windows){let defaultPath=`${WINDIR}\\system32\\WindowsPowerShell\\v1.0\\powershell.exe`;if(fs3.existsSync(defaultPath))_powerShell=defaultPath}}function getVboxmanage(){return _windows?`"${process.env.VBOX_INSTALL_PATH||process.env.VBOX_MSI_INSTALL_PATH}\\VBoxManage.exe"`:"vboxmanage"}function powerShellProceedResults(data){let id="",parts,res="";if(data.indexOf(_psCmdStart)>=0){parts=data.split(_psCmdStart);let parts2=parts[1].split(_psIdSeperator);if(id=parts2[0],parts2.length>1)data=parts2.slice(1).join(_psIdSeperator)}if(data.indexOf(_psCmdSeperator)>=0)parts=data.split(_psCmdSeperator),res=parts[0];let remove=-1;for(let i2=0;i2<_psCmds.length;i2++)if(_psCmds[i2].id===id)remove=i2,_psCmds[i2].callback(res);if(remove>=0)_psCmds.splice(remove,1)}function powerShellStart(){if(!_psChild){if(_psChild=spawn5(_powerShell,["-NoProfile","-NoLogo","-InputFormat","Text","-NoExit","-Command","-"],{stdio:"pipe",windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})}),_psChild&&_psChild.pid)_psPersistent=!0,_psChild.stdout.on("data",(data)=>{if(_psResult=_psResult+data.toString("utf8"),data.indexOf(_psCmdSeperator)>=0)powerShellProceedResults(_psResult),_psResult=""}),_psChild.stderr.on("data",()=>{powerShellProceedResults(_psResult+_psError)}),_psChild.on("error",()=>{powerShellProceedResults(_psResult+_psError)}),_psChild.on("close",()=>{if(_psChild)_psChild.kill()})}}function powerShellRelease(){try{if(_psChild)_psChild.stdin.write("exit"+os4.EOL),_psChild.stdin.end()}catch{if(_psChild)_psChild.kill()}_psPersistent=!1,_psChild=null}function powerShell(cmd){if(_psPersistent){let id=Math.random().toString(36).substring(2,12);return new Promise((resolve14)=>{process.nextTick(()=>{function callback(data){resolve14(data)}_psCmds.push({id,cmd,callback,start:new Date});try{if(_psChild&&_psChild.pid)_psChild.stdin.write(_psToUTF8+"echo "+_psCmdStart+id+_psIdSeperator+"; "+os4.EOL+cmd+os4.EOL+"echo "+_psCmdSeperator+os4.EOL)}catch{resolve14("")}})})}else{let result2="";return new Promise((resolve14)=>{process.nextTick(()=>{try{let osVersion=os4.release().split(".").map(Number),spanOptions=osVersion[0]<10?["-NoProfile","-NoLogo","-InputFormat","Text","-NoExit","-ExecutionPolicy","Unrestricted","-Command","-"]:["-NoProfile","-NoLogo","-InputFormat","Text","-ExecutionPolicy","Unrestricted","-Command",_psToUTF8+cmd],child=spawn5(_powerShell,spanOptions,{stdio:"pipe",windowsHide:!0,maxBuffer:104857600,encoding:"UTF-8",env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})});if(child&&!child.pid)child.on("error",()=>{resolve14(result2)});if(child&&child.pid){if(child.stdout.on("data",(data)=>{result2=result2+data.toString("utf8")}),child.stderr.on("data",()=>{child.kill(),resolve14(result2)}),child.on("close",()=>{child.kill(),resolve14(result2)}),child.on("error",()=>{child.kill(),resolve14(result2)}),osVersion[0]<10)try{child.stdin.write(_psToUTF8+cmd+os4.EOL),child.stdin.write("exit"+os4.EOL),child.stdin.end()}catch{child.kill(),resolve14(result2)}}else resolve14(result2)}catch{resolve14(result2)}})})}}function execSafe(cmd,args,options){let result2="";return options=options||{},new Promise((resolve14)=>{process.nextTick(()=>{try{let child=spawn5(cmd,args,options);if(child&&!child.pid)child.on("error",()=>{resolve14(result2)});if(child&&child.pid)child.stdout.on("data",(data)=>{result2+=data.toString()}),child.on("close",()=>{child.kill(),resolve14(result2)}),child.on("error",()=>{child.kill(),resolve14(result2)});else resolve14(result2)}catch{resolve14(result2)}})})}function getCodepage(){if(_windows){if(!codepage)try{let parts=execSync18("chcp",execOptsWin).toString().split(`\r
|
|
3146
|
+
`)[0].split(":");codepage=parts.length>1?parts[1].replace(".","").trim():""}catch{codepage="437"}return codepage}if(_linux||_darwin||_freebsd||_openbsd||_netbsd){if(!codepage)try{let parts=execSync18("echo $LANG",execOptsLinux).toString().split(`\r
|
|
3147
|
+
`)[0].split(".");if(codepage=parts.length>1?parts[1].trim():"",!codepage)codepage="UTF-8"}catch{codepage="UTF-8"}return codepage}}function smartMonToolsInstalled(){if(_smartMonToolsInstalled!==null)return _smartMonToolsInstalled;if(_smartMonToolsInstalled=!1,_windows)try{let pathArray=execSync18("WHERE smartctl 2>nul",execOptsWin).toString().split(`\r
|
|
3148
|
+
`);if(pathArray&&pathArray.length)_smartMonToolsInstalled=pathArray[0].indexOf(":\\")>=0;else _smartMonToolsInstalled=!1}catch{_smartMonToolsInstalled=!1}if(_linux||_darwin||_freebsd||_openbsd||_netbsd)try{_smartMonToolsInstalled=execSync18("which smartctl 2>/dev/null",execOptsLinux).toString().split(`\r
|
|
3140
3149
|
`).length>0}catch{util4.noop()}return _smartMonToolsInstalled}function isRaspberry(cpuinfo){let PI_MODEL_NO=["BCM2708","BCM2709","BCM2710","BCM2711","BCM2712","BCM2835","BCM2836","BCM2837","BCM2837B0"];if(_rpi_cpuinfo!==null)cpuinfo=_rpi_cpuinfo;else if(cpuinfo===void 0)try{cpuinfo=fs3.readFileSync("/proc/cpuinfo",{encoding:"utf8"}).toString().split(`
|
|
3141
3150
|
`),_rpi_cpuinfo=cpuinfo}catch{return!1}let hardware=getValue(cpuinfo,"hardware"),model=getValue(cpuinfo,"model");return hardware&&PI_MODEL_NO.indexOf(hardware)>-1||model&&model.indexOf("Raspberry Pi")>-1}function isRaspbian(){let osrelease=[];try{osrelease=fs3.readFileSync("/etc/os-release",{encoding:"utf8"}).toString().split(`
|
|
3142
3151
|
`)}catch{return!1}let id=getValue(osrelease,"id","=");return id&&id.indexOf("raspbian")>-1}function execWin(cmd,opts,callback){if(!callback)callback=opts,opts=execOptsWin;let newCmd="chcp 65001 > nul && cmd /C "+cmd+" && chcp "+codepage+" > nul";exec3(newCmd,opts,(error2,stdout)=>{callback(error2,stdout)})}function darwinXcodeExists(){let cmdLineToolsExists=fs3.existsSync("/Library/Developer/CommandLineTools/usr/bin/"),xcodeAppExists=fs3.existsSync("/Applications/Xcode.app/Contents/Developer/Tools"),xcodeExists=fs3.existsSync("/Library/Developer/Xcode/");return cmdLineToolsExists||xcodeExists||xcodeAppExists}function nanoSeconds(){let time=process.hrtime();if(!Array.isArray(time)||time.length!==2)return 0;return+time[0]*1e9+ +time[1]}function countUniqueLines(lines,startingWith){startingWith=startingWith||"";let uniqueLines=[];return lines.forEach((line)=>{if(line.startsWith(startingWith)){if(uniqueLines.indexOf(line)===-1)uniqueLines.push(line)}}),uniqueLines.length}function countLines(lines,startingWith){startingWith=startingWith||"";let uniqueLines=[];return lines.forEach((line)=>{if(line.startsWith(startingWith))uniqueLines.push(line)}),uniqueLines.length}function sanitizeShellString(str5,strict){if(typeof strict>"u")strict=!1;let s2=str5||"",result2="",l=mathMin(s2.length,2000);for(let i2=0;i2<=l;i2++)if(!(s2[i2]===void 0||s2[i2]===">"||s2[i2]==="<"||s2[i2]==="*"||s2[i2]==="?"||s2[i2]==="["||s2[i2]==="]"||s2[i2]==="|"||s2[i2]==="\u02DA"||s2[i2]==="$"||s2[i2]===";"||s2[i2]==="&"||s2[i2]==="]"||s2[i2]==="#"||s2[i2]==="\\"||s2[i2]==="\t"||s2[i2]===`
|
|
3143
3152
|
`||s2[i2]==="\r"||s2[i2]==="'"||s2[i2]==="`"||s2[i2]==='"'||s2[i2].length>1||strict&&s2[i2]==="("||strict&&s2[i2]===")"||strict&&s2[i2]==="@"||strict&&s2[i2]===" "||strict&&s2[i2]==="{"||strict&&s2[i2]===";"||strict&&s2[i2]==="}"))result2=result2+s2[i2];return result2}function isPrototypePolluted(){let notPolluted=!0,st="";try{st.__proto__.replace=stringReplace,st.__proto__.toLowerCase=stringToLower,st.__proto__.toString=stringToString,st.__proto__.substr=stringSubstr,st.__proto__.substring=stringSubstring,st.__proto__.trim=stringTrim,st.__proto__.startsWith=stringStartWith}catch(e){Object.setPrototypeOf(st,stringObj)}notPolluted=notPolluted||!1;let ms=Date.now();if(typeof ms==="number"&&ms>1600000000000){let l=ms%100+15;for(let i2=0;i2<l;i2++){let r=Math.random()*61.99999999+1,rs=parseInt(Math.floor(r).toString(),10),rs2=parseInt(r.toString().split(".")[0],10),q2=Math.random()*61.99999999+1,qs=parseInt(Math.floor(q2).toString(),10),qs2=parseInt(q2.toString().split(".")[0],10);notPolluted=notPolluted&&r!==q2,notPolluted=notPolluted&&rs===rs2&&qs===qs2,st+="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[rs-1]}notPolluted=notPolluted&&st.length===l;let p=Math.random()*l*0.9999999999,stm=st.substr(0,p)+" "+st.substr(p,2000);try{stm.__proto__.replace=stringReplace}catch(e){Object.setPrototypeOf(stm,stringObj)}let sto=stm.replace(/ /g,"");notPolluted=notPolluted&&st===sto,p=Math.random()*l*0.9999999999,stm=st.substr(0,p)+"{"+st.substr(p,2000),sto=stm.replace(/{/g,""),notPolluted=notPolluted&&st===sto,p=Math.random()*l*0.9999999999,stm=st.substr(0,p)+"*"+st.substr(p,2000),sto=stm.replace(/\*/g,""),notPolluted=notPolluted&&st===sto,p=Math.random()*l*0.9999999999,stm=st.substr(0,p)+"$"+st.substr(p,2000),sto=stm.replace(/\$/g,""),notPolluted=notPolluted&&st===sto;let stl=st.toLowerCase();notPolluted=notPolluted&&stl.length===l&&stl[l-1]&&!stl[l];for(let i2=0;i2<l;i2++){let s1=st[i2];try{s1.__proto__.toLowerCase=stringToLower}catch{Object.setPrototypeOf(st,stringObj)}let s22=stl?stl[i2]:"",s1l=s1.toLowerCase();notPolluted=notPolluted&&s1l[0]===s22&&s1l[0]&&!s1l[1]}}return!notPolluted}function hex2bin(hex){return("00000000"+parseInt(hex,16).toString(2)).substr(-8)}function getFilesInPath(source){let{lstatSync:lstatSync2,readdirSync:readdirSync11}=fs3,join69=path6.join;function isDirectory2(source2){return lstatSync2(source2).isDirectory()}function isFile2(source2){return lstatSync2(source2).isFile()}function getDirectories(source2){return readdirSync11(source2).map((name)=>{return join69(source2,name)}).filter(isDirectory2)}function getFiles(source2){return readdirSync11(source2).map((name)=>{return join69(source2,name)}).filter(isFile2)}function getFilesRecursively(source2){try{return getDirectories(source2).map((dir)=>{return getFilesRecursively(dir)}).reduce((a,b3)=>{return a.concat(b3)},[]).concat(getFiles(source2))}catch{return[]}}if(fs3.existsSync(source))return getFilesRecursively(source);else return[]}function decodePiCpuinfo(lines){if(_rpi_cpuinfo===null)_rpi_cpuinfo=lines;else if(lines===void 0)lines=_rpi_cpuinfo;let oldRevisionCodes={"0002":{type:"B",revision:"1.0",memory:256,manufacturer:"Egoman",processor:"BCM2835"},"0003":{type:"B",revision:"1.0",memory:256,manufacturer:"Egoman",processor:"BCM2835"},"0004":{type:"B",revision:"2.0",memory:256,manufacturer:"Sony UK",processor:"BCM2835"},"0005":{type:"B",revision:"2.0",memory:256,manufacturer:"Qisda",processor:"BCM2835"},"0006":{type:"B",revision:"2.0",memory:256,manufacturer:"Egoman",processor:"BCM2835"},"0007":{type:"A",revision:"2.0",memory:256,manufacturer:"Egoman",processor:"BCM2835"},"0008":{type:"A",revision:"2.0",memory:256,manufacturer:"Sony UK",processor:"BCM2835"},"0009":{type:"A",revision:"2.0",memory:256,manufacturer:"Qisda",processor:"BCM2835"},"000d":{type:"B",revision:"2.0",memory:512,manufacturer:"Egoman",processor:"BCM2835"},"000e":{type:"B",revision:"2.0",memory:512,manufacturer:"Sony UK",processor:"BCM2835"},"000f":{type:"B",revision:"2.0",memory:512,manufacturer:"Egoman",processor:"BCM2835"},"0010":{type:"B+",revision:"1.2",memory:512,manufacturer:"Sony UK",processor:"BCM2835"},"0011":{type:"CM1",revision:"1.0",memory:512,manufacturer:"Sony UK",processor:"BCM2835"},"0012":{type:"A+",revision:"1.1",memory:256,manufacturer:"Sony UK",processor:"BCM2835"},"0013":{type:"B+",revision:"1.2",memory:512,manufacturer:"Embest",processor:"BCM2835"},"0014":{type:"CM1",revision:"1.0",memory:512,manufacturer:"Embest",processor:"BCM2835"},"0015":{type:"A+",revision:"1.1",memory:256,manufacturer:"512MB\tEmbest",processor:"BCM2835"}},processorList=["BCM2835","BCM2836","BCM2837","BCM2711","BCM2712"],manufacturerList=["Sony UK","Egoman","Embest","Sony Japan","Embest","Stadium"],typeList={"00":"A","01":"B","02":"A+","03":"B+","04":"2B","05":"Alpha (early prototype)","06":"CM1","08":"3B","09":"Zero","0a":"CM3","0c":"Zero W","0d":"3B+","0e":"3A+","0f":"Internal use only",10:"CM3+",11:"4B",12:"Zero 2 W",13:"400",14:"CM4",15:"CM4S",16:"Internal use only",17:"5",18:"CM5",19:"500/500+","1a":"CM5 Lite"},revisionCode=getValue(lines,"revision",":",!0),model=getValue(lines,"model:",":",!0),serial=getValue(lines,"serial",":",!0),result2={};if({}.hasOwnProperty.call(oldRevisionCodes,revisionCode))result2={model,serial,revisionCode,memory:oldRevisionCodes[revisionCode].memory,manufacturer:oldRevisionCodes[revisionCode].manufacturer,processor:oldRevisionCodes[revisionCode].processor,type:oldRevisionCodes[revisionCode].type,revision:oldRevisionCodes[revisionCode].revision};else{let revision=("00000000"+getValue(lines,"revision",":",!0).toLowerCase()).substr(-8),memSizeCode=parseInt(hex2bin(revision.substr(2,1)).substr(5,3),2)||0,manufacturer=manufacturerList[parseInt(revision.substr(3,1),10)],processor=processorList[parseInt(revision.substr(4,1),10)],typeCode=revision.substr(5,2);result2={model,serial,revisionCode,memory:256*Math.pow(2,memSizeCode),manufacturer,processor,type:{}.hasOwnProperty.call(typeList,typeCode)?typeList[typeCode]:"",revision:"1."+revision.substr(7,1)}}return result2}function getRpiGpu(cpuinfo){if(_rpi_cpuinfo===null&&cpuinfo!==void 0)_rpi_cpuinfo=cpuinfo;else if(cpuinfo===void 0&&_rpi_cpuinfo!==null)cpuinfo=_rpi_cpuinfo;else try{cpuinfo=fs3.readFileSync("/proc/cpuinfo",{encoding:"utf8"}).toString().split(`
|
|
3144
|
-
`),_rpi_cpuinfo=cpuinfo}catch{return!1}let rpi=decodePiCpuinfo(cpuinfo);if(rpi.type==="4B"||rpi.type==="CM4"||rpi.type==="CM4S"||rpi.type==="400")return"VideoCore VI";if(rpi.type==="5"||rpi.type==="500")return"VideoCore VII";return"VideoCore IV"}function promiseAll(promises){let resolvingPromises=promises.map((promise)=>new Promise((resolve14)=>{let payload=[,,];promise.then((result2)=>{payload[0]=result2}).catch((error2)=>{payload[1]=error2}).then(()=>{resolve14(payload)})})),errors3=[],results=[];return Promise.all(resolvingPromises).then((items)=>{return items.forEach((payload)=>{if(payload[1])errors3.push(payload[1]),results.push(null);else errors3.push(null),results.push(payload[0])}),{errors:errors3,results}})}function promisify3(nodeStyleFunction){return()=>{let args=Array.prototype.slice.call(arguments);return new Promise((resolve14,reject)=>{args.push((err,data)=>{if(err)reject(err);else resolve14(data)}),nodeStyleFunction.apply(null,args)})}}function promisifySave(nodeStyleFunction){return()=>{let args=Array.prototype.slice.call(arguments);return new Promise((resolve14)=>{args.push((err,data)=>{resolve14(data)}),nodeStyleFunction.apply(null,args)})}}function linuxVersion(){let result2="";if(_linux)try{result2=
|
|
3145
|
-
`);for(let i2=0;i2<lines.length;i2++){if(lines[i2].indexOf(" = ")>=0){let lineParts=lines[i2].split(" = ");if(lineParts[0]=lineParts[0].trim(),!lineParts[0].startsWith('"'))lineParts[0]='"'+lineParts[0]+'"';if(lineParts[1]=lineParts[1].trim(),lineParts[1].indexOf('"')===-1&&lineParts[1].endsWith(";")){let valueString=lineParts[1].substring(0,lineParts[1].length-1);if(!strIsNumeric(valueString))lineParts[1]=`"${valueString}";`}if(lineParts[1].indexOf('"')>=0&&lineParts[1].endsWith(";")){let valueString=lineParts[1].substring(0,lineParts[1].length-1).replace(/"/g,"");if(strIsNumeric(valueString))lineParts[1]=`${valueString};`}lines[i2]=lineParts.join(" : ")}if(lines[i2]=lines[i2].replace(/\(/g,"[").replace(/\)/g,"]").replace(/;/g,",").trim(),lines[i2].startsWith("}")&&lines[i2-1]&&lines[i2-1].endsWith(","))lines[i2-1]=lines[i2-1].substring(0,lines[i2-1].length-1)}output=lines.join("");let obj={};try{obj=JSON.parse(output)}catch(e){noop4()}return obj}function semverCompare(v1,v2){let res=0,parts1=v1.split("."),parts2=v2.split(".");if(parts1[0]<parts2[0])res=1;else if(parts1[0]>parts2[0])res=-1;else if(parts1[0]===parts2[0]&&parts1.length>=2&&parts2.length>=2){if(parts1[1]<parts2[1])res=1;else if(parts1[1]>parts2[1])res=-1;else if(parts1[1]===parts2[1]){if(parts1.length>=3&&parts2.length>=3){if(parts1[2]<parts2[2])res=1;else if(parts1[2]>parts2[2])res=-1}else if(parts2.length>=3)res=1}}return res}function getAppleModel(key){let list2=[{key:"Mac17,7",name:"MacBook Pro",size:"16-inch",processor:"M5 Max",year:"2026",additional:""},{key:"Mac17,6",name:"MacBook Pro",size:"14-inch",processor:"M5 Max",year:"2026",additional:""},{key:"Mac17,5",name:"MacBook Pro",size:"16-inch",processor:"M5 Pro",year:"2026",additional:""},{key:"Mac17,4",name:"MacBook Pro",size:"14-inch",processor:"M5 Pro",year:"2026",additional:""},{key:"Mac17,1",name:"MacBook Neo",size:"14-inch",processor:"A18 Pro",year:"2026",additional:""},{key:"Mac17,3",name:"MacBook Pro",size:"16-inch",processor:"M5",year:"2025",additional:""},{key:"Mac17,2",name:"MacBook Pro",size:"14-inch",processor:"M5",year:"2025",additional:""},{key:"Mac16,13",name:"MacBook Air",size:"15-inch",processor:"M4",year:"2025",additional:""},{key:"Mac16,12",name:"MacBook Air",size:"13-inch",processor:"M4",year:"2025",additional:""},{key:"Mac15,13",name:"MacBook Air",size:"15-inch",processor:"M3",year:"2024",additional:""},{key:"Mac15,12",name:"MacBook Air",size:"13-inch",processor:"M3",year:"2024",additional:""},{key:"Mac14,15",name:"MacBook Air",size:"15-inch",processor:"M2",year:"2024",additional:""},{key:"Mac14,2",name:"MacBook Air",size:"13-inch",processor:"M2",year:"2022",additional:""},{key:"MacBookAir10,1",name:"MacBook Air",size:"13-inch",processor:"M1",year:"2020",additional:""},{key:"MacBookAir9,1",name:"MacBook Air",size:"13-inch",processor:"",year:"2020",additional:""},{key:"MacBookAir8,2",name:"MacBook Air",size:"13-inch",processor:"",year:"2019",additional:""},{key:"MacBookAir8,1",name:"MacBook Air",size:"13-inch",processor:"",year:"2018",additional:""},{key:"MacBookAir7,2",name:"MacBook Air",size:"13-inch",processor:"",year:"2017",additional:""},{key:"MacBookAir7,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Early 2015",additional:""},{key:"MacBookAir7,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Early 2015",additional:""},{key:"MacBookAir6,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Early 2014",additional:""},{key:"MacBookAir6,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Early 2014",additional:""},{key:"MacBookAir6,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Mid 2013",additional:""},{key:"MacBookAir6,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Mid 2013",additional:""},{key:"MacBookAir5,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookAir5,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookAir4,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Mid 2011",additional:""},{key:"MacBookAir4,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Mid 2011",additional:""},{key:"MacBookAir3,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Late 2010",additional:""},{key:"MacBookAir3,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Late 2010",additional:""},{key:"MacBookAir2,1",name:"MacBook Air",size:"13-inch",processor:"",year:"Mid 2009",additional:""},{key:"Mac16,1",name:"MacBook Pro",size:"14-inch",processor:"M4",year:"2024",additional:""},{key:"Mac16,6",name:"MacBook Pro",size:"14-inch",processor:"M4 Pro",year:"2024",additional:""},{key:"Mac16,8",name:"MacBook Pro",size:"14-inch",processor:"M4 Max",year:"2024",additional:""},{key:"Mac16,5",name:"MacBook Pro",size:"16-inch",processor:"M4 Pro",year:"2024",additional:""},{key:"Mac16,6",name:"MacBook Pro",size:"16-inch",processor:"M4 Max",year:"2024",additional:""},{key:"Mac15,3",name:"MacBook Pro",size:"14-inch",processor:"M3",year:"Nov 2023",additional:""},{key:"Mac15,6",name:"MacBook Pro",size:"14-inch",processor:"M3 Pro",year:"Nov 2023",additional:""},{key:"Mac15,8",name:"MacBook Pro",size:"14-inch",processor:"M3 Pro",year:"Nov 2023",additional:""},{key:"Mac15,10",name:"MacBook Pro",size:"14-inch",processor:"M3 Max",year:"Nov 2023",additional:""},{key:"Mac15,7",name:"MacBook Pro",size:"16-inch",processor:"M3 Pro",year:"Nov 2023",additional:""},{key:"Mac15,9",name:"MacBook Pro",size:"16-inch",processor:"M3 Pro",year:"Nov 2023",additional:""},{key:"Mac15,11",name:"MacBook Pro",size:"16-inch",processor:"M3 Max",year:"Nov 2023",additional:""},{key:"Mac14,5",name:"MacBook Pro",size:"14-inch",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,9",name:"MacBook Pro",size:"14-inch",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,6",name:"MacBook Pro",size:"16-inch",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,10",name:"MacBook Pro",size:"16-inch",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,7",name:"MacBook Pro",size:"13-inch",processor:"M2",year:"2022",additional:""},{key:"MacBookPro18,3",name:"MacBook Pro",size:"14-inch",processor:"M1 Pro",year:"2021",additional:""},{key:"MacBookPro18,4",name:"MacBook Pro",size:"14-inch",processor:"M1 Max",year:"2021",additional:""},{key:"MacBookPro18,1",name:"MacBook Pro",size:"16-inch",processor:"M1 Pro",year:"2021",additional:""},{key:"MacBookPro18,2",name:"MacBook Pro",size:"16-inch",processor:"M1 Max",year:"2021",additional:""},{key:"MacBookPro17,1",name:"MacBook Pro",size:"13-inch",processor:"M1",year:"2020",additional:""},{key:"MacBookPro16,3",name:"MacBook Pro",size:"13-inch",processor:"",year:"2020",additional:"Two Thunderbolt 3 ports"},{key:"MacBookPro16,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2020",additional:"Four Thunderbolt 3 ports"},{key:"MacBookPro16,1",name:"MacBook Pro",size:"16-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro16,4",name:"MacBook Pro",size:"16-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro15,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro15,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro15,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro15,4",name:"MacBook Pro",size:"13-inch",processor:"",year:"2019",additional:"Two Thunderbolt 3 ports"},{key:"MacBookPro15,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"2018",additional:""},{key:"MacBookPro15,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2018",additional:"Four Thunderbolt 3 ports"},{key:"MacBookPro14,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"2017",additional:"Two Thunderbolt 3 ports"},{key:"MacBookPro14,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2017",additional:"Four Thunderbolt 3 ports"},{key:"MacBookPro14,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"2017",additional:""},{key:"MacBookPro13,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"2016",additional:"Two Thunderbolt 3 ports"},{key:"MacBookPro13,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2016",additional:"Four Thunderbolt 3 ports"},{key:"MacBookPro13,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"2016",additional:""},{key:"MacBookPro11,4",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2015",additional:""},{key:"MacBookPro11,5",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2015",additional:""},{key:"MacBookPro12,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"Early 2015",additional:""},{key:"MacBookPro11,2",name:"MacBook Pro",size:"15-inch",processor:"",year:"Late 2013",additional:""},{key:"MacBookPro11,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"Late 2013",additional:""},{key:"MacBookPro11,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"Late 2013",additional:""},{key:"MacBookPro10,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookPro10,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"Late 2012",additional:""},{key:"MacBookPro9,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookPro9,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookPro8,3",name:"MacBook Pro",size:"17-inch",processor:"",year:"Early 2011",additional:""},{key:"MacBookPro8,2",name:"MacBook Pro",size:"15-inch",processor:"",year:"Early 2011",additional:""},{key:"MacBookPro8,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"Early 2011",additional:""},{key:"MacBookPro6,1",name:"MacBook Pro",size:"17-inch",processor:"",year:"Mid 2010",additional:""},{key:"MacBookPro6,2",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2010",additional:""},{key:"MacBookPro7,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"Mid 2010",additional:""},{key:"MacBookPro5,2",name:"MacBook Pro",size:"17-inch",processor:"",year:"Early 2009",additional:""},{key:"MacBookPro5,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2009",additional:""},{key:"MacBookPro5,5",name:"MacBook Pro",size:"13-inch",processor:"",year:"Mid 2009",additional:""},{key:"MacBookPro5,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"Late 2008",additional:""},{key:"MacBookPro4,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"Early 2008",additional:""},{key:"MacBook10,1",name:"MacBook",size:"12-inch",processor:"",year:"2017",additional:""},{key:"MacBook9,1",name:"MacBook",size:"12-inch",processor:"",year:"Early 2016",additional:""},{key:"MacBook8,1",name:"MacBook",size:"12-inch",processor:"",year:"Early 2015",additional:""},{key:"MacBook7,1",name:"MacBook",size:"13-inch",processor:"",year:"Mid 2010",additional:""},{key:"MacBook6,1",name:"MacBook",size:"13-inch",processor:"",year:"Late 2009",additional:""},{key:"MacBook5,2",name:"MacBook",size:"13-inch",processor:"",year:"Early 2009",additional:""},{key:"Mac14,13",name:"Mac Studio",size:"",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,14",name:"Mac Studio",size:"",processor:"M2 Ultra",year:"2023",additional:""},{key:"Mac15,14",name:"Mac Studio",size:"",processor:"M3 Ultra",year:"2025",additional:""},{key:"Mac16,9",name:"Mac Studio",size:"",processor:"M4 Max",year:"2025",additional:""},{key:"Mac13,1",name:"Mac Studio",size:"",processor:"M1 Max",year:"2022",additional:""},{key:"Mac13,2",name:"Mac Studio",size:"",processor:"M1 Ultra",year:"2022",additional:""},{key:"Mac16,11",name:"Mac mini",size:"",processor:"M4 Pro",year:"2024",additional:""},{key:"Mac16,10",name:"Mac mini",size:"",processor:"M4",year:"2024",additional:""},{key:"Mac14,3",name:"Mac mini",size:"",processor:"M2",year:"2023",additional:""},{key:"Mac14,12",name:"Mac mini",size:"",processor:"M2 Pro",year:"2023",additional:""},{key:"Macmini9,1",name:"Mac mini",size:"",processor:"M1",year:"2020",additional:""},{key:"Macmini8,1",name:"Mac mini",size:"",processor:"",year:"Late 2018",additional:""},{key:"Macmini7,1",name:"Mac mini",size:"",processor:"",year:"Late 2014",additional:""},{key:"Macmini6,1",name:"Mac mini",size:"",processor:"",year:"Late 2012",additional:""},{key:"Macmini6,2",name:"Mac mini",size:"",processor:"",year:"Late 2012",additional:""},{key:"Macmini5,1",name:"Mac mini",size:"",processor:"",year:"Mid 2011",additional:""},{key:"Macmini5,2",name:"Mac mini",size:"",processor:"",year:"Mid 2011",additional:""},{key:"Macmini4,1",name:"Mac mini",size:"",processor:"",year:"Mid 2010",additional:""},{key:"Macmini3,1",name:"Mac mini",size:"",processor:"",year:"Early 2009",additional:""},{key:"Mac16,3",name:"iMac",size:"24-inch",processor:"M4",year:"2024",additional:"Four ports"},{key:"Mac16,2",name:"iMac",size:"24-inch",processor:"M4",year:"2024",additional:"Two ports"},{key:"Mac15,5",name:"iMac",size:"24-inch",processor:"M3",year:"2023",additional:"Four ports"},{key:"Mac15,4",name:"iMac",size:"24-inch",processor:"M3",year:"2023",additional:"Two ports"},{key:"iMac21,1",name:"iMac",size:"24-inch",processor:"M1",year:"2021",additional:""},{key:"iMac21,2",name:"iMac",size:"24-inch",processor:"M1",year:"2021",additional:""},{key:"iMac20,1",name:"iMac",size:"27-inch",processor:"",year:"2020",additional:"Retina 5K"},{key:"iMac20,2",name:"iMac",size:"27-inch",processor:"",year:"2020",additional:"Retina 5K"},{key:"iMac19,1",name:"iMac",size:"27-inch",processor:"",year:"2019",additional:"Retina 5K"},{key:"iMac19,2",name:"iMac",size:"21.5-inch",processor:"",year:"2019",additional:"Retina 4K"},{key:"iMacPro1,1",name:"iMac Pro",size:"",processor:"",year:"2017",additional:""},{key:"iMac18,3",name:"iMac",size:"27-inch",processor:"",year:"2017",additional:"Retina 5K"},{key:"iMac18,2",name:"iMac",size:"21.5-inch",processor:"",year:"2017",additional:"Retina 4K"},{key:"iMac18,1",name:"iMac",size:"21.5-inch",processor:"",year:"2017",additional:""},{key:"iMac17,1",name:"iMac",size:"27-inch",processor:"",year:"Late 2015",additional:"Retina 5K"},{key:"iMac16,2",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2015",additional:"Retina 4K"},{key:"iMac16,1",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2015",additional:""},{key:"iMac15,1",name:"iMac",size:"27-inch",processor:"",year:"Late 2014",additional:"Retina 5K"},{key:"iMac14,4",name:"iMac",size:"21.5-inch",processor:"",year:"Mid 2014",additional:""},{key:"iMac14,2",name:"iMac",size:"27-inch",processor:"",year:"Late 2013",additional:""},{key:"iMac14,1",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2013",additional:""},{key:"iMac13,2",name:"iMac",size:"27-inch",processor:"",year:"Late 2012",additional:""},{key:"iMac13,1",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2012",additional:""},{key:"iMac12,2",name:"iMac",size:"27-inch",processor:"",year:"Mid 2011",additional:""},{key:"iMac12,1",name:"iMac",size:"21.5-inch",processor:"",year:"Mid 2011",additional:""},{key:"iMac11,3",name:"iMac",size:"27-inch",processor:"",year:"Mid 2010",additional:""},{key:"iMac11,2",name:"iMac",size:"21.5-inch",processor:"",year:"Mid 2010",additional:""},{key:"iMac10,1",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2009",additional:""},{key:"iMac9,1",name:"iMac",size:"20-inch",processor:"",year:"Early 2009",additional:""},{key:"Mac14,8",name:"Mac Pro",size:"",processor:"",year:"2023",additional:""},{key:"Mac14,8",name:"Mac Pro",size:"",processor:"",year:"2023",additional:"Rack"},{key:"MacPro7,1",name:"Mac Pro",size:"",processor:"",year:"2019",additional:""},{key:"MacPro7,1",name:"Mac Pro",size:"",processor:"",year:"2019",additional:"Rack"},{key:"MacPro6,1",name:"Mac Pro",size:"",processor:"",year:"Late 2013",additional:""},{key:"MacPro5,1",name:"Mac Pro",size:"",processor:"",year:"Mid 2012",additional:""},{key:"MacPro5,1",name:"Mac Pro Server",size:"",processor:"",year:"Mid 2012",additional:"Server"},{key:"MacPro5,1",name:"Mac Pro",size:"",processor:"",year:"Mid 2010",additional:""},{key:"MacPro5,1",name:"Mac Pro Server",size:"",processor:"",year:"Mid 2010",additional:"Server"},{key:"MacPro4,1",name:"Mac Pro",size:"",processor:"",year:"Early 2009",additional:""}].filter((model)=>model.key===key);if(list2.length===0)return{key,model:"Apple",version:"Unknown"};let features=[];if(list2[0].size)features.push(list2[0].size);if(list2[0].processor)features.push(list2[0].processor);if(list2[0].year)features.push(list2[0].year);if(list2[0].additional)features.push(list2[0].additional);return{key,model:list2[0].name,version:list2[0].name+" ("+features.join(", ")+")"}}function checkWebsite(url,timeout=5000){let http=url.startsWith("https:")||url.indexOf(":443/")>0||url.indexOf(":8443/")>0?__require("https"):__require("http"),t2=Date.now();return new Promise((resolve14)=>{let request=http.get(url,(res)=>{res.on("data",()=>{}),res.on("end",()=>{resolve14({url,statusCode:res.statusCode,message:res.statusMessage,time:Date.now()-t2})})}).on("error",(e)=>{resolve14({url,statusCode:404,message:e.message,time:Date.now()-t2})}).setTimeout(timeout,()=>{request.destroy(),resolve14({url,statusCode:408,message:"Request Timeout",time:Date.now()-t2})})})}function cleanString(str5){return str5.replace(/To Be Filled By O.E.M./g,"")}function noop4(){}exports.toInt=toInt;exports.splitByNumber=splitByNumber;exports.execOptsWin=execOptsWin;exports.execOptsLinux=execOptsLinux;exports.getCodepage=getCodepage;exports.execWin=execWin;exports.isFunction=isFunction;exports.unique=unique;exports.sortByKey=sortByKey;exports.cores=cores;exports.getValue=getValue;exports.decodeEscapeSequence=decodeEscapeSequence;exports.parseDateTime=parseDateTime;exports.parseHead=parseHead;exports.findObjectByKey=findObjectByKey;exports.darwinXcodeExists=darwinXcodeExists;exports.getVboxmanage=getVboxmanage;exports.powerShell=powerShell;exports.powerShellStart=powerShellStart;exports.powerShellRelease=powerShellRelease;exports.execSafe=execSafe;exports.nanoSeconds=nanoSeconds;exports.countUniqueLines=countUniqueLines;exports.countLines=countLines;exports.noop=noop4;exports.isRaspberry=isRaspberry;exports.isRaspbian=isRaspbian;exports.sanitizeShellString=sanitizeShellString;exports.isPrototypePolluted=isPrototypePolluted;exports.decodePiCpuinfo=decodePiCpuinfo;exports.getRpiGpu=getRpiGpu;exports.promiseAll=promiseAll;exports.promisify=promisify3;exports.promisifySave=promisifySave;exports.smartMonToolsInstalled=smartMonToolsInstalled;exports.linuxVersion=linuxVersion;exports.plistParser=plistParser;exports.plistReader=plistReader;exports.stringObj=stringObj;exports.stringReplace=stringReplace;exports.stringToLower=stringToLower;exports.stringToString=stringToString;exports.stringSubstr=stringSubstr;exports.stringSubstring=stringSubstring;exports.stringTrim=stringTrim;exports.stringStartWith=stringStartWith;exports.mathMin=mathMin;exports.WINDIR=WINDIR;exports.getFilesInPath=getFilesInPath;exports.semverCompare=semverCompare;exports.getAppleModel=getAppleModel;exports.checkWebsite=checkWebsite;exports.cleanString=cleanString;exports.getPowershell=getPowershell});var require_osinfo=__commonJS((exports)=>{var os4=__require("os"),fs3=__require("fs"),util4=require_util3(),exec3=__require("child_process").exec,execSync19=__require("child_process").execSync,_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";function time(){let t2=new Date().toString().split(" "),timezoneName="";try{timezoneName=Intl.DateTimeFormat().resolvedOptions().timeZone}catch{timezoneName=t2.length>=7?t2.slice(6).join(" ").replace(/\(/g,"").replace(/\)/g,""):""}let result2={current:Date.now(),uptime:os4.uptime(),timezone:t2.length>=7?t2[5]:"",timezoneName};if(_darwin||_linux)try{let lines=execSync19("date +%Z && date +%z && ls -l /etc/localtime 2>/dev/null",util4.execOptsLinux).toString().split(os4.EOL);if(lines.length>3&&!lines[0])lines.shift();let timezone=lines[0]||"";if(timezone.startsWith("+")||timezone.startsWith("-"))timezone="GMT";return{current:Date.now(),uptime:os4.uptime(),timezone:lines[1]?timezone+lines[1]:timezone,timezoneName:lines[2]&&lines[2].indexOf("/zoneinfo/")>0?lines[2].split("/zoneinfo/")[1]||"":""}}catch{util4.noop()}return result2}exports.time=time;function getLogoFile(distro){distro=distro||"",distro=distro.toLowerCase();let result2=_platform;if(_windows)result2="windows";else if(distro.indexOf("mac os")!==-1||distro.indexOf("macos")!==-1)result2="apple";else if(distro.indexOf("arch")!==-1)result2="arch";else if(distro.indexOf("cachy")!==-1)result2="cachy";else if(distro.indexOf("centos")!==-1)result2="centos";else if(distro.indexOf("coreos")!==-1)result2="coreos";else if(distro.indexOf("debian")!==-1)result2="debian";else if(distro.indexOf("deepin")!==-1)result2="deepin";else if(distro.indexOf("elementary")!==-1)result2="elementary";else if(distro.indexOf("endeavour")!==-1)result2="endeavour";else if(distro.indexOf("fedora")!==-1)result2="fedora";else if(distro.indexOf("gentoo")!==-1)result2="gentoo";else if(distro.indexOf("mageia")!==-1)result2="mageia";else if(distro.indexOf("mandriva")!==-1)result2="mandriva";else if(distro.indexOf("manjaro")!==-1)result2="manjaro";else if(distro.indexOf("mint")!==-1)result2="mint";else if(distro.indexOf("mx")!==-1)result2="mx";else if(distro.indexOf("openbsd")!==-1)result2="openbsd";else if(distro.indexOf("freebsd")!==-1)result2="freebsd";else if(distro.indexOf("opensuse")!==-1)result2="opensuse";else if(distro.indexOf("pclinuxos")!==-1)result2="pclinuxos";else if(distro.indexOf("puppy")!==-1)result2="puppy";else if(distro.indexOf("popos")!==-1)result2="popos";else if(distro.indexOf("raspbian")!==-1)result2="raspbian";else if(distro.indexOf("reactos")!==-1)result2="reactos";else if(distro.indexOf("redhat")!==-1)result2="redhat";else if(distro.indexOf("slackware")!==-1)result2="slackware";else if(distro.indexOf("sugar")!==-1)result2="sugar";else if(distro.indexOf("steam")!==-1)result2="steam";else if(distro.indexOf("suse")!==-1)result2="suse";else if(distro.indexOf("mate")!==-1)result2="ubuntu-mate";else if(distro.indexOf("lubuntu")!==-1)result2="lubuntu";else if(distro.indexOf("xubuntu")!==-1)result2="xubuntu";else if(distro.indexOf("ubuntu")!==-1)result2="ubuntu";else if(distro.indexOf("solaris")!==-1)result2="solaris";else if(distro.indexOf("tails")!==-1)result2="tails";else if(distro.indexOf("feren")!==-1)result2="ferenos";else if(distro.indexOf("robolinux")!==-1)result2="robolinux";else if(_linux&&distro)result2=distro.toLowerCase().trim().replace(/\s+/g,"-");return result2}var WINDOWS_RELEASES=[[26200,"25H2"],[26100,"24H2"],[22631,"23H2"],[22621,"22H2"],[19045,"22H2"],[22000,"21H2"],[19044,"21H2"],[19043,"21H1"],[19042,"20H2"],[19041,"2004"],[18363,"1909"],[18362,"1903"],[17763,"1809"],[17134,"1803"]];function getWindowsRelease(build){for(let[minBuild,label]of WINDOWS_RELEASES)if(build>=minBuild)return label;return""}function getFQDN(){let fqdn=os4.hostname;if(_linux||_darwin)try{fqdn=execSync19("hostname -f 2>/dev/null",util4.execOptsLinux).toString().split(os4.EOL)[0]}catch{util4.noop()}if(_freebsd||_openbsd||_netbsd)try{fqdn=execSync19("hostname 2>/dev/null").toString().split(os4.EOL)[0]}catch{util4.noop()}if(_windows)try{fqdn=execSync19("echo %COMPUTERNAME%.%USERDNSDOMAIN%",util4.execOptsWin).toString().replace(".%USERDNSDOMAIN%","").split(os4.EOL)[0]}catch{util4.noop()}return fqdn}function osInfo(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={platform:_platform==="win32"?"Windows":_platform,distro:"unknown",release:"unknown",codename:"",kernel:os4.release(),arch:os4.arch(),hostname:os4.hostname(),fqdn:getFQDN(),codepage:"",logofile:"",serial:"",build:"",servicepack:"",uefi:!1};if(_linux)exec3("cat /etc/*-release; cat /usr/lib/os-release; cat /etc/openwrt_release",(error2,stdout)=>{let release={};stdout.toString().split(`
|
|
3153
|
+
`),_rpi_cpuinfo=cpuinfo}catch{return!1}let rpi=decodePiCpuinfo(cpuinfo);if(rpi.type==="4B"||rpi.type==="CM4"||rpi.type==="CM4S"||rpi.type==="400")return"VideoCore VI";if(rpi.type==="5"||rpi.type==="500")return"VideoCore VII";return"VideoCore IV"}function promiseAll(promises){let resolvingPromises=promises.map((promise)=>new Promise((resolve14)=>{let payload=[,,];promise.then((result2)=>{payload[0]=result2}).catch((error2)=>{payload[1]=error2}).then(()=>{resolve14(payload)})})),errors3=[],results=[];return Promise.all(resolvingPromises).then((items)=>{return items.forEach((payload)=>{if(payload[1])errors3.push(payload[1]),results.push(null);else errors3.push(null),results.push(payload[0])}),{errors:errors3,results}})}function promisify3(nodeStyleFunction){return()=>{let args=Array.prototype.slice.call(arguments);return new Promise((resolve14,reject)=>{args.push((err,data)=>{if(err)reject(err);else resolve14(data)}),nodeStyleFunction.apply(null,args)})}}function promisifySave(nodeStyleFunction){return()=>{let args=Array.prototype.slice.call(arguments);return new Promise((resolve14)=>{args.push((err,data)=>{resolve14(data)}),nodeStyleFunction.apply(null,args)})}}function linuxVersion(){let result2="";if(_linux)try{result2=execSync18("uname -v",execOptsLinux).toString()}catch{result2=""}return result2}function plistParser(xmlStr){let tags=["array","dict","key","string","integer","date","real","data","boolean","arrayEmpty"],startStr="<plist version",pos=xmlStr.indexOf("<plist version"),len=xmlStr.length;while(xmlStr[pos]!==">"&&pos<len)pos++;let depth=0,inTagStart=!1,inTagContent=!1,inTagEnd=!1,metaData=[{tagStart:"",tagEnd:"",tagContent:"",key:"",data:null}],c="",cn=xmlStr[pos];while(pos<len){if(c=cn,pos+1<len)cn=xmlStr[pos+1];if(c==="<"){if(inTagContent=!1,cn==="/")inTagEnd=!0;else if(metaData[depth].tagStart){if(metaData[depth].tagContent="",!metaData[depth].data)metaData[depth].data=metaData[depth].tagStart==="array"?[]:{};depth++,metaData.push({tagStart:"",tagEnd:"",tagContent:"",key:null,data:null}),inTagStart=!0,inTagContent=!1}else if(!inTagStart)inTagStart=!0}else if(c===">"){if(metaData[depth].tagStart==="true/")inTagStart=!1,inTagEnd=!0,metaData[depth].tagStart="",metaData[depth].tagEnd="/boolean",metaData[depth].data=!0;if(metaData[depth].tagStart==="false/")inTagStart=!1,inTagEnd=!0,metaData[depth].tagStart="",metaData[depth].tagEnd="/boolean",metaData[depth].data=!1;if(metaData[depth].tagStart==="array/")inTagStart=!1,inTagEnd=!0,metaData[depth].tagStart="",metaData[depth].tagEnd="/arrayEmpty",metaData[depth].data=[];if(inTagContent)inTagContent=!1;if(inTagStart){if(inTagStart=!1,inTagContent=!0,metaData[depth].tagStart==="array")metaData[depth].data=[];if(metaData[depth].tagStart==="dict")metaData[depth].data={}}if(inTagEnd){if(inTagEnd=!1,metaData[depth].tagEnd&&tags.indexOf(metaData[depth].tagEnd.substr(1))>=0)if(metaData[depth].tagEnd==="/dict"||metaData[depth].tagEnd==="/array"){if(depth>1&&metaData[depth-2].tagStart==="array")metaData[depth-2].data.push(metaData[depth-1].data);if(depth>1&&metaData[depth-2].tagStart==="dict")metaData[depth-2].data[metaData[depth-1].key]=metaData[depth-1].data;depth--,metaData.pop(),metaData[depth].tagContent="",metaData[depth].tagStart="",metaData[depth].tagEnd=""}else{if(metaData[depth].tagEnd==="/key"&&metaData[depth].tagContent)metaData[depth].key=metaData[depth].tagContent;else{if(metaData[depth].tagEnd==="/real"&&metaData[depth].tagContent)metaData[depth].data=parseFloat(metaData[depth].tagContent)||0;if(metaData[depth].tagEnd==="/integer"&&metaData[depth].tagContent)metaData[depth].data=parseInt(metaData[depth].tagContent)||0;if(metaData[depth].tagEnd==="/string"&&metaData[depth].tagContent)metaData[depth].data=metaData[depth].tagContent||"";if(metaData[depth].tagEnd==="/boolean")metaData[depth].data=metaData[depth].tagContent||!1;if(metaData[depth].tagEnd==="/arrayEmpty")metaData[depth].data=metaData[depth].tagContent||[];if(depth>0&&metaData[depth-1].tagStart==="array")metaData[depth-1].data.push(metaData[depth].data);if(depth>0&&metaData[depth-1].tagStart==="dict")metaData[depth-1].data[metaData[depth].key]=metaData[depth].data}metaData[depth].tagContent="",metaData[depth].tagStart="",metaData[depth].tagEnd=""}metaData[depth].tagEnd="",inTagStart=!1,inTagContent=!1}}else{if(inTagStart)metaData[depth].tagStart+=c;if(inTagEnd)metaData[depth].tagEnd+=c;if(inTagContent)metaData[depth].tagContent+=c}pos++}return metaData[0].data}function strIsNumeric(str5){return typeof str5==="string"&&!isNaN(str5)&&!isNaN(parseFloat(str5))}function plistReader(output){let lines=output.split(`
|
|
3154
|
+
`);for(let i2=0;i2<lines.length;i2++){if(lines[i2].indexOf(" = ")>=0){let lineParts=lines[i2].split(" = ");if(lineParts[0]=lineParts[0].trim(),!lineParts[0].startsWith('"'))lineParts[0]='"'+lineParts[0]+'"';if(lineParts[1]=lineParts[1].trim(),lineParts[1].indexOf('"')===-1&&lineParts[1].endsWith(";")){let valueString=lineParts[1].substring(0,lineParts[1].length-1);if(!strIsNumeric(valueString))lineParts[1]=`"${valueString}";`}if(lineParts[1].indexOf('"')>=0&&lineParts[1].endsWith(";")){let valueString=lineParts[1].substring(0,lineParts[1].length-1).replace(/"/g,"");if(strIsNumeric(valueString))lineParts[1]=`${valueString};`}lines[i2]=lineParts.join(" : ")}if(lines[i2]=lines[i2].replace(/\(/g,"[").replace(/\)/g,"]").replace(/;/g,",").trim(),lines[i2].startsWith("}")&&lines[i2-1]&&lines[i2-1].endsWith(","))lines[i2-1]=lines[i2-1].substring(0,lines[i2-1].length-1)}output=lines.join("");let obj={};try{obj=JSON.parse(output)}catch(e){noop4()}return obj}function semverCompare(v1,v2){let res=0,parts1=v1.split("."),parts2=v2.split(".");if(parts1[0]<parts2[0])res=1;else if(parts1[0]>parts2[0])res=-1;else if(parts1[0]===parts2[0]&&parts1.length>=2&&parts2.length>=2){if(parts1[1]<parts2[1])res=1;else if(parts1[1]>parts2[1])res=-1;else if(parts1[1]===parts2[1]){if(parts1.length>=3&&parts2.length>=3){if(parts1[2]<parts2[2])res=1;else if(parts1[2]>parts2[2])res=-1}else if(parts2.length>=3)res=1}}return res}function getAppleModel(key){let list2=[{key:"Mac17,7",name:"MacBook Pro",size:"16-inch",processor:"M5 Max",year:"2026",additional:""},{key:"Mac17,6",name:"MacBook Pro",size:"14-inch",processor:"M5 Max",year:"2026",additional:""},{key:"Mac17,5",name:"MacBook Pro",size:"16-inch",processor:"M5 Pro",year:"2026",additional:""},{key:"Mac17,4",name:"MacBook Pro",size:"14-inch",processor:"M5 Pro",year:"2026",additional:""},{key:"Mac17,1",name:"MacBook Neo",size:"14-inch",processor:"A18 Pro",year:"2026",additional:""},{key:"Mac17,3",name:"MacBook Pro",size:"16-inch",processor:"M5",year:"2025",additional:""},{key:"Mac17,2",name:"MacBook Pro",size:"14-inch",processor:"M5",year:"2025",additional:""},{key:"Mac16,13",name:"MacBook Air",size:"15-inch",processor:"M4",year:"2025",additional:""},{key:"Mac16,12",name:"MacBook Air",size:"13-inch",processor:"M4",year:"2025",additional:""},{key:"Mac15,13",name:"MacBook Air",size:"15-inch",processor:"M3",year:"2024",additional:""},{key:"Mac15,12",name:"MacBook Air",size:"13-inch",processor:"M3",year:"2024",additional:""},{key:"Mac14,15",name:"MacBook Air",size:"15-inch",processor:"M2",year:"2024",additional:""},{key:"Mac14,2",name:"MacBook Air",size:"13-inch",processor:"M2",year:"2022",additional:""},{key:"MacBookAir10,1",name:"MacBook Air",size:"13-inch",processor:"M1",year:"2020",additional:""},{key:"MacBookAir9,1",name:"MacBook Air",size:"13-inch",processor:"",year:"2020",additional:""},{key:"MacBookAir8,2",name:"MacBook Air",size:"13-inch",processor:"",year:"2019",additional:""},{key:"MacBookAir8,1",name:"MacBook Air",size:"13-inch",processor:"",year:"2018",additional:""},{key:"MacBookAir7,2",name:"MacBook Air",size:"13-inch",processor:"",year:"2017",additional:""},{key:"MacBookAir7,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Early 2015",additional:""},{key:"MacBookAir7,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Early 2015",additional:""},{key:"MacBookAir6,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Early 2014",additional:""},{key:"MacBookAir6,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Early 2014",additional:""},{key:"MacBookAir6,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Mid 2013",additional:""},{key:"MacBookAir6,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Mid 2013",additional:""},{key:"MacBookAir5,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookAir5,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookAir4,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Mid 2011",additional:""},{key:"MacBookAir4,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Mid 2011",additional:""},{key:"MacBookAir3,2",name:"MacBook Air",size:"13-inch",processor:"",year:"Late 2010",additional:""},{key:"MacBookAir3,1",name:"MacBook Air",size:"11-inch",processor:"",year:"Late 2010",additional:""},{key:"MacBookAir2,1",name:"MacBook Air",size:"13-inch",processor:"",year:"Mid 2009",additional:""},{key:"Mac16,1",name:"MacBook Pro",size:"14-inch",processor:"M4",year:"2024",additional:""},{key:"Mac16,6",name:"MacBook Pro",size:"14-inch",processor:"M4 Pro",year:"2024",additional:""},{key:"Mac16,8",name:"MacBook Pro",size:"14-inch",processor:"M4 Max",year:"2024",additional:""},{key:"Mac16,5",name:"MacBook Pro",size:"16-inch",processor:"M4 Pro",year:"2024",additional:""},{key:"Mac16,6",name:"MacBook Pro",size:"16-inch",processor:"M4 Max",year:"2024",additional:""},{key:"Mac15,3",name:"MacBook Pro",size:"14-inch",processor:"M3",year:"Nov 2023",additional:""},{key:"Mac15,6",name:"MacBook Pro",size:"14-inch",processor:"M3 Pro",year:"Nov 2023",additional:""},{key:"Mac15,8",name:"MacBook Pro",size:"14-inch",processor:"M3 Pro",year:"Nov 2023",additional:""},{key:"Mac15,10",name:"MacBook Pro",size:"14-inch",processor:"M3 Max",year:"Nov 2023",additional:""},{key:"Mac15,7",name:"MacBook Pro",size:"16-inch",processor:"M3 Pro",year:"Nov 2023",additional:""},{key:"Mac15,9",name:"MacBook Pro",size:"16-inch",processor:"M3 Pro",year:"Nov 2023",additional:""},{key:"Mac15,11",name:"MacBook Pro",size:"16-inch",processor:"M3 Max",year:"Nov 2023",additional:""},{key:"Mac14,5",name:"MacBook Pro",size:"14-inch",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,9",name:"MacBook Pro",size:"14-inch",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,6",name:"MacBook Pro",size:"16-inch",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,10",name:"MacBook Pro",size:"16-inch",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,7",name:"MacBook Pro",size:"13-inch",processor:"M2",year:"2022",additional:""},{key:"MacBookPro18,3",name:"MacBook Pro",size:"14-inch",processor:"M1 Pro",year:"2021",additional:""},{key:"MacBookPro18,4",name:"MacBook Pro",size:"14-inch",processor:"M1 Max",year:"2021",additional:""},{key:"MacBookPro18,1",name:"MacBook Pro",size:"16-inch",processor:"M1 Pro",year:"2021",additional:""},{key:"MacBookPro18,2",name:"MacBook Pro",size:"16-inch",processor:"M1 Max",year:"2021",additional:""},{key:"MacBookPro17,1",name:"MacBook Pro",size:"13-inch",processor:"M1",year:"2020",additional:""},{key:"MacBookPro16,3",name:"MacBook Pro",size:"13-inch",processor:"",year:"2020",additional:"Two Thunderbolt 3 ports"},{key:"MacBookPro16,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2020",additional:"Four Thunderbolt 3 ports"},{key:"MacBookPro16,1",name:"MacBook Pro",size:"16-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro16,4",name:"MacBook Pro",size:"16-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro15,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro15,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro15,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"2019",additional:""},{key:"MacBookPro15,4",name:"MacBook Pro",size:"13-inch",processor:"",year:"2019",additional:"Two Thunderbolt 3 ports"},{key:"MacBookPro15,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"2018",additional:""},{key:"MacBookPro15,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2018",additional:"Four Thunderbolt 3 ports"},{key:"MacBookPro14,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"2017",additional:"Two Thunderbolt 3 ports"},{key:"MacBookPro14,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2017",additional:"Four Thunderbolt 3 ports"},{key:"MacBookPro14,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"2017",additional:""},{key:"MacBookPro13,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"2016",additional:"Two Thunderbolt 3 ports"},{key:"MacBookPro13,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"2016",additional:"Four Thunderbolt 3 ports"},{key:"MacBookPro13,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"2016",additional:""},{key:"MacBookPro11,4",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2015",additional:""},{key:"MacBookPro11,5",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2015",additional:""},{key:"MacBookPro12,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"Early 2015",additional:""},{key:"MacBookPro11,2",name:"MacBook Pro",size:"15-inch",processor:"",year:"Late 2013",additional:""},{key:"MacBookPro11,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"Late 2013",additional:""},{key:"MacBookPro11,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"Late 2013",additional:""},{key:"MacBookPro10,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookPro10,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"Late 2012",additional:""},{key:"MacBookPro9,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookPro9,2",name:"MacBook Pro",size:"13-inch",processor:"",year:"Mid 2012",additional:""},{key:"MacBookPro8,3",name:"MacBook Pro",size:"17-inch",processor:"",year:"Early 2011",additional:""},{key:"MacBookPro8,2",name:"MacBook Pro",size:"15-inch",processor:"",year:"Early 2011",additional:""},{key:"MacBookPro8,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"Early 2011",additional:""},{key:"MacBookPro6,1",name:"MacBook Pro",size:"17-inch",processor:"",year:"Mid 2010",additional:""},{key:"MacBookPro6,2",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2010",additional:""},{key:"MacBookPro7,1",name:"MacBook Pro",size:"13-inch",processor:"",year:"Mid 2010",additional:""},{key:"MacBookPro5,2",name:"MacBook Pro",size:"17-inch",processor:"",year:"Early 2009",additional:""},{key:"MacBookPro5,3",name:"MacBook Pro",size:"15-inch",processor:"",year:"Mid 2009",additional:""},{key:"MacBookPro5,5",name:"MacBook Pro",size:"13-inch",processor:"",year:"Mid 2009",additional:""},{key:"MacBookPro5,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"Late 2008",additional:""},{key:"MacBookPro4,1",name:"MacBook Pro",size:"15-inch",processor:"",year:"Early 2008",additional:""},{key:"MacBook10,1",name:"MacBook",size:"12-inch",processor:"",year:"2017",additional:""},{key:"MacBook9,1",name:"MacBook",size:"12-inch",processor:"",year:"Early 2016",additional:""},{key:"MacBook8,1",name:"MacBook",size:"12-inch",processor:"",year:"Early 2015",additional:""},{key:"MacBook7,1",name:"MacBook",size:"13-inch",processor:"",year:"Mid 2010",additional:""},{key:"MacBook6,1",name:"MacBook",size:"13-inch",processor:"",year:"Late 2009",additional:""},{key:"MacBook5,2",name:"MacBook",size:"13-inch",processor:"",year:"Early 2009",additional:""},{key:"Mac14,13",name:"Mac Studio",size:"",processor:"M2 Max",year:"2023",additional:""},{key:"Mac14,14",name:"Mac Studio",size:"",processor:"M2 Ultra",year:"2023",additional:""},{key:"Mac15,14",name:"Mac Studio",size:"",processor:"M3 Ultra",year:"2025",additional:""},{key:"Mac16,9",name:"Mac Studio",size:"",processor:"M4 Max",year:"2025",additional:""},{key:"Mac13,1",name:"Mac Studio",size:"",processor:"M1 Max",year:"2022",additional:""},{key:"Mac13,2",name:"Mac Studio",size:"",processor:"M1 Ultra",year:"2022",additional:""},{key:"Mac16,11",name:"Mac mini",size:"",processor:"M4 Pro",year:"2024",additional:""},{key:"Mac16,10",name:"Mac mini",size:"",processor:"M4",year:"2024",additional:""},{key:"Mac14,3",name:"Mac mini",size:"",processor:"M2",year:"2023",additional:""},{key:"Mac14,12",name:"Mac mini",size:"",processor:"M2 Pro",year:"2023",additional:""},{key:"Macmini9,1",name:"Mac mini",size:"",processor:"M1",year:"2020",additional:""},{key:"Macmini8,1",name:"Mac mini",size:"",processor:"",year:"Late 2018",additional:""},{key:"Macmini7,1",name:"Mac mini",size:"",processor:"",year:"Late 2014",additional:""},{key:"Macmini6,1",name:"Mac mini",size:"",processor:"",year:"Late 2012",additional:""},{key:"Macmini6,2",name:"Mac mini",size:"",processor:"",year:"Late 2012",additional:""},{key:"Macmini5,1",name:"Mac mini",size:"",processor:"",year:"Mid 2011",additional:""},{key:"Macmini5,2",name:"Mac mini",size:"",processor:"",year:"Mid 2011",additional:""},{key:"Macmini4,1",name:"Mac mini",size:"",processor:"",year:"Mid 2010",additional:""},{key:"Macmini3,1",name:"Mac mini",size:"",processor:"",year:"Early 2009",additional:""},{key:"Mac16,3",name:"iMac",size:"24-inch",processor:"M4",year:"2024",additional:"Four ports"},{key:"Mac16,2",name:"iMac",size:"24-inch",processor:"M4",year:"2024",additional:"Two ports"},{key:"Mac15,5",name:"iMac",size:"24-inch",processor:"M3",year:"2023",additional:"Four ports"},{key:"Mac15,4",name:"iMac",size:"24-inch",processor:"M3",year:"2023",additional:"Two ports"},{key:"iMac21,1",name:"iMac",size:"24-inch",processor:"M1",year:"2021",additional:""},{key:"iMac21,2",name:"iMac",size:"24-inch",processor:"M1",year:"2021",additional:""},{key:"iMac20,1",name:"iMac",size:"27-inch",processor:"",year:"2020",additional:"Retina 5K"},{key:"iMac20,2",name:"iMac",size:"27-inch",processor:"",year:"2020",additional:"Retina 5K"},{key:"iMac19,1",name:"iMac",size:"27-inch",processor:"",year:"2019",additional:"Retina 5K"},{key:"iMac19,2",name:"iMac",size:"21.5-inch",processor:"",year:"2019",additional:"Retina 4K"},{key:"iMacPro1,1",name:"iMac Pro",size:"",processor:"",year:"2017",additional:""},{key:"iMac18,3",name:"iMac",size:"27-inch",processor:"",year:"2017",additional:"Retina 5K"},{key:"iMac18,2",name:"iMac",size:"21.5-inch",processor:"",year:"2017",additional:"Retina 4K"},{key:"iMac18,1",name:"iMac",size:"21.5-inch",processor:"",year:"2017",additional:""},{key:"iMac17,1",name:"iMac",size:"27-inch",processor:"",year:"Late 2015",additional:"Retina 5K"},{key:"iMac16,2",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2015",additional:"Retina 4K"},{key:"iMac16,1",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2015",additional:""},{key:"iMac15,1",name:"iMac",size:"27-inch",processor:"",year:"Late 2014",additional:"Retina 5K"},{key:"iMac14,4",name:"iMac",size:"21.5-inch",processor:"",year:"Mid 2014",additional:""},{key:"iMac14,2",name:"iMac",size:"27-inch",processor:"",year:"Late 2013",additional:""},{key:"iMac14,1",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2013",additional:""},{key:"iMac13,2",name:"iMac",size:"27-inch",processor:"",year:"Late 2012",additional:""},{key:"iMac13,1",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2012",additional:""},{key:"iMac12,2",name:"iMac",size:"27-inch",processor:"",year:"Mid 2011",additional:""},{key:"iMac12,1",name:"iMac",size:"21.5-inch",processor:"",year:"Mid 2011",additional:""},{key:"iMac11,3",name:"iMac",size:"27-inch",processor:"",year:"Mid 2010",additional:""},{key:"iMac11,2",name:"iMac",size:"21.5-inch",processor:"",year:"Mid 2010",additional:""},{key:"iMac10,1",name:"iMac",size:"21.5-inch",processor:"",year:"Late 2009",additional:""},{key:"iMac9,1",name:"iMac",size:"20-inch",processor:"",year:"Early 2009",additional:""},{key:"Mac14,8",name:"Mac Pro",size:"",processor:"",year:"2023",additional:""},{key:"Mac14,8",name:"Mac Pro",size:"",processor:"",year:"2023",additional:"Rack"},{key:"MacPro7,1",name:"Mac Pro",size:"",processor:"",year:"2019",additional:""},{key:"MacPro7,1",name:"Mac Pro",size:"",processor:"",year:"2019",additional:"Rack"},{key:"MacPro6,1",name:"Mac Pro",size:"",processor:"",year:"Late 2013",additional:""},{key:"MacPro5,1",name:"Mac Pro",size:"",processor:"",year:"Mid 2012",additional:""},{key:"MacPro5,1",name:"Mac Pro Server",size:"",processor:"",year:"Mid 2012",additional:"Server"},{key:"MacPro5,1",name:"Mac Pro",size:"",processor:"",year:"Mid 2010",additional:""},{key:"MacPro5,1",name:"Mac Pro Server",size:"",processor:"",year:"Mid 2010",additional:"Server"},{key:"MacPro4,1",name:"Mac Pro",size:"",processor:"",year:"Early 2009",additional:""}].filter((model)=>model.key===key);if(list2.length===0)return{key,model:"Apple",version:"Unknown"};let features=[];if(list2[0].size)features.push(list2[0].size);if(list2[0].processor)features.push(list2[0].processor);if(list2[0].year)features.push(list2[0].year);if(list2[0].additional)features.push(list2[0].additional);return{key,model:list2[0].name,version:list2[0].name+" ("+features.join(", ")+")"}}function checkWebsite(url,timeout=5000){let http=url.startsWith("https:")||url.indexOf(":443/")>0||url.indexOf(":8443/")>0?__require("https"):__require("http"),t2=Date.now();return new Promise((resolve14)=>{let request=http.get(url,(res)=>{res.on("data",()=>{}),res.on("end",()=>{resolve14({url,statusCode:res.statusCode,message:res.statusMessage,time:Date.now()-t2})})}).on("error",(e)=>{resolve14({url,statusCode:404,message:e.message,time:Date.now()-t2})}).setTimeout(timeout,()=>{request.destroy(),resolve14({url,statusCode:408,message:"Request Timeout",time:Date.now()-t2})})})}function cleanString(str5){return str5.replace(/To Be Filled By O.E.M./g,"")}function noop4(){}exports.toInt=toInt;exports.splitByNumber=splitByNumber;exports.execOptsWin=execOptsWin;exports.execOptsLinux=execOptsLinux;exports.getCodepage=getCodepage;exports.execWin=execWin;exports.isFunction=isFunction;exports.unique=unique;exports.sortByKey=sortByKey;exports.cores=cores;exports.getValue=getValue;exports.decodeEscapeSequence=decodeEscapeSequence;exports.parseDateTime=parseDateTime;exports.parseHead=parseHead;exports.findObjectByKey=findObjectByKey;exports.darwinXcodeExists=darwinXcodeExists;exports.getVboxmanage=getVboxmanage;exports.powerShell=powerShell;exports.powerShellStart=powerShellStart;exports.powerShellRelease=powerShellRelease;exports.execSafe=execSafe;exports.nanoSeconds=nanoSeconds;exports.countUniqueLines=countUniqueLines;exports.countLines=countLines;exports.noop=noop4;exports.isRaspberry=isRaspberry;exports.isRaspbian=isRaspbian;exports.sanitizeShellString=sanitizeShellString;exports.isPrototypePolluted=isPrototypePolluted;exports.decodePiCpuinfo=decodePiCpuinfo;exports.getRpiGpu=getRpiGpu;exports.promiseAll=promiseAll;exports.promisify=promisify3;exports.promisifySave=promisifySave;exports.smartMonToolsInstalled=smartMonToolsInstalled;exports.linuxVersion=linuxVersion;exports.plistParser=plistParser;exports.plistReader=plistReader;exports.stringObj=stringObj;exports.stringReplace=stringReplace;exports.stringToLower=stringToLower;exports.stringToString=stringToString;exports.stringSubstr=stringSubstr;exports.stringSubstring=stringSubstring;exports.stringTrim=stringTrim;exports.stringStartWith=stringStartWith;exports.mathMin=mathMin;exports.WINDIR=WINDIR;exports.getFilesInPath=getFilesInPath;exports.semverCompare=semverCompare;exports.getAppleModel=getAppleModel;exports.checkWebsite=checkWebsite;exports.cleanString=cleanString;exports.getPowershell=getPowershell});var require_osinfo=__commonJS((exports)=>{var os4=__require("os"),fs3=__require("fs"),util4=require_util3(),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";function time(){let t2=new Date().toString().split(" "),timezoneName="";try{timezoneName=Intl.DateTimeFormat().resolvedOptions().timeZone}catch{timezoneName=t2.length>=7?t2.slice(6).join(" ").replace(/\(/g,"").replace(/\)/g,""):""}let result2={current:Date.now(),uptime:os4.uptime(),timezone:t2.length>=7?t2[5]:"",timezoneName};if(_darwin||_linux)try{let lines=execSync18("date +%Z && date +%z && ls -l /etc/localtime 2>/dev/null",util4.execOptsLinux).toString().split(os4.EOL);if(lines.length>3&&!lines[0])lines.shift();let timezone=lines[0]||"";if(timezone.startsWith("+")||timezone.startsWith("-"))timezone="GMT";return{current:Date.now(),uptime:os4.uptime(),timezone:lines[1]?timezone+lines[1]:timezone,timezoneName:lines[2]&&lines[2].indexOf("/zoneinfo/")>0?lines[2].split("/zoneinfo/")[1]||"":""}}catch{util4.noop()}return result2}exports.time=time;function getLogoFile(distro){distro=distro||"",distro=distro.toLowerCase();let result2=_platform;if(_windows)result2="windows";else if(distro.indexOf("mac os")!==-1||distro.indexOf("macos")!==-1)result2="apple";else if(distro.indexOf("arch")!==-1)result2="arch";else if(distro.indexOf("cachy")!==-1)result2="cachy";else if(distro.indexOf("centos")!==-1)result2="centos";else if(distro.indexOf("coreos")!==-1)result2="coreos";else if(distro.indexOf("debian")!==-1)result2="debian";else if(distro.indexOf("deepin")!==-1)result2="deepin";else if(distro.indexOf("elementary")!==-1)result2="elementary";else if(distro.indexOf("endeavour")!==-1)result2="endeavour";else if(distro.indexOf("fedora")!==-1)result2="fedora";else if(distro.indexOf("gentoo")!==-1)result2="gentoo";else if(distro.indexOf("mageia")!==-1)result2="mageia";else if(distro.indexOf("mandriva")!==-1)result2="mandriva";else if(distro.indexOf("manjaro")!==-1)result2="manjaro";else if(distro.indexOf("mint")!==-1)result2="mint";else if(distro.indexOf("mx")!==-1)result2="mx";else if(distro.indexOf("openbsd")!==-1)result2="openbsd";else if(distro.indexOf("freebsd")!==-1)result2="freebsd";else if(distro.indexOf("opensuse")!==-1)result2="opensuse";else if(distro.indexOf("pclinuxos")!==-1)result2="pclinuxos";else if(distro.indexOf("puppy")!==-1)result2="puppy";else if(distro.indexOf("popos")!==-1)result2="popos";else if(distro.indexOf("raspbian")!==-1)result2="raspbian";else if(distro.indexOf("reactos")!==-1)result2="reactos";else if(distro.indexOf("redhat")!==-1)result2="redhat";else if(distro.indexOf("slackware")!==-1)result2="slackware";else if(distro.indexOf("sugar")!==-1)result2="sugar";else if(distro.indexOf("steam")!==-1)result2="steam";else if(distro.indexOf("suse")!==-1)result2="suse";else if(distro.indexOf("mate")!==-1)result2="ubuntu-mate";else if(distro.indexOf("lubuntu")!==-1)result2="lubuntu";else if(distro.indexOf("xubuntu")!==-1)result2="xubuntu";else if(distro.indexOf("ubuntu")!==-1)result2="ubuntu";else if(distro.indexOf("solaris")!==-1)result2="solaris";else if(distro.indexOf("tails")!==-1)result2="tails";else if(distro.indexOf("feren")!==-1)result2="ferenos";else if(distro.indexOf("robolinux")!==-1)result2="robolinux";else if(_linux&&distro)result2=distro.toLowerCase().trim().replace(/\s+/g,"-");return result2}var WINDOWS_RELEASES=[[26200,"25H2"],[26100,"24H2"],[22631,"23H2"],[22621,"22H2"],[19045,"22H2"],[22000,"21H2"],[19044,"21H2"],[19043,"21H1"],[19042,"20H2"],[19041,"2004"],[18363,"1909"],[18362,"1903"],[17763,"1809"],[17134,"1803"]];function getWindowsRelease(build){for(let[minBuild,label]of WINDOWS_RELEASES)if(build>=minBuild)return label;return""}function getFQDN(){let fqdn=os4.hostname;if(_linux||_darwin)try{fqdn=execSync18("hostname -f 2>/dev/null",util4.execOptsLinux).toString().split(os4.EOL)[0]}catch{util4.noop()}if(_freebsd||_openbsd||_netbsd)try{fqdn=execSync18("hostname 2>/dev/null").toString().split(os4.EOL)[0]}catch{util4.noop()}if(_windows)try{fqdn=execSync18("echo %COMPUTERNAME%.%USERDNSDOMAIN%",util4.execOptsWin).toString().replace(".%USERDNSDOMAIN%","").split(os4.EOL)[0]}catch{util4.noop()}return fqdn}function osInfo(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={platform:_platform==="win32"?"Windows":_platform,distro:"unknown",release:"unknown",codename:"",kernel:os4.release(),arch:os4.arch(),hostname:os4.hostname(),fqdn:getFQDN(),codepage:"",logofile:"",serial:"",build:"",servicepack:"",uefi:!1};if(_linux)exec3("cat /etc/*-release; cat /usr/lib/os-release; cat /etc/openwrt_release",(error2,stdout)=>{let release={};stdout.toString().split(`
|
|
3146
3155
|
`).forEach((line)=>{if(line.indexOf("=")!==-1)release[line.split("=")[0].trim().toUpperCase()]=line.split("=")[1].trim()}),result2.distro=(release.DISTRIB_ID||release.NAME||"unknown").replace(/"/g,""),result2.logofile=getLogoFile(result2.distro);let releaseVersion=(release.VERSION||"").replace(/"/g,""),codename=(release.DISTRIB_CODENAME||release.VERSION_CODENAME||"").replace(/"/g,""),prettyName=(release.PRETTY_NAME||"").replace(/"/g,"");if(prettyName.indexOf(result2.distro+" ")===0)releaseVersion=prettyName.replace(result2.distro+" ","").trim();if(releaseVersion.indexOf("(")>=0)codename=releaseVersion.split("(")[1].replace(/[()]/g,"").trim(),releaseVersion=releaseVersion.split("(")[0].trim();result2.release=(releaseVersion||release.DISTRIB_RELEASE||release.VERSION_ID||"unknown").replace(/"/g,""),result2.codename=codename,result2.codepage=util4.getCodepage(),result2.build=(release.BUILD_ID||"").replace(/"/g,"").trim(),isUefiLinux().then((uefi)=>{result2.uefi=uefi,uuid().then((data)=>{if(result2.serial=data.os,callback)callback(result2);resolve14(result2)})})});if(_freebsd||_openbsd||_netbsd)exec3("sysctl kern.ostype kern.osrelease kern.osrevision kern.hostuuid machdep.bootmethod kern.geom.confxml",(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3147
3156
|
`),distro=util4.getValue(lines,"kern.ostype"),logofile=getLogoFile(distro),release=util4.getValue(lines,"kern.osrelease").split("-")[0],serial=util4.getValue(lines,"kern.uuid"),bootmethod=util4.getValue(lines,"machdep.bootmethod"),uefiConf=stdout.toString().indexOf("<type>efi</type>")>=0,uefi=bootmethod?bootmethod.toLowerCase().indexOf("uefi")>=0:uefiConf?uefiConf:null;if(result2.distro=distro||result2.distro,result2.logofile=logofile||result2.logofile,result2.release=release||result2.release,result2.serial=serial||result2.serial,result2.codename="",result2.codepage=util4.getCodepage(),result2.uefi=uefi||null,callback)callback(result2);resolve14(result2)});if(_darwin)exec3("sw_vers; sysctl kern.ostype kern.osrelease kern.osrevision kern.uuid",(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3148
3157
|
`);if(result2.serial=util4.getValue(lines,"kern.uuid"),result2.distro=util4.getValue(lines,"ProductName"),result2.release=(util4.getValue(lines,"ProductVersion",":",!0,!0)+" "+util4.getValue(lines,"ProductVersionExtra",":",!0,!0)).trim(),result2.build=util4.getValue(lines,"BuildVersion"),result2.logofile=getLogoFile(result2.distro),result2.codename="macOS",result2.codename=result2.release.indexOf("10.4")>-1?"OS X Tiger":result2.codename,result2.codename=result2.release.indexOf("10.5")>-1?"OS X Leopard":result2.codename,result2.codename=result2.release.indexOf("10.6")>-1?"OS X Snow Leopard":result2.codename,result2.codename=result2.release.indexOf("10.7")>-1?"OS X Lion":result2.codename,result2.codename=result2.release.indexOf("10.8")>-1?"OS X Mountain Lion":result2.codename,result2.codename=result2.release.indexOf("10.9")>-1?"OS X Mavericks":result2.codename,result2.codename=result2.release.indexOf("10.10")>-1?"OS X Yosemite":result2.codename,result2.codename=result2.release.indexOf("10.11")>-1?"OS X El Capitan":result2.codename,result2.codename=result2.release.indexOf("10.12")>-1?"Sierra":result2.codename,result2.codename=result2.release.indexOf("10.13")>-1?"High Sierra":result2.codename,result2.codename=result2.release.indexOf("10.14")>-1?"Mojave":result2.codename,result2.codename=result2.release.indexOf("10.15")>-1?"Catalina":result2.codename,result2.codename=result2.release.startsWith("11.")?"Big Sur":result2.codename,result2.codename=result2.release.startsWith("12.")?"Monterey":result2.codename,result2.codename=result2.release.startsWith("13.")?"Ventura":result2.codename,result2.codename=result2.release.startsWith("14.")?"Sonoma":result2.codename,result2.codename=result2.release.startsWith("15.")?"Sequoia":result2.codename,result2.codename=result2.release.startsWith("26.")?"Tahoe":result2.codename,result2.uefi=!0,result2.codepage=util4.getCodepage(),callback)callback(result2);resolve14(result2)});if(_sunos)result2.release=result2.kernel,exec3("uname -o",(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
@@ -3174,7 +3183,7 @@ $ bun add react-devtools-core@7 -d
|
|
|
3174
3183
|
`),srvCaption=util4.getValue(lines,"caption",":",!0).toLowerCase();if(srvCaption.indexOf("postgresql")>-1){let parts=srvCaption.split(" server ");if(parts.length>1)appsObj.versions.postgresql=parts[1]}}}),functionProcessed()});else exec3("postgres -V",(error2,stdout)=>{if(!error2){let postgresql=stdout.toString().split(`
|
|
3175
3184
|
`)[0].split(" ")||[];appsObj.versions.postgresql=postgresql.length?postgresql[postgresql.length-1]:""}else exec3("pg_config --version",(error3,stdout2)=>{if(!error3){let postgresql=stdout2.toString().split(`
|
|
3176
3185
|
`)[0].split(" ")||[];appsObj.versions.postgresql=postgresql.length?postgresql[postgresql.length-1]:""}});functionProcessed()});if({}.hasOwnProperty.call(appsObj.versions,"perl"))exec3("perl -v",(error2,stdout)=>{if(!error2){let perl=stdout.toString().split(`
|
|
3177
|
-
`)||"";while(perl.length>0&&perl[0].trim()==="")perl.shift();if(perl.length>0)appsObj.versions.perl=perl[0].split("(").pop().split(")")[0].replace("v","")}functionProcessed()});if({}.hasOwnProperty.call(appsObj.versions,"python"))if(_darwin)try{let lines=
|
|
3186
|
+
`)||"";while(perl.length>0&&perl[0].trim()==="")perl.shift();if(perl.length>0)appsObj.versions.perl=perl[0].split("(").pop().split(")")[0].replace("v","")}functionProcessed()});if({}.hasOwnProperty.call(appsObj.versions,"python"))if(_darwin)try{let lines=execSync18("sw_vers").toString().split(`
|
|
3178
3187
|
`),osVersion=util4.getValue(lines,"ProductVersion",":"),gitHomebrewExists1=fs3.existsSync("/usr/local/Cellar/python"),gitHomebrewExists2=fs3.existsSync("/opt/homebrew/bin/python");if(util4.darwinXcodeExists()&&util4.semverCompare("12.0.1",osVersion)<0||gitHomebrewExists1||gitHomebrewExists2)exec3(gitHomebrewExists1?"/usr/local/Cellar/python -V 2>&1":gitHomebrewExists2?"/opt/homebrew/bin/python -V 2>&1":"python -V 2>&1",(error2,stdout2)=>{if(!error2){let python=stdout2.toString().split(`
|
|
3179
3188
|
`)[0]||"";appsObj.versions.python=python.toLowerCase().replace("python","").trim()}functionProcessed()});else functionProcessed()}catch{functionProcessed()}else exec3("python -V 2>&1",(error2,stdout)=>{if(!error2){let python=stdout.toString().split(`
|
|
3180
3189
|
`)[0]||"";appsObj.versions.python=python.toLowerCase().replace("python","").trim()}functionProcessed()});if({}.hasOwnProperty.call(appsObj.versions,"python3"))if(_darwin){let gitHomebrewExists=fs3.existsSync("/usr/local/Cellar/python3")||fs3.existsSync("/opt/homebrew/bin/python3");if(util4.darwinXcodeExists()||gitHomebrewExists)exec3("python3 -V 2>&1",(error2,stdout)=>{if(!error2){let python=stdout.toString().split(`
|
|
@@ -3204,15 +3213,15 @@ echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`,(e
|
|
|
3204
3213
|
`),serial=util4.getValue(lines2,"serial");result2.hardware=serial||""}if(callback)callback(result2);resolve14(result2)});if(_freebsd||_openbsd||_netbsd)exec3("sysctl -i kern.hostid kern.hostuuid",(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3205
3214
|
`);if(result2.hardware=util4.getValue(lines,"kern.hostid",":").toLowerCase(),result2.os=util4.getValue(lines,"kern.hostuuid",":").toLowerCase(),result2.os.indexOf("unknown")>=0)result2.os="";if(result2.hardware.indexOf("unknown")>=0)result2.hardware="";if(callback)callback(result2);resolve14(result2)});if(_windows){let sysdir="%windir%\\System32";if(process.arch==="ia32"&&Object.prototype.hasOwnProperty.call(process.env,"PROCESSOR_ARCHITEW6432"))sysdir="%windir%\\sysnative\\cmd.exe /c %windir%\\System32";util4.powerShell("Get-CimInstance Win32_ComputerSystemProduct | select UUID | fl").then((stdout)=>{let lines=stdout.split(`\r
|
|
3206
3215
|
`);result2.hardware=util4.getValue(lines,"uuid",":").toLowerCase(),exec3(`${sysdir}\\reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid`,util4.execOptsWin,(error2,stdout2)=>{if(parts=stdout2.toString().split(`
|
|
3207
|
-
\r`)[0].split("REG_SZ"),result2.os=parts.length>1?parts[1].replace(/\r+|\n+|\s+/gi,"").toLowerCase():"",callback)callback(result2);resolve14(result2)})})}})})}exports.uuid=uuid});var require_system=__commonJS((exports)=>{var fs3=__require("fs"),os4=__require("os"),util4=require_util3(),{uuid}=require_osinfo(),exec3=__require("child_process").exec,
|
|
3216
|
+
\r`)[0].split("REG_SZ"),result2.os=parts.length>1?parts[1].replace(/\r+|\n+|\s+/gi,"").toLowerCase():"",callback)callback(result2);resolve14(result2)})})}})})}exports.uuid=uuid});var require_system=__commonJS((exports)=>{var fs3=__require("fs"),os4=__require("os"),util4=require_util3(),{uuid}=require_osinfo(),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,execPromise=util4.promisify(__require("child_process").exec),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";function system(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={manufacturer:"",model:"Computer",version:"",serial:"-",uuid:"-",sku:"-",virtual:!1};if(_linux||_freebsd||_openbsd||_netbsd)exec3("export LC_ALL=C; dmidecode -t system 2>/dev/null; unset LC_ALL",(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3208
3217
|
`);result2.manufacturer=cleanDefaults(util4.getValue(lines,"manufacturer")),result2.model=cleanDefaults(util4.getValue(lines,"product name")),result2.version=cleanDefaults(util4.getValue(lines,"version")),result2.serial=cleanDefaults(util4.getValue(lines,"serial number")),result2.uuid=cleanDefaults(util4.getValue(lines,"uuid")).toLowerCase(),result2.sku=cleanDefaults(util4.getValue(lines,"sku number"));let cmd=`echo -n "product_name: "; cat /sys/devices/virtual/dmi/id/product_name 2>/dev/null; echo;
|
|
3209
3218
|
echo -n "product_serial: "; cat /sys/devices/virtual/dmi/id/product_serial 2>/dev/null; echo;
|
|
3210
3219
|
echo -n "product_uuid: "; cat /sys/devices/virtual/dmi/id/product_uuid 2>/dev/null; echo;
|
|
3211
3220
|
echo -n "product_version: "; cat /sys/devices/virtual/dmi/id/product_version 2>/dev/null; echo;
|
|
3212
|
-
echo -n "sys_vendor: "; cat /sys/devices/virtual/dmi/id/sys_vendor 2>/dev/null; echo;`;try{lines=
|
|
3213
|
-
`),result2.manufacturer=cleanDefaults(result2.manufacturer===""?util4.getValue(lines,"sys_vendor"):result2.manufacturer),result2.model=cleanDefaults(result2.model===""?util4.getValue(lines,"product_name"):result2.model),result2.version=cleanDefaults(result2.version===""?util4.getValue(lines,"product_version"):result2.version),result2.serial=cleanDefaults(result2.serial===""?util4.getValue(lines,"product_serial"):result2.serial),result2.uuid=cleanDefaults(result2.uuid===""?util4.getValue(lines,"product_uuid").toLowerCase():result2.uuid)}catch{util4.noop()}if(!result2.serial)result2.serial="-";if(!result2.manufacturer)result2.manufacturer="";if(!result2.model)result2.model="Computer";if(!result2.version)result2.version="";if(!result2.sku)result2.sku="-";if(result2.model.toLowerCase()==="virtualbox"||result2.model.toLowerCase()==="kvm"||result2.model.toLowerCase()==="virtual machine"||result2.model.toLowerCase()==="bochs"||result2.model.toLowerCase().startsWith("vmware")||result2.model.toLowerCase().startsWith("droplet"))switch(result2.virtual=!0,result2.model.toLowerCase()){case"virtualbox":result2.virtualHost="VirtualBox";break;case"vmware":result2.virtualHost="VMware";break;case"kvm":result2.virtualHost="KVM";break;case"bochs":result2.virtualHost="bochs";break}if(result2.manufacturer.toLowerCase().startsWith("vmware")||result2.manufacturer.toLowerCase()==="xen")switch(result2.virtual=!0,result2.manufacturer.toLowerCase()){case"vmware":result2.virtualHost="VMware";break;case"xen":result2.virtualHost="Xen";break}if(!result2.virtual)try{let disksById=
|
|
3214
|
-
`);if(!result2.uuid)result2.uuid=util4.getValue(lines2,"kern.hostuuid",":").toLowerCase();if(!result2.serial||result2.serial==="-")result2.serial=util4.getValue(lines2,"kern.hostid",":").toLowerCase();if(!result2.model||result2.model==="Computer")result2.model=util4.getValue(lines2,"hw.model",":").trim()}catch{util4.noop()}if(!result2.virtual&&(os4.release().toLowerCase().indexOf("microsoft")>=0||os4.release().toLowerCase().endsWith("wsl2"))){let kernelVersion=parseFloat(os4.release().toLowerCase());result2.virtual=!0,result2.manufacturer="Microsoft",result2.model="WSL",result2.version=kernelVersion<4.19?"1":"2"}if((_freebsd||_openbsd||_netbsd)&&!result2.virtualHost)try{let procLines=
|
|
3215
|
-
`);switch(util4.getValue(procLines,"manufacturer",":",!0).toLowerCase()){case"virtualbox":result2.virtualHost="VirtualBox";break;case"vmware":result2.virtualHost="VMware";break;case"kvm":result2.virtualHost="KVM";break;case"bochs":result2.virtualHost="bochs";break}}catch{util4.noop()}if(fs3.existsSync("/.dockerenv")||fs3.existsSync("/.dockerinit"))result2.model="Docker Container";try{let stdout2=
|
|
3221
|
+
echo -n "sys_vendor: "; cat /sys/devices/virtual/dmi/id/sys_vendor 2>/dev/null; echo;`;try{lines=execSync18(cmd,util4.execOptsLinux).toString().split(`
|
|
3222
|
+
`),result2.manufacturer=cleanDefaults(result2.manufacturer===""?util4.getValue(lines,"sys_vendor"):result2.manufacturer),result2.model=cleanDefaults(result2.model===""?util4.getValue(lines,"product_name"):result2.model),result2.version=cleanDefaults(result2.version===""?util4.getValue(lines,"product_version"):result2.version),result2.serial=cleanDefaults(result2.serial===""?util4.getValue(lines,"product_serial"):result2.serial),result2.uuid=cleanDefaults(result2.uuid===""?util4.getValue(lines,"product_uuid").toLowerCase():result2.uuid)}catch{util4.noop()}if(!result2.serial)result2.serial="-";if(!result2.manufacturer)result2.manufacturer="";if(!result2.model)result2.model="Computer";if(!result2.version)result2.version="";if(!result2.sku)result2.sku="-";if(result2.model.toLowerCase()==="virtualbox"||result2.model.toLowerCase()==="kvm"||result2.model.toLowerCase()==="virtual machine"||result2.model.toLowerCase()==="bochs"||result2.model.toLowerCase().startsWith("vmware")||result2.model.toLowerCase().startsWith("droplet"))switch(result2.virtual=!0,result2.model.toLowerCase()){case"virtualbox":result2.virtualHost="VirtualBox";break;case"vmware":result2.virtualHost="VMware";break;case"kvm":result2.virtualHost="KVM";break;case"bochs":result2.virtualHost="bochs";break}if(result2.manufacturer.toLowerCase().startsWith("vmware")||result2.manufacturer.toLowerCase()==="xen")switch(result2.virtual=!0,result2.manufacturer.toLowerCase()){case"vmware":result2.virtualHost="VMware";break;case"xen":result2.virtualHost="Xen";break}if(!result2.virtual)try{let disksById=execSync18("ls -1 /dev/disk/by-id/ 2>/dev/null; pciconf -lv 2>/dev/null",util4.execOptsLinux).toString();if(disksById.indexOf("_QEMU_")>=0||disksById.indexOf("QEMU ")>=0)result2.virtual=!0,result2.virtualHost="QEMU";if(disksById.indexOf("_VBOX_")>=0)result2.virtual=!0,result2.virtualHost="VirtualBox"}catch{util4.noop()}if(_freebsd||_openbsd||_netbsd)try{let lines2=execSync18("sysctl -i kern.hostuuid kern.hostid hw.model",util4.execOptsLinux).toString().split(`
|
|
3223
|
+
`);if(!result2.uuid)result2.uuid=util4.getValue(lines2,"kern.hostuuid",":").toLowerCase();if(!result2.serial||result2.serial==="-")result2.serial=util4.getValue(lines2,"kern.hostid",":").toLowerCase();if(!result2.model||result2.model==="Computer")result2.model=util4.getValue(lines2,"hw.model",":").trim()}catch{util4.noop()}if(!result2.virtual&&(os4.release().toLowerCase().indexOf("microsoft")>=0||os4.release().toLowerCase().endsWith("wsl2"))){let kernelVersion=parseFloat(os4.release().toLowerCase());result2.virtual=!0,result2.manufacturer="Microsoft",result2.model="WSL",result2.version=kernelVersion<4.19?"1":"2"}if((_freebsd||_openbsd||_netbsd)&&!result2.virtualHost)try{let procLines=execSync18("dmidecode -t 4",util4.execOptsLinux).toString().split(`
|
|
3224
|
+
`);switch(util4.getValue(procLines,"manufacturer",":",!0).toLowerCase()){case"virtualbox":result2.virtualHost="VirtualBox";break;case"vmware":result2.virtualHost="VMware";break;case"kvm":result2.virtualHost="KVM";break;case"bochs":result2.virtualHost="bochs";break}}catch{util4.noop()}if(fs3.existsSync("/.dockerenv")||fs3.existsSync("/.dockerinit"))result2.model="Docker Container";try{let stdout2=execSync18('dmesg 2>/dev/null | grep -iE "virtual|hypervisor" | grep -iE "vmware|qemu|kvm|xen" | grep -viE "Nested Virtualization|/virtual/"');if(stdout2.toString().split(`
|
|
3216
3225
|
`).length>0){if(result2.model==="Computer")result2.model="Virtual machine";if(result2.virtual=!0,stdout2.toString().toLowerCase().indexOf("vmware")>=0&&!result2.virtualHost)result2.virtualHost="VMware";if(stdout2.toString().toLowerCase().indexOf("qemu")>=0&&!result2.virtualHost)result2.virtualHost="QEMU";if(stdout2.toString().toLowerCase().indexOf("xen")>=0&&!result2.virtualHost)result2.virtualHost="Xen";if(stdout2.toString().toLowerCase().indexOf("kvm")>=0&&!result2.virtualHost)result2.virtualHost="KVM"}}catch{util4.noop()}if(result2.manufacturer===""&&result2.model==="Computer"&&result2.version==="")fs3.readFile("/proc/cpuinfo",(error3,stdout2)=>{if(!error3){let lines2=stdout2.toString().split(`
|
|
3217
3226
|
`);result2.model=util4.getValue(lines2,"hardware",":",!0).toUpperCase(),result2.version=util4.getValue(lines2,"revision",":",!0).toLowerCase(),result2.serial=util4.getValue(lines2,"serial",":",!0);let model=util4.getValue(lines2,"model:",":",!0);if(util4.isRaspberry(lines2)){let rPIRevision=util4.decodePiCpuinfo(lines2);result2.model=rPIRevision.model,result2.version=rPIRevision.revisionCode,result2.manufacturer="Raspberry Pi Foundation",result2.raspberry={manufacturer:rPIRevision.manufacturer,processor:rPIRevision.processor,type:rPIRevision.type,revision:rPIRevision.revision}}}if(callback)callback(result2);resolve14(result2)});else{if(callback)callback(result2);resolve14(result2)}});if(_darwin)exec3("ioreg -c IOPlatformExpertDevice -d 2",(error2,stdout)=>{if(!error2){let lines=stdout.toString().replace(/[<>"]/g,"").split(`
|
|
3218
3227
|
`),model=util4.getAppleModel(util4.getValue(lines,"model","=",!0));result2.manufacturer=util4.getValue(lines,"manufacturer","=",!0),result2.model=model.key,result2.type=macOsChassisType(model.version),result2.version=model.version,result2.serial=util4.getValue(lines,"ioplatformserialnumber","=",!0),result2.uuid=util4.getValue(lines,"ioplatformuuid","=",!0).toLowerCase(),result2.sku=util4.getValue(lines,"board-id","=",!0)||util4.getValue(lines,"target-sub-type","=",!0)}if(callback)callback(result2);resolve14(result2)});if(_sunos){if(callback)callback(result2);resolve14(result2)}if(_windows)try{util4.powerShell("Get-CimInstance Win32_ComputerSystemProduct | select Name,Vendor,Version,IdentifyingNumber,UUID | fl").then((stdout,error2)=>{if(!error2){let lines=stdout.split(`\r
|
|
@@ -3220,14 +3229,14 @@ echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`,(e
|
|
|
3220
3229
|
`);result2.sku=util4.getValue(lines2,"systemsku",":")}if(!result2.virtual)util4.powerShell("Get-CimInstance Win32_bios | select Version, SerialNumber, SMBIOSBIOSVersion").then((stdout3,error4)=>{if(!error4){let lines2=stdout3.toString();if(lines2.indexOf("VRTUAL")>=0||lines2.indexOf("A M I ")>=0||lines2.indexOf("VirtualBox")>=0||lines2.indexOf("VMWare")>=0||lines2.indexOf("Xen")>=0||lines2.indexOf("Parallels")>=0){if(result2.virtual=!0,lines2.indexOf("VirtualBox")>=0&&!result2.virtualHost)result2.virtualHost="VirtualBox";if(lines2.indexOf("VMware")>=0&&!result2.virtualHost)result2.virtualHost="VMware";if(lines2.indexOf("Xen")>=0&&!result2.virtualHost)result2.virtualHost="Xen";if(lines2.indexOf("VRTUAL")>=0&&!result2.virtualHost)result2.virtualHost="Hyper-V";if(lines2.indexOf("A M I")>=0&&!result2.virtualHost)result2.virtualHost="Virtual PC";if(lines2.indexOf("Parallels")>=0&&!result2.virtualHost)result2.virtualHost="Parallels"}if(callback)callback(result2);resolve14(result2)}else{if(callback)callback(result2);resolve14(result2)}});else{if(callback)callback(result2);resolve14(result2)}})}else{if(callback)callback(result2);resolve14(result2)}})}catch{if(callback)callback(result2);resolve14(result2)}})})}exports.system=system;function cleanDefaults(s2){let cmpStr=s2.toLowerCase();if(cmpStr.indexOf("o.e.m.")===-1&&cmpStr.indexOf("default string")===-1&&cmpStr!=="default")return s2||"";return""}function bios(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={vendor:"",version:"",releaseDate:"",revision:""},cmd="";if(_linux||_freebsd||_openbsd||_netbsd){if(process.arch==="arm")cmd="cat /proc/cpuinfo | grep Serial";else cmd="export LC_ALL=C; dmidecode -t bios 2>/dev/null; unset LC_ALL";exec3(cmd,(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3221
3230
|
`);result2.vendor=util4.getValue(lines,"Vendor"),result2.version=util4.getValue(lines,"Version");let datetime=util4.getValue(lines,"Release Date");result2.releaseDate=util4.parseDateTime(datetime).date,result2.revision=util4.getValue(lines,"BIOS Revision"),result2.serial=util4.getValue(lines,"SerialNumber");let language=util4.getValue(lines,"Currently Installed Language").split("|")[0];if(language)result2.language=language;if(lines.length&&stdout.toString().indexOf("Characteristics:")>=0){let features=[];lines.forEach((line)=>{if(line.indexOf(" is supported")>=0){let feature=line.split(" is supported")[0].trim();features.push(feature)}}),result2.features=features}let cmd2=`echo -n "bios_date: "; cat /sys/devices/virtual/dmi/id/bios_date 2>/dev/null; echo;
|
|
3222
3231
|
echo -n "bios_vendor: "; cat /sys/devices/virtual/dmi/id/bios_vendor 2>/dev/null; echo;
|
|
3223
|
-
echo -n "bios_version: "; cat /sys/devices/virtual/dmi/id/bios_version 2>/dev/null; echo;`;try{lines=
|
|
3232
|
+
echo -n "bios_version: "; cat /sys/devices/virtual/dmi/id/bios_version 2>/dev/null; echo;`;try{lines=execSync18(cmd2,util4.execOptsLinux).toString().split(`
|
|
3224
3233
|
`),result2.vendor=!result2.vendor?util4.getValue(lines,"bios_vendor"):result2.vendor,result2.version=!result2.version?util4.getValue(lines,"bios_version"):result2.version,datetime=util4.getValue(lines,"bios_date"),result2.releaseDate=!result2.releaseDate?util4.parseDateTime(datetime).date:result2.releaseDate}catch(e){util4.noop()}if(callback)callback(result2);resolve14(result2)})}if(_darwin)result2.vendor="Apple Inc.",exec3("system_profiler SPHardwareDataType -json",(error2,stdout)=>{try{let hardwareData=JSON.parse(stdout.toString());if(hardwareData&&hardwareData.SPHardwareDataType&&hardwareData.SPHardwareDataType.length){let bootRomVersion=hardwareData.SPHardwareDataType[0].boot_rom_version;bootRomVersion=bootRomVersion?bootRomVersion.split("(")[0].trim():null,result2.version=bootRomVersion}}catch(e){util4.noop()}if(callback)callback(result2);resolve14(result2)});if(_sunos){if(result2.vendor="Sun Microsystems",callback)callback(result2);resolve14(result2)}if(_windows)try{util4.powerShell('Get-CimInstance Win32_bios | select Description,Version,Manufacturer,@{n="ReleaseDate";e={$_.ReleaseDate.ToString("yyyy-MM-dd")}},BuildNumber,SerialNumber,SMBIOSBIOSVersion | fl').then((stdout,error2)=>{if(!error2){let lines=stdout.toString().split(`\r
|
|
3225
3234
|
`),description=util4.getValue(lines,"description",":"),version=util4.getValue(lines,"SMBIOSBIOSVersion",":");if(description.indexOf(" Version ")!==-1)result2.vendor=description.split(" Version ")[0].trim(),result2.version=description.split(" Version ")[1].trim();else if(description.indexOf(" Ver: ")!==-1)result2.vendor=util4.getValue(lines,"manufacturer",":"),result2.version=description.split(" Ver: ")[1].trim();else result2.vendor=util4.getValue(lines,"manufacturer",":"),result2.version=version||util4.getValue(lines,"version",":");result2.releaseDate=util4.getValue(lines,"releasedate",":"),result2.revision=util4.getValue(lines,"buildnumber",":"),result2.serial=cleanDefaults(util4.getValue(lines,"serialnumber",":"))}if(callback)callback(result2);resolve14(result2)})}catch(e){if(callback)callback(result2);resolve14(result2)}})})}exports.bios=bios;function baseboard(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={manufacturer:"",model:"",version:"",serial:"-",assetTag:"-",memMax:null,memSlots:null},cmd="";if(_linux||_freebsd||_openbsd||_netbsd){if(process.arch==="arm")cmd="cat /proc/cpuinfo | grep Serial";else cmd="export LC_ALL=C; dmidecode -t 2 2>/dev/null; unset LC_ALL";let workload=[];workload.push(execPromise(cmd)),workload.push(execPromise("export LC_ALL=C; dmidecode -t memory 2>/dev/null")),util4.promiseAll(workload).then((data)=>{let lines=data.results[0]?data.results[0].toString().split(`
|
|
3226
3235
|
`):[""];result2.manufacturer=cleanDefaults(util4.getValue(lines,"Manufacturer")),result2.model=cleanDefaults(util4.getValue(lines,"Product Name")),result2.version=cleanDefaults(util4.getValue(lines,"Version")),result2.serial=cleanDefaults(util4.getValue(lines,"Serial Number")),result2.assetTag=cleanDefaults(util4.getValue(lines,"Asset Tag"));let cmd2=`echo -n "board_asset_tag: "; cat /sys/devices/virtual/dmi/id/board_asset_tag 2>/dev/null; echo;
|
|
3227
3236
|
echo -n "board_name: "; cat /sys/devices/virtual/dmi/id/board_name 2>/dev/null; echo;
|
|
3228
3237
|
echo -n "board_serial: "; cat /sys/devices/virtual/dmi/id/board_serial 2>/dev/null; echo;
|
|
3229
3238
|
echo -n "board_vendor: "; cat /sys/devices/virtual/dmi/id/board_vendor 2>/dev/null; echo;
|
|
3230
|
-
echo -n "board_version: "; cat /sys/devices/virtual/dmi/id/board_version 2>/dev/null; echo;`;try{lines=
|
|
3239
|
+
echo -n "board_version: "; cat /sys/devices/virtual/dmi/id/board_version 2>/dev/null; echo;`;try{lines=execSync18(cmd2,util4.execOptsLinux).toString().split(`
|
|
3231
3240
|
`),result2.manufacturer=cleanDefaults(!result2.manufacturer?util4.getValue(lines,"board_vendor"):result2.manufacturer),result2.model=cleanDefaults(!result2.model?util4.getValue(lines,"board_name"):result2.model),result2.version=cleanDefaults(!result2.version?util4.getValue(lines,"board_version"):result2.version),result2.serial=cleanDefaults(!result2.serial?util4.getValue(lines,"board_serial"):result2.serial),result2.assetTag=cleanDefaults(!result2.assetTag?util4.getValue(lines,"board_asset_tag"):result2.assetTag)}catch{util4.noop()}if(lines=data.results[1]?data.results[1].toString().split(`
|
|
3232
3241
|
`):[""],result2.memMax=util4.toInt(util4.getValue(lines,"Maximum Capacity"))*1024*1024*1024||null,result2.memSlots=util4.toInt(util4.getValue(lines,"Number Of Devices"))||null,util4.isRaspberry()){let rpi=util4.decodePiCpuinfo();result2.manufacturer=rpi.manufacturer,result2.model="Raspberry Pi",result2.serial=rpi.serial,result2.version=rpi.type+" - "+rpi.revision,result2.memMax=os4.totalmem(),result2.memSlots=0}if(callback)callback(result2);resolve14(result2)})}if(_darwin){let workload=[];workload.push(execPromise("ioreg -c IOPlatformExpertDevice -d 2")),workload.push(execPromise("system_profiler SPMemoryDataType")),util4.promiseAll(workload).then((data)=>{let lines=data.results[0]?data.results[0].toString().replace(/[<>"]/g,"").split(`
|
|
3233
3242
|
`):[""];result2.manufacturer=util4.getValue(lines,"manufacturer","=",!0),result2.model=util4.getValue(lines,"model","=",!0),result2.version=util4.getValue(lines,"version","=",!0),result2.serial=util4.getValue(lines,"ioplatformserialnumber","=",!0),result2.assetTag=util4.getValue(lines,"board-id","=",!0);let devices=data.results[1]?data.results[1].toString().split(" BANK "):[""];if(devices.length===1)devices=data.results[1]?data.results[1].toString().split(" DIMM"):[""];if(devices.shift(),result2.memSlots=devices.length,os4.arch()==="arm64")result2.memSlots=0,result2.memMax=os4.totalmem();if(callback)callback(result2);resolve14(result2)})}if(_sunos){if(callback)callback(result2);resolve14(result2)}if(_windows)try{let workload=[],win10plus=parseInt(os4.release())>=10,maxCapacityAttribute=win10plus?"MaxCapacityEx":"MaxCapacity";workload.push(util4.powerShell("Get-CimInstance Win32_baseboard | select Model,Manufacturer,Product,Version,SerialNumber,PartNumber,SKU | fl")),workload.push(util4.powerShell(`Get-CimInstance Win32_physicalmemoryarray | select ${maxCapacityAttribute}, MemoryDevices | fl`)),util4.promiseAll(workload).then((data)=>{let lines=data.results[0]?data.results[0].toString().split(`\r
|
|
@@ -3239,16 +3248,16 @@ echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`,(e
|
|
|
3239
3248
|
echo -n "chassis_version: "; cat /sys/devices/virtual/dmi/id/chassis_version 2>/dev/null; echo;`,(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3240
3249
|
`);result2.manufacturer=cleanDefaults(util4.getValue(lines,"chassis_vendor"));let ctype=parseInt(util4.getValue(lines,"chassis_type").replace(/\D/g,""));if(result2.type=cleanDefaults(ctype&&!isNaN(ctype)&&ctype<chassisTypes.length?chassisTypes[ctype-1]:""),result2.version=cleanDefaults(util4.getValue(lines,"chassis_version")),result2.serial=cleanDefaults(util4.getValue(lines,"chassis_serial")),result2.assetTag=cleanDefaults(util4.getValue(lines,"chassis_asset_tag")),callback)callback(result2);resolve14(result2)});if(_darwin)exec3("ioreg -c IOPlatformExpertDevice -d 2",(error2,stdout)=>{if(!error2){let lines=stdout.toString().replace(/[<>"]/g,"").split(`
|
|
3241
3250
|
`),model=util4.getAppleModel(util4.getValue(lines,"model","=",!0));result2.manufacturer=util4.getValue(lines,"manufacturer","=",!0),result2.model=model.key,result2.type=macOsChassisType(model.model),result2.version=model.version,result2.serial=util4.getValue(lines,"ioplatformserialnumber","=",!0),result2.assetTag=util4.getValue(lines,"board-id","=",!0)||util4.getValue(lines,"target-type","=",!0),result2.sku=util4.getValue(lines,"target-sub-type","=",!0)}if(callback)callback(result2);resolve14(result2)});if(_sunos){if(callback)callback(result2);resolve14(result2)}if(_windows)try{util4.powerShell("Get-CimInstance Win32_SystemEnclosure | select Model,Manufacturer,ChassisTypes,Version,SerialNumber,PartNumber,SKU,SMBIOSAssetTag | fl").then((stdout,error2)=>{if(!error2){let lines=stdout.toString().split(`\r
|
|
3242
|
-
`);result2.manufacturer=cleanDefaults(util4.getValue(lines,"manufacturer",":")),result2.model=cleanDefaults(util4.getValue(lines,"model",":"));let ctype=parseInt(util4.getValue(lines,"ChassisTypes",":").replace(/\D/g,""));if(result2.type=ctype&&!isNaN(ctype)&&ctype<chassisTypes.length?chassisTypes[ctype-1]:"",result2.version=cleanDefaults(util4.getValue(lines,"version",":")),result2.serial=cleanDefaults(util4.getValue(lines,"serialnumber",":")),result2.assetTag=cleanDefaults(util4.getValue(lines,"partnumber",":")),!result2.assetTag)result2.assetTag=cleanDefaults(util4.getValue(lines,"SMBIOSAssetTag",":"));result2.sku=cleanDefaults(util4.getValue(lines,"sku",":"))}if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}})})}exports.chassis=chassis});var require_cpu=__commonJS((exports)=>{var os4=__require("os"),exec3=__require("child_process").exec,execSync19=__require("child_process").execSync,fs3=__require("fs"),util4=require_util3(),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos",_cpu_speed=0,_current_cpu={user:0,nice:0,system:0,idle:0,irq:0,steal:0,guest:0,load:0,tick:0,ms:0,currentLoad:0,currentLoadUser:0,currentLoadSystem:0,currentLoadNice:0,currentLoadIdle:0,currentLoadIrq:0,currentLoadSteal:0,currentLoadGuest:0,rawCurrentLoad:0,rawCurrentLoadUser:0,rawCurrentLoadSystem:0,rawCurrentLoadNice:0,rawCurrentLoadIdle:0,rawCurrentLoadIrq:0,rawCurrentLoadSteal:0,rawCurrentLoadGuest:0},_cpus=[],_corecount=0,AMDBaseFrequencies={8346:"1.8",8347:"1.9",8350:"2.0",8354:"2.2","8356|SE":"2.4",8356:"2.3",8360:"2.5",2372:"2.1",2373:"2.1",2374:"2.2",2376:"2.3",2377:"2.3",2378:"2.4",2379:"2.4",2380:"2.5",2381:"2.5",2382:"2.6",2384:"2.7",2386:"2.8",2387:"2.8",2389:"2.9",2393:"3.1",8374:"2.2",8376:"2.3",8378:"2.4",8379:"2.4",8380:"2.5",8381:"2.5",8382:"2.6",8384:"2.7",8386:"2.8",8387:"2.8",8389:"2.9",8393:"3.1","2419EE":"1.8","2423HE":"2.0","2425HE":"2.1",2427:"2.2",2431:"2.4",2435:"2.6","2439SE":"2.8","8425HE":"2.1",8431:"2.4",8435:"2.6","8439SE":"2.8",4122:"2.2",4130:"2.6","4162EE":"1.7","4164EE":"1.8","4170HE":"2.1","4174HE":"2.3","4176HE":"2.4",4180:"2.6",4184:"2.8","6124HE":"1.8","6128HE":"2.0","6132HE":"2.2",6128:"2.0",6134:"2.3",6136:"2.4",6140:"2.6","6164HE":"1.7","6166HE":"1.8",6168:"1.9",6172:"2.1",6174:"2.2",6176:"2.3","6176SE":"2.3","6180SE":"2.5",3250:"2.5",3260:"2.7",3280:"2.4",4226:"2.7",4228:"2.8",4230:"2.9",4234:"3.1",4238:"3.3",4240:"3.4",4256:"1.6",4274:"2.5",4276:"2.6",4280:"2.8",4284:"3.0",6204:"3.3",6212:"2.6",6220:"3.0",6234:"2.4",6238:"2.6","6262HE":"1.6",6272:"2.1",6274:"2.2",6276:"2.3",6278:"2.4","6282SE":"2.6","6284SE":"2.7",6308:"3.5",6320:"2.8",6328:"3.2","6338P":"2.3",6344:"2.6",6348:"2.8",6366:"1.8","6370P":"2.0",6376:"2.3",6378:"2.4",6380:"2.5",6386:"2.8","FX|4100":"3.6","FX|4120":"3.9","FX|4130":"3.8","FX|4150":"3.8","FX|4170":"4.2","FX|6100":"3.3","FX|6120":"3.6","FX|6130":"3.6","FX|6200":"3.8","FX|8100":"2.8","FX|8120":"3.1","FX|8140":"3.2","FX|8150":"3.6","FX|8170":"3.9","FX|4300":"3.8","FX|4320":"4.0","FX|4350":"4.2","FX|6300":"3.5","FX|6350":"3.9","FX|8300":"3.3","FX|8310":"3.4","FX|8320":"3.5","FX|8350":"4.0","FX|8370":"4.0","FX|9370":"4.4","FX|9590":"4.7","FX|8320E":"3.2","FX|8370E":"3.3",1200:"3.1","Pro 1200":"3.1","1300X":"3.5","Pro 1300":"3.5",1400:"3.2","1500X":"3.5","Pro 1500":"3.5",1600:"3.2","1600X":"3.6","Pro 1600":"3.2",1700:"3.0","Pro 1700":"3.0","1700X":"3.4","Pro 1700X":"3.4","1800X":"3.6","1900X":"3.8",1920:"3.2","1920X":"3.5","1950X":"3.4","200GE":"3.2","Pro 200GE":"3.2","220GE":"3.4","240GE":"3.5","3000G":"3.5","300GE":"3.4","3050GE":"3.4","2200G":"3.5","Pro 2200G":"3.5","2200GE":"3.2","Pro 2200GE":"3.2","2400G":"3.6","Pro 2400G":"3.6","2400GE":"3.2","Pro 2400GE":"3.2","Pro 200U":"2.3","300U":"2.4","2200U":"2.5","3200U":"2.6","2300U":"2.0","Pro 2300U":"2.0","2500U":"2.0","Pro 2500U":"2.2","2600H":"3.2","2700U":"2.0","Pro 2700U":"2.2","2800H":"3.3",7351:"2.4","7351P":"2.4",7401:"2.0","7401P":"2.0","7551P":"2.0",7551:"2.0",7251:"2.1",7261:"2.5",7281:"2.1",7301:"2.2",7371:"3.1",7451:"2.3",7501:"2.0",7571:"2.2",7601:"2.2",V1500B:"2.2",V1780B:"3.35",V1202B:"2.3",V1404I:"2.0",V1605B:"2.0",V1756B:"3.25",V1807B:"3.35",3101:"2.1",3151:"2.7",3201:"1.5",3251:"2.5",3255:"2.5",3301:"2.0",3351:"1.9",3401:"1.85",3451:"2.15","1200|AF":"3.1","2300X":"3.5","2500X":"3.6",2600:"3.4","2600E":"3.1","1600|AF":"3.2","2600X":"3.6",2700:"3.2","2700E":"2.8","Pro 2700":"3.2","2700X":"3.7","Pro 2700X":"3.6","2920X":"3.5","2950X":"3.5","2970WX":"3.0","2990WX":"3.0","Pro 300GE":"3.4","Pro 3125GE":"3.4","3150G":"3.5","Pro 3150G":"3.5","3150GE":"3.3","Pro 3150GE":"3.3","3200G":"3.6","Pro 3200G":"3.6","3200GE":"3.3","Pro 3200GE":"3.3","3350G":"3.6","Pro 3350G":"3.6","3350GE":"3.3","Pro 3350GE":"3.3","3400G":"3.7","Pro 3400G":"3.7","3400GE":"3.3","Pro 3400GE":"3.3","3300U":"2.1","PRO 3300U":"2.1","3450U":"2.1","3500U":"2.1","PRO 3500U":"2.1","3500C":"2.1","3550H":"2.1","3580U":"2.1","3700U":"2.3","PRO 3700U":"2.3","3700C":"2.3","3750H":"2.3","3780U":"2.3",3100:"3.6","3300X":"3.8",3500:"3.6","3500X":"3.6",3600:"3.6","Pro 3600":"3.6","3600X":"3.8","3600XT":"3.8","Pro 3700":"3.6","3700X":"3.6","3800X":"3.9","3800XT":"3.9",3900:"3.1","Pro 3900":"3.1","3900X":"3.8","3900XT":"3.8","3950X":"3.5","3960X":"3.8","3970X":"3.7","3990X":"2.9","3945WX":"4.0","3955WX":"3.9","3975WX":"3.5","3995WX":"2.7","4300GE":"3.5","Pro 4300GE":"3.5","4300G":"3.8","Pro 4300G":"3.8","4600GE":"3.3","Pro 4650GE":"3.3","4600G":"3.7","Pro 4650G":"3.7","4700GE":"3.1","Pro 4750GE":"3.1","4700G":"3.6","Pro 4750G":"3.6","4300U":"2.7","4450U":"2.5","Pro 4450U":"2.5","4500U":"2.3","4600U":"2.1","PRO 4650U":"2.1","4680U":"2.1","4600HS":"3.0","4600H":"3.0","4700U":"2.0","PRO 4750U":"1.7","4800U":"1.8","4800HS":"2.9","4800H":"2.9","4900HS":"3.0","4900H":"3.3","5300U":"2.6","5500U":"2.1","5700U":"1.8","7232P":"3.1","7302P":"3.0","7402P":"2.8","7502P":"2.5","7702P":"2.0",7252:"3.1",7262:"3.2",7272:"2.9",7282:"2.8",7302:"3.0",7352:"2.3",7402:"2.8",7452:"2.35",7502:"2.5",7532:"2.4",7542:"2.9",7552:"2.2",7642:"2.3",7662:"2.0",7702:"2.0",7742:"2.25","7H12":"2.6","7F32":"3.7","7F52":"3.5","7F72":"3.2","7773X":"2.2",7763:"2.45",7713:"2.0","7713P":"2.0",7663:"2.0",7643:"2.3","7573X":"2.8","75F3":"2.95",7543:"2.8","7543P":"2.8",7513:"2.6","7473X":"2.8",7453:"2.75","74F3":"3.2",7443:"2.85","7443P":"2.85",7413:"2.65","7373X":"3.05","73F3":"3.5",7343:"3.2",7313:"3.0","7313P":"3.0","72F3":"3.7","5600X":"3.7","5800X":"3.8","5900X":"3.7","5950X":"3.4","5945WX":"4.1","5955WX":"4.0","5965WX":"3.8","5975WX":"3.6","5995WX":"2.7","7960X":"4.2","7970X":"4.0","7980X":"3.2","7965WX":"4.2","7975WX":"4.0","7985WX":"3.2","7995WX":"2.5",9754:"2.25","9754S":"2.25",9734:"2.2","9684X":"2.55","9384X":"3.1","9184X":"3.55","9654P":"2.4",9654:"2.4",9634:"2.25","9554P":"3.1",9554:"3.1",9534:"2.45","9474F":"3.6","9454P":"2.75",9454:"2.75","9374F":"3.85","9354P":"3.25",9354:"3.25",9334:"2.7","9274F":"4.05",9254:"2.9",9224:"2.5","9174F":"4.1",9124:"3.0","4124P":"3.8","4244P":"3.8","4344P":"3.8","4364P":"4.5","4464P":"3.7","4484PX":"4.4","4564P":"4.5","4584PX":"4.2","8024P":"2.4","8024PN":"2.05","8124P":"2.45","8124PN":"2.0","8224P":"2.55","8224PN":"2.0","8324P":"2.65","8324PN":"2.05","8434P":"2.5","8434PN":"2.0","8534P":"2.3","8534PN":"2.0",9115:"2.6",9135:"3.65","9175F":"4.2",9255:"3.25","9275F":"4.1",9335:"3.0","9355P":"3.55",9355:"3.55","9375F":"3.8",9365:"3.4","9455P":"3.15",9455:"3.15","9475F":"3.65",9535:"2.4","9555P":"3.2",9555:"3.2","9575F":"3.3",9565:"3.15","9655P":"2.5",9655:"2.5",9755:"2.7","4245P":"3.9","4345P":"3.8","4465P":"3.4","4545P":"3.0","4565P":"4.3","4585PX":"4.3","5900XT":"3.3",5900:"3.0",5945:"3.0","5800X3D":"3.4","5800XT":"3.8",5800:"3.4","5700X3D":"3.0","5700X":"3.4",5845:"3.4","5600X3D":"3.3","5600XT":"3.7","5600T":"3.5",5600:"3.5","5600F":"3.0",5645:"3.7","5500X3D":"3.0","5980HX":"3.3","5980HS":"3.0","5900HX":"3.3","5900HS":"3.0","5800H":"3.2","5800HS":"2.8","5800U":"1.9","5600H":"3.3","5600HS":"3.0","5600U":"2.3","5560U":"2.3","5400U":"2.7","5825U":"2.0","5625U":"2.3","5425U":"2.7","5125C":"3.0","7730U":"2.0","7530U":"2.0","7430U":"2.3","7330U":"2.3",7203:"2.8",7303:"2.4","7663P":"2.0","6980HX":"3.3","6980HS":"3.3","6900HX":"3.3","6900HS":"3.3","6800H":"3.2","6800HS":"3.2","6800U":"2.7","6600H":"3.3","6600HS":"3.3","6600U":"2.9","7735HS":"3.2","7735H":"3.2","7736U":"2.7","7735U":"2.7","7435HS":"3.1","7435H":"3.1","7535HS":"3.3","7535H":"3.3","7535U":"2.9","7235HS":"3.2","7235H":"3.2","7335U":"3.0",270:"4.0",260:"3.8",250:"3.3",240:"4.3",230:"3.5",220:"3.0",210:"2.8","8945HS":"4.0","8845HS":"3.8","8840HS":"3.3","8840U":"3.3","8645HS":"4.3","8640HS":"3.5","8640U":"3.5","8540U":"3.0","8440U":"2.8","9950X3D":"4.3","9950X":"4.3","9900X3D":"4.4","9900X":"4.4","9800X3D":"4.7","9700X":"3.8","9700F":"3.8","9600X":"3.9",9600:"3.8","9500F":"3.8","9995WX":"2.5","9985WX":"3.2","9975WX":"4.0","9965WX":"4.2","9955WX":"4.5","9945WX":"4.7","9980X":"3.2","9970X":"4.0","9960X":"4.2","PRO HX375":"2.0",HX375:"2.0","PRO HX370":"2.0",HX370:"2.0",365:"2.0","PRO 360":"2.0",350:"2.0","PRO 350":"2.0",340:"2.0","PRO 340":"2.0",330:"2.0",395:"3.0","PRO 395":"3.0",390:"3.2","PRO 390":"3.2",385:"3.6","PRO 385":"3.6","PRO 380":"3.6","9955HX3D":"2.3","9955HX":"2.5","9850HX":"3.0",9015:"3.6",9965:"2.25",9845:"2.1",9825:"2.2",9745:"2.4",9645:"2.3"},socketTypes={1:"Other",2:"Unknown",3:"Daughter Board",4:"ZIF Socket",5:"Replacement/Piggy Back",6:"None",7:"LIF Socket",8:"Slot 1",9:"Slot 2",10:"370 Pin Socket",11:"Slot A",12:"Slot M",13:"423",14:"A (Socket 462)",15:"478",16:"754",17:"940",18:"939",19:"mPGA604",20:"LGA771",21:"LGA775",22:"S1",23:"AM2",24:"F (1207)",25:"LGA1366",26:"G34",27:"AM3",28:"C32",29:"LGA1156",30:"LGA1567",31:"PGA988A",32:"BGA1288",33:"rPGA988B",34:"BGA1023",35:"BGA1224",36:"LGA1155",37:"LGA1356",38:"LGA2011",39:"FS1",40:"FS2",41:"FM1",42:"FM2",43:"LGA2011-3",44:"LGA1356-3",45:"LGA1150",46:"BGA1168",47:"BGA1234",48:"BGA1364",49:"AM4",50:"LGA1151",51:"BGA1356",52:"BGA1440",53:"BGA1515",54:"LGA3647-1",55:"SP3",56:"SP3r2",57:"LGA2066",58:"BGA1392",59:"BGA1510",60:"BGA1528",61:"LGA4189",62:"LGA1200",63:"LGA4677",64:"LGA1700",65:"BGA1744",66:"BGA1781",67:"BGA1211",68:"BGA2422",69:"LGA1211",70:"LGA2422",71:"LGA5773",72:"BGA5773",73:"AM5",74:"SP5",75:"SP6",76:"BGA883",77:"BGA1190",78:"BGA4129",79:"LGA4710",80:"LGA7529",81:"BGA1964",82:"BGA1792",83:"BGA2049",84:"BGA2551",85:"LGA1851",86:"BGA2114",87:"BGA2833"},socketTypesByName={LGA1150:"i7-5775C i3-4340 i3-4170 G3250 i3-4160T i3-4160 E3-1231 G3258 G3240 i7-4790S i7-4790K i7-4790 i5-4690K i5-4690 i5-4590T i5-4590S i5-4590 i5-4460 i3-4360 i3-4150 G1820 G3420 G3220 i7-4771 i5-4440 i3-4330 i3-4130T i3-4130 E3-1230 i7-4770S i7-4770K i7-4770 i5-4670K i5-4670 i5-4570T i5-4570S i5-4570 i5-4430",LGA1151:"i9-9900KS E-2288G E-2224 G5420 i9-9900T i9-9900 i7-9700T i7-9700F i7-9700E i7-9700 i5-9600 i5-9500T i5-9500F i5-9500 i5-9400T i3-9350K i3-9300 i3-9100T i3-9100F i3-9100 G4930 i9-9900KF i7-9700KF i5-9600KF i5-9400F i5-9400 i3-9350KF i9-9900K i7-9700K i5-9600K G5500 G5400 i7-8700T i7-8086K i5-8600 i5-8500T i5-8500 i5-8400T i3-8300 i3-8100T G4900 i7-8700K i7-8700 i5-8600K i5-8400 i3-8350K i3-8100 E3-1270 G4600 G4560 i7-7700T i7-7700K i7-7700 i5-7600K i5-7600 i5-7500T i5-7500 i5-7400 i3-7350K i3-7300 i3-7100T i3-7100 G3930 G3900 G4400 i7-6700T i7-6700K i7-6700 i5-6600K i5-6600 i5-6500T i5-6500 i5-6400T i5-6400 i3-6300 i3-6100T i3-6100 E3-1270 E3-1270 T4500 T4400",1155:"G440 G460 G465 G470 G530T G540T G550T G1610T G1620T G530 G540 G1610 G550 G1620 G555 G1630 i3-2100T i3-2120T i3-3220T i3-3240T i3-3250T i3-2100 i3-2105 i3-2102 i3-3210 i3-3220 i3-2125 i3-2120 i3-3225 i3-2130 i3-3245 i3-3240 i3-3250 i5-3570T i5-2500T i5-2400S i5-2405S i5-2390T i5-3330S i5-2500S i5-3335S i5-2300 i5-3450S i5-3340S i5-3470S i5-3475S i5-3470T i5-2310 i5-3550S i5-2320 i5-3330 i5-3350P i5-3450 i5-2400 i5-3340 i5-3570S i5-2380P i5-2450P i5-3470 i5-2500K i5-3550 i5-2500 i5-3570 i5-3570K i5-2550K i7-3770T i7-2600S i7-3770S i7-2600K i7-2600 i7-3770 i7-3770K i7-2700K G620T G630T G640T G2020T G645T G2100T G2030T G622 G860T G620 G632 G2120T G630 G640 G2010 G840 G2020 G850 G645 G2030 G860 G2120 G870 G2130 G2140 E3-1220L E3-1220L E3-1260L E3-1265L E3-1220 E3-1225 E3-1220 E3-1235 E3-1225 E3-1230 E3-1230 E3-1240 E3-1245 E3-1270 E3-1275 E3-1240 E3-1245 E3-1270 E3-1280 E3-1275 E3-1290 E3-1280 E3-1290"};function getSocketTypesByName(str5){let result2="";for(let key in socketTypesByName)socketTypesByName[key].split(" ").forEach((element)=>{if(str5.indexOf(element)>=0)result2=key});return result2}function cpuManufacturer(str5){let result2=str5;if(str5=str5.toLowerCase(),str5.indexOf("intel")>=0)result2="Intel";if(str5.indexOf("amd")>=0)result2="AMD";if(str5.indexOf("qemu")>=0)result2="QEMU";if(str5.indexOf("hygon")>=0)result2="Hygon";if(str5.indexOf("centaur")>=0)result2="WinChip/Via";if(str5.indexOf("vmware")>=0)result2="VMware";if(str5.indexOf("Xen")>=0)result2="Xen Hypervisor";if(str5.indexOf("tcg")>=0)result2="QEMU";if(str5.indexOf("apple")>=0)result2="Apple";if(str5.indexOf("sifive")>=0)result2="SiFive";if(str5.indexOf("thead")>=0)result2="T-Head";if(str5.indexOf("andestech")>=0)result2="Andes Technology";return result2}function cpuBrandManufacturer(res){res.brand=res.brand.replace(/\(R\)+/g,"\xAE").replace(/\s+/g," ").trim(),res.brand=res.brand.replace(/\(TM\)+/g,"\u2122").replace(/\s+/g," ").trim(),res.brand=res.brand.replace(/\(C\)+/g,"\xA9").replace(/\s+/g," ").trim(),res.brand=res.brand.replace(/CPU+/g,"").replace(/\s+/g," ").trim(),res.manufacturer=cpuManufacturer(res.brand);let parts=res.brand.split(" ");return parts.shift(),res.brand=parts.join(" "),res}function getAMDSpeed(brand){let result2="0";for(let key in AMDBaseFrequencies)if({}.hasOwnProperty.call(AMDBaseFrequencies,key)){let parts=key.split("|"),found=0;if(parts.forEach((item)=>{if(brand.indexOf(item)>-1)found++}),found===parts.length)result2=AMDBaseFrequencies[key]}return parseFloat(result2)}function getCpu(){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={manufacturer:"unknown",brand:"unknown",vendor:"",family:"",model:"",stepping:"",revision:"",voltage:"",speed:0,speedMin:0,speedMax:0,governor:"",cores:util4.cores(),physicalCores:util4.cores(),performanceCores:util4.cores(),efficiencyCores:0,processors:1,socket:"",flags:"",virtualization:!1,cache:{}};cpuFlags().then((flags)=>{if(result2.flags=flags,result2.virtualization=flags.indexOf("vmx")>-1||flags.indexOf("svm")>-1,_darwin)exec3("sysctl machdep.cpu hw.cpufrequency_max hw.cpufrequency_min hw.packages hw.physicalcpu_max hw.ncpu hw.tbfrequency hw.cpufamily hw.cpusubfamily",(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3243
|
-
`),modellineParts=util4.getValue(lines,"machdep.cpu.brand_string").split("@");result2.brand=modellineParts[0].trim();let speed=modellineParts[1]?modellineParts[1].trim():"0";result2.speed=parseFloat(speed.replace(/GHz+/g,""));let tbFrequency=util4.getValue(lines,"hw.tbfrequency")/1e9;tbFrequency=tbFrequency<0.1?tbFrequency*100:tbFrequency,result2.speed=result2.speed===0?tbFrequency:result2.speed,_cpu_speed=result2.speed,result2=cpuBrandManufacturer(result2),result2.speedMin=util4.getValue(lines,"hw.cpufrequency_min")?util4.getValue(lines,"hw.cpufrequency_min")/1e9:result2.speed,result2.speedMax=util4.getValue(lines,"hw.cpufrequency_max")?util4.getValue(lines,"hw.cpufrequency_max")/1e9:result2.speed,result2.vendor=util4.getValue(lines,"machdep.cpu.vendor")||"Apple",result2.family=util4.getValue(lines,"machdep.cpu.family")||util4.getValue(lines,"hw.cpufamily"),result2.model=util4.getValue(lines,"machdep.cpu.model"),result2.stepping=util4.getValue(lines,"machdep.cpu.stepping")||util4.getValue(lines,"hw.cpusubfamily"),result2.virtualization=!0;let countProcessors=util4.getValue(lines,"hw.packages"),countCores=util4.getValue(lines,"hw.physicalcpu_max"),countThreads=util4.getValue(lines,"hw.ncpu");if(os4.arch()==="arm64"){result2.socket="SOC";try{let clusters=
|
|
3251
|
+
`);result2.manufacturer=cleanDefaults(util4.getValue(lines,"manufacturer",":")),result2.model=cleanDefaults(util4.getValue(lines,"model",":"));let ctype=parseInt(util4.getValue(lines,"ChassisTypes",":").replace(/\D/g,""));if(result2.type=ctype&&!isNaN(ctype)&&ctype<chassisTypes.length?chassisTypes[ctype-1]:"",result2.version=cleanDefaults(util4.getValue(lines,"version",":")),result2.serial=cleanDefaults(util4.getValue(lines,"serialnumber",":")),result2.assetTag=cleanDefaults(util4.getValue(lines,"partnumber",":")),!result2.assetTag)result2.assetTag=cleanDefaults(util4.getValue(lines,"SMBIOSAssetTag",":"));result2.sku=cleanDefaults(util4.getValue(lines,"sku",":"))}if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}})})}exports.chassis=chassis});var require_cpu=__commonJS((exports)=>{var os4=__require("os"),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,fs3=__require("fs"),util4=require_util3(),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos",_cpu_speed=0,_current_cpu={user:0,nice:0,system:0,idle:0,irq:0,steal:0,guest:0,load:0,tick:0,ms:0,currentLoad:0,currentLoadUser:0,currentLoadSystem:0,currentLoadNice:0,currentLoadIdle:0,currentLoadIrq:0,currentLoadSteal:0,currentLoadGuest:0,rawCurrentLoad:0,rawCurrentLoadUser:0,rawCurrentLoadSystem:0,rawCurrentLoadNice:0,rawCurrentLoadIdle:0,rawCurrentLoadIrq:0,rawCurrentLoadSteal:0,rawCurrentLoadGuest:0},_cpus=[],_corecount=0,AMDBaseFrequencies={8346:"1.8",8347:"1.9",8350:"2.0",8354:"2.2","8356|SE":"2.4",8356:"2.3",8360:"2.5",2372:"2.1",2373:"2.1",2374:"2.2",2376:"2.3",2377:"2.3",2378:"2.4",2379:"2.4",2380:"2.5",2381:"2.5",2382:"2.6",2384:"2.7",2386:"2.8",2387:"2.8",2389:"2.9",2393:"3.1",8374:"2.2",8376:"2.3",8378:"2.4",8379:"2.4",8380:"2.5",8381:"2.5",8382:"2.6",8384:"2.7",8386:"2.8",8387:"2.8",8389:"2.9",8393:"3.1","2419EE":"1.8","2423HE":"2.0","2425HE":"2.1",2427:"2.2",2431:"2.4",2435:"2.6","2439SE":"2.8","8425HE":"2.1",8431:"2.4",8435:"2.6","8439SE":"2.8",4122:"2.2",4130:"2.6","4162EE":"1.7","4164EE":"1.8","4170HE":"2.1","4174HE":"2.3","4176HE":"2.4",4180:"2.6",4184:"2.8","6124HE":"1.8","6128HE":"2.0","6132HE":"2.2",6128:"2.0",6134:"2.3",6136:"2.4",6140:"2.6","6164HE":"1.7","6166HE":"1.8",6168:"1.9",6172:"2.1",6174:"2.2",6176:"2.3","6176SE":"2.3","6180SE":"2.5",3250:"2.5",3260:"2.7",3280:"2.4",4226:"2.7",4228:"2.8",4230:"2.9",4234:"3.1",4238:"3.3",4240:"3.4",4256:"1.6",4274:"2.5",4276:"2.6",4280:"2.8",4284:"3.0",6204:"3.3",6212:"2.6",6220:"3.0",6234:"2.4",6238:"2.6","6262HE":"1.6",6272:"2.1",6274:"2.2",6276:"2.3",6278:"2.4","6282SE":"2.6","6284SE":"2.7",6308:"3.5",6320:"2.8",6328:"3.2","6338P":"2.3",6344:"2.6",6348:"2.8",6366:"1.8","6370P":"2.0",6376:"2.3",6378:"2.4",6380:"2.5",6386:"2.8","FX|4100":"3.6","FX|4120":"3.9","FX|4130":"3.8","FX|4150":"3.8","FX|4170":"4.2","FX|6100":"3.3","FX|6120":"3.6","FX|6130":"3.6","FX|6200":"3.8","FX|8100":"2.8","FX|8120":"3.1","FX|8140":"3.2","FX|8150":"3.6","FX|8170":"3.9","FX|4300":"3.8","FX|4320":"4.0","FX|4350":"4.2","FX|6300":"3.5","FX|6350":"3.9","FX|8300":"3.3","FX|8310":"3.4","FX|8320":"3.5","FX|8350":"4.0","FX|8370":"4.0","FX|9370":"4.4","FX|9590":"4.7","FX|8320E":"3.2","FX|8370E":"3.3",1200:"3.1","Pro 1200":"3.1","1300X":"3.5","Pro 1300":"3.5",1400:"3.2","1500X":"3.5","Pro 1500":"3.5",1600:"3.2","1600X":"3.6","Pro 1600":"3.2",1700:"3.0","Pro 1700":"3.0","1700X":"3.4","Pro 1700X":"3.4","1800X":"3.6","1900X":"3.8",1920:"3.2","1920X":"3.5","1950X":"3.4","200GE":"3.2","Pro 200GE":"3.2","220GE":"3.4","240GE":"3.5","3000G":"3.5","300GE":"3.4","3050GE":"3.4","2200G":"3.5","Pro 2200G":"3.5","2200GE":"3.2","Pro 2200GE":"3.2","2400G":"3.6","Pro 2400G":"3.6","2400GE":"3.2","Pro 2400GE":"3.2","Pro 200U":"2.3","300U":"2.4","2200U":"2.5","3200U":"2.6","2300U":"2.0","Pro 2300U":"2.0","2500U":"2.0","Pro 2500U":"2.2","2600H":"3.2","2700U":"2.0","Pro 2700U":"2.2","2800H":"3.3",7351:"2.4","7351P":"2.4",7401:"2.0","7401P":"2.0","7551P":"2.0",7551:"2.0",7251:"2.1",7261:"2.5",7281:"2.1",7301:"2.2",7371:"3.1",7451:"2.3",7501:"2.0",7571:"2.2",7601:"2.2",V1500B:"2.2",V1780B:"3.35",V1202B:"2.3",V1404I:"2.0",V1605B:"2.0",V1756B:"3.25",V1807B:"3.35",3101:"2.1",3151:"2.7",3201:"1.5",3251:"2.5",3255:"2.5",3301:"2.0",3351:"1.9",3401:"1.85",3451:"2.15","1200|AF":"3.1","2300X":"3.5","2500X":"3.6",2600:"3.4","2600E":"3.1","1600|AF":"3.2","2600X":"3.6",2700:"3.2","2700E":"2.8","Pro 2700":"3.2","2700X":"3.7","Pro 2700X":"3.6","2920X":"3.5","2950X":"3.5","2970WX":"3.0","2990WX":"3.0","Pro 300GE":"3.4","Pro 3125GE":"3.4","3150G":"3.5","Pro 3150G":"3.5","3150GE":"3.3","Pro 3150GE":"3.3","3200G":"3.6","Pro 3200G":"3.6","3200GE":"3.3","Pro 3200GE":"3.3","3350G":"3.6","Pro 3350G":"3.6","3350GE":"3.3","Pro 3350GE":"3.3","3400G":"3.7","Pro 3400G":"3.7","3400GE":"3.3","Pro 3400GE":"3.3","3300U":"2.1","PRO 3300U":"2.1","3450U":"2.1","3500U":"2.1","PRO 3500U":"2.1","3500C":"2.1","3550H":"2.1","3580U":"2.1","3700U":"2.3","PRO 3700U":"2.3","3700C":"2.3","3750H":"2.3","3780U":"2.3",3100:"3.6","3300X":"3.8",3500:"3.6","3500X":"3.6",3600:"3.6","Pro 3600":"3.6","3600X":"3.8","3600XT":"3.8","Pro 3700":"3.6","3700X":"3.6","3800X":"3.9","3800XT":"3.9",3900:"3.1","Pro 3900":"3.1","3900X":"3.8","3900XT":"3.8","3950X":"3.5","3960X":"3.8","3970X":"3.7","3990X":"2.9","3945WX":"4.0","3955WX":"3.9","3975WX":"3.5","3995WX":"2.7","4300GE":"3.5","Pro 4300GE":"3.5","4300G":"3.8","Pro 4300G":"3.8","4600GE":"3.3","Pro 4650GE":"3.3","4600G":"3.7","Pro 4650G":"3.7","4700GE":"3.1","Pro 4750GE":"3.1","4700G":"3.6","Pro 4750G":"3.6","4300U":"2.7","4450U":"2.5","Pro 4450U":"2.5","4500U":"2.3","4600U":"2.1","PRO 4650U":"2.1","4680U":"2.1","4600HS":"3.0","4600H":"3.0","4700U":"2.0","PRO 4750U":"1.7","4800U":"1.8","4800HS":"2.9","4800H":"2.9","4900HS":"3.0","4900H":"3.3","5300U":"2.6","5500U":"2.1","5700U":"1.8","7232P":"3.1","7302P":"3.0","7402P":"2.8","7502P":"2.5","7702P":"2.0",7252:"3.1",7262:"3.2",7272:"2.9",7282:"2.8",7302:"3.0",7352:"2.3",7402:"2.8",7452:"2.35",7502:"2.5",7532:"2.4",7542:"2.9",7552:"2.2",7642:"2.3",7662:"2.0",7702:"2.0",7742:"2.25","7H12":"2.6","7F32":"3.7","7F52":"3.5","7F72":"3.2","7773X":"2.2",7763:"2.45",7713:"2.0","7713P":"2.0",7663:"2.0",7643:"2.3","7573X":"2.8","75F3":"2.95",7543:"2.8","7543P":"2.8",7513:"2.6","7473X":"2.8",7453:"2.75","74F3":"3.2",7443:"2.85","7443P":"2.85",7413:"2.65","7373X":"3.05","73F3":"3.5",7343:"3.2",7313:"3.0","7313P":"3.0","72F3":"3.7","5600X":"3.7","5800X":"3.8","5900X":"3.7","5950X":"3.4","5945WX":"4.1","5955WX":"4.0","5965WX":"3.8","5975WX":"3.6","5995WX":"2.7","7960X":"4.2","7970X":"4.0","7980X":"3.2","7965WX":"4.2","7975WX":"4.0","7985WX":"3.2","7995WX":"2.5",9754:"2.25","9754S":"2.25",9734:"2.2","9684X":"2.55","9384X":"3.1","9184X":"3.55","9654P":"2.4",9654:"2.4",9634:"2.25","9554P":"3.1",9554:"3.1",9534:"2.45","9474F":"3.6","9454P":"2.75",9454:"2.75","9374F":"3.85","9354P":"3.25",9354:"3.25",9334:"2.7","9274F":"4.05",9254:"2.9",9224:"2.5","9174F":"4.1",9124:"3.0","4124P":"3.8","4244P":"3.8","4344P":"3.8","4364P":"4.5","4464P":"3.7","4484PX":"4.4","4564P":"4.5","4584PX":"4.2","8024P":"2.4","8024PN":"2.05","8124P":"2.45","8124PN":"2.0","8224P":"2.55","8224PN":"2.0","8324P":"2.65","8324PN":"2.05","8434P":"2.5","8434PN":"2.0","8534P":"2.3","8534PN":"2.0",9115:"2.6",9135:"3.65","9175F":"4.2",9255:"3.25","9275F":"4.1",9335:"3.0","9355P":"3.55",9355:"3.55","9375F":"3.8",9365:"3.4","9455P":"3.15",9455:"3.15","9475F":"3.65",9535:"2.4","9555P":"3.2",9555:"3.2","9575F":"3.3",9565:"3.15","9655P":"2.5",9655:"2.5",9755:"2.7","4245P":"3.9","4345P":"3.8","4465P":"3.4","4545P":"3.0","4565P":"4.3","4585PX":"4.3","5900XT":"3.3",5900:"3.0",5945:"3.0","5800X3D":"3.4","5800XT":"3.8",5800:"3.4","5700X3D":"3.0","5700X":"3.4",5845:"3.4","5600X3D":"3.3","5600XT":"3.7","5600T":"3.5",5600:"3.5","5600F":"3.0",5645:"3.7","5500X3D":"3.0","5980HX":"3.3","5980HS":"3.0","5900HX":"3.3","5900HS":"3.0","5800H":"3.2","5800HS":"2.8","5800U":"1.9","5600H":"3.3","5600HS":"3.0","5600U":"2.3","5560U":"2.3","5400U":"2.7","5825U":"2.0","5625U":"2.3","5425U":"2.7","5125C":"3.0","7730U":"2.0","7530U":"2.0","7430U":"2.3","7330U":"2.3",7203:"2.8",7303:"2.4","7663P":"2.0","6980HX":"3.3","6980HS":"3.3","6900HX":"3.3","6900HS":"3.3","6800H":"3.2","6800HS":"3.2","6800U":"2.7","6600H":"3.3","6600HS":"3.3","6600U":"2.9","7735HS":"3.2","7735H":"3.2","7736U":"2.7","7735U":"2.7","7435HS":"3.1","7435H":"3.1","7535HS":"3.3","7535H":"3.3","7535U":"2.9","7235HS":"3.2","7235H":"3.2","7335U":"3.0",270:"4.0",260:"3.8",250:"3.3",240:"4.3",230:"3.5",220:"3.0",210:"2.8","8945HS":"4.0","8845HS":"3.8","8840HS":"3.3","8840U":"3.3","8645HS":"4.3","8640HS":"3.5","8640U":"3.5","8540U":"3.0","8440U":"2.8","9950X3D":"4.3","9950X":"4.3","9900X3D":"4.4","9900X":"4.4","9800X3D":"4.7","9700X":"3.8","9700F":"3.8","9600X":"3.9",9600:"3.8","9500F":"3.8","9995WX":"2.5","9985WX":"3.2","9975WX":"4.0","9965WX":"4.2","9955WX":"4.5","9945WX":"4.7","9980X":"3.2","9970X":"4.0","9960X":"4.2","PRO HX375":"2.0",HX375:"2.0","PRO HX370":"2.0",HX370:"2.0",365:"2.0","PRO 360":"2.0",350:"2.0","PRO 350":"2.0",340:"2.0","PRO 340":"2.0",330:"2.0",395:"3.0","PRO 395":"3.0",390:"3.2","PRO 390":"3.2",385:"3.6","PRO 385":"3.6","PRO 380":"3.6","9955HX3D":"2.3","9955HX":"2.5","9850HX":"3.0",9015:"3.6",9965:"2.25",9845:"2.1",9825:"2.2",9745:"2.4",9645:"2.3"},socketTypes={1:"Other",2:"Unknown",3:"Daughter Board",4:"ZIF Socket",5:"Replacement/Piggy Back",6:"None",7:"LIF Socket",8:"Slot 1",9:"Slot 2",10:"370 Pin Socket",11:"Slot A",12:"Slot M",13:"423",14:"A (Socket 462)",15:"478",16:"754",17:"940",18:"939",19:"mPGA604",20:"LGA771",21:"LGA775",22:"S1",23:"AM2",24:"F (1207)",25:"LGA1366",26:"G34",27:"AM3",28:"C32",29:"LGA1156",30:"LGA1567",31:"PGA988A",32:"BGA1288",33:"rPGA988B",34:"BGA1023",35:"BGA1224",36:"LGA1155",37:"LGA1356",38:"LGA2011",39:"FS1",40:"FS2",41:"FM1",42:"FM2",43:"LGA2011-3",44:"LGA1356-3",45:"LGA1150",46:"BGA1168",47:"BGA1234",48:"BGA1364",49:"AM4",50:"LGA1151",51:"BGA1356",52:"BGA1440",53:"BGA1515",54:"LGA3647-1",55:"SP3",56:"SP3r2",57:"LGA2066",58:"BGA1392",59:"BGA1510",60:"BGA1528",61:"LGA4189",62:"LGA1200",63:"LGA4677",64:"LGA1700",65:"BGA1744",66:"BGA1781",67:"BGA1211",68:"BGA2422",69:"LGA1211",70:"LGA2422",71:"LGA5773",72:"BGA5773",73:"AM5",74:"SP5",75:"SP6",76:"BGA883",77:"BGA1190",78:"BGA4129",79:"LGA4710",80:"LGA7529",81:"BGA1964",82:"BGA1792",83:"BGA2049",84:"BGA2551",85:"LGA1851",86:"BGA2114",87:"BGA2833"},socketTypesByName={LGA1150:"i7-5775C i3-4340 i3-4170 G3250 i3-4160T i3-4160 E3-1231 G3258 G3240 i7-4790S i7-4790K i7-4790 i5-4690K i5-4690 i5-4590T i5-4590S i5-4590 i5-4460 i3-4360 i3-4150 G1820 G3420 G3220 i7-4771 i5-4440 i3-4330 i3-4130T i3-4130 E3-1230 i7-4770S i7-4770K i7-4770 i5-4670K i5-4670 i5-4570T i5-4570S i5-4570 i5-4430",LGA1151:"i9-9900KS E-2288G E-2224 G5420 i9-9900T i9-9900 i7-9700T i7-9700F i7-9700E i7-9700 i5-9600 i5-9500T i5-9500F i5-9500 i5-9400T i3-9350K i3-9300 i3-9100T i3-9100F i3-9100 G4930 i9-9900KF i7-9700KF i5-9600KF i5-9400F i5-9400 i3-9350KF i9-9900K i7-9700K i5-9600K G5500 G5400 i7-8700T i7-8086K i5-8600 i5-8500T i5-8500 i5-8400T i3-8300 i3-8100T G4900 i7-8700K i7-8700 i5-8600K i5-8400 i3-8350K i3-8100 E3-1270 G4600 G4560 i7-7700T i7-7700K i7-7700 i5-7600K i5-7600 i5-7500T i5-7500 i5-7400 i3-7350K i3-7300 i3-7100T i3-7100 G3930 G3900 G4400 i7-6700T i7-6700K i7-6700 i5-6600K i5-6600 i5-6500T i5-6500 i5-6400T i5-6400 i3-6300 i3-6100T i3-6100 E3-1270 E3-1270 T4500 T4400",1155:"G440 G460 G465 G470 G530T G540T G550T G1610T G1620T G530 G540 G1610 G550 G1620 G555 G1630 i3-2100T i3-2120T i3-3220T i3-3240T i3-3250T i3-2100 i3-2105 i3-2102 i3-3210 i3-3220 i3-2125 i3-2120 i3-3225 i3-2130 i3-3245 i3-3240 i3-3250 i5-3570T i5-2500T i5-2400S i5-2405S i5-2390T i5-3330S i5-2500S i5-3335S i5-2300 i5-3450S i5-3340S i5-3470S i5-3475S i5-3470T i5-2310 i5-3550S i5-2320 i5-3330 i5-3350P i5-3450 i5-2400 i5-3340 i5-3570S i5-2380P i5-2450P i5-3470 i5-2500K i5-3550 i5-2500 i5-3570 i5-3570K i5-2550K i7-3770T i7-2600S i7-3770S i7-2600K i7-2600 i7-3770 i7-3770K i7-2700K G620T G630T G640T G2020T G645T G2100T G2030T G622 G860T G620 G632 G2120T G630 G640 G2010 G840 G2020 G850 G645 G2030 G860 G2120 G870 G2130 G2140 E3-1220L E3-1220L E3-1260L E3-1265L E3-1220 E3-1225 E3-1220 E3-1235 E3-1225 E3-1230 E3-1230 E3-1240 E3-1245 E3-1270 E3-1275 E3-1240 E3-1245 E3-1270 E3-1280 E3-1275 E3-1290 E3-1280 E3-1290"};function getSocketTypesByName(str5){let result2="";for(let key in socketTypesByName)socketTypesByName[key].split(" ").forEach((element)=>{if(str5.indexOf(element)>=0)result2=key});return result2}function cpuManufacturer(str5){let result2=str5;if(str5=str5.toLowerCase(),str5.indexOf("intel")>=0)result2="Intel";if(str5.indexOf("amd")>=0)result2="AMD";if(str5.indexOf("qemu")>=0)result2="QEMU";if(str5.indexOf("hygon")>=0)result2="Hygon";if(str5.indexOf("centaur")>=0)result2="WinChip/Via";if(str5.indexOf("vmware")>=0)result2="VMware";if(str5.indexOf("Xen")>=0)result2="Xen Hypervisor";if(str5.indexOf("tcg")>=0)result2="QEMU";if(str5.indexOf("apple")>=0)result2="Apple";if(str5.indexOf("sifive")>=0)result2="SiFive";if(str5.indexOf("thead")>=0)result2="T-Head";if(str5.indexOf("andestech")>=0)result2="Andes Technology";return result2}function cpuBrandManufacturer(res){res.brand=res.brand.replace(/\(R\)+/g,"\xAE").replace(/\s+/g," ").trim(),res.brand=res.brand.replace(/\(TM\)+/g,"\u2122").replace(/\s+/g," ").trim(),res.brand=res.brand.replace(/\(C\)+/g,"\xA9").replace(/\s+/g," ").trim(),res.brand=res.brand.replace(/CPU+/g,"").replace(/\s+/g," ").trim(),res.manufacturer=cpuManufacturer(res.brand);let parts=res.brand.split(" ");return parts.shift(),res.brand=parts.join(" "),res}function getAMDSpeed(brand){let result2="0";for(let key in AMDBaseFrequencies)if({}.hasOwnProperty.call(AMDBaseFrequencies,key)){let parts=key.split("|"),found=0;if(parts.forEach((item)=>{if(brand.indexOf(item)>-1)found++}),found===parts.length)result2=AMDBaseFrequencies[key]}return parseFloat(result2)}function getCpu(){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={manufacturer:"unknown",brand:"unknown",vendor:"",family:"",model:"",stepping:"",revision:"",voltage:"",speed:0,speedMin:0,speedMax:0,governor:"",cores:util4.cores(),physicalCores:util4.cores(),performanceCores:util4.cores(),efficiencyCores:0,processors:1,socket:"",flags:"",virtualization:!1,cache:{}};cpuFlags().then((flags)=>{if(result2.flags=flags,result2.virtualization=flags.indexOf("vmx")>-1||flags.indexOf("svm")>-1,_darwin)exec3("sysctl machdep.cpu hw.cpufrequency_max hw.cpufrequency_min hw.packages hw.physicalcpu_max hw.ncpu hw.tbfrequency hw.cpufamily hw.cpusubfamily",(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3252
|
+
`),modellineParts=util4.getValue(lines,"machdep.cpu.brand_string").split("@");result2.brand=modellineParts[0].trim();let speed=modellineParts[1]?modellineParts[1].trim():"0";result2.speed=parseFloat(speed.replace(/GHz+/g,""));let tbFrequency=util4.getValue(lines,"hw.tbfrequency")/1e9;tbFrequency=tbFrequency<0.1?tbFrequency*100:tbFrequency,result2.speed=result2.speed===0?tbFrequency:result2.speed,_cpu_speed=result2.speed,result2=cpuBrandManufacturer(result2),result2.speedMin=util4.getValue(lines,"hw.cpufrequency_min")?util4.getValue(lines,"hw.cpufrequency_min")/1e9:result2.speed,result2.speedMax=util4.getValue(lines,"hw.cpufrequency_max")?util4.getValue(lines,"hw.cpufrequency_max")/1e9:result2.speed,result2.vendor=util4.getValue(lines,"machdep.cpu.vendor")||"Apple",result2.family=util4.getValue(lines,"machdep.cpu.family")||util4.getValue(lines,"hw.cpufamily"),result2.model=util4.getValue(lines,"machdep.cpu.model"),result2.stepping=util4.getValue(lines,"machdep.cpu.stepping")||util4.getValue(lines,"hw.cpusubfamily"),result2.virtualization=!0;let countProcessors=util4.getValue(lines,"hw.packages"),countCores=util4.getValue(lines,"hw.physicalcpu_max"),countThreads=util4.getValue(lines,"hw.ncpu");if(os4.arch()==="arm64"){result2.socket="SOC";try{let clusters=execSync18("ioreg -c IOPlatformDevice -d 3 -r | grep cluster-type").toString().split(`
|
|
3244
3253
|
`),efficiencyCores=clusters.filter((line)=>line.indexOf('"E"')>=0).length,performanceCores=clusters.filter((line)=>line.indexOf('"P"')>=0).length;result2.efficiencyCores=efficiencyCores,result2.performanceCores=performanceCores}catch{util4.noop()}}if(countProcessors)result2.processors=parseInt(countProcessors,10)||1;if(countCores&&countThreads)result2.cores=parseInt(countThreads)||util4.cores(),result2.physicalCores=parseInt(countCores)||util4.cores();cpuCache().then((res)=>{result2.cache=res,resolve14(result2)})});if(_linux){let modelline="",lines=[];if(os4.cpus()[0]&&os4.cpus()[0].model)modelline=os4.cpus()[0].model;exec3('export LC_ALL=C; lscpu; echo -n "Governor: "; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null; echo; unset LC_ALL',(error2,stdout)=>{if(!error2)lines=stdout.toString().split(`
|
|
3245
3254
|
`);modelline=util4.getValue(lines,"model name")||modelline,modelline=util4.getValue(lines,"bios model name")||modelline,modelline=util4.cleanString(modelline);let modellineParts=modelline.split("@");if(result2.brand=modellineParts[0].trim(),result2.brand.indexOf("Unknown")>=0)result2.brand=result2.brand.split("Unknown")[0].trim();if(result2.speed=modellineParts[1]?parseFloat(modellineParts[1].trim()):0,result2.speed===0&&(result2.brand.indexOf("AMD")>-1||result2.brand.toLowerCase().indexOf("ryzen")>-1))result2.speed=getAMDSpeed(result2.brand);if(result2.speed===0){let current=getCpuCurrentSpeedSync();if(current.avg!==0)result2.speed=current.avg}if(_cpu_speed=result2.speed,result2.speedMin=Math.round(parseFloat(util4.getValue(lines,"cpu min mhz").replace(/,/g,"."))/10)/100,result2.speedMax=Math.round(parseFloat(util4.getValue(lines,"cpu max mhz").replace(/,/g,"."))/10)/100,result2=cpuBrandManufacturer(result2),result2.vendor=cpuManufacturer(util4.getValue(lines,"vendor id")),result2.family=util4.getValue(lines,"cpu family"),result2.model=util4.getValue(lines,"model:"),result2.stepping=util4.getValue(lines,"stepping"),result2.revision=util4.getValue(lines,"cpu revision"),result2.cache.l1d=util4.getValue(lines,"l1d cache"),result2.cache.l1d)result2.cache.l1d=parseInt(result2.cache.l1d)*(result2.cache.l1d.indexOf("M")!==-1?1048576:result2.cache.l1d.indexOf("K")!==-1?1024:1);if(result2.cache.l1i=util4.getValue(lines,"l1i cache"),result2.cache.l1i)result2.cache.l1i=parseInt(result2.cache.l1i)*(result2.cache.l1i.indexOf("M")!==-1?1048576:result2.cache.l1i.indexOf("K")!==-1?1024:1);if(result2.cache.l2=util4.getValue(lines,"l2 cache"),result2.cache.l2)result2.cache.l2=parseInt(result2.cache.l2)*(result2.cache.l2.indexOf("M")!==-1?1048576:result2.cache.l2.indexOf("K")!==-1?1024:1);if(result2.cache.l3=util4.getValue(lines,"l3 cache"),result2.cache.l3)result2.cache.l3=parseInt(result2.cache.l3)*(result2.cache.l3.indexOf("M")!==-1?1048576:result2.cache.l3.indexOf("K")!==-1?1024:1);let threadsPerCore=util4.getValue(lines,"thread(s) per core")||"1",processors=util4.getValue(lines,"socket(s)")||"1",threadsPerCoreInt=parseInt(threadsPerCore,10),processorsInt=parseInt(processors,10)||1,coresPerSocket=parseInt(util4.getValue(lines,"core(s) per socket"),10);if(result2.physicalCores=coresPerSocket?coresPerSocket*processorsInt:result2.cores/threadsPerCoreInt,result2.performanceCores=threadsPerCoreInt>1?result2.cores-result2.physicalCores:result2.cores,result2.efficiencyCores=threadsPerCoreInt>1?result2.cores-threadsPerCoreInt*result2.performanceCores:0,result2.processors=processorsInt,result2.governor=util4.getValue(lines,"governor")||"",result2.vendor==="ARM"&&util4.isRaspberry()){let rPIRevision=util4.decodePiCpuinfo();result2.family=result2.manufacturer,result2.manufacturer=rPIRevision.manufacturer,result2.brand=rPIRevision.processor,result2.revision=rPIRevision.revisionCode,result2.socket="SOC"}if(util4.getValue(lines,"architecture")==="riscv64"){let linesRiscV=fs3.readFileSync("/proc/cpuinfo").toString().split(`
|
|
3246
3255
|
`),uarch=util4.getValue(linesRiscV,"uarch")||"";if(uarch.indexOf(",")>-1){let split=uarch.split(",");result2.manufacturer=cpuManufacturer(split[0]),result2.brand=split[1]}}let lines2=[];exec3('export LC_ALL=C; dmidecode \u2013t 4 2>/dev/null | grep "Upgrade: Socket"; unset LC_ALL',(error22,stdout2)=>{if(lines2=stdout2.toString().split(`
|
|
3247
3256
|
`),lines2&&lines2.length)result2.socket=util4.getValue(lines2,"Upgrade").replace("Socket","").trim()||result2.socket;resolve14(result2)})})}if(_freebsd||_openbsd||_netbsd){let modelline="",lines=[];if(os4.cpus()[0]&&os4.cpus()[0].model)modelline=os4.cpus()[0].model;exec3("export LC_ALL=C; dmidecode -t 4; dmidecode -t 7 unset LC_ALL",(error2,stdout)=>{let cache=[];if(!error2){let data=stdout.toString().split("# dmidecode"),processor=data.length>1?data[1]:"";cache=data.length>2?data[2].split("Cache Information"):[],lines=processor.split(`
|
|
3248
3257
|
`)}if(result2.brand=modelline.split("@")[0].trim(),result2.speed=modelline.split("@")[1]?parseFloat(modelline.split("@")[1].trim()):0,result2.speed===0&&(result2.brand.indexOf("AMD")>-1||result2.brand.toLowerCase().indexOf("ryzen")>-1))result2.speed=getAMDSpeed(result2.brand);if(result2.speed===0){let current=getCpuCurrentSpeedSync();if(current.avg!==0)result2.speed=current.avg}_cpu_speed=result2.speed,result2.speedMin=result2.speed,result2.speedMax=Math.round(parseFloat(util4.getValue(lines,"max speed").replace(/Mhz/g,""))/10)/100,result2=cpuBrandManufacturer(result2),result2.vendor=cpuManufacturer(util4.getValue(lines,"manufacturer"));let sig=util4.getValue(lines,"signature");sig=sig.split(",");for(let i2=0;i2<sig.length;i2++)sig[i2]=sig[i2].trim();result2.family=util4.getValue(sig,"Family"," ",!0),result2.model=util4.getValue(sig,"Model"," ",!0),result2.stepping=util4.getValue(sig,"Stepping"," ",!0),result2.revision="";let voltage=parseFloat(util4.getValue(lines,"voltage"));result2.voltage=isNaN(voltage)?"":voltage.toFixed(2);for(let i2=0;i2<cache.length;i2++){lines=cache[i2].split(`
|
|
3249
3258
|
`);let cacheType=util4.getValue(lines,"Socket Designation").toLowerCase().replace(" ","-").split("-");cacheType=cacheType.length?cacheType[0]:"";let sizeParts=util4.getValue(lines,"Installed Size").split(" "),size=parseInt(sizeParts[0],10),unit=sizeParts.length>1?sizeParts[1]:"kb";if(size=size*(unit==="kb"?1024:unit==="mb"?1048576:unit==="gb"?1073741824:1),cacheType)if(cacheType==="l1")result2.cache[cacheType+"d"]=size/2,result2.cache[cacheType+"i"]=size/2;else result2.cache[cacheType]=size}result2.socket=util4.getValue(lines,"Upgrade").replace("Socket","").trim();let threadCount=util4.getValue(lines,"thread count").trim(),coreCount=util4.getValue(lines,"core count").trim();if(coreCount&&threadCount)result2.cores=parseInt(threadCount,10),result2.physicalCores=parseInt(coreCount,10);resolve14(result2)})}if(_sunos)resolve14(result2);if(_windows)try{let workload=[];workload.push(util4.powerShell("Get-CimInstance Win32_processor | select Name, Revision, L2CacheSize, L3CacheSize, Manufacturer, MaxClockSpeed, Description, UpgradeMethod, Caption, NumberOfLogicalProcessors, NumberOfCores | fl")),workload.push(util4.powerShell("Get-CimInstance Win32_CacheMemory | select CacheType,InstalledSize,Level | fl")),workload.push(util4.powerShell("(Get-CimInstance Win32_ComputerSystem).HypervisorPresent")),Promise.all(workload).then((data)=>{let lines=data[0].split(`\r
|
|
3250
|
-
`),name=util4.getValue(lines,"name",":")||"";if(name.indexOf("@")>=0)result2.brand=name.split("@")[0].trim(),result2.speed=name.split("@")[1]?parseFloat(name.split("@")[1].trim()):0,_cpu_speed=result2.speed;else result2.brand=name.trim(),result2.speed=0;if(result2=cpuBrandManufacturer(result2),result2.revision=util4.getValue(lines,"revision",":"),result2.vendor=util4.getValue(lines,"manufacturer",":"),result2.speedMax=Math.round(parseFloat(util4.getValue(lines,"maxclockspeed",":").replace(/,/g,"."))/10)/100,result2.speed===0&&(result2.brand.indexOf("AMD")>-1||result2.brand.toLowerCase().indexOf("ryzen")>-1))result2.speed=getAMDSpeed(result2.brand);if(result2.speed===0)result2.speed=result2.speedMax;result2.speedMin=result2.speed;let description=util4.getValue(lines,"description",":").split(" ");for(let i2=0;i2<description.length;i2++){if(description[i2].toLowerCase().startsWith("family")&&i2+1<description.length&&description[i2+1])result2.family=description[i2+1];if(description[i2].toLowerCase().startsWith("model")&&i2+1<description.length&&description[i2+1])result2.model=description[i2+1];if(description[i2].toLowerCase().startsWith("stepping")&&i2+1<description.length&&description[i2+1])result2.stepping=description[i2+1]}let socketId=util4.getValue(lines,"UpgradeMethod",":");if(socketTypes[socketId])result2.socket=socketTypes[socketId];let socketByName=getSocketTypesByName(name);if(socketByName)result2.socket=socketByName;let countProcessors=util4.countLines(lines,"Caption"),countThreads=util4.getValue(lines,"NumberOfLogicalProcessors",":"),countCores=util4.getValue(lines,"NumberOfCores",":");if(countProcessors)result2.processors=parseInt(countProcessors)||1;if(countCores&&countThreads)result2.cores=parseInt(countThreads)||util4.cores(),result2.physicalCores=parseInt(countCores)||util4.cores();if(countProcessors>1)result2.cores=result2.cores*countProcessors,result2.physicalCores=result2.physicalCores*countProcessors;result2.cache=parseWinCache(data[0],data[1]);let hyperv=data[2]?data[2].toString().toLowerCase():"";result2.virtualization=hyperv.indexOf("true")!==-1,resolve14(result2)})}catch(e){resolve14(result2)}})})})}function cpu(callback){return new Promise((resolve14)=>{process.nextTick(()=>{getCpu().then((result2)=>{if(callback)callback(result2);resolve14(result2)})})})}exports.cpu=cpu;function getCpuCurrentSpeedSync(){let cpus=os4.cpus(),minFreq=999999999,maxFreq=0,avgFreq=0,cores=[],speeds=[];if(cpus&&cpus.length&&Object.prototype.hasOwnProperty.call(cpus[0],"speed"))for(let i2 in cpus)speeds.push(cpus[i2].speed>100?(cpus[i2].speed+1)/1000:cpus[i2].speed/10);else if(_linux)try{let speedStrings=
|
|
3251
|
-
`).filter((line)=>line.length>0);for(let i2 in speedStrings)speeds.push(Math.floor(parseInt(speedStrings[i2],10)/10)/100)}catch{util4.noop()}if(speeds&&speeds.length)try{for(let i2 in speeds){if(avgFreq=avgFreq+speeds[i2],speeds[i2]>maxFreq)maxFreq=speeds[i2];if(speeds[i2]<minFreq)minFreq=speeds[i2];cores.push(parseFloat(speeds[i2].toFixed(2)))}return avgFreq=avgFreq/speeds.length,{min:parseFloat(minFreq.toFixed(2)),max:parseFloat(maxFreq.toFixed(2)),avg:parseFloat(avgFreq.toFixed(2)),cores}}catch(e){return{min:0,max:0,avg:0,cores}}else return{min:0,max:0,avg:0,cores}}function cpuCurrentSpeed(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=getCpuCurrentSpeedSync();if(result2.avg===0&&_cpu_speed!==0){let currCpuSpeed=parseFloat(_cpu_speed);result2={min:currCpuSpeed,max:currCpuSpeed,avg:currCpuSpeed,cores:[]}}if(callback)callback(result2);resolve14(result2)})})}exports.cpuCurrentSpeed=cpuCurrentSpeed;function cpuTemperature(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={main:null,cores:[],max:null,socket:[],chipset:null};if(_linux){try{let parts=
|
|
3259
|
+
`),name=util4.getValue(lines,"name",":")||"";if(name.indexOf("@")>=0)result2.brand=name.split("@")[0].trim(),result2.speed=name.split("@")[1]?parseFloat(name.split("@")[1].trim()):0,_cpu_speed=result2.speed;else result2.brand=name.trim(),result2.speed=0;if(result2=cpuBrandManufacturer(result2),result2.revision=util4.getValue(lines,"revision",":"),result2.vendor=util4.getValue(lines,"manufacturer",":"),result2.speedMax=Math.round(parseFloat(util4.getValue(lines,"maxclockspeed",":").replace(/,/g,"."))/10)/100,result2.speed===0&&(result2.brand.indexOf("AMD")>-1||result2.brand.toLowerCase().indexOf("ryzen")>-1))result2.speed=getAMDSpeed(result2.brand);if(result2.speed===0)result2.speed=result2.speedMax;result2.speedMin=result2.speed;let description=util4.getValue(lines,"description",":").split(" ");for(let i2=0;i2<description.length;i2++){if(description[i2].toLowerCase().startsWith("family")&&i2+1<description.length&&description[i2+1])result2.family=description[i2+1];if(description[i2].toLowerCase().startsWith("model")&&i2+1<description.length&&description[i2+1])result2.model=description[i2+1];if(description[i2].toLowerCase().startsWith("stepping")&&i2+1<description.length&&description[i2+1])result2.stepping=description[i2+1]}let socketId=util4.getValue(lines,"UpgradeMethod",":");if(socketTypes[socketId])result2.socket=socketTypes[socketId];let socketByName=getSocketTypesByName(name);if(socketByName)result2.socket=socketByName;let countProcessors=util4.countLines(lines,"Caption"),countThreads=util4.getValue(lines,"NumberOfLogicalProcessors",":"),countCores=util4.getValue(lines,"NumberOfCores",":");if(countProcessors)result2.processors=parseInt(countProcessors)||1;if(countCores&&countThreads)result2.cores=parseInt(countThreads)||util4.cores(),result2.physicalCores=parseInt(countCores)||util4.cores();if(countProcessors>1)result2.cores=result2.cores*countProcessors,result2.physicalCores=result2.physicalCores*countProcessors;result2.cache=parseWinCache(data[0],data[1]);let hyperv=data[2]?data[2].toString().toLowerCase():"";result2.virtualization=hyperv.indexOf("true")!==-1,resolve14(result2)})}catch(e){resolve14(result2)}})})})}function cpu(callback){return new Promise((resolve14)=>{process.nextTick(()=>{getCpu().then((result2)=>{if(callback)callback(result2);resolve14(result2)})})})}exports.cpu=cpu;function getCpuCurrentSpeedSync(){let cpus=os4.cpus(),minFreq=999999999,maxFreq=0,avgFreq=0,cores=[],speeds=[];if(cpus&&cpus.length&&Object.prototype.hasOwnProperty.call(cpus[0],"speed"))for(let i2 in cpus)speeds.push(cpus[i2].speed>100?(cpus[i2].speed+1)/1000:cpus[i2].speed/10);else if(_linux)try{let speedStrings=execSync18('cat /proc/cpuinfo | grep "cpu MHz" | cut -d " " -f 3',util4.execOptsLinux).toString().split(`
|
|
3260
|
+
`).filter((line)=>line.length>0);for(let i2 in speedStrings)speeds.push(Math.floor(parseInt(speedStrings[i2],10)/10)/100)}catch{util4.noop()}if(speeds&&speeds.length)try{for(let i2 in speeds){if(avgFreq=avgFreq+speeds[i2],speeds[i2]>maxFreq)maxFreq=speeds[i2];if(speeds[i2]<minFreq)minFreq=speeds[i2];cores.push(parseFloat(speeds[i2].toFixed(2)))}return avgFreq=avgFreq/speeds.length,{min:parseFloat(minFreq.toFixed(2)),max:parseFloat(maxFreq.toFixed(2)),avg:parseFloat(avgFreq.toFixed(2)),cores}}catch(e){return{min:0,max:0,avg:0,cores}}else return{min:0,max:0,avg:0,cores}}function cpuCurrentSpeed(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=getCpuCurrentSpeedSync();if(result2.avg===0&&_cpu_speed!==0){let currCpuSpeed=parseFloat(_cpu_speed);result2={min:currCpuSpeed,max:currCpuSpeed,avg:currCpuSpeed,cores:[]}}if(callback)callback(result2);resolve14(result2)})})}exports.cpuCurrentSpeed=cpuCurrentSpeed;function cpuTemperature(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={main:null,cores:[],max:null,socket:[],chipset:null};if(_linux){try{let parts=execSync18('cat /sys/class/thermal/thermal_zone*/type 2>/dev/null; echo "-----"; cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null;',util4.execOptsLinux).toString().split(`-----
|
|
3252
3261
|
`);if(parts.length===2){let lines=parts[0].split(`
|
|
3253
3262
|
`),lines2=parts[1].split(`
|
|
3254
3263
|
`);for(let i2=0;i2<lines.length;i2++){let line=lines[i2].trim();if(line.startsWith("acpi")&&lines2[i2])result2.socket.push(Math.round(parseInt(lines2[i2],10)/100)/10);if(line.startsWith("pch")&&lines2[i2])result2.chipset=Math.round(parseInt(lines2[i2],10)/100)/10}}}catch(e){util4.noop()}let cmd='for mon in /sys/class/hwmon/hwmon*; do for label in "$mon"/temp*_label; do if [ -f $label ]; then value=${label%_*}_input; echo $(cat "$label")___$(cat "$value"); fi; done; done;';try{exec3(cmd,(error2,stdout)=>{stdout=stdout.toString();let tdiePos=stdout.toLowerCase().indexOf("tdie");if(tdiePos!==-1)stdout=stdout.substring(tdiePos);let lines=stdout.split(`
|
|
@@ -3266,16 +3275,16 @@ echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`,(e
|
|
|
3266
3275
|
`),cacheType=util4.getValue(lines,"Socket Designation").toLowerCase().replace(" ","-").split("-");cacheType=cacheType.length?cacheType[0]:"";let sizeParts=util4.getValue(lines,"Installed Size").split(" "),size=parseInt(sizeParts[0],10),unit=sizeParts.length>1?sizeParts[1]:"kb";if(size=size*(unit==="kb"?1024:unit==="mb"?1048576:unit==="gb"?1073741824:1),cacheType)if(cacheType==="l1")result2.cache[cacheType+"d"]=size/2,result2.cache[cacheType+"i"]=size/2;else result2.cache[cacheType]=size}if(callback)callback(result2);resolve14(result2)});if(_darwin)exec3("sysctl hw.l1icachesize hw.l1dcachesize hw.l2cachesize hw.l3cachesize",(error2,stdout)=>{if(!error2)stdout.toString().split(`
|
|
3267
3276
|
`).forEach((line)=>{let parts=line.split(":");if(parts[0].toLowerCase().indexOf("hw.l1icachesize")!==-1)result2.l1d=parseInt(parts[1].trim())*(parts[1].indexOf("K")!==-1?1024:1);if(parts[0].toLowerCase().indexOf("hw.l1dcachesize")!==-1)result2.l1i=parseInt(parts[1].trim())*(parts[1].indexOf("K")!==-1?1024:1);if(parts[0].toLowerCase().indexOf("hw.l2cachesize")!==-1)result2.l2=parseInt(parts[1].trim())*(parts[1].indexOf("K")!==-1?1024:1);if(parts[0].toLowerCase().indexOf("hw.l3cachesize")!==-1)result2.l3=parseInt(parts[1].trim())*(parts[1].indexOf("K")!==-1?1024:1)});if(callback)callback(result2);resolve14(result2)});if(_sunos){if(callback)callback(result2);resolve14(result2)}if(_windows)try{let workload=[];workload.push(util4.powerShell("Get-CimInstance Win32_processor | select L2CacheSize, L3CacheSize | fl")),workload.push(util4.powerShell("Get-CimInstance Win32_CacheMemory | select CacheType,InstalledSize,Level | fl")),Promise.all(workload).then((data)=>{if(result2=parseWinCache(data[0],data[1]),callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}})})}function parseWinCache(linesProc,linesCache){let result2={l1d:null,l1i:null,l2:null,l3:null},lines=linesProc.split(`\r
|
|
3268
3277
|
`);if(result2.l1d=0,result2.l1i=0,result2.l2=util4.getValue(lines,"l2cachesize",":"),result2.l3=util4.getValue(lines,"l3cachesize",":"),result2.l2)result2.l2=parseInt(result2.l2,10)*1024;else result2.l2=0;if(result2.l3)result2.l3=parseInt(result2.l3,10)*1024;else result2.l3=0;let parts=linesCache.split(/\n\s*\n/),l1i=0,l1d=0,l2=0;if(parts.forEach((part)=>{let lines2=part.split(`\r
|
|
3269
|
-
`),cacheType=util4.getValue(lines2,"CacheType"),level=util4.getValue(lines2,"Level"),installedSize=util4.getValue(lines2,"InstalledSize");if(level==="3"&&cacheType==="3")result2.l1i=result2.l1i+parseInt(installedSize,10)*1024;if(level==="3"&&cacheType==="4")result2.l1d=result2.l1d+parseInt(installedSize,10)*1024;if(level==="3"&&cacheType==="5")l1i=parseInt(installedSize,10)/2,l1d=parseInt(installedSize,10)/2;if(level==="4"&&cacheType==="5")l2=l2+parseInt(installedSize,10)*1024}),!result2.l1i&&!result2.l1d)result2.l1i=l1i,result2.l1d=l1d;if(l2)result2.l2=l2;return result2}exports.cpuCache=cpuCache;function getLoad(){return new Promise((resolve14)=>{process.nextTick(()=>{let loads=os4.loadavg().map((x2)=>{return x2/util4.cores()}),avgLoad=parseFloat(Math.max.apply(Math,loads).toFixed(2)),result2={};if(Date.now()-_current_cpu.ms>=200){_current_cpu.ms=Date.now();let cpus=os4.cpus().map((cpu2)=>{return cpu2.times.steal=0,cpu2.times.guest=0,cpu2}),totalUser=0,totalSystem=0,totalNice=0,totalIrq=0,totalIdle=0,totalSteal=0,totalGuest=0,cores=[];if(_corecount=cpus&&cpus.length?cpus.length:0,_linux)try{let lines=
|
|
3270
|
-
`);if(lines.length>1){if(lines.shift(),lines.length===cpus.length)for(let i2=0;i2<lines.length;i2++){let parts=lines[i2].split(" ");if(parts.length>=10){let steal=parseFloat(parts[8])||0,guest=parseFloat(parts[9])||0;cpus[i2].times.steal=steal,cpus[i2].times.guest=guest}}}}catch{util4.noop()}for(let i2=0;i2<_corecount;i2++){let cpu2=cpus[i2].times;totalUser+=cpu2.user,totalSystem+=cpu2.sys,totalNice+=cpu2.nice,totalIdle+=cpu2.idle,totalIrq+=cpu2.irq,totalSteal+=cpu2.steal||0,totalGuest+=cpu2.guest||0;let tmpTick=_cpus&&_cpus[i2]&&_cpus[i2].totalTick?_cpus[i2].totalTick:0,tmpLoad=_cpus&&_cpus[i2]&&_cpus[i2].totalLoad?_cpus[i2].totalLoad:0,tmpUser=_cpus&&_cpus[i2]&&_cpus[i2].user?_cpus[i2].user:0,tmpSystem=_cpus&&_cpus[i2]&&_cpus[i2].sys?_cpus[i2].sys:0,tmpNice=_cpus&&_cpus[i2]&&_cpus[i2].nice?_cpus[i2].nice:0,tmpIdle=_cpus&&_cpus[i2]&&_cpus[i2].idle?_cpus[i2].idle:0,tmpIrq=_cpus&&_cpus[i2]&&_cpus[i2].irq?_cpus[i2].irq:0,tmpSteal=_cpus&&_cpus[i2]&&_cpus[i2].steal?_cpus[i2].steal:0,tmpGuest=_cpus&&_cpus[i2]&&_cpus[i2].guest?_cpus[i2].guest:0;_cpus[i2]=cpu2,_cpus[i2].totalTick=_cpus[i2].user+_cpus[i2].sys+_cpus[i2].nice+_cpus[i2].irq+_cpus[i2].steal+_cpus[i2].guest+_cpus[i2].idle,_cpus[i2].totalLoad=_cpus[i2].user+_cpus[i2].sys+_cpus[i2].nice+_cpus[i2].irq+_cpus[i2].steal+_cpus[i2].guest,_cpus[i2].currentTick=_cpus[i2].totalTick-tmpTick,_cpus[i2].load=_cpus[i2].totalLoad-tmpLoad,_cpus[i2].loadUser=_cpus[i2].user-tmpUser,_cpus[i2].loadSystem=_cpus[i2].sys-tmpSystem,_cpus[i2].loadNice=_cpus[i2].nice-tmpNice,_cpus[i2].loadIdle=_cpus[i2].idle-tmpIdle,_cpus[i2].loadIrq=_cpus[i2].irq-tmpIrq,_cpus[i2].loadSteal=_cpus[i2].steal-tmpSteal,_cpus[i2].loadGuest=_cpus[i2].guest-tmpGuest,cores[i2]={},cores[i2].load=_cpus[i2].load/_cpus[i2].currentTick*100,cores[i2].loadUser=_cpus[i2].loadUser/_cpus[i2].currentTick*100,cores[i2].loadSystem=_cpus[i2].loadSystem/_cpus[i2].currentTick*100,cores[i2].loadNice=_cpus[i2].loadNice/_cpus[i2].currentTick*100,cores[i2].loadIdle=_cpus[i2].loadIdle/_cpus[i2].currentTick*100,cores[i2].loadIrq=_cpus[i2].loadIrq/_cpus[i2].currentTick*100,cores[i2].loadSteal=_cpus[i2].loadSteal/_cpus[i2].currentTick*100,cores[i2].loadGuest=_cpus[i2].loadGuest/_cpus[i2].currentTick*100,cores[i2].rawLoad=_cpus[i2].load,cores[i2].rawLoadUser=_cpus[i2].loadUser,cores[i2].rawLoadSystem=_cpus[i2].loadSystem,cores[i2].rawLoadNice=_cpus[i2].loadNice,cores[i2].rawLoadIdle=_cpus[i2].loadIdle,cores[i2].rawLoadIrq=_cpus[i2].loadIrq,cores[i2].rawLoadSteal=_cpus[i2].loadSteal,cores[i2].rawLoadGuest=_cpus[i2].loadGuest}let totalTick=totalUser+totalSystem+totalNice+totalIrq+totalSteal+totalGuest+totalIdle,totalLoad=totalUser+totalSystem+totalNice+totalIrq+totalSteal+totalGuest,currentTick=totalTick-_current_cpu.tick;result2={avgLoad,currentLoad:(totalLoad-_current_cpu.load)/currentTick*100,currentLoadUser:(totalUser-_current_cpu.user)/currentTick*100,currentLoadSystem:(totalSystem-_current_cpu.system)/currentTick*100,currentLoadNice:(totalNice-_current_cpu.nice)/currentTick*100,currentLoadIdle:(totalIdle-_current_cpu.idle)/currentTick*100,currentLoadIrq:(totalIrq-_current_cpu.irq)/currentTick*100,currentLoadSteal:(totalSteal-_current_cpu.steal)/currentTick*100,currentLoadGuest:(totalGuest-_current_cpu.guest)/currentTick*100,rawCurrentLoad:totalLoad-_current_cpu.load,rawCurrentLoadUser:totalUser-_current_cpu.user,rawCurrentLoadSystem:totalSystem-_current_cpu.system,rawCurrentLoadNice:totalNice-_current_cpu.nice,rawCurrentLoadIdle:totalIdle-_current_cpu.idle,rawCurrentLoadIrq:totalIrq-_current_cpu.irq,rawCurrentLoadSteal:totalSteal-_current_cpu.steal,rawCurrentLoadGuest:totalGuest-_current_cpu.guest,cpus:cores},_current_cpu={user:totalUser,nice:totalNice,system:totalSystem,idle:totalIdle,irq:totalIrq,steal:totalSteal,guest:totalGuest,tick:totalTick,load:totalLoad,ms:_current_cpu.ms,currentLoad:result2.currentLoad,currentLoadUser:result2.currentLoadUser,currentLoadSystem:result2.currentLoadSystem,currentLoadNice:result2.currentLoadNice,currentLoadIdle:result2.currentLoadIdle,currentLoadIrq:result2.currentLoadIrq,currentLoadSteal:result2.currentLoadSteal,currentLoadGuest:result2.currentLoadGuest,rawCurrentLoad:result2.rawCurrentLoad,rawCurrentLoadUser:result2.rawCurrentLoadUser,rawCurrentLoadSystem:result2.rawCurrentLoadSystem,rawCurrentLoadNice:result2.rawCurrentLoadNice,rawCurrentLoadIdle:result2.rawCurrentLoadIdle,rawCurrentLoadIrq:result2.rawCurrentLoadIrq,rawCurrentLoadSteal:result2.rawCurrentLoadSteal,rawCurrentLoadGuest:result2.rawCurrentLoadGuest}}else{let cores=[];for(let i2=0;i2<_corecount;i2++)cores[i2]={},cores[i2].load=_cpus[i2].load/_cpus[i2].currentTick*100,cores[i2].loadUser=_cpus[i2].loadUser/_cpus[i2].currentTick*100,cores[i2].loadSystem=_cpus[i2].loadSystem/_cpus[i2].currentTick*100,cores[i2].loadNice=_cpus[i2].loadNice/_cpus[i2].currentTick*100,cores[i2].loadIdle=_cpus[i2].loadIdle/_cpus[i2].currentTick*100,cores[i2].loadIrq=_cpus[i2].loadIrq/_cpus[i2].currentTick*100,cores[i2].rawLoad=_cpus[i2].load,cores[i2].rawLoadUser=_cpus[i2].loadUser,cores[i2].rawLoadSystem=_cpus[i2].loadSystem,cores[i2].rawLoadNice=_cpus[i2].loadNice,cores[i2].rawLoadIdle=_cpus[i2].loadIdle,cores[i2].rawLoadIrq=_cpus[i2].loadIrq,cores[i2].rawLoadSteal=_cpus[i2].loadSteal,cores[i2].rawLoadGuest=_cpus[i2].loadGuest;result2={avgLoad,currentLoad:_current_cpu.currentLoad,currentLoadUser:_current_cpu.currentLoadUser,currentLoadSystem:_current_cpu.currentLoadSystem,currentLoadNice:_current_cpu.currentLoadNice,currentLoadIdle:_current_cpu.currentLoadIdle,currentLoadIrq:_current_cpu.currentLoadIrq,currentLoadSteal:_current_cpu.currentLoadSteal,currentLoadGuest:_current_cpu.currentLoadGuest,rawCurrentLoad:_current_cpu.rawCurrentLoad,rawCurrentLoadUser:_current_cpu.rawCurrentLoadUser,rawCurrentLoadSystem:_current_cpu.rawCurrentLoadSystem,rawCurrentLoadNice:_current_cpu.rawCurrentLoadNice,rawCurrentLoadIdle:_current_cpu.rawCurrentLoadIdle,rawCurrentLoadIrq:_current_cpu.rawCurrentLoadIrq,rawCurrentLoadSteal:_current_cpu.rawCurrentLoadSteal,rawCurrentLoadGuest:_current_cpu.rawCurrentLoadGuest,cpus:cores}}resolve14(result2)})})}function currentLoad(callback){return new Promise((resolve14)=>{process.nextTick(()=>{getLoad().then((result2)=>{if(callback)callback(result2);resolve14(result2)})})})}exports.currentLoad=currentLoad;function getFullLoad(){return new Promise((resolve14)=>{process.nextTick(()=>{let cpus=os4.cpus(),totalUser=0,totalSystem=0,totalNice=0,totalIrq=0,totalIdle=0,result2=0;if(cpus&&cpus.length){for(let i2=0,len=cpus.length;i2<len;i2++){let cpu2=cpus[i2].times;totalUser+=cpu2.user,totalSystem+=cpu2.sys,totalNice+=cpu2.nice,totalIrq+=cpu2.irq,totalIdle+=cpu2.idle}let totalTicks=totalIdle+totalIrq+totalNice+totalSystem+totalUser;result2=(totalTicks-totalIdle)/totalTicks*100}resolve14(result2)})})}function fullLoad(callback){return new Promise((resolve14)=>{process.nextTick(()=>{getFullLoad().then((result2)=>{if(callback)callback(result2);resolve14(result2)})})})}exports.fullLoad=fullLoad});var require_memory=__commonJS((exports)=>{var os4=__require("os"),exec3=__require("child_process").exec,
|
|
3278
|
+
`),cacheType=util4.getValue(lines2,"CacheType"),level=util4.getValue(lines2,"Level"),installedSize=util4.getValue(lines2,"InstalledSize");if(level==="3"&&cacheType==="3")result2.l1i=result2.l1i+parseInt(installedSize,10)*1024;if(level==="3"&&cacheType==="4")result2.l1d=result2.l1d+parseInt(installedSize,10)*1024;if(level==="3"&&cacheType==="5")l1i=parseInt(installedSize,10)/2,l1d=parseInt(installedSize,10)/2;if(level==="4"&&cacheType==="5")l2=l2+parseInt(installedSize,10)*1024}),!result2.l1i&&!result2.l1d)result2.l1i=l1i,result2.l1d=l1d;if(l2)result2.l2=l2;return result2}exports.cpuCache=cpuCache;function getLoad(){return new Promise((resolve14)=>{process.nextTick(()=>{let loads=os4.loadavg().map((x2)=>{return x2/util4.cores()}),avgLoad=parseFloat(Math.max.apply(Math,loads).toFixed(2)),result2={};if(Date.now()-_current_cpu.ms>=200){_current_cpu.ms=Date.now();let cpus=os4.cpus().map((cpu2)=>{return cpu2.times.steal=0,cpu2.times.guest=0,cpu2}),totalUser=0,totalSystem=0,totalNice=0,totalIrq=0,totalIdle=0,totalSteal=0,totalGuest=0,cores=[];if(_corecount=cpus&&cpus.length?cpus.length:0,_linux)try{let lines=execSync18("cat /proc/stat 2>/dev/null | grep cpu",util4.execOptsLinux).toString().split(`
|
|
3279
|
+
`);if(lines.length>1){if(lines.shift(),lines.length===cpus.length)for(let i2=0;i2<lines.length;i2++){let parts=lines[i2].split(" ");if(parts.length>=10){let steal=parseFloat(parts[8])||0,guest=parseFloat(parts[9])||0;cpus[i2].times.steal=steal,cpus[i2].times.guest=guest}}}}catch{util4.noop()}for(let i2=0;i2<_corecount;i2++){let cpu2=cpus[i2].times;totalUser+=cpu2.user,totalSystem+=cpu2.sys,totalNice+=cpu2.nice,totalIdle+=cpu2.idle,totalIrq+=cpu2.irq,totalSteal+=cpu2.steal||0,totalGuest+=cpu2.guest||0;let tmpTick=_cpus&&_cpus[i2]&&_cpus[i2].totalTick?_cpus[i2].totalTick:0,tmpLoad=_cpus&&_cpus[i2]&&_cpus[i2].totalLoad?_cpus[i2].totalLoad:0,tmpUser=_cpus&&_cpus[i2]&&_cpus[i2].user?_cpus[i2].user:0,tmpSystem=_cpus&&_cpus[i2]&&_cpus[i2].sys?_cpus[i2].sys:0,tmpNice=_cpus&&_cpus[i2]&&_cpus[i2].nice?_cpus[i2].nice:0,tmpIdle=_cpus&&_cpus[i2]&&_cpus[i2].idle?_cpus[i2].idle:0,tmpIrq=_cpus&&_cpus[i2]&&_cpus[i2].irq?_cpus[i2].irq:0,tmpSteal=_cpus&&_cpus[i2]&&_cpus[i2].steal?_cpus[i2].steal:0,tmpGuest=_cpus&&_cpus[i2]&&_cpus[i2].guest?_cpus[i2].guest:0;_cpus[i2]=cpu2,_cpus[i2].totalTick=_cpus[i2].user+_cpus[i2].sys+_cpus[i2].nice+_cpus[i2].irq+_cpus[i2].steal+_cpus[i2].guest+_cpus[i2].idle,_cpus[i2].totalLoad=_cpus[i2].user+_cpus[i2].sys+_cpus[i2].nice+_cpus[i2].irq+_cpus[i2].steal+_cpus[i2].guest,_cpus[i2].currentTick=_cpus[i2].totalTick-tmpTick,_cpus[i2].load=_cpus[i2].totalLoad-tmpLoad,_cpus[i2].loadUser=_cpus[i2].user-tmpUser,_cpus[i2].loadSystem=_cpus[i2].sys-tmpSystem,_cpus[i2].loadNice=_cpus[i2].nice-tmpNice,_cpus[i2].loadIdle=_cpus[i2].idle-tmpIdle,_cpus[i2].loadIrq=_cpus[i2].irq-tmpIrq,_cpus[i2].loadSteal=_cpus[i2].steal-tmpSteal,_cpus[i2].loadGuest=_cpus[i2].guest-tmpGuest,cores[i2]={},cores[i2].load=_cpus[i2].load/_cpus[i2].currentTick*100,cores[i2].loadUser=_cpus[i2].loadUser/_cpus[i2].currentTick*100,cores[i2].loadSystem=_cpus[i2].loadSystem/_cpus[i2].currentTick*100,cores[i2].loadNice=_cpus[i2].loadNice/_cpus[i2].currentTick*100,cores[i2].loadIdle=_cpus[i2].loadIdle/_cpus[i2].currentTick*100,cores[i2].loadIrq=_cpus[i2].loadIrq/_cpus[i2].currentTick*100,cores[i2].loadSteal=_cpus[i2].loadSteal/_cpus[i2].currentTick*100,cores[i2].loadGuest=_cpus[i2].loadGuest/_cpus[i2].currentTick*100,cores[i2].rawLoad=_cpus[i2].load,cores[i2].rawLoadUser=_cpus[i2].loadUser,cores[i2].rawLoadSystem=_cpus[i2].loadSystem,cores[i2].rawLoadNice=_cpus[i2].loadNice,cores[i2].rawLoadIdle=_cpus[i2].loadIdle,cores[i2].rawLoadIrq=_cpus[i2].loadIrq,cores[i2].rawLoadSteal=_cpus[i2].loadSteal,cores[i2].rawLoadGuest=_cpus[i2].loadGuest}let totalTick=totalUser+totalSystem+totalNice+totalIrq+totalSteal+totalGuest+totalIdle,totalLoad=totalUser+totalSystem+totalNice+totalIrq+totalSteal+totalGuest,currentTick=totalTick-_current_cpu.tick;result2={avgLoad,currentLoad:(totalLoad-_current_cpu.load)/currentTick*100,currentLoadUser:(totalUser-_current_cpu.user)/currentTick*100,currentLoadSystem:(totalSystem-_current_cpu.system)/currentTick*100,currentLoadNice:(totalNice-_current_cpu.nice)/currentTick*100,currentLoadIdle:(totalIdle-_current_cpu.idle)/currentTick*100,currentLoadIrq:(totalIrq-_current_cpu.irq)/currentTick*100,currentLoadSteal:(totalSteal-_current_cpu.steal)/currentTick*100,currentLoadGuest:(totalGuest-_current_cpu.guest)/currentTick*100,rawCurrentLoad:totalLoad-_current_cpu.load,rawCurrentLoadUser:totalUser-_current_cpu.user,rawCurrentLoadSystem:totalSystem-_current_cpu.system,rawCurrentLoadNice:totalNice-_current_cpu.nice,rawCurrentLoadIdle:totalIdle-_current_cpu.idle,rawCurrentLoadIrq:totalIrq-_current_cpu.irq,rawCurrentLoadSteal:totalSteal-_current_cpu.steal,rawCurrentLoadGuest:totalGuest-_current_cpu.guest,cpus:cores},_current_cpu={user:totalUser,nice:totalNice,system:totalSystem,idle:totalIdle,irq:totalIrq,steal:totalSteal,guest:totalGuest,tick:totalTick,load:totalLoad,ms:_current_cpu.ms,currentLoad:result2.currentLoad,currentLoadUser:result2.currentLoadUser,currentLoadSystem:result2.currentLoadSystem,currentLoadNice:result2.currentLoadNice,currentLoadIdle:result2.currentLoadIdle,currentLoadIrq:result2.currentLoadIrq,currentLoadSteal:result2.currentLoadSteal,currentLoadGuest:result2.currentLoadGuest,rawCurrentLoad:result2.rawCurrentLoad,rawCurrentLoadUser:result2.rawCurrentLoadUser,rawCurrentLoadSystem:result2.rawCurrentLoadSystem,rawCurrentLoadNice:result2.rawCurrentLoadNice,rawCurrentLoadIdle:result2.rawCurrentLoadIdle,rawCurrentLoadIrq:result2.rawCurrentLoadIrq,rawCurrentLoadSteal:result2.rawCurrentLoadSteal,rawCurrentLoadGuest:result2.rawCurrentLoadGuest}}else{let cores=[];for(let i2=0;i2<_corecount;i2++)cores[i2]={},cores[i2].load=_cpus[i2].load/_cpus[i2].currentTick*100,cores[i2].loadUser=_cpus[i2].loadUser/_cpus[i2].currentTick*100,cores[i2].loadSystem=_cpus[i2].loadSystem/_cpus[i2].currentTick*100,cores[i2].loadNice=_cpus[i2].loadNice/_cpus[i2].currentTick*100,cores[i2].loadIdle=_cpus[i2].loadIdle/_cpus[i2].currentTick*100,cores[i2].loadIrq=_cpus[i2].loadIrq/_cpus[i2].currentTick*100,cores[i2].rawLoad=_cpus[i2].load,cores[i2].rawLoadUser=_cpus[i2].loadUser,cores[i2].rawLoadSystem=_cpus[i2].loadSystem,cores[i2].rawLoadNice=_cpus[i2].loadNice,cores[i2].rawLoadIdle=_cpus[i2].loadIdle,cores[i2].rawLoadIrq=_cpus[i2].loadIrq,cores[i2].rawLoadSteal=_cpus[i2].loadSteal,cores[i2].rawLoadGuest=_cpus[i2].loadGuest;result2={avgLoad,currentLoad:_current_cpu.currentLoad,currentLoadUser:_current_cpu.currentLoadUser,currentLoadSystem:_current_cpu.currentLoadSystem,currentLoadNice:_current_cpu.currentLoadNice,currentLoadIdle:_current_cpu.currentLoadIdle,currentLoadIrq:_current_cpu.currentLoadIrq,currentLoadSteal:_current_cpu.currentLoadSteal,currentLoadGuest:_current_cpu.currentLoadGuest,rawCurrentLoad:_current_cpu.rawCurrentLoad,rawCurrentLoadUser:_current_cpu.rawCurrentLoadUser,rawCurrentLoadSystem:_current_cpu.rawCurrentLoadSystem,rawCurrentLoadNice:_current_cpu.rawCurrentLoadNice,rawCurrentLoadIdle:_current_cpu.rawCurrentLoadIdle,rawCurrentLoadIrq:_current_cpu.rawCurrentLoadIrq,rawCurrentLoadSteal:_current_cpu.rawCurrentLoadSteal,rawCurrentLoadGuest:_current_cpu.rawCurrentLoadGuest,cpus:cores}}resolve14(result2)})})}function currentLoad(callback){return new Promise((resolve14)=>{process.nextTick(()=>{getLoad().then((result2)=>{if(callback)callback(result2);resolve14(result2)})})})}exports.currentLoad=currentLoad;function getFullLoad(){return new Promise((resolve14)=>{process.nextTick(()=>{let cpus=os4.cpus(),totalUser=0,totalSystem=0,totalNice=0,totalIrq=0,totalIdle=0,result2=0;if(cpus&&cpus.length){for(let i2=0,len=cpus.length;i2<len;i2++){let cpu2=cpus[i2].times;totalUser+=cpu2.user,totalSystem+=cpu2.sys,totalNice+=cpu2.nice,totalIrq+=cpu2.irq,totalIdle+=cpu2.idle}let totalTicks=totalIdle+totalIrq+totalNice+totalSystem+totalUser;result2=(totalTicks-totalIdle)/totalTicks*100}resolve14(result2)})})}function fullLoad(callback){return new Promise((resolve14)=>{process.nextTick(()=>{getFullLoad().then((result2)=>{if(callback)callback(result2);resolve14(result2)})})})}exports.fullLoad=fullLoad});var require_memory=__commonJS((exports)=>{var os4=__require("os"),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,util4=require_util3(),fs3=__require("fs"),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos",RAM_manufacturers={"00CE":"Samsung Electronics Inc","014F":"Transcend Information Inc.","017A":"Apacer Technology Inc.","0198":"HyperX","029E":"Corsair","02FE":"Elpida","04CB":"A-DATA","04CD":"G.Skill International Enterprise","059B":"Crucial",1315:"Crucial","2C00":"Micron Technology Inc.",5105:"Qimonda AG i. In.","802C":"Micron Technology Inc.","80AD":"Hynix Semiconductor Inc.","80CE":"Samsung Electronics Inc.",8551:"Qimonda AG i. In.","859B":"Crucial",AD00:"Hynix Semiconductor Inc.",CE00:"Samsung Electronics Inc.",SAMSUNG:"Samsung Electronics Inc.",HYNIX:"Hynix Semiconductor Inc.","G-SKILL":"G-Skill International Enterprise","G.SKILL":"G-Skill International Enterprise",TRANSCEND:"Transcend Information",APACER:"Apacer Technology Inc",MICRON:"Micron Technology Inc.",QIMONDA:"Qimonda AG i. In."};function mem(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={total:os4.totalmem(),free:os4.freemem(),used:os4.totalmem()-os4.freemem(),active:os4.totalmem()-os4.freemem(),available:os4.freemem(),buffers:0,cached:0,slab:0,buffcache:0,reclaimable:0,swaptotal:0,swapused:0,swapfree:0,writeback:null,dirty:null};if(_linux)try{fs3.readFile("/proc/meminfo",(error2,stdout)=>{if(!error2){let lines=stdout.toString().split(`
|
|
3271
3280
|
`);result2.total=parseInt(util4.getValue(lines,"memtotal"),10),result2.total=result2.total?result2.total*1024:os4.totalmem(),result2.free=parseInt(util4.getValue(lines,"memfree"),10),result2.free=result2.free?result2.free*1024:os4.freemem(),result2.used=result2.total-result2.free,result2.buffers=parseInt(util4.getValue(lines,"buffers"),10),result2.buffers=result2.buffers?result2.buffers*1024:0,result2.cached=parseInt(util4.getValue(lines,"cached"),10),result2.cached=result2.cached?result2.cached*1024:0,result2.slab=parseInt(util4.getValue(lines,"slab"),10),result2.slab=result2.slab?result2.slab*1024:0,result2.buffcache=result2.buffers+result2.cached+result2.slab;let available=parseInt(util4.getValue(lines,"memavailable"),10);result2.available=available?available*1024:result2.free+result2.buffcache,result2.active=result2.total-result2.available,result2.swaptotal=parseInt(util4.getValue(lines,"swaptotal"),10),result2.swaptotal=result2.swaptotal?result2.swaptotal*1024:0,result2.swapfree=parseInt(util4.getValue(lines,"swapfree"),10),result2.swapfree=result2.swapfree?result2.swapfree*1024:0,result2.swapused=result2.swaptotal-result2.swapfree,result2.writeback=parseInt(util4.getValue(lines,"writeback"),10),result2.writeback=result2.writeback?result2.writeback*1024:0,result2.dirty=parseInt(util4.getValue(lines,"dirty"),10),result2.dirty=result2.dirty?result2.dirty*1024:0,result2.reclaimable=parseInt(util4.getValue(lines,"sreclaimable"),10),result2.reclaimable=result2.reclaimable?result2.reclaimable*1024:0}if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}if(_freebsd||_openbsd||_netbsd)try{exec3("/sbin/sysctl hw.realmem hw.physmem vm.stats.vm.v_page_count vm.stats.vm.v_wire_count vm.stats.vm.v_active_count vm.stats.vm.v_inactive_count vm.stats.vm.v_cache_count vm.stats.vm.v_free_count vm.stats.vm.v_page_size",(error2,stdout)=>{if(!error2){let lines=stdout.toString().split(`
|
|
3272
|
-
`),pagesize=parseInt(util4.getValue(lines,"vm.stats.vm.v_page_size"),10),inactive=parseInt(util4.getValue(lines,"vm.stats.vm.v_inactive_count"),10)*pagesize,cache=parseInt(util4.getValue(lines,"vm.stats.vm.v_cache_count"),10)*pagesize;if(result2.total=parseInt(util4.getValue(lines,"hw.realmem"),10),isNaN(result2.total))result2.total=parseInt(util4.getValue(lines,"hw.physmem"),10);result2.free=parseInt(util4.getValue(lines,"vm.stats.vm.v_free_count"),10)*pagesize,result2.buffcache=inactive+cache,result2.available=result2.buffcache+result2.free,result2.active=result2.total-result2.free-result2.buffcache,result2.swaptotal=0,result2.swapfree=0,result2.swapused=0}if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}if(_sunos){if(callback)callback(result2);resolve14(result2)}if(_darwin){let pageSize=4096;try{pageSize=util4.toInt(
|
|
3281
|
+
`),pagesize=parseInt(util4.getValue(lines,"vm.stats.vm.v_page_size"),10),inactive=parseInt(util4.getValue(lines,"vm.stats.vm.v_inactive_count"),10)*pagesize,cache=parseInt(util4.getValue(lines,"vm.stats.vm.v_cache_count"),10)*pagesize;if(result2.total=parseInt(util4.getValue(lines,"hw.realmem"),10),isNaN(result2.total))result2.total=parseInt(util4.getValue(lines,"hw.physmem"),10);result2.free=parseInt(util4.getValue(lines,"vm.stats.vm.v_free_count"),10)*pagesize,result2.buffcache=inactive+cache,result2.available=result2.buffcache+result2.free,result2.active=result2.total-result2.free-result2.buffcache,result2.swaptotal=0,result2.swapfree=0,result2.swapused=0}if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}if(_sunos){if(callback)callback(result2);resolve14(result2)}if(_darwin){let pageSize=4096;try{pageSize=util4.toInt(execSync18("sysctl -n vm.pagesize").toString())||pageSize}catch{util4.noop()}try{exec3('vm_stat 2>/dev/null | egrep "Pages active|Pages inactive"',(error2,stdout)=>{if(!error2){let lines=stdout.toString().split(`
|
|
3273
3282
|
`);result2.active=(parseInt(util4.getValue(lines,"Pages active"),10)||0)*pageSize,result2.reclaimable=(parseInt(util4.getValue(lines,"Pages inactive"),10)||0)*pageSize,result2.buffcache=result2.used-result2.active,result2.available=result2.free+result2.buffcache}exec3("sysctl -n vm.swapusage 2>/dev/null",(error3,stdout2)=>{if(!error3){let lines=stdout2.toString().split(`
|
|
3274
3283
|
`);if(lines.length>0)lines[0].replace(/,/g,".").replace(/M/g,"").trim().split(" ").forEach((line)=>{if(line.toLowerCase().indexOf("total")!==-1)result2.swaptotal=parseFloat(line.split("=")[1].trim())*1024*1024;if(line.toLowerCase().indexOf("used")!==-1)result2.swapused=parseFloat(line.split("=")[1].trim())*1024*1024;if(line.toLowerCase().indexOf("free")!==-1)result2.swapfree=parseFloat(line.split("=")[1].trim())*1024*1024})}if(callback)callback(result2);resolve14(result2)})})}catch{if(callback)callback(result2);resolve14(result2)}}if(_windows){let swaptotal=0,swapused=0;try{util4.powerShell("Get-CimInstance Win32_PageFileUsage | Select AllocatedBaseSize, CurrentUsage").then((stdout,error2)=>{if(!error2)stdout.split(`\r
|
|
3275
3284
|
`).filter((line)=>line.trim()!=="").filter((line,idx)=>idx>0).forEach((line)=>{if(line!=="")line=line.trim().split(/\s\s+/),swaptotal=swaptotal+(parseInt(line[0],10)||0),swapused=swapused+(parseInt(line[1],10)||0)});if(result2.swaptotal=swaptotal*1024*1024,result2.swapused=swapused*1024*1024,result2.swapfree=result2.swaptotal-result2.swapused,callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}}})})}exports.mem=mem;function memLayout(callback){function getManufacturer(manId){let manIdSearch=manId.replace("0x","").toUpperCase();if(manIdSearch.length>=4&&{}.hasOwnProperty.call(RAM_manufacturers,manIdSearch))return RAM_manufacturers[manIdSearch];return manId}return new Promise((resolve14)=>{process.nextTick(()=>{let result2=[];if(_linux||_freebsd||_openbsd||_netbsd)exec3('export LC_ALL=C; dmidecode -t memory 2>/dev/null | grep -iE "Size:|Type|Speed|Manufacturer|Form Factor|Locator|Memory Device|Serial Number|Voltage|Part Number"; unset LC_ALL',(error2,stdout)=>{if(!error2){let devices=stdout.toString().split("Memory Device");devices.shift(),devices.forEach((device)=>{let lines=device.split(`
|
|
3276
|
-
`),sizeString=util4.getValue(lines,"Size"),size=sizeString.indexOf("GB")>=0?parseInt(sizeString,10)*1024*1024*1024:parseInt(sizeString,10)*1024*1024,bank=util4.getValue(lines,"Bank Locator");if(bank.toLowerCase().indexOf("bad")>=0)bank="";if(parseInt(util4.getValue(lines,"Size"),10)>0){let totalWidth=util4.toInt(util4.getValue(lines,"Total Width")),dataWidth=util4.toInt(util4.getValue(lines,"Data Width"));result2.push({size,bank,type:util4.getValue(lines,"Type:"),ecc:dataWidth&&totalWidth?totalWidth>dataWidth:!1,clockSpeed:util4.getValue(lines,"Configured Clock Speed:")?parseInt(util4.getValue(lines,"Configured Clock Speed:"),10):util4.getValue(lines,"Speed:")?parseInt(util4.getValue(lines,"Speed:"),10):null,formFactor:util4.getValue(lines,"Form Factor:"),manufacturer:getManufacturer(util4.getValue(lines,"Manufacturer:")),partNum:util4.getValue(lines,"Part Number:"),serialNum:util4.getValue(lines,"Serial Number:"),voltageConfigured:parseFloat(util4.getValue(lines,"Configured Voltage:"))||null,voltageMin:parseFloat(util4.getValue(lines,"Minimum Voltage:"))||null,voltageMax:parseFloat(util4.getValue(lines,"Maximum Voltage:"))||null})}else result2.push({size:0,bank,type:"Empty",ecc:null,clockSpeed:0,formFactor:util4.getValue(lines,"Form Factor:"),partNum:"",serialNum:"",voltageConfigured:null,voltageMin:null,voltageMax:null})})}if(!result2.length){result2.push({size:os4.totalmem(),bank:"",type:"",ecc:null,clockSpeed:0,formFactor:"",partNum:"",serialNum:"",voltageConfigured:null,voltageMin:null,voltageMax:null});try{let stdout2=
|
|
3277
|
-
`),version=util4.getValue(lines,"revision",":",!0).toLowerCase();if(util4.isRaspberry(lines)){let clockSpeed={0:400,1:450,2:450,3:3200,4:4267};result2[0].type="LPDDR2",result2[0].type=version&&version[2]&&version[2]==="3"?"LPDDR4":result2[0].type,result2[0].type=version&&version[2]&&version[2]==="4"?"LPDDR4X":result2[0].type,result2[0].ecc=!1,result2[0].clockSpeed=version&&version[2]&&clockSpeed[version[2]]||400,result2[0].clockSpeed=version&&version[4]&&version[4]==="d"?500:result2[0].clockSpeed,result2[0].formFactor="SoC",stdout2=
|
|
3278
|
-
`);let freq=parseInt(util4.getValue(lines,"sdram_freq","=",!0),10)||0;if(freq)result2[0].clockSpeed=freq;stdout2=
|
|
3285
|
+
`),sizeString=util4.getValue(lines,"Size"),size=sizeString.indexOf("GB")>=0?parseInt(sizeString,10)*1024*1024*1024:parseInt(sizeString,10)*1024*1024,bank=util4.getValue(lines,"Bank Locator");if(bank.toLowerCase().indexOf("bad")>=0)bank="";if(parseInt(util4.getValue(lines,"Size"),10)>0){let totalWidth=util4.toInt(util4.getValue(lines,"Total Width")),dataWidth=util4.toInt(util4.getValue(lines,"Data Width"));result2.push({size,bank,type:util4.getValue(lines,"Type:"),ecc:dataWidth&&totalWidth?totalWidth>dataWidth:!1,clockSpeed:util4.getValue(lines,"Configured Clock Speed:")?parseInt(util4.getValue(lines,"Configured Clock Speed:"),10):util4.getValue(lines,"Speed:")?parseInt(util4.getValue(lines,"Speed:"),10):null,formFactor:util4.getValue(lines,"Form Factor:"),manufacturer:getManufacturer(util4.getValue(lines,"Manufacturer:")),partNum:util4.getValue(lines,"Part Number:"),serialNum:util4.getValue(lines,"Serial Number:"),voltageConfigured:parseFloat(util4.getValue(lines,"Configured Voltage:"))||null,voltageMin:parseFloat(util4.getValue(lines,"Minimum Voltage:"))||null,voltageMax:parseFloat(util4.getValue(lines,"Maximum Voltage:"))||null})}else result2.push({size:0,bank,type:"Empty",ecc:null,clockSpeed:0,formFactor:util4.getValue(lines,"Form Factor:"),partNum:"",serialNum:"",voltageConfigured:null,voltageMin:null,voltageMax:null})})}if(!result2.length){result2.push({size:os4.totalmem(),bank:"",type:"",ecc:null,clockSpeed:0,formFactor:"",partNum:"",serialNum:"",voltageConfigured:null,voltageMin:null,voltageMax:null});try{let stdout2=execSync18("cat /proc/cpuinfo 2>/dev/null",util4.execOptsLinux),lines=stdout2.toString().split(`
|
|
3286
|
+
`),version=util4.getValue(lines,"revision",":",!0).toLowerCase();if(util4.isRaspberry(lines)){let clockSpeed={0:400,1:450,2:450,3:3200,4:4267};result2[0].type="LPDDR2",result2[0].type=version&&version[2]&&version[2]==="3"?"LPDDR4":result2[0].type,result2[0].type=version&&version[2]&&version[2]==="4"?"LPDDR4X":result2[0].type,result2[0].ecc=!1,result2[0].clockSpeed=version&&version[2]&&clockSpeed[version[2]]||400,result2[0].clockSpeed=version&&version[4]&&version[4]==="d"?500:result2[0].clockSpeed,result2[0].formFactor="SoC",stdout2=execSync18("vcgencmd get_config sdram_freq 2>/dev/null",util4.execOptsLinux),lines=stdout2.toString().split(`
|
|
3287
|
+
`);let freq=parseInt(util4.getValue(lines,"sdram_freq","=",!0),10)||0;if(freq)result2[0].clockSpeed=freq;stdout2=execSync18("vcgencmd measure_volts sdram_p 2>/dev/null",util4.execOptsLinux),lines=stdout2.toString().split(`
|
|
3279
3288
|
`);let voltage=parseFloat(util4.getValue(lines,"volt","=",!0))||0;if(voltage)result2[0].voltageConfigured=voltage,result2[0].voltageMin=voltage,result2[0].voltageMax=voltage}}catch{util4.noop()}}if(callback)callback(result2);resolve14(result2)});if(_darwin)exec3("system_profiler SPMemoryDataType",(error2,stdout)=>{if(!error2){let allLines=stdout.toString().split(`
|
|
3280
3289
|
`),eccStatus=util4.getValue(allLines,"ecc",":",!0).toLowerCase(),devices=stdout.toString().split(" BANK "),hasBank=!0;if(devices.length===1)devices=stdout.toString().split(" DIMM"),hasBank=!1;devices.shift(),devices.forEach((device)=>{let lines=device.split(`
|
|
3281
3290
|
`),bank=(hasBank?"BANK ":"DIMM")+lines[0].trim().split("/")[0],size=parseInt(util4.getValue(lines," Size"));if(size)result2.push({size:size*1024*1024*1024,bank,type:util4.getValue(lines," Type:"),ecc:eccStatus?eccStatus==="enabled":null,clockSpeed:parseInt(util4.getValue(lines," Speed:"),10),formFactor:"",manufacturer:getManufacturer(util4.getValue(lines," Manufacturer:")),partNum:util4.getValue(lines," Part Number:"),serialNum:util4.getValue(lines," Serial Number:"),voltageConfigured:null,voltageMin:null,voltageMax:null});else result2.push({size:0,bank,type:"Empty",ecc:null,clockSpeed:0,formFactor:"",manufacturer:"",partNum:"",serialNum:"",voltageConfigured:null,voltageMin:null,voltageMax:null})})}if(!result2.length){let lines=stdout.toString().split(`
|
|
@@ -3286,9 +3295,9 @@ echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`,(e
|
|
|
3286
3295
|
`);result2.cycleCount=parseInt("0"+util4.getValue(lines,"cyclecount","="),10),result2.voltage=parseInt("0"+util4.getValue(lines,"voltage","="),10)/1000,result2.capacityUnit=result2.voltage?"mWh":"mAh",result2.maxCapacity=Math.round(parseInt("0"+util4.getValue(lines,"applerawmaxcapacity","="),10)*(result2.voltage||1)),result2.currentCapacity=Math.round(parseInt("0"+util4.getValue(lines,"applerawcurrentcapacity","="),10)*(result2.voltage||1)),result2.designedCapacity=Math.round(parseInt("0"+util4.getValue(lines,"DesignCapacity","="),10)*(result2.voltage||1)),result2.manufacturer="Apple",result2.serial=util4.getValue(lines,"BatterySerialNumber","=")||util4.getValue(lines,"Serial","="),result2.model=util4.getValue(lines,"DeviceName","=");let percent=null,parts=util4.getValue(lines,"internal","Battery").split(";");if(parts&&parts[0]){let parts2=parts[0].split("\t");if(parts2&&parts2[1])percent=parseFloat(parts2[1].trim().replace(/%/g,""))}if(parts&&parts[1])result2.isCharging=parts[1].trim()==="charging",result2.acConnected=parts[1].trim()!=="discharging";else result2.isCharging=util4.getValue(lines,"ischarging","=").toLowerCase()==="yes",result2.acConnected=result2.isCharging;if(result2.maxCapacity&&result2.currentCapacity){if(result2.hasBattery=!0,result2.type="Li-ion",result2.percent=percent!==null?percent:Math.round(100*result2.currentCapacity/result2.maxCapacity),!result2.isCharging)result2.timeRemaining=parseInt("0"+util4.getValue(lines,"TimeRemaining","="),10)}}if(callback)callback(result2);resolve14(result2)});if(_sunos){if(callback)callback(result2);resolve14(result2)}if(_windows)try{let workload=[];workload.push(util4.powerShell("Get-CimInstance Win32_Battery | select BatteryStatus, DesignCapacity, DesignVoltage, EstimatedChargeRemaining, DeviceID | fl")),workload.push(util4.powerShell("(Get-WmiObject -Class BatteryStaticData -Namespace ROOT/WMI).DesignedCapacity")),workload.push(util4.powerShell("(Get-CimInstance -Class BatteryFullChargedCapacity -Namespace ROOT/WMI).FullChargedCapacity")),util4.promiseAll(workload).then((data)=>{if(data){let parts=data.results[0].split(/\n\s*\n/),batteries=[],hasValue=(value)=>/\S/.test(value);for(let i2=0;i2<parts.length;i2++)if(hasValue(parts[i2]))batteries.push(parts[i2]);let designCapacities=data.results[1].split(`\r
|
|
3287
3296
|
`).filter((e)=>e),fullChargeCapacities=data.results[2].split(`\r
|
|
3288
3297
|
`).filter((e)=>e);if(batteries.length){let first=!1,additionalBatteries=[];for(let i2=0;i2<batteries.length;i2++){let lines=batteries[i2].split(`\r
|
|
3289
|
-
`),designedCapacity=designCapacities&&designCapacities.length>=i2+1&&designCapacities[i2]?util4.toInt(designCapacities[i2]):0,fullChargeCapacity=fullChargeCapacities&&fullChargeCapacities.length>=i2+1&&fullChargeCapacities[i2]?util4.toInt(fullChargeCapacities[i2]):0,parsed=parseWinBatteryPart(lines,designedCapacity,fullChargeCapacity);if(!first&&parsed.status>0&&parsed.status!==10)result2.hasBattery=parsed.hasBattery,result2.maxCapacity=parsed.maxCapacity,result2.designedCapacity=parsed.designedCapacity,result2.voltage=parsed.voltage,result2.capacityUnit=parsed.capacityUnit,result2.percent=parsed.percent,result2.currentCapacity=parsed.currentCapacity,result2.isCharging=parsed.isCharging,result2.acConnected=parsed.acConnected,result2.model=parsed.model,first=!0;else if(parsed.status!==-1)additionalBatteries.push({hasBattery:parsed.hasBattery,maxCapacity:parsed.maxCapacity,designedCapacity:parsed.designedCapacity,voltage:parsed.voltage,capacityUnit:parsed.capacityUnit,percent:parsed.percent,currentCapacity:parsed.currentCapacity,isCharging:parsed.isCharging,timeRemaining:null,acConnected:parsed.acConnected,model:parsed.model,type:"",manufacturer:"",serial:""})}if(!first&&additionalBatteries.length)result2=additionalBatteries[0],additionalBatteries.shift();if(additionalBatteries.length)result2.additionalBatteries=additionalBatteries}}if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}})})});var require_graphics=__commonJS((exports)=>{var fs3=__require("fs"),path6=__require("path"),exec3=__require("child_process").exec,
|
|
3290
|
-
`);for(let i3=0;i3<pciIDs.length;i3++)pciIDs[i3]=pciIDs[i3].replace("Bus Address:","").replace("0000:","").trim();pciIDs=pciIDs.filter((el)=>el!=null&&el)}catch{util4.noop()}let i2=1;if(lines.forEach((line)=>{let subsystem="";if(i2<lines.length&&lines[i2]){if(subsystem=lines[i2],subsystem.indexOf(":")>0)subsystem=subsystem.split(":")[1]}if(line.trim()!==""){if(line[0]!==" "&&line[0]!=="\t"){let isExternal=pciIDs.indexOf(line.split(" ")[0])>=0,vgapos=line.toLowerCase().indexOf(" vga "),_3dcontrollerpos=line.toLowerCase().indexOf("3d controller");if(vgapos!==-1||_3dcontrollerpos!==-1){if(_3dcontrollerpos!==-1&&vgapos===-1)vgapos=_3dcontrollerpos;if(currentController.vendor||currentController.model||currentController.bus||currentController.vram!==null||currentController.vramDynamic)controllers.push(currentController),currentController={vendor:"",model:"",bus:"",busAddress:"",vram:null,vramDynamic:!1};let pciIDCandidate=line.split(" ")[0];if(/[\da-fA-F]{2}:[\da-fA-F]{2}\.[\da-fA-F]/.test(pciIDCandidate))currentController.busAddress=pciIDCandidate;isGraphicsController=!0;let endpos=line.search(/\[[0-9a-f]{4}:[0-9a-f]{4}]|$/),parts=line.substr(vgapos,endpos-vgapos).split(":");if(currentController.busAddress=line.substr(0,vgapos).trim(),parts.length>1){if(parts[1]=parts[1].trim(),parts[1].toLowerCase().indexOf("corporation")>=0)currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf("corporation")+11).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf("corporation")+11,200).split("(")[0].trim(),currentController.bus=pciIDs.length>0&&isExternal?"PCIe":"Onboard",currentController.vram=null,currentController.vramDynamic=!1;else if(parts[1].toLowerCase().indexOf(" inc.")>=0){if((parts[1].match(/]/g)||[]).length>1)currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf("]")+1).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf("]")+1,200).trim().split("(")[0].trim();else currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf(" inc.")+5).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf(" inc.")+5,200).trim().split("(")[0].trim();currentController.bus=pciIDs.length>0&&isExternal?"PCIe":"Onboard",currentController.vram=null,currentController.vramDynamic=!1}else if(parts[1].toLowerCase().indexOf(" ltd.")>=0)if((parts[1].match(/]/g)||[]).length>1)currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf("]")+1).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf("]")+1,200).trim().split("(")[0].trim();else currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf(" ltd.")+5).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf(" ltd.")+5,200).trim().split("(")[0].trim();if(currentController.model&&subsystem.indexOf(currentController.model)!==-1){let subVendor=subsystem.split(currentController.model)[0].trim();if(subVendor)currentController.subVendor=subVendor}}}else isGraphicsController=!1}if(isGraphicsController){let parts=line.split(":");if(parts.length>1&&parts[0].replace(/ +/g,"").toLowerCase().indexOf("devicename")!==-1&&parts[1].toLowerCase().indexOf("onboard")!==-1)currentController.bus="Onboard";if(parts.length>1&&parts[0].replace(/ +/g,"").toLowerCase().indexOf("region")!==-1&&parts[1].toLowerCase().indexOf("memory")!==-1){let memparts=parts[1].split("=");if(memparts.length>1)currentController.vram=parseInt(memparts[1])}}}i2++}),currentController.vendor||currentController.model||currentController.bus||currentController.busAddress||currentController.vram!==null||currentController.vramDynamic)controllers.push(currentController);return controllers}function parseLinesLinuxClinfo(controllers,lines){let fieldPattern=/\[([^\]]+)\]\s+(\w+)\s+(.*)/,devices=lines.reduce((devices2,line)=>{let field=fieldPattern.exec(line.trim());if(field){if(!devices2[field[1]])devices2[field[1]]={};devices2[field[1]][field[2]]=field[3]}return devices2},{});for(let deviceId in devices){let device=devices[deviceId];if(device.CL_DEVICE_TYPE==="CL_DEVICE_TYPE_GPU"){let busAddress;if(device.CL_DEVICE_TOPOLOGY_AMD){let bdf=device.CL_DEVICE_TOPOLOGY_AMD.match(/[a-zA-Z0-9]+:\d+\.\d+/);if(bdf)busAddress=bdf[0]}else if(device.CL_DEVICE_PCI_BUS_ID_NV&&device.CL_DEVICE_PCI_SLOT_ID_NV){let bus=parseInt(device.CL_DEVICE_PCI_BUS_ID_NV),slot=parseInt(device.CL_DEVICE_PCI_SLOT_ID_NV);if(!isNaN(bus)&&!isNaN(slot)){let b3=bus&255,d2=slot>>3&255,f=slot&7;busAddress=`${b3.toString().padStart(2,"0")}:${d2.toString().padStart(2,"0")}.${f}`}}if(busAddress){let controller=controllers.find((controller2)=>controller2.busAddress===busAddress);if(!controller)controller={vendor:"",model:"",bus:"",busAddress,vram:null,vramDynamic:!1},controllers.push(controller);if(controller.vendor=device.CL_DEVICE_VENDOR,device.CL_DEVICE_BOARD_NAME_AMD)controller.model=device.CL_DEVICE_BOARD_NAME_AMD;else controller.model=device.CL_DEVICE_NAME;let memory=parseInt(device.CL_DEVICE_GLOBAL_MEM_SIZE);if(!isNaN(memory))controller.vram=Math.round(memory/1024/1024)}}}return controllers}function getNvidiaSmi(){if(_nvidiaSmiPath)return _nvidiaSmiPath;if(_windows)try{let basePath=path6.join(util4.WINDIR,"System32","DriverStore","FileRepository"),candidates=fs3.readdirSync(basePath,{withFileTypes:!0}).filter((dir)=>dir.isDirectory()).map((dir)=>{let nvidiaSmiPath=path6.join(basePath,dir.name,"nvidia-smi.exe");try{let stats2=fs3.statSync(nvidiaSmiPath);return{path:nvidiaSmiPath,ctime:stats2.ctimeMs}}catch{return null}}).filter(Boolean);if(candidates.length>0)_nvidiaSmiPath=candidates.reduce((prev,curr)=>curr.ctime>prev.ctime?curr:prev).path}catch{util4.noop()}else if(_linux)_nvidiaSmiPath="nvidia-smi";return _nvidiaSmiPath}function nvidiaSmi(options){let nvidiaSmiExe=getNvidiaSmi();if(options=options||util4.execOptsWin,nvidiaSmiExe){let cmd=`"${nvidiaSmiExe}" --query-gpu=driver_version,pci.sub_device_id,name,pci.bus_id,fan.speed,memory.total,memory.used,memory.free,utilization.gpu,utilization.memory,temperature.gpu,temperature.memory,power.draw,power.limit,clocks.gr,clocks.mem --format=csv,noheader,nounits`;if(_linux)options.stdio=["pipe","pipe","ignore"];try{let sanitized=cmd+(_linux?" 2>/dev/null":"")+(_windows?" 2> nul":"");return
|
|
3291
|
-
`).filter(Boolean).map((gpu)=>{let splittedData=gpu.split(", ").map((value)=>value.includes("N/A")?void 0:value);if(splittedData.length===16)return{driverVersion:splittedData[0],subDeviceId:splittedData[1],name:splittedData[2],pciBus:splittedData[3],fanSpeed:safeParseNumber(splittedData[4]),memoryTotal:safeParseNumber(splittedData[5]),memoryUsed:safeParseNumber(splittedData[6]),memoryFree:safeParseNumber(splittedData[7]),utilizationGpu:safeParseNumber(splittedData[8]),utilizationMemory:safeParseNumber(splittedData[9]),temperatureGpu:safeParseNumber(splittedData[10]),temperatureMemory:safeParseNumber(splittedData[11]),powerDraw:safeParseNumber(splittedData[12]),powerLimit:safeParseNumber(splittedData[13]),clockCore:safeParseNumber(splittedData[14]),clockMemory:safeParseNumber(splittedData[15])};else return{}});return results=results.filter((item)=>{return"pciBus"in item}),results}function mergeControllerNvidia(controller,nvidia){if(nvidia.driverVersion)controller.driverVersion=nvidia.driverVersion;if(nvidia.subDeviceId)controller.subDeviceId=nvidia.subDeviceId;if(nvidia.name)controller.name=nvidia.name;if(nvidia.pciBus)controller.pciBus=nvidia.pciBus;if(nvidia.fanSpeed)controller.fanSpeed=nvidia.fanSpeed;if(nvidia.memoryTotal)controller.memoryTotal=nvidia.memoryTotal,controller.vram=nvidia.memoryTotal,controller.vramDynamic=!1;if(nvidia.memoryUsed)controller.memoryUsed=nvidia.memoryUsed;if(nvidia.memoryFree)controller.memoryFree=nvidia.memoryFree;if(nvidia.utilizationGpu)controller.utilizationGpu=nvidia.utilizationGpu;if(nvidia.utilizationMemory)controller.utilizationMemory=nvidia.utilizationMemory;if(nvidia.temperatureGpu)controller.temperatureGpu=nvidia.temperatureGpu;if(nvidia.temperatureMemory)controller.temperatureMemory=nvidia.temperatureMemory;if(nvidia.powerDraw)controller.powerDraw=nvidia.powerDraw;if(nvidia.powerLimit)controller.powerLimit=nvidia.powerLimit;if(nvidia.clockCore)controller.clockCore=nvidia.clockCore;if(nvidia.clockMemory)controller.clockMemory=nvidia.clockMemory;return controller}function parseLinesLinuxEdid(edid){let result2={vendor:"",model:"",deviceName:"",main:!1,builtin:!1,connection:"",sizeX:null,sizeY:null,pixelDepth:null,resolutionX:null,resolutionY:null,currentResX:null,currentResY:null,positionX:0,positionY:0,currentRefreshRate:null},start3=108;if(edid.substr(start3,6)==="000000")start3+=36;if(edid.substr(start3,6)==="000000")start3+=36;if(edid.substr(start3,6)==="000000")start3+=36;if(edid.substr(start3,6)==="000000")start3+=36;if(result2.resolutionX=parseInt("0x0"+edid.substr(start3+8,1)+edid.substr(start3+4,2)),result2.resolutionY=parseInt("0x0"+edid.substr(start3+14,1)+edid.substr(start3+10,2)),result2.sizeX=parseInt("0x0"+edid.substr(start3+28,1)+edid.substr(start3+24,2)),result2.sizeY=parseInt("0x0"+edid.substr(start3+29,1)+edid.substr(start3+26,2)),start3=edid.indexOf("000000fc00"),start3>=0){let model_raw=edid.substr(start3+10,26);if(model_raw.indexOf("0a")!==-1)model_raw=model_raw.substr(0,model_raw.indexOf("0a"));try{if(model_raw.length>2)result2.model=model_raw.match(/.{1,2}/g).map((v2)=>String.fromCharCode(parseInt(v2,16))).join("")}catch{util4.noop()}}else result2.model="";return result2}function parseLinesLinuxDisplays(lines,depth){let displays=[],currentDisplay={vendor:"",model:"",deviceName:"",main:!1,builtin:!1,connection:"",sizeX:null,sizeY:null,pixelDepth:null,resolutionX:null,resolutionY:null,currentResX:null,currentResY:null,positionX:0,positionY:0,currentRefreshRate:null},is_edid=!1,is_current=!1,edid_raw="",start3=0;for(let i2=1;i2<lines.length;i2++)if(lines[i2].trim()!==""){if(lines[i2][0]!==" "&&lines[i2][0]!=="\t"&&lines[i2].toLowerCase().indexOf(" connected ")!==-1){if(currentDisplay.model||currentDisplay.main||currentDisplay.builtin||currentDisplay.connection||currentDisplay.sizeX!==null||currentDisplay.pixelDepth!==null||currentDisplay.resolutionX!==null)displays.push(currentDisplay),currentDisplay={vendor:"",model:"",main:!1,builtin:!1,connection:"",sizeX:null,sizeY:null,pixelDepth:null,resolutionX:null,resolutionY:null,currentResX:null,currentResY:null,positionX:0,positionY:0,currentRefreshRate:null};let parts=lines[i2].split(" ");currentDisplay.connection=parts[0],currentDisplay.main=lines[i2].toLowerCase().indexOf(" primary ")>=0,currentDisplay.builtin=parts[0].toLowerCase().indexOf("edp")>=0}if(is_edid)if(lines[i2].search(/\S|$/)>start3)edid_raw+=lines[i2].toLowerCase().trim();else{let edid_decoded=parseLinesLinuxEdid(edid_raw);currentDisplay.vendor=edid_decoded.vendor,currentDisplay.model=edid_decoded.model,currentDisplay.resolutionX=edid_decoded.resolutionX,currentDisplay.resolutionY=edid_decoded.resolutionY,currentDisplay.sizeX=edid_decoded.sizeX,currentDisplay.sizeY=edid_decoded.sizeY,currentDisplay.pixelDepth=depth,is_edid=!1}if(lines[i2].toLowerCase().indexOf("edid:")>=0)is_edid=!0,start3=lines[i2].search(/\S|$/);if(lines[i2].toLowerCase().indexOf("*current")>=0){let parts1=lines[i2].split("(");if(parts1&&parts1.length>1&&parts1[0].indexOf("x")>=0){let resParts=parts1[0].trim().split("x");currentDisplay.currentResX=util4.toInt(resParts[0]),currentDisplay.currentResY=util4.toInt(resParts[1])}is_current=!0}if(is_current&&lines[i2].toLowerCase().indexOf("clock")>=0&&lines[i2].toLowerCase().indexOf("hz")>=0&&lines[i2].toLowerCase().indexOf("v: height")>=0){let parts1=lines[i2].split("clock");if(parts1&&parts1.length>1&&parts1[1].toLowerCase().indexOf("hz")>=0)currentDisplay.currentRefreshRate=util4.toInt(parts1[1]);is_current=!1}}if(currentDisplay.model||currentDisplay.main||currentDisplay.builtin||currentDisplay.connection||currentDisplay.sizeX!==null||currentDisplay.pixelDepth!==null||currentDisplay.resolutionX!==null)displays.push(currentDisplay);return displays}return new Promise((resolve14)=>{process.nextTick(()=>{let result2={controllers:[],displays:[]};if(_darwin)exec3("system_profiler -xml -detailLevel full SPDisplaysDataType",(error2,stdout)=>{if(!error2){try{let output=stdout.toString();result2=parseLinesDarwin(util4.plistParser(output)[0]._items)}catch(e){util4.noop()}try{stdout=
|
|
3298
|
+
`),designedCapacity=designCapacities&&designCapacities.length>=i2+1&&designCapacities[i2]?util4.toInt(designCapacities[i2]):0,fullChargeCapacity=fullChargeCapacities&&fullChargeCapacities.length>=i2+1&&fullChargeCapacities[i2]?util4.toInt(fullChargeCapacities[i2]):0,parsed=parseWinBatteryPart(lines,designedCapacity,fullChargeCapacity);if(!first&&parsed.status>0&&parsed.status!==10)result2.hasBattery=parsed.hasBattery,result2.maxCapacity=parsed.maxCapacity,result2.designedCapacity=parsed.designedCapacity,result2.voltage=parsed.voltage,result2.capacityUnit=parsed.capacityUnit,result2.percent=parsed.percent,result2.currentCapacity=parsed.currentCapacity,result2.isCharging=parsed.isCharging,result2.acConnected=parsed.acConnected,result2.model=parsed.model,first=!0;else if(parsed.status!==-1)additionalBatteries.push({hasBattery:parsed.hasBattery,maxCapacity:parsed.maxCapacity,designedCapacity:parsed.designedCapacity,voltage:parsed.voltage,capacityUnit:parsed.capacityUnit,percent:parsed.percent,currentCapacity:parsed.currentCapacity,isCharging:parsed.isCharging,timeRemaining:null,acConnected:parsed.acConnected,model:parsed.model,type:"",manufacturer:"",serial:""})}if(!first&&additionalBatteries.length)result2=additionalBatteries[0],additionalBatteries.shift();if(additionalBatteries.length)result2.additionalBatteries=additionalBatteries}}if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}})})});var require_graphics=__commonJS((exports)=>{var fs3=__require("fs"),path6=__require("path"),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,util4=require_util3(),_platform=process.platform,_nvidiaSmiPath="",_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos",_resolutionX=0,_resolutionY=0,_pixelDepth=0,_refreshRate=0,videoTypes={"-2":"UNINITIALIZED","-1":"OTHER",0:"HD15",1:"SVIDEO",2:"Composite video",3:"Component video",4:"DVI",5:"HDMI",6:"LVDS",8:"D_JPN",9:"SDI",10:"DP",11:"DP embedded",12:"UDI",13:"UDI embedded",14:"SDTVDONGLE",15:"MIRACAST",2147483648:"INTERNAL"};function getVendorFromModel(model){let manufacturers=[{pattern:"^LG.+",manufacturer:"LG"},{pattern:"^BENQ.+",manufacturer:"BenQ"},{pattern:"^ASUS.+",manufacturer:"Asus"},{pattern:"^DELL.+",manufacturer:"Dell"},{pattern:"^SAMSUNG.+",manufacturer:"Samsung"},{pattern:"^VIEWSON.+",manufacturer:"ViewSonic"},{pattern:"^SONY.+",manufacturer:"Sony"},{pattern:"^ACER.+",manufacturer:"Acer"},{pattern:"^AOC.+",manufacturer:"AOC Monitors"},{pattern:"^HP.+",manufacturer:"HP"},{pattern:"^EIZO.?",manufacturer:"Eizo"},{pattern:"^PHILIPS.?",manufacturer:"Philips"},{pattern:"^IIYAMA.?",manufacturer:"Iiyama"},{pattern:"^SHARP.?",manufacturer:"Sharp"},{pattern:"^NEC.?",manufacturer:"NEC"},{pattern:"^LENOVO.?",manufacturer:"Lenovo"},{pattern:"COMPAQ.?",manufacturer:"Compaq"},{pattern:"APPLE.?",manufacturer:"Apple"},{pattern:"INTEL.?",manufacturer:"Intel"},{pattern:"AMD.?",manufacturer:"AMD"},{pattern:"NVIDIA.?",manufacturer:"NVDIA"}],result2="";if(model)model=model.toUpperCase(),manufacturers.forEach((manufacturer)=>{if(RegExp(manufacturer.pattern).test(model))result2=manufacturer.manufacturer});return result2}function getVendorFromId(id){return{610:"Apple","1e6d":"LG","10ac":"DELL","4dd9":"Sony","38a3":"NEC"}[id]||""}function vendorToId(str5){let result2="";if(str5=(str5||"").toLowerCase(),str5.indexOf("apple")>=0)result2="0x05ac";else if(str5.indexOf("nvidia")>=0)result2="0x10de";else if(str5.indexOf("intel")>=0)result2="0x8086";else if(str5.indexOf("ati")>=0||str5.indexOf("amd")>=0)result2="0x1002";return result2}function getMetalVersion(id){return{spdisplays_mtlgpufamilymac1:"mac1",spdisplays_mtlgpufamilymac2:"mac2",spdisplays_mtlgpufamilyapple1:"apple1",spdisplays_mtlgpufamilyapple2:"apple2",spdisplays_mtlgpufamilyapple3:"apple3",spdisplays_mtlgpufamilyapple4:"apple4",spdisplays_mtlgpufamilyapple5:"apple5",spdisplays_mtlgpufamilyapple6:"apple6",spdisplays_mtlgpufamilyapple7:"apple7",spdisplays_metalfeaturesetfamily11:"family1_v1",spdisplays_metalfeaturesetfamily12:"family1_v2",spdisplays_metalfeaturesetfamily13:"family1_v3",spdisplays_metalfeaturesetfamily14:"family1_v4",spdisplays_metalfeaturesetfamily21:"family2_v1"}[id]||""}function graphics(callback){function parseLinesDarwin(graphicsArr){let res={controllers:[],displays:[]};try{return graphicsArr.forEach((item)=>{let bus=(item.sppci_bus||"").indexOf("builtin")>-1?"Built-In":(item.sppci_bus||"").indexOf("pcie")>-1?"PCIe":"",vram=(parseInt(item.spdisplays_vram||"",10)||0)*((item.spdisplays_vram||"").indexOf("GB")>-1?1024:1),vramDyn=(parseInt(item.spdisplays_vram_shared||"",10)||0)*((item.spdisplays_vram_shared||"").indexOf("GB")>-1?1024:1),metalVersion=getMetalVersion(item.spdisplays_metal||item.spdisplays_metalfamily||"");if(res.controllers.push({vendor:getVendorFromModel(item.spdisplays_vendor||"")||item.spdisplays_vendor||"",model:item.sppci_model||"",bus,vramDynamic:bus==="Built-In",vram:vram||vramDyn||null,deviceId:item["spdisplays_device-id"]||"",vendorId:item["spdisplays_vendor-id"]||vendorToId((item.spdisplays_vendor||"")+(item.sppci_model||"")),external:item.sppci_device_type==="spdisplays_egpu",cores:item.sppci_cores||null,metalVersion}),item.spdisplays_ndrvs&&item.spdisplays_ndrvs.length)item.spdisplays_ndrvs.forEach((displayItem)=>{let connectionType=displayItem.spdisplays_connection_type||"",currentResolutionParts=(displayItem._spdisplays_resolution||"").split("@"),currentResolution=currentResolutionParts[0].split("x"),pixelParts=(displayItem._spdisplays_pixels||"").split("x"),pixelDepthString=displayItem.spdisplays_depth||"",serial=displayItem["_spdisplays_display-serial-number"]||displayItem["_spdisplays_display-serial-number2"]||null;res.displays.push({vendor:getVendorFromId(displayItem["_spdisplays_display-vendor-id"]||"")||getVendorFromModel(displayItem._name||""),vendorId:displayItem["_spdisplays_display-vendor-id"]||"",model:displayItem._name||"",productionYear:displayItem["_spdisplays_display-year"]||null,serial:serial!=="0"?serial:null,displayId:displayItem._spdisplays_displayID||null,main:displayItem.spdisplays_main?displayItem.spdisplays_main==="spdisplays_yes":!1,builtin:(displayItem.spdisplays_display_type||"").indexOf("built-in")>-1,connection:connectionType.indexOf("_internal")>-1?"Internal":connectionType.indexOf("_displayport")>-1?"Display Port":connectionType.indexOf("_hdmi")>-1?"HDMI":null,sizeX:null,sizeY:null,pixelDepth:pixelDepthString==="CGSThirtyBitColor"?30:pixelDepthString==="CGSThirtytwoBitColor"?32:pixelDepthString==="CGSTwentyfourBitColor"?24:null,resolutionX:pixelParts.length>1?parseInt(pixelParts[0],10):null,resolutionY:pixelParts.length>1?parseInt(pixelParts[1],10):null,currentResX:currentResolution.length>1?parseInt(currentResolution[0],10):null,currentResY:currentResolution.length>1?parseInt(currentResolution[1],10):null,positionX:0,positionY:0,currentRefreshRate:currentResolutionParts.length>1?parseInt(currentResolutionParts[1],10):null})})}),res}catch(e){return res}}function parseLinesLinuxControllers(lines){let controllers=[],currentController={vendor:"",subVendor:"",model:"",bus:"",busAddress:"",vram:null,vramDynamic:!1,pciID:""},isGraphicsController=!1,pciIDs=[];try{pciIDs=execSync18('export LC_ALL=C; dmidecode -t 9 2>/dev/null; unset LC_ALL | grep "Bus Address: "',util4.execOptsLinux).toString().split(`
|
|
3299
|
+
`);for(let i3=0;i3<pciIDs.length;i3++)pciIDs[i3]=pciIDs[i3].replace("Bus Address:","").replace("0000:","").trim();pciIDs=pciIDs.filter((el)=>el!=null&&el)}catch{util4.noop()}let i2=1;if(lines.forEach((line)=>{let subsystem="";if(i2<lines.length&&lines[i2]){if(subsystem=lines[i2],subsystem.indexOf(":")>0)subsystem=subsystem.split(":")[1]}if(line.trim()!==""){if(line[0]!==" "&&line[0]!=="\t"){let isExternal=pciIDs.indexOf(line.split(" ")[0])>=0,vgapos=line.toLowerCase().indexOf(" vga "),_3dcontrollerpos=line.toLowerCase().indexOf("3d controller");if(vgapos!==-1||_3dcontrollerpos!==-1){if(_3dcontrollerpos!==-1&&vgapos===-1)vgapos=_3dcontrollerpos;if(currentController.vendor||currentController.model||currentController.bus||currentController.vram!==null||currentController.vramDynamic)controllers.push(currentController),currentController={vendor:"",model:"",bus:"",busAddress:"",vram:null,vramDynamic:!1};let pciIDCandidate=line.split(" ")[0];if(/[\da-fA-F]{2}:[\da-fA-F]{2}\.[\da-fA-F]/.test(pciIDCandidate))currentController.busAddress=pciIDCandidate;isGraphicsController=!0;let endpos=line.search(/\[[0-9a-f]{4}:[0-9a-f]{4}]|$/),parts=line.substr(vgapos,endpos-vgapos).split(":");if(currentController.busAddress=line.substr(0,vgapos).trim(),parts.length>1){if(parts[1]=parts[1].trim(),parts[1].toLowerCase().indexOf("corporation")>=0)currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf("corporation")+11).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf("corporation")+11,200).split("(")[0].trim(),currentController.bus=pciIDs.length>0&&isExternal?"PCIe":"Onboard",currentController.vram=null,currentController.vramDynamic=!1;else if(parts[1].toLowerCase().indexOf(" inc.")>=0){if((parts[1].match(/]/g)||[]).length>1)currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf("]")+1).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf("]")+1,200).trim().split("(")[0].trim();else currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf(" inc.")+5).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf(" inc.")+5,200).trim().split("(")[0].trim();currentController.bus=pciIDs.length>0&&isExternal?"PCIe":"Onboard",currentController.vram=null,currentController.vramDynamic=!1}else if(parts[1].toLowerCase().indexOf(" ltd.")>=0)if((parts[1].match(/]/g)||[]).length>1)currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf("]")+1).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf("]")+1,200).trim().split("(")[0].trim();else currentController.vendor=parts[1].substr(0,parts[1].toLowerCase().indexOf(" ltd.")+5).trim(),currentController.model=parts[1].substr(parts[1].toLowerCase().indexOf(" ltd.")+5,200).trim().split("(")[0].trim();if(currentController.model&&subsystem.indexOf(currentController.model)!==-1){let subVendor=subsystem.split(currentController.model)[0].trim();if(subVendor)currentController.subVendor=subVendor}}}else isGraphicsController=!1}if(isGraphicsController){let parts=line.split(":");if(parts.length>1&&parts[0].replace(/ +/g,"").toLowerCase().indexOf("devicename")!==-1&&parts[1].toLowerCase().indexOf("onboard")!==-1)currentController.bus="Onboard";if(parts.length>1&&parts[0].replace(/ +/g,"").toLowerCase().indexOf("region")!==-1&&parts[1].toLowerCase().indexOf("memory")!==-1){let memparts=parts[1].split("=");if(memparts.length>1)currentController.vram=parseInt(memparts[1])}}}i2++}),currentController.vendor||currentController.model||currentController.bus||currentController.busAddress||currentController.vram!==null||currentController.vramDynamic)controllers.push(currentController);return controllers}function parseLinesLinuxClinfo(controllers,lines){let fieldPattern=/\[([^\]]+)\]\s+(\w+)\s+(.*)/,devices=lines.reduce((devices2,line)=>{let field=fieldPattern.exec(line.trim());if(field){if(!devices2[field[1]])devices2[field[1]]={};devices2[field[1]][field[2]]=field[3]}return devices2},{});for(let deviceId in devices){let device=devices[deviceId];if(device.CL_DEVICE_TYPE==="CL_DEVICE_TYPE_GPU"){let busAddress;if(device.CL_DEVICE_TOPOLOGY_AMD){let bdf=device.CL_DEVICE_TOPOLOGY_AMD.match(/[a-zA-Z0-9]+:\d+\.\d+/);if(bdf)busAddress=bdf[0]}else if(device.CL_DEVICE_PCI_BUS_ID_NV&&device.CL_DEVICE_PCI_SLOT_ID_NV){let bus=parseInt(device.CL_DEVICE_PCI_BUS_ID_NV),slot=parseInt(device.CL_DEVICE_PCI_SLOT_ID_NV);if(!isNaN(bus)&&!isNaN(slot)){let b3=bus&255,d2=slot>>3&255,f=slot&7;busAddress=`${b3.toString().padStart(2,"0")}:${d2.toString().padStart(2,"0")}.${f}`}}if(busAddress){let controller=controllers.find((controller2)=>controller2.busAddress===busAddress);if(!controller)controller={vendor:"",model:"",bus:"",busAddress,vram:null,vramDynamic:!1},controllers.push(controller);if(controller.vendor=device.CL_DEVICE_VENDOR,device.CL_DEVICE_BOARD_NAME_AMD)controller.model=device.CL_DEVICE_BOARD_NAME_AMD;else controller.model=device.CL_DEVICE_NAME;let memory=parseInt(device.CL_DEVICE_GLOBAL_MEM_SIZE);if(!isNaN(memory))controller.vram=Math.round(memory/1024/1024)}}}return controllers}function getNvidiaSmi(){if(_nvidiaSmiPath)return _nvidiaSmiPath;if(_windows)try{let basePath=path6.join(util4.WINDIR,"System32","DriverStore","FileRepository"),candidates=fs3.readdirSync(basePath,{withFileTypes:!0}).filter((dir)=>dir.isDirectory()).map((dir)=>{let nvidiaSmiPath=path6.join(basePath,dir.name,"nvidia-smi.exe");try{let stats2=fs3.statSync(nvidiaSmiPath);return{path:nvidiaSmiPath,ctime:stats2.ctimeMs}}catch{return null}}).filter(Boolean);if(candidates.length>0)_nvidiaSmiPath=candidates.reduce((prev,curr)=>curr.ctime>prev.ctime?curr:prev).path}catch{util4.noop()}else if(_linux)_nvidiaSmiPath="nvidia-smi";return _nvidiaSmiPath}function nvidiaSmi(options){let nvidiaSmiExe=getNvidiaSmi();if(options=options||util4.execOptsWin,nvidiaSmiExe){let cmd=`"${nvidiaSmiExe}" --query-gpu=driver_version,pci.sub_device_id,name,pci.bus_id,fan.speed,memory.total,memory.used,memory.free,utilization.gpu,utilization.memory,temperature.gpu,temperature.memory,power.draw,power.limit,clocks.gr,clocks.mem --format=csv,noheader,nounits`;if(_linux)options.stdio=["pipe","pipe","ignore"];try{let sanitized=cmd+(_linux?" 2>/dev/null":"")+(_windows?" 2> nul":"");return execSync18(sanitized,options).toString()}catch{util4.noop()}}return""}function nvidiaDevices(){function safeParseNumber(value){if([null,void 0].includes(value))return value;return parseFloat(value)}let stdout=nvidiaSmi();if(!stdout)return[];let results=stdout.split(`
|
|
3300
|
+
`).filter(Boolean).map((gpu)=>{let splittedData=gpu.split(", ").map((value)=>value.includes("N/A")?void 0:value);if(splittedData.length===16)return{driverVersion:splittedData[0],subDeviceId:splittedData[1],name:splittedData[2],pciBus:splittedData[3],fanSpeed:safeParseNumber(splittedData[4]),memoryTotal:safeParseNumber(splittedData[5]),memoryUsed:safeParseNumber(splittedData[6]),memoryFree:safeParseNumber(splittedData[7]),utilizationGpu:safeParseNumber(splittedData[8]),utilizationMemory:safeParseNumber(splittedData[9]),temperatureGpu:safeParseNumber(splittedData[10]),temperatureMemory:safeParseNumber(splittedData[11]),powerDraw:safeParseNumber(splittedData[12]),powerLimit:safeParseNumber(splittedData[13]),clockCore:safeParseNumber(splittedData[14]),clockMemory:safeParseNumber(splittedData[15])};else return{}});return results=results.filter((item)=>{return"pciBus"in item}),results}function mergeControllerNvidia(controller,nvidia){if(nvidia.driverVersion)controller.driverVersion=nvidia.driverVersion;if(nvidia.subDeviceId)controller.subDeviceId=nvidia.subDeviceId;if(nvidia.name)controller.name=nvidia.name;if(nvidia.pciBus)controller.pciBus=nvidia.pciBus;if(nvidia.fanSpeed)controller.fanSpeed=nvidia.fanSpeed;if(nvidia.memoryTotal)controller.memoryTotal=nvidia.memoryTotal,controller.vram=nvidia.memoryTotal,controller.vramDynamic=!1;if(nvidia.memoryUsed)controller.memoryUsed=nvidia.memoryUsed;if(nvidia.memoryFree)controller.memoryFree=nvidia.memoryFree;if(nvidia.utilizationGpu)controller.utilizationGpu=nvidia.utilizationGpu;if(nvidia.utilizationMemory)controller.utilizationMemory=nvidia.utilizationMemory;if(nvidia.temperatureGpu)controller.temperatureGpu=nvidia.temperatureGpu;if(nvidia.temperatureMemory)controller.temperatureMemory=nvidia.temperatureMemory;if(nvidia.powerDraw)controller.powerDraw=nvidia.powerDraw;if(nvidia.powerLimit)controller.powerLimit=nvidia.powerLimit;if(nvidia.clockCore)controller.clockCore=nvidia.clockCore;if(nvidia.clockMemory)controller.clockMemory=nvidia.clockMemory;return controller}function parseLinesLinuxEdid(edid){let result2={vendor:"",model:"",deviceName:"",main:!1,builtin:!1,connection:"",sizeX:null,sizeY:null,pixelDepth:null,resolutionX:null,resolutionY:null,currentResX:null,currentResY:null,positionX:0,positionY:0,currentRefreshRate:null},start3=108;if(edid.substr(start3,6)==="000000")start3+=36;if(edid.substr(start3,6)==="000000")start3+=36;if(edid.substr(start3,6)==="000000")start3+=36;if(edid.substr(start3,6)==="000000")start3+=36;if(result2.resolutionX=parseInt("0x0"+edid.substr(start3+8,1)+edid.substr(start3+4,2)),result2.resolutionY=parseInt("0x0"+edid.substr(start3+14,1)+edid.substr(start3+10,2)),result2.sizeX=parseInt("0x0"+edid.substr(start3+28,1)+edid.substr(start3+24,2)),result2.sizeY=parseInt("0x0"+edid.substr(start3+29,1)+edid.substr(start3+26,2)),start3=edid.indexOf("000000fc00"),start3>=0){let model_raw=edid.substr(start3+10,26);if(model_raw.indexOf("0a")!==-1)model_raw=model_raw.substr(0,model_raw.indexOf("0a"));try{if(model_raw.length>2)result2.model=model_raw.match(/.{1,2}/g).map((v2)=>String.fromCharCode(parseInt(v2,16))).join("")}catch{util4.noop()}}else result2.model="";return result2}function parseLinesLinuxDisplays(lines,depth){let displays=[],currentDisplay={vendor:"",model:"",deviceName:"",main:!1,builtin:!1,connection:"",sizeX:null,sizeY:null,pixelDepth:null,resolutionX:null,resolutionY:null,currentResX:null,currentResY:null,positionX:0,positionY:0,currentRefreshRate:null},is_edid=!1,is_current=!1,edid_raw="",start3=0;for(let i2=1;i2<lines.length;i2++)if(lines[i2].trim()!==""){if(lines[i2][0]!==" "&&lines[i2][0]!=="\t"&&lines[i2].toLowerCase().indexOf(" connected ")!==-1){if(currentDisplay.model||currentDisplay.main||currentDisplay.builtin||currentDisplay.connection||currentDisplay.sizeX!==null||currentDisplay.pixelDepth!==null||currentDisplay.resolutionX!==null)displays.push(currentDisplay),currentDisplay={vendor:"",model:"",main:!1,builtin:!1,connection:"",sizeX:null,sizeY:null,pixelDepth:null,resolutionX:null,resolutionY:null,currentResX:null,currentResY:null,positionX:0,positionY:0,currentRefreshRate:null};let parts=lines[i2].split(" ");currentDisplay.connection=parts[0],currentDisplay.main=lines[i2].toLowerCase().indexOf(" primary ")>=0,currentDisplay.builtin=parts[0].toLowerCase().indexOf("edp")>=0}if(is_edid)if(lines[i2].search(/\S|$/)>start3)edid_raw+=lines[i2].toLowerCase().trim();else{let edid_decoded=parseLinesLinuxEdid(edid_raw);currentDisplay.vendor=edid_decoded.vendor,currentDisplay.model=edid_decoded.model,currentDisplay.resolutionX=edid_decoded.resolutionX,currentDisplay.resolutionY=edid_decoded.resolutionY,currentDisplay.sizeX=edid_decoded.sizeX,currentDisplay.sizeY=edid_decoded.sizeY,currentDisplay.pixelDepth=depth,is_edid=!1}if(lines[i2].toLowerCase().indexOf("edid:")>=0)is_edid=!0,start3=lines[i2].search(/\S|$/);if(lines[i2].toLowerCase().indexOf("*current")>=0){let parts1=lines[i2].split("(");if(parts1&&parts1.length>1&&parts1[0].indexOf("x")>=0){let resParts=parts1[0].trim().split("x");currentDisplay.currentResX=util4.toInt(resParts[0]),currentDisplay.currentResY=util4.toInt(resParts[1])}is_current=!0}if(is_current&&lines[i2].toLowerCase().indexOf("clock")>=0&&lines[i2].toLowerCase().indexOf("hz")>=0&&lines[i2].toLowerCase().indexOf("v: height")>=0){let parts1=lines[i2].split("clock");if(parts1&&parts1.length>1&&parts1[1].toLowerCase().indexOf("hz")>=0)currentDisplay.currentRefreshRate=util4.toInt(parts1[1]);is_current=!1}}if(currentDisplay.model||currentDisplay.main||currentDisplay.builtin||currentDisplay.connection||currentDisplay.sizeX!==null||currentDisplay.pixelDepth!==null||currentDisplay.resolutionX!==null)displays.push(currentDisplay);return displays}return new Promise((resolve14)=>{process.nextTick(()=>{let result2={controllers:[],displays:[]};if(_darwin)exec3("system_profiler -xml -detailLevel full SPDisplaysDataType",(error2,stdout)=>{if(!error2){try{let output=stdout.toString();result2=parseLinesDarwin(util4.plistParser(output)[0]._items)}catch(e){util4.noop()}try{stdout=execSync18('defaults read /Library/Preferences/com.apple.windowserver.plist 2>/dev/null;defaults read /Library/Preferences/com.apple.windowserver.displays.plist 2>/dev/null; echo ""',{maxBuffer:104857600});let output=(stdout||"").toString(),obj=util4.plistReader(output);if(obj.DisplayAnyUserSets&&obj.DisplayAnyUserSets.Configs&&obj.DisplayAnyUserSets.Configs[0]&&obj.DisplayAnyUserSets.Configs[0].DisplayConfig){let current=obj.DisplayAnyUserSets.Configs[0].DisplayConfig,i2=0;current.forEach((o)=>{if(o.CurrentInfo&&o.CurrentInfo.OriginX!==void 0&&result2.displays&&result2.displays[i2])result2.displays[i2].positionX=o.CurrentInfo.OriginX;if(o.CurrentInfo&&o.CurrentInfo.OriginY!==void 0&&result2.displays&&result2.displays[i2])result2.displays[i2].positionY=o.CurrentInfo.OriginY;i2++})}if(obj.DisplayAnyUserSets&&obj.DisplayAnyUserSets.length>0&&obj.DisplayAnyUserSets[0].length>0&&obj.DisplayAnyUserSets[0][0].DisplayID){let current=obj.DisplayAnyUserSets[0],i2=0;current.forEach((o)=>{if("OriginX"in o&&result2.displays&&result2.displays[i2])result2.displays[i2].positionX=o.OriginX;if("OriginY"in o&&result2.displays&&result2.displays[i2])result2.displays[i2].positionY=o.OriginY;if(o.Mode&&o.Mode.BitsPerPixel!==void 0&&result2.displays&&result2.displays[i2])result2.displays[i2].pixelDepth=o.Mode.BitsPerPixel;i2++})}}catch{util4.noop()}}if(callback)callback(result2);resolve14(result2)});if(_linux){if(util4.isRaspberry())exec3(`fbset -s 2> /dev/null | grep 'mode "' ; vcgencmd get_mem gpu 2> /dev/null; tvservice -s 2> /dev/null; tvservice -n 2> /dev/null;`,(error2,stdout)=>{let lines=stdout.toString().split(`
|
|
3292
3301
|
`);if(lines.length>3&&lines[0].indexOf('mode "')>=-1&&lines[2].indexOf("0x12000a")>-1){let parts=lines[0].replace("mode","").replace(/"/g,"").trim().split("x");if(parts.length===2)result2.displays.push({vendor:"",model:util4.getValue(lines,"device_name","="),main:!0,builtin:!1,connection:"HDMI",sizeX:null,sizeY:null,pixelDepth:null,resolutionX:parseInt(parts[0],10),resolutionY:parseInt(parts[1],10),currentResX:null,currentResY:null,positionX:0,positionY:0,currentRefreshRate:null})}if(lines.length>=1&&stdout.toString().indexOf("gpu=")>=-1)result2.controllers.push({vendor:"Broadcom",model:util4.getRpiGpu(),bus:"",vram:util4.getValue(lines,"gpu","=").replace("M",""),vramDynamic:!0})});exec3("lspci -vvv 2>/dev/null",(error2,stdout)=>{if(!error2){let lines=stdout.toString().split(`
|
|
3293
3302
|
`);if(result2.controllers.length===0){result2.controllers=parseLinesLinuxControllers(lines);let nvidiaData=nvidiaDevices();result2.controllers=result2.controllers.map((controller)=>{return mergeControllerNvidia(controller,nvidiaData.find((contr)=>contr.pciBus.toLowerCase().endsWith(controller.busAddress.toLowerCase()))||{})})}}exec3("clinfo --raw",(error3,stdout2)=>{if(!error3){let lines=stdout2.toString().split(`
|
|
3294
3303
|
`);result2.controllers=parseLinesLinuxClinfo(result2.controllers,lines)}exec3("xdpyinfo 2>/dev/null | grep 'depth of root window' | awk '{ print $5 }'",(error4,stdout3)=>{let depth=0;if(!error4){let lines=stdout3.toString().split(`
|
|
@@ -3299,16 +3308,16 @@ echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`,(e
|
|
|
3299
3308
|
`);vendor=util4.getValue(linesDisplay,"MonitorManufacturer",":"),model=util4.getValue(linesDisplay,"Name",":"),deviceID=util4.getValue(linesDisplay,"PNPDeviceID",":").replace(/&/g,"&").toLowerCase(),resolutionX=util4.toInt(util4.getValue(linesDisplay,"ScreenWidth",":")),resolutionY=util4.toInt(util4.getValue(linesDisplay,"ScreenHeight",":"))}for(let i2=0;i2<ssections.length;i2++)if(ssections[i2].trim()!==""){if(ssections[i2]="BitsPerPixel "+ssections[i2],msections[i2]="Active "+msections[i2],tsections.length===0||tsections[i2]===void 0)tsections[i2]="Unknown";let linesScreen=ssections[i2].split(`
|
|
3300
3309
|
`),linesMonitor=msections[i2].split(`
|
|
3301
3310
|
`),linesConnection=tsections[i2].split(`
|
|
3302
|
-
`),bitsPerPixel=util4.getValue(linesScreen,"BitsPerPixel"),bounds=util4.getValue(linesScreen,"Bounds").replace("{","").replace("}","").replace(/=/g,":").split(","),primary=util4.getValue(linesScreen,"Primary"),sizeX=util4.getValue(linesMonitor,"MaxHorizontalImageSize"),sizeY=util4.getValue(linesMonitor,"MaxVerticalImageSize"),instanceName=util4.getValue(linesMonitor,"InstanceName").toLowerCase(),videoOutputTechnology=util4.getValue(linesConnection,"VideoOutputTechnology"),deviceName=util4.getValue(linesScreen,"DeviceName"),displayVendor="",displayModel="";isections.forEach((element)=>{if(element.instanceId.toLowerCase().startsWith(instanceName)&&vendor.startsWith("(")&&model.startsWith("PnP"))displayVendor=element.vendor,displayModel=element.model}),displays.push({vendor:instanceName.startsWith(deviceID)&&displayVendor===""?vendor:displayVendor,model:instanceName.startsWith(deviceID)&&displayModel===""?model:displayModel,deviceName,main:primary.toLowerCase()==="true",builtin:videoOutputTechnology==="2147483648",connection:videoOutputTechnology&&videoTypes[videoOutputTechnology]?videoTypes[videoOutputTechnology]:"",resolutionX:util4.toInt(util4.getValue(bounds,"Width",":")),resolutionY:util4.toInt(util4.getValue(bounds,"Height",":")),sizeX:sizeX?parseInt(sizeX,10):null,sizeY:sizeY?parseInt(sizeY,10):null,pixelDepth:bitsPerPixel,currentResX:util4.toInt(util4.getValue(bounds,"Width",":")),currentResY:util4.toInt(util4.getValue(bounds,"Height",":")),positionX:util4.toInt(util4.getValue(bounds,"X",":")),positionY:util4.toInt(util4.getValue(bounds,"Y",":"))})}if(ssections.length===0)displays.push({vendor,model,main:!0,sizeX:null,sizeY:null,resolutionX,resolutionY,pixelDepth:null,currentResX:resolutionX,currentResY:resolutionY,positionX:0,positionY:0});return displays}}exports.graphics=graphics});var require_filesystem=__commonJS((exports)=>{var util4=require_util3(),fs3=__require("fs"),os4=__require("os"),exec3=__require("child_process").exec,
|
|
3303
|
-
`);if(lines.shift(),stdout.toString().toLowerCase().indexOf("filesystem")){let removeLines=0;for(let i2=0;i2<lines.length;i2++)if(lines[i2]&&lines[i2].toLowerCase().startsWith("filesystem"))removeLines=i2;for(let i2=0;i2<removeLines;i2++)lines.shift()}return lines}function parseDf(lines){let data=[];return lines.forEach((line)=>{if(line!==""){if(line=line.replace(/ +/g," ").split(" "),line&&(line[0].startsWith("/")||line[6]&&line[6]==="/"||line[0].indexOf("/")>0||line[0].indexOf(":")===1||!_darwin&&!isLinuxTmpFs(line[1]))){let fs4=line[0],fsType=_linux||_freebsd||_openbsd||_netbsd?line[1]:getmacOsFsType(line[0]),size=parseInt(_linux||_freebsd||_openbsd||_netbsd?line[2]:line[1],10)*1024,used=parseInt(_linux||_freebsd||_openbsd||_netbsd?line[3]:line[2],10)*1024,available=parseInt(_linux||_freebsd||_openbsd||_netbsd?line[4]:line[3],10)*1024,use=parseFloat((100*(used/(used+available))).toFixed(2)),rw=osMounts&&Object.keys(osMounts).length>0?osMounts[fs4]||!1:null;line.splice(0,_linux||_freebsd||_openbsd||_netbsd?6:5);let mount=line.join(" ");if(!data.find((el)=>el.fs===fs4&&el.type===fsType&&el.mount===mount))data.push({fs:fs4,type:fsType,size,used,available,use,mount,rw})}}}),data}return new Promise((resolve14)=>{process.nextTick(()=>{let data=[];if(_linux||_freebsd||_openbsd||_netbsd||_darwin){let cmd="";if(macOsDisks=[],osMounts={},_darwin){cmd="df -kP";try{macOsDisks=
|
|
3304
|
-
`).filter((line)=>{return!line.startsWith("/")&&line.indexOf(":")>0}),
|
|
3305
|
-
`).filter((line)=>{return line.startsWith("/")}).forEach((line)=>{osMounts[line.split(" ")[0]]=line.toLowerCase().indexOf("read-only")===-1})}catch{util4.noop()}}if(_linux)try{cmd="export LC_ALL=C; df -kPTx squashfs; unset LC_ALL",
|
|
3306
|
-
`).filter((line)=>{return line.startsWith("/")}).forEach((line)=>{if(osMounts[line.split(" ")[0]]=osMounts[line.split(" ")[0]]||!1,line.toLowerCase().indexOf("/snap/")===-1)osMounts[line.split(" ")[0]]=line.toLowerCase().indexOf("rw,")>=0||line.toLowerCase().indexOf(" rw ")>=0})}catch{util4.noop()}if(_freebsd||_openbsd||_netbsd)try{cmd="df -kPT",
|
|
3311
|
+
`),bitsPerPixel=util4.getValue(linesScreen,"BitsPerPixel"),bounds=util4.getValue(linesScreen,"Bounds").replace("{","").replace("}","").replace(/=/g,":").split(","),primary=util4.getValue(linesScreen,"Primary"),sizeX=util4.getValue(linesMonitor,"MaxHorizontalImageSize"),sizeY=util4.getValue(linesMonitor,"MaxVerticalImageSize"),instanceName=util4.getValue(linesMonitor,"InstanceName").toLowerCase(),videoOutputTechnology=util4.getValue(linesConnection,"VideoOutputTechnology"),deviceName=util4.getValue(linesScreen,"DeviceName"),displayVendor="",displayModel="";isections.forEach((element)=>{if(element.instanceId.toLowerCase().startsWith(instanceName)&&vendor.startsWith("(")&&model.startsWith("PnP"))displayVendor=element.vendor,displayModel=element.model}),displays.push({vendor:instanceName.startsWith(deviceID)&&displayVendor===""?vendor:displayVendor,model:instanceName.startsWith(deviceID)&&displayModel===""?model:displayModel,deviceName,main:primary.toLowerCase()==="true",builtin:videoOutputTechnology==="2147483648",connection:videoOutputTechnology&&videoTypes[videoOutputTechnology]?videoTypes[videoOutputTechnology]:"",resolutionX:util4.toInt(util4.getValue(bounds,"Width",":")),resolutionY:util4.toInt(util4.getValue(bounds,"Height",":")),sizeX:sizeX?parseInt(sizeX,10):null,sizeY:sizeY?parseInt(sizeY,10):null,pixelDepth:bitsPerPixel,currentResX:util4.toInt(util4.getValue(bounds,"Width",":")),currentResY:util4.toInt(util4.getValue(bounds,"Height",":")),positionX:util4.toInt(util4.getValue(bounds,"X",":")),positionY:util4.toInt(util4.getValue(bounds,"Y",":"))})}if(ssections.length===0)displays.push({vendor,model,main:!0,sizeX:null,sizeY:null,resolutionX,resolutionY,pixelDepth:null,currentResX:resolutionX,currentResY:resolutionY,positionX:0,positionY:0});return displays}}exports.graphics=graphics});var require_filesystem=__commonJS((exports)=>{var util4=require_util3(),fs3=__require("fs"),os4=__require("os"),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,execPromiseSave=util4.promisifySave(__require("child_process").exec),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos",_fs_speed={},_disk_io={};function fsSize(drive,callback){if(util4.isFunction(drive))callback=drive,drive="";let macOsDisks=[],osMounts=[];function getmacOsFsType(fs4){if(!fs4.startsWith("/"))return"NFS";let parts=fs4.split("/"),fsShort=parts[parts.length-1],macOsDisksSingle=macOsDisks.filter((item)=>item.indexOf(fsShort)>=0);if(macOsDisksSingle.length===1&&macOsDisksSingle[0].indexOf("APFS")>=0)return"APFS";return"HFS"}function isLinuxTmpFs(fs4){let linuxTmpFileSystems=["rootfs","unionfs","squashfs","cramfs","initrd","initramfs","devtmpfs","tmpfs","udev","devfs","specfs","type","appimaged"],result2=!1;return linuxTmpFileSystems.forEach((linuxFs)=>{if(fs4.toLowerCase().indexOf(linuxFs)>=0)result2=!0}),result2}function filterLines(stdout){let lines=stdout.toString().split(`
|
|
3312
|
+
`);if(lines.shift(),stdout.toString().toLowerCase().indexOf("filesystem")){let removeLines=0;for(let i2=0;i2<lines.length;i2++)if(lines[i2]&&lines[i2].toLowerCase().startsWith("filesystem"))removeLines=i2;for(let i2=0;i2<removeLines;i2++)lines.shift()}return lines}function parseDf(lines){let data=[];return lines.forEach((line)=>{if(line!==""){if(line=line.replace(/ +/g," ").split(" "),line&&(line[0].startsWith("/")||line[6]&&line[6]==="/"||line[0].indexOf("/")>0||line[0].indexOf(":")===1||!_darwin&&!isLinuxTmpFs(line[1]))){let fs4=line[0],fsType=_linux||_freebsd||_openbsd||_netbsd?line[1]:getmacOsFsType(line[0]),size=parseInt(_linux||_freebsd||_openbsd||_netbsd?line[2]:line[1],10)*1024,used=parseInt(_linux||_freebsd||_openbsd||_netbsd?line[3]:line[2],10)*1024,available=parseInt(_linux||_freebsd||_openbsd||_netbsd?line[4]:line[3],10)*1024,use=parseFloat((100*(used/(used+available))).toFixed(2)),rw=osMounts&&Object.keys(osMounts).length>0?osMounts[fs4]||!1:null;line.splice(0,_linux||_freebsd||_openbsd||_netbsd?6:5);let mount=line.join(" ");if(!data.find((el)=>el.fs===fs4&&el.type===fsType&&el.mount===mount))data.push({fs:fs4,type:fsType,size,used,available,use,mount,rw})}}}),data}return new Promise((resolve14)=>{process.nextTick(()=>{let data=[];if(_linux||_freebsd||_openbsd||_netbsd||_darwin){let cmd="";if(macOsDisks=[],osMounts={},_darwin){cmd="df -kP";try{macOsDisks=execSync18("diskutil list").toString().split(`
|
|
3313
|
+
`).filter((line)=>{return!line.startsWith("/")&&line.indexOf(":")>0}),execSync18("mount").toString().split(`
|
|
3314
|
+
`).filter((line)=>{return line.startsWith("/")}).forEach((line)=>{osMounts[line.split(" ")[0]]=line.toLowerCase().indexOf("read-only")===-1})}catch{util4.noop()}}if(_linux)try{cmd="export LC_ALL=C; df -kPTx squashfs; unset LC_ALL",execSync18("cat /proc/mounts 2>/dev/null",util4.execOptsLinux).toString().split(`
|
|
3315
|
+
`).filter((line)=>{return line.startsWith("/")}).forEach((line)=>{if(osMounts[line.split(" ")[0]]=osMounts[line.split(" ")[0]]||!1,line.toLowerCase().indexOf("/snap/")===-1)osMounts[line.split(" ")[0]]=line.toLowerCase().indexOf("rw,")>=0||line.toLowerCase().indexOf(" rw ")>=0})}catch{util4.noop()}if(_freebsd||_openbsd||_netbsd)try{cmd="df -kPT",execSync18("mount").toString().split(`
|
|
3307
3316
|
`).forEach((line)=>{osMounts[line.split(" ")[0]]=line.toLowerCase().indexOf("read-only")===-1})}catch{util4.noop()}exec3(cmd,{maxBuffer:1048576},(error2,stdout)=>{let lines=filterLines(stdout);if(data=parseDf(lines),drive)data=data.filter((item)=>{return item.fs.toLowerCase().indexOf(drive.toLowerCase())>=0||item.mount.toLowerCase().indexOf(drive.toLowerCase())>=0});if((!error2||data.length)&&stdout.toString().trim()!==""){if(callback)callback(data);resolve14(data)}else exec3("df -kPT 2>/dev/null",{maxBuffer:1048576},(error3,stdout2)=>{let lines2=filterLines(stdout2);if(data=parseDf(lines2),callback)callback(data);resolve14(data)})})}if(_sunos){if(callback)callback(data);resolve14(data)}if(_windows)try{let driveSanitized=drive?util4.sanitizeShellString(drive,!0):"",cmd=`Get-WmiObject Win32_logicaldisk | select Access,Caption,FileSystem,FreeSpace,Size ${driveSanitized?"| where -property Caption -eq "+driveSanitized:""} | fl`;util4.powerShell(cmd).then((stdout,error2)=>{if(!error2)stdout.toString().split(/\n\s*\n/).forEach((device)=>{let lines=device.split(`\r
|
|
3308
3317
|
`),size=util4.toInt(util4.getValue(lines,"size",":")),free=util4.toInt(util4.getValue(lines,"freespace",":")),caption=util4.getValue(lines,"caption",":"),rwValue=util4.getValue(lines,"access",":"),rw=rwValue?util4.toInt(rwValue)!==1:null;if(size)data.push({fs:caption,type:util4.getValue(lines,"filesystem",":"),size,used:size-free,available:free,use:parseFloat((100*(size-free)/size).toFixed(2)),mount:caption,rw})});if(callback)callback(data);resolve14(data)})}catch{if(callback)callback(data);resolve14(data)}})})}exports.fsSize=fsSize;function fsOpenFiles(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2={max:null,allocated:null,available:null};if(_freebsd||_openbsd||_netbsd||_darwin)exec3("sysctl -i kern.maxfiles kern.num_files kern.open_files",{maxBuffer:1048576},(error2,stdout)=>{if(!error2){let lines=stdout.toString().split(`
|
|
3309
3318
|
`);result2.max=parseInt(util4.getValue(lines,"kern.maxfiles",":"),10),result2.allocated=parseInt(util4.getValue(lines,"kern.num_files",":"),10)||parseInt(util4.getValue(lines,"kern.open_files",":"),10),result2.available=result2.max-result2.allocated}if(callback)callback(result2);resolve14(result2)});if(_linux)fs3.readFile("/proc/sys/fs/file-nr",(error2,stdout)=>{if(!error2){let lines=stdout.toString().split(`
|
|
3310
3319
|
`);if(lines[0]){let parts=lines[0].replace(/\s+/g," ").split(" ");if(parts.length===3){if(result2.allocated=parseInt(parts[0],10),result2.available=parseInt(parts[1],10),result2.max=parseInt(parts[2],10),!result2.available)result2.available=result2.max-result2.allocated}}if(callback)callback(result2);resolve14(result2)}else fs3.readFile("/proc/sys/fs/file-max",(error3,stdout2)=>{if(!error3){let lines=stdout2.toString().split(`
|
|
3311
|
-
`);if(lines[0])result2.max=parseInt(lines[0],10)}if(callback)callback(result2);resolve14(result2)})});if(_sunos){if(callback)callback(null);resolve14(null)}if(_windows){if(callback)callback(null);resolve14(null)}})})}exports.fsOpenFiles=fsOpenFiles;function parseBytes(s2){return parseInt(s2.substr(s2.indexOf(" (")+2,s2.indexOf(" Bytes)")-10),10)}function parseDevices(lines){let devices=[],i2=0;return lines.forEach((line)=>{if(line.length>0)if(line[0]==="*")i2++;else{let parts=line.split(":");if(parts.length>1){if(!devices[i2])devices[i2]={name:"",identifier:"",type:"disk",fsType:"",mount:"",size:0,physical:"HDD",uuid:"",label:"",model:"",serial:"",removable:!1,protocol:"",group:"",device:""};if(parts[0]=parts[0].trim().toUpperCase().replace(/ +/g,""),parts[1]=parts[1].trim(),parts[0]==="DEVICEIDENTIFIER")devices[i2].identifier=parts[1];if(parts[0]==="DEVICENODE")devices[i2].name=parts[1];if(parts[0]==="VOLUMENAME"){if(parts[1].indexOf("Not applicable")===-1)devices[i2].label=parts[1]}if(parts[0]==="PROTOCOL")devices[i2].protocol=parts[1];if(parts[0]==="DISKSIZE")devices[i2].size=parseBytes(parts[1]);if(parts[0]==="FILESYSTEMPERSONALITY")devices[i2].fsType=parts[1];if(parts[0]==="MOUNTPOINT")devices[i2].mount=parts[1];if(parts[0]==="VOLUMEUUID")devices[i2].uuid=parts[1];if(parts[0]==="READ-ONLYMEDIA"&&parts[1]==="Yes")devices[i2].physical="CD/DVD";if(parts[0]==="SOLIDSTATE"&&parts[1]==="Yes")devices[i2].physical="SSD";if(parts[0]==="VIRTUAL")devices[i2].type="virtual";if(parts[0]==="REMOVABLEMEDIA")devices[i2].removable=parts[1]==="Removable";if(parts[0]==="PARTITIONTYPE")devices[i2].type="part";if(parts[0]==="DEVICE/MEDIANAME")devices[i2].model=parts[1]}}}),devices}function parseBlk(lines){let data=[];return lines.filter((line)=>line!=="").forEach((line)=>{try{line=decodeURIComponent(line.replace(/\\x/g,"%")),line=line.replace(/\\/g,"\\\\");let disk=JSON.parse(line);data.push({name:util4.sanitizeShellString(disk.name),type:disk.type,fsType:disk.fsType,mount:disk.mountpoint,size:parseInt(disk.size,10),physical:disk.type==="disk"?disk.rota==="0"?"SSD":"HDD":disk.type==="rom"?"CD/DVD":"",uuid:disk.uuid,label:disk.label,model:(disk.model||"").trim(),serial:disk.serial,removable:disk.rm==="1",protocol:disk.tran,group:disk.group||""})}catch{util4.noop()}}),data=util4.unique(data),data=util4.sortByKey(data,["type","name"]),data}function decodeMdabmData(lines){let raid=util4.getValue(lines,"md_level","="),label=util4.getValue(lines,"md_name","="),uuid=util4.getValue(lines,"md_uuid","="),members=[];return lines.forEach((line)=>{if(line.toLowerCase().startsWith("md_device_dev")&&line.toLowerCase().indexOf("/dev/")>0)members.push(line.split("/dev/")[1])}),{raid,label,uuid,members}}function raidMatchLinux(data){let result2=data;try{data.forEach((element)=>{if(element.type.startsWith("raid")){let lines=
|
|
3320
|
+
`);if(lines[0])result2.max=parseInt(lines[0],10)}if(callback)callback(result2);resolve14(result2)})});if(_sunos){if(callback)callback(null);resolve14(null)}if(_windows){if(callback)callback(null);resolve14(null)}})})}exports.fsOpenFiles=fsOpenFiles;function parseBytes(s2){return parseInt(s2.substr(s2.indexOf(" (")+2,s2.indexOf(" Bytes)")-10),10)}function parseDevices(lines){let devices=[],i2=0;return lines.forEach((line)=>{if(line.length>0)if(line[0]==="*")i2++;else{let parts=line.split(":");if(parts.length>1){if(!devices[i2])devices[i2]={name:"",identifier:"",type:"disk",fsType:"",mount:"",size:0,physical:"HDD",uuid:"",label:"",model:"",serial:"",removable:!1,protocol:"",group:"",device:""};if(parts[0]=parts[0].trim().toUpperCase().replace(/ +/g,""),parts[1]=parts[1].trim(),parts[0]==="DEVICEIDENTIFIER")devices[i2].identifier=parts[1];if(parts[0]==="DEVICENODE")devices[i2].name=parts[1];if(parts[0]==="VOLUMENAME"){if(parts[1].indexOf("Not applicable")===-1)devices[i2].label=parts[1]}if(parts[0]==="PROTOCOL")devices[i2].protocol=parts[1];if(parts[0]==="DISKSIZE")devices[i2].size=parseBytes(parts[1]);if(parts[0]==="FILESYSTEMPERSONALITY")devices[i2].fsType=parts[1];if(parts[0]==="MOUNTPOINT")devices[i2].mount=parts[1];if(parts[0]==="VOLUMEUUID")devices[i2].uuid=parts[1];if(parts[0]==="READ-ONLYMEDIA"&&parts[1]==="Yes")devices[i2].physical="CD/DVD";if(parts[0]==="SOLIDSTATE"&&parts[1]==="Yes")devices[i2].physical="SSD";if(parts[0]==="VIRTUAL")devices[i2].type="virtual";if(parts[0]==="REMOVABLEMEDIA")devices[i2].removable=parts[1]==="Removable";if(parts[0]==="PARTITIONTYPE")devices[i2].type="part";if(parts[0]==="DEVICE/MEDIANAME")devices[i2].model=parts[1]}}}),devices}function parseBlk(lines){let data=[];return lines.filter((line)=>line!=="").forEach((line)=>{try{line=decodeURIComponent(line.replace(/\\x/g,"%")),line=line.replace(/\\/g,"\\\\");let disk=JSON.parse(line);data.push({name:util4.sanitizeShellString(disk.name),type:disk.type,fsType:disk.fsType,mount:disk.mountpoint,size:parseInt(disk.size,10),physical:disk.type==="disk"?disk.rota==="0"?"SSD":"HDD":disk.type==="rom"?"CD/DVD":"",uuid:disk.uuid,label:disk.label,model:(disk.model||"").trim(),serial:disk.serial,removable:disk.rm==="1",protocol:disk.tran,group:disk.group||""})}catch{util4.noop()}}),data=util4.unique(data),data=util4.sortByKey(data,["type","name"]),data}function decodeMdabmData(lines){let raid=util4.getValue(lines,"md_level","="),label=util4.getValue(lines,"md_name","="),uuid=util4.getValue(lines,"md_uuid","="),members=[];return lines.forEach((line)=>{if(line.toLowerCase().startsWith("md_device_dev")&&line.toLowerCase().indexOf("/dev/")>0)members.push(line.split("/dev/")[1])}),{raid,label,uuid,members}}function raidMatchLinux(data){let result2=data;try{data.forEach((element)=>{if(element.type.startsWith("raid")){let lines=execSync18(`mdadm --export --detail /dev/${element.name}`,util4.execOptsLinux).toString().split(`
|
|
3312
3321
|
`),mdData=decodeMdabmData(lines);if(element.label=mdData.label,element.uuid=mdData.uuid,mdData&&mdData.members&&mdData.members.length&&mdData.raid===element.type)result2=result2.map((blockdevice)=>{if(blockdevice.fsType==="linux_raid_member"&&mdData.members.indexOf(blockdevice.name)>=0)blockdevice.group=element.name;return blockdevice})}})}catch{util4.noop()}return result2}function getDevicesLinux(data){let result2=[];return data.forEach((element)=>{if(element.type.startsWith("disk"))result2.push(element.name)}),result2}function matchDevicesLinux(data){let result2=data;try{let devices=getDevicesLinux(data);result2=result2.map((blockdevice)=>{if(blockdevice.type.startsWith("part")||blockdevice.type.startsWith("disk"))devices.forEach((element)=>{if(blockdevice.name.startsWith(element))blockdevice.device="/dev/"+element});return blockdevice})}catch{util4.noop()}return result2}function getDevicesMac(data){let result2=[];return data.forEach((element)=>{if(element.type.startsWith("disk"))result2.push({name:element.name,model:element.model,device:element.name});if(element.type.startsWith("virtual")){let device="";if(result2.forEach((e)=>{if(e.model===element.model)device=e.device}),device)result2.push({name:element.name,model:element.model,device})}}),result2}function matchDevicesMac(data){let result2=data;try{let devices=getDevicesMac(data);result2=result2.map((blockdevice)=>{if(blockdevice.type.startsWith("part")||blockdevice.type.startsWith("disk")||blockdevice.type.startsWith("virtual"))devices.forEach((element)=>{if(blockdevice.name.startsWith(element.name))blockdevice.device=element.device});return blockdevice})}catch{util4.noop()}return result2}function getDevicesWin(diskDrives){let result2=[];return diskDrives.forEach((element)=>{let lines=element.split(`\r
|
|
3313
3322
|
`),device=util4.getValue(lines,"DeviceID",":"),partitions=element.split("@{DeviceID=");if(partitions.length>1)partitions=partitions.slice(1),partitions.forEach((partition)=>{result2.push({name:partition.split(";")[0].toUpperCase(),device})})}),result2}function matchDevicesWin(data,diskDrives){let devices=getDevicesWin(diskDrives);return data.map((element)=>{let filteresDevices=devices.filter((e)=>{return e.name===element.name.toUpperCase()});if(filteresDevices.length>0)element.device=filteresDevices[0].device;return element}),data}function blkStdoutToObject(stdout){return stdout.toString().replace(/NAME=/g,'{"name":').replace(/FSTYPE=/g,',"fsType":').replace(/TYPE=/g,',"type":').replace(/SIZE=/g,',"size":').replace(/MOUNTPOINT=/g,',"mountpoint":').replace(/UUID=/g,',"uuid":').replace(/ROTA=/g,',"rota":').replace(/RO=/g,',"ro":').replace(/RM=/g,',"rm":').replace(/TRAN=/g,',"tran":').replace(/SERIAL=/g,',"serial":').replace(/LABEL=/g,',"label":').replace(/MODEL=/g,',"model":').replace(/OWNER=/g,',"owner":').replace(/GROUP=/g,',"group":').replace(/\n/g,`}
|
|
3314
3323
|
`)}function blockDevices(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let data=[];if(_linux)exec3("lsblk -bPo NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT,UUID,ROTA,RO,RM,TRAN,SERIAL,LABEL,MODEL,OWNER 2>/dev/null",{maxBuffer:1048576},(error2,stdout)=>{if(!error2){let lines=blkStdoutToObject(stdout).split(`
|
|
@@ -3322,8 +3331,8 @@ echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`,(e
|
|
|
3322
3331
|
`).forEach((line)=>{if(line=line.trim(),line!=="")line=line.split(","),rx+=parseInt(line[2],10),wx+=parseInt(line[9],10)}),result2=calcFsSpeed(rx,wx);if(callback)callback(result2);resolve14(result2)}).on("error",()=>{if(callback)callback(result2);resolve14(result2)})}else{if(result2.ms=_fs_speed.last_ms,result2.rx=_fs_speed.bytes_read,result2.wx=_fs_speed.bytes_write,result2.tx=_fs_speed.bytes_read+_fs_speed.bytes_write,result2.rx_sec=_fs_speed.rx_sec,result2.wx_sec=_fs_speed.wx_sec,result2.tx_sec=_fs_speed.tx_sec,callback)callback(result2);resolve14(result2)}})})}exports.fsStats=fsStats;function calcDiskIO(rIO,wIO,rWaitTime,wWaitTime,tWaitTime){let result2={rIO:0,wIO:0,tIO:0,rIO_sec:null,wIO_sec:null,tIO_sec:null,rWaitTime:0,wWaitTime:0,tWaitTime:0,rWaitPercent:null,wWaitPercent:null,tWaitPercent:null,ms:0};if(_disk_io&&_disk_io.ms)result2.rIO=rIO,result2.wIO=wIO,result2.tIO=rIO+wIO,result2.ms=Date.now()-_disk_io.ms,result2.rIO_sec=(result2.rIO-_disk_io.rIO)/(result2.ms/1000),result2.wIO_sec=(result2.wIO-_disk_io.wIO)/(result2.ms/1000),result2.tIO_sec=result2.rIO_sec+result2.wIO_sec,result2.rWaitTime=rWaitTime,result2.wWaitTime=wWaitTime,result2.tWaitTime=tWaitTime,result2.rWaitPercent=(result2.rWaitTime-_disk_io.rWaitTime)*100/result2.ms,result2.wWaitPercent=(result2.wWaitTime-_disk_io.wWaitTime)*100/result2.ms,result2.tWaitPercent=(result2.tWaitTime-_disk_io.tWaitTime)*100/result2.ms,_disk_io.rIO=rIO,_disk_io.wIO=wIO,_disk_io.rIO_sec=result2.rIO_sec,_disk_io.wIO_sec=result2.wIO_sec,_disk_io.tIO_sec=result2.tIO_sec,_disk_io.rWaitTime=rWaitTime,_disk_io.wWaitTime=wWaitTime,_disk_io.tWaitTime=tWaitTime,_disk_io.rWaitPercent=result2.rWaitPercent,_disk_io.wWaitPercent=result2.wWaitPercent,_disk_io.tWaitPercent=result2.tWaitPercent,_disk_io.last_ms=result2.ms,_disk_io.ms=Date.now();else result2.rIO=rIO,result2.wIO=wIO,result2.tIO=rIO+wIO,result2.rWaitTime=rWaitTime,result2.wWaitTime=wWaitTime,result2.tWaitTime=tWaitTime,_disk_io.rIO=rIO,_disk_io.wIO=wIO,_disk_io.rIO_sec=null,_disk_io.wIO_sec=null,_disk_io.tIO_sec=null,_disk_io.rWaitTime=rWaitTime,_disk_io.wWaitTime=wWaitTime,_disk_io.tWaitTime=tWaitTime,_disk_io.rWaitPercent=null,_disk_io.wWaitPercent=null,_disk_io.tWaitPercent=null,_disk_io.last_ms=0,_disk_io.ms=Date.now();return result2}function disksIO(callback){return new Promise((resolve14)=>{process.nextTick(()=>{if(_windows)return resolve14(null);if(_sunos)return resolve14(null);let result2={rIO:0,wIO:0,tIO:0,rIO_sec:null,wIO_sec:null,tIO_sec:null,rWaitTime:0,wWaitTime:0,tWaitTime:0,rWaitPercent:null,wWaitPercent:null,tWaitPercent:null,ms:0},rIO=0,wIO=0,rWaitTime=0,wWaitTime=0,tWaitTime=0;if(_disk_io&&!_disk_io.ms||_disk_io&&_disk_io.ms&&Date.now()-_disk_io.ms>=500){if(_linux||_freebsd||_openbsd||_netbsd)exec3('for mount in `lsblk 2>/dev/null | grep " disk " | sed "s/[\u2502\u2514\u2500\u251C]//g" | awk \'{$1=$1};1\' | cut -d " " -f 1 | sort -u`; do cat /sys/block/$mount/stat | sed -r "s/ +/;/g" | sed -r "s/^;//"; done',{maxBuffer:1048576},(error2,stdout)=>{if(!error2){if(stdout.split(`
|
|
3323
3332
|
`).forEach((line)=>{if(!line)return;let stats2=line.split(";");rIO+=parseInt(stats2[0],10),wIO+=parseInt(stats2[4],10),rWaitTime+=parseInt(stats2[3],10),wWaitTime+=parseInt(stats2[7],10),tWaitTime+=parseInt(stats2[10],10)}),result2=calcDiskIO(rIO,wIO,rWaitTime,wWaitTime,tWaitTime),callback)callback(result2);resolve14(result2)}else{if(callback)callback(result2);resolve14(result2)}});if(_darwin)exec3(`ioreg -c IOBlockStorageDriver -k Statistics -r -w0 | sed -n "/IOBlockStorageDriver/,/Statistics/p" | grep "Statistics" | tr -cd "01234567890,
|
|
3324
3333
|
"`,{maxBuffer:1048576},(error2,stdout)=>{if(!error2)stdout.toString().split(`
|
|
3325
|
-
`).forEach((line)=>{if(line=line.trim(),line!=="")line=line.split(","),rIO+=parseInt(line[10],10),wIO+=parseInt(line[0],10)}),result2=calcDiskIO(rIO,wIO,rWaitTime,wWaitTime,tWaitTime);if(callback)callback(result2);resolve14(result2)})}else{if(result2.rIO=_disk_io.rIO,result2.wIO=_disk_io.wIO,result2.tIO=_disk_io.rIO+_disk_io.wIO,result2.ms=_disk_io.last_ms,result2.rIO_sec=_disk_io.rIO_sec,result2.wIO_sec=_disk_io.wIO_sec,result2.tIO_sec=_disk_io.tIO_sec,result2.rWaitTime=_disk_io.rWaitTime,result2.wWaitTime=_disk_io.wWaitTime,result2.tWaitTime=_disk_io.tWaitTime,result2.rWaitPercent=_disk_io.rWaitPercent,result2.wWaitPercent=_disk_io.wWaitPercent,result2.tWaitPercent=_disk_io.tWaitPercent,callback)callback(result2);resolve14(result2)}})})}exports.disksIO=disksIO;function diskLayout(callback){function getVendorFromModel(model){let diskManufacturers=[{pattern:"WESTERN.*",manufacturer:"Western Digital"},{pattern:"^WDC.*",manufacturer:"Western Digital"},{pattern:"WD.*",manufacturer:"Western Digital"},{pattern:"TOSHIBA.*",manufacturer:"Toshiba"},{pattern:"HITACHI.*",manufacturer:"Hitachi"},{pattern:"^IC.*",manufacturer:"Hitachi"},{pattern:"^HTS.*",manufacturer:"Hitachi"},{pattern:"SANDISK.*",manufacturer:"SanDisk"},{pattern:"KINGSTON.*",manufacturer:"Kingston Technology"},{pattern:"^SONY.*",manufacturer:"Sony"},{pattern:"TRANSCEND.*",manufacturer:"Transcend"},{pattern:"SAMSUNG.*",manufacturer:"Samsung"},{pattern:"^ST(?!I\\ ).*",manufacturer:"Seagate"},{pattern:"^STI\\ .*",manufacturer:"SimpleTech"},{pattern:"^D...-.*",manufacturer:"IBM"},{pattern:"^IBM.*",manufacturer:"IBM"},{pattern:"^FUJITSU.*",manufacturer:"Fujitsu"},{pattern:"^MP.*",manufacturer:"Fujitsu"},{pattern:"^MK.*",manufacturer:"Toshiba"},{pattern:"MAXTO.*",manufacturer:"Maxtor"},{pattern:"PIONEER.*",manufacturer:"Pioneer"},{pattern:"PHILIPS.*",manufacturer:"Philips"},{pattern:"QUANTUM.*",manufacturer:"Quantum Technology"},{pattern:"FIREBALL.*",manufacturer:"Quantum Technology"},{pattern:"^VBOX.*",manufacturer:"VirtualBox"},{pattern:"CORSAIR.*",manufacturer:"Corsair Components"},{pattern:"CRUCIAL.*",manufacturer:"Crucial"},{pattern:"ECM.*",manufacturer:"ECM"},{pattern:"INTEL.*",manufacturer:"INTEL"},{pattern:"EVO.*",manufacturer:"Samsung"},{pattern:"APPLE.*",manufacturer:"Apple"}],result2="";if(model)model=model.toUpperCase(),diskManufacturers.forEach((manufacturer)=>{if(RegExp(manufacturer.pattern).test(model))result2=manufacturer.manufacturer});return result2}return new Promise((resolve14)=>{process.nextTick(()=>{let commitResult=(res)=>{for(let i2=0;i2<res.length;i2++)delete res[i2].BSDName;if(callback)callback(res);resolve14(res)},result2=[],cmd="";if(_linux){let cmdFullSmart="";exec3("export LC_ALL=C; lsblk -ablJO 2>/dev/null; unset LC_ALL",{maxBuffer:1048576},(error2,stdout)=>{if(!error2)try{let out=stdout.toString().trim(),devices=[];try{let outJSON=JSON.parse(out);if(outJSON&&{}.hasOwnProperty.call(outJSON,"blockdevices"))devices=outJSON.blockdevices.filter((item)=>{return item.type==="disk"&&item.size>0&&(item.model!==null||item.mountpoint===null&&item.label===null&&item.fstype===null&&item.parttype===null&&item.path&&item.path.indexOf("/ram")!==0&&item.path.indexOf("/loop")!==0&&item["disc-max"]&&item["disc-max"]!==0)})}catch{try{let out2=
|
|
3326
|
-
`);devices=parseBlk(lines).filter((item)=>{return item.type==="disk"&&item.size>0&&(item.model!==null&&item.model!==""||item.mount===""&&item.label===""&&item.fsType==="")})}catch{util4.noop()}}devices.forEach((device)=>{let mediumType="",BSDName="/dev/"+device.name,logical=device.name;try{mediumType=
|
|
3334
|
+
`).forEach((line)=>{if(line=line.trim(),line!=="")line=line.split(","),rIO+=parseInt(line[10],10),wIO+=parseInt(line[0],10)}),result2=calcDiskIO(rIO,wIO,rWaitTime,wWaitTime,tWaitTime);if(callback)callback(result2);resolve14(result2)})}else{if(result2.rIO=_disk_io.rIO,result2.wIO=_disk_io.wIO,result2.tIO=_disk_io.rIO+_disk_io.wIO,result2.ms=_disk_io.last_ms,result2.rIO_sec=_disk_io.rIO_sec,result2.wIO_sec=_disk_io.wIO_sec,result2.tIO_sec=_disk_io.tIO_sec,result2.rWaitTime=_disk_io.rWaitTime,result2.wWaitTime=_disk_io.wWaitTime,result2.tWaitTime=_disk_io.tWaitTime,result2.rWaitPercent=_disk_io.rWaitPercent,result2.wWaitPercent=_disk_io.wWaitPercent,result2.tWaitPercent=_disk_io.tWaitPercent,callback)callback(result2);resolve14(result2)}})})}exports.disksIO=disksIO;function diskLayout(callback){function getVendorFromModel(model){let diskManufacturers=[{pattern:"WESTERN.*",manufacturer:"Western Digital"},{pattern:"^WDC.*",manufacturer:"Western Digital"},{pattern:"WD.*",manufacturer:"Western Digital"},{pattern:"TOSHIBA.*",manufacturer:"Toshiba"},{pattern:"HITACHI.*",manufacturer:"Hitachi"},{pattern:"^IC.*",manufacturer:"Hitachi"},{pattern:"^HTS.*",manufacturer:"Hitachi"},{pattern:"SANDISK.*",manufacturer:"SanDisk"},{pattern:"KINGSTON.*",manufacturer:"Kingston Technology"},{pattern:"^SONY.*",manufacturer:"Sony"},{pattern:"TRANSCEND.*",manufacturer:"Transcend"},{pattern:"SAMSUNG.*",manufacturer:"Samsung"},{pattern:"^ST(?!I\\ ).*",manufacturer:"Seagate"},{pattern:"^STI\\ .*",manufacturer:"SimpleTech"},{pattern:"^D...-.*",manufacturer:"IBM"},{pattern:"^IBM.*",manufacturer:"IBM"},{pattern:"^FUJITSU.*",manufacturer:"Fujitsu"},{pattern:"^MP.*",manufacturer:"Fujitsu"},{pattern:"^MK.*",manufacturer:"Toshiba"},{pattern:"MAXTO.*",manufacturer:"Maxtor"},{pattern:"PIONEER.*",manufacturer:"Pioneer"},{pattern:"PHILIPS.*",manufacturer:"Philips"},{pattern:"QUANTUM.*",manufacturer:"Quantum Technology"},{pattern:"FIREBALL.*",manufacturer:"Quantum Technology"},{pattern:"^VBOX.*",manufacturer:"VirtualBox"},{pattern:"CORSAIR.*",manufacturer:"Corsair Components"},{pattern:"CRUCIAL.*",manufacturer:"Crucial"},{pattern:"ECM.*",manufacturer:"ECM"},{pattern:"INTEL.*",manufacturer:"INTEL"},{pattern:"EVO.*",manufacturer:"Samsung"},{pattern:"APPLE.*",manufacturer:"Apple"}],result2="";if(model)model=model.toUpperCase(),diskManufacturers.forEach((manufacturer)=>{if(RegExp(manufacturer.pattern).test(model))result2=manufacturer.manufacturer});return result2}return new Promise((resolve14)=>{process.nextTick(()=>{let commitResult=(res)=>{for(let i2=0;i2<res.length;i2++)delete res[i2].BSDName;if(callback)callback(res);resolve14(res)},result2=[],cmd="";if(_linux){let cmdFullSmart="";exec3("export LC_ALL=C; lsblk -ablJO 2>/dev/null; unset LC_ALL",{maxBuffer:1048576},(error2,stdout)=>{if(!error2)try{let out=stdout.toString().trim(),devices=[];try{let outJSON=JSON.parse(out);if(outJSON&&{}.hasOwnProperty.call(outJSON,"blockdevices"))devices=outJSON.blockdevices.filter((item)=>{return item.type==="disk"&&item.size>0&&(item.model!==null||item.mountpoint===null&&item.label===null&&item.fstype===null&&item.parttype===null&&item.path&&item.path.indexOf("/ram")!==0&&item.path.indexOf("/loop")!==0&&item["disc-max"]&&item["disc-max"]!==0)})}catch{try{let out2=execSync18("export LC_ALL=C; lsblk -bPo NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT,UUID,ROTA,RO,RM,LABEL,MODEL,OWNER,GROUP 2>/dev/null; unset LC_ALL",util4.execOptsLinux).toString(),lines=blkStdoutToObject(out2).split(`
|
|
3335
|
+
`);devices=parseBlk(lines).filter((item)=>{return item.type==="disk"&&item.size>0&&(item.model!==null&&item.model!==""||item.mount===""&&item.label===""&&item.fsType==="")})}catch{util4.noop()}}devices.forEach((device)=>{let mediumType="",BSDName="/dev/"+device.name,logical=device.name;try{mediumType=execSync18("cat /sys/block/"+logical+"/queue/rotational 2>/dev/null",util4.execOptsLinux).toString().split(`
|
|
3327
3336
|
`)[0]}catch{util4.noop()}let interfaceType=device.tran?device.tran.toUpperCase().trim():"";if(interfaceType==="NVME")mediumType="2",interfaceType="PCIe";result2.push({device:BSDName,type:mediumType==="0"?"SSD":mediumType==="1"?"HD":mediumType==="2"?"NVMe":device.model&&device.model.indexOf("SSD")>-1?"SSD":device.model&&device.model.indexOf("NVM")>-1?"NVMe":"HD",name:device.model||"",vendor:getVendorFromModel(device.model)||(device.vendor?device.vendor.trim():""),size:device.size||0,bytesPerSector:null,totalCylinders:null,totalHeads:null,totalSectors:null,totalTracks:null,tracksPerCylinder:null,sectorsPerTrack:null,firmwareRevision:device.rev?device.rev.trim():"",serialNum:device.serial?device.serial.trim():"",interfaceType,smartStatus:"unknown",temperature:null,BSDName}),cmd+=`printf "
|
|
3328
3337
|
${BSDName}|"; smartctl -H ${BSDName} | grep overall;`,cmdFullSmart+=`${cmdFullSmart?'printf ",";':""}smartctl -a -j ${BSDName};`})}catch{util4.noop()}if(cmdFullSmart)exec3(cmdFullSmart,{maxBuffer:1048576},(error3,stdout2)=>{try{JSON.parse(`[${stdout2}]`).forEach((disk)=>{let diskBSDName=disk.smartctl.argv[disk.smartctl.argv.length-1];for(let i2=0;i2<result2.length;i2++)if(result2[i2].BSDName===diskBSDName){if(result2[i2].smartStatus=disk.smart_status.passed?"Ok":disk.smart_status.passed===!1?"Predicted Failure":"unknown",disk.temperature&&disk.temperature.current)result2[i2].temperature=disk.temperature.current;result2[i2].smartData=disk}}),commitResult(result2)}catch{if(cmd)cmd=cmd+`printf "
|
|
3329
3338
|
"`,exec3(cmd,{maxBuffer:1048576},(error4,stdout3)=>{stdout3.toString().split(`
|
|
@@ -3346,29 +3355,29 @@ ${BSDName}|"; diskutil info /dev/${BSDName} | grep SMART;`,cmdFullSmart+=`${cmdF
|
|
|
3346
3355
|
"`,exec3(cmd,{maxBuffer:1048576},(error4,stdout3)=>{stdout3.toString().split(`
|
|
3347
3356
|
`).forEach((line)=>{if(line){let parts=line.split("|");if(parts.length===2){let BSDName=parts[0];parts[1]=parts[1].trim();let parts2=parts[1].split(":");if(parts2.length===2){parts2[1]=parts2[1].trim();let status=parts2[1].toLowerCase();for(let i2=0;i2<result2.length;i2++)if(result2[i2].BSDName===BSDName)result2[i2].smartStatus=status==="passed"?"Ok":status==="failed!"?"Predicted Failure":"unknown"}}}}),commitResult(result2)});else commitResult(result2)}});else if(cmd)cmd=cmd+`printf "
|
|
3348
3357
|
"`,exec3(cmd,{maxBuffer:1048576},(error3,stdout2)=>{stdout2.toString().split(`
|
|
3349
|
-
`).forEach((line)=>{if(line){let parts=line.split("|");if(parts.length===2){let BSDName=parts[0];parts[1]=parts[1].trim();let parts2=parts[1].split(":");if(parts2.length===2){parts2[1]=parts2[1].trim();let status=parts2[1].toLowerCase();for(let i2=0;i2<result2.length;i2++)if(result2[i2].BSDName===BSDName)result2[i2].smartStatus=status==="not supported"?"not supported":status==="verified"?"Ok":status==="failing"?"Predicted Failure":"unknown"}}}}),commitResult(result2)});else commitResult(result2)}else commitResult(result2)})}if(_windows)try{let workload=[];if(workload.push(util4.powerShell("Get-CimInstance Win32_DiskDrive | select Caption,Size,Status,PNPDeviceId,DeviceId,BytesPerSector,TotalCylinders,TotalHeads,TotalSectors,TotalTracks,TracksPerCylinder,SectorsPerTrack,FirmwareRevision,SerialNumber,InterfaceType | fl")),workload.push(util4.powerShell("Get-PhysicalDisk | select BusType,MediaType,FriendlyName,Model,SerialNumber,Size | fl")),util4.smartMonToolsInstalled())try{let smartDev=JSON.parse(
|
|
3358
|
+
`).forEach((line)=>{if(line){let parts=line.split("|");if(parts.length===2){let BSDName=parts[0];parts[1]=parts[1].trim();let parts2=parts[1].split(":");if(parts2.length===2){parts2[1]=parts2[1].trim();let status=parts2[1].toLowerCase();for(let i2=0;i2<result2.length;i2++)if(result2[i2].BSDName===BSDName)result2[i2].smartStatus=status==="not supported"?"not supported":status==="verified"?"Ok":status==="failing"?"Predicted Failure":"unknown"}}}}),commitResult(result2)});else commitResult(result2)}else commitResult(result2)})}if(_windows)try{let workload=[];if(workload.push(util4.powerShell("Get-CimInstance Win32_DiskDrive | select Caption,Size,Status,PNPDeviceId,DeviceId,BytesPerSector,TotalCylinders,TotalHeads,TotalSectors,TotalTracks,TracksPerCylinder,SectorsPerTrack,FirmwareRevision,SerialNumber,InterfaceType | fl")),workload.push(util4.powerShell("Get-PhysicalDisk | select BusType,MediaType,FriendlyName,Model,SerialNumber,Size | fl")),util4.smartMonToolsInstalled())try{let smartDev=JSON.parse(execSync18("smartctl --scan -j").toString());if(smartDev&&smartDev.devices&&smartDev.devices.length>0)smartDev.devices.forEach((dev)=>{workload.push(execPromiseSave(`smartctl -j -a ${dev.name}`,util4.execOptsWin))})}catch{util4.noop()}util4.promiseAll(workload).then((data)=>{let devices=data.results[0].toString().split(/\n\s*\n/);if(devices.forEach((device)=>{let lines=device.split(`\r
|
|
3350
3359
|
`),size=util4.getValue(lines,"Size",":").trim(),status=util4.getValue(lines,"Status",":").trim().toLowerCase();if(size)result2.push({device:util4.getValue(lines,"DeviceId",":"),type:device.indexOf("SSD")>-1?"SSD":"HD",name:util4.getValue(lines,"Caption",":"),vendor:getVendorFromModel(util4.getValue(lines,"Caption",":",!0).trim()),size:parseInt(size,10),bytesPerSector:parseInt(util4.getValue(lines,"BytesPerSector",":"),10),totalCylinders:parseInt(util4.getValue(lines,"TotalCylinders",":"),10),totalHeads:parseInt(util4.getValue(lines,"TotalHeads",":"),10),totalSectors:parseInt(util4.getValue(lines,"TotalSectors",":"),10),totalTracks:parseInt(util4.getValue(lines,"TotalTracks",":"),10),tracksPerCylinder:parseInt(util4.getValue(lines,"TracksPerCylinder",":"),10),sectorsPerTrack:parseInt(util4.getValue(lines,"SectorsPerTrack",":"),10),firmwareRevision:util4.getValue(lines,"FirmwareRevision",":").trim(),serialNum:util4.getValue(lines,"SerialNumber",":").trim(),interfaceType:util4.getValue(lines,"InterfaceType",":").trim(),smartStatus:status==="ok"?"Ok":status==="degraded"?"Degraded":status==="pred fail"?"Predicted Failure":"Unknown",temperature:null})}),devices=data.results[1].split(/\n\s*\n/),devices.forEach((device)=>{let lines=device.split(`\r
|
|
3351
|
-
`),serialNum=util4.getValue(lines,"SerialNumber",":").trim(),name=util4.getValue(lines,"FriendlyName",":").trim().replace("Msft ","Microsoft"),size=util4.getValue(lines,"Size",":").trim(),model=util4.getValue(lines,"Model",":").trim(),interfaceType=util4.getValue(lines,"BusType",":").trim(),mediaType=util4.getValue(lines,"MediaType",":").trim();if(mediaType==="3"||mediaType==="HDD")mediaType="HD";if(mediaType==="4")mediaType="SSD";if(mediaType==="5")mediaType="SCM";if(mediaType==="Unspecified"&&(model.toLowerCase().indexOf("virtual")>-1||model.toLowerCase().indexOf("vbox")>-1))mediaType="Virtual";if(size){let i2=util4.findObjectByKey(result2,"serialNum",serialNum);if(i2===-1||serialNum==="")i2=util4.findObjectByKey(result2,"name",name);if(i2!==-1)result2[i2].type=mediaType,result2[i2].interfaceType=interfaceType}}),data.results.shift(),data.results.shift(),data.results.length)data.results.forEach((smartStr)=>{try{let smartData=JSON.parse(smartStr);if(smartData.serial_number){let serialNum=smartData.serial_number,i2=util4.findObjectByKey(result2,"serialNum",serialNum);if(i2!==-1){if(result2[i2].smartStatus=smartData.smart_status&&smartData.smart_status.passed?"Ok":smartData.smart_status&&smartData.smart_status.passed===!1?"Predicted Failure":"unknown",smartData.temperature&&smartData.temperature.current)result2[i2].temperature=smartData.temperature.current;result2[i2].smartData=smartData}}}catch{util4.noop()}});if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}})})}exports.diskLayout=diskLayout});var require_network=__commonJS((exports)=>{var os4=__require("os"),exec3=__require("child_process").exec,
|
|
3352
|
-
`)[0].split(/\s+/);if(parts[0]==="none"&&parts[5])ifacename=parts[5];else if(parts[4])ifacename=parts[4];if(ifacename.indexOf(":")>-1)ifacename=ifacename.split(":")[1].trim()}if(_darwin||_freebsd||_openbsd||_netbsd||_sunos){let cmd="";if(_linux)cmd="ip route 2> /dev/null | grep default | awk '{print $5}'";if(_darwin)cmd="route -n get default 2>/dev/null | grep interface: | awk '{print $2}'";if(_freebsd||_openbsd||_netbsd||_sunos)cmd="route get 0.0.0.0 | grep interface:";if(ifacename=
|
|
3353
|
-
`)[0],ifacename.indexOf(":")>-1)ifacename=ifacename.split(":")[1].trim()}}catch{util4.noop()}if(ifacename)_default_iface=ifacename;return _default_iface}exports.getDefaultNetworkInterface=getDefaultNetworkInterface;function getMacAddresses(){let iface="",mac="",result2={};if(_linux||_freebsd||_openbsd||_netbsd){if(typeof pathToIp>"u")try{let lines=
|
|
3354
|
-
`);if(lines.length&&lines[0].indexOf(":")===-1&&lines[0].indexOf("/")===0)pathToIp=lines[0];else pathToIp=""}catch{pathToIp=""}try{let cmd="export LC_ALL=C; "+(pathToIp?pathToIp+" link show up":"/sbin/ifconfig")+"; unset LC_ALL",lines=
|
|
3355
|
-
`);for(let i2=0;i2<lines.length;i2++)if(lines[i2]&&lines[i2][0]!==" "){if(pathToIp){let nextline=lines[i2+1].trim().split(" ");if(nextline[0]==="link/ether")iface=lines[i2].split(" ")[1],iface=iface.slice(0,iface.length-1),mac=nextline[1]}else iface=lines[i2].split(" ")[0],mac=lines[i2].split("HWaddr ")[1];if(iface&&mac)result2[iface]=mac.trim(),iface="",mac=""}}catch{util4.noop()}}if(_darwin)try{let lines=
|
|
3360
|
+
`),serialNum=util4.getValue(lines,"SerialNumber",":").trim(),name=util4.getValue(lines,"FriendlyName",":").trim().replace("Msft ","Microsoft"),size=util4.getValue(lines,"Size",":").trim(),model=util4.getValue(lines,"Model",":").trim(),interfaceType=util4.getValue(lines,"BusType",":").trim(),mediaType=util4.getValue(lines,"MediaType",":").trim();if(mediaType==="3"||mediaType==="HDD")mediaType="HD";if(mediaType==="4")mediaType="SSD";if(mediaType==="5")mediaType="SCM";if(mediaType==="Unspecified"&&(model.toLowerCase().indexOf("virtual")>-1||model.toLowerCase().indexOf("vbox")>-1))mediaType="Virtual";if(size){let i2=util4.findObjectByKey(result2,"serialNum",serialNum);if(i2===-1||serialNum==="")i2=util4.findObjectByKey(result2,"name",name);if(i2!==-1)result2[i2].type=mediaType,result2[i2].interfaceType=interfaceType}}),data.results.shift(),data.results.shift(),data.results.length)data.results.forEach((smartStr)=>{try{let smartData=JSON.parse(smartStr);if(smartData.serial_number){let serialNum=smartData.serial_number,i2=util4.findObjectByKey(result2,"serialNum",serialNum);if(i2!==-1){if(result2[i2].smartStatus=smartData.smart_status&&smartData.smart_status.passed?"Ok":smartData.smart_status&&smartData.smart_status.passed===!1?"Predicted Failure":"unknown",smartData.temperature&&smartData.temperature.current)result2[i2].temperature=smartData.temperature.current;result2[i2].smartData=smartData}}}catch{util4.noop()}});if(callback)callback(result2);resolve14(result2)})}catch{if(callback)callback(result2);resolve14(result2)}})})}exports.diskLayout=diskLayout});var require_network=__commonJS((exports)=>{var os4=__require("os"),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,fs3=__require("fs"),util4=require_util3(),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos",_network={},_default_iface="",_ifaces={},_dhcpNics=[],_networkInterfaces=[],_mac={},pathToIp;function getDefaultNetworkInterface(){let ifacename="",ifacenameFirst="";try{let ifaces=os4.networkInterfaces(),scopeid=9999;for(let dev in ifaces)if({}.hasOwnProperty.call(ifaces,dev))ifaces[dev].forEach((details)=>{if(details&&details.internal===!1){if(ifacenameFirst=ifacenameFirst||dev,details.scopeid&&details.scopeid<scopeid)ifacename=dev,scopeid=details.scopeid}});if(ifacename=ifacename||ifacenameFirst||"",_windows){let defaultIp="";if(execSync18("netstat -r",util4.execOptsWin).toString().split(os4.EOL).forEach((line)=>{if(line=line.replace(/\s+/g," ").trim(),line.indexOf("0.0.0.0 0.0.0.0")>-1&&!/[a-zA-Z]/.test(line)){let parts=line.split(" ");if(parts.length>=5)defaultIp=parts[parts.length-2]}}),defaultIp){for(let dev in ifaces)if({}.hasOwnProperty.call(ifaces,dev))ifaces[dev].forEach((details)=>{if(details&&details.address&&details.address===defaultIp)ifacename=dev})}}if(_linux){let parts=execSync18("ip route 2> /dev/null | grep default",util4.execOptsLinux).toString().split(`
|
|
3361
|
+
`)[0].split(/\s+/);if(parts[0]==="none"&&parts[5])ifacename=parts[5];else if(parts[4])ifacename=parts[4];if(ifacename.indexOf(":")>-1)ifacename=ifacename.split(":")[1].trim()}if(_darwin||_freebsd||_openbsd||_netbsd||_sunos){let cmd="";if(_linux)cmd="ip route 2> /dev/null | grep default | awk '{print $5}'";if(_darwin)cmd="route -n get default 2>/dev/null | grep interface: | awk '{print $2}'";if(_freebsd||_openbsd||_netbsd||_sunos)cmd="route get 0.0.0.0 | grep interface:";if(ifacename=execSync18(cmd).toString().split(`
|
|
3362
|
+
`)[0],ifacename.indexOf(":")>-1)ifacename=ifacename.split(":")[1].trim()}}catch{util4.noop()}if(ifacename)_default_iface=ifacename;return _default_iface}exports.getDefaultNetworkInterface=getDefaultNetworkInterface;function getMacAddresses(){let iface="",mac="",result2={};if(_linux||_freebsd||_openbsd||_netbsd){if(typeof pathToIp>"u")try{let lines=execSync18("which ip",util4.execOptsLinux).toString().split(`
|
|
3363
|
+
`);if(lines.length&&lines[0].indexOf(":")===-1&&lines[0].indexOf("/")===0)pathToIp=lines[0];else pathToIp=""}catch{pathToIp=""}try{let cmd="export LC_ALL=C; "+(pathToIp?pathToIp+" link show up":"/sbin/ifconfig")+"; unset LC_ALL",lines=execSync18(cmd,util4.execOptsLinux).toString().split(`
|
|
3364
|
+
`);for(let i2=0;i2<lines.length;i2++)if(lines[i2]&&lines[i2][0]!==" "){if(pathToIp){let nextline=lines[i2+1].trim().split(" ");if(nextline[0]==="link/ether")iface=lines[i2].split(" ")[1],iface=iface.slice(0,iface.length-1),mac=nextline[1]}else iface=lines[i2].split(" ")[0],mac=lines[i2].split("HWaddr ")[1];if(iface&&mac)result2[iface]=mac.trim(),iface="",mac=""}}catch{util4.noop()}}if(_darwin)try{let lines=execSync18("/sbin/ifconfig").toString().split(`
|
|
3356
3365
|
`);for(let i2=0;i2<lines.length;i2++)if(lines[i2]&&lines[i2][0]!=="\t"&&lines[i2].indexOf(":")>0)iface=lines[i2].split(":")[0];else if(lines[i2].indexOf("\tether ")===0){if(mac=lines[i2].split("\tether ")[1],iface&&mac)result2[iface]=mac.trim(),iface="",mac=""}}catch{util4.noop()}return result2}function networkInterfaceDefault(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=getDefaultNetworkInterface();if(callback)callback(result2);resolve14(result2)})})}exports.networkInterfaceDefault=networkInterfaceDefault;function parseLinesWindowsNics(sections,nconfigsections){let nics=[];for(let i2 in sections)try{if({}.hasOwnProperty.call(sections,i2)){if(sections[i2].trim()!==""){let lines=sections[i2].trim().split(`\r
|
|
3357
3366
|
`),linesNicConfig=null;try{linesNicConfig=nconfigsections&&nconfigsections[i2]?nconfigsections[i2].trim().split(`\r
|
|
3358
|
-
`):[]}catch{util4.noop()}let netEnabled=util4.getValue(lines,"NetEnabled",":"),adapterType=util4.getValue(lines,"AdapterTypeID",":")==="9"?"wireless":"wired",ifacename=util4.getValue(lines,"Name",":").replace(/\]/g,")").replace(/\[/g,"("),iface=util4.getValue(lines,"NetConnectionID",":").replace(/\]/g,")").replace(/\[/g,"(");if(ifacename.toLowerCase().indexOf("wi-fi")>=0||ifacename.toLowerCase().indexOf("wireless")>=0)adapterType="wireless";if(netEnabled!==""){let speed=parseInt(util4.getValue(lines,"speed",":").trim(),10)/1e6;nics.push({mac:util4.getValue(lines,"MACAddress",":").toLowerCase(),dhcp:util4.getValue(linesNicConfig,"dhcpEnabled",":").toLowerCase()==="true",name:ifacename,iface,netEnabled:netEnabled==="TRUE",speed:isNaN(speed)?null:speed,operstate:util4.getValue(lines,"NetConnectionStatus",":")==="2"?"up":"down",type:adapterType})}}}}catch{util4.noop()}return nics}function getWindowsNics(){return new Promise((resolve14)=>{process.nextTick(()=>{let cmd="Get-CimInstance Win32_NetworkAdapter | fl *; echo '#-#-#-#';";cmd+="Get-CimInstance Win32_NetworkAdapterConfiguration | fl DHCPEnabled";try{util4.powerShell(cmd).then((data)=>{data=data.split("#-#-#-#");let nsections=(data[0]||"").split(/\n\s*\n/),nconfigsections=(data[1]||"").split(/\n\s*\n/);resolve14(parseLinesWindowsNics(nsections,nconfigsections))})}catch{resolve14([])}})})}function getWindowsDNSsuffixes(){let iface={},dnsSuffixes={primaryDNS:"",exitCode:0,ifaces:[]};try{return
|
|
3367
|
+
`):[]}catch{util4.noop()}let netEnabled=util4.getValue(lines,"NetEnabled",":"),adapterType=util4.getValue(lines,"AdapterTypeID",":")==="9"?"wireless":"wired",ifacename=util4.getValue(lines,"Name",":").replace(/\]/g,")").replace(/\[/g,"("),iface=util4.getValue(lines,"NetConnectionID",":").replace(/\]/g,")").replace(/\[/g,"(");if(ifacename.toLowerCase().indexOf("wi-fi")>=0||ifacename.toLowerCase().indexOf("wireless")>=0)adapterType="wireless";if(netEnabled!==""){let speed=parseInt(util4.getValue(lines,"speed",":").trim(),10)/1e6;nics.push({mac:util4.getValue(lines,"MACAddress",":").toLowerCase(),dhcp:util4.getValue(linesNicConfig,"dhcpEnabled",":").toLowerCase()==="true",name:ifacename,iface,netEnabled:netEnabled==="TRUE",speed:isNaN(speed)?null:speed,operstate:util4.getValue(lines,"NetConnectionStatus",":")==="2"?"up":"down",type:adapterType})}}}}catch{util4.noop()}return nics}function getWindowsNics(){return new Promise((resolve14)=>{process.nextTick(()=>{let cmd="Get-CimInstance Win32_NetworkAdapter | fl *; echo '#-#-#-#';";cmd+="Get-CimInstance Win32_NetworkAdapterConfiguration | fl DHCPEnabled";try{util4.powerShell(cmd).then((data)=>{data=data.split("#-#-#-#");let nsections=(data[0]||"").split(/\n\s*\n/),nconfigsections=(data[1]||"").split(/\n\s*\n/);resolve14(parseLinesWindowsNics(nsections,nconfigsections))})}catch{resolve14([])}})})}function getWindowsDNSsuffixes(){let iface={},dnsSuffixes={primaryDNS:"",exitCode:0,ifaces:[]};try{return execSync18("ipconfig /all",util4.execOptsWin).split(`\r
|
|
3359
3368
|
\r
|
|
3360
3369
|
`).forEach((element,index)=>{if(index===1){let longPrimaryDNS=element.split(`\r
|
|
3361
3370
|
`).filter((element2)=>{return element2.toUpperCase().includes("DNS")}),primaryDNS=longPrimaryDNS[0].substring(longPrimaryDNS[0].lastIndexOf(":")+1);if(dnsSuffixes.primaryDNS=primaryDNS.trim(),!dnsSuffixes.primaryDNS)dnsSuffixes.primaryDNS="Not defined"}if(index>1)if(index%2===0){let name=element.substring(element.lastIndexOf(" ")+1).replace(":","");iface.name=name}else{let connectionSpecificDNS=element.split(`\r
|
|
3362
|
-
`).filter((element2)=>{return element2.toUpperCase().includes("DNS")}),dnsSuffix=connectionSpecificDNS[0].substring(connectionSpecificDNS[0].lastIndexOf(":")+1);iface.dnsSuffix=dnsSuffix.trim(),dnsSuffixes.ifaces.push(iface),iface={}}}),dnsSuffixes}catch{return{primaryDNS:"",exitCode:0,ifaces:[]}}}function getWindowsIfaceDNSsuffix(ifaces,ifacename){let dnsSuffix="",interfaceName=ifacename+".";try{let connectionDnsSuffix=ifaces.filter((iface)=>{return interfaceName.includes(iface.name+".")}).map((iface)=>iface.dnsSuffix);if(connectionDnsSuffix[0])dnsSuffix=connectionDnsSuffix[0];if(!dnsSuffix)dnsSuffix="";return dnsSuffix}catch{return"Unknown"}}function getWindowsWiredProfilesInformation(){try{return
|
|
3363
|
-
Profile on interface`)}catch(error2){if(error2.status===1&&error2.stdout.includes("AutoConfig"))return"Disabled";return[]}}function getWindowsWirelessIfaceSSID(interfaceName){try{return
|
|
3371
|
+
`).filter((element2)=>{return element2.toUpperCase().includes("DNS")}),dnsSuffix=connectionSpecificDNS[0].substring(connectionSpecificDNS[0].lastIndexOf(":")+1);iface.dnsSuffix=dnsSuffix.trim(),dnsSuffixes.ifaces.push(iface),iface={}}}),dnsSuffixes}catch{return{primaryDNS:"",exitCode:0,ifaces:[]}}}function getWindowsIfaceDNSsuffix(ifaces,ifacename){let dnsSuffix="",interfaceName=ifacename+".";try{let connectionDnsSuffix=ifaces.filter((iface)=>{return interfaceName.includes(iface.name+".")}).map((iface)=>iface.dnsSuffix);if(connectionDnsSuffix[0])dnsSuffix=connectionDnsSuffix[0];if(!dnsSuffix)dnsSuffix="";return dnsSuffix}catch{return"Unknown"}}function getWindowsWiredProfilesInformation(){try{return execSync18("netsh lan show profiles",util4.execOptsWin).split(`\r
|
|
3372
|
+
Profile on interface`)}catch(error2){if(error2.status===1&&error2.stdout.includes("AutoConfig"))return"Disabled";return[]}}function getWindowsWirelessIfaceSSID(interfaceName){try{return execSync18(`netsh wlan show interface name="${interfaceName}" | findstr "SSID"`,util4.execOptsWin).split(`\r
|
|
3364
3373
|
`).shift().split(":").pop().trim()}catch{return"Unknown"}}function getWindowsIEEE8021x(connectionType,iface,ifaces){let i8021x={state:"Unknown",protocol:"Unknown"};if(ifaces==="Disabled")return i8021x.state="Disabled",i8021x.protocol="Not defined",i8021x;if(connectionType==="wired"&&ifaces.length>0)try{let arrayIface8021xInfo=ifaces.find((element)=>{return element.includes(iface+`\r
|
|
3365
3374
|
`)}).split(`\r
|
|
3366
|
-
`),state8021x=arrayIface8021xInfo.find((element)=>{return element.includes("802.1x")});if(state8021x.includes("Disabled"))i8021x.state="Disabled",i8021x.protocol="Not defined";else if(state8021x.includes("Enabled")){let protocol8021x=arrayIface8021xInfo.find((element)=>{return element.includes("EAP")});i8021x.protocol=protocol8021x.split(":").pop(),i8021x.state="Enabled"}}catch{return i8021x}else if(connectionType==="wireless"){let i8021xState="",i8021xProtocol="";try{let SSID=getWindowsWirelessIfaceSSID(iface);if(SSID!=="Unknown"){let ifaceSanitized="",s2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(SSID),l=util4.mathMin(s2.length,32);for(let i2=0;i2<=l;i2++)if(s2[i2]!==void 0)ifaceSanitized=ifaceSanitized+s2[i2];let profiles=
|
|
3367
|
-
`);i8021xState=(profiles.find((l2)=>l2.indexOf("802.1X")>=0)||"").trim(),i8021xProtocol=(profiles.find((l2)=>l2.indexOf("EAP")>=0)||"").trim()}if(i8021xState.includes(":")&&i8021xProtocol.includes(":"))i8021x.state=i8021xState.split(":").pop(),i8021x.protocol=i8021xProtocol.split(":").pop()}catch(error2){if(error2.status===1&&error2.stdout.includes("AutoConfig"))i8021x.state="Disabled",i8021x.protocol="Not defined";return i8021x}}return i8021x}function splitSectionsNics(lines){let result2=[],section=[];if(lines.forEach((line)=>{if(!line.startsWith("\t")&&!line.startsWith(" ")){if(section.length)result2.push(section),section=[]}section.push(line)}),section.length)result2.push(section);return result2}function parseLinesDarwinNics(sections){let nics=[];return sections.forEach((section)=>{let nic={iface:"",mtu:null,mac:"",ip6:"",ip4:"",speed:null,type:"",operstate:"",duplex:"",internal:!1},first=section[0];nic.iface=first.split(":")[0].trim();let parts=first.split("> mtu");if(nic.mtu=parts.length>1?parseInt(parts[1],10):null,isNaN(nic.mtu))nic.mtu=null;nic.internal=parts[0].toLowerCase().indexOf("loopback")>-1,section.forEach((line)=>{if(line.trim().startsWith("ether "))nic.mac=line.split("ether ")[1].toLowerCase().trim();if(line.trim().startsWith("inet6 ")&&!nic.ip6)nic.ip6=line.split("inet6 ")[1].toLowerCase().split("%")[0].split(" ")[0];if(line.trim().startsWith("inet ")&&!nic.ip4)nic.ip4=line.split("inet ")[1].toLowerCase().split(" ")[0]});let speed=util4.getValue(section,"link rate");if(nic.speed=speed?parseFloat(speed):null,nic.speed===null){if(speed=util4.getValue(section,"uplink rate"),nic.speed=speed?parseFloat(speed):null,nic.speed!==null&&speed.toLowerCase().indexOf("gbps")>=0)nic.speed=nic.speed*1000}else if(speed.toLowerCase().indexOf("gbps")>=0)nic.speed=nic.speed*1000;nic.type=util4.getValue(section,"type").toLowerCase().indexOf("wi-fi")>-1?"wireless":"wired";let operstate=util4.getValue(section,"status").toLowerCase();if(nic.operstate=operstate==="active"?"up":operstate==="inactive"?"down":"unknown",nic.duplex=util4.getValue(section,"media").toLowerCase().indexOf("half-duplex")>-1?"half":"full",nic.ip6||nic.ip4||nic.mac)nics.push(nic)}),nics}function getDarwinNics(){try{let lines=
|
|
3368
|
-
`),nsections=splitSectionsNics(lines);return parseLinesDarwinNics(nsections)}catch{return[]}}function getLinuxIfaceConnectionName(interfaceName){let cmd=`nmcli device status 2>/dev/null | grep ${interfaceName}`;try{let connectionName=
|
|
3369
|
-
`).forEach((line)=>{let parts=line.replace(/\s+/g," ").trim().split(" ");if(parts.length>=4){if(line.toLowerCase().indexOf(" inet ")>=0&&line.toLowerCase().indexOf("dhcp")>=0)result2.push(parts[1])}if(line.toLowerCase().includes("source")){let file2=line.split(" ")[1];result2=result2.concat(checkLinuxDCHPInterfaces(file2))}})}catch{util4.noop()}return result2}function getLinuxDHCPNics(){let result2=[];try{let lines=
|
|
3370
|
-
`),nsections=splitSectionsNics(lines);result2=parseLinuxDHCPNics(nsections)}catch{util4.noop()}try{result2=checkLinuxDCHPInterfaces("/etc/network/interfaces")}catch{util4.noop()}return result2}function parseLinuxDHCPNics(sections){let result2=[];if(sections&§ions.length)sections.forEach((lines)=>{if(lines&&lines.length){if(lines[0].split(":").length>2){for(let line of lines)if(line.indexOf(" inet ")>=0&&line.indexOf(" dynamic ")>=0){let parts2=line.split(" "),nic=parts2[parts2.length-1].trim();result2.push(nic);break}}}});return result2}function getLinuxIfaceDHCPstatus(iface,connectionName,DHCPNics){let result2=!1;if(connectionName){let cmd=`nmcli connection show "${connectionName}" 2>/dev/null | grep ipv4.method;`;try{switch(
|
|
3371
|
-
`);if(lines.length&&lines[0].startsWith("lease_time"))result2=!0}catch{util4.noop()}return result2}function getLinuxIfaceDNSsuffix(connectionName){if(connectionName){let cmd=`nmcli connection show "${connectionName}" 2>/dev/null | grep ipv4.dns-search;`;try{let dnsSuffix=
|
|
3375
|
+
`),state8021x=arrayIface8021xInfo.find((element)=>{return element.includes("802.1x")});if(state8021x.includes("Disabled"))i8021x.state="Disabled",i8021x.protocol="Not defined";else if(state8021x.includes("Enabled")){let protocol8021x=arrayIface8021xInfo.find((element)=>{return element.includes("EAP")});i8021x.protocol=protocol8021x.split(":").pop(),i8021x.state="Enabled"}}catch{return i8021x}else if(connectionType==="wireless"){let i8021xState="",i8021xProtocol="";try{let SSID=getWindowsWirelessIfaceSSID(iface);if(SSID!=="Unknown"){let ifaceSanitized="",s2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(SSID),l=util4.mathMin(s2.length,32);for(let i2=0;i2<=l;i2++)if(s2[i2]!==void 0)ifaceSanitized=ifaceSanitized+s2[i2];let profiles=execSync18(`netsh wlan show profiles "${ifaceSanitized}"`,util4.execOptsWin).split(`\r
|
|
3376
|
+
`);i8021xState=(profiles.find((l2)=>l2.indexOf("802.1X")>=0)||"").trim(),i8021xProtocol=(profiles.find((l2)=>l2.indexOf("EAP")>=0)||"").trim()}if(i8021xState.includes(":")&&i8021xProtocol.includes(":"))i8021x.state=i8021xState.split(":").pop(),i8021x.protocol=i8021xProtocol.split(":").pop()}catch(error2){if(error2.status===1&&error2.stdout.includes("AutoConfig"))i8021x.state="Disabled",i8021x.protocol="Not defined";return i8021x}}return i8021x}function splitSectionsNics(lines){let result2=[],section=[];if(lines.forEach((line)=>{if(!line.startsWith("\t")&&!line.startsWith(" ")){if(section.length)result2.push(section),section=[]}section.push(line)}),section.length)result2.push(section);return result2}function parseLinesDarwinNics(sections){let nics=[];return sections.forEach((section)=>{let nic={iface:"",mtu:null,mac:"",ip6:"",ip4:"",speed:null,type:"",operstate:"",duplex:"",internal:!1},first=section[0];nic.iface=first.split(":")[0].trim();let parts=first.split("> mtu");if(nic.mtu=parts.length>1?parseInt(parts[1],10):null,isNaN(nic.mtu))nic.mtu=null;nic.internal=parts[0].toLowerCase().indexOf("loopback")>-1,section.forEach((line)=>{if(line.trim().startsWith("ether "))nic.mac=line.split("ether ")[1].toLowerCase().trim();if(line.trim().startsWith("inet6 ")&&!nic.ip6)nic.ip6=line.split("inet6 ")[1].toLowerCase().split("%")[0].split(" ")[0];if(line.trim().startsWith("inet ")&&!nic.ip4)nic.ip4=line.split("inet ")[1].toLowerCase().split(" ")[0]});let speed=util4.getValue(section,"link rate");if(nic.speed=speed?parseFloat(speed):null,nic.speed===null){if(speed=util4.getValue(section,"uplink rate"),nic.speed=speed?parseFloat(speed):null,nic.speed!==null&&speed.toLowerCase().indexOf("gbps")>=0)nic.speed=nic.speed*1000}else if(speed.toLowerCase().indexOf("gbps")>=0)nic.speed=nic.speed*1000;nic.type=util4.getValue(section,"type").toLowerCase().indexOf("wi-fi")>-1?"wireless":"wired";let operstate=util4.getValue(section,"status").toLowerCase();if(nic.operstate=operstate==="active"?"up":operstate==="inactive"?"down":"unknown",nic.duplex=util4.getValue(section,"media").toLowerCase().indexOf("half-duplex")>-1?"half":"full",nic.ip6||nic.ip4||nic.mac)nics.push(nic)}),nics}function getDarwinNics(){try{let lines=execSync18("/sbin/ifconfig -v",{maxBuffer:104857600}).toString().split(`
|
|
3377
|
+
`),nsections=splitSectionsNics(lines);return parseLinesDarwinNics(nsections)}catch{return[]}}function getLinuxIfaceConnectionName(interfaceName){let cmd=`nmcli device status 2>/dev/null | grep ${interfaceName}`;try{let connectionName=execSync18(cmd,util4.execOptsLinux).toString().replace(/\s+/g," ").trim().split(" ").slice(3).join(" ");return connectionName!=="--"?connectionName:""}catch{return""}}function checkLinuxDCHPInterfaces(file){let result2=[];try{let cmd=`cat ${file} 2> /dev/null | grep 'iface\\|source'`;execSync18(cmd,util4.execOptsLinux).toString().split(`
|
|
3378
|
+
`).forEach((line)=>{let parts=line.replace(/\s+/g," ").trim().split(" ");if(parts.length>=4){if(line.toLowerCase().indexOf(" inet ")>=0&&line.toLowerCase().indexOf("dhcp")>=0)result2.push(parts[1])}if(line.toLowerCase().includes("source")){let file2=line.split(" ")[1];result2=result2.concat(checkLinuxDCHPInterfaces(file2))}})}catch{util4.noop()}return result2}function getLinuxDHCPNics(){let result2=[];try{let lines=execSync18("ip a 2> /dev/null",util4.execOptsLinux).toString().split(`
|
|
3379
|
+
`),nsections=splitSectionsNics(lines);result2=parseLinuxDHCPNics(nsections)}catch{util4.noop()}try{result2=checkLinuxDCHPInterfaces("/etc/network/interfaces")}catch{util4.noop()}return result2}function parseLinuxDHCPNics(sections){let result2=[];if(sections&§ions.length)sections.forEach((lines)=>{if(lines&&lines.length){if(lines[0].split(":").length>2){for(let line of lines)if(line.indexOf(" inet ")>=0&&line.indexOf(" dynamic ")>=0){let parts2=line.split(" "),nic=parts2[parts2.length-1].trim();result2.push(nic);break}}}});return result2}function getLinuxIfaceDHCPstatus(iface,connectionName,DHCPNics){let result2=!1;if(connectionName){let cmd=`nmcli connection show "${connectionName}" 2>/dev/null | grep ipv4.method;`;try{switch(execSync18(cmd,util4.execOptsLinux).toString().replace(/\s+/g," ").trim().split(" ").slice(1).toString()){case"auto":result2=!0;break;default:result2=!1;break}return result2}catch{return DHCPNics.indexOf(iface)>=0}}else return DHCPNics.indexOf(iface)>=0}function getDarwinIfaceDHCPstatus(iface){let result2=!1,cmd=`ipconfig getpacket "${iface}" 2>/dev/null | grep lease_time;`;try{let lines=execSync18(cmd).toString().split(`
|
|
3380
|
+
`);if(lines.length&&lines[0].startsWith("lease_time"))result2=!0}catch{util4.noop()}return result2}function getLinuxIfaceDNSsuffix(connectionName){if(connectionName){let cmd=`nmcli connection show "${connectionName}" 2>/dev/null | grep ipv4.dns-search;`;try{let dnsSuffix=execSync18(cmd,util4.execOptsLinux).toString().replace(/\s+/g," ").trim().split(" ").slice(1).toString();return dnsSuffix==="--"?"Not defined":dnsSuffix}catch{return"Unknown"}}else return"Unknown"}function getLinuxIfaceIEEE8021xAuth(connectionName){if(connectionName){let cmd=`nmcli connection show "${connectionName}" 2>/dev/null | grep 802-1x.eap;`;try{let authenticationProtocol=execSync18(cmd,util4.execOptsLinux).toString().replace(/\s+/g," ").trim().split(" ").slice(1).toString();return authenticationProtocol==="--"?"":authenticationProtocol}catch{return"Not defined"}}else return"Not defined"}function getLinuxIfaceIEEE8021xState(authenticationProtocol){if(authenticationProtocol){if(authenticationProtocol==="Not defined")return"Disabled";return"Enabled"}else return"Unknown"}function testVirtualNic(iface,ifaceName,mac){let virtualMacs=["00:00:00:00:00:00","00:03:FF","00:05:69","00:0C:29","00:0F:4B","00:13:07","00:13:BE","00:15:5d","00:16:3E","00:1C:42","00:21:F6","00:24:0B","00:50:56","00:A0:B1","00:E0:C8","08:00:27","0A:00:27","18:92:2C","16:DF:49","3C:F3:92","54:52:00","FC:15:97"];if(mac)return virtualMacs.filter((item)=>{return mac.toUpperCase().toUpperCase().startsWith(item.substring(0,mac.length))}).length>0||iface.toLowerCase().indexOf(" virtual ")>-1||ifaceName.toLowerCase().indexOf(" virtual ")>-1||iface.toLowerCase().indexOf("vethernet ")>-1||ifaceName.toLowerCase().indexOf("vethernet ")>-1||iface.toLowerCase().startsWith("veth")||ifaceName.toLowerCase().startsWith("veth")||iface.toLowerCase().startsWith("vboxnet")||ifaceName.toLowerCase().startsWith("vboxnet");else return!1}function networkInterfaces(callback,rescan,defaultString){if(typeof callback==="string")defaultString=callback,rescan=!0,callback=null;if(typeof callback==="boolean")rescan=callback,callback=null,defaultString="";if(typeof rescan>"u")rescan=!0;return defaultString=defaultString||"",defaultString=""+defaultString,new Promise((resolve14)=>{process.nextTick(()=>{let ifaces=os4.networkInterfaces(),result2=[],nics=[],dnsSuffixes=[],nics8021xInfo=[];if(_darwin||_freebsd||_openbsd||_netbsd)if(JSON.stringify(ifaces)===JSON.stringify(_ifaces)&&!rescan){if(result2=_networkInterfaces,callback)callback(result2);resolve14(result2)}else{let defaultInterface=getDefaultNetworkInterface();if(_ifaces=JSON.parse(JSON.stringify(ifaces)),nics=getDarwinNics(),nics.forEach((nic)=>{let ip4link="",ip4linksubnet="",ip6link="",ip6linksubnet="";if(nic.ip4="",nic.ip6="",{}.hasOwnProperty.call(ifaces,nic.iface))ifaces[nic.iface].forEach((details)=>{if(details.family==="IPv4"||details.family===4){if(!nic.ip4&&!nic.ip4.match(/^169.254/i))nic.ip4=details.address,nic.ip4subnet=details.netmask;if(nic.ip4.match(/^169.254/i))ip4link=details.address,ip4linksubnet=details.netmask}if(details.family==="IPv6"||details.family===6){if(!nic.ip6&&!nic.ip6.match(/^fe80::/i))nic.ip6=details.address,nic.ip6subnet=details.netmask;if(nic.ip6.match(/^fe80::/i))ip6link=details.address,ip6linksubnet=details.netmask}});if(!nic.ip4&&ip4link)nic.ip4=ip4link,nic.ip4subnet=ip4linksubnet;if(!nic.ip6&&ip6link)nic.ip6=ip6link,nic.ip6subnet=ip6linksubnet;let ifaceSanitized="",s2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(nic.iface),l=util4.mathMin(s2.length,2000);for(let i2=0;i2<=l;i2++)if(s2[i2]!==void 0)ifaceSanitized=ifaceSanitized+s2[i2];result2.push({iface:nic.iface,ifaceName:nic.iface,default:nic.iface===defaultInterface,ip4:nic.ip4,ip4subnet:nic.ip4subnet||"",ip6:nic.ip6,ip6subnet:nic.ip6subnet||"",mac:nic.mac,internal:nic.internal,virtual:nic.internal?!1:testVirtualNic(nic.iface,nic.iface,nic.mac),operstate:nic.operstate,type:nic.type,duplex:nic.duplex,mtu:nic.mtu,speed:nic.speed,dhcp:getDarwinIfaceDHCPstatus(ifaceSanitized),dnsSuffix:"",ieee8021xAuth:"",ieee8021xState:"",carrierChanges:0})}),_networkInterfaces=result2,defaultString.toLowerCase().indexOf("default")>=0)if(result2=result2.filter((item)=>item.default),result2.length>0)result2=result2[0];else result2=[];if(callback)callback(result2);resolve14(result2)}if(_linux)if(JSON.stringify(ifaces)===JSON.stringify(_ifaces)&&!rescan){if(result2=_networkInterfaces,callback)callback(result2);resolve14(result2)}else{_ifaces=JSON.parse(JSON.stringify(ifaces)),_dhcpNics=getLinuxDHCPNics();let defaultInterface=getDefaultNetworkInterface();for(let dev in ifaces){let ip4="",ip4subnet="",ip6="",ip6subnet="",mac="",duplex="",mtu="",speed=null,carrierChanges=0,dhcp=!1,dnsSuffix="",ieee8021xAuth="",ieee8021xState="",type2="",ip4link="",ip4linksubnet="",ip6link="",ip6linksubnet="";if({}.hasOwnProperty.call(ifaces,dev)){let ifaceName=dev;if(ifaces[dev].forEach((details)=>{if(details.family==="IPv4"||details.family===4){if(!ip4&&!ip4.match(/^169.254/i))ip4=details.address,ip4subnet=details.netmask;if(ip4.match(/^169.254/i))ip4link=details.address,ip4linksubnet=details.netmask}if(details.family==="IPv6"||details.family===6){if(!ip6&&!ip6.match(/^fe80::/i))ip6=details.address,ip6subnet=details.netmask;if(ip6.match(/^fe80::/i))ip6link=details.address,ip6linksubnet=details.netmask}mac=details.mac;let nodeMainVersion=parseInt(process.versions.node.split("."),10);if(mac.indexOf("00:00:0")>-1&&(_linux||_darwin)&&!details.internal&&nodeMainVersion>=8&&nodeMainVersion<=11){if(Object.keys(_mac).length===0)_mac=getMacAddresses();mac=_mac[dev]||""}}),!ip4&&ip4link)ip4=ip4link,ip4subnet=ip4linksubnet;if(!ip6&&ip6link)ip6=ip6link,ip6subnet=ip6linksubnet;let iface=dev.split(":")[0].trim(),ifaceSanitized="",s2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(iface),l=util4.mathMin(s2.length,2000);for(let i2=0;i2<=l;i2++)if(s2[i2]!==void 0)ifaceSanitized=ifaceSanitized+s2[i2];let cmd=`echo -n "addr_assign_type: "; cat /sys/class/net/${ifaceSanitized}/addr_assign_type 2>/dev/null; echo;
|
|
3372
3381
|
echo -n "address: "; cat /sys/class/net/${ifaceSanitized}/address 2>/dev/null; echo;
|
|
3373
3382
|
echo -n "addr_len: "; cat /sys/class/net/${ifaceSanitized}/addr_len 2>/dev/null; echo;
|
|
3374
3383
|
echo -n "broadcast: "; cat /sys/class/net/${ifaceSanitized}/broadcast 2>/dev/null; echo;
|
|
@@ -3392,7 +3401,7 @@ Profile on interface`)}catch(error2){if(error2.status===1&&error2.stdout.include
|
|
|
3392
3401
|
echo -n "tx_queue_len: "; cat /sys/class/net/${ifaceSanitized}/tx_queue_len 2>/dev/null; echo;
|
|
3393
3402
|
echo -n "type: "; cat /sys/class/net/${ifaceSanitized}/type 2>/dev/null; echo;
|
|
3394
3403
|
echo -n "wireless: "; cat /proc/net/wireless 2>/dev/null | grep ${ifaceSanitized}; echo;
|
|
3395
|
-
echo -n "wirelessspeed: "; iw dev ${ifaceSanitized} link 2>&1 | grep bitrate; echo;`,lines=[];try{lines=
|
|
3404
|
+
echo -n "wirelessspeed: "; iw dev ${ifaceSanitized} link 2>&1 | grep bitrate; echo;`,lines=[];try{lines=execSync18(cmd,util4.execOptsLinux).toString().split(`
|
|
3396
3405
|
`);let connectionName=getLinuxIfaceConnectionName(ifaceSanitized);dhcp=getLinuxIfaceDHCPstatus(ifaceSanitized,connectionName,_dhcpNics),dnsSuffix=getLinuxIfaceDNSsuffix(connectionName),ieee8021xAuth=getLinuxIfaceIEEE8021xAuth(connectionName),ieee8021xState=getLinuxIfaceIEEE8021xState(ieee8021xAuth)}catch{util4.noop()}duplex=util4.getValue(lines,"duplex"),duplex=duplex.startsWith("cat")?"":duplex,mtu=parseInt(util4.getValue(lines,"mtu"),10);let myspeed=parseInt(util4.getValue(lines,"speed"),10);speed=isNaN(myspeed)?null:myspeed;let wirelessspeed=util4.getValue(lines,"tx bitrate");if(speed===null&&wirelessspeed)myspeed=parseFloat(wirelessspeed),speed=isNaN(myspeed)?null:myspeed;carrierChanges=parseInt(util4.getValue(lines,"carrier_changes"),10);let operstate=util4.getValue(lines,"operstate");if(type2=operstate==="up"?util4.getValue(lines,"wireless").trim()?"wireless":"wired":"unknown",ifaceSanitized==="lo"||ifaceSanitized.startsWith("bond"))type2="virtual";let internal=ifaces[dev]&&ifaces[dev][0]?ifaces[dev][0].internal:!1;if(dev.toLowerCase().indexOf("loopback")>-1||ifaceName.toLowerCase().indexOf("loopback")>-1)internal=!0;let virtual=internal?!1:testVirtualNic(dev,ifaceName,mac);result2.push({iface:ifaceSanitized,ifaceName,default:iface===defaultInterface,ip4,ip4subnet,ip6,ip6subnet,mac,internal,virtual,operstate,type:type2,duplex,mtu,speed,dhcp,dnsSuffix,ieee8021xAuth,ieee8021xState,carrierChanges})}}if(_networkInterfaces=result2,defaultString.toLowerCase().indexOf("default")>=0)if(result2=result2.filter((item)=>item.default),result2.length>0)result2=result2[0];else result2=[];if(callback)callback(result2);resolve14(result2)}if(_windows)if(JSON.stringify(ifaces)===JSON.stringify(_ifaces)&&!rescan){if(result2=_networkInterfaces,callback)callback(result2);resolve14(result2)}else{_ifaces=JSON.parse(JSON.stringify(ifaces));let defaultInterface=getDefaultNetworkInterface();getWindowsNics().then((nics2)=>{nics2.forEach((nic)=>{let found=!1;if(Object.keys(ifaces).forEach((key)=>{if(!found)ifaces[key].forEach((value)=>{if(Object.keys(value).indexOf("mac")>=0)found=value.mac===nic.mac})}),!found)ifaces[nic.name]=[{mac:nic.mac}]}),nics8021xInfo=getWindowsWiredProfilesInformation(),dnsSuffixes=getWindowsDNSsuffixes();for(let dev in ifaces){let ifaceSanitized="",s2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(dev),l=util4.mathMin(s2.length,2000);for(let i2=0;i2<=l;i2++)if(s2[i2]!==void 0)ifaceSanitized=ifaceSanitized+s2[i2];let iface=dev,ip4="",ip4subnet="",ip6="",ip6subnet="",mac="",duplex="",mtu="",speed=null,carrierChanges=0,operstate="down",dhcp=!1,dnsSuffix="",ieee8021xAuth="",ieee8021xState="",type2="";if({}.hasOwnProperty.call(ifaces,dev)){let ifaceName=dev;ifaces[dev].forEach((details)=>{if(details.family==="IPv4"||details.family===4)ip4=details.address,ip4subnet=details.netmask;if(details.family==="IPv6"||details.family===6){if(!ip6||ip6.match(/^fe80::/i))ip6=details.address,ip6subnet=details.netmask}mac=details.mac;let nodeMainVersion=parseInt(process.versions.node.split("."),10);if(mac.indexOf("00:00:0")>-1&&(_linux||_darwin)&&!details.internal&&nodeMainVersion>=8&&nodeMainVersion<=11){if(Object.keys(_mac).length===0)_mac=getMacAddresses();mac=_mac[dev]||""}}),dnsSuffix=getWindowsIfaceDNSsuffix(dnsSuffixes.ifaces,ifaceSanitized);let foundFirst=!1;if(nics2.forEach((detail)=>{if(detail.mac===mac&&!foundFirst)iface=detail.iface||iface,ifaceName=detail.name,dhcp=detail.dhcp,operstate=detail.operstate,speed=operstate==="up"?detail.speed:0,type2=detail.type,foundFirst=!0}),dev.toLowerCase().indexOf("wlan")>=0||ifaceName.toLowerCase().indexOf("wlan")>=0||ifaceName.toLowerCase().indexOf("802.11n")>=0||ifaceName.toLowerCase().indexOf("wireless")>=0||ifaceName.toLowerCase().indexOf("wi-fi")>=0||ifaceName.toLowerCase().indexOf("wifi")>=0)type2="wireless";let IEEE8021x=getWindowsIEEE8021x(type2,ifaceSanitized,nics8021xInfo);ieee8021xAuth=IEEE8021x.protocol,ieee8021xState=IEEE8021x.state;let internal=ifaces[dev]&&ifaces[dev][0]?ifaces[dev][0].internal:!1;if(dev.toLowerCase().indexOf("loopback")>-1||ifaceName.toLowerCase().indexOf("loopback")>-1)internal=!0;let virtual=internal?!1:testVirtualNic(dev,ifaceName,mac);result2.push({iface,ifaceName,default:iface===defaultInterface,ip4,ip4subnet,ip6,ip6subnet,mac,internal,virtual,operstate,type:type2,duplex,mtu,speed,dhcp,dnsSuffix,ieee8021xAuth,ieee8021xState,carrierChanges})}}if(_networkInterfaces=result2,defaultString.toLowerCase().indexOf("default")>=0)if(result2=result2.filter((item)=>item.default),result2.length>0)result2=result2[0];else result2=[];if(callback)callback(result2);resolve14(result2)})}})})}exports.networkInterfaces=networkInterfaces;function calcNetworkSpeed(iface,rx_bytes,tx_bytes,operstate,rx_dropped,rx_errors,tx_dropped,tx_errors){let result2={iface,operstate,rx_bytes,rx_dropped,rx_errors,tx_bytes,tx_dropped,tx_errors,rx_sec:null,tx_sec:null,ms:0};if(_network[iface]&&_network[iface].ms)result2.ms=Date.now()-_network[iface].ms,result2.rx_sec=rx_bytes-_network[iface].rx_bytes>=0?(rx_bytes-_network[iface].rx_bytes)/(result2.ms/1000):0,result2.tx_sec=tx_bytes-_network[iface].tx_bytes>=0?(tx_bytes-_network[iface].tx_bytes)/(result2.ms/1000):0,_network[iface].rx_bytes=rx_bytes,_network[iface].tx_bytes=tx_bytes,_network[iface].rx_sec=result2.rx_sec,_network[iface].tx_sec=result2.tx_sec,_network[iface].ms=Date.now(),_network[iface].last_ms=result2.ms,_network[iface].operstate=operstate;else{if(!_network[iface])_network[iface]={};_network[iface].rx_bytes=rx_bytes,_network[iface].tx_bytes=tx_bytes,_network[iface].rx_sec=null,_network[iface].tx_sec=null,_network[iface].ms=Date.now(),_network[iface].last_ms=0,_network[iface].operstate=operstate}return result2}function networkStats(ifaces,callback){let ifacesArray=[];return new Promise((resolve14)=>{process.nextTick(()=>{if(util4.isFunction(ifaces)&&!callback)callback=ifaces,ifacesArray=[getDefaultNetworkInterface()];else{if(typeof ifaces!=="string"&&ifaces!==void 0){if(callback)callback([]);return resolve14([])}ifaces=ifaces||getDefaultNetworkInterface();try{ifaces.__proto__.toLowerCase=util4.stringToLower,ifaces.__proto__.replace=util4.stringReplace,ifaces.__proto__.toString=util4.stringToString,ifaces.__proto__.substr=util4.stringSubstr,ifaces.__proto__.substring=util4.stringSubstring,ifaces.__proto__.trim=util4.stringTrim,ifaces.__proto__.startsWith=util4.stringStartWith}catch{Object.setPrototypeOf(ifaces,util4.stringObj)}ifaces=ifaces.trim().replace(/,+/g,"|"),ifacesArray=ifaces.split("|")}let result2=[],workload=[];if(ifacesArray.length&&ifacesArray[0].trim()==="*")ifacesArray=[],networkInterfaces(!1).then((allIFaces)=>{for(let iface of allIFaces)ifacesArray.push(iface.iface);networkStats(ifacesArray.join(",")).then((result3)=>{if(callback)callback(result3);resolve14(result3)})});else{for(let iface of ifacesArray)workload.push(networkStatsSingle(iface.trim()));if(workload.length)Promise.all(workload).then((data)=>{if(callback)callback(data);resolve14(data)});else{if(callback)callback(result2);resolve14(result2)}}})})}function networkStatsSingle(iface){function parseLinesWindowsPerfData(sections){let perfData=[];for(let i2 in sections)if({}.hasOwnProperty.call(sections,i2)){if(sections[i2].trim()!==""){let lines=sections[i2].trim().split(`\r
|
|
3397
3406
|
`);perfData.push({name:util4.getValue(lines,"Name",":").replace(/[()[\] ]+/g,"").replace(/#|\//g,"_").toLowerCase(),rx_bytes:parseInt(util4.getValue(lines,"BytesReceivedPersec",":"),10),rx_errors:parseInt(util4.getValue(lines,"PacketsReceivedErrors",":"),10),rx_dropped:parseInt(util4.getValue(lines,"PacketsReceivedDiscarded",":"),10),tx_bytes:parseInt(util4.getValue(lines,"BytesSentPersec",":"),10),tx_errors:parseInt(util4.getValue(lines,"PacketsOutboundErrors",":"),10),tx_dropped:parseInt(util4.getValue(lines,"PacketsOutboundDiscarded",":"),10)})}}return perfData}return new Promise((resolve14)=>{process.nextTick(()=>{let ifaceSanitized="",s2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(iface),l=util4.mathMin(s2.length,2000);for(let i2=0;i2<=l;i2++)if(s2[i2]!==void 0)ifaceSanitized=ifaceSanitized+s2[i2];let result2={iface:ifaceSanitized,operstate:"unknown",rx_bytes:0,rx_dropped:0,rx_errors:0,tx_bytes:0,tx_dropped:0,tx_errors:0,rx_sec:null,tx_sec:null,ms:0},operstate="unknown",rx_bytes=0,tx_bytes=0,rx_dropped=0,rx_errors=0,tx_dropped=0,tx_errors=0,cmd,lines,stats2;if(!_network[ifaceSanitized]||_network[ifaceSanitized]&&!_network[ifaceSanitized].ms||_network[ifaceSanitized]&&_network[ifaceSanitized].ms&&Date.now()-_network[ifaceSanitized].ms>=500){if(_linux)if(fs3.existsSync("/sys/class/net/"+ifaceSanitized))cmd="cat /sys/class/net/"+ifaceSanitized+"/operstate; cat /sys/class/net/"+ifaceSanitized+"/statistics/rx_bytes; cat /sys/class/net/"+ifaceSanitized+"/statistics/tx_bytes; cat /sys/class/net/"+ifaceSanitized+"/statistics/rx_dropped; cat /sys/class/net/"+ifaceSanitized+"/statistics/rx_errors; cat /sys/class/net/"+ifaceSanitized+"/statistics/tx_dropped; cat /sys/class/net/"+ifaceSanitized+"/statistics/tx_errors; ",exec3(cmd,(error2,stdout)=>{if(!error2)lines=stdout.toString().split(`
|
|
3398
3407
|
`),operstate=lines[0].trim(),rx_bytes=parseInt(lines[1],10),tx_bytes=parseInt(lines[2],10),rx_dropped=parseInt(lines[3],10),rx_errors=parseInt(lines[4],10),tx_dropped=parseInt(lines[5],10),tx_errors=parseInt(lines[6],10),result2=calcNetworkSpeed(ifaceSanitized,rx_bytes,tx_bytes,operstate,rx_dropped,rx_errors,tx_dropped,tx_errors);resolve14(result2)});else resolve14(result2);if(_freebsd||_openbsd||_netbsd)cmd="netstat -ibndI "+ifaceSanitized,exec3(cmd,(error2,stdout)=>{if(!error2){lines=stdout.toString().split(`
|
|
@@ -3406,18 +3415,18 @@ Profile on interface`)}catch(error2){if(error2.status===1&&error2.stdout.include
|
|
|
3406
3415
|
`),parts=(lines&&lines[0]?lines[0]:"").split(" via ");if(parts&&parts[1])parts=parts[1].split(" "),result2=parts[0];if(callback)callback(result2);resolve14(result2)}else{if(callback)callback(result2);resolve14(result2)}})}catch{if(callback)callback(result2);resolve14(result2)}if(_darwin){let cmd="route -n get default";try{exec3(cmd,{maxBuffer:104857600},(error2,stdout)=>{if(!error2){let lines=stdout.toString().split(`
|
|
3407
3416
|
`).map((line)=>line.trim());result2=util4.getValue(lines,"gateway")}if(!result2)cmd="netstat -rn | awk '/default/ {print $2}'",exec3(cmd,{maxBuffer:104857600},(error3,stdout2)=>{if(result2=stdout2.toString().split(`
|
|
3408
3417
|
`).map((line)=>line.trim()).find((line)=>/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(line)),callback)callback(result2);resolve14(result2)});else{if(callback)callback(result2);resolve14(result2)}})}catch{if(callback)callback(result2);resolve14(result2)}}if(_windows)try{exec3("netstat -r",util4.execOptsWin,(error2,stdout)=>{if(stdout.toString().split(os4.EOL).forEach((line)=>{if(line=line.replace(/\s+/g," ").trim(),line.indexOf("0.0.0.0 0.0.0.0")>-1&&!/[a-zA-Z]/.test(line)){let parts=line.split(" ");if(parts.length>=5&&parts[parts.length-3].indexOf(".")>-1)result2=parts[parts.length-3]}}),!result2)util4.powerShell("Get-CimInstance -ClassName Win32_IP4RouteTable | Where-Object { $_.Destination -eq '0.0.0.0' -and $_.Mask -eq '0.0.0.0' }").then((data)=>{let lines2=data.toString().split(`\r
|
|
3409
|
-
`);if(lines2.length>1&&!result2){if(result2=util4.getValue(lines2,"NextHop"),callback)callback(result2);resolve14(result2)}});else{if(callback)callback(result2);resolve14(result2)}})}catch{if(callback)callback(result2);resolve14(result2)}})})}exports.networkGatewayDefault=networkGatewayDefault});var require_wifi=__commonJS((exports)=>{var os4=__require("os"),exec3=__require("child_process").exec,
|
|
3418
|
+
`);if(lines2.length>1&&!result2){if(result2=util4.getValue(lines2,"NextHop"),callback)callback(result2);resolve14(result2)}});else{if(callback)callback(result2);resolve14(result2)}})}catch{if(callback)callback(result2);resolve14(result2)}})})}exports.networkGatewayDefault=networkGatewayDefault});var require_wifi=__commonJS((exports)=>{var os4=__require("os"),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,util4=require_util3(),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32";function wifiDBFromQuality(quality){let qual=parseFloat(quality);if(qual<0)return 0;if(qual>=100)return-50;return qual/2-100}function wifiQualityFromDB(db){let result2=2*(parseFloat(db)+100);return result2<=100?result2:100}var _wifi_frequencies={1:2412,2:2417,3:2422,4:2427,5:2432,6:2437,7:2442,8:2447,9:2452,10:2457,11:2462,12:2467,13:2472,14:2484,32:5160,34:5170,36:5180,38:5190,40:5200,42:5210,44:5220,46:5230,48:5240,50:5250,52:5260,54:5270,56:5280,58:5290,60:5300,62:5310,64:5320,68:5340,96:5480,100:5500,102:5510,104:5520,106:5530,108:5540,110:5550,112:5560,114:5570,116:5580,118:5590,120:5600,122:5610,124:5620,126:5630,128:5640,132:5660,134:5670,136:5680,138:5690,140:5700,142:5710,144:5720,149:5745,151:5755,153:5765,155:5775,157:5785,159:5795,161:5805,165:5825,169:5845,173:5865,183:4915,184:4920,185:4925,187:4935,188:4940,189:4945,192:4960,196:4980};function wifiFrequencyFromChannel(channel){return{}.hasOwnProperty.call(_wifi_frequencies,channel)?_wifi_frequencies[channel]:null}function wifiChannelFromFrequencs(frequency){let channel=0;for(let key in _wifi_frequencies)if({}.hasOwnProperty.call(_wifi_frequencies,key)){if(_wifi_frequencies[key]===frequency)channel=util4.toInt(key)}return channel}function ifaceListLinux(){let result2=[],cmd="iw dev 2>/dev/null";try{let parts=execSync18("iw dev 2>/dev/null",util4.execOptsLinux).toString().split(`
|
|
3410
3419
|
`).map((line)=>line.trim()).join(`
|
|
3411
3420
|
`).split(`
|
|
3412
3421
|
Interface `);return parts.shift(),parts.forEach((ifaceDetails)=>{let lines=ifaceDetails.split(`
|
|
3413
|
-
`),iface=lines[0],id=util4.toInt(util4.getValue(lines,"ifindex"," ")),mac=util4.getValue(lines,"addr"," "),channel=util4.toInt(util4.getValue(lines,"channel"," "));result2.push({id,iface,mac,channel})}),result2}catch{try{let parts=
|
|
3422
|
+
`),iface=lines[0],id=util4.toInt(util4.getValue(lines,"ifindex"," ")),mac=util4.getValue(lines,"addr"," "),channel=util4.toInt(util4.getValue(lines,"channel"," "));result2.push({id,iface,mac,channel})}),result2}catch{try{let parts=execSync18("nmcli -t -f general,wifi-properties,wired-properties,interface-flags,capabilities,nsp device show 2>/dev/null",util4.execOptsLinux).toString().split(`
|
|
3414
3423
|
|
|
3415
3424
|
`),i2=1;return parts.forEach((ifaceDetails)=>{let lines=ifaceDetails.split(`
|
|
3416
|
-
`),iface=util4.getValue(lines,"GENERAL.DEVICE"),type2=util4.getValue(lines,"GENERAL.TYPE"),id=i2++,mac=util4.getValue(lines,"GENERAL.HWADDR"),channel="";if(type2.toLowerCase()==="wifi")result2.push({id,iface,mac,channel:""})}),result2}catch{return[]}}}function nmiDeviceLinux(iface){let cmd=`nmcli -t -f general,wifi-properties,capabilities,ip4,ip6 device show ${iface} 2> /dev/null`;try{let lines=
|
|
3417
|
-
`),ssid=util4.getValue(lines,"GENERAL.CONNECTION");return{iface,type:util4.getValue(lines,"GENERAL.TYPE"),vendor:util4.getValue(lines,"GENERAL.VENDOR"),product:util4.getValue(lines,"GENERAL.PRODUCT"),mac:util4.getValue(lines,"GENERAL.HWADDR").toLowerCase(),ssid:ssid!=="--"?ssid:null}}catch{return{}}}function nmiConnectionLinux(ssid){let cmd=`nmcli -t --show-secrets connection show ${ssid} 2>/dev/null`;try{let lines=
|
|
3418
|
-
`),bssid=util4.getValue(lines,"802-11-wireless.seen-bssids").toLowerCase();return{ssid:ssid!=="--"?ssid:null,uuid:util4.getValue(lines,"connection.uuid"),type:util4.getValue(lines,"connection.type"),autoconnect:util4.getValue(lines,"connection.autoconnect")==="yes",security:util4.getValue(lines,"802-11-wireless-security.key-mgmt"),bssid:bssid!=="--"?bssid:null}}catch{return{}}}function wpaConnectionLinux(iface){if(!iface)return{};let cmd=`wpa_cli -i ${iface} status 2>&1`;try{let lines=
|
|
3419
|
-
`),freq=util4.toInt(util4.getValue(lines,"freq","="));return{ssid:util4.getValue(lines,"ssid","="),uuid:util4.getValue(lines,"uuid","="),security:util4.getValue(lines,"key_mgmt","="),freq,channel:wifiChannelFromFrequencs(freq),bssid:util4.getValue(lines,"bssid","=").toLowerCase()}}catch{return{}}}function getWifiNetworkListNmi(){let result2=[],cmd="nmcli -t -m multiline --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list 2>/dev/null";try{let parts=
|
|
3420
|
-
`),channel=util4.getValue(lines,"channel",":",!0),address=lines&&lines.length&&lines[0].indexOf("Address:")>=0?lines[0].split("Address:")[1].trim().toLowerCase():"",mode=util4.getValue(lines,"mode",":",!0),frequency=util4.getValue(lines,"frequency",":",!0),dbParts=util4.getValue(lines,"Quality","=",!0).toLowerCase().split("signal level="),db=dbParts.length>1?util4.toInt(dbParts[1]):0,quality=db?wifiQualityFromDB(db):0,ssid=util4.getValue(lines,"essid",":",!0),isWpa=element.indexOf(" WPA ")>=0,isWpa2=element.indexOf("WPA2 ")>=0,security=[];if(isWpa)security.push("WPA");if(isWpa2)security.push("WPA2");let wpaFlags=[],wpaFlag="";if(lines.forEach((line)=>{let l=line.trim().toLowerCase();if(l.indexOf("group cipher")>=0){if(wpaFlag)wpaFlags.push(wpaFlag);let parts=l.split(":");if(parts.length>1)wpaFlag=parts[1].trim().toUpperCase()}if(l.indexOf("pairwise cipher")>=0){let parts=l.split(":");if(parts.length>1){if(parts[1].indexOf("tkip"))wpaFlag=wpaFlag?"TKIP/"+wpaFlag:"TKIP";else if(parts[1].indexOf("ccmp"))wpaFlag=wpaFlag?"CCMP/"+wpaFlag:"CCMP";else if(parts[1].indexOf("proprietary"))wpaFlag=wpaFlag?"PROP/"+wpaFlag:"PROP"}}if(l.indexOf("authentication suites")>=0){let parts=l.split(":");if(parts.length>1){if(parts[1].indexOf("802.1x"))wpaFlag=wpaFlag?"802.1x/"+wpaFlag:"802.1x";else if(parts[1].indexOf("psk"))wpaFlag=wpaFlag?"PSK/"+wpaFlag:"PSK"}}}),wpaFlag)wpaFlags.push(wpaFlag);result2.push({ssid,bssid:address,mode,channel:channel?util4.toInt(channel):null,frequency:frequency?util4.toInt(frequency.replace(".","")):null,signalLevel:db,quality,security,wpaFlags,rsnFlags:[]})});return result2}catch{return-1}}function parseWifiDarwin(wifiStr){let result2=[];try{let wifiObj=JSON.parse(wifiStr);return wifiObj=wifiObj.SPAirPortDataType[0].spairport_airport_interfaces[0].spairport_airport_other_local_wireless_networks,wifiObj.forEach((wifiItem)=>{let security=[],sm=wifiItem.spairport_security_mode||"";if(sm==="spairport_security_mode_wep")security.push("WEP");else if(sm==="spairport_security_mode_wpa2_personal")security.push("WPA2");else if(sm.startsWith("spairport_security_mode_wpa2_enterprise"))security.push("WPA2 EAP");else if(sm.startsWith("pairport_security_mode_wpa3_transition"))security.push("WPA2/WPA3");else if(sm.startsWith("pairport_security_mode_wpa3"))security.push("WPA3");let channel=parseInt((""+wifiItem.spairport_network_channel).split(" ")[0])||0,signalLevel=wifiItem.spairport_signal_noise||null;result2.push({ssid:wifiItem._name||"",bssid:wifiItem.spairport_network_bssid||null,mode:wifiItem.spairport_network_phymode,channel,frequency:wifiFrequencyFromChannel(channel),signalLevel:signalLevel?parseInt(signalLevel,10):null,quality:wifiQualityFromDB(signalLevel),security,wpaFlags:[],rsnFlags:[]})}),result2}catch{return result2}}function wifiNetworks(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=[];if(_linux)if(result2=getWifiNetworkListNmi(),result2.length===0)try{let iwconfigParts=
|
|
3425
|
+
`),iface=util4.getValue(lines,"GENERAL.DEVICE"),type2=util4.getValue(lines,"GENERAL.TYPE"),id=i2++,mac=util4.getValue(lines,"GENERAL.HWADDR"),channel="";if(type2.toLowerCase()==="wifi")result2.push({id,iface,mac,channel:""})}),result2}catch{return[]}}}function nmiDeviceLinux(iface){let cmd=`nmcli -t -f general,wifi-properties,capabilities,ip4,ip6 device show ${iface} 2> /dev/null`;try{let lines=execSync18(cmd,util4.execOptsLinux).toString().split(`
|
|
3426
|
+
`),ssid=util4.getValue(lines,"GENERAL.CONNECTION");return{iface,type:util4.getValue(lines,"GENERAL.TYPE"),vendor:util4.getValue(lines,"GENERAL.VENDOR"),product:util4.getValue(lines,"GENERAL.PRODUCT"),mac:util4.getValue(lines,"GENERAL.HWADDR").toLowerCase(),ssid:ssid!=="--"?ssid:null}}catch{return{}}}function nmiConnectionLinux(ssid){let cmd=`nmcli -t --show-secrets connection show ${ssid} 2>/dev/null`;try{let lines=execSync18(cmd,util4.execOptsLinux).toString().split(`
|
|
3427
|
+
`),bssid=util4.getValue(lines,"802-11-wireless.seen-bssids").toLowerCase();return{ssid:ssid!=="--"?ssid:null,uuid:util4.getValue(lines,"connection.uuid"),type:util4.getValue(lines,"connection.type"),autoconnect:util4.getValue(lines,"connection.autoconnect")==="yes",security:util4.getValue(lines,"802-11-wireless-security.key-mgmt"),bssid:bssid!=="--"?bssid:null}}catch{return{}}}function wpaConnectionLinux(iface){if(!iface)return{};let cmd=`wpa_cli -i ${iface} status 2>&1`;try{let lines=execSync18(cmd,util4.execOptsLinux).toString().split(`
|
|
3428
|
+
`),freq=util4.toInt(util4.getValue(lines,"freq","="));return{ssid:util4.getValue(lines,"ssid","="),uuid:util4.getValue(lines,"uuid","="),security:util4.getValue(lines,"key_mgmt","="),freq,channel:wifiChannelFromFrequencs(freq),bssid:util4.getValue(lines,"bssid","=").toLowerCase()}}catch{return{}}}function getWifiNetworkListNmi(){let result2=[],cmd="nmcli -t -m multiline --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list 2>/dev/null";try{let parts=execSync18("nmcli -t -m multiline --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list 2>/dev/null",util4.execOptsLinux).toString().split("ACTIVE:");return parts.shift(),parts.forEach((part)=>{part="ACTIVE:"+part;let lines=part.split(os4.EOL),channel=util4.getValue(lines,"CHAN"),frequency=util4.getValue(lines,"FREQ").toLowerCase().replace("mhz","").trim(),security=util4.getValue(lines,"SECURITY").replace("(","").replace(")",""),wpaFlags=util4.getValue(lines,"WPA-FLAGS").replace("(","").replace(")",""),rsnFlags=util4.getValue(lines,"RSN-FLAGS").replace("(","").replace(")",""),quality=util4.getValue(lines,"SIGNAL");result2.push({ssid:util4.getValue(lines,"SSID"),bssid:util4.getValue(lines,"BSSID").toLowerCase(),mode:util4.getValue(lines,"MODE"),channel:channel?parseInt(channel,10):null,frequency:frequency?parseInt(frequency,10):null,signalLevel:wifiDBFromQuality(quality),quality:quality?parseInt(quality,10):null,security:security&&security!=="none"?security.split(" "):[],wpaFlags:wpaFlags&&wpaFlags!=="none"?wpaFlags.split(" "):[],rsnFlags:rsnFlags&&rsnFlags!=="none"?rsnFlags.split(" "):[]})}),result2}catch{return[]}}function getWifiNetworkListIw(iface){let result2=[];try{let iwlistParts=execSync18(`export LC_ALL=C; iwlist ${iface} scan 2>&1; unset LC_ALL`,util4.execOptsLinux).toString().split(" Cell ");if(iwlistParts[0].indexOf("resource busy")>=0)return-1;if(iwlistParts.length>1)iwlistParts.shift(),iwlistParts.forEach((element)=>{let lines=element.split(`
|
|
3429
|
+
`),channel=util4.getValue(lines,"channel",":",!0),address=lines&&lines.length&&lines[0].indexOf("Address:")>=0?lines[0].split("Address:")[1].trim().toLowerCase():"",mode=util4.getValue(lines,"mode",":",!0),frequency=util4.getValue(lines,"frequency",":",!0),dbParts=util4.getValue(lines,"Quality","=",!0).toLowerCase().split("signal level="),db=dbParts.length>1?util4.toInt(dbParts[1]):0,quality=db?wifiQualityFromDB(db):0,ssid=util4.getValue(lines,"essid",":",!0),isWpa=element.indexOf(" WPA ")>=0,isWpa2=element.indexOf("WPA2 ")>=0,security=[];if(isWpa)security.push("WPA");if(isWpa2)security.push("WPA2");let wpaFlags=[],wpaFlag="";if(lines.forEach((line)=>{let l=line.trim().toLowerCase();if(l.indexOf("group cipher")>=0){if(wpaFlag)wpaFlags.push(wpaFlag);let parts=l.split(":");if(parts.length>1)wpaFlag=parts[1].trim().toUpperCase()}if(l.indexOf("pairwise cipher")>=0){let parts=l.split(":");if(parts.length>1){if(parts[1].indexOf("tkip"))wpaFlag=wpaFlag?"TKIP/"+wpaFlag:"TKIP";else if(parts[1].indexOf("ccmp"))wpaFlag=wpaFlag?"CCMP/"+wpaFlag:"CCMP";else if(parts[1].indexOf("proprietary"))wpaFlag=wpaFlag?"PROP/"+wpaFlag:"PROP"}}if(l.indexOf("authentication suites")>=0){let parts=l.split(":");if(parts.length>1){if(parts[1].indexOf("802.1x"))wpaFlag=wpaFlag?"802.1x/"+wpaFlag:"802.1x";else if(parts[1].indexOf("psk"))wpaFlag=wpaFlag?"PSK/"+wpaFlag:"PSK"}}}),wpaFlag)wpaFlags.push(wpaFlag);result2.push({ssid,bssid:address,mode,channel:channel?util4.toInt(channel):null,frequency:frequency?util4.toInt(frequency.replace(".","")):null,signalLevel:db,quality,security,wpaFlags,rsnFlags:[]})});return result2}catch{return-1}}function parseWifiDarwin(wifiStr){let result2=[];try{let wifiObj=JSON.parse(wifiStr);return wifiObj=wifiObj.SPAirPortDataType[0].spairport_airport_interfaces[0].spairport_airport_other_local_wireless_networks,wifiObj.forEach((wifiItem)=>{let security=[],sm=wifiItem.spairport_security_mode||"";if(sm==="spairport_security_mode_wep")security.push("WEP");else if(sm==="spairport_security_mode_wpa2_personal")security.push("WPA2");else if(sm.startsWith("spairport_security_mode_wpa2_enterprise"))security.push("WPA2 EAP");else if(sm.startsWith("pairport_security_mode_wpa3_transition"))security.push("WPA2/WPA3");else if(sm.startsWith("pairport_security_mode_wpa3"))security.push("WPA3");let channel=parseInt((""+wifiItem.spairport_network_channel).split(" ")[0])||0,signalLevel=wifiItem.spairport_signal_noise||null;result2.push({ssid:wifiItem._name||"",bssid:wifiItem.spairport_network_bssid||null,mode:wifiItem.spairport_network_phymode,channel,frequency:wifiFrequencyFromChannel(channel),signalLevel:signalLevel?parseInt(signalLevel,10):null,quality:wifiQualityFromDB(signalLevel),security,wpaFlags:[],rsnFlags:[]})}),result2}catch{return result2}}function wifiNetworks(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=[];if(_linux)if(result2=getWifiNetworkListNmi(),result2.length===0)try{let iwconfigParts=execSync18("export LC_ALL=C; iwconfig 2>/dev/null; unset LC_ALL",util4.execOptsLinux).toString().split(`
|
|
3421
3430
|
|
|
3422
3431
|
`),iface="";if(iwconfigParts.forEach((element)=>{if(element.indexOf("no wireless")===-1&&element.trim()!=="")iface=element.split(" ")[0]}),iface){let ifaceSanitized="",s2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(iface,!0),l=util4.mathMin(s2.length,2000);for(let i2=0;i2<=l;i2++)if(s2[i2]!==void 0)ifaceSanitized=ifaceSanitized+s2[i2];let res=getWifiNetworkListIw(ifaceSanitized);if(res===-1)setTimeout(()=>{let res2=getWifiNetworkListIw(ifaceSanitized);if(res2!==-1)result2=res2;if(callback)callback(result2);resolve14(result2)},4000);else{if(result2=res,callback)callback(result2);resolve14(result2)}}else{if(callback)callback(result2);resolve14(result2)}}catch{if(callback)callback(result2);resolve14(result2)}else{if(callback)callback(result2);resolve14(result2)}else if(_darwin)exec3("system_profiler SPAirPortDataType -json 2>/dev/null",{maxBuffer:40960000},(error2,stdout)=>{if(result2=parseWifiDarwin(stdout.toString()),callback)callback(result2);resolve14(result2)});else if(_windows)util4.powerShell("netsh wlan show networks mode=Bssid").then((stdout)=>{let ssidParts=stdout.toString("utf8").split(os4.EOL+os4.EOL+"SSID ");if(ssidParts.shift(),ssidParts.forEach((ssidPart)=>{let ssidLines=ssidPart.split(os4.EOL);if(ssidLines&&ssidLines.length>=8&&ssidLines[0].indexOf(":")>=0){let bssidsParts=ssidPart.split(" BSSID");bssidsParts.shift(),bssidsParts.forEach((bssidPart)=>{let bssidLines=bssidPart.split(os4.EOL),bssidLine=bssidLines[0].split(":");bssidLine.shift();let bssid=bssidLine.join(":").trim().toLowerCase(),channel=bssidLines[3].split(":").pop().trim(),quality=bssidLines[1].split(":").pop().trim();result2.push({ssid:ssidLines[0].split(":").pop().trim(),bssid,mode:"",channel:channel?parseInt(channel,10):null,frequency:wifiFrequencyFromChannel(channel),signalLevel:wifiDBFromQuality(quality),quality:quality?parseInt(quality,10):null,security:[ssidLines[2].split(":").pop().trim()],wpaFlags:[ssidLines[3].split(":").pop().trim()],rsnFlags:[]})})}}),callback)callback(result2);resolve14(result2)});else{if(callback)callback(result2);resolve14(result2)}})})}exports.wifiNetworks=wifiNetworks;function getVendor(model){model=model.toLowerCase();let result2="";if(model.indexOf("intel")>=0)result2="Intel";else if(model.indexOf("realtek")>=0)result2="Realtek";else if(model.indexOf("qualcom")>=0)result2="Qualcom";else if(model.indexOf("broadcom")>=0)result2="Broadcom";else if(model.indexOf("cavium")>=0)result2="Cavium";else if(model.indexOf("cisco")>=0)result2="Cisco";else if(model.indexOf("marvel")>=0)result2="Marvel";else if(model.indexOf("zyxel")>=0)result2="Zyxel";else if(model.indexOf("melanox")>=0)result2="Melanox";else if(model.indexOf("d-link")>=0)result2="D-Link";else if(model.indexOf("tp-link")>=0)result2="TP-Link";else if(model.indexOf("asus")>=0)result2="Asus";else if(model.indexOf("linksys")>=0)result2="Linksys";return result2}function wifiConnections(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=[];if(_linux){let ifaces=ifaceListLinux(),networkList=getWifiNetworkListNmi();if(ifaces.forEach((ifaceDetail)=>{let ifaceSanitized="",s2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(ifaceDetail.iface,!0),ll=util4.mathMin(s2.length,2000);for(let i2=0;i2<=ll;i2++)if(s2[i2]!==void 0)ifaceSanitized=ifaceSanitized+s2[i2];let nmiDetails=nmiDeviceLinux(ifaceSanitized),wpaDetails=wpaConnectionLinux(ifaceSanitized),ssid=nmiDetails.ssid||wpaDetails.ssid,network=networkList.filter((nw)=>nw.ssid===ssid),ssidSanitized="",t2=util4.isPrototypePolluted()?"---":util4.sanitizeShellString(ssid,!0),l=util4.mathMin(t2.length,32);for(let i2=0;i2<=l;i2++)if(t2[i2]!==void 0)ssidSanitized=ssidSanitized+t2[i2];let nmiConnection=nmiConnectionLinux(ssidSanitized),channel=network&&network.length&&network[0].channel?network[0].channel:wpaDetails.channel?wpaDetails.channel:null,bssid=network&&network.length&&network[0].bssid?network[0].bssid:wpaDetails.bssid?wpaDetails.bssid:null,signalLevel=network&&network.length&&network[0].signalLevel?network[0].signalLevel:null;if(ssid&&bssid)result2.push({id:ifaceDetail.id,iface:ifaceDetail.iface,model:nmiDetails.product,ssid,bssid:network&&network.length&&network[0].bssid?network[0].bssid:wpaDetails.bssid?wpaDetails.bssid:null,channel,frequency:channel?wifiFrequencyFromChannel(channel):null,type:nmiConnection.type?nmiConnection.type:"802.11",security:nmiConnection.security?nmiConnection.security:wpaDetails.security?wpaDetails.security:null,signalLevel,quality:wifiQualityFromDB(signalLevel),txRate:null})}),callback)callback(result2);resolve14(result2)}else if(_darwin)exec3('system_profiler SPNetworkDataType SPAirPortDataType -xml 2>/dev/null; echo "######" ; ioreg -n AppleBCMWLANSkywalkInterface -r 2>/dev/null',(error2,stdout)=>{try{let parts=stdout.toString().split("######"),profilerObj=util4.plistParser(parts[0]),networkObj=profilerObj[0]._SPCommandLineArguments.indexOf("SPNetworkDataType")>=0?profilerObj[0]._items:profilerObj[1]._items,airportObj=profilerObj[0]._SPCommandLineArguments.indexOf("SPAirPortDataType")>=0?profilerObj[0]._items[0].spairport_airport_interfaces:profilerObj[1]._items[0].spairport_airport_interfaces,lines3=[];if(parts[1].indexOf(" | {")>0&&parts[1].indexOf(" | }")>parts[1].indexOf(" | {"))lines3=parts[1].split(" | {")[1].split(" | }")[0].replace(/ \| /g,"").replace(/"/g,"").split(`
|
|
3423
3432
|
`);let networkWifiObj=networkObj.find((item)=>{return item._name==="Wi-Fi"}),airportWifiObj=airportObj[0].spairport_current_network_information,channel=parseInt((""+airportWifiObj.spairport_network_channel).split(" ")[0],10)||0,signalLevel=airportWifiObj.spairport_signal_noise||null,security=[],sm=airportWifiObj.spairport_security_mode||"";if(sm==="spairport_security_mode_wep")security.push("WEP");else if(sm==="spairport_security_mode_wpa2_personal")security.push("WPA2");else if(sm.startsWith("spairport_security_mode_wpa2_enterprise"))security.push("WPA2 EAP");else if(sm.startsWith("pairport_security_mode_wpa3_transition"))security.push("WPA2/WPA3");else if(sm.startsWith("pairport_security_mode_wpa3"))security.push("WPA3");result2.push({id:networkWifiObj._name||"Wi-Fi",iface:networkWifiObj.interface||"",model:networkWifiObj.hardware||"",ssid:(airportWifiObj._name||"").replace("<","<").replace(">",">"),bssid:airportWifiObj.spairport_network_bssid||"",channel,frequency:channel?wifiFrequencyFromChannel(channel):null,type:airportWifiObj.spairport_network_phymode||"802.11",security,signalLevel:signalLevel?parseInt(signalLevel,10):null,quality:wifiQualityFromDB(signalLevel),txRate:airportWifiObj.spairport_network_rate||null})}catch{util4.noop()}if(callback)callback(result2);resolve14(result2)});else if(_windows)util4.powerShell("netsh wlan show interfaces").then((stdout)=>{let allLines=stdout.toString().split(`\r
|
|
@@ -3437,9 +3446,9 @@ Interface `);return parts.shift(),parts.forEach((ifaceDetails)=>{let lines=iface
|
|
|
3437
3446
|
`).split(`:\r
|
|
3438
3447
|
\r
|
|
3439
3448
|
`);if(parts.shift(),parts.forEach((part)=>{let lines=part.split(`\r
|
|
3440
|
-
`);if(lines.length>=5){let iface=lines[0].indexOf(":")>=0?lines[0].split(":")[1].trim():"",model=lines[1].indexOf(":")>=0?lines[1].split(":")[1].trim():"",id=lines[2].indexOf(":")>=0?lines[2].split(":")[1].trim():"",macParts=lines[3].indexOf(":")>=0?lines[3].split(":"):[];macParts.shift();let mac=macParts.join(":").trim(),vendor=getVendor(model);if(iface&&model&&id&&mac)result2.push({id,iface,model,vendor,mac})}}),callback)callback(result2);resolve14(result2)});else{if(callback)callback(result2);resolve14(result2)}})})}exports.wifiInterfaces=wifiInterfaces});var require_processes=__commonJS((exports)=>{var os4=__require("os"),fs3=__require("fs"),path6=__require("path"),exec3=__require("child_process").exec,
|
|
3441
|
-
`);srvs=[];for(let s3 of tmpsrv){let name=s3.split(".service")[0];if(name&&s3.indexOf(" not-found ")===-1)srvs.push(name.trim())}srvString=srvs.join("|")}catch(d2){try{srvString="";let tmpsrv=
|
|
3442
|
-
`);for(let s3 of tmpsrv){let parts=s3.split("]");if(parts.length===2)srvString+=(srvString!==""?"|":"")+parts[1].trim()}srvs=srvString.split("|")}catch(e){try{let srvStr=
|
|
3449
|
+
`);if(lines.length>=5){let iface=lines[0].indexOf(":")>=0?lines[0].split(":")[1].trim():"",model=lines[1].indexOf(":")>=0?lines[1].split(":")[1].trim():"",id=lines[2].indexOf(":")>=0?lines[2].split(":")[1].trim():"",macParts=lines[3].indexOf(":")>=0?lines[3].split(":"):[];macParts.shift();let mac=macParts.join(":").trim(),vendor=getVendor(model);if(iface&&model&&id&&mac)result2.push({id,iface,model,vendor,mac})}}),callback)callback(result2);resolve14(result2)});else{if(callback)callback(result2);resolve14(result2)}})})}exports.wifiInterfaces=wifiInterfaces});var require_processes=__commonJS((exports)=>{var os4=__require("os"),fs3=__require("fs"),path6=__require("path"),exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,util4=require_util3(),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos",_processes_cpu={all:0,all_utime:0,all_stime:0,list:{},ms:0,result:{}},_services_cpu={all:0,all_utime:0,all_stime:0,list:{},ms:0,result:{}},_process_cpu={all:0,all_utime:0,all_stime:0,list:{},ms:0,result:{}},_winStatusValues={0:"unknown",1:"other",2:"ready",3:"running",4:"blocked",5:"suspended blocked",6:"suspended ready",7:"terminated",8:"stopped",9:"growing"};function parseTimeUnix(time){let result2=time,parts=time.replace(/ +/g," ").split(" ");if(parts.length===5)result2=parts[4]+"-"+("0"+("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC".indexOf(parts[1].toUpperCase())/3+1)).slice(-2)+"-"+("0"+parts[2]).slice(-2)+" "+parts[3];return result2}function parseElapsedTime(etime){let current=new Date;current=new Date(current.getTime()-current.getTimezoneOffset()*60000);let elapsed=etime.split("-"),timeIndex=elapsed.length-1,days=timeIndex>0?parseInt(elapsed[timeIndex-1]):0,timeStr=elapsed[timeIndex].split(":"),hours=timeStr.length===3?parseInt(timeStr[0]||0):0,mins=parseInt(timeStr[timeStr.length===3?1:0]||0),secs=parseInt(timeStr[timeStr.length===3?2:1]||0),ms=(((days*24+hours)*60+mins)*60+secs)*1000,res=new Date(current.getTime()),result2=res.toISOString().substring(0,10)+" "+res.toISOString().substring(11,19);try{res=new Date(current.getTime()-ms),result2=res.toISOString().substring(0,10)+" "+res.toISOString().substring(11,19)}catch(e){util4.noop()}return result2}function services(srv,callback){if(util4.isFunction(srv)&&!callback)callback=srv,srv="";return new Promise((resolve14)=>{process.nextTick(()=>{if(typeof srv!=="string"){if(callback)callback([]);return resolve14([])}if(srv){let srvString="";try{srvString.__proto__.toLowerCase=util4.stringToLower,srvString.__proto__.replace=util4.stringReplace,srvString.__proto__.toString=util4.stringToString,srvString.__proto__.substr=util4.stringSubstr,srvString.__proto__.substring=util4.stringSubstring,srvString.__proto__.trim=util4.stringTrim,srvString.__proto__.startsWith=util4.stringStartWith}catch(e){Object.setPrototypeOf(srvString,util4.stringObj)}let s2=util4.sanitizeShellString(srv),l=util4.mathMin(s2.length,2000);for(let i2=0;i2<=l;i2++)if(s2[i2]!==void 0)srvString=srvString+s2[i2];if(srvString=srvString.trim().toLowerCase().replace(/, /g,"|").replace(/,+/g,"|"),srvString==="")srvString="*";if(util4.isPrototypePolluted()&&srvString!=="*")srvString="------";let srvs=srvString.split("|"),result2=[],dataSrv=[];if(_linux||_freebsd||_openbsd||_netbsd||_darwin){if((_linux||_freebsd||_openbsd||_netbsd)&&srvString==="*")try{let tmpsrv=execSync18("systemctl --all --type=service --no-legend 2> /dev/null",util4.execOptsLinux).toString().split(`
|
|
3450
|
+
`);srvs=[];for(let s3 of tmpsrv){let name=s3.split(".service")[0];if(name&&s3.indexOf(" not-found ")===-1)srvs.push(name.trim())}srvString=srvs.join("|")}catch(d2){try{srvString="";let tmpsrv=execSync18("service --status-all 2> /dev/null",util4.execOptsLinux).toString().split(`
|
|
3451
|
+
`);for(let s3 of tmpsrv){let parts=s3.split("]");if(parts.length===2)srvString+=(srvString!==""?"|":"")+parts[1].trim()}srvs=srvString.split("|")}catch(e){try{let srvStr=execSync18("ls /etc/init.d/ -m 2> /dev/null",util4.execOptsLinux).toString().split(`
|
|
3443
3452
|
`).join("");if(srvString="",srvStr){let tmpsrv=srvStr.split(",");for(let s3 of tmpsrv){let name=s3.trim();if(name)srvString+=(srvString!==""?"|":"")+name}srvs=srvString.split("|")}}catch(f){srvString="",srvs=[]}}}if(_darwin&&srvString==="*"){if(callback)callback(result2);resolve14(result2)}let args=_darwin?["-caxo","pcpu,pmem,pid,command"]:["-axo","pcpu,pmem,pid,command"];if(srvString!==""&&srvs.length>0)util4.execSafe("ps",args).then((stdout)=>{if(stdout){let lines=stdout.replace(/ +/g," ").replace(/,+/g,".").split(`
|
|
3444
3453
|
`);if(srvs.forEach(function(srv2){let ps;if(_darwin)ps=lines.filter(function(e){return e.toLowerCase().indexOf(srv2)!==-1});else ps=lines.filter(function(e){return e.toLowerCase().indexOf(" "+srv2.toLowerCase()+":")!==-1||e.toLowerCase().indexOf("("+srv2.toLowerCase()+" ")!==-1||e.toLowerCase().indexOf("("+srv2.toLowerCase()+")")!==-1||e.toLowerCase().indexOf(" "+srv2.toLowerCase().replace(/[0-9.]/g,"")+":")!==-1||e.toLowerCase().indexOf("/"+srv2.toLowerCase())!==-1});let pids=[];for(let p of ps){let pid=p.trim().split(" ")[2];if(pid)pids.push(parseInt(pid,10))}result2.push({name:srv2,running:ps.length>0,startmode:"",pids,cpu:parseFloat(ps.reduce(function(pv,cv){return pv+parseFloat(cv.trim().split(" ")[0])},0).toFixed(2)),mem:parseFloat(ps.reduce(function(pv,cv){return pv+parseFloat(cv.trim().split(" ")[1])},0).toFixed(2))})}),_linux){let cmd='cat /proc/stat | grep "cpu "';for(let i2 in result2)for(let j2 in result2[i2].pids)cmd+=";cat /proc/"+result2[i2].pids[j2]+"/stat";exec3(cmd,{maxBuffer:104857600},function(error2,stdout2){let curr_processes=stdout2.toString().split(`
|
|
3445
3454
|
`),all=parseProcStat(curr_processes.shift()),list_new={},resultProcess={};if(curr_processes.forEach((element)=>{if(resultProcess=calcProcStatLinux(element,all,_services_cpu),resultProcess.pid){let listPos=-1;for(let i2 in result2)for(let j2 in result2[i2].pids)if(parseInt(result2[i2].pids[j2])===parseInt(resultProcess.pid))listPos=i2;if(listPos>=0)result2[listPos].cpu+=resultProcess.cpuu+resultProcess.cpus;list_new[resultProcess.pid]={cpuu:resultProcess.cpuu,cpus:resultProcess.cpus,utime:resultProcess.utime,stime:resultProcess.stime,cutime:resultProcess.cutime,cstime:resultProcess.cstime}}}),_services_cpu.all=all,_services_cpu.list=Object.assign({},list_new),_services_cpu.ms=Date.now()-_services_cpu.ms,_services_cpu.result=Object.assign({},result2),callback)callback(result2);resolve14(result2)})}else{if(callback)callback(result2);resolve14(result2)}}else args=["-o","comm"],util4.execSafe("ps",args).then((stdout2)=>{if(stdout2){let lines=stdout2.replace(/ +/g," ").replace(/,+/g,".").split(`
|
|
@@ -3509,16 +3518,16 @@ printer `);for(let i2=1;i2<parts.length;i2++){let printers=parseLinuxLpstatPrint
|
|
|
3509
3518
|
`+stdout.toString()).split(`
|
|
3510
3519
|
|
|
3511
3520
|
Bus `);for(let i2=1;i2<parts.length;i2++){let usb2=parseLinuxUsb(parts[i2]);result2.push(usb2)}}if(callback)callback(result2);resolve14(result2)});if(_darwin)exec3("ioreg -p IOUSB -c AppleUSBRootHubDevice -w0 -l",{maxBuffer:134217728},function(error2,stdout){if(!error2){let parts=stdout.toString().split(" +-o ");for(let i2=1;i2<parts.length;i2++){let usb2=parseDarwinUsb(parts[i2]);if(usb2)result2.push(usb2)}if(callback)callback(result2);resolve14(result2)}if(callback)callback(result2);resolve14(result2)});if(_windows)util4.powerShell('Get-CimInstance CIM_LogicalDevice | where { $_.Description -match "USB"} | select Name,CreationClassName,DeviceId,Manufacturer | fl').then((stdout,error2)=>{if(!error2){let parts=stdout.toString().split(/\n\s*\n/);for(let i2=0;i2<parts.length;i2++){let usb2=parseWindowsUsb(parts[i2].split(`
|
|
3512
|
-
`),i2);if(usb2&&result2.filter((x2)=>x2.deviceId===usb2.deviceId).length===0)result2.push(usb2)}}if(callback)callback(result2);resolve14(result2)});if(_sunos||_freebsd||_openbsd||_netbsd)resolve14(null)})})}exports.usb=usb});var require_audio=__commonJS((exports)=>{var exec3=__require("child_process").exec,
|
|
3521
|
+
`),i2);if(usb2&&result2.filter((x2)=>x2.deviceId===usb2.deviceId).length===0)result2.push(usb2)}}if(callback)callback(result2);resolve14(result2)});if(_sunos||_freebsd||_openbsd||_netbsd)resolve14(null)})})}exports.usb=usb});var require_audio=__commonJS((exports)=>{var exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,util4=require_util3(),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";function parseAudioType(str5,input,output){str5=str5.toLowerCase();let result2="";if(str5.indexOf("input")>=0)result2="Microphone";if(str5.indexOf("display audio")>=0)result2="Speaker";if(str5.indexOf("speak")>=0)result2="Speaker";if(str5.indexOf("laut")>=0)result2="Speaker";if(str5.indexOf("loud")>=0)result2="Speaker";if(str5.indexOf("head")>=0)result2="Headset";if(str5.indexOf("mic")>=0)result2="Microphone";if(str5.indexOf("mikr")>=0)result2="Microphone";if(str5.indexOf("phone")>=0)result2="Phone";if(str5.indexOf("controll")>=0)result2="Controller";if(str5.indexOf("line o")>=0)result2="Line Out";if(str5.indexOf("digital o")>=0)result2="Digital Out";if(str5.indexOf("smart sound technology")>=0)result2="Digital Signal Processor";if(str5.indexOf("high definition audio")>=0)result2="Sound Driver";if(!result2&&output)result2="Speaker";else if(!result2&&input)result2="Microphone";return result2}function getLinuxAudioPci(){let result2=[];try{return execSync18("lspci -v 2>/dev/null",util4.execOptsLinux).toString().split(`
|
|
3513
3522
|
|
|
3514
3523
|
`).forEach((element)=>{let lines=element.split(`
|
|
3515
3524
|
`);if(lines&&lines.length&&lines[0].toLowerCase().indexOf("audio")>=0){let audio2={};audio2.slotId=lines[0].split(" ")[0],audio2.driver=util4.getValue(lines,"Kernel driver in use",":",!0)||util4.getValue(lines,"Kernel modules",":",!0),result2.push(audio2)}}),result2}catch{return result2}}function parseWinAudioStatus(n){let status=n;if(n===1)status="other";else if(n===2)status="unknown";else if(n===3)status="enabled";else if(n===4)status="disabled";else if(n===5)status="not applicable";return status}function parseLinuxAudioPciMM(lines,audioPCI){let result2={},slotId=util4.getValue(lines,"Slot"),pciMatch=audioPCI.filter((item)=>item.slotId===slotId);return result2.id=slotId,result2.name=util4.getValue(lines,"SDevice"),result2.manufacturer=util4.getValue(lines,"SVendor"),result2.revision=util4.getValue(lines,"Rev"),result2.driver=pciMatch&&pciMatch.length===1&&pciMatch[0].driver?pciMatch[0].driver:"",result2.default=null,result2.channel="PCIe",result2.type=parseAudioType(result2.name,null,null),result2.in=null,result2.out=null,result2.status="online",result2}function parseDarwinChannel(str5){let result2="";if(str5.indexOf("builtin")>=0)result2="Built-In";if(str5.indexOf("extern")>=0)result2="Audio-Jack";if(str5.indexOf("hdmi")>=0)result2="HDMI";if(str5.indexOf("displayport")>=0)result2="Display-Port";if(str5.indexOf("usb")>=0)result2="USB";if(str5.indexOf("pci")>=0)result2="PCIe";return result2}function parseDarwinAudio(audioObject,id){let result2={},channelStr=((audioObject.coreaudio_device_transport||"")+" "+(audioObject._name||"")).toLowerCase();return result2.id=id,result2.name=audioObject._name,result2.manufacturer=audioObject.coreaudio_device_manufacturer,result2.revision=null,result2.driver=null,result2.default=!!audioObject.coreaudio_default_audio_input_device||!!audioObject.coreaudio_default_audio_output_device,result2.channel=parseDarwinChannel(channelStr),result2.type=parseAudioType(result2.name,!!audioObject.coreaudio_device_input,!!audioObject.coreaudio_device_output),result2.in=!!audioObject.coreaudio_device_input,result2.out=!!audioObject.coreaudio_device_output,result2.status="online",result2}function parseWindowsAudio(lines){let result2={},status=parseWinAudioStatus(util4.getValue(lines,"StatusInfo",":"));return result2.id=util4.getValue(lines,"DeviceID",":"),result2.name=util4.getValue(lines,"name",":"),result2.manufacturer=util4.getValue(lines,"manufacturer",":"),result2.revision=null,result2.driver=null,result2.default=null,result2.channel=null,result2.type=parseAudioType(result2.name,null,null),result2.in=null,result2.out=null,result2.status=status,result2}function audio(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=[];if(_linux||_freebsd||_openbsd||_netbsd)exec3("lspci -vmm 2>/dev/null",(error2,stdout)=>{if(!error2){let audioPCI=getLinuxAudioPci();stdout.toString().split(`
|
|
3516
3525
|
|
|
3517
3526
|
`).forEach((element)=>{let lines=element.split(`
|
|
3518
3527
|
`);if(util4.getValue(lines,"class",":",!0).toLowerCase().indexOf("audio")>=0){let audio2=parseLinuxAudioPciMM(lines,audioPCI);result2.push(audio2)}})}if(callback)callback(result2);resolve14(result2)});if(_darwin)exec3("system_profiler SPAudioDataType -json",(error2,stdout)=>{if(!error2)try{let outObj=JSON.parse(stdout.toString());if(outObj.SPAudioDataType&&outObj.SPAudioDataType.length&&outObj.SPAudioDataType[0]&&outObj.SPAudioDataType[0]._items&&outObj.SPAudioDataType[0]._items.length)for(let i2=0;i2<outObj.SPAudioDataType[0]._items.length;i2++){let audio2=parseDarwinAudio(outObj.SPAudioDataType[0]._items[i2],i2);result2.push(audio2)}}catch{util4.noop()}if(callback)callback(result2);resolve14(result2)});if(_windows)util4.powerShell("Get-CimInstance Win32_SoundDevice | select DeviceID,StatusInfo,Name,Manufacturer | fl").then((stdout,error2)=>{if(!error2)stdout.toString().split(/\n\s*\n/).forEach((element)=>{let lines=element.split(`
|
|
3519
|
-
`);if(util4.getValue(lines,"name",":"))result2.push(parseWindowsAudio(lines))});if(callback)callback(result2);resolve14(result2)});if(_sunos)resolve14(null)})})}exports.audio=audio});var require_bluetoothVendors=__commonJS((exports,module2)=>{module2.exports={0:"Ericsson Technology Licensing",1:"Nokia Mobile Phones",2:"Intel Corp.",3:"IBM Corp.",4:"Toshiba Corp.",5:"3Com",6:"Microsoft",7:"Lucent",8:"Motorola",9:"Infineon Technologies AG",10:"Cambridge Silicon Radio",11:"Silicon Wave",12:"Digianswer A/S",13:"Texas Instruments Inc.",14:"Ceva, Inc. (formerly Parthus Technologies, Inc.)",15:"Broadcom Corporation",16:"Mitel Semiconductor",17:"Widcomm, Inc",18:"Zeevo, Inc.",19:"Atmel Corporation",20:"Mitsubishi Electric Corporation",21:"RTX Telecom A/S",22:"KC Technology Inc.",23:"NewLogic",24:"Transilica, Inc.",25:"Rohde & Schwarz GmbH & Co. KG",26:"TTPCom Limited",27:"Signia Technologies, Inc.",28:"Conexant Systems Inc.",29:"Qualcomm",30:"Inventel",31:"AVM Berlin",32:"BandSpeed, Inc.",33:"Mansella Ltd",34:"NEC Corporation",35:"WavePlus Technology Co., Ltd.",36:"Alcatel",37:"NXP Semiconductors (formerly Philips Semiconductors)",38:"C Technologies",39:"Open Interface",40:"R F Micro Devices",41:"Hitachi Ltd",42:"Symbol Technologies, Inc.",43:"Tenovis",44:"Macronix International Co. Ltd.",45:"GCT Semiconductor",46:"Norwood Systems",47:"MewTel Technology Inc.",48:"ST Microelectronics",49:"Synopsis",50:"Red-M (Communications) Ltd",51:"Commil Ltd",52:"Computer Access Technology Corporation (CATC)",53:"Eclipse (HQ Espana) S.L.",54:"Renesas Electronics Corporation",55:"Mobilian Corporation",56:"Terax",57:"Integrated System Solution Corp.",58:"Matsushita Electric Industrial Co., Ltd.",59:"Gennum Corporation",60:"BlackBerry Limited (formerly Research In Motion)",61:"IPextreme, Inc.",62:"Systems and Chips, Inc.",63:"Bluetooth SIG, Inc.",64:"Seiko Epson Corporation",65:"Integrated Silicon Solution Taiwan, Inc.",66:"CONWISE Technology Corporation Ltd",67:"PARROT SA",68:"Socket Mobile",69:"Atheros Communications, Inc.",70:"MediaTek, Inc.",71:"Bluegiga",72:"Marvell Technology Group Ltd.",73:"3DSP Corporation",74:"Accel Semiconductor Ltd.",75:"Continental Automotive Systems",76:"Apple, Inc.",77:"Staccato Communications, Inc.",78:"Avago Technologies",79:"APT Licensing Ltd.",80:"SiRF Technology",81:"Tzero Technologies, Inc.",82:"J&M Corporation",83:"Free2move AB",84:"3DiJoy Corporation",85:"Plantronics, Inc.",86:"Sony Ericsson Mobile Communications",87:"Harman International Industries, Inc.",88:"Vizio, Inc.",89:"Nordic Semiconductor ASA",90:"EM Microelectronic-Marin SA",91:"Ralink Technology Corporation",92:"Belkin International, Inc.",93:"Realtek Semiconductor Corporation",94:"Stonestreet One, LLC",95:"Wicentric, Inc.",96:"RivieraWaves S.A.S",97:"RDA Microelectronics",98:"Gibson Guitars",99:"MiCommand Inc.",100:"Band XI International, LLC",101:"Hewlett-Packard Company",102:"9Solutions Oy",103:"GN Netcom A/S",104:"General Motors",105:"A&D Engineering, Inc.",106:"MindTree Ltd.",107:"Polar Electro OY",108:"Beautiful Enterprise Co., Ltd.",109:"BriarTek, Inc.",110:"Summit Data Communications, Inc.",111:"Sound ID",112:"Monster, LLC",113:"connectBlue AB",114:"ShangHai Super Smart Electronics Co. Ltd.",115:"Group Sense Ltd.",116:"Zomm, LLC",117:"Samsung Electronics Co. Ltd.",118:"Creative Technology Ltd.",119:"Laird Technologies",120:"Nike, Inc.",121:"lesswire AG",122:"MStar Semiconductor, Inc.",123:"Hanlynn Technologies",124:"A & R Cambridge",125:"Seers Technology Co. Ltd",126:"Sports Tracking Technologies Ltd.",127:"Autonet Mobile",128:"DeLorme Publishing Company, Inc.",129:"WuXi Vimicro",130:"Sennheiser Communications A/S",131:"TimeKeeping Systems, Inc.",132:"Ludus Helsinki Ltd.",133:"BlueRadios, Inc.",134:"equinox AG",135:"Garmin International, Inc.",136:"Ecotest",137:"GN ReSound A/S",138:"Jawbone",139:"Topcorn Positioning Systems, LLC",140:"Gimbal Inc. (formerly Qualcomm Labs, Inc. and Qualcomm Retail Solutions, Inc.)",141:"Zscan Software",142:"Quintic Corp.",143:"Stollman E+V GmbH",144:"Funai Electric Co., Ltd.",145:"Advanced PANMOBIL Systems GmbH & Co. KG",146:"ThinkOptics, Inc.",147:"Universal Electronics, Inc.",148:"Airoha Technology Corp.",149:"NEC Lighting, Ltd.",150:"ODM Technology, Inc.",151:"ConnecteDevice Ltd.",152:"zer01.tv GmbH",153:"i.Tech Dynamic Global Distribution Ltd.",154:"Alpwise",155:"Jiangsu Toppower Automotive Electronics Co., Ltd.",156:"Colorfy, Inc.",157:"Geoforce Inc.",158:"Bose Corporation",159:"Suunto Oy",160:"Kensington Computer Products Group",161:"SR-Medizinelektronik",162:"Vertu Corporation Limited",163:"Meta Watch Ltd.",164:"LINAK A/S",165:"OTL Dynamics LLC",166:"Panda Ocean Inc.",167:"Visteon Corporation",168:"ARP Devices Limited",169:"Magneti Marelli S.p.A",170:"CAEN RFID srl",171:"Ingenieur-Systemgruppe Zahn GmbH",172:"Green Throttle Games",173:"Peter Systemtechnik GmbH",174:"Omegawave Oy",175:"Cinetix",176:"Passif Semiconductor Corp",177:"Saris Cycling Group, Inc",178:"Bekey A/S",179:"Clarinox Technologies Pty. Ltd.",180:"BDE Technology Co., Ltd.",181:"Swirl Networks",182:"Meso international",183:"TreLab Ltd",184:"Qualcomm Innovation Center, Inc. (QuIC)",185:"Johnson Controls, Inc.",186:"Starkey Laboratories Inc.",187:"S-Power Electronics Limited",188:"Ace Sensor Inc",189:"Aplix Corporation",190:"AAMP of America",191:"Stalmart Technology Limited",192:"AMICCOM Electronics Corporation",193:"Shenzhen Excelsecu Data Technology Co.,Ltd",194:"Geneq Inc.",195:"adidas AG",196:"LG Electronics",197:"Onset Computer Corporation",198:"Selfly BV",199:"Quuppa Oy.",200:"GeLo Inc",201:"Evluma",202:"MC10",203:"Binauric SE",204:"Beats Electronics",205:"Microchip Technology Inc.",206:"Elgato Systems GmbH",207:"ARCHOS SA",208:"Dexcom, Inc.",209:"Polar Electro Europe B.V.",210:"Dialog Semiconductor B.V.",211:"Taixingbang\xA0Technology (HK) Co,. LTD.",212:"Kawantech",213:"Austco Communication Systems",214:"Timex Group USA, Inc.",215:"Qualcomm Technologies, Inc.",216:"Qualcomm Connected Experiences, Inc.",217:"Voyetra Turtle Beach",218:"txtr GmbH",219:"Biosentronics",220:"Procter & Gamble",221:"Hosiden Corporation",222:"Muzik LLC",223:"Misfit Wearables Corp",224:"Google",225:"Danlers Ltd",226:"Semilink Inc",227:"inMusic Brands, Inc",228:"L.S. Research Inc.",229:"Eden Software Consultants Ltd.",230:"Freshtemp",231:"KS Technologies",232:"ACTS Technologies",233:"Vtrack Systems",234:"Nielsen-Kellerman Company",235:"Server Technology, Inc.",236:"BioResearch Associates",237:"Jolly Logic, LLC",238:"Above Average Outcomes, Inc.",239:"Bitsplitters GmbH",240:"PayPal, Inc.",241:"Witron Technology Limited",242:"Aether Things\xA0Inc. (formerly Morse Project Inc.)",243:"Kent Displays Inc.",244:"Nautilus Inc.",245:"Smartifier Oy",246:"Elcometer Limited",247:"VSN Technologies Inc.",248:"AceUni Corp., Ltd.",249:"StickNFind",250:"Crystal Code AB",251:"KOUKAAM a.s.",252:"Delphi Corporation",253:"ValenceTech Limited",254:"Reserved",255:"Typo Products, LLC",256:"TomTom International BV",257:"Fugoo, Inc",258:"Keiser Corporation",259:"Bang & Olufsen A/S",260:"PLUS Locations Systems Pty Ltd",261:"Ubiquitous Computing Technology Corporation",262:"Innovative Yachtter Solutions",263:"William Demant Holding A/S",264:"Chicony Electronics Co., Ltd.",265:"Atus BV",266:"Codegate Ltd.",267:"ERi, Inc.",268:"Transducers Direct, LLC",269:"Fujitsu Ten Limited",270:"Audi AG",271:"HiSilicon Technologies Co., Ltd.",272:"Nippon Seiki Co., Ltd.",273:"Steelseries ApS",274:"vyzybl Inc.",275:"Openbrain Technologies, Co., Ltd.",276:"Xensr",277:"e.solutions",278:"1OAK Technologies",279:"Wimoto Technologies Inc",280:"Radius Networks, Inc.",281:"Wize Technology Co., Ltd.",282:"Qualcomm Labs, Inc.",283:"Aruba Networks",284:"Baidu",285:"Arendi AG",286:"Skoda Auto a.s.",287:"Volkswagon AG",288:"Porsche AG",289:"Sino Wealth Electronic Ltd.",290:"AirTurn, Inc.",291:"Kinsa, Inc.",292:"HID Global",293:"SEAT es",294:"Promethean Ltd.",295:"Salutica Allied Solutions",296:"GPSI Group Pty Ltd",297:"Nimble Devices Oy",298:"Changzhou Yongse Infotech Co., Ltd",299:"SportIQ",300:"TEMEC Instruments B.V.",301:"Sony Corporation",302:"ASSA ABLOY",303:"Clarion Co., Ltd.",304:"Warehouse Innovations",305:"Cypress Semiconductor Corporation",306:"MADS Inc",307:"Blue Maestro Limited",308:"Resolution Products, Inc.",309:"Airewear LLC",310:"Seed Labs, Inc. (formerly ETC sp. z.o.o.)",311:"Prestigio Plaza Ltd.",312:"NTEO Inc.",313:"Focus Systems Corporation",314:"Tencent Holdings Limited",315:"Allegion",316:"Murata Manufacuring Co., Ltd.",318:"Nod, Inc.",319:"B&B Manufacturing Company",320:"Alpine\xA0Electronics\xA0(China)\xA0Co.,\xA0Ltd",321:"FedEx Services",322:"Grape Systems Inc.",323:"Bkon Connect",324:"Lintech GmbH",325:"Novatel Wireless",326:"Ciright",327:"Mighty Cast, Inc.",328:"Ambimat Electronics",329:"Perytons Ltd.",330:"Tivoli Audio, LLC",331:"Master Lock",332:"Mesh-Net Ltd",333:"Huizhou Desay SV Automotive CO., LTD.",334:"Tangerine, Inc.",335:"B&W Group Ltd.",336:"Pioneer Corporation",337:"OnBeep",338:"Vernier Software & Technology",339:"ROL Ergo",340:"Pebble Technology",341:"NETATMO",342:"Accumulate AB",343:"Anhui Huami Information Technology Co., Ltd.",344:"Inmite s.r.o.",345:"ChefSteps, Inc.",346:"micas AG",347:"Biomedical Research Ltd.",348:"Pitius Tec S.L.",349:"Estimote, Inc.",350:"Unikey Technologies, Inc.",351:"Timer Cap Co.",352:"AwoX",353:"yikes",354:"MADSGlobal NZ Ltd.",355:"PCH International",356:"Qingdao Yeelink Information Technology Co., Ltd.",357:"Milwaukee Tool (formerly Milwaukee Electric Tools)",358:"MISHIK Pte Ltd",359:"Bayer HealthCare",360:"Spicebox LLC",361:"emberlight",362:"Cooper-Atkins Corporation",363:"Qblinks",364:"MYSPHERA",365:"LifeScan Inc",366:"Volantic AB",367:"Podo Labs, Inc",368:"Roche Diabetes Care AG",369:"Amazon Fulfillment Service",370:"Connovate Technology Private Limited",371:"Kocomojo, LLC",372:"Everykey LLC",373:"Dynamic Controls",374:"SentriLock",375:"I-SYST inc.",376:"CASIO COMPUTER CO., LTD.",377:"LAPIS Semiconductor Co., Ltd.",378:"Telemonitor, Inc.",379:"taskit GmbH",380:"Daimler AG",381:"BatAndCat",382:"BluDotz Ltd",383:"XTel ApS",384:"Gigaset Communications GmbH",385:"Gecko Health Innovations, Inc.",386:"HOP Ubiquitous",387:"To Be Assigned",388:"Nectar",389:"bel\u2019apps LLC",390:"CORE Lighting Ltd",391:"Seraphim Sense Ltd",392:"Unico RBC",393:"Physical Enterprises Inc.",394:"Able Trend Technology Limited",395:"Konica Minolta, Inc.",396:"Wilo SE",397:"Extron Design Services",398:"Fitbit, Inc.",399:"Fireflies Systems",400:"Intelletto Technologies Inc.",401:"FDK CORPORATION",402:"Cloudleaf, Inc",403:"Maveric Automation LLC",404:"Acoustic Stream Corporation",405:"Zuli",406:"Paxton Access Ltd",407:"WiSilica Inc",408:"Vengit Limited",409:"SALTO SYSTEMS S.L.",410:"TRON Forum (formerly T-Engine Forum)",411:"CUBETECH s.r.o.",412:"Cokiya Incorporated",413:"CVS Health",414:"Ceruus",415:"Strainstall Ltd",416:"Channel Enterprises (HK) Ltd.",417:"FIAMM",418:"GIGALANE.CO.,LTD",419:"EROAD",420:"Mine Safety Appliances",421:"Icon Health and Fitness",422:"Asandoo GmbH",423:"ENERGOUS CORPORATION",424:"Taobao",425:"Canon Inc.",426:"Geophysical Technology Inc.",427:"Facebook, Inc.",428:"Nipro Diagnostics, Inc.",429:"FlightSafety International",430:"Earlens Corporation",431:"Sunrise Micro Devices, Inc.",432:"Star Micronics Co., Ltd.",433:"Netizens Sp. z o.o.",434:"Nymi Inc.",435:"Nytec, Inc.",436:"Trineo Sp. z o.o.",437:"Nest Labs Inc.",438:"LM Technologies Ltd",439:"General Electric Company",440:"i+D3 S.L.",441:"HANA Micron",442:"Stages Cycling LLC",443:"Cochlear Bone Anchored Solutions AB",444:"SenionLab AB",445:"Syszone Co., Ltd",446:"Pulsate Mobile Ltd.",447:"Hong Kong HunterSun Electronic Limited",448:"pironex GmbH",449:"BRADATECH Corp.",450:"Transenergooil AG",451:"Bunch",452:"DME Microelectronics",453:"Bitcraze AB",454:"HASWARE Inc.",455:"Abiogenix Inc.",456:"Poly-Control ApS",457:"Avi-on",458:"Laerdal Medical AS",459:"Fetch My Pet",460:"Sam Labs Ltd.",461:"Chengdu Synwing Technology Ltd",462:"HOUWA SYSTEM DESIGN, k.k.",463:"BSH",464:"Primus Inter Pares Ltd",465:"August",466:"Gill Electronics",467:"Sky Wave Design",468:"Newlab S.r.l.",469:"ELAD srl",470:"G-wearables inc.",471:"Squadrone Systems Inc.",472:"Code Corporation",473:"Savant Systems LLC",474:"Logitech International SA",475:"Innblue Consulting",476:"iParking Ltd.",477:"Koninklijke Philips Electronics N.V.",478:"Minelab Electronics Pty Limited",479:"Bison Group Ltd.",480:"Widex A/S",481:"Jolla Ltd",482:"Lectronix, Inc.",483:"Caterpillar Inc",484:"Freedom Innovations",485:"Dynamic Devices Ltd",486:"Technology Solutions (UK) Ltd",487:"IPS Group Inc.",488:"STIR",489:"Sano, Inc",490:"Advanced Application Design, Inc.",491:"AutoMap LLC",492:"Spreadtrum Communications Shanghai Ltd",493:"CuteCircuit LTD",494:"Valeo Service",495:"Fullpower Technologies, Inc.",496:"KloudNation",497:"Zebra Technologies Corporation",498:"Itron, Inc.",499:"The University of Tokyo",500:"UTC Fire and Security",501:"Cool Webthings Limited",502:"DJO Global",503:"Gelliner Limited",504:"Anyka (Guangzhou) Microelectronics Technology Co, LTD",505:"Medtronic, Inc.",506:"Gozio, Inc.",507:"Form Lifting, LLC",508:"Wahoo Fitness, LLC",509:"Kontakt Micro-Location Sp. z o.o.",510:"Radio System Corporation",511:"Freescale Semiconductor, Inc.",512:"Verifone Systems PTe Ltd. Taiwan Branch",513:"AR Timing",514:"Rigado LLC",515:"Kemppi Oy",516:"Tapcentive Inc.",517:"Smartbotics Inc.",518:"Otter Products, LLC",519:"STEMP Inc.",520:"LumiGeek LLC",521:"InvisionHeart Inc.",522:"Macnica Inc. ",523:"Jaguar Land Rover Limited",524:"CoroWare Technologies, Inc",525:"Simplo Technology Co., LTD",526:"Omron Healthcare Co., LTD",527:"Comodule GMBH",528:"ikeGPS",529:"Telink Semiconductor Co. Ltd",530:"Interplan Co., Ltd",531:"Wyler AG",532:"IK Multimedia Production srl",533:"Lukoton Experience Oy",534:"MTI Ltd",535:"Tech4home, Lda",536:"Hiotech AB",537:"DOTT Limited",538:"Blue Speck Labs, LLC",539:"Cisco Systems, Inc",540:"Mobicomm Inc",541:"Edamic",542:"Goodnet, Ltd",543:"Luster Leaf Products Inc",544:"Manus Machina BV",545:"Mobiquity Networks Inc",546:"Praxis Dynamics",547:"Philip Morris Products S.A.",548:"Comarch SA",549:"Nestl Nespresso S.A.",550:"Merlinia A/S",551:"LifeBEAM Technologies",552:"Twocanoes Labs, LLC",553:"Muoverti Limited",554:"Stamer Musikanlagen GMBH",555:"Tesla Motors",556:"Pharynks Corporation",557:"Lupine",558:"Siemens AG",559:"Huami (Shanghai) Culture Communication CO., LTD",560:"Foster Electric Company, Ltd",561:"ETA SA",562:"x-Senso Solutions Kft",563:"Shenzhen SuLong Communication Ltd",564:"FengFan (BeiJing) Technology Co, Ltd",565:"Qrio Inc",566:"Pitpatpet Ltd",567:"MSHeli s.r.l.",568:"Trakm8 Ltd",569:"JIN CO, Ltd",570:"Alatech Tehnology",571:"Beijing CarePulse Electronic Technology Co, Ltd",572:"Awarepoint",573:"ViCentra B.V.",574:"Raven Industries",575:"WaveWare Technologies Inc.",576:"Argenox Technologies",577:"Bragi GmbH",578:"16Lab Inc",579:"Masimo Corp",580:"Iotera Inc",581:"Endress+Hauser",582:"ACKme Networks, Inc.",583:"FiftyThree Inc.",584:"Parker Hannifin Corp",585:"Transcranial Ltd",586:"Uwatec AG",587:"Orlan LLC",588:"Blue Clover Devices",589:"M-Way Solutions GmbH",590:"Microtronics Engineering GmbH",591:"Schneider Schreibgerte GmbH",592:"Sapphire Circuits LLC",593:"Lumo Bodytech Inc.",594:"UKC Technosolution",595:"Xicato Inc.",596:"Playbrush",597:"Dai Nippon Printing Co., Ltd.",598:"G24 Power Limited",599:"AdBabble Local Commerce Inc.",600:"Devialet SA",601:"ALTYOR",602:"University of Applied Sciences Valais/Haute Ecole Valaisanne",603:"Five Interactive, LLC dba Zendo",604:"NetEaseHangzhouNetwork co.Ltd.",605:"Lexmark International Inc.",606:"Fluke Corporation",607:"Yardarm Technologies",608:"SensaRx",609:"SECVRE GmbH",610:"Glacial Ridge Technologies",611:"Identiv, Inc.",612:"DDS, Inc.",613:"SMK Corporation",614:"Schawbel Technologies LLC",615:"XMI Systems SA",616:"Cerevo",617:"Torrox GmbH & Co KG",618:"Gemalto",619:"DEKA Research & Development Corp.",620:"Domster Tadeusz Szydlowski",621:"Technogym SPA",622:"FLEURBAEY BVBA",623:"Aptcode Solutions",624:"LSI ADL Technology",625:"Animas Corp",626:"Alps Electric Co., Ltd.",627:"OCEASOFT",628:"Motsai Research",629:"Geotab",630:"E.G.O. Elektro-Gertebau GmbH",631:"bewhere inc",632:"Johnson Outdoors Inc",633:"steute Schaltgerate GmbH & Co. KG",634:"Ekomini inc.",635:"DEFA AS",636:"Aseptika Ltd",637:"HUAWEI Technologies Co., Ltd. ( )",638:"HabitAware, LLC",639:"ruwido austria gmbh",640:"ITEC corporation",641:"StoneL",642:"Sonova AG",643:"Maven Machines, Inc.",644:"Synapse Electronics",645:"Standard Innovation Inc.",646:"RF Code, Inc.",647:"Wally Ventures S.L.",648:"Willowbank Electronics Ltd",649:"SK Telecom",650:"Jetro AS",651:"Code Gears LTD",652:"NANOLINK APS",653:"IF, LLC",654:"RF Digital Corp",655:"Church & Dwight Co., Inc",656:"Multibit Oy",657:"CliniCloud Inc",658:"SwiftSensors",659:"Blue Bite",660:"ELIAS GmbH",661:"Sivantos GmbH",662:"Petzl",663:"storm power ltd",664:"EISST Ltd",665:"Inexess Technology Simma KG",666:"Currant, Inc.",667:"C2 Development, Inc.",668:"Blue Sky Scientific, LLC",669:"ALOTTAZS LABS, LLC",670:"Kupson spol. s r.o.",671:"Areus Engineering GmbH",672:"Impossible Camera GmbH",673:"InventureTrack Systems",674:"LockedUp",675:"Itude",676:"Pacific Lock Company",677:"Tendyron Corporation ( )",678:"Robert Bosch GmbH",679:"Illuxtron international B.V.",680:"miSport Ltd.",681:"Chargelib",682:"Doppler Lab",683:"BBPOS Limited",684:"RTB Elektronik GmbH & Co. KG",685:"Rx Networks, Inc.",686:"WeatherFlow, Inc.",687:"Technicolor USA Inc.",688:"Bestechnic(Shanghai),Ltd",689:"Raden Inc",690:"JouZen Oy",691:"CLABER S.P.A.",692:"Hyginex, Inc.",693:"HANSHIN ELECTRIC RAILWAY CO.,LTD.",694:"Schneider Electric",695:"Oort Technologies LLC",696:"Chrono Therapeutics",697:"Rinnai Corporation",698:"Swissprime Technologies AG",699:"Koha.,Co.Ltd",700:"Genevac Ltd",701:"Chemtronics",702:"Seguro Technology Sp. z o.o.",703:"Redbird Flight Simulations",704:"Dash Robotics",705:"LINE Corporation",706:"Guillemot Corporation",707:"Techtronic Power Tools Technology Limited",708:"Wilson Sporting Goods",709:"Lenovo (Singapore) Pte Ltd. ( )",710:"Ayatan Sensors",711:"Electronics Tomorrow Limited",712:"VASCO Data Security International, Inc.",713:"PayRange Inc.",714:"ABOV Semiconductor",715:"AINA-Wireless Inc.",716:"Eijkelkamp Soil & Water",717:"BMA ergonomics b.v.",718:"Teva Branded Pharmaceutical Products R&D, Inc.",719:"Anima",720:"3M",721:"Empatica Srl",722:"Afero, Inc.",723:"Powercast Corporation",724:"Secuyou ApS",725:"OMRON Corporation",726:"Send Solutions",727:"NIPPON SYSTEMWARE CO.,LTD.",728:"Neosfar",729:"Fliegl Agrartechnik GmbH",730:"Gilvader",731:"Digi International Inc (R)",732:"DeWalch Technologies, Inc.",733:"Flint Rehabilitation Devices, LLC",734:"Samsung SDS Co., Ltd.",735:"Blur Product Development",736:"University of Michigan",737:"Victron Energy BV",738:"NTT docomo",739:"Carmanah Technologies Corp.",740:"Bytestorm Ltd.",741:"Espressif Incorporated ( () )",742:"Unwire",743:"Connected Yard, Inc.",744:"American Music Environments",745:"Sensogram Technologies, Inc.",746:"Fujitsu Limited",747:"Ardic Technology",748:"Delta Systems, Inc",749:"HTC Corporation",750:"Citizen Holdings Co., Ltd.",751:"SMART-INNOVATION.inc",752:"Blackrat Software",753:"The Idea Cave, LLC",754:"GoPro, Inc.",755:"AuthAir, Inc",756:"Vensi, Inc.",757:"Indagem Tech LLC",758:"Intemo Technologies",759:"DreamVisions co., Ltd.",760:"Runteq Oy Ltd",761:"IMAGINATION TECHNOLOGIES LTD",762:"CoSTAR TEchnologies",763:"Clarius Mobile Health Corp.",764:"Shanghai Frequen Microelectronics Co., Ltd.",765:"Uwanna, Inc.",766:"Lierda Science & Technology Group Co., Ltd.",767:"Silicon Laboratories",768:"World Moto Inc.",769:"Giatec Scientific Inc.",770:"Loop Devices, Inc",771:"IACA electronique",772:"Martians Inc",773:"Swipp ApS",774:"Life Laboratory Inc.",775:"FUJI INDUSTRIAL CO.,LTD.",776:"Surefire, LLC",777:"Dolby Labs",778:"Ellisys",779:"Magnitude Lighting Converters",780:"Hilti AG",781:"Devdata S.r.l.",782:"Deviceworx",783:"Shortcut Labs",784:"SGL Italia S.r.l.",785:"PEEQ DATA",786:"Ducere Technologies Pvt Ltd",787:"DiveNav, Inc.",788:"RIIG AI Sp. z o.o.",789:"Thermo Fisher Scientific",790:"AG Measurematics Pvt. Ltd.",791:"CHUO Electronics CO., LTD.",792:"Aspenta International",793:"Eugster Frismag AG",794:"Amber wireless GmbH",795:"HQ Inc",796:"Lab Sensor Solutions",797:"Enterlab ApS",798:"Eyefi, Inc.",799:"MetaSystem S.p.A.",800:"SONO ELECTRONICS. CO., LTD",801:"Jewelbots",802:"Compumedics Limited",803:"Rotor Bike Components",804:"Astro, Inc.",805:"Amotus Solutions",806:"Healthwear Technologies (Changzhou)Ltd",807:"Essex Electronics",808:"Grundfos A/S",809:"Eargo, Inc.",810:"Electronic Design Lab",811:"ESYLUX",812:"NIPPON SMT.CO.,Ltd",813:"BM innovations GmbH",814:"indoormap",815:"OttoQ Inc",816:"North Pole Engineering",817:"3flares Technologies Inc.",818:"Electrocompaniet A.S.",819:"Mul-T-Lock",820:"Corentium AS",821:"Enlighted Inc",822:"GISTIC",823:"AJP2 Holdings, LLC",824:"COBI GmbH",825:"Blue Sky Scientific, LLC",826:"Appception, Inc.",827:"Courtney Thorne Limited",828:"Virtuosys",829:"TPV Technology Limited",830:"Monitra SA",831:"Automation Components, Inc.",832:"Letsense s.r.l.",833:"Etesian Technologies LLC",834:"GERTEC BRASIL LTDA.",835:"Drekker Development Pty. Ltd.",836:"Whirl Inc",837:"Locus Positioning",838:"Acuity Brands Lighting, Inc",839:"Prevent Biometrics",840:"Arioneo",841:"VersaMe",842:"Vaddio",843:"Libratone A/S",844:"HM Electronics, Inc.",845:"TASER International, Inc.",846:"SafeTrust Inc.",847:"Heartland Payment Systems",848:"Bitstrata Systems Inc.",849:"Pieps GmbH",850:"iRiding(Xiamen)Technology Co.,Ltd.",851:"Alpha Audiotronics, Inc.",852:"TOPPAN FORMS CO.,LTD.",853:"Sigma Designs, Inc.",854:"Spectrum Brands, Inc.",855:"Polymap Wireless",856:"MagniWare Ltd.",857:"Novotec Medical GmbH",858:"Medicom Innovation Partner a/s",859:"Matrix Inc.",860:"Eaton Corporation",861:"KYS",862:"Naya Health, Inc.",863:"Acromag",864:"Insulet Corporation",865:"Wellinks Inc.",866:"ON Semiconductor",867:"FREELAP SA",868:"Favero Electronics Srl",869:"BioMech Sensor LLC",870:"BOLTT Sports technologies Private limited",871:"Saphe International",872:"Metormote AB",873:"littleBits",874:"SetPoint Medical",875:"BRControls Products BV",876:"Zipcar",877:"AirBolt Pty Ltd",878:"KeepTruckin Inc",879:"Motiv, Inc.",880:"Wazombi Labs O",881:"ORBCOMM",882:"Nixie Labs, Inc.",883:"AppNearMe Ltd",884:"Holman Industries",885:"Expain AS",886:"Electronic Temperature Instruments Ltd",887:"Plejd AB",888:"Propeller Health",889:"Shenzhen iMCO Electronic Technology Co.,Ltd",890:"Algoria",891:"Apption Labs Inc.",892:"Cronologics Corporation",893:"MICRODIA Ltd.",894:"lulabytes S.L.",895:"Nestec S.A.",896:"LLC MEGA - F service",897:"Sharp Corporation",898:"Precision Outcomes Ltd",899:"Kronos Incorporated",900:"OCOSMOS Co., Ltd.",901:"Embedded Electronic Solutions Ltd. dba e2Solutions",902:"Aterica Inc.",903:"BluStor PMC, Inc.",904:"Kapsch TrafficCom AB",905:"ActiveBlu Corporation",906:"Kohler Mira Limited",907:"Noke",908:"Appion Inc.",909:"Resmed Ltd",910:"Crownstone B.V.",911:"Xiaomi Inc.",912:"INFOTECH s.r.o.",913:"Thingsquare AB",914:"T&D",915:"LAVAZZA S.p.A.",916:"Netclearance Systems, Inc.",917:"SDATAWAY",918:"BLOKS GmbH",919:"LEGO System A/S",920:"Thetatronics Ltd",921:"Nikon Corporation",922:"NeST",923:"South Silicon Valley Microelectronics",924:"ALE International",925:"CareView Communications, Inc.",926:"SchoolBoard Limited",927:"Molex Corporation",928:"IVT Wireless Limited",929:"Alpine Labs LLC",930:"Candura Instruments",931:"SmartMovt Technology Co., Ltd",932:"Token Zero Ltd",933:"ACE CAD Enterprise Co., Ltd. (ACECAD)",934:"Medela, Inc",935:"AeroScout",936:"Esrille Inc.",937:"THINKERLY SRL",938:"Exon Sp. z o.o.",939:"Meizu Technology Co., Ltd.",940:"Smablo LTD",941:"XiQ",942:"Allswell Inc.",943:"Comm-N-Sense Corp DBA Verigo",944:"VIBRADORM GmbH",945:"Otodata Wireless Network Inc.",946:"Propagation Systems Limited",947:"Midwest Instruments & Controls",948:"Alpha Nodus, inc.",949:"petPOMM, Inc",950:"Mattel",951:"Airbly Inc.",952:"A-Safe Limited",953:"FREDERIQUE CONSTANT SA",954:"Maxscend Microelectronics Company Limited",955:"Abbott Diabetes Care",956:"ASB Bank Ltd",957:"amadas",958:"Applied Science, Inc.",959:"iLumi Solutions Inc.",960:"Arch Systems Inc.",961:"Ember Technologies, Inc.",962:"Snapchat Inc",963:"Casambi Technologies Oy",964:"Pico Technology Inc.",965:"St. Jude Medical, Inc.",966:"Intricon",967:"Structural Health Systems, Inc.",968:"Avvel International",969:"Gallagher Group",970:"In2things Automation Pvt. Ltd.",971:"SYSDEV Srl",972:"Vonkil Technologies Ltd",973:"Wynd Technologies, Inc.",974:"CONTRINEX S.A.",975:"MIRA, Inc.",976:"Watteam Ltd",977:"Density Inc.",978:"IOT Pot India Private Limited",979:"Sigma Connectivity AB",980:"PEG PEREGO SPA",981:"Wyzelink Systems Inc.",982:"Yota Devices LTD",983:"FINSECUR",984:"Zen-Me Labs Ltd",985:"3IWare Co., Ltd.",986:"EnOcean GmbH",987:"Instabeat, Inc",988:"Nima Labs",989:"Andreas Stihl AG & Co. KG",990:"Nathan Rhoades LLC",991:"Grob Technologies, LLC",992:"Actions (Zhuhai) Technology Co., Limited",993:"SPD Development Company Ltd",994:"Sensoan Oy",995:"Qualcomm Life Inc",996:"Chip-ing AG",997:"ffly4u",998:"IoT Instruments Oy",999:"TRUE Fitness Technology",1000:"Reiner Kartengeraete GmbH & Co. KG.",1001:"SHENZHEN LEMONJOY TECHNOLOGY CO., LTD.",1002:"Hello Inc.",1003:"Evollve Inc.",1004:"Jigowatts Inc.",1005:"BASIC MICRO.COM,INC.",1006:"CUBE TECHNOLOGIES",1007:"foolography GmbH",1008:"CLINK",1009:"Hestan Smart Cooking Inc.",1010:"WindowMaster A/S",1011:"Flowscape AB",1012:"PAL Technologies Ltd",1013:"WHERE, Inc.",1014:"Iton Technology Corp.",1015:"Owl Labs Inc.",1016:"Rockford Corp.",1017:"Becon Technologies Co.,Ltd.",1018:"Vyassoft Technologies Inc",1019:"Nox Medical",1020:"Kimberly-Clark",1021:"Trimble Navigation Ltd.",1022:"Littelfuse",1023:"Withings",1024:"i-developer IT Beratung UG",1026:"Sears Holdings Corporation",1027:"Gantner Electronic GmbH",1028:"Authomate Inc",1029:"Vertex International, Inc.",1030:"Airtago",1031:"Swiss Audio SA",1032:"ToGetHome Inc.",1033:"AXIS",1034:"Openmatics",1035:"Jana Care Inc.",1036:"Senix Corporation",1037:"NorthStar Battery Company, LLC",1038:"SKF (U.K.) Limited",1039:"CO-AX Technology, Inc.",1040:"Fender Musical Instruments",1041:"Luidia Inc",1042:"SEFAM",1043:"Wireless Cables Inc",1044:"Lightning Protection International Pty Ltd",1045:"Uber Technologies Inc",1046:"SODA GmbH",1047:"Fatigue Science",1048:"Alpine Electronics Inc.",1049:"Novalogy LTD",1050:"Friday Labs Limited",1051:"OrthoAccel Technologies",1052:"WaterGuru, Inc.",1053:"Benning Elektrotechnik und Elektronik GmbH & Co. KG",1054:"Dell Computer Corporation",1055:"Kopin Corporation",1056:"TecBakery GmbH",1057:"Backbone Labs, Inc.",1058:"DELSEY SA",1059:"Chargifi Limited",1060:"Trainesense Ltd.",1061:"Unify Software and Solutions GmbH & Co. KG",1062:"Husqvarna AB",1063:"Focus fleet and fuel management inc",1064:"SmallLoop, LLC",1065:"Prolon Inc.",1066:"BD Medical",1067:"iMicroMed Incorporated",1068:"Ticto N.V.",1069:"Meshtech AS",1070:"MemCachier Inc.",1071:"Danfoss A/S",1072:"SnapStyk Inc.",1073:"Amyway Corporation",1074:"Silk Labs, Inc.",1075:"Pillsy Inc.",1076:"Hatch Baby, Inc.",1077:"Blocks Wearables Ltd.",1078:"Drayson Technologies (Europe) Limited",1079:"eBest IOT Inc.",1080:"Helvar Ltd",1081:"Radiance Technologies",1082:"Nuheara Limited",1083:"Appside co., ltd.",1084:"DeLaval",1085:"Coiler Corporation",1086:"Thermomedics, Inc.",1087:"Tentacle Sync GmbH",1088:"Valencell, Inc.",1089:"iProtoXi Oy",1090:"SECOM CO., LTD.",1091:"Tucker International LLC",1092:"Metanate Limited",1093:"Kobian Canada Inc.",1094:"NETGEAR, Inc.",1095:"Fabtronics Australia Pty Ltd",1096:"Grand Centrix GmbH",1097:"1UP USA.com llc",1098:"SHIMANO INC.",1099:"Nain Inc.",1100:"LifeStyle Lock, LLC",1101:"VEGA Grieshaber KG",1102:"Xtrava Inc.",1103:"TTS Tooltechnic Systems AG & Co. KG",1104:"Teenage Engineering AB",1105:"Tunstall Nordic AB",1106:"Svep Design Center AB",1107:"GreenPeak Technologies BV",1108:"Sphinx Electronics GmbH & Co KG",1109:"Atomation",1110:"Nemik Consulting Inc",1111:"RF INNOVATION",1112:"Mini Solution Co., Ltd.",1113:"Lumenetix, Inc",1114:"2048450 Ontario Inc",1115:"SPACEEK LTD",1116:"Delta T Corporation",1117:"Boston Scientific Corporation",1118:"Nuviz, Inc.",1119:"Real Time Automation, Inc.",1120:"Kolibree",1121:"vhf elektronik GmbH",1122:"Bonsai Systems GmbH",1123:"Fathom Systems Inc.",1124:"Bellman & Symfon",1125:"International Forte Group LLC",1126:"CycleLabs Solutions inc.",1127:"Codenex Oy",1128:"Kynesim Ltd",1129:"Palago AB",1130:"INSIGMA INC.",1131:"PMD Solutions",1132:"Qingdao Realtime Technology Co., Ltd.",1133:"BEGA Gantenbrink-Leuchten KG",1134:"Pambor Ltd.",65535:"SPECIAL USE/DEFAULT"}});var require_bluetooth=__commonJS((exports)=>{var exec3=__require("child_process").exec,execSync19=__require("child_process").execSync,path6=__require("path"),util4=require_util3(),bluetoothVendors=require_bluetoothVendors(),fs3=__require("fs"),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";function parseBluetoothType(str5){let result2="";if(str5.indexOf("keyboard")>=0)result2="Keyboard";if(str5.indexOf("mouse")>=0)result2="Mouse";if(str5.indexOf("trackpad")>=0)result2="Trackpad";if(str5.indexOf("audio")>=0)result2="Audio";if(str5.indexOf("sound")>=0)result2="Audio";if(str5.indexOf("microph")>=0)result2="Microphone";if(str5.indexOf("speaker")>=0)result2="Speaker";if(str5.indexOf("headset")>=0)result2="Headset";if(str5.indexOf("phone")>=0)result2="Phone";if(str5.indexOf("macbook")>=0)result2="Computer";if(str5.indexOf("imac")>=0)result2="Computer";if(str5.indexOf("ipad")>=0)result2="Tablet";if(str5.indexOf("watch")>=0)result2="Watch";if(str5.indexOf("headphone")>=0)result2="Headset";return result2}function parseBluetoothManufacturer(str5){let result2=str5.split(" ")[0];if(str5=str5.toLowerCase(),str5.indexOf("apple")>=0)result2="Apple";if(str5.indexOf("ipad")>=0)result2="Apple";if(str5.indexOf("imac")>=0)result2="Apple";if(str5.indexOf("iphone")>=0)result2="Apple";if(str5.indexOf("magic mouse")>=0)result2="Apple";if(str5.indexOf("magic track")>=0)result2="Apple";if(str5.indexOf("macbook")>=0)result2="Apple";return result2}function parseBluetoothVendor(str5){let id=parseInt(str5);if(!isNaN(id))return bluetoothVendors[id]}function parseLinuxBluetoothInfo(lines,macAddr1,macAddr2){let result2={};return result2.device=null,result2.name=util4.getValue(lines,"name","="),result2.manufacturer=null,result2.macDevice=macAddr1,result2.macHost=macAddr2,result2.batteryPercent=null,result2.type=parseBluetoothType(result2.name.toLowerCase()),result2.connected=!1,result2}function parseDarwinBluetoothDevices(bluetoothObject,macAddr2){let result2={},typeStr=((bluetoothObject.device_minorClassOfDevice_string||bluetoothObject.device_majorClassOfDevice_string||bluetoothObject.device_minorType||"")+(bluetoothObject.device_name||"")).toLowerCase();return result2.device=bluetoothObject.device_services||"",result2.name=bluetoothObject.device_name||"",result2.manufacturer=bluetoothObject.device_manufacturer||parseBluetoothVendor(bluetoothObject.device_vendorID)||parseBluetoothManufacturer(bluetoothObject.device_name||"")||"",result2.macDevice=(bluetoothObject.device_addr||bluetoothObject.device_address||"").toLowerCase().replace(/-/g,":"),result2.macHost=macAddr2,result2.batteryPercent=bluetoothObject.device_batteryPercent||null,result2.type=parseBluetoothType(typeStr),result2.connected=bluetoothObject.device_isconnected==="attrib_Yes"||!1,result2}function parseWindowsBluetooth(lines){let result2={};return result2.device=null,result2.name=util4.getValue(lines,"name",":"),result2.manufacturer=util4.getValue(lines,"manufacturer",":"),result2.macDevice=null,result2.macHost=null,result2.batteryPercent=null,result2.type=parseBluetoothType(result2.name.toLowerCase()),result2.connected=null,result2}function bluetoothDevices(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=[];if(_linux){util4.getFilesInPath("/var/lib/bluetooth/").forEach((element)=>{let filename=path6.basename(element),pathParts=element.split("/"),macAddr1=pathParts.length>=6?pathParts[pathParts.length-2]:null,macAddr2=pathParts.length>=7?pathParts[pathParts.length-3]:null;if(filename==="info"){let infoFile=fs3.readFileSync(element,{encoding:"utf8"}).split(`
|
|
3520
|
-
`);result2.push(parseLinuxBluetoothInfo(infoFile,macAddr1,macAddr2))}});try{let hdicon=
|
|
3521
|
-
`),service=util4.getValue(lines,"Service",":"),errorCode=util4.getValue(lines,"ConfigManagerErrorCode",":");if(util4.getValue(lines,"PNPClass",":").toLowerCase()==="bluetooth"&&errorCode==="0"&&service==="")result2.push(parseWindowsBluetooth(lines))});if(callback)callback(result2);resolve14(result2)});if(_freebsd||_netbsd||_openbsd||_sunos)resolve14(null)})})}exports.bluetoothDevices=bluetoothDevices});var require_lib5=__commonJS((exports)=>{var lib_version=require_package().version,util4=require_util3(),system=require_system(),osInfo=require_osinfo(),cpu=require_cpu(),memory=require_memory(),battery=require_battery(),graphics=require_graphics(),filesystem=require_filesystem(),network=require_network(),wifi=require_wifi(),processes=require_processes(),users=require_users(),internet=require_internet(),docker=require_docker(),vbox=require_virtualbox(),printer=require_printer(),usb=require_usb(),audio=require_audio(),bluetooth=require_bluetooth(),_platform=process.platform,_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";if(_windows)util4.getCodepage(),util4.getPowershell();function version(){return lib_version}function getStaticData(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let data={};data.version=version(),Promise.all([system.system(),system.bios(),system.baseboard(),system.chassis(),osInfo.osInfo(),osInfo.uuid(),osInfo.versions(),cpu.cpu(),cpu.cpuFlags(),graphics.graphics(),network.networkInterfaces(),memory.memLayout(),filesystem.diskLayout(),audio.audio(),bluetooth.bluetoothDevices(),usb.usb(),printer.printer()]).then((res)=>{if(data.system=res[0],data.bios=res[1],data.baseboard=res[2],data.chassis=res[3],data.os=res[4],data.uuid=res[5],data.versions=res[6],data.cpu=res[7],data.cpu.flags=res[8],data.graphics=res[9],data.net=res[10],data.memLayout=res[11],data.diskLayout=res[12],data.audio=res[13],data.bluetooth=res[14],data.usb=res[15],data.printer=res[16],callback)callback(data);resolve14(data)})})})}function getDynamicData(srv,iface,callback){if(util4.isFunction(iface))callback=iface,iface="";if(util4.isFunction(srv))callback=srv,srv="";return new Promise((resolve14)=>{process.nextTick(()=>{iface=iface||network.getDefaultNetworkInterface(),srv=srv||"";let functionProcessed=(()=>{let totalFunctions=15;if(_windows)totalFunctions=13;if(_freebsd||_openbsd||_netbsd)totalFunctions=11;if(_sunos)totalFunctions=6;return function(){if(--totalFunctions===0){if(callback)callback(data);resolve14(data)}}})(),data={};if(data.time=osInfo.time(),data.node=process.versions.node,data.v8=process.versions.v8,cpu.cpuCurrentSpeed().then((res)=>{data.cpuCurrentSpeed=res,functionProcessed()}),users.users().then((res)=>{data.users=res,functionProcessed()}),processes.processes().then((res)=>{data.processes=res,functionProcessed()}),cpu.currentLoad().then((res)=>{data.currentLoad=res,functionProcessed()}),!_sunos)cpu.cpuTemperature().then((res)=>{data.temp=res,functionProcessed()});if(!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)network.networkStats(iface).then((res)=>{data.networkStats=res,functionProcessed()});if(!_sunos)network.networkConnections().then((res)=>{data.networkConnections=res,functionProcessed()});if(memory.mem().then((res)=>{data.mem=res,functionProcessed()}),!_sunos)battery().then((res)=>{data.battery=res,functionProcessed()});if(!_sunos)processes.services(srv).then((res)=>{data.services=res,functionProcessed()});if(!_sunos)filesystem.fsSize().then((res)=>{data.fsSize=res,functionProcessed()});if(!_windows&&!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)filesystem.fsStats().then((res)=>{data.fsStats=res,functionProcessed()});if(!_windows&&!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)filesystem.disksIO().then((res)=>{data.disksIO=res,functionProcessed()});if(!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)wifi.wifiNetworks().then((res)=>{data.wifiNetworks=res,functionProcessed()});internet.inetLatency().then((res)=>{data.inetLatency=res,functionProcessed()})})})}function getAllData(srv,iface,callback){return new Promise((resolve14)=>{process.nextTick(()=>{let data={};if(iface&&util4.isFunction(iface)&&!callback)callback=iface,iface="";if(srv&&util4.isFunction(srv)&&!iface&&!callback)callback=srv,srv="",iface="";getStaticData().then((res)=>{data=res,getDynamicData(srv,iface).then((res2)=>{for(let key in res2)if({}.hasOwnProperty.call(res2,key))data[key]=res2[key];if(callback)callback(data);resolve14(data)})})})})}function get3(valueObject,callback){return new Promise((resolve14)=>{process.nextTick(()=>{let allPromises=Object.keys(valueObject).filter((func)=>({}).hasOwnProperty.call(exports,func)).map((func)=>{let params=valueObject[func].substring(valueObject[func].lastIndexOf("(")+1,valueObject[func].lastIndexOf(")")),funcWithoutParams=func.indexOf(")")>=0?func.split(")")[1].trim():func;if(funcWithoutParams=func.indexOf("|")>=0?func.split("|")[0].trim():funcWithoutParams,params)return exports[funcWithoutParams](params);else return exports[funcWithoutParams]("")});Promise.all(allPromises).then((data)=>{let result2={},i2=0;for(let key in valueObject)if({}.hasOwnProperty.call(valueObject,key)&&{}.hasOwnProperty.call(exports,key)&&data.length>i2){if(valueObject[key]==="*"||valueObject[key]==="all")result2[key]=data[i2];else{let keys=valueObject[key],filter="",filterParts=[];if(keys.indexOf(")")>=0)keys=keys.split(")")[1].trim();if(keys.indexOf("|")>=0)filter=keys.split("|")[1].trim(),filterParts=filter.split(":"),keys=keys.split("|")[0].trim();if(keys=keys.replace(/,/g," ").replace(/ +/g," ").split(" "),data[i2])if(Array.isArray(data[i2])){let partialArray=[];data[i2].forEach((element)=>{let partialRes={};if(keys.length===1&&(keys[0]==="*"||keys[0]==="all"))partialRes=element;else keys.forEach((k2)=>{if({}.hasOwnProperty.call(element,k2))partialRes[k2]=element[k2]});if(filter&&filterParts.length===2){if({}.hasOwnProperty.call(partialRes,filterParts[0].trim())){let val=partialRes[filterParts[0].trim()];if(typeof val==="number"){if(val===parseFloat(filterParts[1].trim()))partialArray.push(partialRes)}else if(typeof val==="string"){if(val.toLowerCase()===filterParts[1].trim().toLowerCase())partialArray.push(partialRes)}}}else partialArray.push(partialRes)}),result2[key]=partialArray}else{let partialRes={};keys.forEach((k2)=>{if({}.hasOwnProperty.call(data[i2],k2))partialRes[k2]=data[i2][k2]}),result2[key]=partialRes}else result2[key]={}}i2++}if(callback)callback(result2);resolve14(result2)})})})}function observe(valueObject,interval,callback){let _data=null;return setInterval(()=>{get3(valueObject).then((data)=>{if(JSON.stringify(_data)!==JSON.stringify(data))_data=Object.assign({},data),callback(data)})},interval)}exports.version=version;exports.system=system.system;exports.bios=system.bios;exports.baseboard=system.baseboard;exports.chassis=system.chassis;exports.time=osInfo.time;exports.osInfo=osInfo.osInfo;exports.versions=osInfo.versions;exports.shell=osInfo.shell;exports.uuid=osInfo.uuid;exports.cpu=cpu.cpu;exports.cpuFlags=cpu.cpuFlags;exports.cpuCache=cpu.cpuCache;exports.cpuCurrentSpeed=cpu.cpuCurrentSpeed;exports.cpuTemperature=cpu.cpuTemperature;exports.currentLoad=cpu.currentLoad;exports.fullLoad=cpu.fullLoad;exports.mem=memory.mem;exports.memLayout=memory.memLayout;exports.battery=battery;exports.graphics=graphics.graphics;exports.fsSize=filesystem.fsSize;exports.fsOpenFiles=filesystem.fsOpenFiles;exports.blockDevices=filesystem.blockDevices;exports.fsStats=filesystem.fsStats;exports.disksIO=filesystem.disksIO;exports.diskLayout=filesystem.diskLayout;exports.networkInterfaceDefault=network.networkInterfaceDefault;exports.networkGatewayDefault=network.networkGatewayDefault;exports.networkInterfaces=network.networkInterfaces;exports.networkStats=network.networkStats;exports.networkConnections=network.networkConnections;exports.wifiNetworks=wifi.wifiNetworks;exports.wifiInterfaces=wifi.wifiInterfaces;exports.wifiConnections=wifi.wifiConnections;exports.services=processes.services;exports.processes=processes.processes;exports.processLoad=processes.processLoad;exports.users=users.users;exports.inetChecksite=internet.inetChecksite;exports.inetLatency=internet.inetLatency;exports.dockerInfo=docker.dockerInfo;exports.dockerImages=docker.dockerImages;exports.dockerContainers=docker.dockerContainers;exports.dockerContainerStats=docker.dockerContainerStats;exports.dockerContainerProcesses=docker.dockerContainerProcesses;exports.dockerVolumes=docker.dockerVolumes;exports.dockerAll=docker.dockerAll;exports.vboxInfo=vbox.vboxInfo;exports.printer=printer.printer;exports.usb=usb.usb;exports.audio=audio.audio;exports.bluetoothDevices=bluetooth.bluetoothDevices;exports.getStaticData=getStaticData;exports.getDynamicData=getDynamicData;exports.getAllData=getAllData;exports.get=get3;exports.observe=observe;exports.powerShellStart=util4.powerShellStart;exports.powerShellRelease=util4.powerShellRelease});import os4 from"os";function toGB(bytes){return Math.round(bytes/1073741824*10)/10}function bar(percent,width){let p=Math.max(0,Math.min(100,percent)),filled=Math.round(p/100*width);return`[${"=".repeat(filled)}${"-".repeat(width-filled)}]`}function pickColor(percent){if(percent>80)return palette.error;if(percent>50)return palette.warning;return palette.emerald}function SystemStats(){let[stats2,setStats]=import_react19.useState(null),mountedRef=import_react19.useRef(!0);if(import_react19.useEffect(()=>{mountedRef.current=!0;async function refresh(){try{let[cpu2,mem]=await Promise.all([import_systeminformation.default.currentLoad(),import_systeminformation.default.mem()]);if(!mountedRef.current)return;let coreCount=os4.cpus().length,avg1=os4.loadavg()[0],sorted=cpu2.cpus.map((c,i2)=>({id:i2,load:Math.round(c.load)})).sort((a,b3)=>b3.load-a.load);setStats({cpu:{combined:Math.round(cpu2.currentLoad),hotCores:sorted.slice(0,3),coreCount},ram:{usedGB:toGB(mem.active),totalGB:toGB(mem.total),percent:mem.total>0?Math.round(mem.active/mem.total*100):0},swap:{usedGB:toGB(mem.swapused),totalGB:toGB(mem.swaptotal),percent:mem.swaptotal>0?Math.round(mem.swapused/mem.swaptotal*100):0},load:{percent:coreCount>0?Math.round(avg1/coreCount*100):0,busy:Math.round(avg1*10)/10,total:coreCount}})}catch{}}refresh();let timer2=setInterval(refresh,3000);return()=>{mountedRef.current=!1,clearInterval(timer2)}},[]),!stats2)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,backgroundColor:palette.bgLight,children:import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"genie"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` v${VERSION}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this);let{cpu,ram,swap,load:load3}=stats2,hotStr=cpu.hotCores.map((c)=>`#${c.id} ${c.load}%`).join(" ");return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,backgroundColor:palette.bgLight,children:[import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"genie"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` v${VERSION}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"CPU "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(cpu.combined),children:`${String(cpu.combined).padStart(3)}% ${bar(cpu.combined,8)}`},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` ${cpu.coreCount}c`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:" hot "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.warning,children:hotStr},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"RAM "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(ram.percent),children:`${ram.usedGB}/${ram.totalGB}G ${bar(ram.percent,8)}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),swap.totalGB>0?import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"SWP "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(swap.percent),children:`${swap.usedGB}/${swap.totalGB}G ${bar(swap.percent,8)}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Load "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(load3.percent),children:`${load3.percent}%`},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` (${load3.busy}/${load3.total} busy)`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}var import_react19,import_systeminformation;var init_SystemStats=__esm(()=>{init_version();init_theme2();init_jsx_dev_runtime();import_react19=__toESM(require_react_development(),1),import_systeminformation=__toESM(require_lib5(),1)});function validateName(name){if(name.length===0)return null;try{return validateBranchName(name),null}catch(err){return err instanceof Error?err.message:String(err)}}function TeamCreate({availableAgents,workspaceRoot,onConfirm,onCancel}){let[step,setStep]=import_react21.useState("name"),[teamName,setTeamName]=import_react21.useState(""),[selected,setSelected]=import_react21.useState(()=>new Set),[memberCursor,setMemberCursor]=import_react21.useState(0),nameError=import_react21.useMemo(()=>validateName(teamName),[teamName]),nameValid=teamName.length>0&&nameError===null,intent=import_react21.useMemo(()=>({kind:"create-team",name:teamName.length>0?teamName:"TEAM_NAME",repo:workspaceRoot}),[teamName,workspaceRoot]),handleNameChange=import_react21.useCallback((value)=>{setTeamName(value)},[]),advanceFromName=import_react21.useCallback(()=>{if(!nameValid)return;setStep("members")},[nameValid]),toggleMember=import_react21.useCallback((name)=>{setSelected((prev)=>{let next=new Set(prev);if(next.has(name))next.delete(name);else next.add(name);return next})},[]),confirmMembers=import_react21.useCallback(()=>{onConfirm({teamName,members:Array.from(selected)})},[onConfirm,teamName,selected]);return useKeyboard((key)=>{if(step==="name"){handleNameStepKey(key,{onCancel,nameValid,advanceFromName});return}handleMembersStepKey(key,{availableAgents,memberCursor,setStep,setMemberCursor,toggleMember,confirmMembers})}),import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:"#0a0a0a",children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderColor:palette.violet,backgroundColor:"#111111",paddingX:3,paddingY:1,flexDirection:"column",width:64,gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"New team"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:step==="name"?" \u2014 step 1 of 2":" \u2014 step 2 of 2"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),step==="name"?import_jsx_dev_runtime2.jsxDEV(NameStep,{value:teamName,onChange:handleNameChange,onSubmit:advanceFromName,errorMessage:nameError},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV(MembersStep,{agents:availableAgents,selected,cursor:memberCursor},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent,hint:step==="name"?"Enter: next \xB7 Esc: cancel":"Space: toggle \xB7 Enter: create \xB7 Esc: back"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}function NameStep({value,onChange,onSubmit,errorMessage}){return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Team name (git-branch-safe):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("input",{value,onInput:onChange,onChange,onSubmit,focused:!0,placeholder:"feat/auth-bug",backgroundColor:palette.bg,textColor:palette.text,placeholderColor:palette.textMuted},void 0,!1,void 0,this),errorMessage!==null?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${errorMessage}`},void 0,!1,void 0,this)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}function MembersStep({agents,selected,cursor}){if(agents.length===0)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"No agents registered"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Members can be hired later via `genie team hire`."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Select members (space to toggle):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:agents.map((name,idx)=>{let isSelected=selected.has(name),isCursor=idx===cursor,tick=isSelected?"[x]":"[ ]",prefix=isCursor?"\u25B6 ":" ";return import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:isCursor?palette.cyan:palette.textMuted,children:prefix},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:isSelected?palette.success:palette.textDim,children:tick},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:` ${name}`},void 0,!1,void 0,this)]},name,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function isEnter(key){return key.name==="enter"||key.name==="return"}function handleNameStepKey(key,opts){if(key.name==="escape"){opts.onCancel();return}if(isEnter(key)&&opts.nameValid)opts.advanceFromName()}function handleMembersStepKey(key,opts){if(key.name==="escape"){opts.setStep("name");return}if(opts.availableAgents.length===0){if(isEnter(key))opts.confirmMembers();return}if(key.name==="up"||key.name==="k"){opts.setMemberCursor((prev)=>prev<=0?opts.availableAgents.length-1:prev-1);return}if(key.name==="down"||key.name==="j"){opts.setMemberCursor((prev)=>prev>=opts.availableAgents.length-1?0:prev+1);return}if(key.name==="space"){let name=opts.availableAgents[opts.memberCursor];if(name)opts.toggleMember(name);return}if(isEnter(key))opts.confirmMembers()}var import_react21;var init_TeamCreate=__esm(async()=>{init_team_manager();init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react();import_react21=__toESM(require_react_development(),1)});function getNodeIcon(node){if(node.type==="agent")return getAgentIcon(node);switch(node.type){case"session":return node.data.attached?"\u25B6":"\u25B8";case"window":return node.data.active?"\u25A0":"\u25A1";case"pane":return getPaneIcon(node);default:return" "}}function getAgentIcon(node){switch(node.wsAgentState){case"running":return"\u25CF";case"stopped":return"\u25CB";case"error":return"\u2298";case"spawning":return"\u231B";default:return"\u25CB"}}function getPaneIcon(node){if(node.data.isDead)return"\u2718";if(node.agentState==="working")return"\u25CF";if(node.agentState==="idle")return"\u25CB";if(node.agentState==="permission")return"\u26A0";if(node.agentState==="error")return"\u2718";if(node.data.command==="claude")return"\u25C6";return"\u25CB"}function getNodeColor(node){if(node.type==="agent")return getAgentColor(node);switch(node.type){case"session":return node.data.attached?palette.emerald:palette.textDim;case"window":return node.data.active?palette.cyan:palette.text;case"pane":return getPaneColor(node);default:return palette.text}}function getAgentColor(node){switch(node.wsAgentState){case"running":return palette.emerald;case"stopped":return palette.textDim;case"error":return palette.error;case"spawning":return palette.warning;default:return palette.textDim}}function getPaneColor(node){if(node.data.isDead)return palette.error;if(node.agentState==="working")return palette.cyan;if(node.agentState==="permission")return palette.warning;if(node.agentState==="error")return palette.error;if(node.agentState==="idle")return palette.textDim;if(node.data.command==="claude")return palette.cyan;return palette.textDim}function getNodeSuffix(node){if(node.type==="agent"){if(node.wsAgentState==="spawning"&&node.activePanes===0)return" [stuck \u2014 press R to retry]";let wc=node.data.windowCount;if(wc>1)return` (${wc} windows)`;if(wc===1)return" (1 window)";return""}if(node.type==="session"||node.type==="pane"){let count=node.activePanes;if(count>0)return` ${icons.agent}${count}`}return""}function getStateColor(state){switch(state){case"working":return palette.cyan;case"idle":return palette.textDim;case"permission":return palette.warning;case"error":return palette.error;default:return palette.textMuted}}var import_react22,TreeNodeRow;var init_TreeNode=__esm(()=>{init_theme2();init_jsx_dev_runtime();import_react22=__toESM(require_react_development(),1),TreeNodeRow=import_react22.memo(function({node,selected,onSelect,onToggle,onContextMenu}){let indent2=" ".repeat(node.depth),hasChildren=node.children.length>0,expandIcon=hasChildren?node.expanded?icons.expanded:icons.collapsed:" ",icon=getNodeIcon(node),color2=getNodeColor(node),suffix=getNodeSuffix(node);return import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",backgroundColor:selected?palette.violet:void 0,onMouseDown:(event)=>{if(event.button===2&&onContextMenu){onSelect(node.id),onContextMenu(node.id);return}if(onSelect(node.id),hasChildren)onToggle(node.id)},children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[indent2,expandIcon," "]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:color2,children:[icon," "]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:selected?"#ffffff":palette.text,children:node.label},void 0,!1,void 0,this),suffix?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:suffix},void 0,!1,void 0,this):null,node.agentState?import_jsx_dev_runtime2.jsxDEV("span",{fg:getStateColor(node.agentState),children:[" ",node.agentState]},void 0,!0,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:` [${node.type}]`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)})});function Nav({onTmuxSessionSelect,onNewAgentWindow,workspaceRoot,initialAgent,keyboardDisabled=!1}){let[diagnostics,setDiagnostics]=import_react24.useState(null),[sessionTree,setSessionTree]=import_react24.useState([]),[selectedIndex,setSelectedIndex]=import_react24.useState(0),[requestedInitialAgent,setRequestedInitialAgent]=import_react24.useState(initialAgent),[contextMenuNodeId,setContextMenuNodeId]=import_react24.useState(null),[spawnIntoAgent,setSpawnIntoAgent]=import_react24.useState(null),[spawnPickerTarget,setSpawnPickerTarget]=import_react24.useState(null),lastTarget=import_react24.useRef(null),selectedNodeId=import_react24.useRef(null);import_react24.useEffect(()=>{let active=!0;async function refresh(){try{let snap=await collectDiagnostics();if(!active)return;setDiagnostics(snap);let signaledAgent=consumeInitialAgentSignal();if(signaledAgent)setRequestedInitialAgent(signaledAgent)}catch(err){console.error("TUI: diagnostics failed:",err)}}refresh();let timer2=setInterval(refresh,2000);return()=>{active=!1,clearInterval(timer2)}},[]),import_react24.useEffect(()=>{if(!diagnostics)return;let newTree;if(workspaceRoot){let agentNames=scanAgents(workspaceRoot);newTree=buildWorkspaceTree({agentNames,sessions:diagnostics.sessions,executors:diagnostics.executors})}else newTree=buildSessionTree(diagnostics);setSessionTree((prev)=>mergeExpandedState(prev,newTree))},[diagnostics,workspaceRoot]);let flatNodes=import_react24.useMemo(()=>flattenTree(sessionTree),[sessionTree]);import_react24.useEffect(()=>{let node=flatNodes[selectedIndex]?.node;if(node)selectedNodeId.current=node.id},[selectedIndex,flatNodes]),import_react24.useLayoutEffect(()=>{if(flatNodes.length===0)return;if(selectedIndex>=flatNodes.length){setSelectedIndex(flatNodes.length-1);return}if(!selectedNodeId.current)return;let currentAtIndex=flatNodes[selectedIndex]?.node;if(currentAtIndex&¤tAtIndex.id===selectedNodeId.current)return;let restored=flatNodes.findIndex((n)=>n.node.id===selectedNodeId.current);if(restored>=0)setSelectedIndex(restored)},[flatNodes]),import_react24.useEffect(()=>{if(!requestedInitialAgent||flatNodes.length===0)return;let idx=flatNodes.findIndex((n)=>n.node.id===`agent:${requestedInitialAgent}`);if(idx>=0){setSelectedIndex(idx);let node=flatNodes[idx].node;if(node.type==="agent"&&node.wsAgentState!=="running"&&node.wsAgentState!=="spawning")spawnAgent(agentNameFromNode(node),onTmuxSessionSelect);setRequestedInitialAgent(void 0)}},[requestedInitialAgent,flatNodes,onTmuxSessionSelect]),import_react24.useEffect(()=>{let current=flatNodes[selectedIndex]?.node;if(!current)return;let target=getSessionTarget(current);if(!target)return;if(current.type==="agent"&¤t.wsAgentState!=="running")return;let key=`${target.sessionName}:${target.windowIndex??""}`;if(key===lastTarget.current)return;lastTarget.current=key,onTmuxSessionSelect(target.sessionName,target.windowIndex)},[selectedIndex,flatNodes,onTmuxSessionSelect]);let handleSelect=import_react24.useCallback((id)=>{let idx=flatNodes.findIndex((n)=>n.node.id===id);if(idx>=0)setSelectedIndex(idx)},[flatNodes]),handleToggle=import_react24.useCallback((id)=>{setSessionTree((prev)=>toggleNode(prev,id))},[]),handleVerticalNav=import_react24.useCallback((keyName2)=>{let rowCount=flatNodes.length;if(rowCount===0)return;if(keyName2==="up"||keyName2==="k")setSelectedIndex((prev)=>prev===0?rowCount-1:prev-1);else if(keyName2==="down"||keyName2==="j")setSelectedIndex((prev)=>prev>=rowCount-1?0:prev+1)},[flatNodes.length]),handleExpandCollapse=import_react24.useCallback((keyName2)=>{let node=flatNodes[selectedIndex]?.node;if(!node)return;if((keyName2==="right"||keyName2==="l")&&node.children.length>0&&!node.expanded)handleToggle(node.id);else if((keyName2==="left"||keyName2==="h")&&node.expanded)handleToggle(node.id)},[flatNodes,selectedIndex,handleToggle]),handleEnter=import_react24.useCallback(()=>{let node=flatNodes[selectedIndex]?.node;if(!node)return;if(node.type==="agent"){handleEnterAgent(node,onTmuxSessionSelect);return}if(node.children.length>0)handleToggle(node.id);let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex)},[flatNodes,selectedIndex,handleToggle,onTmuxSessionSelect]),handleRetry=import_react24.useCallback(()=>{let node=flatNodes[selectedIndex]?.node;if(!node||node.type!=="agent")return;if(node.wsAgentState!=="spawning"&&node.wsAgentState!=="error")return;(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}spawnAgent(agentNameFromNode(node),onTmuxSessionSelect)})()},[flatNodes,selectedIndex,onTmuxSessionSelect]),handleContextMenu=import_react24.useCallback((nodeId)=>{let flat=flatNodes.find((n)=>n.node.id===nodeId);if(flat&&buildMenuItems(flat.node).length>0)setContextMenuNodeId(nodeId)},[flatNodes]),handleContextMenuAction=import_react24.useCallback((action,payload)=>{let node=flatNodes.find((n)=>n.node.id===contextMenuNodeId)?.node;if(!node)return;if(setContextMenuNodeId(null),action==="spawn-here"){let target=resolveSpawnHereTarget(node);if(target)setSpawnPickerTarget(target);return}dispatchContextMenuAction(action,node,payload,{sessionTree,onTmuxSessionSelect,onNewAgentWindow,openSpawnInto:setSpawnIntoAgent})},[flatNodes,contextMenuNodeId,sessionTree,onTmuxSessionSelect,onNewAgentWindow]),handleSpawnIntoConfirm=import_react24.useCallback((intent)=>{executeSpawnIntent(intent),setSpawnIntoAgent(null)},[]),handleSpawnIntoCancel=import_react24.useCallback(()=>{setSpawnIntoAgent(null)},[]),handleSpawnPickerConfirm=import_react24.useCallback((intent)=>{setSpawnPickerTarget(null),executeSpawnIntent(intent)},[]),handleSpawnPickerCancel=import_react24.useCallback(()=>{setSpawnPickerTarget(null)},[]),_menuDisabled=keyboardDisabled||contextMenuNodeId!==null,{showTeamCreate,handleOpenTeamCreate,handleTeamCreateConfirm,handleTeamCreateCancel}=useTeamCreateControls({workspaceRoot,diagnostics,onTmuxSessionSelect});useKeyboard((key)=>{if(keyboardDisabled)return;if(spawnIntoAgent!==null||spawnPickerTarget!==null)return;if(tryOpenTeamCreate(key,{workspaceRoot,showTeamCreate,contextMenuNodeId,handleOpenTeamCreate}))return;if(showTeamCreate)return;handleKeyboardInput(key,{contextMenuNodeId,flatNodes,selectedIndex,setContextMenuNodeId,handleVerticalNav,handleExpandCollapse,handleEnter,handleRetry,onNewAgentWindow})});let agentCount=workspaceRoot?sessionTree.filter((n)=>n.type==="agent").length:diagnostics?.sessions.length??0,runningCount=workspaceRoot?sessionTree.filter((n)=>n.wsAgentState==="running").length:diagnostics?.sessions.reduce((sum,s2)=>sum+s2.windows.reduce((ws,w2)=>ws+w2.panes.length,0),0)??0,headerLabel=workspaceRoot?"Agents":"Sessions";return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",width:"100%",height:"100%",backgroundColor:palette.bg,children:[import_jsx_dev_runtime2.jsxDEV("box",{height:1,paddingX:1,backgroundColor:palette.bgLight,children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:headerLabel},void 0,!1,void 0,this),diagnostics?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[" ",workspaceRoot?`${runningCount}/${agentCount}`:`${agentCount}s ${runningCount}p`]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)},void 0,!1,void 0,this),diagnostics?import_jsx_dev_runtime2.jsxDEV("scrollbox",{focused:!0,height:"100%",style:{scrollbarOptions:{showArrows:!1,trackOptions:{foregroundColor:palette.scrollThumb,backgroundColor:palette.scrollTrack}}},children:flatNodes.map((flat,i2)=>import_jsx_dev_runtime2.jsxDEV(TreeNodeRow,{node:flat.node,selected:i2===selectedIndex,onSelect:handleSelect,onToggle:handleToggle,onContextMenu:handleContextMenu},flat.node.id,!1,void 0,this))},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("box",{flexGrow:1,justifyContent:"center",alignItems:"center",children:import_jsx_dev_runtime2.jsxDEV("text",{fg:palette.textDim,children:"Collecting..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),contextMenuNodeId?import_jsx_dev_runtime2.jsxDEV(ContextMenu,{items:buildMenuItems(flatNodes.find((n)=>n.node.id===contextMenuNodeId)?.node??{}),onAction:handleContextMenuAction,onClose:()=>setContextMenuNodeId(null),positionY:flatNodes.findIndex((n)=>n.node.id===contextMenuNodeId)+1},void 0,!1,void 0,this):null,spawnIntoAgent!==null?import_jsx_dev_runtime2.jsxDEV(SpawnTargetPicker,{agentName:spawnIntoAgent,sessions:diagnostics?.sessions??[],onConfirm:handleSpawnIntoConfirm,onCancel:handleSpawnIntoCancel},void 0,!1,void 0,this):null,spawnPickerTarget!==null?import_jsx_dev_runtime2.jsxDEV(AgentPicker,{target:spawnPickerTarget,onConfirm:handleSpawnPickerConfirm,onCancel:handleSpawnPickerCancel},void 0,!1,void 0,this):null,showTeamCreate?import_jsx_dev_runtime2.jsxDEV(TeamCreate,{availableAgents:workspaceRoot?scanAgents(workspaceRoot):[],workspaceRoot,onConfirm:handleTeamCreateConfirm,onCancel:handleTeamCreateCancel},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV(SystemStats,{},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,paddingX:1,backgroundColor:palette.bgLight,children:import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:buildFooterHint(workspaceRoot)},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function useTeamCreateControls(opts){let{workspaceRoot,diagnostics,onTmuxSessionSelect}=opts,[showTeamCreate,setShowTeamCreate]=import_react24.useState(!1),pendingTeamNameRef=import_react24.useRef(null),handleOpenTeamCreate=import_react24.useCallback(()=>{if(!workspaceRoot)return;setShowTeamCreate(!0)},[workspaceRoot]),handleTeamCreateConfirm=import_react24.useCallback((result2)=>{setShowTeamCreate(!1),runTeamCreation(result2,workspaceRoot),pendingTeamNameRef.current=result2.teamName},[workspaceRoot]),handleTeamCreateCancel=import_react24.useCallback(()=>{setShowTeamCreate(!1)},[]);return import_react24.useEffect(()=>{let pending=pendingTeamNameRef.current;if(!pending||!diagnostics)return;let session=diagnostics.sessions.find((s2)=>s2.name===pending);if(!session)return;pendingTeamNameRef.current=null,onTmuxSessionSelect(session.name,resolvePreferredWindowIndex(session,pending))},[diagnostics,onTmuxSessionSelect]),{showTeamCreate,handleOpenTeamCreate,handleTeamCreateConfirm,handleTeamCreateCancel}}function handleEnterAgent(node,onTmuxSessionSelect){if(node.wsAgentState!=="running"&&node.wsAgentState!=="spawning")spawnAgent(agentNameFromNode(node),onTmuxSessionSelect);else if(node.wsAgentState==="running"){let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex)}}function dispatchContextMenuAction(action,node,payload,deps){let name=node.label;if(action==="spawn-into"&&node.type==="agent"&&deps.openSpawnInto){deps.openSpawnInto(agentNameFromNode(node));return}if(handleAttachAction(action,node,deps.onTmuxSessionSelect))return;if(handleRetryAction(action,name,deps.onTmuxSessionSelect))return;if(handleGenieAction(action,name,payload))return;let tmuxServer=process.env.GENIE_TMUX_SERVER||"genie";if(handleRenameAction(action,node,tmuxServer,payload))return;if(handleAgentWindowActions(action,node,name,tmuxServer,deps.onNewAgentWindow))return;if(handleSessionNodeActions(action,node,tmuxServer,payload))return;if(handleWindowNodeActions(action,node,deps.sessionTree,tmuxServer,payload))return;handlePaneNodeActions(action,node,deps.sessionTree,tmuxServer,deps.onNewAgentWindow)}function handleAttachAction(action,node,onTmuxSessionSelect){if(action!=="attach")return!1;let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex);return!0}function handleRetryAction(action,name,onTmuxSessionSelect){if(action!=="retry")return!1;return(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}spawnAgent(name,onTmuxSessionSelect)})(),!0}function handleGenieAction(action,name,payload){if(action==="send"&&payload)return executeGenie(["agent","send",payload,"--to",name]),!0;if(action==="answer-text"&&payload)return executeGenie(["agent","answer",name,`text:${payload}`]),!0;let genieArgs={spawn:["spawn",name],"spawn-plan":["spawn",name,"--plan-mode"],stop:["agent","stop",name],kill:["agent","kill",name],log:["agent","log",name],show:["agent","show",name],read:["read",name],"answer-yes":["agent","answer",name,"yes"],"answer-no":["agent","answer",name,"no"]}[action];if(genieArgs)return executeGenie(genieArgs),!0;return!1}function handleRenameAction(action,node,tmuxServer,payload){if(action==="rename-session"&&payload){let sess=node.type==="agent"?node.data.sessionName||node.label:node.id.split(":").slice(1).join(":");return executeTmux3(["-L",tmuxServer,"rename-session","-t",sess,payload]),!0}if(action==="rename-window"&&payload){let idParts=node.id.split(":"),windowTarget=`${idParts[1]}:${idParts[2]}`;return executeTmux3(["-L",tmuxServer,"rename-window","-t",windowTarget,payload]),!0}if(action==="rename-pane"&&payload&&node.type==="pane"){let paneId=node.data.paneId;return executeTmux3(["-L",tmuxServer,"select-pane","-t",`${paneId}`,"-T",payload]),!0}return!1}function handleAgentWindowActions(action,node,name,tmuxServer,onNewAgentWindow){if(action==="agent-new-window"&&node.type==="agent"){if(onNewAgentWindow)onNewAgentWindow(agentNameFromNode(node));return!0}if(action==="new-empty-window"&&node.type==="agent"){let sessionName=node.data.sessionName||name;return executeTmux3(["-L",tmuxServer,"new-window","-a","-t",sessionName]),!0}return!1}function handleSessionNodeActions(action,node,tmuxServer,payload){if(node.type!=="session")return!1;let sess=node.id.split(":").slice(1).join(":");if(action==="kill-session")return executeTmux3(["-L",tmuxServer,"kill-session","-t",sess]),!0;if(action==="new-window")return executeTmux3(["-L",tmuxServer,"new-window","-a","-t",sess]),!0;if(action==="clone-session")return executeTmux3(["-L",tmuxServer,"new-session","-d","-s",`${sess}-clone`,"-t",sess]),!0;if(action==="spawn-in-session"&&payload)return executeGenie(["spawn",payload,"--session",sess]),!0;return!1}function handleWindowNodeActions(action,node,sessionTree,tmuxServer,payload){if(node.type!=="window")return!1;let idParts=node.id.split(":"),windowTarget=`${idParts[1]}:${idParts[2]}`;if(action==="kill-window")return executeTmux3(["-L",tmuxServer,"kill-window","-t",windowTarget]),!0;if(action==="window-new-agent"){let parentAgent=findParentAgent(sessionTree,node.id);if(parentAgent){let agentFullName=agentNameFromNode(parentAgent),suffix=Date.now()%1e4,role=`${agentFullName}-${suffix}`;executeGenie(["spawn",agentFullName,"--role",role,"--window",windowTarget])}return!0}if(action==="split-pane")return executeTmux3(["-L",tmuxServer,"split-window","-t",windowTarget]),!0;if(action==="spawn-in-window"&&payload)return executeGenie(["spawn",payload,"--session",idParts[1]]),!0;return!1}function handlePaneNodeActions(action,node,sessionTree,tmuxServer,onNewAgentWindow){if(node.type!=="pane")return!1;let paneId=node.data.paneId;if(action==="clone-agent"){let parentAgent=findParentAgent(sessionTree,node.id);if(parentAgent&&onNewAgentWindow)onNewAgentWindow(agentNameFromNode(parentAgent));return!0}if(action==="kill-pane")return executeTmux3(["-L",tmuxServer,"kill-pane","-t",`${paneId}`]),!0;if(action==="split-h")return executeTmux3(["-L",tmuxServer,"split-window","-h","-t",`${paneId}`]),!0;if(action==="split-v")return executeTmux3(["-L",tmuxServer,"split-window","-v","-t",`${paneId}`]),!0;return!1}function buildFooterHint(workspaceRoot){return`\u2191\u2193:nav \u2190\u2192:expand Enter:${workspaceRoot?"spawn/attach":"attach"} ^T:new${workspaceRoot?" ^N:team":""} R:retry .:menu`}function tryOpenTeamCreate(key,opts){if(!key.ctrl||key.name!=="n")return!1;if(!opts.workspaceRoot||opts.showTeamCreate||opts.contextMenuNodeId)return!1;return opts.handleOpenTeamCreate(),!0}function tryOpenContextMenu(flatNodes,selectedIndex,setContextMenuNodeId){let node=flatNodes[selectedIndex]?.node;if(node&&buildMenuItems(node).length>0)return setContextMenuNodeId(node.id),!0;return!1}function dispatchNavKey(key,handlers2,agentAction){let n=key.name;if(n==="up"||n==="k"||n==="down"||n==="j")handlers2.handleVerticalNav(n);else if(n==="right"||n==="l"||n==="left"||n==="h")handlers2.handleExpandCollapse(n);else if(n==="enter"||n==="return")handlers2.handleEnter();else if(n==="r")handlers2.handleRetry();else if(key.ctrl&&n==="t")agentAction()}function handleKeyboardInput(key,opts){if(key.name==="."&&!opts.contextMenuNodeId){if(tryOpenContextMenu(opts.flatNodes,opts.selectedIndex,opts.setContextMenuNodeId))return}if(opts.contextMenuNodeId)return;dispatchNavKey(key,opts,()=>{let node=opts.flatNodes[opts.selectedIndex]?.node;if(node?.type==="agent"&&node.wsAgentState==="running"&&opts.onNewAgentWindow)opts.onNewAgentWindow(agentNameFromNode(node))})}function agentNameFromNode(node){return node.id.replace(/^agent:/,"")}function spawnAgent(name,onTmuxSessionSelect){try{let{spawn:spawn5}=__require("child_process"),{join:join69,resolve:resolve14}=__require("path"),{existsSync:existsSync57,mkdirSync:mkdirSync24,openSync:openSync3}=__require("fs"),{homedir:homedir37}=__require("os"),bunPath=process.execPath||"bun",genieBin=process.argv[1],wsRoot=process.env.GENIE_TUI_WORKSPACE,sessionName=name.replace(/\//g,"-"),cwd;if(wsRoot){let parentName=name.includes("/")?name.slice(0,name.indexOf("/")):name,agentDir=resolve14(join69(wsRoot,"agents",parentName));if(existsSync57(agentDir))cwd=agentDir}let{GENIE_TUI_PANE:_a,GENIE_TUI_RIGHT:_b,GENIE_TUI_WORKSPACE:_c,GENIE_IS_DAEMON:_d,...cleanEnv}=process.env,logDir=join69(homedir37(),".genie","logs","tui-spawn");try{mkdirSync24(logDir,{recursive:!0})}catch{}let logPath=join69(logDir,`${sessionName}-${Date.now()}.log`),logFd;try{logFd=openSync3(logPath,"a")}catch{logFd=void 0}let spawnOpts=logFd!==void 0?{detached:!0,stdio:["ignore",logFd,logFd],cwd,env:cleanEnv}:{detached:!0,stdio:"ignore",cwd,env:cleanEnv},child=genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,"spawn",name,"--session",sessionName,"--new-window"],spawnOpts):spawn5("genie",["spawn",name,"--session",sessionName,"--new-window"],spawnOpts);if(child.on("exit",(code)=>{if(code&&code!==0)console.error(`TUI: spawn "${name}" exited ${code}. See ${logPath}`)}),child.on("error",(err)=>{console.error(`TUI: spawn "${name}" error: ${err.message}. See ${logPath}`)}),child.unref(),onTmuxSessionSelect)attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect)}catch(err){console.error(`TUI: spawn failed for ${name}:`,err instanceof Error?err.message:err)}}function attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect,attempt=0){(async()=>{try{let session=(await collectDiagnostics()).sessions.find((candidate)=>candidate.name===sessionName);if(session){let windowIndex=resolvePreferredWindowIndex(session,sessionName);if(windowIndex!==void 0){onTmuxSessionSelect(sessionName,windowIndex);return}}}catch{}if(attempt>=40){onTmuxSessionSelect(sessionName);return}setTimeout(()=>{attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect,attempt+1)},250)})()}function executeTmux3(args){try{let{spawn:spawn5}=__require("child_process");spawn5("tmux",args,{detached:!0,stdio:"ignore"}).unref()}catch{}}function executeGenie(args){try{let{spawn:spawn5}=__require("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1];(genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{detached:!0,stdio:"ignore"}):spawn5("genie",args,{detached:!0,stdio:"ignore"})).unref()}catch{}}function executeGenieAwaited(args){return new Promise((resolve14,reject)=>{try{let{spawn:spawn5}=__require("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1],child=genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{stdio:"ignore"}):spawn5("genie",args,{stdio:"ignore"});child.on("exit",(code)=>resolve14(code)),child.on("error",reject)}catch(err){reject(err instanceof Error?err:Error(String(err)))}})}function resolveSpawnHereTarget(node){if(node.type==="session"){let sess=node.id.split(":").slice(1).join(":");if(sess.length===0)return null;return{session:sess}}if(node.type==="window"){let idParts=node.id.split(":");if(idParts.length<3)return null;return{session:idParts[1],window:`${idParts[1]}:${idParts[2]}`}}return null}function executeSpawnIntent(intent){try{let{argv}=buildSpawnInvocation(intent);executeGenie(argv)}catch(err){console.error("TUI: spawn-intent execution failed:",err instanceof Error?err.message:err)}}async function runTeamCreation(result2,workspaceRoot){let argv;try{({argv}=buildSpawnInvocation({kind:"create-team",name:result2.teamName,repo:workspaceRoot}))}catch(err){console.error("TUI: team create intent build failed:",err instanceof Error?err.message:err);return}let createExit=null;try{createExit=await executeGenieAwaited(argv)}catch(err){console.error("TUI: team create spawn failed:",err instanceof Error?err.message:err);return}if(createExit!==0){console.error(`TUI: team create exited ${createExit} \u2014 skipping member hires for "${result2.teamName}"`);return}for(let member of result2.members)try{let code=await executeGenieAwaited(["team","hire",member,"--team",result2.teamName]);if(code!==0)console.error(`TUI: team hire "${member}" exited ${code} \u2014 continuing with remaining members`)}catch(err){console.error(`TUI: team hire "${member}" failed:`,err instanceof Error?err.message:err)}}function findParentAgent(tree,targetId){for(let node of tree){if(node.type==="agent"&&containsNode(node,targetId))return node;let found=findParentAgent(node.children,targetId);if(found)return found}return null}function containsNode(node,targetId){if(node.id===targetId)return!0;return node.children.some((c)=>containsNode(c,targetId))}function mergeExpandedState(oldTree,newTree){if(oldTree.length===0)return newTree;let oldState=new Map;function collect(nodes){for(let n of nodes)oldState.set(n.id,{expanded:n.expanded,childCount:n.children.length}),collect(n.children)}collect(oldTree);function apply(nodes){return nodes.map((n)=>({...n,expanded:(()=>{let previous=oldState.get(n.id);if(!previous)return n.expanded;if(previous.childCount===0&&n.children.length>0)return n.expanded;return previous.expanded})(),children:apply(n.children)}))}return apply(newTree)}var import_react24;var init_Nav=__esm(async()=>{init_spawn_invocation();init_workspace();init_diagnostics();init_initial_agent();init_theme2();init_SystemStats();init_TreeNode();init_jsx_dev_runtime();await __promiseAll([init_react(),init_AgentPicker(),init_ContextMenu(),init_SpawnTargetPicker(),init_TeamCreate()]);import_react24=__toESM(require_react_development(),1)});function QuitDialog({onConfirm,onCancel}){return useKeyboard((key)=>{if(key.name==="enter"||key.name==="return"||key.name==="y")onConfirm();else if(key.name==="escape"||key.name==="n")onCancel()}),import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:"#0a0a0a",children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderColor:palette.violet,backgroundColor:"#111111",paddingX:3,paddingY:1,flexDirection:"column",alignItems:"center",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"Quit genie?"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:"Enter"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:" to quit "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:" | "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:" Esc"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:" to cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Hint: Ctrl+D to detach (keep running)"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var init_QuitDialog=__esm(async()=>{init_theme2();init_jsx_dev_runtime();await init_react()});import{execSync as execSync19}from"child_process";import{readFileSync as readFileSync36}from"fs";function App({rightPane,workspaceRoot,initialAgent}){let[showQuit,setShowQuit]=import_react27.useState(!1);useKeyboard((key)=>{if(key.ctrl&&key.name==="q")if(showQuit)handleQuit();else setShowQuit(!0)});let handleQuit=import_react27.useCallback(()=>{try{let genieHome6=process.env.GENIE_HOME??`${process.env.HOME}/.genie`,pid=readFileSync36(`${genieHome6}/serve.pid`,"utf-8").trim();process.kill(Number.parseInt(pid,10),"SIGTERM")}catch{}try{execSync19("tmux -L genie-tui kill-server",{stdio:"ignore"})}catch{}},[]),handleTmuxSessionSelect=import_react27.useCallback((sessionName,windowIndex)=>{if(!rightPane)return;attachProjectWindow(rightPane,sessionName,windowIndex)},[rightPane]);return import_jsx_dev_runtime2.jsxDEV("box",{width:"100%",height:"100%",children:[import_jsx_dev_runtime2.jsxDEV(Nav,{onTmuxSessionSelect:handleTmuxSessionSelect,onNewAgentWindow:newAgentWindow,workspaceRoot,initialAgent,keyboardDisabled:showQuit},void 0,!1,void 0,this),showQuit?import_jsx_dev_runtime2.jsxDEV(QuitDialog,{onConfirm:handleQuit,onCancel:()=>setShowQuit(!1)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}var import_react27;var init_app=__esm(async()=>{init_tmux2();init_jsx_dev_runtime();await __promiseAll([init_react(),init_Nav(),init_QuitDialog()]);import_react27=__toESM(require_react_development(),1)});var exports_render={};__export(exports_render,{renderNav:()=>renderNav});async function renderNav(){let rightPane=process.env.GENIE_TUI_RIGHT||void 0,workspaceRoot=process.env.GENIE_TUI_WORKSPACE||void 0,initialAgent=process.env.GENIE_TUI_AGENT||void 0,renderer=await createCliRenderer({exitOnCtrlC:!1,useMouse:!0});createRoot(renderer).render(import_jsx_dev_runtime2.jsxDEV(App,{rightPane,workspaceRoot,initialAgent},void 0,!1,void 0,this)),await new Promise((resolve14)=>{renderer.once("destroy",resolve14)})}var init_render=__esm(async()=>{init_jsx_dev_runtime();await __promiseAll([init_core(),init_react(),init_app()])});var exports_tui={};__export(exports_tui,{launchTui:()=>launchTui});async function launchTui(){let{renderNav:renderNav2}=await init_render().then(() => exports_render);await renderNav2()}var exports_resolve_agent_cwd={};__export(exports_resolve_agent_cwd,{resolveAgentFromCwd:()=>resolveAgentFromCwd});import{existsSync as existsSync57}from"fs";import{basename as basename14,dirname as dirname17,join as join69,relative as relative7,sep as sep3}from"path";function isRelativeWithin(rel,original){return!rel.startsWith("..")&&rel!==original}function resolveFromCanonicalDir(cwd,agentsDir){let relToAgents=relative7(agentsDir,cwd);if(!isRelativeWithin(relToAgents,cwd))return null;let segments=relToAgents.split(sep3).filter(Boolean);if(segments.length===0)return null;let agentName=segments[0];if(!existsSync57(join69(agentsDir,agentName,"AGENTS.md")))return null;let source=segments.length===1?"exact":"parent";return{agent:agentName,source}}function resolveFromWalkUp(cwd,workspaceRoot){let wsRel=relative7(workspaceRoot,cwd);if(!isRelativeWithin(wsRel,cwd))return null;let current=cwd;while(current!==workspaceRoot&¤t!==dirname17(current)){if(existsSync57(join69(current,"AGENTS.md")))return{agent:basename14(current),source:"parent"};current=dirname17(current)}return null}function resolveAgentFromCwd(cwd,workspaceRoot){return resolveFromCanonicalDir(cwd,join69(workspaceRoot,"agents"))??resolveFromWalkUp(cwd,workspaceRoot)??{agent:"genie",source:"default"}}var init_resolve_agent_cwd=()=>{};var import__=__toESM(require_commander(),1),{program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help}=import__.default;init_claude_settings();init_ensure_tmux();init_genie_config2();init_system_detect();init_workspace();import{existsSync as existsSync16,readFileSync as readFileSync11,readdirSync as readdirSync5,statSync as statSync2,unlinkSync as unlinkSync6}from"fs";import{homedir as homedir15}from"os";import{join as join18}from"path";var{$:$3}=globalThis.Bun;init_db();init_emit();import{existsSync as existsSync14,readFileSync as readFileSync9}from"fs";import{homedir as homedir13}from"os";import{join as join16}from"path";var WATCHER_META_TYPES=["emitter.rejected","emitter.queue.depth","emitter.latency_p99","notify.delivery.lag","stream.gap.detected","correlation.orphan.rate"];function spillJournalPath(){let home=process.env.GENIE_HOME??join16(homedir13(),".genie");return join16(home,"data","emit-spill.jsonl")}function collectWatchdogStatus(){let timerPresent=existsSync14("/etc/systemd/system/genie-watchdog.timer"),servicePresent=existsSync14("/etc/systemd/system/genie-watchdog.service");if(timerPresent&&servicePresent)return{status:"ok"};if(!timerPresent&&!servicePresent)return{status:"warn",detail:"watchdog not installed \u2014 run: bun run packages/watchdog/src/cli.ts install"};return{status:"warn",detail:`partial install: timer=${timerPresent} service=${servicePresent}`}}function collectSpillJournalStatus(){try{if(isSpillJournalEmpty())return"empty";return"pending"}catch{let path2=spillJournalPath();try{if(!existsSync14(path2))return"empty";return readFileSync9(path2,"utf8").trim().length===0?"empty":"pending"}catch{return"unknown"}}}async function collectWatcherMetricStatus(sql){let rows=await sql.unsafe(`
|
|
3528
|
+
`);if(util4.getValue(lines,"name",":"))result2.push(parseWindowsAudio(lines))});if(callback)callback(result2);resolve14(result2)});if(_sunos)resolve14(null)})})}exports.audio=audio});var require_bluetoothVendors=__commonJS((exports,module2)=>{module2.exports={0:"Ericsson Technology Licensing",1:"Nokia Mobile Phones",2:"Intel Corp.",3:"IBM Corp.",4:"Toshiba Corp.",5:"3Com",6:"Microsoft",7:"Lucent",8:"Motorola",9:"Infineon Technologies AG",10:"Cambridge Silicon Radio",11:"Silicon Wave",12:"Digianswer A/S",13:"Texas Instruments Inc.",14:"Ceva, Inc. (formerly Parthus Technologies, Inc.)",15:"Broadcom Corporation",16:"Mitel Semiconductor",17:"Widcomm, Inc",18:"Zeevo, Inc.",19:"Atmel Corporation",20:"Mitsubishi Electric Corporation",21:"RTX Telecom A/S",22:"KC Technology Inc.",23:"NewLogic",24:"Transilica, Inc.",25:"Rohde & Schwarz GmbH & Co. KG",26:"TTPCom Limited",27:"Signia Technologies, Inc.",28:"Conexant Systems Inc.",29:"Qualcomm",30:"Inventel",31:"AVM Berlin",32:"BandSpeed, Inc.",33:"Mansella Ltd",34:"NEC Corporation",35:"WavePlus Technology Co., Ltd.",36:"Alcatel",37:"NXP Semiconductors (formerly Philips Semiconductors)",38:"C Technologies",39:"Open Interface",40:"R F Micro Devices",41:"Hitachi Ltd",42:"Symbol Technologies, Inc.",43:"Tenovis",44:"Macronix International Co. Ltd.",45:"GCT Semiconductor",46:"Norwood Systems",47:"MewTel Technology Inc.",48:"ST Microelectronics",49:"Synopsis",50:"Red-M (Communications) Ltd",51:"Commil Ltd",52:"Computer Access Technology Corporation (CATC)",53:"Eclipse (HQ Espana) S.L.",54:"Renesas Electronics Corporation",55:"Mobilian Corporation",56:"Terax",57:"Integrated System Solution Corp.",58:"Matsushita Electric Industrial Co., Ltd.",59:"Gennum Corporation",60:"BlackBerry Limited (formerly Research In Motion)",61:"IPextreme, Inc.",62:"Systems and Chips, Inc.",63:"Bluetooth SIG, Inc.",64:"Seiko Epson Corporation",65:"Integrated Silicon Solution Taiwan, Inc.",66:"CONWISE Technology Corporation Ltd",67:"PARROT SA",68:"Socket Mobile",69:"Atheros Communications, Inc.",70:"MediaTek, Inc.",71:"Bluegiga",72:"Marvell Technology Group Ltd.",73:"3DSP Corporation",74:"Accel Semiconductor Ltd.",75:"Continental Automotive Systems",76:"Apple, Inc.",77:"Staccato Communications, Inc.",78:"Avago Technologies",79:"APT Licensing Ltd.",80:"SiRF Technology",81:"Tzero Technologies, Inc.",82:"J&M Corporation",83:"Free2move AB",84:"3DiJoy Corporation",85:"Plantronics, Inc.",86:"Sony Ericsson Mobile Communications",87:"Harman International Industries, Inc.",88:"Vizio, Inc.",89:"Nordic Semiconductor ASA",90:"EM Microelectronic-Marin SA",91:"Ralink Technology Corporation",92:"Belkin International, Inc.",93:"Realtek Semiconductor Corporation",94:"Stonestreet One, LLC",95:"Wicentric, Inc.",96:"RivieraWaves S.A.S",97:"RDA Microelectronics",98:"Gibson Guitars",99:"MiCommand Inc.",100:"Band XI International, LLC",101:"Hewlett-Packard Company",102:"9Solutions Oy",103:"GN Netcom A/S",104:"General Motors",105:"A&D Engineering, Inc.",106:"MindTree Ltd.",107:"Polar Electro OY",108:"Beautiful Enterprise Co., Ltd.",109:"BriarTek, Inc.",110:"Summit Data Communications, Inc.",111:"Sound ID",112:"Monster, LLC",113:"connectBlue AB",114:"ShangHai Super Smart Electronics Co. Ltd.",115:"Group Sense Ltd.",116:"Zomm, LLC",117:"Samsung Electronics Co. Ltd.",118:"Creative Technology Ltd.",119:"Laird Technologies",120:"Nike, Inc.",121:"lesswire AG",122:"MStar Semiconductor, Inc.",123:"Hanlynn Technologies",124:"A & R Cambridge",125:"Seers Technology Co. Ltd",126:"Sports Tracking Technologies Ltd.",127:"Autonet Mobile",128:"DeLorme Publishing Company, Inc.",129:"WuXi Vimicro",130:"Sennheiser Communications A/S",131:"TimeKeeping Systems, Inc.",132:"Ludus Helsinki Ltd.",133:"BlueRadios, Inc.",134:"equinox AG",135:"Garmin International, Inc.",136:"Ecotest",137:"GN ReSound A/S",138:"Jawbone",139:"Topcorn Positioning Systems, LLC",140:"Gimbal Inc. (formerly Qualcomm Labs, Inc. and Qualcomm Retail Solutions, Inc.)",141:"Zscan Software",142:"Quintic Corp.",143:"Stollman E+V GmbH",144:"Funai Electric Co., Ltd.",145:"Advanced PANMOBIL Systems GmbH & Co. KG",146:"ThinkOptics, Inc.",147:"Universal Electronics, Inc.",148:"Airoha Technology Corp.",149:"NEC Lighting, Ltd.",150:"ODM Technology, Inc.",151:"ConnecteDevice Ltd.",152:"zer01.tv GmbH",153:"i.Tech Dynamic Global Distribution Ltd.",154:"Alpwise",155:"Jiangsu Toppower Automotive Electronics Co., Ltd.",156:"Colorfy, Inc.",157:"Geoforce Inc.",158:"Bose Corporation",159:"Suunto Oy",160:"Kensington Computer Products Group",161:"SR-Medizinelektronik",162:"Vertu Corporation Limited",163:"Meta Watch Ltd.",164:"LINAK A/S",165:"OTL Dynamics LLC",166:"Panda Ocean Inc.",167:"Visteon Corporation",168:"ARP Devices Limited",169:"Magneti Marelli S.p.A",170:"CAEN RFID srl",171:"Ingenieur-Systemgruppe Zahn GmbH",172:"Green Throttle Games",173:"Peter Systemtechnik GmbH",174:"Omegawave Oy",175:"Cinetix",176:"Passif Semiconductor Corp",177:"Saris Cycling Group, Inc",178:"Bekey A/S",179:"Clarinox Technologies Pty. Ltd.",180:"BDE Technology Co., Ltd.",181:"Swirl Networks",182:"Meso international",183:"TreLab Ltd",184:"Qualcomm Innovation Center, Inc. (QuIC)",185:"Johnson Controls, Inc.",186:"Starkey Laboratories Inc.",187:"S-Power Electronics Limited",188:"Ace Sensor Inc",189:"Aplix Corporation",190:"AAMP of America",191:"Stalmart Technology Limited",192:"AMICCOM Electronics Corporation",193:"Shenzhen Excelsecu Data Technology Co.,Ltd",194:"Geneq Inc.",195:"adidas AG",196:"LG Electronics",197:"Onset Computer Corporation",198:"Selfly BV",199:"Quuppa Oy.",200:"GeLo Inc",201:"Evluma",202:"MC10",203:"Binauric SE",204:"Beats Electronics",205:"Microchip Technology Inc.",206:"Elgato Systems GmbH",207:"ARCHOS SA",208:"Dexcom, Inc.",209:"Polar Electro Europe B.V.",210:"Dialog Semiconductor B.V.",211:"Taixingbang\xA0Technology (HK) Co,. LTD.",212:"Kawantech",213:"Austco Communication Systems",214:"Timex Group USA, Inc.",215:"Qualcomm Technologies, Inc.",216:"Qualcomm Connected Experiences, Inc.",217:"Voyetra Turtle Beach",218:"txtr GmbH",219:"Biosentronics",220:"Procter & Gamble",221:"Hosiden Corporation",222:"Muzik LLC",223:"Misfit Wearables Corp",224:"Google",225:"Danlers Ltd",226:"Semilink Inc",227:"inMusic Brands, Inc",228:"L.S. Research Inc.",229:"Eden Software Consultants Ltd.",230:"Freshtemp",231:"KS Technologies",232:"ACTS Technologies",233:"Vtrack Systems",234:"Nielsen-Kellerman Company",235:"Server Technology, Inc.",236:"BioResearch Associates",237:"Jolly Logic, LLC",238:"Above Average Outcomes, Inc.",239:"Bitsplitters GmbH",240:"PayPal, Inc.",241:"Witron Technology Limited",242:"Aether Things\xA0Inc. (formerly Morse Project Inc.)",243:"Kent Displays Inc.",244:"Nautilus Inc.",245:"Smartifier Oy",246:"Elcometer Limited",247:"VSN Technologies Inc.",248:"AceUni Corp., Ltd.",249:"StickNFind",250:"Crystal Code AB",251:"KOUKAAM a.s.",252:"Delphi Corporation",253:"ValenceTech Limited",254:"Reserved",255:"Typo Products, LLC",256:"TomTom International BV",257:"Fugoo, Inc",258:"Keiser Corporation",259:"Bang & Olufsen A/S",260:"PLUS Locations Systems Pty Ltd",261:"Ubiquitous Computing Technology Corporation",262:"Innovative Yachtter Solutions",263:"William Demant Holding A/S",264:"Chicony Electronics Co., Ltd.",265:"Atus BV",266:"Codegate Ltd.",267:"ERi, Inc.",268:"Transducers Direct, LLC",269:"Fujitsu Ten Limited",270:"Audi AG",271:"HiSilicon Technologies Co., Ltd.",272:"Nippon Seiki Co., Ltd.",273:"Steelseries ApS",274:"vyzybl Inc.",275:"Openbrain Technologies, Co., Ltd.",276:"Xensr",277:"e.solutions",278:"1OAK Technologies",279:"Wimoto Technologies Inc",280:"Radius Networks, Inc.",281:"Wize Technology Co., Ltd.",282:"Qualcomm Labs, Inc.",283:"Aruba Networks",284:"Baidu",285:"Arendi AG",286:"Skoda Auto a.s.",287:"Volkswagon AG",288:"Porsche AG",289:"Sino Wealth Electronic Ltd.",290:"AirTurn, Inc.",291:"Kinsa, Inc.",292:"HID Global",293:"SEAT es",294:"Promethean Ltd.",295:"Salutica Allied Solutions",296:"GPSI Group Pty Ltd",297:"Nimble Devices Oy",298:"Changzhou Yongse Infotech Co., Ltd",299:"SportIQ",300:"TEMEC Instruments B.V.",301:"Sony Corporation",302:"ASSA ABLOY",303:"Clarion Co., Ltd.",304:"Warehouse Innovations",305:"Cypress Semiconductor Corporation",306:"MADS Inc",307:"Blue Maestro Limited",308:"Resolution Products, Inc.",309:"Airewear LLC",310:"Seed Labs, Inc. (formerly ETC sp. z.o.o.)",311:"Prestigio Plaza Ltd.",312:"NTEO Inc.",313:"Focus Systems Corporation",314:"Tencent Holdings Limited",315:"Allegion",316:"Murata Manufacuring Co., Ltd.",318:"Nod, Inc.",319:"B&B Manufacturing Company",320:"Alpine\xA0Electronics\xA0(China)\xA0Co.,\xA0Ltd",321:"FedEx Services",322:"Grape Systems Inc.",323:"Bkon Connect",324:"Lintech GmbH",325:"Novatel Wireless",326:"Ciright",327:"Mighty Cast, Inc.",328:"Ambimat Electronics",329:"Perytons Ltd.",330:"Tivoli Audio, LLC",331:"Master Lock",332:"Mesh-Net Ltd",333:"Huizhou Desay SV Automotive CO., LTD.",334:"Tangerine, Inc.",335:"B&W Group Ltd.",336:"Pioneer Corporation",337:"OnBeep",338:"Vernier Software & Technology",339:"ROL Ergo",340:"Pebble Technology",341:"NETATMO",342:"Accumulate AB",343:"Anhui Huami Information Technology Co., Ltd.",344:"Inmite s.r.o.",345:"ChefSteps, Inc.",346:"micas AG",347:"Biomedical Research Ltd.",348:"Pitius Tec S.L.",349:"Estimote, Inc.",350:"Unikey Technologies, Inc.",351:"Timer Cap Co.",352:"AwoX",353:"yikes",354:"MADSGlobal NZ Ltd.",355:"PCH International",356:"Qingdao Yeelink Information Technology Co., Ltd.",357:"Milwaukee Tool (formerly Milwaukee Electric Tools)",358:"MISHIK Pte Ltd",359:"Bayer HealthCare",360:"Spicebox LLC",361:"emberlight",362:"Cooper-Atkins Corporation",363:"Qblinks",364:"MYSPHERA",365:"LifeScan Inc",366:"Volantic AB",367:"Podo Labs, Inc",368:"Roche Diabetes Care AG",369:"Amazon Fulfillment Service",370:"Connovate Technology Private Limited",371:"Kocomojo, LLC",372:"Everykey LLC",373:"Dynamic Controls",374:"SentriLock",375:"I-SYST inc.",376:"CASIO COMPUTER CO., LTD.",377:"LAPIS Semiconductor Co., Ltd.",378:"Telemonitor, Inc.",379:"taskit GmbH",380:"Daimler AG",381:"BatAndCat",382:"BluDotz Ltd",383:"XTel ApS",384:"Gigaset Communications GmbH",385:"Gecko Health Innovations, Inc.",386:"HOP Ubiquitous",387:"To Be Assigned",388:"Nectar",389:"bel\u2019apps LLC",390:"CORE Lighting Ltd",391:"Seraphim Sense Ltd",392:"Unico RBC",393:"Physical Enterprises Inc.",394:"Able Trend Technology Limited",395:"Konica Minolta, Inc.",396:"Wilo SE",397:"Extron Design Services",398:"Fitbit, Inc.",399:"Fireflies Systems",400:"Intelletto Technologies Inc.",401:"FDK CORPORATION",402:"Cloudleaf, Inc",403:"Maveric Automation LLC",404:"Acoustic Stream Corporation",405:"Zuli",406:"Paxton Access Ltd",407:"WiSilica Inc",408:"Vengit Limited",409:"SALTO SYSTEMS S.L.",410:"TRON Forum (formerly T-Engine Forum)",411:"CUBETECH s.r.o.",412:"Cokiya Incorporated",413:"CVS Health",414:"Ceruus",415:"Strainstall Ltd",416:"Channel Enterprises (HK) Ltd.",417:"FIAMM",418:"GIGALANE.CO.,LTD",419:"EROAD",420:"Mine Safety Appliances",421:"Icon Health and Fitness",422:"Asandoo GmbH",423:"ENERGOUS CORPORATION",424:"Taobao",425:"Canon Inc.",426:"Geophysical Technology Inc.",427:"Facebook, Inc.",428:"Nipro Diagnostics, Inc.",429:"FlightSafety International",430:"Earlens Corporation",431:"Sunrise Micro Devices, Inc.",432:"Star Micronics Co., Ltd.",433:"Netizens Sp. z o.o.",434:"Nymi Inc.",435:"Nytec, Inc.",436:"Trineo Sp. z o.o.",437:"Nest Labs Inc.",438:"LM Technologies Ltd",439:"General Electric Company",440:"i+D3 S.L.",441:"HANA Micron",442:"Stages Cycling LLC",443:"Cochlear Bone Anchored Solutions AB",444:"SenionLab AB",445:"Syszone Co., Ltd",446:"Pulsate Mobile Ltd.",447:"Hong Kong HunterSun Electronic Limited",448:"pironex GmbH",449:"BRADATECH Corp.",450:"Transenergooil AG",451:"Bunch",452:"DME Microelectronics",453:"Bitcraze AB",454:"HASWARE Inc.",455:"Abiogenix Inc.",456:"Poly-Control ApS",457:"Avi-on",458:"Laerdal Medical AS",459:"Fetch My Pet",460:"Sam Labs Ltd.",461:"Chengdu Synwing Technology Ltd",462:"HOUWA SYSTEM DESIGN, k.k.",463:"BSH",464:"Primus Inter Pares Ltd",465:"August",466:"Gill Electronics",467:"Sky Wave Design",468:"Newlab S.r.l.",469:"ELAD srl",470:"G-wearables inc.",471:"Squadrone Systems Inc.",472:"Code Corporation",473:"Savant Systems LLC",474:"Logitech International SA",475:"Innblue Consulting",476:"iParking Ltd.",477:"Koninklijke Philips Electronics N.V.",478:"Minelab Electronics Pty Limited",479:"Bison Group Ltd.",480:"Widex A/S",481:"Jolla Ltd",482:"Lectronix, Inc.",483:"Caterpillar Inc",484:"Freedom Innovations",485:"Dynamic Devices Ltd",486:"Technology Solutions (UK) Ltd",487:"IPS Group Inc.",488:"STIR",489:"Sano, Inc",490:"Advanced Application Design, Inc.",491:"AutoMap LLC",492:"Spreadtrum Communications Shanghai Ltd",493:"CuteCircuit LTD",494:"Valeo Service",495:"Fullpower Technologies, Inc.",496:"KloudNation",497:"Zebra Technologies Corporation",498:"Itron, Inc.",499:"The University of Tokyo",500:"UTC Fire and Security",501:"Cool Webthings Limited",502:"DJO Global",503:"Gelliner Limited",504:"Anyka (Guangzhou) Microelectronics Technology Co, LTD",505:"Medtronic, Inc.",506:"Gozio, Inc.",507:"Form Lifting, LLC",508:"Wahoo Fitness, LLC",509:"Kontakt Micro-Location Sp. z o.o.",510:"Radio System Corporation",511:"Freescale Semiconductor, Inc.",512:"Verifone Systems PTe Ltd. Taiwan Branch",513:"AR Timing",514:"Rigado LLC",515:"Kemppi Oy",516:"Tapcentive Inc.",517:"Smartbotics Inc.",518:"Otter Products, LLC",519:"STEMP Inc.",520:"LumiGeek LLC",521:"InvisionHeart Inc.",522:"Macnica Inc. ",523:"Jaguar Land Rover Limited",524:"CoroWare Technologies, Inc",525:"Simplo Technology Co., LTD",526:"Omron Healthcare Co., LTD",527:"Comodule GMBH",528:"ikeGPS",529:"Telink Semiconductor Co. Ltd",530:"Interplan Co., Ltd",531:"Wyler AG",532:"IK Multimedia Production srl",533:"Lukoton Experience Oy",534:"MTI Ltd",535:"Tech4home, Lda",536:"Hiotech AB",537:"DOTT Limited",538:"Blue Speck Labs, LLC",539:"Cisco Systems, Inc",540:"Mobicomm Inc",541:"Edamic",542:"Goodnet, Ltd",543:"Luster Leaf Products Inc",544:"Manus Machina BV",545:"Mobiquity Networks Inc",546:"Praxis Dynamics",547:"Philip Morris Products S.A.",548:"Comarch SA",549:"Nestl Nespresso S.A.",550:"Merlinia A/S",551:"LifeBEAM Technologies",552:"Twocanoes Labs, LLC",553:"Muoverti Limited",554:"Stamer Musikanlagen GMBH",555:"Tesla Motors",556:"Pharynks Corporation",557:"Lupine",558:"Siemens AG",559:"Huami (Shanghai) Culture Communication CO., LTD",560:"Foster Electric Company, Ltd",561:"ETA SA",562:"x-Senso Solutions Kft",563:"Shenzhen SuLong Communication Ltd",564:"FengFan (BeiJing) Technology Co, Ltd",565:"Qrio Inc",566:"Pitpatpet Ltd",567:"MSHeli s.r.l.",568:"Trakm8 Ltd",569:"JIN CO, Ltd",570:"Alatech Tehnology",571:"Beijing CarePulse Electronic Technology Co, Ltd",572:"Awarepoint",573:"ViCentra B.V.",574:"Raven Industries",575:"WaveWare Technologies Inc.",576:"Argenox Technologies",577:"Bragi GmbH",578:"16Lab Inc",579:"Masimo Corp",580:"Iotera Inc",581:"Endress+Hauser",582:"ACKme Networks, Inc.",583:"FiftyThree Inc.",584:"Parker Hannifin Corp",585:"Transcranial Ltd",586:"Uwatec AG",587:"Orlan LLC",588:"Blue Clover Devices",589:"M-Way Solutions GmbH",590:"Microtronics Engineering GmbH",591:"Schneider Schreibgerte GmbH",592:"Sapphire Circuits LLC",593:"Lumo Bodytech Inc.",594:"UKC Technosolution",595:"Xicato Inc.",596:"Playbrush",597:"Dai Nippon Printing Co., Ltd.",598:"G24 Power Limited",599:"AdBabble Local Commerce Inc.",600:"Devialet SA",601:"ALTYOR",602:"University of Applied Sciences Valais/Haute Ecole Valaisanne",603:"Five Interactive, LLC dba Zendo",604:"NetEaseHangzhouNetwork co.Ltd.",605:"Lexmark International Inc.",606:"Fluke Corporation",607:"Yardarm Technologies",608:"SensaRx",609:"SECVRE GmbH",610:"Glacial Ridge Technologies",611:"Identiv, Inc.",612:"DDS, Inc.",613:"SMK Corporation",614:"Schawbel Technologies LLC",615:"XMI Systems SA",616:"Cerevo",617:"Torrox GmbH & Co KG",618:"Gemalto",619:"DEKA Research & Development Corp.",620:"Domster Tadeusz Szydlowski",621:"Technogym SPA",622:"FLEURBAEY BVBA",623:"Aptcode Solutions",624:"LSI ADL Technology",625:"Animas Corp",626:"Alps Electric Co., Ltd.",627:"OCEASOFT",628:"Motsai Research",629:"Geotab",630:"E.G.O. Elektro-Gertebau GmbH",631:"bewhere inc",632:"Johnson Outdoors Inc",633:"steute Schaltgerate GmbH & Co. KG",634:"Ekomini inc.",635:"DEFA AS",636:"Aseptika Ltd",637:"HUAWEI Technologies Co., Ltd. ( )",638:"HabitAware, LLC",639:"ruwido austria gmbh",640:"ITEC corporation",641:"StoneL",642:"Sonova AG",643:"Maven Machines, Inc.",644:"Synapse Electronics",645:"Standard Innovation Inc.",646:"RF Code, Inc.",647:"Wally Ventures S.L.",648:"Willowbank Electronics Ltd",649:"SK Telecom",650:"Jetro AS",651:"Code Gears LTD",652:"NANOLINK APS",653:"IF, LLC",654:"RF Digital Corp",655:"Church & Dwight Co., Inc",656:"Multibit Oy",657:"CliniCloud Inc",658:"SwiftSensors",659:"Blue Bite",660:"ELIAS GmbH",661:"Sivantos GmbH",662:"Petzl",663:"storm power ltd",664:"EISST Ltd",665:"Inexess Technology Simma KG",666:"Currant, Inc.",667:"C2 Development, Inc.",668:"Blue Sky Scientific, LLC",669:"ALOTTAZS LABS, LLC",670:"Kupson spol. s r.o.",671:"Areus Engineering GmbH",672:"Impossible Camera GmbH",673:"InventureTrack Systems",674:"LockedUp",675:"Itude",676:"Pacific Lock Company",677:"Tendyron Corporation ( )",678:"Robert Bosch GmbH",679:"Illuxtron international B.V.",680:"miSport Ltd.",681:"Chargelib",682:"Doppler Lab",683:"BBPOS Limited",684:"RTB Elektronik GmbH & Co. KG",685:"Rx Networks, Inc.",686:"WeatherFlow, Inc.",687:"Technicolor USA Inc.",688:"Bestechnic(Shanghai),Ltd",689:"Raden Inc",690:"JouZen Oy",691:"CLABER S.P.A.",692:"Hyginex, Inc.",693:"HANSHIN ELECTRIC RAILWAY CO.,LTD.",694:"Schneider Electric",695:"Oort Technologies LLC",696:"Chrono Therapeutics",697:"Rinnai Corporation",698:"Swissprime Technologies AG",699:"Koha.,Co.Ltd",700:"Genevac Ltd",701:"Chemtronics",702:"Seguro Technology Sp. z o.o.",703:"Redbird Flight Simulations",704:"Dash Robotics",705:"LINE Corporation",706:"Guillemot Corporation",707:"Techtronic Power Tools Technology Limited",708:"Wilson Sporting Goods",709:"Lenovo (Singapore) Pte Ltd. ( )",710:"Ayatan Sensors",711:"Electronics Tomorrow Limited",712:"VASCO Data Security International, Inc.",713:"PayRange Inc.",714:"ABOV Semiconductor",715:"AINA-Wireless Inc.",716:"Eijkelkamp Soil & Water",717:"BMA ergonomics b.v.",718:"Teva Branded Pharmaceutical Products R&D, Inc.",719:"Anima",720:"3M",721:"Empatica Srl",722:"Afero, Inc.",723:"Powercast Corporation",724:"Secuyou ApS",725:"OMRON Corporation",726:"Send Solutions",727:"NIPPON SYSTEMWARE CO.,LTD.",728:"Neosfar",729:"Fliegl Agrartechnik GmbH",730:"Gilvader",731:"Digi International Inc (R)",732:"DeWalch Technologies, Inc.",733:"Flint Rehabilitation Devices, LLC",734:"Samsung SDS Co., Ltd.",735:"Blur Product Development",736:"University of Michigan",737:"Victron Energy BV",738:"NTT docomo",739:"Carmanah Technologies Corp.",740:"Bytestorm Ltd.",741:"Espressif Incorporated ( () )",742:"Unwire",743:"Connected Yard, Inc.",744:"American Music Environments",745:"Sensogram Technologies, Inc.",746:"Fujitsu Limited",747:"Ardic Technology",748:"Delta Systems, Inc",749:"HTC Corporation",750:"Citizen Holdings Co., Ltd.",751:"SMART-INNOVATION.inc",752:"Blackrat Software",753:"The Idea Cave, LLC",754:"GoPro, Inc.",755:"AuthAir, Inc",756:"Vensi, Inc.",757:"Indagem Tech LLC",758:"Intemo Technologies",759:"DreamVisions co., Ltd.",760:"Runteq Oy Ltd",761:"IMAGINATION TECHNOLOGIES LTD",762:"CoSTAR TEchnologies",763:"Clarius Mobile Health Corp.",764:"Shanghai Frequen Microelectronics Co., Ltd.",765:"Uwanna, Inc.",766:"Lierda Science & Technology Group Co., Ltd.",767:"Silicon Laboratories",768:"World Moto Inc.",769:"Giatec Scientific Inc.",770:"Loop Devices, Inc",771:"IACA electronique",772:"Martians Inc",773:"Swipp ApS",774:"Life Laboratory Inc.",775:"FUJI INDUSTRIAL CO.,LTD.",776:"Surefire, LLC",777:"Dolby Labs",778:"Ellisys",779:"Magnitude Lighting Converters",780:"Hilti AG",781:"Devdata S.r.l.",782:"Deviceworx",783:"Shortcut Labs",784:"SGL Italia S.r.l.",785:"PEEQ DATA",786:"Ducere Technologies Pvt Ltd",787:"DiveNav, Inc.",788:"RIIG AI Sp. z o.o.",789:"Thermo Fisher Scientific",790:"AG Measurematics Pvt. Ltd.",791:"CHUO Electronics CO., LTD.",792:"Aspenta International",793:"Eugster Frismag AG",794:"Amber wireless GmbH",795:"HQ Inc",796:"Lab Sensor Solutions",797:"Enterlab ApS",798:"Eyefi, Inc.",799:"MetaSystem S.p.A.",800:"SONO ELECTRONICS. CO., LTD",801:"Jewelbots",802:"Compumedics Limited",803:"Rotor Bike Components",804:"Astro, Inc.",805:"Amotus Solutions",806:"Healthwear Technologies (Changzhou)Ltd",807:"Essex Electronics",808:"Grundfos A/S",809:"Eargo, Inc.",810:"Electronic Design Lab",811:"ESYLUX",812:"NIPPON SMT.CO.,Ltd",813:"BM innovations GmbH",814:"indoormap",815:"OttoQ Inc",816:"North Pole Engineering",817:"3flares Technologies Inc.",818:"Electrocompaniet A.S.",819:"Mul-T-Lock",820:"Corentium AS",821:"Enlighted Inc",822:"GISTIC",823:"AJP2 Holdings, LLC",824:"COBI GmbH",825:"Blue Sky Scientific, LLC",826:"Appception, Inc.",827:"Courtney Thorne Limited",828:"Virtuosys",829:"TPV Technology Limited",830:"Monitra SA",831:"Automation Components, Inc.",832:"Letsense s.r.l.",833:"Etesian Technologies LLC",834:"GERTEC BRASIL LTDA.",835:"Drekker Development Pty. Ltd.",836:"Whirl Inc",837:"Locus Positioning",838:"Acuity Brands Lighting, Inc",839:"Prevent Biometrics",840:"Arioneo",841:"VersaMe",842:"Vaddio",843:"Libratone A/S",844:"HM Electronics, Inc.",845:"TASER International, Inc.",846:"SafeTrust Inc.",847:"Heartland Payment Systems",848:"Bitstrata Systems Inc.",849:"Pieps GmbH",850:"iRiding(Xiamen)Technology Co.,Ltd.",851:"Alpha Audiotronics, Inc.",852:"TOPPAN FORMS CO.,LTD.",853:"Sigma Designs, Inc.",854:"Spectrum Brands, Inc.",855:"Polymap Wireless",856:"MagniWare Ltd.",857:"Novotec Medical GmbH",858:"Medicom Innovation Partner a/s",859:"Matrix Inc.",860:"Eaton Corporation",861:"KYS",862:"Naya Health, Inc.",863:"Acromag",864:"Insulet Corporation",865:"Wellinks Inc.",866:"ON Semiconductor",867:"FREELAP SA",868:"Favero Electronics Srl",869:"BioMech Sensor LLC",870:"BOLTT Sports technologies Private limited",871:"Saphe International",872:"Metormote AB",873:"littleBits",874:"SetPoint Medical",875:"BRControls Products BV",876:"Zipcar",877:"AirBolt Pty Ltd",878:"KeepTruckin Inc",879:"Motiv, Inc.",880:"Wazombi Labs O",881:"ORBCOMM",882:"Nixie Labs, Inc.",883:"AppNearMe Ltd",884:"Holman Industries",885:"Expain AS",886:"Electronic Temperature Instruments Ltd",887:"Plejd AB",888:"Propeller Health",889:"Shenzhen iMCO Electronic Technology Co.,Ltd",890:"Algoria",891:"Apption Labs Inc.",892:"Cronologics Corporation",893:"MICRODIA Ltd.",894:"lulabytes S.L.",895:"Nestec S.A.",896:"LLC MEGA - F service",897:"Sharp Corporation",898:"Precision Outcomes Ltd",899:"Kronos Incorporated",900:"OCOSMOS Co., Ltd.",901:"Embedded Electronic Solutions Ltd. dba e2Solutions",902:"Aterica Inc.",903:"BluStor PMC, Inc.",904:"Kapsch TrafficCom AB",905:"ActiveBlu Corporation",906:"Kohler Mira Limited",907:"Noke",908:"Appion Inc.",909:"Resmed Ltd",910:"Crownstone B.V.",911:"Xiaomi Inc.",912:"INFOTECH s.r.o.",913:"Thingsquare AB",914:"T&D",915:"LAVAZZA S.p.A.",916:"Netclearance Systems, Inc.",917:"SDATAWAY",918:"BLOKS GmbH",919:"LEGO System A/S",920:"Thetatronics Ltd",921:"Nikon Corporation",922:"NeST",923:"South Silicon Valley Microelectronics",924:"ALE International",925:"CareView Communications, Inc.",926:"SchoolBoard Limited",927:"Molex Corporation",928:"IVT Wireless Limited",929:"Alpine Labs LLC",930:"Candura Instruments",931:"SmartMovt Technology Co., Ltd",932:"Token Zero Ltd",933:"ACE CAD Enterprise Co., Ltd. (ACECAD)",934:"Medela, Inc",935:"AeroScout",936:"Esrille Inc.",937:"THINKERLY SRL",938:"Exon Sp. z o.o.",939:"Meizu Technology Co., Ltd.",940:"Smablo LTD",941:"XiQ",942:"Allswell Inc.",943:"Comm-N-Sense Corp DBA Verigo",944:"VIBRADORM GmbH",945:"Otodata Wireless Network Inc.",946:"Propagation Systems Limited",947:"Midwest Instruments & Controls",948:"Alpha Nodus, inc.",949:"petPOMM, Inc",950:"Mattel",951:"Airbly Inc.",952:"A-Safe Limited",953:"FREDERIQUE CONSTANT SA",954:"Maxscend Microelectronics Company Limited",955:"Abbott Diabetes Care",956:"ASB Bank Ltd",957:"amadas",958:"Applied Science, Inc.",959:"iLumi Solutions Inc.",960:"Arch Systems Inc.",961:"Ember Technologies, Inc.",962:"Snapchat Inc",963:"Casambi Technologies Oy",964:"Pico Technology Inc.",965:"St. Jude Medical, Inc.",966:"Intricon",967:"Structural Health Systems, Inc.",968:"Avvel International",969:"Gallagher Group",970:"In2things Automation Pvt. Ltd.",971:"SYSDEV Srl",972:"Vonkil Technologies Ltd",973:"Wynd Technologies, Inc.",974:"CONTRINEX S.A.",975:"MIRA, Inc.",976:"Watteam Ltd",977:"Density Inc.",978:"IOT Pot India Private Limited",979:"Sigma Connectivity AB",980:"PEG PEREGO SPA",981:"Wyzelink Systems Inc.",982:"Yota Devices LTD",983:"FINSECUR",984:"Zen-Me Labs Ltd",985:"3IWare Co., Ltd.",986:"EnOcean GmbH",987:"Instabeat, Inc",988:"Nima Labs",989:"Andreas Stihl AG & Co. KG",990:"Nathan Rhoades LLC",991:"Grob Technologies, LLC",992:"Actions (Zhuhai) Technology Co., Limited",993:"SPD Development Company Ltd",994:"Sensoan Oy",995:"Qualcomm Life Inc",996:"Chip-ing AG",997:"ffly4u",998:"IoT Instruments Oy",999:"TRUE Fitness Technology",1000:"Reiner Kartengeraete GmbH & Co. KG.",1001:"SHENZHEN LEMONJOY TECHNOLOGY CO., LTD.",1002:"Hello Inc.",1003:"Evollve Inc.",1004:"Jigowatts Inc.",1005:"BASIC MICRO.COM,INC.",1006:"CUBE TECHNOLOGIES",1007:"foolography GmbH",1008:"CLINK",1009:"Hestan Smart Cooking Inc.",1010:"WindowMaster A/S",1011:"Flowscape AB",1012:"PAL Technologies Ltd",1013:"WHERE, Inc.",1014:"Iton Technology Corp.",1015:"Owl Labs Inc.",1016:"Rockford Corp.",1017:"Becon Technologies Co.,Ltd.",1018:"Vyassoft Technologies Inc",1019:"Nox Medical",1020:"Kimberly-Clark",1021:"Trimble Navigation Ltd.",1022:"Littelfuse",1023:"Withings",1024:"i-developer IT Beratung UG",1026:"Sears Holdings Corporation",1027:"Gantner Electronic GmbH",1028:"Authomate Inc",1029:"Vertex International, Inc.",1030:"Airtago",1031:"Swiss Audio SA",1032:"ToGetHome Inc.",1033:"AXIS",1034:"Openmatics",1035:"Jana Care Inc.",1036:"Senix Corporation",1037:"NorthStar Battery Company, LLC",1038:"SKF (U.K.) Limited",1039:"CO-AX Technology, Inc.",1040:"Fender Musical Instruments",1041:"Luidia Inc",1042:"SEFAM",1043:"Wireless Cables Inc",1044:"Lightning Protection International Pty Ltd",1045:"Uber Technologies Inc",1046:"SODA GmbH",1047:"Fatigue Science",1048:"Alpine Electronics Inc.",1049:"Novalogy LTD",1050:"Friday Labs Limited",1051:"OrthoAccel Technologies",1052:"WaterGuru, Inc.",1053:"Benning Elektrotechnik und Elektronik GmbH & Co. KG",1054:"Dell Computer Corporation",1055:"Kopin Corporation",1056:"TecBakery GmbH",1057:"Backbone Labs, Inc.",1058:"DELSEY SA",1059:"Chargifi Limited",1060:"Trainesense Ltd.",1061:"Unify Software and Solutions GmbH & Co. KG",1062:"Husqvarna AB",1063:"Focus fleet and fuel management inc",1064:"SmallLoop, LLC",1065:"Prolon Inc.",1066:"BD Medical",1067:"iMicroMed Incorporated",1068:"Ticto N.V.",1069:"Meshtech AS",1070:"MemCachier Inc.",1071:"Danfoss A/S",1072:"SnapStyk Inc.",1073:"Amyway Corporation",1074:"Silk Labs, Inc.",1075:"Pillsy Inc.",1076:"Hatch Baby, Inc.",1077:"Blocks Wearables Ltd.",1078:"Drayson Technologies (Europe) Limited",1079:"eBest IOT Inc.",1080:"Helvar Ltd",1081:"Radiance Technologies",1082:"Nuheara Limited",1083:"Appside co., ltd.",1084:"DeLaval",1085:"Coiler Corporation",1086:"Thermomedics, Inc.",1087:"Tentacle Sync GmbH",1088:"Valencell, Inc.",1089:"iProtoXi Oy",1090:"SECOM CO., LTD.",1091:"Tucker International LLC",1092:"Metanate Limited",1093:"Kobian Canada Inc.",1094:"NETGEAR, Inc.",1095:"Fabtronics Australia Pty Ltd",1096:"Grand Centrix GmbH",1097:"1UP USA.com llc",1098:"SHIMANO INC.",1099:"Nain Inc.",1100:"LifeStyle Lock, LLC",1101:"VEGA Grieshaber KG",1102:"Xtrava Inc.",1103:"TTS Tooltechnic Systems AG & Co. KG",1104:"Teenage Engineering AB",1105:"Tunstall Nordic AB",1106:"Svep Design Center AB",1107:"GreenPeak Technologies BV",1108:"Sphinx Electronics GmbH & Co KG",1109:"Atomation",1110:"Nemik Consulting Inc",1111:"RF INNOVATION",1112:"Mini Solution Co., Ltd.",1113:"Lumenetix, Inc",1114:"2048450 Ontario Inc",1115:"SPACEEK LTD",1116:"Delta T Corporation",1117:"Boston Scientific Corporation",1118:"Nuviz, Inc.",1119:"Real Time Automation, Inc.",1120:"Kolibree",1121:"vhf elektronik GmbH",1122:"Bonsai Systems GmbH",1123:"Fathom Systems Inc.",1124:"Bellman & Symfon",1125:"International Forte Group LLC",1126:"CycleLabs Solutions inc.",1127:"Codenex Oy",1128:"Kynesim Ltd",1129:"Palago AB",1130:"INSIGMA INC.",1131:"PMD Solutions",1132:"Qingdao Realtime Technology Co., Ltd.",1133:"BEGA Gantenbrink-Leuchten KG",1134:"Pambor Ltd.",65535:"SPECIAL USE/DEFAULT"}});var require_bluetooth=__commonJS((exports)=>{var exec3=__require("child_process").exec,execSync18=__require("child_process").execSync,path6=__require("path"),util4=require_util3(),bluetoothVendors=require_bluetoothVendors(),fs3=__require("fs"),_platform=process.platform,_linux=_platform==="linux"||_platform==="android",_darwin=_platform==="darwin",_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";function parseBluetoothType(str5){let result2="";if(str5.indexOf("keyboard")>=0)result2="Keyboard";if(str5.indexOf("mouse")>=0)result2="Mouse";if(str5.indexOf("trackpad")>=0)result2="Trackpad";if(str5.indexOf("audio")>=0)result2="Audio";if(str5.indexOf("sound")>=0)result2="Audio";if(str5.indexOf("microph")>=0)result2="Microphone";if(str5.indexOf("speaker")>=0)result2="Speaker";if(str5.indexOf("headset")>=0)result2="Headset";if(str5.indexOf("phone")>=0)result2="Phone";if(str5.indexOf("macbook")>=0)result2="Computer";if(str5.indexOf("imac")>=0)result2="Computer";if(str5.indexOf("ipad")>=0)result2="Tablet";if(str5.indexOf("watch")>=0)result2="Watch";if(str5.indexOf("headphone")>=0)result2="Headset";return result2}function parseBluetoothManufacturer(str5){let result2=str5.split(" ")[0];if(str5=str5.toLowerCase(),str5.indexOf("apple")>=0)result2="Apple";if(str5.indexOf("ipad")>=0)result2="Apple";if(str5.indexOf("imac")>=0)result2="Apple";if(str5.indexOf("iphone")>=0)result2="Apple";if(str5.indexOf("magic mouse")>=0)result2="Apple";if(str5.indexOf("magic track")>=0)result2="Apple";if(str5.indexOf("macbook")>=0)result2="Apple";return result2}function parseBluetoothVendor(str5){let id=parseInt(str5);if(!isNaN(id))return bluetoothVendors[id]}function parseLinuxBluetoothInfo(lines,macAddr1,macAddr2){let result2={};return result2.device=null,result2.name=util4.getValue(lines,"name","="),result2.manufacturer=null,result2.macDevice=macAddr1,result2.macHost=macAddr2,result2.batteryPercent=null,result2.type=parseBluetoothType(result2.name.toLowerCase()),result2.connected=!1,result2}function parseDarwinBluetoothDevices(bluetoothObject,macAddr2){let result2={},typeStr=((bluetoothObject.device_minorClassOfDevice_string||bluetoothObject.device_majorClassOfDevice_string||bluetoothObject.device_minorType||"")+(bluetoothObject.device_name||"")).toLowerCase();return result2.device=bluetoothObject.device_services||"",result2.name=bluetoothObject.device_name||"",result2.manufacturer=bluetoothObject.device_manufacturer||parseBluetoothVendor(bluetoothObject.device_vendorID)||parseBluetoothManufacturer(bluetoothObject.device_name||"")||"",result2.macDevice=(bluetoothObject.device_addr||bluetoothObject.device_address||"").toLowerCase().replace(/-/g,":"),result2.macHost=macAddr2,result2.batteryPercent=bluetoothObject.device_batteryPercent||null,result2.type=parseBluetoothType(typeStr),result2.connected=bluetoothObject.device_isconnected==="attrib_Yes"||!1,result2}function parseWindowsBluetooth(lines){let result2={};return result2.device=null,result2.name=util4.getValue(lines,"name",":"),result2.manufacturer=util4.getValue(lines,"manufacturer",":"),result2.macDevice=null,result2.macHost=null,result2.batteryPercent=null,result2.type=parseBluetoothType(result2.name.toLowerCase()),result2.connected=null,result2}function bluetoothDevices(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let result2=[];if(_linux){util4.getFilesInPath("/var/lib/bluetooth/").forEach((element)=>{let filename=path6.basename(element),pathParts=element.split("/"),macAddr1=pathParts.length>=6?pathParts[pathParts.length-2]:null,macAddr2=pathParts.length>=7?pathParts[pathParts.length-3]:null;if(filename==="info"){let infoFile=fs3.readFileSync(element,{encoding:"utf8"}).split(`
|
|
3529
|
+
`);result2.push(parseLinuxBluetoothInfo(infoFile,macAddr1,macAddr2))}});try{let hdicon=execSync18("hcitool con",util4.execOptsLinux).toString().toLowerCase();for(let i2=0;i2<result2.length;i2++)if(result2[i2].macDevice&&result2[i2].macDevice.length>10&&hdicon.indexOf(result2[i2].macDevice.toLowerCase())>=0)result2[i2].connected=!0}catch{util4.noop()}if(callback)callback(result2);resolve14(result2)}if(_darwin)exec3("system_profiler SPBluetoothDataType -json",(error2,stdout)=>{if(!error2)try{let outObj=JSON.parse(stdout.toString());if(outObj.SPBluetoothDataType&&outObj.SPBluetoothDataType.length&&outObj.SPBluetoothDataType[0]&&outObj.SPBluetoothDataType[0].device_title&&outObj.SPBluetoothDataType[0].device_title.length){let macAddr2=null;if(outObj.SPBluetoothDataType[0].local_device_title&&outObj.SPBluetoothDataType[0].local_device_title.general_address)macAddr2=outObj.SPBluetoothDataType[0].local_device_title.general_address.toLowerCase().replace(/-/g,":");outObj.SPBluetoothDataType[0].device_title.forEach((element)=>{let obj=element,objKey=Object.keys(obj);if(objKey&&objKey.length===1){let innerObject=obj[objKey[0]];innerObject.device_name=objKey[0];let bluetoothDevice=parseDarwinBluetoothDevices(innerObject,macAddr2);result2.push(bluetoothDevice)}})}if(outObj.SPBluetoothDataType&&outObj.SPBluetoothDataType.length&&outObj.SPBluetoothDataType[0]&&outObj.SPBluetoothDataType[0].device_connected&&outObj.SPBluetoothDataType[0].device_connected.length){let macAddr2=outObj.SPBluetoothDataType[0].controller_properties&&outObj.SPBluetoothDataType[0].controller_properties.controller_address?outObj.SPBluetoothDataType[0].controller_properties.controller_address.toLowerCase().replace(/-/g,":"):null;outObj.SPBluetoothDataType[0].device_connected.forEach((element)=>{let obj=element,objKey=Object.keys(obj);if(objKey&&objKey.length===1){let innerObject=obj[objKey[0]];innerObject.device_name=objKey[0],innerObject.device_isconnected="attrib_Yes";let bluetoothDevice=parseDarwinBluetoothDevices(innerObject,macAddr2);result2.push(bluetoothDevice)}})}if(outObj.SPBluetoothDataType&&outObj.SPBluetoothDataType.length&&outObj.SPBluetoothDataType[0]&&outObj.SPBluetoothDataType[0].device_not_connected&&outObj.SPBluetoothDataType[0].device_not_connected.length){let macAddr2=outObj.SPBluetoothDataType[0].controller_properties&&outObj.SPBluetoothDataType[0].controller_properties.controller_address?outObj.SPBluetoothDataType[0].controller_properties.controller_address.toLowerCase().replace(/-/g,":"):null;outObj.SPBluetoothDataType[0].device_not_connected.forEach((element)=>{let obj=element,objKey=Object.keys(obj);if(objKey&&objKey.length===1){let innerObject=obj[objKey[0]];innerObject.device_name=objKey[0],innerObject.device_isconnected="attrib_No";let bluetoothDevice=parseDarwinBluetoothDevices(innerObject,macAddr2);result2.push(bluetoothDevice)}})}}catch{util4.noop()}if(callback)callback(result2);resolve14(result2)});if(_windows)util4.powerShell("Get-CimInstance Win32_PNPEntity | select PNPClass, Name, Manufacturer, Status, Service, ConfigManagerErrorCode, Present | fl").then((stdout,error2)=>{if(!error2)stdout.toString().split(/\n\s*\n/).forEach((part)=>{let lines=part.split(`
|
|
3530
|
+
`),service=util4.getValue(lines,"Service",":"),errorCode=util4.getValue(lines,"ConfigManagerErrorCode",":");if(util4.getValue(lines,"PNPClass",":").toLowerCase()==="bluetooth"&&errorCode==="0"&&service==="")result2.push(parseWindowsBluetooth(lines))});if(callback)callback(result2);resolve14(result2)});if(_freebsd||_netbsd||_openbsd||_sunos)resolve14(null)})})}exports.bluetoothDevices=bluetoothDevices});var require_lib5=__commonJS((exports)=>{var lib_version=require_package().version,util4=require_util3(),system=require_system(),osInfo=require_osinfo(),cpu=require_cpu(),memory=require_memory(),battery=require_battery(),graphics=require_graphics(),filesystem=require_filesystem(),network=require_network(),wifi=require_wifi(),processes=require_processes(),users=require_users(),internet=require_internet(),docker=require_docker(),vbox=require_virtualbox(),printer=require_printer(),usb=require_usb(),audio=require_audio(),bluetooth=require_bluetooth(),_platform=process.platform,_windows=_platform==="win32",_freebsd=_platform==="freebsd",_openbsd=_platform==="openbsd",_netbsd=_platform==="netbsd",_sunos=_platform==="sunos";if(_windows)util4.getCodepage(),util4.getPowershell();function version(){return lib_version}function getStaticData(callback){return new Promise((resolve14)=>{process.nextTick(()=>{let data={};data.version=version(),Promise.all([system.system(),system.bios(),system.baseboard(),system.chassis(),osInfo.osInfo(),osInfo.uuid(),osInfo.versions(),cpu.cpu(),cpu.cpuFlags(),graphics.graphics(),network.networkInterfaces(),memory.memLayout(),filesystem.diskLayout(),audio.audio(),bluetooth.bluetoothDevices(),usb.usb(),printer.printer()]).then((res)=>{if(data.system=res[0],data.bios=res[1],data.baseboard=res[2],data.chassis=res[3],data.os=res[4],data.uuid=res[5],data.versions=res[6],data.cpu=res[7],data.cpu.flags=res[8],data.graphics=res[9],data.net=res[10],data.memLayout=res[11],data.diskLayout=res[12],data.audio=res[13],data.bluetooth=res[14],data.usb=res[15],data.printer=res[16],callback)callback(data);resolve14(data)})})})}function getDynamicData(srv,iface,callback){if(util4.isFunction(iface))callback=iface,iface="";if(util4.isFunction(srv))callback=srv,srv="";return new Promise((resolve14)=>{process.nextTick(()=>{iface=iface||network.getDefaultNetworkInterface(),srv=srv||"";let functionProcessed=(()=>{let totalFunctions=15;if(_windows)totalFunctions=13;if(_freebsd||_openbsd||_netbsd)totalFunctions=11;if(_sunos)totalFunctions=6;return function(){if(--totalFunctions===0){if(callback)callback(data);resolve14(data)}}})(),data={};if(data.time=osInfo.time(),data.node=process.versions.node,data.v8=process.versions.v8,cpu.cpuCurrentSpeed().then((res)=>{data.cpuCurrentSpeed=res,functionProcessed()}),users.users().then((res)=>{data.users=res,functionProcessed()}),processes.processes().then((res)=>{data.processes=res,functionProcessed()}),cpu.currentLoad().then((res)=>{data.currentLoad=res,functionProcessed()}),!_sunos)cpu.cpuTemperature().then((res)=>{data.temp=res,functionProcessed()});if(!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)network.networkStats(iface).then((res)=>{data.networkStats=res,functionProcessed()});if(!_sunos)network.networkConnections().then((res)=>{data.networkConnections=res,functionProcessed()});if(memory.mem().then((res)=>{data.mem=res,functionProcessed()}),!_sunos)battery().then((res)=>{data.battery=res,functionProcessed()});if(!_sunos)processes.services(srv).then((res)=>{data.services=res,functionProcessed()});if(!_sunos)filesystem.fsSize().then((res)=>{data.fsSize=res,functionProcessed()});if(!_windows&&!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)filesystem.fsStats().then((res)=>{data.fsStats=res,functionProcessed()});if(!_windows&&!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)filesystem.disksIO().then((res)=>{data.disksIO=res,functionProcessed()});if(!_openbsd&&!_freebsd&&!_netbsd&&!_sunos)wifi.wifiNetworks().then((res)=>{data.wifiNetworks=res,functionProcessed()});internet.inetLatency().then((res)=>{data.inetLatency=res,functionProcessed()})})})}function getAllData(srv,iface,callback){return new Promise((resolve14)=>{process.nextTick(()=>{let data={};if(iface&&util4.isFunction(iface)&&!callback)callback=iface,iface="";if(srv&&util4.isFunction(srv)&&!iface&&!callback)callback=srv,srv="",iface="";getStaticData().then((res)=>{data=res,getDynamicData(srv,iface).then((res2)=>{for(let key in res2)if({}.hasOwnProperty.call(res2,key))data[key]=res2[key];if(callback)callback(data);resolve14(data)})})})})}function get3(valueObject,callback){return new Promise((resolve14)=>{process.nextTick(()=>{let allPromises=Object.keys(valueObject).filter((func)=>({}).hasOwnProperty.call(exports,func)).map((func)=>{let params=valueObject[func].substring(valueObject[func].lastIndexOf("(")+1,valueObject[func].lastIndexOf(")")),funcWithoutParams=func.indexOf(")")>=0?func.split(")")[1].trim():func;if(funcWithoutParams=func.indexOf("|")>=0?func.split("|")[0].trim():funcWithoutParams,params)return exports[funcWithoutParams](params);else return exports[funcWithoutParams]("")});Promise.all(allPromises).then((data)=>{let result2={},i2=0;for(let key in valueObject)if({}.hasOwnProperty.call(valueObject,key)&&{}.hasOwnProperty.call(exports,key)&&data.length>i2){if(valueObject[key]==="*"||valueObject[key]==="all")result2[key]=data[i2];else{let keys=valueObject[key],filter="",filterParts=[];if(keys.indexOf(")")>=0)keys=keys.split(")")[1].trim();if(keys.indexOf("|")>=0)filter=keys.split("|")[1].trim(),filterParts=filter.split(":"),keys=keys.split("|")[0].trim();if(keys=keys.replace(/,/g," ").replace(/ +/g," ").split(" "),data[i2])if(Array.isArray(data[i2])){let partialArray=[];data[i2].forEach((element)=>{let partialRes={};if(keys.length===1&&(keys[0]==="*"||keys[0]==="all"))partialRes=element;else keys.forEach((k2)=>{if({}.hasOwnProperty.call(element,k2))partialRes[k2]=element[k2]});if(filter&&filterParts.length===2){if({}.hasOwnProperty.call(partialRes,filterParts[0].trim())){let val=partialRes[filterParts[0].trim()];if(typeof val==="number"){if(val===parseFloat(filterParts[1].trim()))partialArray.push(partialRes)}else if(typeof val==="string"){if(val.toLowerCase()===filterParts[1].trim().toLowerCase())partialArray.push(partialRes)}}}else partialArray.push(partialRes)}),result2[key]=partialArray}else{let partialRes={};keys.forEach((k2)=>{if({}.hasOwnProperty.call(data[i2],k2))partialRes[k2]=data[i2][k2]}),result2[key]=partialRes}else result2[key]={}}i2++}if(callback)callback(result2);resolve14(result2)})})})}function observe(valueObject,interval,callback){let _data=null;return setInterval(()=>{get3(valueObject).then((data)=>{if(JSON.stringify(_data)!==JSON.stringify(data))_data=Object.assign({},data),callback(data)})},interval)}exports.version=version;exports.system=system.system;exports.bios=system.bios;exports.baseboard=system.baseboard;exports.chassis=system.chassis;exports.time=osInfo.time;exports.osInfo=osInfo.osInfo;exports.versions=osInfo.versions;exports.shell=osInfo.shell;exports.uuid=osInfo.uuid;exports.cpu=cpu.cpu;exports.cpuFlags=cpu.cpuFlags;exports.cpuCache=cpu.cpuCache;exports.cpuCurrentSpeed=cpu.cpuCurrentSpeed;exports.cpuTemperature=cpu.cpuTemperature;exports.currentLoad=cpu.currentLoad;exports.fullLoad=cpu.fullLoad;exports.mem=memory.mem;exports.memLayout=memory.memLayout;exports.battery=battery;exports.graphics=graphics.graphics;exports.fsSize=filesystem.fsSize;exports.fsOpenFiles=filesystem.fsOpenFiles;exports.blockDevices=filesystem.blockDevices;exports.fsStats=filesystem.fsStats;exports.disksIO=filesystem.disksIO;exports.diskLayout=filesystem.diskLayout;exports.networkInterfaceDefault=network.networkInterfaceDefault;exports.networkGatewayDefault=network.networkGatewayDefault;exports.networkInterfaces=network.networkInterfaces;exports.networkStats=network.networkStats;exports.networkConnections=network.networkConnections;exports.wifiNetworks=wifi.wifiNetworks;exports.wifiInterfaces=wifi.wifiInterfaces;exports.wifiConnections=wifi.wifiConnections;exports.services=processes.services;exports.processes=processes.processes;exports.processLoad=processes.processLoad;exports.users=users.users;exports.inetChecksite=internet.inetChecksite;exports.inetLatency=internet.inetLatency;exports.dockerInfo=docker.dockerInfo;exports.dockerImages=docker.dockerImages;exports.dockerContainers=docker.dockerContainers;exports.dockerContainerStats=docker.dockerContainerStats;exports.dockerContainerProcesses=docker.dockerContainerProcesses;exports.dockerVolumes=docker.dockerVolumes;exports.dockerAll=docker.dockerAll;exports.vboxInfo=vbox.vboxInfo;exports.printer=printer.printer;exports.usb=usb.usb;exports.audio=audio.audio;exports.bluetoothDevices=bluetooth.bluetoothDevices;exports.getStaticData=getStaticData;exports.getDynamicData=getDynamicData;exports.getAllData=getAllData;exports.get=get3;exports.observe=observe;exports.powerShellStart=util4.powerShellStart;exports.powerShellRelease=util4.powerShellRelease});import os4 from"os";function toGB(bytes){return Math.round(bytes/1073741824*10)/10}function bar(percent,width){let p=Math.max(0,Math.min(100,percent)),filled=Math.round(p/100*width);return`[${"=".repeat(filled)}${"-".repeat(width-filled)}]`}function pickColor(percent){if(percent>80)return palette.error;if(percent>50)return palette.warning;return palette.emerald}function SystemStats(){let[stats2,setStats]=import_react19.useState(null),mountedRef=import_react19.useRef(!0);if(import_react19.useEffect(()=>{mountedRef.current=!0;async function refresh(){try{let[cpu2,mem]=await Promise.all([import_systeminformation.default.currentLoad(),import_systeminformation.default.mem()]);if(!mountedRef.current)return;let coreCount=os4.cpus().length,avg1=os4.loadavg()[0],sorted=cpu2.cpus.map((c,i2)=>({id:i2,load:Math.round(c.load)})).sort((a,b3)=>b3.load-a.load);setStats({cpu:{combined:Math.round(cpu2.currentLoad),hotCores:sorted.slice(0,3),coreCount},ram:{usedGB:toGB(mem.active),totalGB:toGB(mem.total),percent:mem.total>0?Math.round(mem.active/mem.total*100):0},swap:{usedGB:toGB(mem.swapused),totalGB:toGB(mem.swaptotal),percent:mem.swaptotal>0?Math.round(mem.swapused/mem.swaptotal*100):0},load:{percent:coreCount>0?Math.round(avg1/coreCount*100):0,busy:Math.round(avg1*10)/10,total:coreCount}})}catch{}}refresh();let timer2=setInterval(refresh,3000);return()=>{mountedRef.current=!1,clearInterval(timer2)}},[]),!stats2)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,backgroundColor:palette.bgLight,children:import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"genie"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` v${VERSION}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this);let{cpu,ram,swap,load:load3}=stats2,hotStr=cpu.hotCores.map((c)=>`#${c.id} ${c.load}%`).join(" ");return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",paddingX:1,backgroundColor:palette.bgLight,children:[import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"genie"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` v${VERSION}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"CPU "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(cpu.combined),children:`${String(cpu.combined).padStart(3)}% ${bar(cpu.combined,8)}`},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` ${cpu.coreCount}c`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:" hot "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.warning,children:hotStr},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"RAM "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(ram.percent),children:`${ram.usedGB}/${ram.totalGB}G ${bar(ram.percent,8)}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),swap.totalGB>0?import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"SWP "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(swap.percent),children:`${swap.usedGB}/${swap.totalGB}G ${bar(swap.percent,8)}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Load "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:pickColor(load3.percent),children:`${load3.percent}%`},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:` (${load3.busy}/${load3.total} busy)`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}var import_react19,import_systeminformation;var init_SystemStats=__esm(()=>{init_version();init_theme2();init_jsx_dev_runtime();import_react19=__toESM(require_react_development(),1),import_systeminformation=__toESM(require_lib5(),1)});function validateName(name){if(name.length===0)return null;try{return validateBranchName(name),null}catch(err){return err instanceof Error?err.message:String(err)}}function TeamCreate({availableAgents,workspaceRoot,onConfirm,onCancel}){let[step,setStep]=import_react21.useState("name"),[teamName,setTeamName]=import_react21.useState(""),[selected,setSelected]=import_react21.useState(()=>new Set),[memberCursor,setMemberCursor]=import_react21.useState(0),nameError=import_react21.useMemo(()=>validateName(teamName),[teamName]),nameValid=teamName.length>0&&nameError===null,intent=import_react21.useMemo(()=>({kind:"create-team",name:teamName.length>0?teamName:"TEAM_NAME",repo:workspaceRoot}),[teamName,workspaceRoot]),handleNameChange=import_react21.useCallback((value)=>{setTeamName(value)},[]),advanceFromName=import_react21.useCallback(()=>{if(!nameValid)return;setStep("members")},[nameValid]),toggleMember=import_react21.useCallback((name)=>{setSelected((prev)=>{let next=new Set(prev);if(next.has(name))next.delete(name);else next.add(name);return next})},[]),confirmMembers=import_react21.useCallback(()=>{onConfirm({teamName,members:Array.from(selected)})},[onConfirm,teamName,selected]);return useKeyboard((key)=>{if(step==="name"){handleNameStepKey(key,{onCancel,nameValid,advanceFromName});return}handleMembersStepKey(key,{availableAgents,memberCursor,setStep,setMemberCursor,toggleMember,confirmMembers})}),import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:"#0a0a0a",children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderColor:palette.violet,backgroundColor:"#111111",paddingX:3,paddingY:1,flexDirection:"column",width:64,gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"New team"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:step==="name"?" \u2014 step 1 of 2":" \u2014 step 2 of 2"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),step==="name"?import_jsx_dev_runtime2.jsxDEV(NameStep,{value:teamName,onChange:handleNameChange,onSubmit:advanceFromName,errorMessage:nameError},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV(MembersStep,{agents:availableAgents,selected,cursor:memberCursor},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV(CliPreviewLine,{intent,hint:step==="name"?"Enter: next \xB7 Esc: cancel":"Space: toggle \xB7 Enter: create \xB7 Esc: back"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}function NameStep({value,onChange,onSubmit,errorMessage}){return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Team name (git-branch-safe):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("input",{value,onInput:onChange,onChange,onSubmit,focused:!0,placeholder:"feat/auth-bug",backgroundColor:palette.bg,textColor:palette.text,placeholderColor:palette.textMuted},void 0,!1,void 0,this),errorMessage!==null?import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.error,children:`\u26A0 ${errorMessage}`},void 0,!1,void 0,this)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}function MembersStep({agents,selected,cursor}){if(agents.length===0)return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"No agents registered"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Members can be hired later via `genie team hire`."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:"Select members (space to toggle):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",children:agents.map((name,idx)=>{let isSelected=selected.has(name),isCursor=idx===cursor,tick=isSelected?"[x]":"[ ]",prefix=isCursor?"\u25B6 ":" ";return import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:isCursor?palette.cyan:palette.textMuted,children:prefix},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:isSelected?palette.success:palette.textDim,children:tick},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:` ${name}`},void 0,!1,void 0,this)]},name,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function isEnter(key){return key.name==="enter"||key.name==="return"}function handleNameStepKey(key,opts){if(key.name==="escape"){opts.onCancel();return}if(isEnter(key)&&opts.nameValid)opts.advanceFromName()}function handleMembersStepKey(key,opts){if(key.name==="escape"){opts.setStep("name");return}if(opts.availableAgents.length===0){if(isEnter(key))opts.confirmMembers();return}if(key.name==="up"||key.name==="k"){opts.setMemberCursor((prev)=>prev<=0?opts.availableAgents.length-1:prev-1);return}if(key.name==="down"||key.name==="j"){opts.setMemberCursor((prev)=>prev>=opts.availableAgents.length-1?0:prev+1);return}if(key.name==="space"){let name=opts.availableAgents[opts.memberCursor];if(name)opts.toggleMember(name);return}if(isEnter(key))opts.confirmMembers()}var import_react21;var init_TeamCreate=__esm(async()=>{init_team_manager();init_theme2();init_CliPreviewLine();init_jsx_dev_runtime();await init_react();import_react21=__toESM(require_react_development(),1)});function getNodeIcon(node){if(node.type==="agent")return getAgentIcon(node);switch(node.type){case"session":return node.data.attached?"\u25B6":"\u25B8";case"window":return node.data.active?"\u25A0":"\u25A1";case"pane":return getPaneIcon(node);default:return" "}}function getAgentIcon(node){switch(node.wsAgentState){case"running":return"\u25CF";case"stopped":return"\u25CB";case"error":return"\u2298";case"spawning":return"\u231B";default:return"\u25CB"}}function getPaneIcon(node){if(node.data.isDead)return"\u2718";if(node.agentState==="working")return"\u25CF";if(node.agentState==="idle")return"\u25CB";if(node.agentState==="permission")return"\u26A0";if(node.agentState==="error")return"\u2718";if(node.data.command==="claude")return"\u25C6";return"\u25CB"}function getNodeColor(node){if(node.type==="agent")return getAgentColor(node);switch(node.type){case"session":return node.data.attached?palette.emerald:palette.textDim;case"window":return node.data.active?palette.cyan:palette.text;case"pane":return getPaneColor(node);default:return palette.text}}function getAgentColor(node){switch(node.wsAgentState){case"running":return palette.emerald;case"stopped":return palette.textDim;case"error":return palette.error;case"spawning":return palette.warning;default:return palette.textDim}}function getPaneColor(node){if(node.data.isDead)return palette.error;if(node.agentState==="working")return palette.cyan;if(node.agentState==="permission")return palette.warning;if(node.agentState==="error")return palette.error;if(node.agentState==="idle")return palette.textDim;if(node.data.command==="claude")return palette.cyan;return palette.textDim}function getNodeSuffix(node){if(node.type==="agent"){if(node.wsAgentState==="spawning"&&node.activePanes===0)return" [stuck \u2014 press R to retry]";let wc=node.data.windowCount;if(wc>1)return` (${wc} windows)`;if(wc===1)return" (1 window)";return""}if(node.type==="session"||node.type==="pane"){let count=node.activePanes;if(count>0)return` ${icons.agent}${count}`}return""}function getStateColor(state){switch(state){case"working":return palette.cyan;case"idle":return palette.textDim;case"permission":return palette.warning;case"error":return palette.error;default:return palette.textMuted}}var import_react22,TreeNodeRow;var init_TreeNode=__esm(()=>{init_theme2();init_jsx_dev_runtime();import_react22=__toESM(require_react_development(),1),TreeNodeRow=import_react22.memo(function({node,selected,onSelect,onToggle,onContextMenu}){let indent2=" ".repeat(node.depth),hasChildren=node.children.length>0,expandIcon=hasChildren?node.expanded?icons.expanded:icons.collapsed:" ",icon=getNodeIcon(node),color2=getNodeColor(node),suffix=getNodeSuffix(node);return import_jsx_dev_runtime2.jsxDEV("box",{height:1,width:"100%",backgroundColor:selected?palette.violet:void 0,onMouseDown:(event)=>{if(event.button===2&&onContextMenu){onSelect(node.id),onContextMenu(node.id);return}if(onSelect(node.id),hasChildren)onToggle(node.id)},children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[indent2,expandIcon," "]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:color2,children:[icon," "]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:selected?"#ffffff":palette.text,children:node.label},void 0,!1,void 0,this),suffix?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:suffix},void 0,!1,void 0,this):null,node.agentState?import_jsx_dev_runtime2.jsxDEV("span",{fg:getStateColor(node.agentState),children:[" ",node.agentState]},void 0,!0,void 0,this):null,import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:` [${node.type}]`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)})});function Nav({onTmuxSessionSelect,onNewAgentWindow,workspaceRoot,initialAgent,keyboardDisabled=!1}){let[diagnostics,setDiagnostics]=import_react24.useState(null),[sessionTree,setSessionTree]=import_react24.useState([]),[selectedIndex,setSelectedIndex]=import_react24.useState(0),[requestedInitialAgent,setRequestedInitialAgent]=import_react24.useState(initialAgent),[contextMenuNodeId,setContextMenuNodeId]=import_react24.useState(null),[spawnIntoAgent,setSpawnIntoAgent]=import_react24.useState(null),[spawnPickerTarget,setSpawnPickerTarget]=import_react24.useState(null),lastTarget=import_react24.useRef(null),selectedNodeId=import_react24.useRef(null);import_react24.useEffect(()=>{let active=!0;async function refresh(){try{let snap=await collectDiagnostics();if(!active)return;setDiagnostics(snap);let signaledAgent=consumeInitialAgentSignal();if(signaledAgent)setRequestedInitialAgent(signaledAgent)}catch(err){console.error("TUI: diagnostics failed:",err)}}refresh();let timer2=setInterval(refresh,2000);return()=>{active=!1,clearInterval(timer2)}},[]),import_react24.useEffect(()=>{if(!diagnostics)return;let newTree;if(workspaceRoot){let agentNames=scanAgents(workspaceRoot);newTree=buildWorkspaceTree({agentNames,sessions:diagnostics.sessions,executors:diagnostics.executors})}else newTree=buildSessionTree(diagnostics);setSessionTree((prev)=>mergeExpandedState(prev,newTree))},[diagnostics,workspaceRoot]);let flatNodes=import_react24.useMemo(()=>flattenTree(sessionTree),[sessionTree]);import_react24.useEffect(()=>{let node=flatNodes[selectedIndex]?.node;if(node)selectedNodeId.current=node.id},[selectedIndex,flatNodes]),import_react24.useLayoutEffect(()=>{if(flatNodes.length===0)return;if(selectedIndex>=flatNodes.length){setSelectedIndex(flatNodes.length-1);return}if(!selectedNodeId.current)return;let currentAtIndex=flatNodes[selectedIndex]?.node;if(currentAtIndex&¤tAtIndex.id===selectedNodeId.current)return;let restored=flatNodes.findIndex((n)=>n.node.id===selectedNodeId.current);if(restored>=0)setSelectedIndex(restored)},[flatNodes]),import_react24.useEffect(()=>{if(!requestedInitialAgent||flatNodes.length===0)return;let idx=flatNodes.findIndex((n)=>n.node.id===`agent:${requestedInitialAgent}`);if(idx>=0){setSelectedIndex(idx);let node=flatNodes[idx].node;if(node.type==="agent"&&node.wsAgentState!=="running"&&node.wsAgentState!=="spawning")spawnAgent(agentNameFromNode(node),onTmuxSessionSelect);setRequestedInitialAgent(void 0)}},[requestedInitialAgent,flatNodes,onTmuxSessionSelect]),import_react24.useEffect(()=>{let current=flatNodes[selectedIndex]?.node;if(!current)return;let target=getSessionTarget(current);if(!target)return;if(current.type==="agent"&¤t.wsAgentState!=="running")return;let key=`${target.sessionName}:${target.windowIndex??""}`;if(key===lastTarget.current)return;lastTarget.current=key,onTmuxSessionSelect(target.sessionName,target.windowIndex)},[selectedIndex,flatNodes,onTmuxSessionSelect]);let handleSelect=import_react24.useCallback((id)=>{let idx=flatNodes.findIndex((n)=>n.node.id===id);if(idx>=0)setSelectedIndex(idx)},[flatNodes]),handleToggle=import_react24.useCallback((id)=>{setSessionTree((prev)=>toggleNode(prev,id))},[]),handleVerticalNav=import_react24.useCallback((keyName2)=>{let rowCount=flatNodes.length;if(rowCount===0)return;if(keyName2==="up"||keyName2==="k")setSelectedIndex((prev)=>prev===0?rowCount-1:prev-1);else if(keyName2==="down"||keyName2==="j")setSelectedIndex((prev)=>prev>=rowCount-1?0:prev+1)},[flatNodes.length]),handleExpandCollapse=import_react24.useCallback((keyName2)=>{let node=flatNodes[selectedIndex]?.node;if(!node)return;if((keyName2==="right"||keyName2==="l")&&node.children.length>0&&!node.expanded)handleToggle(node.id);else if((keyName2==="left"||keyName2==="h")&&node.expanded)handleToggle(node.id)},[flatNodes,selectedIndex,handleToggle]),handleEnter=import_react24.useCallback(()=>{let node=flatNodes[selectedIndex]?.node;if(!node)return;if(node.type==="agent"){handleEnterAgent(node,onTmuxSessionSelect);return}if(node.children.length>0)handleToggle(node.id);let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex)},[flatNodes,selectedIndex,handleToggle,onTmuxSessionSelect]),handleRetry=import_react24.useCallback(()=>{let node=flatNodes[selectedIndex]?.node;if(!node||node.type!=="agent")return;if(node.wsAgentState!=="spawning"&&node.wsAgentState!=="error")return;(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}spawnAgent(agentNameFromNode(node),onTmuxSessionSelect)})()},[flatNodes,selectedIndex,onTmuxSessionSelect]),handleContextMenu=import_react24.useCallback((nodeId)=>{let flat=flatNodes.find((n)=>n.node.id===nodeId);if(flat&&buildMenuItems(flat.node).length>0)setContextMenuNodeId(nodeId)},[flatNodes]),handleContextMenuAction=import_react24.useCallback((action,payload)=>{let node=flatNodes.find((n)=>n.node.id===contextMenuNodeId)?.node;if(!node)return;if(setContextMenuNodeId(null),action==="spawn-here"){let target=resolveSpawnHereTarget(node);if(target)setSpawnPickerTarget(target);return}dispatchContextMenuAction(action,node,payload,{sessionTree,onTmuxSessionSelect,onNewAgentWindow,openSpawnInto:setSpawnIntoAgent})},[flatNodes,contextMenuNodeId,sessionTree,onTmuxSessionSelect,onNewAgentWindow]),handleSpawnIntoConfirm=import_react24.useCallback((intent)=>{executeSpawnIntent(intent),setSpawnIntoAgent(null)},[]),handleSpawnIntoCancel=import_react24.useCallback(()=>{setSpawnIntoAgent(null)},[]),handleSpawnPickerConfirm=import_react24.useCallback((intent)=>{setSpawnPickerTarget(null),executeSpawnIntent(intent)},[]),handleSpawnPickerCancel=import_react24.useCallback(()=>{setSpawnPickerTarget(null)},[]),_menuDisabled=keyboardDisabled||contextMenuNodeId!==null,{showTeamCreate,handleOpenTeamCreate,handleTeamCreateConfirm,handleTeamCreateCancel}=useTeamCreateControls({workspaceRoot,diagnostics,onTmuxSessionSelect});useKeyboard((key)=>{if(keyboardDisabled)return;if(spawnIntoAgent!==null||spawnPickerTarget!==null)return;if(tryOpenTeamCreate(key,{workspaceRoot,showTeamCreate,contextMenuNodeId,handleOpenTeamCreate}))return;if(showTeamCreate)return;handleKeyboardInput(key,{contextMenuNodeId,flatNodes,selectedIndex,setContextMenuNodeId,handleVerticalNav,handleExpandCollapse,handleEnter,handleRetry,onNewAgentWindow})});let agentCount=workspaceRoot?sessionTree.filter((n)=>n.type==="agent").length:diagnostics?.sessions.length??0,runningCount=workspaceRoot?sessionTree.filter((n)=>n.wsAgentState==="running").length:diagnostics?.sessions.reduce((sum,s2)=>sum+s2.windows.reduce((ws,w2)=>ws+w2.panes.length,0),0)??0,headerLabel=workspaceRoot?"Agents":"Sessions";return import_jsx_dev_runtime2.jsxDEV("box",{flexDirection:"column",width:"100%",height:"100%",backgroundColor:palette.bg,children:[import_jsx_dev_runtime2.jsxDEV("box",{height:1,paddingX:1,backgroundColor:palette.bgLight,children:import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:headerLabel},void 0,!1,void 0,this),diagnostics?import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:[" ",workspaceRoot?`${runningCount}/${agentCount}`:`${agentCount}s ${runningCount}p`]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)},void 0,!1,void 0,this),diagnostics?import_jsx_dev_runtime2.jsxDEV("scrollbox",{focused:!0,height:"100%",style:{scrollbarOptions:{showArrows:!1,trackOptions:{foregroundColor:palette.scrollThumb,backgroundColor:palette.scrollTrack}}},children:flatNodes.map((flat,i2)=>import_jsx_dev_runtime2.jsxDEV(TreeNodeRow,{node:flat.node,selected:i2===selectedIndex,onSelect:handleSelect,onToggle:handleToggle,onContextMenu:handleContextMenu},flat.node.id,!1,void 0,this))},void 0,!1,void 0,this):import_jsx_dev_runtime2.jsxDEV("box",{flexGrow:1,justifyContent:"center",alignItems:"center",children:import_jsx_dev_runtime2.jsxDEV("text",{fg:palette.textDim,children:"Collecting..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),contextMenuNodeId?import_jsx_dev_runtime2.jsxDEV(ContextMenu,{items:buildMenuItems(flatNodes.find((n)=>n.node.id===contextMenuNodeId)?.node??{}),onAction:handleContextMenuAction,onClose:()=>setContextMenuNodeId(null),positionY:flatNodes.findIndex((n)=>n.node.id===contextMenuNodeId)+1},void 0,!1,void 0,this):null,spawnIntoAgent!==null?import_jsx_dev_runtime2.jsxDEV(SpawnTargetPicker,{agentName:spawnIntoAgent,sessions:diagnostics?.sessions??[],onConfirm:handleSpawnIntoConfirm,onCancel:handleSpawnIntoCancel},void 0,!1,void 0,this):null,spawnPickerTarget!==null?import_jsx_dev_runtime2.jsxDEV(AgentPicker,{target:spawnPickerTarget,onConfirm:handleSpawnPickerConfirm,onCancel:handleSpawnPickerCancel},void 0,!1,void 0,this):null,showTeamCreate?import_jsx_dev_runtime2.jsxDEV(TeamCreate,{availableAgents:workspaceRoot?scanAgents(workspaceRoot):[],workspaceRoot,onConfirm:handleTeamCreateConfirm,onCancel:handleTeamCreateCancel},void 0,!1,void 0,this):null,import_jsx_dev_runtime2.jsxDEV(SystemStats,{},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("box",{height:1,paddingX:1,backgroundColor:palette.bgLight,children:import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:buildFooterHint(workspaceRoot)},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function useTeamCreateControls(opts){let{workspaceRoot,diagnostics,onTmuxSessionSelect}=opts,[showTeamCreate,setShowTeamCreate]=import_react24.useState(!1),pendingTeamNameRef=import_react24.useRef(null),handleOpenTeamCreate=import_react24.useCallback(()=>{if(!workspaceRoot)return;setShowTeamCreate(!0)},[workspaceRoot]),handleTeamCreateConfirm=import_react24.useCallback((result2)=>{setShowTeamCreate(!1),runTeamCreation(result2,workspaceRoot),pendingTeamNameRef.current=result2.teamName},[workspaceRoot]),handleTeamCreateCancel=import_react24.useCallback(()=>{setShowTeamCreate(!1)},[]);return import_react24.useEffect(()=>{let pending=pendingTeamNameRef.current;if(!pending||!diagnostics)return;let session=diagnostics.sessions.find((s2)=>s2.name===pending);if(!session)return;pendingTeamNameRef.current=null,onTmuxSessionSelect(session.name,resolvePreferredWindowIndex(session,pending))},[diagnostics,onTmuxSessionSelect]),{showTeamCreate,handleOpenTeamCreate,handleTeamCreateConfirm,handleTeamCreateCancel}}function handleEnterAgent(node,onTmuxSessionSelect){if(node.wsAgentState!=="running"&&node.wsAgentState!=="spawning")spawnAgent(agentNameFromNode(node),onTmuxSessionSelect);else if(node.wsAgentState==="running"){let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex)}}function dispatchContextMenuAction(action,node,payload,deps){let name=node.label;if(action==="spawn-into"&&node.type==="agent"&&deps.openSpawnInto){deps.openSpawnInto(agentNameFromNode(node));return}if(handleAttachAction(action,node,deps.onTmuxSessionSelect))return;if(handleRetryAction(action,name,deps.onTmuxSessionSelect))return;if(handleGenieAction(action,name,payload))return;let tmuxServer=process.env.GENIE_TMUX_SERVER||"genie";if(handleRenameAction(action,node,tmuxServer,payload))return;if(handleAgentWindowActions(action,node,name,tmuxServer,deps.onNewAgentWindow))return;if(handleSessionNodeActions(action,node,tmuxServer,payload))return;if(handleWindowNodeActions(action,node,deps.sessionTree,tmuxServer,payload))return;handlePaneNodeActions(action,node,deps.sessionTree,tmuxServer,deps.onNewAgentWindow)}function handleAttachAction(action,node,onTmuxSessionSelect){if(action!=="attach")return!1;let target=getSessionTarget(node);if(target)onTmuxSessionSelect(target.sessionName,target.windowIndex);return!0}function handleRetryAction(action,name,onTmuxSessionSelect){if(action!=="retry")return!1;return(async()=>{try{let{reconcileStaleSpawns:reconcileStaleSpawns2}=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry));await reconcileStaleSpawns2()}catch{}spawnAgent(name,onTmuxSessionSelect)})(),!0}function handleGenieAction(action,name,payload){if(action==="send"&&payload)return executeGenie(["agent","send",payload,"--to",name]),!0;if(action==="answer-text"&&payload)return executeGenie(["agent","answer",name,`text:${payload}`]),!0;let genieArgs={spawn:["spawn",name],"spawn-plan":["spawn",name,"--plan-mode"],stop:["agent","stop",name],kill:["agent","kill",name],log:["agent","log",name],show:["agent","show",name],read:["read",name],"answer-yes":["agent","answer",name,"yes"],"answer-no":["agent","answer",name,"no"]}[action];if(genieArgs)return executeGenie(genieArgs),!0;return!1}function handleRenameAction(action,node,tmuxServer,payload){if(action==="rename-session"&&payload){let sess=node.type==="agent"?node.data.sessionName||node.label:node.id.split(":").slice(1).join(":");return executeTmux3(["-L",tmuxServer,"rename-session","-t",sess,payload]),!0}if(action==="rename-window"&&payload){let idParts=node.id.split(":"),windowTarget=`${idParts[1]}:${idParts[2]}`;return executeTmux3(["-L",tmuxServer,"rename-window","-t",windowTarget,payload]),!0}if(action==="rename-pane"&&payload&&node.type==="pane"){let paneId=node.data.paneId;return executeTmux3(["-L",tmuxServer,"select-pane","-t",`${paneId}`,"-T",payload]),!0}return!1}function handleAgentWindowActions(action,node,name,tmuxServer,onNewAgentWindow){if(action==="agent-new-window"&&node.type==="agent"){if(onNewAgentWindow)onNewAgentWindow(agentNameFromNode(node));return!0}if(action==="new-empty-window"&&node.type==="agent"){let sessionName=node.data.sessionName||name;return executeTmux3(["-L",tmuxServer,"new-window","-a","-t",sessionName]),!0}return!1}function handleSessionNodeActions(action,node,tmuxServer,payload){if(node.type!=="session")return!1;let sess=node.id.split(":").slice(1).join(":");if(action==="kill-session")return executeTmux3(["-L",tmuxServer,"kill-session","-t",sess]),!0;if(action==="new-window")return executeTmux3(["-L",tmuxServer,"new-window","-a","-t",sess]),!0;if(action==="clone-session")return executeTmux3(["-L",tmuxServer,"new-session","-d","-s",`${sess}-clone`,"-t",sess]),!0;if(action==="spawn-in-session"&&payload)return executeGenie(["spawn",payload,"--session",sess]),!0;return!1}function handleWindowNodeActions(action,node,sessionTree,tmuxServer,payload){if(node.type!=="window")return!1;let idParts=node.id.split(":"),windowTarget=`${idParts[1]}:${idParts[2]}`;if(action==="kill-window")return executeTmux3(["-L",tmuxServer,"kill-window","-t",windowTarget]),!0;if(action==="window-new-agent"){let parentAgent=findParentAgent(sessionTree,node.id);if(parentAgent){let agentFullName=agentNameFromNode(parentAgent),suffix=Date.now()%1e4,role=`${agentFullName}-${suffix}`;executeGenie(["spawn",agentFullName,"--role",role,"--window",windowTarget])}return!0}if(action==="split-pane")return executeTmux3(["-L",tmuxServer,"split-window","-t",windowTarget]),!0;if(action==="spawn-in-window"&&payload)return executeGenie(["spawn",payload,"--session",idParts[1]]),!0;return!1}function handlePaneNodeActions(action,node,sessionTree,tmuxServer,onNewAgentWindow){if(node.type!=="pane")return!1;let paneId=node.data.paneId;if(action==="clone-agent"){let parentAgent=findParentAgent(sessionTree,node.id);if(parentAgent&&onNewAgentWindow)onNewAgentWindow(agentNameFromNode(parentAgent));return!0}if(action==="kill-pane")return executeTmux3(["-L",tmuxServer,"kill-pane","-t",`${paneId}`]),!0;if(action==="split-h")return executeTmux3(["-L",tmuxServer,"split-window","-h","-t",`${paneId}`]),!0;if(action==="split-v")return executeTmux3(["-L",tmuxServer,"split-window","-v","-t",`${paneId}`]),!0;return!1}function buildFooterHint(workspaceRoot){return`\u2191\u2193:nav \u2190\u2192:expand Enter:${workspaceRoot?"spawn/attach":"attach"} ^T:new${workspaceRoot?" ^N:team":""} R:retry .:menu`}function tryOpenTeamCreate(key,opts){if(!key.ctrl||key.name!=="n")return!1;if(!opts.workspaceRoot||opts.showTeamCreate||opts.contextMenuNodeId)return!1;return opts.handleOpenTeamCreate(),!0}function tryOpenContextMenu(flatNodes,selectedIndex,setContextMenuNodeId){let node=flatNodes[selectedIndex]?.node;if(node&&buildMenuItems(node).length>0)return setContextMenuNodeId(node.id),!0;return!1}function dispatchNavKey(key,handlers2,agentAction){let n=key.name;if(n==="up"||n==="k"||n==="down"||n==="j")handlers2.handleVerticalNav(n);else if(n==="right"||n==="l"||n==="left"||n==="h")handlers2.handleExpandCollapse(n);else if(n==="enter"||n==="return")handlers2.handleEnter();else if(n==="r")handlers2.handleRetry();else if(key.ctrl&&n==="t")agentAction()}function handleKeyboardInput(key,opts){if(key.name==="."&&!opts.contextMenuNodeId){if(tryOpenContextMenu(opts.flatNodes,opts.selectedIndex,opts.setContextMenuNodeId))return}if(opts.contextMenuNodeId)return;dispatchNavKey(key,opts,()=>{let node=opts.flatNodes[opts.selectedIndex]?.node;if(node?.type==="agent"&&node.wsAgentState==="running"&&opts.onNewAgentWindow)opts.onNewAgentWindow(agentNameFromNode(node))})}function agentNameFromNode(node){return node.id.replace(/^agent:/,"")}function spawnAgent(name,onTmuxSessionSelect){try{let{spawn:spawn5}=__require("child_process"),{join:join69,resolve:resolve14}=__require("path"),{existsSync:existsSync57,mkdirSync:mkdirSync24,openSync:openSync3}=__require("fs"),{homedir:homedir37}=__require("os"),bunPath=process.execPath||"bun",genieBin=process.argv[1],wsRoot=process.env.GENIE_TUI_WORKSPACE,sessionName=name.replace(/\//g,"-"),cwd;if(wsRoot){let parentName=name.includes("/")?name.slice(0,name.indexOf("/")):name,agentDir=resolve14(join69(wsRoot,"agents",parentName));if(existsSync57(agentDir))cwd=agentDir}let{GENIE_TUI_PANE:_a,GENIE_TUI_RIGHT:_b,GENIE_TUI_WORKSPACE:_c,GENIE_IS_DAEMON:_d,...cleanEnv}=process.env,logDir=join69(homedir37(),".genie","logs","tui-spawn");try{mkdirSync24(logDir,{recursive:!0})}catch{}let logPath=join69(logDir,`${sessionName}-${Date.now()}.log`),logFd;try{logFd=openSync3(logPath,"a")}catch{logFd=void 0}let spawnOpts=logFd!==void 0?{detached:!0,stdio:["ignore",logFd,logFd],cwd,env:cleanEnv}:{detached:!0,stdio:"ignore",cwd,env:cleanEnv},child=genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,"spawn",name,"--session",sessionName,"--new-window"],spawnOpts):spawn5("genie",["spawn",name,"--session",sessionName,"--new-window"],spawnOpts);if(child.on("exit",(code)=>{if(code&&code!==0)console.error(`TUI: spawn "${name}" exited ${code}. See ${logPath}`)}),child.on("error",(err)=>{console.error(`TUI: spawn "${name}" error: ${err.message}. See ${logPath}`)}),child.unref(),onTmuxSessionSelect)attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect)}catch(err){console.error(`TUI: spawn failed for ${name}:`,err instanceof Error?err.message:err)}}function attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect,attempt=0){(async()=>{try{let session=(await collectDiagnostics()).sessions.find((candidate)=>candidate.name===sessionName);if(session){let windowIndex=resolvePreferredWindowIndex(session,sessionName);if(windowIndex!==void 0){onTmuxSessionSelect(sessionName,windowIndex);return}}}catch{}if(attempt>=40){onTmuxSessionSelect(sessionName);return}setTimeout(()=>{attachSpawnedAgentWhenReady(sessionName,onTmuxSessionSelect,attempt+1)},250)})()}function executeTmux3(args){try{let{spawn:spawn5}=__require("child_process");spawn5("tmux",args,{detached:!0,stdio:"ignore"}).unref()}catch{}}function executeGenie(args){try{let{spawn:spawn5}=__require("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1];(genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{detached:!0,stdio:"ignore"}):spawn5("genie",args,{detached:!0,stdio:"ignore"})).unref()}catch{}}function executeGenieAwaited(args){return new Promise((resolve14,reject)=>{try{let{spawn:spawn5}=__require("child_process"),bunPath=process.execPath||"bun",genieBin=process.argv[1],child=genieBin&&genieBin!=="genie"?spawn5(bunPath,[genieBin,...args],{stdio:"ignore"}):spawn5("genie",args,{stdio:"ignore"});child.on("exit",(code)=>resolve14(code)),child.on("error",reject)}catch(err){reject(err instanceof Error?err:Error(String(err)))}})}function resolveSpawnHereTarget(node){if(node.type==="session"){let sess=node.id.split(":").slice(1).join(":");if(sess.length===0)return null;return{session:sess}}if(node.type==="window"){let idParts=node.id.split(":");if(idParts.length<3)return null;return{session:idParts[1],window:`${idParts[1]}:${idParts[2]}`}}return null}function executeSpawnIntent(intent){try{let{argv}=buildSpawnInvocation(intent);executeGenie(argv)}catch(err){console.error("TUI: spawn-intent execution failed:",err instanceof Error?err.message:err)}}async function runTeamCreation(result2,workspaceRoot){let argv;try{({argv}=buildSpawnInvocation({kind:"create-team",name:result2.teamName,repo:workspaceRoot}))}catch(err){console.error("TUI: team create intent build failed:",err instanceof Error?err.message:err);return}let createExit=null;try{createExit=await executeGenieAwaited(argv)}catch(err){console.error("TUI: team create spawn failed:",err instanceof Error?err.message:err);return}if(createExit!==0){console.error(`TUI: team create exited ${createExit} \u2014 skipping member hires for "${result2.teamName}"`);return}for(let member of result2.members)try{let code=await executeGenieAwaited(["team","hire",member,"--team",result2.teamName]);if(code!==0)console.error(`TUI: team hire "${member}" exited ${code} \u2014 continuing with remaining members`)}catch(err){console.error(`TUI: team hire "${member}" failed:`,err instanceof Error?err.message:err)}}function findParentAgent(tree,targetId){for(let node of tree){if(node.type==="agent"&&containsNode(node,targetId))return node;let found=findParentAgent(node.children,targetId);if(found)return found}return null}function containsNode(node,targetId){if(node.id===targetId)return!0;return node.children.some((c)=>containsNode(c,targetId))}function mergeExpandedState(oldTree,newTree){if(oldTree.length===0)return newTree;let oldState=new Map;function collect(nodes){for(let n of nodes)oldState.set(n.id,{expanded:n.expanded,childCount:n.children.length}),collect(n.children)}collect(oldTree);function apply(nodes){return nodes.map((n)=>({...n,expanded:(()=>{let previous=oldState.get(n.id);if(!previous)return n.expanded;if(previous.childCount===0&&n.children.length>0)return n.expanded;return previous.expanded})(),children:apply(n.children)}))}return apply(newTree)}var import_react24;var init_Nav=__esm(async()=>{init_spawn_invocation();init_workspace();init_diagnostics();init_initial_agent();init_theme2();init_SystemStats();init_TreeNode();init_jsx_dev_runtime();await __promiseAll([init_react(),init_AgentPicker(),init_ContextMenu(),init_SpawnTargetPicker(),init_TeamCreate()]);import_react24=__toESM(require_react_development(),1)});function QuitDialog({onConfirm,onCancel}){return useKeyboard((key)=>{if(key.name==="enter"||key.name==="return"||key.name==="y")onConfirm();else if(key.name==="escape"||key.name==="n")onCancel()}),import_jsx_dev_runtime2.jsxDEV("box",{position:"absolute",width:"100%",height:"100%",justifyContent:"center",alignItems:"center",backgroundColor:"#0a0a0a",children:import_jsx_dev_runtime2.jsxDEV("box",{border:!0,borderColor:palette.violet,backgroundColor:"#111111",paddingX:3,paddingY:1,flexDirection:"column",alignItems:"center",gap:1,children:[import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.purple,children:"Quit genie?"},void 0,!1,void 0,this)},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:[import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:"Enter"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:" to quit "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:" | "},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.text,children:" Esc"},void 0,!1,void 0,this),import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textDim,children:" to cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),import_jsx_dev_runtime2.jsxDEV("text",{children:import_jsx_dev_runtime2.jsxDEV("span",{fg:palette.textMuted,children:"Hint: Ctrl+D to detach (keep running)"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)}var init_QuitDialog=__esm(async()=>{init_theme2();init_jsx_dev_runtime();await init_react()});import{execSync as execSync18}from"child_process";import{readFileSync as readFileSync36}from"fs";function App({rightPane,workspaceRoot,initialAgent}){let[showQuit,setShowQuit]=import_react27.useState(!1);useKeyboard((key)=>{if(key.ctrl&&key.name==="q")if(showQuit)handleQuit();else setShowQuit(!0)});let handleQuit=import_react27.useCallback(()=>{try{let genieHome6=process.env.GENIE_HOME??`${process.env.HOME}/.genie`,pid=readFileSync36(`${genieHome6}/serve.pid`,"utf-8").trim();process.kill(Number.parseInt(pid,10),"SIGTERM")}catch{}try{execSync18("tmux -L genie-tui kill-server",{stdio:"ignore"})}catch{}},[]),handleTmuxSessionSelect=import_react27.useCallback((sessionName,windowIndex)=>{if(!rightPane)return;attachProjectWindow(rightPane,sessionName,windowIndex)},[rightPane]);return import_jsx_dev_runtime2.jsxDEV("box",{width:"100%",height:"100%",children:[import_jsx_dev_runtime2.jsxDEV(Nav,{onTmuxSessionSelect:handleTmuxSessionSelect,onNewAgentWindow:newAgentWindow,workspaceRoot,initialAgent,keyboardDisabled:showQuit},void 0,!1,void 0,this),showQuit?import_jsx_dev_runtime2.jsxDEV(QuitDialog,{onConfirm:handleQuit,onCancel:()=>setShowQuit(!1)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}var import_react27;var init_app=__esm(async()=>{init_tmux2();init_jsx_dev_runtime();await __promiseAll([init_react(),init_Nav(),init_QuitDialog()]);import_react27=__toESM(require_react_development(),1)});var exports_render={};__export(exports_render,{renderNav:()=>renderNav});async function renderNav(){let rightPane=process.env.GENIE_TUI_RIGHT||void 0,workspaceRoot=process.env.GENIE_TUI_WORKSPACE||void 0,initialAgent=process.env.GENIE_TUI_AGENT||void 0,renderer=await createCliRenderer({exitOnCtrlC:!1,useMouse:!0});createRoot(renderer).render(import_jsx_dev_runtime2.jsxDEV(App,{rightPane,workspaceRoot,initialAgent},void 0,!1,void 0,this)),await new Promise((resolve14)=>{renderer.once("destroy",resolve14)})}var init_render=__esm(async()=>{init_jsx_dev_runtime();await __promiseAll([init_core(),init_react(),init_app()])});var exports_tui={};__export(exports_tui,{launchTui:()=>launchTui});async function launchTui(){let{renderNav:renderNav2}=await init_render().then(() => exports_render);await renderNav2()}var exports_resolve_agent_cwd={};__export(exports_resolve_agent_cwd,{resolveAgentFromCwd:()=>resolveAgentFromCwd});import{existsSync as existsSync57}from"fs";import{basename as basename14,dirname as dirname17,join as join69,relative as relative7,sep as sep3}from"path";function isRelativeWithin(rel,original){return!rel.startsWith("..")&&rel!==original}function resolveFromCanonicalDir(cwd,agentsDir){let relToAgents=relative7(agentsDir,cwd);if(!isRelativeWithin(relToAgents,cwd))return null;let segments=relToAgents.split(sep3).filter(Boolean);if(segments.length===0)return null;let agentName=segments[0];if(!existsSync57(join69(agentsDir,agentName,"AGENTS.md")))return null;let source=segments.length===1?"exact":"parent";return{agent:agentName,source}}function resolveFromWalkUp(cwd,workspaceRoot){let wsRel=relative7(workspaceRoot,cwd);if(!isRelativeWithin(wsRel,cwd))return null;let current=cwd;while(current!==workspaceRoot&¤t!==dirname17(current)){if(existsSync57(join69(current,"AGENTS.md")))return{agent:basename14(current),source:"parent"};current=dirname17(current)}return null}function resolveAgentFromCwd(cwd,workspaceRoot){return resolveFromCanonicalDir(cwd,join69(workspaceRoot,"agents"))??resolveFromWalkUp(cwd,workspaceRoot)??{agent:"genie",source:"default"}}var init_resolve_agent_cwd=()=>{};var import__=__toESM(require_commander(),1),{program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help}=import__.default;init_claude_settings();init_ensure_tmux();init_genie_config2();init_system_detect();init_workspace();import{existsSync as existsSync16,readFileSync as readFileSync11,readdirSync as readdirSync5,statSync as statSync2,unlinkSync as unlinkSync6}from"fs";import{homedir as homedir15}from"os";import{join as join18}from"path";var{$:$3}=globalThis.Bun;init_db();init_emit();import{existsSync as existsSync14,readFileSync as readFileSync9}from"fs";import{homedir as homedir13}from"os";import{join as join16}from"path";var WATCHER_META_TYPES=["emitter.rejected","emitter.queue.depth","emitter.latency_p99","notify.delivery.lag","stream.gap.detected","correlation.orphan.rate"];function spillJournalPath(){let home=process.env.GENIE_HOME??join16(homedir13(),".genie");return join16(home,"data","emit-spill.jsonl")}function collectWatchdogStatus(){let timerPresent=existsSync14("/etc/systemd/system/genie-watchdog.timer"),servicePresent=existsSync14("/etc/systemd/system/genie-watchdog.service");if(timerPresent&&servicePresent)return{status:"ok"};if(!timerPresent&&!servicePresent)return{status:"warn",detail:"watchdog not installed \u2014 run: bun run packages/watchdog/src/cli.ts install"};return{status:"warn",detail:`partial install: timer=${timerPresent} service=${servicePresent}`}}function collectSpillJournalStatus(){try{if(isSpillJournalEmpty())return"empty";return"pending"}catch{let path2=spillJournalPath();try{if(!existsSync14(path2))return"empty";return readFileSync9(path2,"utf8").trim().length===0?"empty":"pending"}catch{return"unknown"}}}async function collectWatcherMetricStatus(sql){let rows=await sql.unsafe(`
|
|
3522
3531
|
SELECT subject AS type, max(created_at) AS last_seen_at
|
|
3523
3532
|
FROM genie_runtime_events
|
|
3524
3533
|
WHERE subject = ANY($1)
|
|
@@ -3539,7 +3548,7 @@ Bus `);for(let i2=1;i2<parts.length;i2++){let usb2=parseLinuxUsb(parts[i2]);resu
|
|
|
3539
3548
|
`)}init_setup();init_shortcuts();import{existsSync as existsSync19}from"fs";import{homedir as homedir19}from"os";import{join as join22}from"path";async function shortcutsShowCommand(){displayShortcuts();let home=homedir19(),tmuxConf=join22(home,".tmux.conf"),zshrc=join22(home,".zshrc"),bashrc=join22(home,".bashrc");if(console.log("Installation status:"),isShortcutsInstalled(tmuxConf))console.log(" \x1B[32m\u2713\x1B[0m tmux.conf");else console.log(" \x1B[33m-\x1B[0m tmux.conf");let shellRc=existsSync19(zshrc)?zshrc:bashrc;if(isShortcutsInstalled(shellRc))console.log(` \x1B[32m\u2713\x1B[0m ${shellRc.replace(home,"~")}`);else console.log(` \x1B[33m-\x1B[0m ${shellRc.replace(home,"~")}`);console.log(),console.log("Run \x1B[36mgenie shortcuts install\x1B[0m to install shortcuts."),console.log("Run \x1B[36mgenie shortcuts uninstall\x1B[0m to remove shortcuts."),console.log()}async function shortcutsInstallCommand(){await installShortcuts()}async function shortcutsUninstallCommand(){await uninstallShortcuts()}init_esm14();init_claude_settings();init_genie_config2();import{existsSync as existsSync20,lstatSync,rmSync as rmSync2,unlinkSync as unlinkSync8}from"fs";import{homedir as homedir20}from"os";import{join as join23}from"path";var ORCHESTRATION_RULES_PATH=join23(homedir20(),".claude","rules","genie-orchestration.md"),LOCAL_BIN=join23(homedir20(),".local","bin"),SYMLINKS=["genie","term"];function isGenieSymlink(path3){try{if(!existsSync20(path3))return!1;if(!lstatSync(path3).isSymbolicLink())return!1;return!0}catch{return!1}}function removeSymlinks(){let removed=[];for(let name of SYMLINKS){let symlinkPath=join23(LOCAL_BIN,name);if(isGenieSymlink(symlinkPath))try{unlinkSync8(symlinkPath),removed.push(name)}catch{}}return removed}function tryRemoveStep(label,successMsg,fn){console.log(`\x1B[2m${label}\x1B[0m`);try{fn(),console.log(` \x1B[32m+\x1B[0m ${successMsg}`)}catch(error){let message=error instanceof Error?error.message:String(error);console.log(` \x1B[33m!\x1B[0m ${label.replace("...","")} failed: ${message}`)}}function performUninstall(hasHookScript,existingSymlinks,genieDir,hasGenieDir){if(hasHookScript)tryRemoveStep("Removing hook script...","Hook script removed",()=>removeHookScript());if(existingSymlinks.length>0){console.log("\x1B[2mRemoving symlinks...\x1B[0m");let removed=removeSymlinks();if(removed.length>0)console.log(` \x1B[32m+\x1B[0m Removed: ${removed.join(", ")}`)}if(existsSync20(ORCHESTRATION_RULES_PATH))tryRemoveStep("Removing orchestration rules...","Orchestration rules removed (~/.claude/rules/genie-orchestration.md)",()=>unlinkSync8(ORCHESTRATION_RULES_PATH));if(hasGenieDir)tryRemoveStep("Removing genie directory...","Directory removed",()=>rmSync2(genieDir,{recursive:!0,force:!0}))}async function uninstallCommand(){console.log(),console.log("\x1B[1m\x1B[33m Uninstall Genie CLI\x1B[0m"),console.log();let genieDir=getGenieDir(),hasGenieDir=existsSync20(genieDir),hasHookScript=hookScriptExists(),hasOrchestrationRules=existsSync20(ORCHESTRATION_RULES_PATH),existingSymlinks=SYMLINKS.filter((name)=>isGenieSymlink(join23(LOCAL_BIN,name)));if(console.log("\x1B[2mThis will remove:\x1B[0m"),hasHookScript)console.log(" \x1B[31m-\x1B[0m Hook script (~/.claude/hooks/genie-bash-hook.sh)");if(hasOrchestrationRules)console.log(" \x1B[31m-\x1B[0m Orchestration rules (~/.claude/rules/genie-orchestration.md)");if(hasGenieDir)console.log(` \x1B[31m-\x1B[0m Genie directory (${contractPath(genieDir)})`);if(existingSymlinks.length>0)console.log(` \x1B[31m-\x1B[0m Symlinks from ~/.local/bin: ${existingSymlinks.join(", ")}`);if(console.log(),!hasGenieDir&&!hasHookScript&&!hasOrchestrationRules&&existingSymlinks.length===0){console.log("\x1B[33mNothing to uninstall.\x1B[0m"),console.log();return}if(!await esm_default4({message:"Are you sure you want to uninstall Genie CLI?",default:!1})){console.log(),console.log("\x1B[2mUninstall cancelled.\x1B[0m"),console.log();return}console.log(),performUninstall(hasHookScript,existingSymlinks,genieDir,hasGenieDir),console.log(),console.log("\x1B[32m+\x1B[0m Genie CLI uninstalled."),console.log(),console.log("\x1B[2mNote: If you installed via npm/bun, also run:\x1B[0m"),console.log(" \x1B[36mbun remove -g @automagik/genie\x1B[0m"),console.log(" \x1B[2mor\x1B[0m"),console.log(" \x1B[36mnpm uninstall -g @automagik/genie\x1B[0m"),console.log()}init_genie_config2();import{execSync as execSync4,spawn as spawn3}from"child_process";import{chmodSync as chmodSync2,copyFileSync as copyFileSync2,existsSync as existsSync21,mkdirSync as mkdirSync10,readFileSync as readFileSync15,readdirSync as readdirSync6,rmSync as rmSync3,writeFileSync as writeFileSync9}from"fs";import{chmod,copyFile,mkdir as mkdir4,unlink as unlink2}from"fs/promises";import{homedir as homedir21}from"os";import{join as join24}from"path";var GENIE_HOME2=process.env.GENIE_HOME||join24(homedir21(),".genie"),GENIE_SRC=join24(GENIE_HOME2,"src"),GENIE_BIN=join24(GENIE_HOME2,"bin"),LOCAL_BIN2=join24(homedir21(),".local","bin");function log(message){console.log(`\x1B[32m\u25B8\x1B[0m ${message}`)}function success(message){console.log(`\x1B[32m\u2714\x1B[0m ${message}`)}function error(message){console.log(`\x1B[31m\u2716\x1B[0m ${message}`)}async function runCommand(command,args,cwd){return new Promise((resolve3)=>{let output=[],child=spawn3(command,args,{cwd,stdio:["inherit","pipe","pipe"],env:{...process.env,FORCE_COLOR:"1"}});child.stdout?.on("data",(data)=>{let str2=data.toString();output.push(str2),process.stdout.write(str2)}),child.stderr?.on("data",(data)=>{let str2=data.toString();output.push(str2),process.stderr.write(str2)}),child.on("close",(code)=>{resolve3({success:code===0,output:output.join("")})}),child.on("error",(err)=>{error(err.message),resolve3({success:!1,output:err.message})})})}async function getGitInfo(cwd){try{let branchResult=await runCommandSilent("git",["rev-parse","--abbrev-ref","HEAD"],cwd),commitResult=await runCommandSilent("git",["rev-parse","--short","HEAD"],cwd),dateResult=await runCommandSilent("git",["log","-1","--format=%ci"],cwd);if(branchResult.success&&commitResult.success&&dateResult.success)return{branch:branchResult.output.trim(),commit:commitResult.output.trim(),commitDate:dateResult.output.trim().split(" ")[0]}}catch{}return null}async function runCommandSilent(command,args,cwd,timeoutMs=4000){return new Promise((resolve3)=>{let output=[],settled=!1,child=spawn3(command,args,{cwd,stdio:["inherit","pipe","pipe"]}),timer2=setTimeout(()=>{if(settled)return;settled=!0,child.kill("SIGTERM"),resolve3({success:!1,output:`Timed out after ${timeoutMs}ms`})},timeoutMs);child.stdout?.on("data",(data)=>{output.push(data.toString())}),child.stderr?.on("data",(data)=>{output.push(data.toString())}),child.on("close",(code)=>{if(settled)return;settled=!0,clearTimeout(timer2),resolve3({success:code===0,output:output.join("")})}),child.on("error",(err)=>{if(settled)return;settled=!0,clearTimeout(timer2),resolve3({success:!1,output:err.message})})})}function detectFromBinaryPath(path3){if(path3.includes(".bun"))return"bun";if(path3.includes("node_modules"))return"npm";if(path3===join24(LOCAL_BIN2,"genie")||path3.startsWith(GENIE_BIN))return"source";return null}async function detectInstallationType(){if(genieConfigExists())try{let config=await loadGenieConfig();if(config.installMethod)return config.installMethod}catch{}if(existsSync21(join24(GENIE_SRC,".git")))return"source";let result2=await runCommandSilent("which",["genie"]);if(!result2.success)return"unknown";let detected=detectFromBinaryPath(result2.output.trim());if(detected)return detected;return(await runCommandSilent("which",["bun"])).success?"bun":"npm"}async function updateViaBun(channel){try{__require("fs").unlinkSync(join24(homedir21(),".bun","install","global","bun.lock"))}catch{}if(log(`Updating via bun (channel: ${channel})...`),!(await runCommand("bun",["add","-g","--force","--no-cache",`@automagik/genie@${channel}`])).success)return error("Failed to update via bun"),!1;return console.log(),success(`Genie CLI updated via bun (${channel})!`),!0}async function updateViaNpm(channel){if(log(`Updating via npm (channel: ${channel})...`),!(await runCommand("npm",["install","-g",`@automagik/genie@${channel}`])).success)return error("Failed to update via npm"),!1;return console.log(),success(`Genie CLI updated via npm (${channel})!`),!0}async function detectGlobalInstalls(){let found=new Set,[npmResult,bunResult]=await Promise.all([runCommandSilent("npm",["list","-g","@automagik/genie"]),runCommandSilent("bun",["pm","ls","-g"])]);if(npmResult.success&&!npmResult.output.includes("(empty)"))found.add("npm");if(bunResult.success&&bunResult.output.includes("@automagik/genie"))found.add("bun");return found}async function updateSource(){let beforeInfo=await getGitInfo(GENIE_SRC);if(beforeInfo)console.log(`Current: \x1B[2m${beforeInfo.branch}@${beforeInfo.commit} (${beforeInfo.commitDate})\x1B[0m`),console.log();if(log("Fetching latest changes..."),!(await runCommand("git",["fetch","origin"],GENIE_SRC)).success)error("Failed to fetch from origin"),process.exit(1);if(log("Resetting to origin/main..."),!(await runCommand("git",["reset","--hard","origin/main"],GENIE_SRC)).success)error("Failed to reset to origin/main"),process.exit(1);console.log();let afterInfo=await getGitInfo(GENIE_SRC);if(beforeInfo&&afterInfo&&beforeInfo.commit===afterInfo.commit){success("Already up to date!"),console.log();return}if(log("Installing dependencies..."),!(await runCommand("bun",["install"],GENIE_SRC)).success)error("Failed to install dependencies"),process.exit(1);if(console.log(),log("Building..."),!(await runCommand("bun",["run","build"],GENIE_SRC)).success)error("Failed to build"),process.exit(1);console.log(),log("Installing binaries...");try{await mkdir4(GENIE_BIN,{recursive:!0}),await mkdir4(LOCAL_BIN2,{recursive:!0});let binaries=["genie.js","term.js"],names=["genie","term"];for(let i2=0;i2<binaries.length;i2++){let src=join24(GENIE_SRC,"dist",binaries[i2]),binDest=join24(GENIE_BIN,binaries[i2]),linkDest=join24(LOCAL_BIN2,names[i2]);await copyFile(src,binDest),await chmod(binDest,493),await symlinkOrCopy(binDest,linkDest)}for(let legacy of["claudio.js","claudio"]){let legacyBin=join24(GENIE_BIN,legacy),legacyLink=join24(LOCAL_BIN2,legacy);try{await unlink2(legacyBin)}catch{}try{await unlink2(legacyLink)}catch{}}success("Binaries installed")}catch(err){error(`Failed to install binaries: ${err}`),process.exit(1)}if(console.log(),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\x1B[0m"),success("Genie CLI updated successfully!"),console.log(),afterInfo)console.log(`Version: \x1B[36m${afterInfo.branch}@${afterInfo.commit}\x1B[0m (${afterInfo.commitDate})`),console.log()}async function symlinkOrCopy(src,dest){let{symlink:symlink2,unlink:unlink3}=await import("fs/promises");try{if(existsSync21(dest))await unlink3(dest);await symlink2(src,dest)}catch{await copyFile(src,dest)}}function copyDirSync(src,dest){mkdirSync10(dest,{recursive:!0});for(let entry2 of readdirSync6(src,{withFileTypes:!0})){let srcPath=join24(src,entry2.name),destPath=join24(dest,entry2.name);if(entry2.isDirectory())copyDirSync(srcPath,destPath);else copyFileSync2(srcPath,destPath)}}async function resolveGlobalPkgDir(installType){if(installType==="bun"){let bunPath=join24(homedir21(),".bun","install","global","node_modules","@automagik","genie");if(existsSync21(bunPath))return bunPath}if(installType==="npm"){let npmRootResult=await runCommandSilent("npm",["root","-g"]);if(npmRootResult.success){let npmPath=join24(npmRootResult.output.trim(),"@automagik","genie");if(existsSync21(npmPath))return npmPath}}let bunFallback=join24(homedir21(),".bun","install","global","node_modules","@automagik","genie");if(existsSync21(bunFallback))return bunFallback;let npmRootFallback=await runCommandSilent("npm",["root","-g"]);if(npmRootFallback.success){let npmPath=join24(npmRootFallback.output.trim(),"@automagik","genie");if(existsSync21(npmPath))return npmPath}return null}function updatePluginRegistry(claudePlugins,cacheDir,version){let registryPath=join24(claudePlugins,"installed_plugins.json");try{if(!existsSync21(registryPath))return;let registry=JSON.parse(readFileSync15(registryPath,"utf-8")),entries=registry.plugins?.["genie@automagik"];if(!Array.isArray(entries))return;for(let entry2 of entries)if(entry2.scope==="user")entry2.installPath=cacheDir,entry2.version=version,entry2.lastUpdated=new Date().toISOString();writeFileSync9(registryPath,JSON.stringify(registry,null,2))}catch(err){log(`Registry update failed (non-fatal): ${err}`)}}function syncTmuxConf(tmuxScriptsSrc){mkdirSync10(GENIE_HOME2,{recursive:!0});let tmuxConfSrc=join24(tmuxScriptsSrc,"genie.tmux.conf"),tmuxConfDest=join24(GENIE_HOME2,"tmux.conf");if(existsSync21(tmuxConfSrc))try{copyFileSync2(tmuxConfSrc,tmuxConfDest),success(`Installed tmux config to ${tmuxConfDest}`);try{let{tmuxBin:tmuxBin2}=(init_ensure_tmux(),__toCommonJS(exports_ensure_tmux));execSync4(`${tmuxBin2()} -L genie source-file '${tmuxConfDest}'`,{stdio:"ignore"}),success("Reloaded genie tmux server configuration")}catch{}}catch{}let tuiConfSrc=join24(tmuxScriptsSrc,"tui-tmux.conf"),tuiConfDest=join24(GENIE_HOME2,"tui-tmux.conf");if(existsSync21(tuiConfSrc))try{copyFileSync2(tuiConfSrc,tuiConfDest),success(`Installed TUI tmux config to ${tuiConfDest}`)}catch{}let osc52Src=join24(tmuxScriptsSrc,"osc52-copy.sh"),osc52Dest=join24(GENIE_HOME2,"scripts","osc52-copy.sh");if(existsSync21(osc52Src))try{copyFileSync2(osc52Src,osc52Dest),chmodSync2(osc52Dest,493),success(`Installed OSC 52 clipboard helper to ${osc52Dest}`)}catch{}}function syncTmuxScripts(globalPkgDir){let tmuxScriptsSrc=join24(globalPkgDir,"scripts","tmux");if(!existsSync21(tmuxScriptsSrc))return;let scriptsDir=join24(GENIE_HOME2,"scripts");mkdirSync10(scriptsDir,{recursive:!0});let scriptCount=0;for(let entry2 of readdirSync6(tmuxScriptsSrc))if(entry2.endsWith(".sh")||entry2==="genie.tmux.conf"||entry2==="tui-tmux.conf"){let src=join24(tmuxScriptsSrc,entry2),dest=join24(scriptsDir,entry2);copyFileSync2(src,dest);try{chmodSync2(dest,entry2.endsWith(".sh")?493:420)}catch{}scriptCount++}if(scriptCount>0)success(`Refreshed ${scriptCount} tmux scripts at ${scriptsDir}`);syncTmuxConf(tmuxScriptsSrc)}function syncMarketplaceVersion(claudePlugins,version){let marketplacePath=join24(claudePlugins,"marketplaces","automagik",".claude-plugin","marketplace.json");try{if(!existsSync21(marketplacePath))return;let data=JSON.parse(readFileSync15(marketplacePath,"utf-8"));if(Array.isArray(data.plugins)){for(let plugin of data.plugins)if(plugin.name==="genie")plugin.version=version}writeFileSync9(marketplacePath,JSON.stringify(data,null,2)),success(`Updated marketplace.json to v${version}`)}catch(err){log(`Marketplace version update failed (non-fatal): ${err}`)}}function syncPluginPackageVersion(claudePlugins,version){let pkgPath=join24(claudePlugins,"marketplaces","automagik","plugins","genie","package.json");try{if(!existsSync21(pkgPath))return;let data=JSON.parse(readFileSync15(pkgPath,"utf-8"));data.version=version,writeFileSync9(pkgPath,JSON.stringify(data,null,2)),success(`Updated plugin package.json to v${version}`)}catch(err){log(`Plugin package.json update failed (non-fatal): ${err}`)}}function syncSkillsSymlink(claudePlugins,version){let skillsLink=join24(claudePlugins,"marketplaces","automagik","plugins","genie","skills"),cacheSkills=join24("..","..","..","..","cache","automagik","genie",version,"skills");try{let{symlinkSync,unlinkSync:unlinkSync9,lstatSync:lstatSync2}=__require("fs");try{lstatSync2(skillsLink),unlinkSync9(skillsLink)}catch{}symlinkSync(cacheSkills,skillsLink),success(`Skills symlink \u2192 cache/${version}/skills`)}catch(err){log(`Skills symlink update failed (non-fatal): ${err}`)}}async function syncPlugin(installType){log("Syncing Claude Code plugin...");let globalPkgDir=await resolveGlobalPkgDir(installType);if(!globalPkgDir){log("Could not find installed package \u2014 skipping plugin sync");return}let pluginSrc=join24(globalPkgDir,"plugins","genie");if(!existsSync21(pluginSrc)){log("Plugin source not found in package \u2014 skipping plugin sync");return}let version;try{version=JSON.parse(readFileSync15(join24(globalPkgDir,"package.json"),"utf-8")).version}catch{log("Could not read package version \u2014 skipping plugin sync");return}let claudePlugins=join24(homedir21(),".claude","plugins"),cacheDir=join24(claudePlugins,"cache","automagik","genie",version);try{if(existsSync21(cacheDir))rmSync3(cacheDir,{recursive:!0,force:!0});copyDirSync(pluginSrc,cacheDir);let skillsSrc=join24(globalPkgDir,"skills");if(existsSync21(skillsSrc)&&!existsSync21(join24(cacheDir,"skills")))copyDirSync(skillsSrc,join24(cacheDir,"skills"))}catch(err){error(`Failed to copy plugin: ${err}`);return}updatePluginRegistry(claudePlugins,cacheDir,version),syncMarketplaceVersion(claudePlugins,version),syncPluginPackageVersion(claudePlugins,version),syncSkillsSymlink(claudePlugins,version),syncTmuxScripts(globalPkgDir),success(`Plugin synced to v${version}`)}async function resolveChannel(options){if(options.next)return"next";if(options.stable)return"latest";if(genieConfigExists())try{let config=await loadGenieConfig();if(config.updateChannel)return config.updateChannel}catch{}return"latest"}async function persistChannel(channel){try{let config=await loadGenieConfig();config.updateChannel=channel,await saveGenieConfig(config)}catch{}}async function updateCommand(options={}){console.log(),console.log("\x1B[1m\uD83E\uDDDE Genie CLI Update\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\x1B[0m"),console.log();let channel=await resolveChannel(options);if(options.next||options.stable)await persistChannel(channel);let installType=await detectInstallationType();if(log(`Detected installation: ${installType}`),log(`Channel: ${channel}${channel==="next"?" (dev builds)":" (stable)"}`),console.log(),installType==="unknown")error("No Genie CLI installation found"),console.log(),console.log("Install method not configured. Please reinstall genie:"),console.log("\x1B[36m curl -fsSL https://raw.githubusercontent.com/automagik-dev/genie/main/install.sh | bash\x1B[0m"),console.log(),process.exit(1);if(installType==="source"){await updateSource();return}let globalInstalls=await detectGlobalInstalls(),primaryMethod=installType;if(!(primaryMethod==="bun"?await updateViaBun(channel):await updateViaNpm(channel)))process.exit(1);let secondaryMethod=primaryMethod==="bun"?"npm":"bun";if(globalInstalls.has(secondaryMethod)){if(console.log(),log(`Also updating ${secondaryMethod}-global install...`),!(secondaryMethod==="bun"?await updateViaBun(channel):await updateViaNpm(channel)))error(`Secondary update via ${secondaryMethod} failed (non-blocking)`)}await syncPlugin(installType)}init_version();init_emit();init_trace_context();import{execSync as execSync5}from"child_process";var MAX_COMMITS=5;function getRecentGitHistory(filePath,cwd){try{let trimmed=execSync5(`git log --oneline -n ${MAX_COMMITS} -- ${JSON.stringify(filePath)}`,{encoding:"utf-8",timeout:5000,cwd,stdio:["pipe","pipe","pipe"]}).trim();if(!trimmed)return null;return trimmed}catch{return null}}async function auditContext(payload){let input=payload.tool_input;if(!input)return;let filePath=input.file_path;if(!filePath)return;let cwd=payload.cwd??process.cwd(),history=getRecentGitHistory(filePath,cwd);if(!history)return;return{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:`[audit-context] Recent git history for ${filePath}:
|
|
3540
3549
|
${history}`}}}function buildSearchNames(recipient,dirEntry){let names=new Set([recipient]);if(dirEntry){if(names.add(dirEntry.entry.name),dirEntry.entry.roles)for(let role of dirEntry.entry.roles)names.add(role)}return names}function buildSpawnArgs(template){let args=["spawn","--provider",template.provider,"--team",template.team];if(template.role)args.push("--role",template.role);if(template.skill)args.push("--skill",template.skill);if(template.cwd)args.push("--cwd",template.cwd);if(template.extraArgs)args.push(...template.extraArgs);return args}async function isRecipientLeader(recipient,teamName){try{let{getTeam:getTeam2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),config=await getTeam2(teamName);return!!config?.leader&&recipient===config.leader}catch{return!1}}function extractAutoSpawnTarget(payload){let input=payload.tool_input;if(!input||input.type!=="message")return null;let recipient=input.recipient;if(!recipient)return null;let teamName=process.env.GENIE_TEAM??payload.team_name;if(!teamName)return null;if(recipient==="team-lead")return null;return{recipient,teamName}}async function executeAutoSpawn(recipient,teamName){let registryMod=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),executorRegistryMod=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),directoryMod=await Promise.resolve().then(() => (init_agent_directory(),exports_agent_directory)),existing=(await registryMod.list()).find((a)=>(a.role===recipient||a.id===recipient)&&a.team===teamName);if(existing&&await executorRegistryMod.resolveWorkerLivenessByTransport(existing))return;let dirEntry=await directoryMod.resolve(recipient),templates=await registryMod.listTemplates(),searchNames=buildSearchNames(recipient,dirEntry),template=templates.find((t)=>{if(t.team!==teamName)return!1;return[...searchNames].some((q)=>t.id===q||t.role===q)});if(!template){if(dirEntry)console.error(`[genie-hook] Agent "${recipient}" is registered in directory but has no spawn template in team "${teamName}".`);return}let{spawnSync:spawnSync2}=__require("child_process");spawnSync2("genie",buildSpawnArgs(template),{timeout:1e4,stdio:"ignore",env:{...process.env,GENIE_TEAM:teamName}}),console.error(`[genie-hook] Auto-spawned "${recipient}" in team "${teamName}"`)}async function autoSpawn(payload){let target=extractAutoSpawnTarget(payload);if(!target)return;let{recipient,teamName}=target;if(await isRecipientLeader(recipient,teamName))return;try{await executeAutoSpawn(recipient,teamName)}catch(err){let msg=err instanceof Error?err.message:String(err);return console.error(`[genie-hook] Auto-spawn failed for "${recipient}": ${msg}`),{hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:`auto-spawn warning: failed to spawn "${recipient}": ${msg}`}}}}import{existsSync as existsSync24}from"fs";import{basename as basename3,join as join26}from"path";var BRAIN_PKG="@khal-os/brain",BRAIN_DIR="node_modules/@khal-os/brain",enrichedSessions=new Set;function sessionKey(payload){return payload.session_id??`${process.pid}`}function isBrainAvailable(){return existsSync24(join26(BRAIN_DIR,"package.json"))}async function queryBrain(cwd){try{let brain=await import(BRAIN_PKG);if(!brain.search)return null;let projectName=basename3(cwd),results=await brain.search({query:`context for ${projectName}`,limit:5,minScore:0.5});if(!results||results.length===0)return null;return results.map((r)=>{return`- ${(r.content??r.text??"").slice(0,200)}`}).join(`
|
|
3541
3550
|
`)}catch{return null}}async function brainInject(payload){let key=sessionKey(payload);if(enrichedSessions.has(key))return;if(enrichedSessions.add(key),!isBrainAvailable())return;let cwd=payload.cwd??process.cwd();try{let context=await queryBrain(cwd);if(!context)return;return{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:`[brain-inject] Prior context from knowledge base:
|
|
3542
|
-
${context}`}}}catch{return}}import{
|
|
3551
|
+
${context}`}}}catch{return}}import{spawnSync as spawnSync2}from"child_process";var ALLOWED_MERGE_BASES=new Set(["dev"]),SYNC_DENY_PATTERNS=[{test:(cmd)=>/git\s+push\b/i.test(cmd)&&/(?:^|\s)(main|master)(?:\s|$)/.test(cmd),reason:"BLOCKED: Push to main/master is FORBIDDEN. Push to a feature branch and create a PR targeting dev."},{test:(cmd)=>/git\s+push\b/.test(cmd)&&/:(main|master)\b/.test(cmd),reason:"BLOCKED: Push refspec targeting main/master is FORBIDDEN."},{test:(cmd)=>/gh\s+pr\s+create\b/.test(cmd)&&!/(--base|-B)\s+\S/.test(cmd),reason:"BLOCKED: gh pr create requires explicit --base flag. Use: gh pr create --base dev (or --base main for releases)"},{test:(cmd)=>/git\s+checkout\s+(main|master)\s*[;&|]+\s*git\s+(commit|merge|cherry-pick|rebase|push|add)\b/.test(cmd),reason:"BLOCKED: Committing or mutating on main/master is FORBIDDEN. Work on feature branches."}],STDERR_SURFACE_CAP=500,defaultDeps={async resolvePrBase(prNum){let result2;try{result2=spawnSync2("gh",["pr","view",prNum,"--json","baseRefName","-q",".baseRefName"],{encoding:"utf8",timeout:1e4,stdio:["ignore","pipe","pipe"]})}catch(err){return{reason:`spawnSync threw: ${(err instanceof Error?err.message:String(err)).slice(0,STDERR_SURFACE_CAP)}`}}if(result2.error)return{reason:`subprocess error: ${result2.error.message.slice(0,STDERR_SURFACE_CAP)}`};let stderr=typeof result2.stderr==="string"?result2.stderr.trim():"";if(result2.status!==0){let tail=stderr.slice(-STDERR_SURFACE_CAP)||"no stderr captured";return{reason:`gh pr view exited ${result2.status}: ${tail}`}}let stdout=typeof result2.stdout==="string"?result2.stdout.trim():"";if(!stdout)return{reason:`gh pr view exited 0 with empty stdout (stderr: ${stderr.slice(-STDERR_SURFACE_CAP)||"none"})`};return{base:stdout}}};function extractPrNumber(cmd){let match=cmd.match(/gh\s+pr\s+merge\s+(\d+)\b/);return match?match[1]:null}async function branchGuard(payload,deps=defaultDeps){let input=payload.tool_input;if(!input)return;let command=input.command;if(!command)return;if(!/\b(git|gh)\b/.test(command))return;for(let pattern of SYNC_DENY_PATTERNS)if(pattern.test(command))return{decision:"deny",reason:pattern.reason};if(/gh\s+pr\s+merge\b/.test(command)){let prNum=extractPrNumber(command);if(!prNum)return{decision:"deny",reason:"BLOCKED: `gh pr merge` requires an explicit PR number so the target base branch can be verified. \xA719 (v2): agents merge PRs targeting `dev` only; main/master is humans-only via GitHub UI."};let resolved=await deps.resolvePrBase(prNum);if("reason"in resolved)return{decision:"deny",reason:`BLOCKED: could not resolve base branch of PR #${prNum} \u2014 ${resolved.reason}. \xA719 (v2): cannot merge without verifying base is \`dev\`. Check the PR exists and try again, or ask a human to merge via GitHub UI.`};let base=resolved.base;if(!ALLOWED_MERGE_BASES.has(base))return{decision:"deny",reason:`BLOCKED: PR #${prNum} targets \`${base}\`. \xA719 (v2): agents may merge PRs targeting \`dev\` only. Main/master merges are humans-only via GitHub UI.`}}return}import{execSync as execSync6}from"child_process";import{statSync as statSync3}from"fs";var STALENESS_THRESHOLD_SECS=120;function getLastCommitInfo(filePath,cwd){try{let trimmed=execSync6(`git log -1 --format="%at|%an|%s" -- ${JSON.stringify(filePath)}`,{encoding:"utf-8",timeout:5000,cwd,stdio:["pipe","pipe","pipe"]}).trim();if(!trimmed)return null;let[timestampStr,author,...messageParts]=trimmed.split("|"),timestamp2=Number.parseInt(timestampStr,10);if(Number.isNaN(timestamp2))return null;let age=Math.floor(Date.now()/1000)-timestamp2;return{author:author??"unknown",age,message:messageParts.join("|")}}catch{return null}}function getFileModAge(filePath){try{let stat2=statSync3(filePath);return Math.floor((Date.now()-stat2.mtimeMs)/1000)}catch{return null}}function buildCommitWarning(filePath,commitInfo){return{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:`[freshness] Stale read warning: ${filePath} was modified ${commitInfo.age}s ago by "${commitInfo.author}" (${commitInfo.message}). Contents may have changed since you last read it.`}}}function checkUncommittedChanges(filePath,cwd,diskAge){try{if(execSync6(`git status --porcelain -- ${JSON.stringify(filePath)}`,{encoding:"utf-8",timeout:5000,cwd,stdio:["pipe","pipe","pipe"]}).trim())return{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:`[freshness] Stale read warning: ${filePath} has uncommitted changes (modified ${diskAge}s ago). Another agent may be editing this file concurrently.`}}}catch{}return}async function freshness(payload){let input=payload.tool_input;if(!input)return;let filePath=input.file_path;if(!filePath)return;let cwd=payload.cwd??process.cwd(),currentAgent=process.env.GENIE_AGENT_NAME,diskAge=getFileModAge(filePath);if(diskAge===null||diskAge>=STALENESS_THRESHOLD_SECS)return;let commitInfo=getLastCommitInfo(filePath,cwd);if(commitInfo&&commitInfo.age<STALENESS_THRESHOLD_SECS){if(currentAgent&&commitInfo.author.includes(currentAgent))return;return buildCommitWarning(filePath,commitInfo)}if(currentAgent)return checkUncommittedChanges(filePath,cwd,diskAge);return}async function identityInject(payload){let input=payload.tool_input;if(!input)return;let msgType=input.type;if(msgType&&msgType!=="message"&&msgType!=="broadcast")return;let agentName=process.env.GENIE_AGENT_NAME;if(!agentName)return;let contentField=input.content!==void 0?"content":"message",content=input[contentField];if(!content)return;if(content.startsWith(`[from:${agentName}]`))return;return{updatedInput:{...input,[contentField]:`[from:${agentName}] ${content}`}}}var NUDGE_PATTERNS=[{test:/tmux\s+capture-pane/,message:`If you're checking genie agent progress, use structured monitoring instead:
|
|
3543
3552
|
`+` genie task status <slug> \u2014 wish progress from PG
|
|
3544
3553
|
`+` genie agent list --json \u2014 executor state machine
|
|
3545
3554
|
`+` genie events timeline <id> \u2014 structured event log
|
|
@@ -3553,8 +3562,8 @@ ${context}`}}}catch{return}}import{execSync as execSync6}from"child_process";var
|
|
|
3553
3562
|
`);for(let line of lines){let match=line.match(/^\s*\u276F\s*(\d+)\./);if(match)return Number.parseInt(match[1],10)}return 1}async function navigateToOption(paneId,targetOption,currentOption){let diff=targetOption-currentOption,key=diff>0?"Down":"Up";for(let i2=0;i2<Math.abs(diff);i2++)await executeTmux2(`send-keys -t '${paneId}' ${key}`),await sleep(50);await sleep(100),await executeTmux2(`send-keys -t '${paneId}' Enter`)}async function answerQuestion(target,choice){try{let{paneId,label}=await resolveOrcTarget(target),output=await capturePaneContent(paneId,50),state=detectState(output);if(state.type!=="question"){console.log(`No question pending (state: ${state.type})`);return}if(choice.startsWith("text:")){let text=choice.slice(5);await sendTextChoice(paneId,text),console.log(`Sent feedback: "${text.substring(0,50)}${text.length>50?"...":""}"`)}else if(/^\d+$/.test(choice)){let targetOption=Number.parseInt(choice,10);await navigateToOption(paneId,targetOption,findCurrentOption(output)),console.log(`Selected option ${targetOption} for ${label}`)}else await executeTmux2(`send-keys -t '${paneId}' '${choice}'`),console.log(`Sent '${choice}' to ${label}`)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}function shellEscape(str2){return`"${str2.replace(/"/g,"\\\"").replace(/\$/g,"\\$")}"`}function sleep(ms){return new Promise((resolve5)=>setTimeout(resolve5,ms))}function registerAgentAnswer(parent){parent.command("answer <name> <choice>").description('Answer a question for an agent (use "text:..." for text input)').action(async(name,choice)=>{try{await answerQuestion(name,choice)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}var _brief;async function getBrief(){if(!_brief)_brief=await Promise.resolve().then(() => (init_brief(),exports_brief));return _brief}async function handleBrief(options){let team=options.team??process.env.GENIE_TEAM;if(!team)console.error("Error: --team is required (or set GENIE_TEAM)"),process.exit(1);let agent=options.agent??process.env.GENIE_AGENT_NAME,briefService=await getBrief(),brief=await briefService.generateBrief({team,agent,since:options.since,repoPath:process.cwd()});console.log(briefService.formatBrief(brief))}function registerAgentBrief(parent){parent.command("brief").description("Show startup brief \u2014 aggregated context since last session").option("--team <name>","Team name (default: GENIE_TEAM)").option("--agent <name>","Agent name (default: GENIE_AGENT_NAME)").option("--since <iso>","Start timestamp (default: last executor end)").action(async(options)=>{try{await handleBrief(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_agent_directory();init_agent_sync();init_builtin_agents();init_genie_config2();async function showEntry(name,json2){let resolved=await resolve4(name);if(!resolved)console.error(`Agent "${name}" not found in directory or built-ins.`),process.exit(1);if(json2){console.log(JSON.stringify({...resolved.entry,builtin:resolved.builtin},null,2));return}if(resolved.builtin)console.log(`
|
|
3554
3563
|
(built-in agent)`);if(console.log(""),console.log(` Name: ${resolved.entry.name}`),console.log(` Dir: ${contractPath(resolved.entry.dir)}`),resolved.entry.repo)console.log(` Repo: ${contractPath(resolved.entry.repo)}`);if(console.log(` Prompt mode: ${resolved.entry.promptMode}`),resolved.entry.model)console.log(` Model: ${resolved.entry.model}`);if(resolved.entry.roles?.length)console.log(` Roles: ${resolved.entry.roles.join(", ")}`);console.log(` Registered: ${resolved.entry.registeredAt}`),console.log("")}function printRegisteredAgentsTable(entries){let termW=process.stdout.columns||120,repoValues=entries.map((e)=>e.repo?contractPath(e.repo):contractPath(e.dir)),maxRepoLen=Math.max(4,...repoValues.map((v)=>v.length)),fixedW=42,repoW=Math.min(maxRepoLen+2,Math.max(30,termW-42-20));console.log(""),console.log("REGISTERED AGENTS"),console.log("-".repeat(Math.max(90,42+repoW+20))),console.log(` ${"NAME".padEnd(22)}${"SCOPE".padEnd(10)}${"REPO".padEnd(repoW)}${"MODEL".padEnd(8)}ROLES`);for(let i2=0;i2<entries.length;i2++){let entry2=entries[i2],repo=repoValues[i2],roles=entry2.roles?.join(", ")||"-";console.log(` ${entry2.name.padEnd(22)}${entry2.scope.padEnd(10)}${repo.padEnd(repoW)}${(entry2.model||"-").padEnd(8)}${roles}`)}console.log("")}function printBuiltinAgentsTable(){console.log("BUILT-IN AGENTS"),console.log("-".repeat(80)),console.log(` ${"NAME".padEnd(22)}${"TYPE".padEnd(10)}${"MODEL".padEnd(8)}DESCRIPTION`);for(let agent of ALL_BUILTINS)console.log(` ${agent.name.padEnd(22)}${agent.category.padEnd(10)}${(agent.model||"-").padEnd(8)}${agent.description}`);console.log("")}async function listEntries(json2,includeBuiltins,_includeArchived){let entries=await ls();if(json2){let result2=entries.map((e)=>({...e,builtin:!1}));if(includeBuiltins)for(let b2 of ALL_BUILTINS)result2.push({name:b2.name,description:b2.description,model:b2.model,category:b2.category,scope:"built-in",builtin:!0});console.log(JSON.stringify(result2,null,2));return}if(entries.length===0&&!includeBuiltins){console.log(`
|
|
3555
3564
|
No agents registered. Add one with: genie agent register <name> --dir <path>`),console.log(`Use --builtins to also see built-in roles and council members.
|
|
3556
|
-
`);return}if(entries.length>0)printRegisteredAgentsTable(entries);if(includeBuiltins)printBuiltinAgentsTable()}function registerAgentDirectory(parent){parent.command("directory [name]").alias("dir").description("List all agents or show single entry details from directory").option("--json","Output as JSON").option("--builtins","Include built-in roles and council members").option("--all","Include archived agents").action(async(name,options)=>{try{if(name==="sync"){let resolved=await resolve4("sync");if(resolved&&!resolved.builtin)await showEntry("sync",options.json);else await handleSync()}else if(name)await showEntry(name,options.json);else await listEntries(options.json,options.builtins,options.all)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}async function handleSync(){let{findWorkspace:findWorkspace2}=await Promise.resolve().then(() => (init_workspace(),exports_workspace)),ws=findWorkspace2();if(!ws)console.error("Not in a genie workspace. Run `genie init` first."),process.exit(1);console.log(`Syncing agents from ${ws.root}/agents/...`);let result2=await syncAgentDirectory(ws.root);printSyncResult(result2)}init_term_format();init_msg();var _taskService2;async function getTaskService2(){if(!_taskService2)_taskService2=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService2}function printConversation(conv,lastMsg){let name=conv.name??conv.id,type2=conv.type==="dm"?"DM":"Group",linked=conv.linkedEntity?` [${conv.linkedEntity}:${conv.linkedEntityId}]`:"",preview=lastMsg?truncate2(lastMsg.body,50):"(no messages)",time=lastMsg?formatTime(lastMsg.createdAt):"";if(console.log(` ${padRight(name,30)} ${padRight(type2,6)}${linked}`),lastMsg)console.log(` ${time} ${lastMsg.senderId}: ${preview}`);console.log("")}async function handleInbox2(agent,options){let ts3=await getTaskService2(),resolvedAgent=agent??await detectSenderIdentity(),actor={actorType:"local",actorId:resolvedAgent},conversations=await ts3.listConversations(actor);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log(`No conversations for "${resolvedAgent}".`);return}console.log(""),console.log(`INBOX: ${resolvedAgent}`),console.log("\u2500".repeat(60));for(let conv of conversations){let messages2=await ts3.getMessages(conv.id,{limit:1}),lastMsg=messages2.length>0?messages2[messages2.length-1]:null;printConversation(conv,lastMsg)}}function registerAgentInbox(parent){let inbox2=parent.command("inbox").description("Inbox management \u2014 list messages or watch for new ones");inbox2.command("list [agent]",{isDefault:!0}).description("List conversations with recent messages").option("--json","Output as JSON").action(async(agent,options)=>{try{await handleInbox2(agent,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),inbox2.command("watch").description("Run inbox watcher in foreground (Ctrl+C to stop)").action(async()=>{let{checkInboxes:checkInboxes2,getInboxPollIntervalMs:getInboxPollIntervalMs2,startInboxWatcher:startInboxWatcher2,stopInboxWatcher:stopInboxWatcher2}=await Promise.resolve().then(() => (init_inbox_watcher(),exports_inbox_watcher)),pollMs=getInboxPollIntervalMs2();if(pollMs===0)console.log("Inbox watcher is disabled (GENIE_INBOX_POLL_MS=0)"),process.exit(0);console.log(`Inbox watcher starting (poll every ${pollMs/1000}s)`),console.log(`Press Ctrl+C to stop.
|
|
3557
|
-
`);let initial=await checkInboxes2();if(initial.length>0)console.log(`[inbox-watcher] Spawned team-leads for: ${initial.join(", ")}`);let handle=startInboxWatcher2({listTeamsWithUnreadInbox:(await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams))).listTeamsWithUnreadInbox,isTeamActive:async(teamName)=>{let{isTeamActive:isTeamActive2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn));return isTeamActive2(teamName)},isAgentAlive:async(agentName)=>{let{isAgentAlive:isAgentAlive2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn));return isAgentAlive2(agentName)},ensureTeamLead:async(teamName,workingDir)=>{let{ensureTeamLead:ensureTeamLead2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn)),result2=await ensureTeamLead2(teamName,workingDir);return console.log(`[inbox-watcher] Spawned team-lead for "${teamName}" in ${workingDir}`),result2},warn:(msg)=>console.log(msg)}),shutdown2=()=>{console.log(`
|
|
3565
|
+
`);return}if(entries.length>0)printRegisteredAgentsTable(entries);if(includeBuiltins)printBuiltinAgentsTable()}function registerAgentDirectory(parent){parent.command("directory [name]").alias("dir").description("List all agents or show single entry details from directory").option("--json","Output as JSON").option("--builtins","Include built-in roles and council members").option("--all","Include archived agents").action(async(name,options)=>{try{if(name==="sync"){let resolved=await resolve4("sync");if(resolved&&!resolved.builtin)await showEntry("sync",options.json);else await handleSync()}else if(name)await showEntry(name,options.json);else await listEntries(options.json,options.builtins,options.all)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}async function handleSync(){let{findWorkspace:findWorkspace2}=await Promise.resolve().then(() => (init_workspace(),exports_workspace)),ws=findWorkspace2();if(!ws)console.error("Not in a genie workspace. Run `genie init` first."),process.exit(1);console.log(`Syncing agents from ${ws.root}/agents/...`);let result2=await syncAgentDirectory(ws.root);printSyncResult(result2)}init_emit();init_term_format();init_msg();var _taskService2;async function getTaskService2(){if(!_taskService2)_taskService2=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService2}function printConversation(conv,lastMsg){let name=conv.name??conv.id,type2=conv.type==="dm"?"DM":"Group",linked=conv.linkedEntity?` [${conv.linkedEntity}:${conv.linkedEntityId}]`:"",preview=lastMsg?truncate2(lastMsg.body,50):"(no messages)",time=lastMsg?formatTime(lastMsg.createdAt):"";if(console.log(` ${padRight(name,30)} ${padRight(type2,6)}${linked}`),lastMsg)console.log(` ${time} ${lastMsg.senderId}: ${preview}`);console.log("")}async function handleInbox2(agent,options){let ts3=await getTaskService2(),resolvedAgent=agent??await detectSenderIdentity(),actor={actorType:"local",actorId:resolvedAgent},conversations=await ts3.listConversations(actor);if(options.json){console.log(JSON.stringify(conversations,null,2));return}if(conversations.length===0){console.log(`No conversations for "${resolvedAgent}".`);return}console.log(""),console.log(`INBOX: ${resolvedAgent}`),console.log("\u2500".repeat(60));for(let conv of conversations){let messages2=await ts3.getMessages(conv.id,{limit:1}),lastMsg=messages2.length>0?messages2[messages2.length-1]:null;printConversation(conv,lastMsg)}}function registerAgentInbox(parent){let inbox2=parent.command("inbox").description("Inbox management \u2014 list messages or watch for new ones");inbox2.command("list [agent]",{isDefault:!0}).description("List conversations with recent messages").option("--json","Output as JSON").action(async(agent,options)=>{try{await handleInbox2(agent,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),inbox2.command("watch").description("Run inbox watcher in foreground (Ctrl+C to stop)").action(async()=>{let{checkInboxes:checkInboxes2,getInboxPollIntervalMs:getInboxPollIntervalMs2,startInboxWatcher:startInboxWatcher2,stopInboxWatcher:stopInboxWatcher2}=await Promise.resolve().then(() => (init_inbox_watcher(),exports_inbox_watcher)),pollMs=getInboxPollIntervalMs2();if(pollMs===0)console.log("Inbox watcher is disabled (GENIE_INBOX_POLL_MS=0)"),process.exit(0);console.log(`Inbox watcher starting (poll every ${pollMs/1000}s)`),console.log(`Press Ctrl+C to stop.
|
|
3566
|
+
`);let initial=await checkInboxes2();if(initial.length>0)console.log(`[inbox-watcher] Spawned team-leads for: ${initial.join(", ")}`);let handle=startInboxWatcher2({listTeamsWithUnreadInbox:(await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams))).listTeamsWithUnreadInbox,isTeamActive:async(teamName)=>{let{isTeamActive:isTeamActive2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn));return isTeamActive2(teamName)},isAgentAlive:async(agentName)=>{let{isAgentAlive:isAgentAlive2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn));return isAgentAlive2(agentName)},ensureTeamLead:async(teamName,workingDir)=>{let{ensureTeamLead:ensureTeamLead2}=await Promise.resolve().then(() => (init_team_auto_spawn(),exports_team_auto_spawn)),result2=await ensureTeamLead2(teamName,workingDir);return console.log(`[inbox-watcher] Spawned team-lead for "${teamName}" in ${workingDir}`),result2},warn:(msg)=>console.log(msg),emitDeadInbox:(payload)=>{try{emitEvent("rot.inbox-watcher-spawn-loop.detected",payload)}catch{}}}),shutdown2=()=>{console.log(`
|
|
3558
3567
|
Stopping inbox watcher...`),stopInboxWatcher2(handle),process.exit(0)};process.on("SIGINT",shutdown2),process.on("SIGTERM",shutdown2),await new Promise(()=>{})})}init_agents();function registerAgentKill(parent){parent.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)}})}init_agents();function registerAgentList(parent){parent.command("list").alias("ls").description("List registered agents with runtime status").option("--json","Output as JSON").option("--source <name>","Filter by executor metadata source (e.g. omni)").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)}})}init_agent_registry();init_term_format();init_db();init_mailbox();init_runtime_events();init_db();function rowToMessage2(row){return{id:row.id,sender:row.sender,body:row.body,timestamp:row.created_at instanceof Date?row.created_at.toISOString():String(row.created_at)}}async function readMessages(repoPath,teamName,since){let sql=await getConnection();if(since)return(await sql`
|
|
3559
3568
|
SELECT * FROM team_chat
|
|
3560
3569
|
WHERE team = ${teamName} AND repo_path = ${repoPath} AND created_at >= ${since}
|
|
@@ -3610,7 +3619,7 @@ No agents registered. Add one with: genie dir add <name> --dir <path>`),console.
|
|
|
3610
3619
|
`);return}if(entries.length>0)printRegisteredTable(entries),printResolvedTable(entries);if(includeBuiltins)printBuiltinsTable()}function listEntriesJson(entries,includeBuiltins){let result2=entries.map((e)=>({...e,builtin:!1}));if(includeBuiltins)for(let b2 of ALL_BUILTINS)result2.push({name:b2.name,description:b2.description,model:b2.model,category:b2.category,scope:"built-in",builtin:!0});let{writeSync}=__require("fs"),data=`${JSON.stringify(result2,null,2)}
|
|
3611
3620
|
`,CHUNK=4096;for(let i2=0;i2<data.length;i2+=CHUNK)writeSync(1,data.slice(i2,i2+CHUNK))}function registerSdkFlags(cmd){cmd.option("--sdk-permission-mode <mode>","SDK permission mode: default|acceptEdits|bypassPermissions|plan|dontAsk|auto").option("--sdk-tools <list>","SDK tools: comma-separated tool names").option("--sdk-allowed-tools <list>","SDK auto-approved tools: comma-separated").option("--sdk-disallowed-tools <list>","SDK blacklisted tools: comma-separated").option("--sdk-max-turns <n>","SDK max conversation turns").option("--sdk-max-budget <usd>","SDK max budget in USD").option("--sdk-effort <level>","SDK effort: low|medium|high|max").option("--sdk-thinking <config>","SDK thinking: adaptive|disabled|enabled[:budgetTokens]").option("--sdk-persist-session","SDK: enable session persistence").option("--no-sdk-persist-session","SDK: disable session persistence").option("--sdk-file-checkpointing","SDK: enable file checkpointing").option("--sdk-output-format <path>","SDK: path to JSON schema file for output format").option("--sdk-stream-partial","SDK: include partial messages in stream").option("--sdk-hook-events","SDK: include hook events in stream").option("--sdk-prompt-suggestions","SDK: enable prompt suggestions").option("--sdk-progress-summaries","SDK: enable agent progress summaries").option("--sdk-sandbox","SDK: enable sandbox").option("--sdk-betas <list>","SDK beta flags: comma-separated").option("--sdk-system-prompt <string>","SDK system prompt text").option("--sdk-mcp-server <spec>","SDK MCP server: name:command:args (repeatable)",collectRepeat,[]).option("--sdk-plugin <path>","SDK plugin path (repeatable)",collectRepeat,[]).option("--sdk-agent <name>","SDK main agent name").option("--sdk-subagent <spec>","SDK subagent: name:json (repeatable)",collectRepeat,[])}function collectRepeat(value,previous){return previous.concat([value])}function buildSdkConfig(options){let config={};return applyScalarSdkOptions(config,options),applyBooleanSdkOptions(config,options),applyRepeatableSdkOptions(config,options),Object.keys(config).length>0?config:void 0}function toSafeNumber(value,flagName){let n=Number(value);if(Number.isNaN(n))throw Error(`${flagName} must be a number, got: ${value}`);return n}function applyScalarSdkOptions(config,options){if(options.sdkPermissionMode!==void 0)config.permissionMode=options.sdkPermissionMode;if(options.sdkTools!==void 0)config.tools=splitComma(options.sdkTools);if(options.sdkAllowedTools!==void 0)config.allowedTools=splitComma(options.sdkAllowedTools);if(options.sdkDisallowedTools!==void 0)config.disallowedTools=splitComma(options.sdkDisallowedTools);if(options.sdkMaxTurns!==void 0)config.maxTurns=toSafeNumber(options.sdkMaxTurns,"--sdk-max-turns");if(options.sdkMaxBudget!==void 0)config.maxBudgetUsd=toSafeNumber(options.sdkMaxBudget,"--sdk-max-budget");if(options.sdkEffort!==void 0)config.effort=options.sdkEffort;if(options.sdkThinking!==void 0)config.thinking=parseThinkingConfig(options.sdkThinking);if(options.sdkBetas!==void 0)config.betas=splitComma(options.sdkBetas);if(options.sdkSystemPrompt!==void 0)config.systemPrompt=options.sdkSystemPrompt;if(options.sdkAgent!==void 0)config.agent=options.sdkAgent;if(options.sdkOutputFormat!==void 0)config.outputFormat={type:"json_schema",schema:{$ref:options.sdkOutputFormat}}}function applyBooleanSdkOptions(config,options){if(options.sdkPersistSession!==void 0)config.persistSession=options.sdkPersistSession;if(options.sdkFileCheckpointing===!0)config.enableFileCheckpointing=!0;if(options.sdkStreamPartial===!0)config.includePartialMessages=!0;if(options.sdkHookEvents===!0)config.includeHookEvents=!0;if(options.sdkPromptSuggestions===!0)config.promptSuggestions=!0;if(options.sdkProgressSummaries===!0)config.agentProgressSummaries=!0;if(options.sdkSandbox===!0)config.sandbox={enabled:!0}}function applyRepeatableSdkOptions(config,options){if(options.sdkMcpServer&&options.sdkMcpServer.length>0){config.mcpServers={};for(let spec of options.sdkMcpServer){let parsed=parseMcpServer(spec);config.mcpServers[parsed.name]=parsed.config}}if(options.sdkPlugin&&options.sdkPlugin.length>0)config.plugins=options.sdkPlugin.map((p)=>({type:"local",path:p}));if(options.sdkSubagent&&options.sdkSubagent.length>0)config.agents=parseSubagents(options.sdkSubagent)}function parseSubagents(specs){let agents={};for(let spec of specs){let colonIdx=spec.indexOf(":");if(colonIdx===-1)throw Error(`Invalid --sdk-subagent format: "${spec}". Expected "name:json".`);let agentName=spec.slice(0,colonIdx),jsonStr=spec.slice(colonIdx+1);try{agents[agentName]=JSON.parse(jsonStr)}catch{throw Error(`Invalid JSON in --sdk-subagent "${agentName}": ${jsonStr}`)}}return agents}function parseThinkingConfig(value){if(value==="adaptive")return{type:"adaptive"};if(value==="disabled")return{type:"disabled"};if(value==="enabled")return{type:"enabled"};if(value.startsWith("enabled:"))return{type:"enabled",budgetTokens:toSafeNumber(value.slice(8),"--sdk-thinking budgetTokens")};throw Error(`Invalid --sdk-thinking value: "${value}". Expected adaptive|disabled|enabled[:budgetTokens].`)}function parseMcpServer(spec){let firstColon=spec.indexOf(":");if(firstColon===-1)throw Error(`Invalid --sdk-mcp-server format: "${spec}". Expected "name:command:args".`);let name=spec.slice(0,firstColon),rest=spec.slice(firstColon+1),secondColon=rest.indexOf(":");if(secondColon===-1)throw Error(`Invalid --sdk-mcp-server format: "${spec}". Expected "name:command:args".`);let command=rest.slice(0,secondColon),argsStr=rest.slice(secondColon+1),args=argsStr?argsStr.split(",").map((s)=>s.trim()).filter(Boolean):[];return{name,config:{type:"stdio",command,args}}}function splitComma(value){return value.split(",").map((s)=>s.trim()).filter(Boolean)}function printSdkConfig(sdk){console.log(" SDK Config:");let lines=collectSdkDisplayLines(sdk);for(let line of lines)console.log(` ${line}`)}function collectSdkDisplayLines(sdk){let lines=[];if(sdk.permissionMode)lines.push(`Permission Mode: ${sdk.permissionMode}`);if(sdk.tools)lines.push(`Tools: ${Array.isArray(sdk.tools)?sdk.tools.join(", "):`preset:${sdk.tools.preset}`}`);if(sdk.allowedTools?.length)lines.push(`Allowed Tools: ${sdk.allowedTools.join(", ")}`);if(sdk.disallowedTools?.length)lines.push(`Disallowed Tools: ${sdk.disallowedTools.join(", ")}`);if(sdk.maxTurns!==void 0)lines.push(`Max Turns: ${sdk.maxTurns}`);if(sdk.maxBudgetUsd!==void 0)lines.push(`Max Budget: $${sdk.maxBudgetUsd.toFixed(2)}`);if(sdk.effort)lines.push(`Effort: ${sdk.effort}`);if(sdk.thinking)lines.push(`Thinking: ${formatThinking(sdk.thinking)}`);if(sdk.agent)lines.push(`Agent: ${sdk.agent}`);if(sdk.persistSession!==void 0)lines.push(`Persist Session: ${sdk.persistSession}`);if(sdk.enableFileCheckpointing)lines.push("File Checkpointing: enabled");if(sdk.outputFormat)lines.push(`Output Format: ${JSON.stringify(sdk.outputFormat.schema)}`);return collectSdkBooleanLines(sdk,lines),collectSdkComplexLines(sdk,lines),lines}function collectSdkBooleanLines(sdk,lines){if(sdk.includePartialMessages)lines.push("Stream Partial: enabled");if(sdk.includeHookEvents)lines.push("Hook Events: enabled");if(sdk.promptSuggestions)lines.push("Prompt Suggestions: enabled");if(sdk.agentProgressSummaries)lines.push("Progress Summaries: enabled");if(sdk.sandbox?.enabled)lines.push("Sandbox: enabled");if(sdk.betas?.length)lines.push(`Betas: ${sdk.betas.join(", ")}`)}function collectSdkComplexLines(sdk,lines){if(sdk.systemPrompt){let prompt2=typeof sdk.systemPrompt==="string"?sdk.systemPrompt:`preset:${sdk.systemPrompt.preset}`;lines.push(`System Prompt: ${prompt2.length>60?`${prompt2.slice(0,60)}...`:prompt2}`)}if(sdk.mcpServers)lines.push(`MCP Servers: ${Object.keys(sdk.mcpServers).join(", ")}`);if(sdk.plugins?.length)lines.push(`Plugins: ${sdk.plugins.map((p)=>p.path).join(", ")}`);if(sdk.agents)lines.push(`Subagents: ${Object.keys(sdk.agents).join(", ")}`)}function formatThinking(thinking){if(thinking.type==="enabled"&&thinking.budgetTokens)return`enabled:${thinking.budgetTokens}`;return thinking.type}function buildPermissions(permissionPreset,allow,bashAllow){if(!permissionPreset&&!allow&&!bashAllow)return;if(permissionPreset)return{preset:permissionPreset};return{...allow&&{allow:allow.split(",").map((s)=>s.trim()).filter(Boolean)},...bashAllow&&{bashAllowPatterns:bashAllow.split(",").map((s)=>s.trim()).filter(Boolean)}}}function normalizeRoles(roles){if(!roles)return;return roles.flatMap((r)=>r.split(",")).map((r)=>r.trim()).filter(Boolean)}function printRegisteredTable(entries){let repoValues=[],roleValues=[];for(let entry2 of entries)repoValues.push(entry2.repo?contractPath(entry2.repo):contractPath(entry2.dir)),roleValues.push(entry2.roles?.join(", ")||"-");let termW=process.stdout.columns||120,fixedW=54,maxRepoLen=Math.max(4,...repoValues.map((v)=>v.length)),repoW=Math.min(maxRepoLen+2,Math.max(30,termW-fixedW-20)),totalW=fixedW+repoW+20;console.log(""),console.log("REGISTERED AGENTS"),console.log("-".repeat(Math.max(90,totalW))),console.log(` ${"NAME".padEnd(22)}${"SCOPE".padEnd(10)}${"REPO".padEnd(repoW)}${"MODEL".padEnd(10)}${"PROVIDER".padEnd(10)}ROLES`),console.log(` ${"-".repeat(20)} ${"-".repeat(8)} ${"-".repeat(repoW-2)} ${"-".repeat(8)} ${"-".repeat(8)} ${"-".repeat(20)}`);for(let i2=0;i2<entries.length;i2++){let entry2=entries[i2],repo=repoValues[i2],roles=roleValues[i2];console.log(` ${entry2.name.padEnd(22)}${entry2.scope.padEnd(10)}${repo.padEnd(repoW)}${(entry2.model||"-").padEnd(10)}${(entry2.provider||"-").padEnd(10)}${roles}`)}console.log("")}function printResolvedTable(entries){if(entries.length===0)return;let nameW=22,declW=14,resolvedW=14;console.log("RESOLVED DEFAULTS"),console.log("-".repeat(70));for(let field of RESOLVED_FIELDS){let fieldUpper=field.toUpperCase();console.log(` ${"AGENT".padEnd(nameW)}${`${fieldUpper} (declared)`.padEnd(declW)}${`${fieldUpper} (resolved)`.padEnd(resolvedW)}SOURCE`),console.log(` ${"-".repeat(nameW-2)} ${"-".repeat(declW-2)} ${"-".repeat(resolvedW-2)} ${"-".repeat(16)}`);for(let entry2 of entries){let ctx=buildDirResolveContext(entry2.name),result2=resolveFieldWithSource(entry2,field,ctx),declared=entry2[field]||"-";console.log(` ${entry2.name.padEnd(nameW)}${declared.padEnd(declW)}${result2.value.padEnd(resolvedW)}${result2.source}`)}}console.log("")}function printBuiltinsTable(){console.log("BUILT-IN AGENTS"),console.log("-".repeat(80)),console.log(` ${"NAME".padEnd(22)}${"TYPE".padEnd(10)}${"MODEL".padEnd(8)}DESCRIPTION`),console.log(` ${"-".repeat(20)} ${"-".repeat(8)} ${"-".repeat(6)} ${"-".repeat(30)}`);for(let agent of ALL_BUILTINS)console.log(` ${agent.name.padEnd(22)}${agent.category.padEnd(10)}${(agent.model||"-").padEnd(8)}${agent.description}`);console.log("")}function validatePromptMode2(mode){if(mode!=="system"&&mode!=="append")throw Error(`Invalid prompt mode "${mode}". Must be "append" or "system".`);return mode}function normalizeRoles2(roles){if(!roles)return;return roles.flatMap((r)=>r.split(",")).map((r)=>r.trim()).filter(Boolean)}function printEntry2(entry2){if(console.log(` Name: ${entry2.name}`),console.log(` Dir: ${contractPath(entry2.dir)}`),entry2.repo)console.log(` Repo: ${contractPath(entry2.repo)}`);if(console.log(` Prompt mode: ${entry2.promptMode}`),entry2.model)console.log(` Model: ${entry2.model}`);if(entry2.roles?.length)console.log(` Roles: ${entry2.roles.join(", ")}`);console.log(` Registered: ${entry2.registeredAt}`)}async function handleOmniRegistration(name,options){let omniUrl=await resolveOmniApiUrl();if(!omniUrl)return;console.log(`
|
|
3612
3621
|
Registering in Omni (${omniUrl})...`);let existingId=await findOmniAgent(name);if(existingId){console.log(` Agent already exists in Omni: ${existingId}`),await edit(name,{omniAgentId:existingId},{global:options.global}),console.log(" Linked existing Omni agent to directory entry.");return}let omniAgentId=await registerAgentInOmni(name,{model:options.model,roles:options.roles});if(omniAgentId)await edit(name,{omniAgentId},{global:options.global}),console.log(` Omni agent created: ${omniAgentId}`),console.log(" Session isolation: per-person + per-channel")}async function handleAgentRegister(name,options){let promptMode=validatePromptMode2(options.promptMode);if(options.repo)validateRepoPath(options.repo);let roles=normalizeRoles2(options.roles),entry2=await add({name,dir:resolvePath2(options.dir),repo:options.repo?resolvePath2(options.repo):void 0,promptMode,model:options.model,roles},{global:options.global}),scope=options.global?"global":"project";if(console.log(`Agent "${entry2.name}" registered (${scope}).`),printEntry2(entry2),!options.skipOmni)await handleOmniRegistration(name,{...options,roles})}function registerAgentRegister(parent){parent.command("register <name>").description("Register an agent locally and auto-register in Omni when configured").requiredOption("--dir <path>","Agent folder (CWD + AGENTS.md)").option("--repo <path>","Default git repo (overridden by team)").option("--prompt-mode <mode>","Prompt mode: append or system","append").option("--model <model>","Default model (sonnet, opus, codex)").option("--roles <roles...>","Built-in roles this agent can orchestrate").option("--global","Write to global directory instead of project").option("--skip-omni","Skip Omni auto-registration").action(async(name,options)=>{try{await handleAgentRegister(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_agents();function registerAgentResume(parent){parent.command("resume [name]").description("Resume a suspended/failed agent with its Claude session").option("--all","Resume all eligible agents").option("--no-reset-attempts","Preserve resumeAttempts counter (scheduler auto-resume use)").action(async(name,options)=>{try{await handleWorkerResume(name,{all:options.all,noResetAttempts:options.resetAttempts===!1})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_msg();function registerAgentSend(parent){parent.command("send <body>").description("Send a direct message to an agent (hierarchy-enforced)").option("--to <agent>","Recipient agent name (default: team leader)","team-lead").option("--from <sender>","Sender ID (auto-detected from context)").option("--team <name>","Explicit team context for sender/recipient resolution").option("--broadcast","Send to all direct reports").action(async(body,options)=>{try{let from=options.from??await detectSenderIdentity(options.team);if(options.broadcast){await handleBroadcast(from,body,options.team);return}await handleDirectMessage(from,options.to,body,options.team)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}async function isTeamLeader(agentName,teamName){try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leaderName=await resolveLeaderName2(teamName);return agentName===leaderName}catch{return!1}}async function checkHierarchy(from,to){if(from==="cli")return{allowed:!0};if(from===to)return{allowed:!0};try{let agents=await(await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry))).listAgents({}),sender=agents.find((a)=>a.customName===from||a.role===from||a.id===from),recipient=agents.find((a)=>a.customName===to||a.role===to||a.id===to);if(!sender||!recipient)return{allowed:!0};if(recipient.reportsTo===from||recipient.reportsTo===sender.id)return{allowed:!0};if(sender.reportsTo===to||sender.reportsTo===recipient.id)return{allowed:!0};if(sender.reportsTo&&sender.reportsTo===recipient.reportsTo)return{allowed:!0};if(sender.team&&sender.team===recipient.team&&await isTeamLeader(from,sender.team))return{allowed:!0};let manager=sender.reportsTo??"your manager";return{allowed:!1,reason:`Cannot reach "${to}". Escalate to ${manager}.`}}catch{return{allowed:!0}}}async function handleDirectMessage(from,to,body,team){let{allowed,reason}=await checkHierarchy(from,to);if(!allowed)console.error(`Error: ${reason}`),process.exit(1);let{checkSendScope:checkSendScope2}=await Promise.resolve().then(() => (init_msg(),exports_msg)),repoPath=process.cwd(),scopeError=await checkSendScope2(repoPath,from,to);if(scopeError)console.error(`Error: ${scopeError}`),process.exit(1);let taskService=await Promise.resolve().then(() => (init_task_service(),exports_task_service)),mailbox=await Promise.resolve().then(() => (init_mailbox(),exports_mailbox)),senderActor={actorType:"local",actorId:from},recipientActor={actorType:"local",actorId:to},conv=await taskService.findOrCreateConversation({type:"dm",members:[senderActor,recipientActor],createdBy:senderActor});await taskService.addMember(conv.id,senderActor),await taskService.addMember(conv.id,recipientActor),await mailbox.send(repoPath,from,to,body);let msg=await taskService.sendMessage(conv.id,senderActor,body);try{let{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,`genie.msg.${to}`,{kind:"message",agent:from,direction:"out",peer:to,text:body,data:{messageId:msg.id,conversationId:conv.id,from,to},source:"mailbox"})}catch{}try{let nativeTeams=await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams)),nativeMsg={from,text:body,summary:body.length>50?`${body.substring(0,50)}...`:body,timestamp:new Date().toISOString(),color:"blue",read:!1},currentTeam=team??process.env.GENIE_TEAM;if(currentTeam){let nativeName=await nativeTeams.resolveNativeMemberName(currentTeam,to);if(nativeName)await nativeTeams.writeNativeInbox(currentTeam,nativeName,nativeMsg)}}catch{}console.log(`Message sent to "${to}".`),console.log(` ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`)}async function handleBroadcast(from,body,team){let taskService=await Promise.resolve().then(() => (init_task_service(),exports_task_service)),repoPath=process.cwd(),teamName=team??process.env.GENIE_TEAM;if(!teamName)console.error("Error: Could not detect team. Use --team <name>."),process.exit(1);let senderActor={actorType:"local",actorId:from},conv=await taskService.findOrCreateConversation({type:"group",name:`Team: ${teamName}`,linkedEntity:"team",linkedEntityId:teamName,createdBy:senderActor,members:[senderActor]});await taskService.addMember(conv.id,senderActor);let msg=await taskService.sendMessage(conv.id,senderActor,body);try{let{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,"genie.msg.broadcast",{kind:"message",agent:from,direction:"out",peer:teamName,text:body,data:{messageId:msg.id,conversationId:conv.id,from,team:teamName},source:"mailbox"})}catch{}console.log(`Broadcast sent to team "${teamName}".`),console.log(` Message ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`)}init_term_format();function printAgentFields(agent){if(console.log(""),console.log(`AGENT: ${agent.customName??agent.role??agent.id}`),console.log("\u2500".repeat(60)),console.log(` ${padRight("ID:",20)} ${agent.id}`),agent.role)console.log(` ${padRight("Role:",20)} ${agent.role}`);if(agent.customName)console.log(` ${padRight("Name:",20)} ${agent.customName}`);if(agent.team)console.log(` ${padRight("Team:",20)} ${agent.team}`);console.log(` ${padRight("Started:",20)} ${agent.startedAt}`)}function printExecutorFields(executor){if(console.log(""),console.log("Current Executor:"),console.log("\u2500".repeat(60)),console.log(` ${padRight("Executor ID:",20)} ${executor.id}`),console.log(` ${padRight("Provider:",20)} ${executor.provider}`),console.log(` ${padRight("Transport:",20)} ${executor.transport}`),console.log(` ${padRight("State:",20)} ${executor.state}`),executor.pid)console.log(` ${padRight("PID:",20)} ${executor.pid}`);if(executor.tmuxSession)console.log(` ${padRight("Tmux Session:",20)} ${executor.tmuxSession}`);if(executor.tmuxPaneId)console.log(` ${padRight("Tmux Pane:",20)} ${executor.tmuxPaneId}`);if(executor.worktree)console.log(` ${padRight("Worktree:",20)} ${executor.worktree}`);if(console.log(` ${padRight("Started:",20)} ${executor.startedAt}`),executor.endedAt)console.log(` ${padRight("Ended:",20)} ${executor.endedAt}`)}async function showAgent(name,json2){let registry=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),executorRegistry=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),matches=(await registry.listAgents()).filter((a)=>a.customName===name||a.role===name||a.id===name),preferredTeam=process.env.GENIE_TEAM,agent=(preferredTeam&&matches.find((a)=>a.team===preferredTeam))??matches[0];if(!agent)console.error(`Agent "${name}" not found.`),process.exit(1);if(json2){let executor=agent.currentExecutorId?await executorRegistry.getExecutor(agent.currentExecutorId):null;console.log(JSON.stringify({agent,executor},null,2));return}if(printAgentFields(agent),agent.currentExecutorId){let executor=await executorRegistry.getExecutor(agent.currentExecutorId);if(executor)printExecutorFields(executor)}else console.log(`
|
|
3613
|
-
No active executor.`);console.log("")}function registerAgentShow(parent){parent.command("show <name>").description("Show agent identity and current executor detail").option("--json","Output as JSON").action(async(name,options)=>{try{await showAgent(name,options.json)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_agents();function parseNumericFlag(flagName){return(value)=>{let n=Number(value);if(Number.isNaN(n))throw Error(`${flagName} must be a number, got: ${value}`);return n}}function registerAgentSpawn(parent){parent.command("spawn <name>").description("Spawn a new agent by name (resolves from directory or built-ins)").option("--provider <provider>","Provider: claude, codex, or claude-sdk").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("--prompt <prompt>","Initial prompt (first user message)").option("--sdk-max-turns <n>","SDK: max conversation turns",parseNumericFlag("--sdk-max-turns")).option("--sdk-max-budget <usd>","SDK: max budget in USD",parseNumericFlag("--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").action(async(name,options)=>{if(options.prompt)options.initialPrompt=options.prompt;try{await handleWorkerSpawn(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_agents();function registerAgentStop(parent){parent.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)}})}function registerAgentCommands(program2){let agent=program2.command("agent").description("Agent lifecycle management");registerAgentSpawn(agent),registerAgentStop(agent),registerAgentResume(agent),registerAgentKill(agent),registerAgentList(agent),registerAgentShow(agent),registerAgentAnswer(agent),registerAgentRegister(agent),registerAgentDirectory(agent),registerAgentInbox(agent),registerAgentBrief(agent),registerAgentLog(agent),registerAgentSend(agent),agent.on("command:*",(operands)=>{let cmd=operands[0],available=agent.commands.map((c)=>c.name()).join(", ");agent.error(`Unknown agent command '${cmd}'. Available: ${available}`)})}init_agents();async function handleTuiMode(){let{isServeRunning:isServeRunning2,autoStartServe:autoStartServe2}=await Promise.resolve().then(() => (init_serve(),exports_serve));if(!isServeRunning2())console.log("Starting genie serve..."),await autoStartServe2();let{attachTuiSession:attachTuiSession2}=await Promise.resolve().then(() => (init_tmux2(),exports_tmux2));attachTuiSession2()}async function findTauriBinary(){let{existsSync:existsSync37}=await import("fs"),{join:join44,dirname:dirname8}=await import("path"),{execSync:
|
|
3622
|
+
No active executor.`);console.log("")}function registerAgentShow(parent){parent.command("show <name>").description("Show agent identity and current executor detail").option("--json","Output as JSON").action(async(name,options)=>{try{await showAgent(name,options.json)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_agents();function parseNumericFlag(flagName){return(value)=>{let n=Number(value);if(Number.isNaN(n))throw Error(`${flagName} must be a number, got: ${value}`);return n}}function registerAgentSpawn(parent){parent.command("spawn <name>").description("Spawn a new agent by name (resolves from directory or built-ins)").option("--provider <provider>","Provider: claude, codex, or claude-sdk").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("--prompt <prompt>","Initial prompt (first user message)").option("--sdk-max-turns <n>","SDK: max conversation turns",parseNumericFlag("--sdk-max-turns")).option("--sdk-max-budget <usd>","SDK: max budget in USD",parseNumericFlag("--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").action(async(name,options)=>{if(options.prompt)options.initialPrompt=options.prompt;try{await handleWorkerSpawn(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_agents();function registerAgentStop(parent){parent.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)}})}function registerAgentCommands(program2){let agent=program2.command("agent").description("Agent lifecycle management");registerAgentSpawn(agent),registerAgentStop(agent),registerAgentResume(agent),registerAgentKill(agent),registerAgentList(agent),registerAgentShow(agent),registerAgentAnswer(agent),registerAgentRegister(agent),registerAgentDirectory(agent),registerAgentInbox(agent),registerAgentBrief(agent),registerAgentLog(agent),registerAgentSend(agent),agent.on("command:*",(operands)=>{let cmd=operands[0],available=agent.commands.map((c)=>c.name()).join(", ");agent.error(`Unknown agent command '${cmd}'. Available: ${available}`)})}init_agents();async function handleTuiMode(){let{isServeRunning:isServeRunning2,autoStartServe:autoStartServe2}=await Promise.resolve().then(() => (init_serve(),exports_serve));if(!isServeRunning2())console.log("Starting genie serve..."),await autoStartServe2();let{attachTuiSession:attachTuiSession2}=await Promise.resolve().then(() => (init_tmux2(),exports_tmux2));attachTuiSession2()}async function findTauriBinary(){let{existsSync:existsSync37}=await import("fs"),{join:join44,dirname:dirname8}=await import("path"),{execSync:execSync11}=await import("child_process"),appName="genie-desktop",rootDir=join44(dirname8(new URL(import.meta.url).pathname),"..",".."),localBin=[join44(rootDir,"packages","genie-app","src-tauri","target","release","genie-desktop"),join44(rootDir,"packages","genie-app","src-tauri","target","debug","genie-desktop"),join44(rootDir,"dist","app","genie-desktop"),"/usr/local/bin/genie-desktop"].find((p)=>existsSync37(p));if(localBin)return localBin;try{return execSync11("which genie-desktop",{stdio:"ignore"}),"genie-desktop"}catch{return}}function registerAppCommand(program2){program2.command("app").description("Launch Genie desktop app (backend sidecar + views)").option("--backend-only","Start only the backend sidecar (IPC on stdin/stdout)").option("--tui","Fall back to terminal UI mode").option("--dev","Development mode").action(async(options)=>{if(options.tui){await handleTuiMode();return}if(options.backendOnly){await Promise.resolve().then(() => (init_src_backend(),exports_src_backend));return}let tauriBin=await findTauriBinary();if(tauriBin){console.log("\x1B[35m\u25C6 Genie App\x1B[0m Launching desktop...");let{execFileSync}=await import("child_process");try{execFileSync(tauriBin,[],{stdio:"inherit"})}catch{}return}console.log("\x1B[35m\u25C6 Genie App\x1B[0m Starting backend sidecar..."),console.log("\x1B[2mDesktop binary not found \u2014 running in sidecar mode.\x1B[0m"),console.log("\x1B[2mPG bridge + PTY manager + IPC on stdin/stdout\x1B[0m"),console.log(`\x1B[2mUse --tui for terminal UI, or pipe to a frontend shell.\x1B[0m
|
|
3614
3623
|
`),await Promise.resolve().then(() => (init_src_backend(),exports_src_backend))})}init_claude_sdk_remote_approval();init_workspace();async function handleRequest(options){let ws=findWorkspace(),permissions=ws?getWorkspaceConfig(ws.root).permissions:void 0,timeoutSec=options.timeout?Number(options.timeout):permissions?.timeout??300,defaultAction=permissions?.defaultAction??"deny",timeoutAt=new Date(Date.now()+timeoutSec*1000),approvalId=await insertApproval(`cli-${process.pid}`,options.agent,options.tool,options.input,timeoutAt);if(console.log(`Approval created: ${approvalId}`),options.wait){console.log(`Waiting for resolution (timeout: ${timeoutSec}s, default: ${defaultAction})...`);let decision=await waitForResolution(approvalId,timeoutAt,defaultAction);if(console.log(`Decision: ${decision}`),decision==="deny")process.exit(1)}}async function handleResolve(id,options){if(options.decision!=="allow"&&options.decision!=="deny")console.error('Error: --decision must be "allow" or "deny"'),process.exit(1);let actor=process.env.GENIE_AGENT_NAME||options.by;if(await resolveApproval(id,options.decision,actor))console.log(`Approval ${id} resolved: ${options.decision} by ${options.by}`);else console.error(`Error: Approval ${id} not found or already resolved`),process.exit(1)}async function handleList(options){let rows=await listPendingApprovals(options.agent);if(options.json){console.log(JSON.stringify(rows,null,2));return}if(rows.length===0){console.log("No pending approvals.");return}console.log(` ${"ID".padEnd(38)} ${"AGENT".padEnd(20)} ${"TOOL".padEnd(15)} TIMEOUT`),console.log(` ${"\u2500".repeat(85)}`);for(let row of rows){let timeout=new Date(row.timeout_at).toLocaleTimeString();console.log(` ${String(row.id).padEnd(38)} ${String(row.agent_name).padEnd(20)} ${String(row.tool_name).padEnd(15)} ${timeout}`)}console.log(`
|
|
3615
3624
|
${rows.length} pending approval${rows.length===1?"":"s"}`)}function registerApprovalCommands(program2){let approval=program2.command("approval").description("Remote approval queue management");approval.command("request").description("Create an approval request (for tmux-path agents)").requiredOption("--tool <name>","Tool name requiring approval").requiredOption("--input <preview>","Tool input preview text").requiredOption("--agent <name>","Agent name requesting approval").option("--wait","Block until the approval is resolved").option("--timeout <seconds>","Timeout in seconds (overrides workspace config)").action(async(options)=>{try{await handleRequest(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),approval.command("resolve <id>").description("Resolve a pending approval").requiredOption("--decision <decision>","Decision: allow or deny").option("--by <actor>",'Display label for decision maker (defaults to GENIE_AGENT_NAME or "cli")',"cli").action(async(id,options)=>{try{await handleResolve(id,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),approval.command("list").description("List pending approvals").option("--agent <name>","Filter by agent name").option("--json","Output as JSON").action(async(options)=>{try{await handleList(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_audit();init_db();var V2_SELECT=`
|
|
3616
3625
|
id,
|
|
@@ -3752,17 +3761,17 @@ Registering in Omni (${omniUrl})...`);let existingId=await findOmniAgent(name);i
|
|
|
3752
3761
|
(${rows.length} event${rows.length===1?"":"s"})`)}async function eventsListV2Command(options){try{let limit=options.limit?Number.parseInt(options.limit,10):50,rows=await queryV2Batch({kindPrefix:options.kind,severity:options.severity,since:options.since??"1h",limit});if(options.json)console.log(JSON.stringify(rows,null,2));else printV2EventsTable(rows)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying v2 events: ${msg}`),process.exit(1)}}async function eventsListCommand(options){if(options.v2)return eventsListV2Command(options);try{let queryOpts={type:options.type,entity:options.entity,since:options.since??"1h",errorsOnly:options.errorsOnly,limit:options.limit?Number.parseInt(options.limit,10):50};if(options.follow){let{followAuditEvents:followAuditEvents2}=await Promise.resolve().then(() => (init_audit(),exports_audit));console.log("Following audit events (Ctrl+C to stop)...");let handle=await followAuditEvents2(queryOpts,(row)=>{if(options.json)console.log(JSON.stringify(row));else{let time=formatRelativeTimestamp(row.created_at),entity=`${row.entity_type}:${row.entity_id}`.slice(0,40),event=row.event_type.padEnd(24),details=summarizeDetails(row.details).slice(0,60);console.log(`${time} ${event} ${entity} ${details}`)}}),shutdown3=()=>{handle.stop(),process.exit(0)};process.on("SIGINT",shutdown3),process.on("SIGTERM",shutdown3),await new Promise(()=>{});return}let rows=await queryAuditEvents(queryOpts);if(options.json)console.log(JSON.stringify(rows,null,2));else printEventsTable(rows)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying events: ${msg}`),process.exit(1)}}var DEFAULT_HIDDEN_EVENT_TYPES=new Set(["command_success","sdk.hook.started"]);async function eventsStreamCommand(options){let{followAuditEvents:followAuditEvents2}=await Promise.resolve().then(() => (init_audit(),exports_audit)),{followRuntimeEvents:followRuntimeEvents2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events)),{color:color2}=await Promise.resolve().then(() => (init_term_format(),exports_term_format)),{renderAuditEvent:renderAuditEvent2,renderRuntimeEvent:renderRuntimeEvent2,formatEventLine:formatEventLine2}=await Promise.resolve().then(() => (init_event_renderer(),exports_event_renderer)),handles2=[],clockTime=(iso)=>{return(iso instanceof Date?iso:new Date(iso)).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})};if(!options.json){let sources=options.auditOnly?"audit":options.runtimeOnly?"runtime":"audit + runtime";console.log(color2("dim",`Streaming ${sources} events (Ctrl+C to stop)...`))}if(!options.runtimeOnly){let auditHandle=await followAuditEvents2({type:options.type,entity:options.entity,errorsOnly:options.errorsOnly},(row)=>{if(!options.all&&!options.type&&DEFAULT_HIDDEN_EVENT_TYPES.has(row.event_type))return;if(options.json){console.log(JSON.stringify({stream:"audit",...row}));return}console.log(formatEventLine2(clockTime(row.created_at),renderAuditEvent2({entity_type:row.entity_type,entity_id:row.entity_id,event_type:row.event_type,details:row.details})))});handles2.push(auditHandle)}if(!options.auditOnly){let validKinds=["user","assistant","message","state","tool_call","tool_result","system","qa"],kinds=options.kind&&validKinds.includes(options.kind)?[options.kind]:void 0,agentIds=options.agent?[options.agent]:void 0,runtimeHandle=await followRuntimeEvents2({kinds,agentIds,scopeMode:"any"},(event)=>{if(options.json){console.log(JSON.stringify({stream:"runtime",...event}));return}console.log(formatEventLine2(clockTime(event.timestamp),renderRuntimeEvent2({kind:event.kind,agent:event.agent,team:event.team,text:event.text})))},{pollIntervalMs:2000});handles2.push(runtimeHandle)}let shutdown3=async()=>{for(let h of handles2)await h.stop();process.exit(0)};process.on("SIGINT",shutdown3),process.on("SIGTERM",shutdown3),await new Promise(()=>{})}async function eventsErrorsCommand(options){try{let patterns2=await queryErrorPatterns(options.since);if(options.json)console.log(JSON.stringify(patterns2,null,2));else printErrorsTable(patterns2)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying error patterns: ${msg}`),process.exit(1)}}function resolveCostsGroupBy(options){if(options.byWish)return"wish";if(options.byModel)return"model";return"agent"}function printCostsTable(rows,groupBy){if(rows.length===0){console.log("No cost data found.");return}let headers=[groupBy==="agent"?"Agent":groupBy==="wish"?"Wish":"Model","Total Cost","Requests","Avg Cost"],data=rows.map((r)=>[r.group_key,`$${r.total_cost.toFixed(4)}`,String(r.request_count),`$${r.avg_cost.toFixed(4)}`]),widths=headers.map((h,i2)=>{let colVals=data.map((row)=>row[i2]);return Math.min(40,Math.max(h.length,...colVals.map((v)=>v.length)))});console.log(headers.map((h,i2)=>padRight(h,widths[i2])).join(" | ")),console.log(widths.map((w)=>"-".repeat(w)).join("-+-"));for(let row of data)console.log(row.map((v,i2)=>padRight(v.slice(0,widths[i2]),widths[i2])).join(" | "));let totalCost=rows.reduce((sum,r)=>sum+r.total_cost,0),totalReqs=rows.reduce((sum,r)=>sum+r.request_count,0);console.log(`
|
|
3753
3762
|
Total: $${totalCost.toFixed(4)} across ${totalReqs} requests`)}async function eventsCostsCommand(options){try{let since=options.today?"24h":options.since??"24h",groupBy=resolveCostsGroupBy(options),rows=await queryCostBreakdown(since,groupBy);if(options.json)console.log(JSON.stringify(rows,null,2));else printCostsTable(rows,groupBy),console.log(`
|
|
3754
3763
|
\u26A0 OTel costs only include genie-spawned sessions. For full server costs: npx ccusage monthly`)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying costs: ${msg}`),process.exit(1)}}function printToolsTable(rows,groupBy){if(rows.length===0){console.log("No tool usage data found.");return}let headers=[groupBy==="tool"?"Tool":"Agent","Calls","Success","Errors","Avg Duration"],data=rows.map((r)=>[r.group_key,String(r.total_calls),String(r.success_count),String(r.error_count),r.avg_duration_ms!=null?`${r.avg_duration_ms.toFixed(0)}ms`:"-"]),widths=headers.map((h,i2)=>{let colVals=data.map((row)=>row[i2]);return Math.min(40,Math.max(h.length,...colVals.map((v)=>v.length)))});console.log(headers.map((h,i2)=>padRight(h,widths[i2])).join(" | ")),console.log(widths.map((w)=>"-".repeat(w)).join("-+-"));for(let row of data)console.log(row.map((v,i2)=>padRight(v.slice(0,widths[i2]),widths[i2])).join(" | "));let totalCalls=rows.reduce((sum,r)=>sum+r.total_calls,0);console.log(`
|
|
3755
|
-
(${totalCalls} total tool calls)`)}async function eventsToolsCommand(options){try{let since=options.since??"24h",groupBy=options.byAgent?"agent":"tool",rows=await queryToolUsage(since,groupBy);if(options.json)console.log(JSON.stringify(rows,null,2));else printToolsTable(rows,groupBy)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying tool usage: ${msg}`),process.exit(1)}}async function eventsTimelineCommand(entityId,options){try{let rows=await queryTimeline(entityId);if(options.json)console.log(JSON.stringify(rows,null,2));else printEventsTable(rows)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying timeline: ${msg}`),process.exit(1)}}function printSummary(summary){console.log("Event Summary"),console.log("============="),console.log(`Total events: ${summary.total_events}`),console.log(`Agents spawned: ${summary.agents_spawned}`),console.log(`Tasks moved: ${summary.tasks_moved}`),console.log(`API requests: ${summary.api_requests}`),console.log(`Tool calls: ${summary.tool_calls}`),console.log(`Total cost: $${summary.total_cost.toFixed(4)}`),console.log(`Errors: ${summary.error_count}`)}async function eventsSummaryCommand(options){try{let since=options.today?"24h":options.since??"24h",summary=await querySummary(since);if(options.json)console.log(JSON.stringify(summary,null,2));else printSummary(summary)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying summary: ${msg}`),process.exit(1)}}async function eventsScanCommand(options){let{spawnSync:spawnSync5}=__require("child_process"),args=["ccusage","monthly"];if(options.since)args.push("--since",options.since);if(options.json)args.push("--json");if(options.breakdown)args.push("--breakdown");let result2=spawnSync5("npx",args,{stdio:options.json?"pipe":"inherit",timeout:30000,env:{...process.env,NODE_NO_WARNINGS:"1"}});if(result2.error)console.error("ccusage not available. Install with: npm install -g ccusage"),console.error("Or run directly: npx ccusage monthly"),process.exit(1);if(options.json&&result2.stdout)process.stdout.write(result2.stdout);if(result2.status!==0)process.exit(result2.status??1)}function registerEventsCommands(program2){let events=program2.command("events").description("Audit event log from PG");events.command("list",{isDefault:!0}).description("List recent audit events (add --v2 for the enriched genie_runtime_events surface)").option("--type <type>","Filter by event_type").option("--entity <entity>","Filter by entity_type or entity_id").option("--since <duration>","Time window (e.g., 1h, 30m, 2d)","1h").option("--errors-only","Show only error events").option("--limit <n>","Max rows to return","50").option("--json","Output as JSON").option("-f, --follow","Follow mode \u2014 real-time streaming (alias: genie events stream)").option("--v2","Use enriched genie_runtime_events surface with TraceId/SpanId/Severity/Duration columns").option("--kind <prefix>","Filter v2 rows by kind/subject prefix (e.g., mailbox, agent.lifecycle)").option("--severity <level>","Filter v2 rows by severity (debug|info|warn|error|fatal)").action(async(options)=>{await eventsListCommand(options)}),events.command("timeline-v2 <trace-id>").description("Render causal tree for a trace_id from genie_runtime_events (v2 enriched surface)").option("--json","Output as JSON").action(async(traceId,options)=>{await timelineCommand(traceId,options)}),events.command("stream-follow").description("Follow-stream enriched genie_runtime_events via LISTEN/NOTIFY + id-cursor (v2)").option("--follow","Continuously follow the stream",!0).option("--kind <prefix>","Filter by subject/kind prefix (supports `*` globs, e.g. `detector.*`)").option("--severity <level>","Filter by severity (debug|info|warn|error|fatal)").option("--since <duration>","Seed window (e.g., 5m, 1h)").option("--consumer-id <id>","Persistent consumer id for cursor resume").option("--json","Output as NDJSON").action(async(options)=>{await streamCommand({...options,follow:!0})}),events.command("migrate").description("Backfill legacy audit_events rows into genie_runtime_events (one-shot)").option("--audit","Migrate audit_events \u2192 genie_runtime_events with sentinel source tag").option("--dry-run","Report row deltas without writing").option("--since <duration>","Only migrate rows created within this window").option("--limit <n>","Cap the number of rows migrated per run",(v)=>Number.parseInt(v,10)).option("--json","Output summary as JSON").action(async(options)=>{await migrateCommand(options)}),events.command("stream").description("Stream audit + runtime events in real-time (tail -f style)").option("--type <type>","Filter by event_type").option("--entity <entity>","Filter by entity_type or entity_id").option("--errors-only","Show only error events").option("--kind <kind>","Filter runtime events by kind (tool_call, message, prompt, etc)").option("--agent <agent>","Filter runtime events by agent").option("--audit-only","Stream only audit_events (skip runtime)").option("--runtime-only","Stream only runtime events (skip audit)").option("--all","Show all events including noisy ones (command_success, etc)").option("--json","Output as JSON").action(async(options)=>{await eventsStreamCommand(options)}),events.command("errors").description("Show aggregated error patterns").option("--since <duration>","Time window (e.g., 1h, 24h, 7d)").option("--json","Output as JSON").action(async(options)=>{await eventsErrorsCommand(options)}),events.command("costs").description("Cost breakdown from OTel API request events").option("--today","Show costs from the last 24h").option("--since <duration>","Time window (e.g., 1h, 7d)","24h").option("--by-agent","Group by agent").option("--by-wish","Group by wish").option("--by-model","Group by model").option("--json","Output as JSON").action(async(options)=>{await eventsCostsCommand(options)}),events.command("tools").description("Tool usage analytics from OTel tool events").option("--since <duration>","Time window (e.g., 1h, 7d)","24h").option("--by-tool","Group by tool name (default)").option("--by-agent","Group by agent").option("--json","Output as JSON").action(async(options)=>{await eventsToolsCommand(options)}),events.command("timeline <entity-id>").description("Full event timeline for a task, agent, wish, or traceId").option("--json","Output as JSON").action(async(entityId,options)=>{await eventsTimelineCommand(entityId,options)}),events.command("summary").description("High-level stats: agents spawned, tasks moved, costs, errors").option("--today","Show summary for the last 24h").option("--since <duration>","Time window (e.g., 1h, 7d)","24h").option("--json","Output as JSON").action(async(options)=>{await eventsSummaryCommand(options)}),events.command("scan").description("Full server cost scan via ccusage (all CC sessions, not just genie-spawned)").option("--since <date>","Start date in YYYYMMDD format").option("--json","Output as JSON").option("--breakdown","Show per-model breakdown").action(async(options)=>{await eventsScanCommand(options)}),events.command("subscribe").description("Mint a signed subscription token for genie events stream --follow").requiredOption("--role <role>","RBAC role: events:admin|events:operator|events:subscriber|events:audit").option("--types <csv>","Comma-separated allowed event types (subset of role defaults)").option("--channels <csv>","Comma-separated allowed LISTEN channels (subset of role defaults)").option("--ttl <duration>","Token time-to-live (e.g., 30m, 1h, 24h). Defaults to 1h.").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--subscriber-id <id>","Stable id for the subscriber agent").option("--json","Output as JSON").action(async(options)=>{await subscribeCommand(options)});let admin=events.command("admin").description("Incident-response admin commands (sentinel H6 audited)");admin.command("revoke-subscriber").description("Add a subscription token to the revocation list").requiredOption("--token-id <id>","Token id from `genie events subscribe` output").option("--subscriber-id <id>","Subscriber id associated with the token").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--reason <text>","IR justification for revocation").option("--json","Output as JSON").action(async(options)=>{await revokeSubscriberCommand(options)}),admin.command("rotate-redaction-keys").description("Rotate redaction + audit HMAC keys, preserving prior versions for lookup").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--new-key <material>","Explicit key material (default: 32 bytes hex from /dev/urandom)").option("--target <scope>","redaction|audit|both (default: both)").option("--json","Output as JSON").action(async(options)=>{await rotateRedactionKeysCommand(options)}),admin.command("un-hash").description("Admin reverse-lookup for a Tier-A hash (emits audit.un_hash)").requiredOption("--namespace <ns>","Hash namespace (e.g., agent, actor, session)").requiredOption("--hashed-value <hash>","Tier-A hash tag to reverse").option("--candidates <csv>","Comma-separated candidate plaintexts to brute-force").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--reason <text>","IR justification (appears in audit.un_hash)").option("--ticket <ref>","Incident ticket reference").option("--json","Output as JSON").action(async(options)=>{await unHashCommand(options)}),admin.command("export-audit").description("Produce a signed audit-chain bundle (emits audit.export)").option("--signed","Require GENIE_AUDIT_EXPORT_SECRET for HMAC signing",!0).option("--since <duration>","Advisory time window (authoritative cursor is --since-id)").option("--since-id <n>","Authoritative id cursor to resume from").option("--limit <n>","Max rows to include").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--output <path>","Write bundle to file; omit to print to stdout").option("--reason <text>","IR justification (appears in audit.export)").option("--json","Output as JSON").action(async(options)=>{await exportAuditCommand(options)}),admin.command("verify-chain").description("Quick chain-integrity check (no export)").option("--since-id <n>","Start id","0").option("--limit <n>","Max rows to verify").option("--json","Output as JSON").action(async(options)=>{await verifyChainCommand(options)}),admin.command("list-revocations").description("List revoked token ids for a tenant").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--json","Output as JSON").action(async(options)=>{await listRevocationsCommand(options)})}init_term_format();import{execSync as execSync12}from"child_process";import{existsSync as existsSync38,mkdirSync as mkdirSync16,readFileSync as readFileSync25,writeFileSync as writeFileSync18}from"fs";import{dirname as dirname8,join as join45}from"path";var _boardService;async function getBoardService(){if(!_boardService)_boardService=await Promise.resolve().then(() => (init_board_service(),exports_board_service));return _boardService}var _taskService3;async function getTaskService3(){if(!_taskService3)_taskService3=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService3}var _templateService;async function getTemplateService(){if(!_templateService)_templateService=await Promise.resolve().then(() => (init_template_service(),exports_template_service));return _templateService}async function resolveProjectId(name){let project=await(await getTaskService3()).getProjectByName(name);if(!project)throw Error(`Project not found: ${name}`);return project.id}async function resolveBoard(name,projectName){let bs=await getBoardService(),projectId;if(projectName)projectId=await resolveProjectId(projectName);let board=await bs.getBoard(name,projectId);if(!board)throw Error(`Board not found: ${name}`);return board}function printBoardTable(boards,projectMap){console.log(` ${padRight("NAME",24)} ${padRight("PROJECT",20)} ${padRight("COLUMNS",10)} CREATED`),console.log(` ${"\u2500".repeat(70)}`);for(let b2 of boards){let projName=b2.projectId?projectMap.get(b2.projectId)??b2.projectId:"-",colCount=String(b2.columns.length),created=formatDate(b2.createdAt);console.log(` ${padRight(truncate2(b2.name,22),24)} ${padRight(truncate2(projName,18),20)} ${padRight(colCount,10)} ${created}`)}console.log(`
|
|
3764
|
+
(${totalCalls} total tool calls)`)}async function eventsToolsCommand(options){try{let since=options.since??"24h",groupBy=options.byAgent?"agent":"tool",rows=await queryToolUsage(since,groupBy);if(options.json)console.log(JSON.stringify(rows,null,2));else printToolsTable(rows,groupBy)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying tool usage: ${msg}`),process.exit(1)}}async function eventsTimelineCommand(entityId,options){try{let rows=await queryTimeline(entityId);if(options.json)console.log(JSON.stringify(rows,null,2));else printEventsTable(rows)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying timeline: ${msg}`),process.exit(1)}}function printSummary(summary){console.log("Event Summary"),console.log("============="),console.log(`Total events: ${summary.total_events}`),console.log(`Agents spawned: ${summary.agents_spawned}`),console.log(`Tasks moved: ${summary.tasks_moved}`),console.log(`API requests: ${summary.api_requests}`),console.log(`Tool calls: ${summary.tool_calls}`),console.log(`Total cost: $${summary.total_cost.toFixed(4)}`),console.log(`Errors: ${summary.error_count}`)}async function eventsSummaryCommand(options){try{let since=options.today?"24h":options.since??"24h",summary=await querySummary(since);if(options.json)console.log(JSON.stringify(summary,null,2));else printSummary(summary)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying summary: ${msg}`),process.exit(1)}}async function eventsScanCommand(options){let{spawnSync:spawnSync6}=__require("child_process"),args=["ccusage","monthly"];if(options.since)args.push("--since",options.since);if(options.json)args.push("--json");if(options.breakdown)args.push("--breakdown");let result2=spawnSync6("npx",args,{stdio:options.json?"pipe":"inherit",timeout:30000,env:{...process.env,NODE_NO_WARNINGS:"1"}});if(result2.error)console.error("ccusage not available. Install with: npm install -g ccusage"),console.error("Or run directly: npx ccusage monthly"),process.exit(1);if(options.json&&result2.stdout)process.stdout.write(result2.stdout);if(result2.status!==0)process.exit(result2.status??1)}function registerEventsCommands(program2){let events=program2.command("events").description("Audit event log from PG");events.command("list",{isDefault:!0}).description("List recent audit events (add --v2 for the enriched genie_runtime_events surface)").option("--type <type>","Filter by event_type").option("--entity <entity>","Filter by entity_type or entity_id").option("--since <duration>","Time window (e.g., 1h, 30m, 2d)","1h").option("--errors-only","Show only error events").option("--limit <n>","Max rows to return","50").option("--json","Output as JSON").option("-f, --follow","Follow mode \u2014 real-time streaming (alias: genie events stream)").option("--v2","Use enriched genie_runtime_events surface with TraceId/SpanId/Severity/Duration columns").option("--kind <prefix>","Filter v2 rows by kind/subject prefix (e.g., mailbox, agent.lifecycle)").option("--severity <level>","Filter v2 rows by severity (debug|info|warn|error|fatal)").action(async(options)=>{await eventsListCommand(options)}),events.command("timeline-v2 <trace-id>").description("Render causal tree for a trace_id from genie_runtime_events (v2 enriched surface)").option("--json","Output as JSON").action(async(traceId,options)=>{await timelineCommand(traceId,options)}),events.command("stream-follow").description("Follow-stream enriched genie_runtime_events via LISTEN/NOTIFY + id-cursor (v2)").option("--follow","Continuously follow the stream",!0).option("--kind <prefix>","Filter by subject/kind prefix (supports `*` globs, e.g. `detector.*`)").option("--severity <level>","Filter by severity (debug|info|warn|error|fatal)").option("--since <duration>","Seed window (e.g., 5m, 1h)").option("--consumer-id <id>","Persistent consumer id for cursor resume").option("--json","Output as NDJSON").action(async(options)=>{await streamCommand({...options,follow:!0})}),events.command("migrate").description("Backfill legacy audit_events rows into genie_runtime_events (one-shot)").option("--audit","Migrate audit_events \u2192 genie_runtime_events with sentinel source tag").option("--dry-run","Report row deltas without writing").option("--since <duration>","Only migrate rows created within this window").option("--limit <n>","Cap the number of rows migrated per run",(v)=>Number.parseInt(v,10)).option("--json","Output summary as JSON").action(async(options)=>{await migrateCommand(options)}),events.command("stream").description("Stream audit + runtime events in real-time (tail -f style)").option("--type <type>","Filter by event_type").option("--entity <entity>","Filter by entity_type or entity_id").option("--errors-only","Show only error events").option("--kind <kind>","Filter runtime events by kind (tool_call, message, prompt, etc)").option("--agent <agent>","Filter runtime events by agent").option("--audit-only","Stream only audit_events (skip runtime)").option("--runtime-only","Stream only runtime events (skip audit)").option("--all","Show all events including noisy ones (command_success, etc)").option("--json","Output as JSON").action(async(options)=>{await eventsStreamCommand(options)}),events.command("errors").description("Show aggregated error patterns").option("--since <duration>","Time window (e.g., 1h, 24h, 7d)").option("--json","Output as JSON").action(async(options)=>{await eventsErrorsCommand(options)}),events.command("costs").description("Cost breakdown from OTel API request events").option("--today","Show costs from the last 24h").option("--since <duration>","Time window (e.g., 1h, 7d)","24h").option("--by-agent","Group by agent").option("--by-wish","Group by wish").option("--by-model","Group by model").option("--json","Output as JSON").action(async(options)=>{await eventsCostsCommand(options)}),events.command("tools").description("Tool usage analytics from OTel tool events").option("--since <duration>","Time window (e.g., 1h, 7d)","24h").option("--by-tool","Group by tool name (default)").option("--by-agent","Group by agent").option("--json","Output as JSON").action(async(options)=>{await eventsToolsCommand(options)}),events.command("timeline <entity-id>").description("Full event timeline for a task, agent, wish, or traceId").option("--json","Output as JSON").action(async(entityId,options)=>{await eventsTimelineCommand(entityId,options)}),events.command("summary").description("High-level stats: agents spawned, tasks moved, costs, errors").option("--today","Show summary for the last 24h").option("--since <duration>","Time window (e.g., 1h, 7d)","24h").option("--json","Output as JSON").action(async(options)=>{await eventsSummaryCommand(options)}),events.command("scan").description("Full server cost scan via ccusage (all CC sessions, not just genie-spawned)").option("--since <date>","Start date in YYYYMMDD format").option("--json","Output as JSON").option("--breakdown","Show per-model breakdown").action(async(options)=>{await eventsScanCommand(options)}),events.command("subscribe").description("Mint a signed subscription token for genie events stream --follow").requiredOption("--role <role>","RBAC role: events:admin|events:operator|events:subscriber|events:audit").option("--types <csv>","Comma-separated allowed event types (subset of role defaults)").option("--channels <csv>","Comma-separated allowed LISTEN channels (subset of role defaults)").option("--ttl <duration>","Token time-to-live (e.g., 30m, 1h, 24h). Defaults to 1h.").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--subscriber-id <id>","Stable id for the subscriber agent").option("--json","Output as JSON").action(async(options)=>{await subscribeCommand(options)});let admin=events.command("admin").description("Incident-response admin commands (sentinel H6 audited)");admin.command("revoke-subscriber").description("Add a subscription token to the revocation list").requiredOption("--token-id <id>","Token id from `genie events subscribe` output").option("--subscriber-id <id>","Subscriber id associated with the token").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--reason <text>","IR justification for revocation").option("--json","Output as JSON").action(async(options)=>{await revokeSubscriberCommand(options)}),admin.command("rotate-redaction-keys").description("Rotate redaction + audit HMAC keys, preserving prior versions for lookup").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--new-key <material>","Explicit key material (default: 32 bytes hex from /dev/urandom)").option("--target <scope>","redaction|audit|both (default: both)").option("--json","Output as JSON").action(async(options)=>{await rotateRedactionKeysCommand(options)}),admin.command("un-hash").description("Admin reverse-lookup for a Tier-A hash (emits audit.un_hash)").requiredOption("--namespace <ns>","Hash namespace (e.g., agent, actor, session)").requiredOption("--hashed-value <hash>","Tier-A hash tag to reverse").option("--candidates <csv>","Comma-separated candidate plaintexts to brute-force").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--reason <text>","IR justification (appears in audit.un_hash)").option("--ticket <ref>","Incident ticket reference").option("--json","Output as JSON").action(async(options)=>{await unHashCommand(options)}),admin.command("export-audit").description("Produce a signed audit-chain bundle (emits audit.export)").option("--signed","Require GENIE_AUDIT_EXPORT_SECRET for HMAC signing",!0).option("--since <duration>","Advisory time window (authoritative cursor is --since-id)").option("--since-id <n>","Authoritative id cursor to resume from").option("--limit <n>","Max rows to include").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--output <path>","Write bundle to file; omit to print to stdout").option("--reason <text>","IR justification (appears in audit.export)").option("--json","Output as JSON").action(async(options)=>{await exportAuditCommand(options)}),admin.command("verify-chain").description("Quick chain-integrity check (no export)").option("--since-id <n>","Start id","0").option("--limit <n>","Max rows to verify").option("--json","Output as JSON").action(async(options)=>{await verifyChainCommand(options)}),admin.command("list-revocations").description("List revoked token ids for a tenant").option("--tenant <id>",'Tenant id. Defaults to "default".').option("--json","Output as JSON").action(async(options)=>{await listRevocationsCommand(options)})}init_term_format();import{execSync as execSync11}from"child_process";import{existsSync as existsSync38,mkdirSync as mkdirSync16,readFileSync as readFileSync25,writeFileSync as writeFileSync18}from"fs";import{dirname as dirname8,join as join45}from"path";var _boardService;async function getBoardService(){if(!_boardService)_boardService=await Promise.resolve().then(() => (init_board_service(),exports_board_service));return _boardService}var _taskService3;async function getTaskService3(){if(!_taskService3)_taskService3=await Promise.resolve().then(() => (init_task_service(),exports_task_service));return _taskService3}var _templateService;async function getTemplateService(){if(!_templateService)_templateService=await Promise.resolve().then(() => (init_template_service(),exports_template_service));return _templateService}async function resolveProjectId(name){let project=await(await getTaskService3()).getProjectByName(name);if(!project)throw Error(`Project not found: ${name}`);return project.id}async function resolveBoard(name,projectName){let bs=await getBoardService(),projectId;if(projectName)projectId=await resolveProjectId(projectName);let board=await bs.getBoard(name,projectId);if(!board)throw Error(`Board not found: ${name}`);return board}function printBoardTable(boards,projectMap){console.log(` ${padRight("NAME",24)} ${padRight("PROJECT",20)} ${padRight("COLUMNS",10)} CREATED`),console.log(` ${"\u2500".repeat(70)}`);for(let b2 of boards){let projName=b2.projectId?projectMap.get(b2.projectId)??b2.projectId:"-",colCount=String(b2.columns.length),created=formatDate(b2.createdAt);console.log(` ${padRight(truncate2(b2.name,22),24)} ${padRight(truncate2(projName,18),20)} ${padRight(colCount,10)} ${created}`)}console.log(`
|
|
3756
3765
|
${boards.length} board${boards.length===1?"":"s"}`)}function printColumnPipeline(columns,header){console.log(`
|
|
3757
3766
|
${header}`),console.log("\u2500".repeat(60));let sorted=[...columns].sort((a,b2)=>a.position-b2.position);for(let i2=0;i2<sorted.length;i2++){let c=sorted[i2],arrow=i2<sorted.length-1?" \u2192":"",gate=` [gate: ${c.gate}]`,action=c.action?` (action: ${c.action})`:"";console.log(` ${i2+1}. ${c.label??c.name}${gate}${action}${arrow}`)}console.log("")}function printTemplateTable(templates){console.log(` ${padRight("NAME",24)} ${padRight("COLUMNS",10)} ${padRight("BUILTIN",10)} DESCRIPTION`),console.log(` ${"\u2500".repeat(80)}`);for(let t of templates){let colCount=String(t.columns.length),builtin=t.isBuiltin?"yes":"no",desc=t.description?truncate2(t.description,30):"-";console.log(` ${padRight(truncate2(t.name,22),24)} ${padRight(colCount,10)} ${padRight(builtin,10)} ${desc}`)}console.log(`
|
|
3758
3767
|
${templates.length} template${templates.length===1?"":"s"}`)}async function handleBoardCreate(name,options){let bs=await getBoardService(),tmpl=await getTemplateService(),projectId;if(options.project)projectId=await resolveProjectId(options.project);let columns;if(options.from){let template=await tmpl.getTemplate(options.from);if(!template)throw Error(`Template not found: ${options.from}`);columns=template.columns}else if(options.columns)columns=options.columns.split(",").map((colName,i2)=>({name:colName.trim(),label:colName.trim(),gate:"human",position:i2}));let board=await bs.createBoard({name,projectId,description:options.description,columns});console.log(`Created board "${board.name}" (${board.id}) with ${board.columns.length} columns`)}async function handleBoardList(options){let bs=await getBoardService(),ts3=await getTaskService3(),projectId;if(options.project)projectId=await resolveProjectId(options.project);let boards=await bs.listBoards(projectId,options.all);if(options.json){console.log(JSON.stringify(boards,null,2));return}let projects=await ts3.listProjects(),projectMap=new Map;for(let p of projects)projectMap.set(p.id,p.name);printBoardTable(boards,projectMap)}async function handleBoardShow(name,options){let ts3=await getTaskService3(),board=await resolveBoard(name,options.project);if(options.json){console.log(JSON.stringify(board,null,2));return}let projectName="-";if(board.projectId){let proj=(await ts3.listProjects()).find((p)=>p.id===board.projectId);if(proj)projectName=proj.name}if(console.log(`
|
|
3759
3768
|
Board: ${board.name} (${board.id})`),board.description)console.log(`Description: ${board.description}`);console.log(`Project: ${projectName}`),console.log(`Columns: ${board.columns.length}`),console.log("\u2500".repeat(60));let tasks=await ts3.listTasks({boardId:board.id,allProjects:!0}),countByColumn=new Map;for(let t of tasks){let colId=t.stage;countByColumn.set(colId,(countByColumn.get(colId)??0)+1)}let sorted=[...board.columns].sort((a,b2)=>a.position-b2.position);console.log(`
|
|
3760
|
-
Columns:`);for(let i2=0;i2<sorted.length;i2++){let c=sorted[i2],count=countByColumn.get(c.name)??countByColumn.get(c.id)??0,gate=` [gate: ${c.gate}]`,action=c.action?` (action: ${c.action})`:"";console.log(` ${i2+1}. ${c.label??c.name}${gate}${action} \u2014 ${count} task${count===1?"":"s"}`)}console.log("")}function buildColumnUpdates(options){let updates={};if(options.gate)updates.gate=options.gate;if(options.action)updates.action=options.action;if(options.color)updates.color=options.color;if(options.rename)updates.name=options.rename,updates.label=options.rename;return updates}async function handleBoardEdit(name,options){let bs=await getBoardService(),board=await resolveBoard(name,options.project);if(options.column){let col=board.columns.find((c)=>c.name===options.column||c.label===options.column);if(!col)throw Error(`Column not found: ${options.column}`);let updates=buildColumnUpdates(options);if(!await bs.updateColumn(board.id,col.id,updates))throw Error(`Failed to update column: ${options.column}`);console.log(`Updated column "${options.column}" on board "${board.name}".`);return}let boardUpdates={};if(options.name)boardUpdates.name=options.name;if(options.description)boardUpdates.description=options.description;if(Object.keys(boardUpdates).length===0)console.error("Error: No updates specified. Use --column, --name, or --description."),process.exit(1);let updated=await bs.updateBoard(board.id,boardUpdates);if(!updated)throw Error(`Failed to update board: ${name}`);console.log(`Updated board "${updated.name}" (${updated.id}).`)}async function handleBoardDelete(name,options){let bs=await getBoardService(),board=await resolveBoard(name,options.project);if(!options.force)console.log(`Deleting board "${board.name}" (${board.id})...`);if(!await bs.deleteBoard(board.id))throw Error(`Failed to delete board: ${name}`);console.log(`Deleted board "${board.name}" (${board.id}).`)}async function handleBoardColumns(name,options){let board=await resolveBoard(name,options.project);if(options.json){console.log(JSON.stringify(board.columns,null,2));return}printColumnPipeline(board.columns,`Board: ${board.name} (${board.columns.length} columns)`)}async function handleBoardUse(name,options){let board=await resolveBoard(name,options.project),repoRoot=
|
|
3769
|
+
Columns:`);for(let i2=0;i2<sorted.length;i2++){let c=sorted[i2],count=countByColumn.get(c.name)??countByColumn.get(c.id)??0,gate=` [gate: ${c.gate}]`,action=c.action?` (action: ${c.action})`:"";console.log(` ${i2+1}. ${c.label??c.name}${gate}${action} \u2014 ${count} task${count===1?"":"s"}`)}console.log("")}function buildColumnUpdates(options){let updates={};if(options.gate)updates.gate=options.gate;if(options.action)updates.action=options.action;if(options.color)updates.color=options.color;if(options.rename)updates.name=options.rename,updates.label=options.rename;return updates}async function handleBoardEdit(name,options){let bs=await getBoardService(),board=await resolveBoard(name,options.project);if(options.column){let col=board.columns.find((c)=>c.name===options.column||c.label===options.column);if(!col)throw Error(`Column not found: ${options.column}`);let updates=buildColumnUpdates(options);if(!await bs.updateColumn(board.id,col.id,updates))throw Error(`Failed to update column: ${options.column}`);console.log(`Updated column "${options.column}" on board "${board.name}".`);return}let boardUpdates={};if(options.name)boardUpdates.name=options.name;if(options.description)boardUpdates.description=options.description;if(Object.keys(boardUpdates).length===0)console.error("Error: No updates specified. Use --column, --name, or --description."),process.exit(1);let updated=await bs.updateBoard(board.id,boardUpdates);if(!updated)throw Error(`Failed to update board: ${name}`);console.log(`Updated board "${updated.name}" (${updated.id}).`)}async function handleBoardDelete(name,options){let bs=await getBoardService(),board=await resolveBoard(name,options.project);if(!options.force)console.log(`Deleting board "${board.name}" (${board.id})...`);if(!await bs.deleteBoard(board.id))throw Error(`Failed to delete board: ${name}`);console.log(`Deleted board "${board.name}" (${board.id}).`)}async function handleBoardColumns(name,options){let board=await resolveBoard(name,options.project);if(options.json){console.log(JSON.stringify(board.columns,null,2));return}printColumnPipeline(board.columns,`Board: ${board.name} (${board.columns.length} columns)`)}async function handleBoardUse(name,options){let board=await resolveBoard(name,options.project),repoRoot=execSync11("git rev-parse --show-toplevel",{encoding:"utf-8"}).trim(),genieDir=join45(repoRoot,".genie"),configPath2=join45(genieDir,"config.json");if(!existsSync38(genieDir))mkdirSync16(genieDir,{recursive:!0});let config={};if(existsSync38(configPath2))try{config=JSON.parse(readFileSync25(configPath2,"utf-8"))}catch{}config.activeBoard=board.id,writeFileSync18(configPath2,`${JSON.stringify(config,null,2)}
|
|
3761
3770
|
`),console.log(`Active board set to "${board.name}" (${board.id})`)}async function handleBoardExport(name,options){let bs=await getBoardService(),board=await resolveBoard(name,options.project),exported=await bs.exportBoard(board.id),json2=JSON.stringify(exported,null,2);if(options.output){let dir=dirname8(options.output);if(!existsSync38(dir))mkdirSync16(dir,{recursive:!0});writeFileSync18(options.output,`${json2}
|
|
3762
3771
|
`),console.log(`Exported board "${board.name}" to ${options.output}`)}else console.log(json2)}async function handleBoardReconcile(name,options){let{reconcileBoard:reconcileBoard2}=await Promise.resolve().then(() => (init_board_service(),exports_board_service)),board=await resolveBoard(name,options.project),result2=await reconcileBoard2(board.id);if(options.json){console.log(JSON.stringify(result2,null,2));return}if(result2.fixed===0&&result2.orphaned===0){console.log(`Board "${board.name}": all tasks have valid column_ids.`);return}if(console.log(`Board "${board.name}" reconciliation:`),console.log(` Fixed: ${result2.fixed} task${result2.fixed===1?"":"s"}`),result2.orphaned>0){let count=result2.orphaned;console.log(` Still orphaned: ${count} task${count===1?"":"s"} (stage doesn't match any column)`)}}async function handleBoardImport(options){let bs=await getBoardService(),projectId=await resolveProjectId(options.project),raw=readFileSync25(options.json,"utf-8"),data=JSON.parse(raw),board=await bs.importBoard(data,projectId);console.log(`Imported board "${board.name}" (${board.id}) with ${board.columns.length} columns`)}async function handleTemplateList(options){let templates=await(await getTemplateService()).listTemplates();if(options.json){console.log(JSON.stringify(templates,null,2));return}printTemplateTable(templates)}async function handleTemplateShow(name,options){let template=await(await getTemplateService()).getTemplate(name);if(!template)throw Error(`Template not found: ${name}`);if(options.json){console.log(JSON.stringify(template,null,2));return}if(console.log(`
|
|
3763
|
-
Template: ${template.name} (${template.id})`),template.description)console.log(`Description: ${template.description}`);if(template.icon)console.log(`Icon: ${template.icon}`);console.log(`Built-in: ${template.isBuiltin?"yes":"no"}`),printColumnPipeline(template.columns,`Pipeline (${template.columns.length} columns)`)}async function handleTemplateCreate(name,options){let tmpl=await getTemplateService();if(options.fromBoard){let board=await(await getBoardService()).getBoard(options.fromBoard);if(!board)throw Error(`Board not found: ${options.fromBoard}`);let template2=await tmpl.snapshotFromBoard(board.id,name);console.log(`Created template "${template2.name}" (${template2.id}) from board "${board.name}" with ${template2.columns.length} columns`);return}let columns;if(options.columns)columns=options.columns.split(",").map((colName,i2)=>({id:crypto.randomUUID(),name:colName.trim(),label:colName.trim(),gate:"human",action:null,auto_advance:!1,transitions:[],roles:["*"],color:"#94a3b8",parallel:!1,on_fail:null,position:i2}));let template=await tmpl.createTemplate({name,description:options.description,columns});console.log(`Created template "${template.name}" (${template.id}) with ${template.columns.length} columns`)}async function handleTemplateEdit(name,options){let tmpl=await getTemplateService(),template=await tmpl.getTemplate(name);if(!template)throw Error(`Template not found: ${name}`);if(!options.column)console.error("Error: --column is required for template edit."),process.exit(1);let updates={};if(options.gate)updates.gate=options.gate;if(options.action)updates.action=options.action;if(options.color)updates.color=options.color;if(options.rename)updates.name=options.rename,updates.label=options.rename;if(!await tmpl.updateTemplateColumn(template.id,options.column,updates))throw Error(`Failed to update template: ${name}`);console.log(`Updated column "${options.column}" on template "${template.name}".`)}async function handleTemplateRename(oldName,newName){let tmpl=await getTemplateService(),template=await tmpl.getTemplate(oldName);if(!template)throw Error(`Template not found: ${oldName}`);let updated=await tmpl.renameTemplate(template.id,newName);if(!updated)throw Error(`Failed to rename template: ${oldName}`);console.log(`Renamed template "${oldName}" to "${updated.name}".`)}async function handleTemplateDelete(name){let tmpl=await getTemplateService(),template=await tmpl.getTemplate(name);if(!template)throw Error(`Template not found: ${name}`);if(!await tmpl.deleteTemplate(template.id))throw Error(`Failed to delete template: ${name}`);console.log(`Deleted template "${template.name}" (${template.id}).`)}function registerBoardCommands(program2){let board=program2.command("board").description("Board and pipeline management");board.command("create <name>").description("Create a new board").option("--project <project>","Project name").option("--from <template>","Create from template name").option("--columns <columns>","Comma-separated column names").option("--description <text>","Board description").action(async(name,options)=>{try{await handleBoardCreate(name,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("list").description("List all boards").option("--project <project>","Filter by project").option("--all","Include archived boards").option("--json","Output as JSON").action(async(options)=>{try{await handleBoardList(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("show <name...>").description("Show board detail").option("--project <project>","Disambiguate by project").option("--json","Output as JSON").action(async(nameParts,options)=>{try{await handleBoardShow(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("edit <name...>").description("Edit board or column properties").option("--project <project>","Disambiguate by project").option("--column <col>","Column name to edit").option("--gate <gate>","New gate value (human|agent|human+agent)").option("--action <action>","New action skill").option("--color <color>","New color hex").option("--rename <new>","Rename the column").option("--name <new>","Rename the board itself").option("--description <text>","Update description").action(async(nameParts,options)=>{try{await handleBoardEdit(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("delete <name...>").description("Delete a board").option("--project <project>","Disambiguate by project").option("--force","Skip confirmation").action(async(nameParts,options)=>{try{await handleBoardDelete(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("columns <name...>").description("Show board column pipeline").option("--project <project>","Disambiguate by project").option("--json","Output as JSON").action(async(nameParts,options)=>{try{await handleBoardColumns(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("use <name...>").description("Set active board for current repo").option("--project <project>","Disambiguate by project").action(async(nameParts,options)=>{try{await handleBoardUse(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("export <name...>").description("Export board as JSON").option("--project <project>","Disambiguate by project").option("--output <file>","Write to file instead of stdout").option("--json","Output as JSON (default, accepted for consistency)").action(async(nameParts,options)=>{try{await handleBoardExport(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("reconcile <name...>").description("Fix orphaned column_ids by matching task stage to board columns").option("--project <project>","Disambiguate by project").option("--json","Output as JSON").action(async(nameParts,options)=>{try{await handleBoardReconcile(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("archive <name...>").description("Archive a board and its unfinished tasks").option("--project <project>","Disambiguate by project").action(async(nameParts,options)=>{try{let ts3=await getTaskService3(),board2=await resolveBoard(nameParts.join(" "),options.project);await ts3.archiveBoard(board2.id),console.log(`Archived board "${board2.name}" and its unfinished tasks.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("import").description("Import board from JSON file").requiredOption("--json <file>","JSON file to import").requiredOption("--project <project>","Target project").action(async(options)=>{try{await handleBoardImport(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}});let template=board.command("template").description("Board template management");template.command("list").description("List all board templates").option("--json","Output as JSON").action(async(options)=>{try{await handleTemplateList(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("show <name>").description("Show template detail with pipeline view").option("--json","Output as JSON").action(async(name,options)=>{try{await handleTemplateShow(name,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("create <name>").description("Create a board template").option("--from-board <board>","Create from existing board").option("--columns <columns>","Comma-separated column names").option("--description <text>","Template description").action(async(name,options)=>{try{await handleTemplateCreate(name,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("edit <name>").description("Edit a template column").option("--column <col>","Column name to edit").option("--gate <gate>","New gate value (human|agent|human+agent)").option("--action <action>","New action skill").option("--rename <new>","Rename the column").option("--color <color>","New color hex").action(async(name,options)=>{try{await handleTemplateEdit(name,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("rename <old> <new>").description("Rename a template").action(async(oldName,newName)=>{try{await handleTemplateRename(oldName,newName)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("delete <name>").description("Delete a template").action(async(name)=>{try{await handleTemplateDelete(name)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}import{execSync as execSync13}from"child_process";import{existsSync as existsSync39,mkdirSync as mkdirSync17,readFileSync as readFileSync26,realpathSync as realpathSync4,writeFileSync as writeFileSync19}from"fs";import{homedir as homedir31}from"os";import{dirname as dirname9,join as join46,resolve as resolve6}from"path";var BRAIN_PKG2="@khal-os/brain",BRAIN_REPO="khal-os/brain";function resolveGenieRoot(){try{let scriptDir=dirname9(realpathSync4(process.argv[1])),candidates=[resolve6(scriptDir,".."),resolve6(scriptDir,"..","..")];for(let c of candidates)if(existsSync39(join46(c,"package.json")))return c}catch{}return resolve6(import.meta.dir,"..","..")}var BRAIN_DIR2=join46(resolveGenieRoot(),"node_modules","@khal-os","brain"),CACHE_PATH=join46(homedir31(),".genie","brain-version-check.json");function compareVersions(a,b2){let partsA=a.split(".").map(Number),partsB=b2.split(".").map(Number);for(let i2=0;i2<Math.max(partsA.length,partsB.length);i2++){let diff=(partsA[i2]??0)-(partsB[i2]??0);if(diff!==0)return diff}return 0}function readLocalBrainVersion(){try{return JSON.parse(readFileSync26(join46(BRAIN_DIR2,"package.json"),"utf-8")).version??"unknown"}catch{return}}function resolveBrainBin(){let candidates=[join46(resolveGenieRoot(),"node_modules",".bin","brain"),join46(BRAIN_DIR2,"dist","cli.js")];for(let c of candidates)if(existsSync39(c))return c;return}function findBrainVault(){let candidates=[process.cwd(),join46(process.cwd(),"brain"),join46(homedir31(),"brain")];for(let dir of candidates)if(existsSync39(join46(dir,"brain.json")))return dir;return null}function readActiveBrainConfig(){try{let configPath2=join46(homedir31(),".brain","config.json");if(!existsSync39(configPath2))return null;let data=JSON.parse(readFileSync26(configPath2,"utf-8"));if(!data.pid)return null;return{pid:data.pid,pgPort:data.pgPort,brainPath:data.brainPath}}catch{return null}}function isProcessAlive2(pid){try{return process.kill(pid,0),!0}catch{return!1}}async function stopBrainDaemon(){let config=readActiveBrainConfig();if(!config?.pid||!isProcessAlive2(config.pid))return!1;let brainBin=resolveBrainBin(),brainPath=config.brainPath;if(brainBin)try{let pathArg=brainPath?` --brain-path "${brainPath}"`:"";execSync13(`"${brainBin}" serve stop${pathArg}`,{stdio:"pipe",timeout:1e4})}catch{}for(let i2=0;i2<25;i2++){if(!isProcessAlive2(config.pid))return!0;await new Promise((r)=>setTimeout(r,200))}try{process.kill(config.pid,"SIGKILL")}catch{}return!0}function startBrainDaemon(vaultPath,extraArgs){let bin=resolveBrainBin();if(!bin)return;try{let argsStr=extraArgs?.length?` ${extraArgs.join(" ")}`:"";execSync13(`"${bin}" serve --daemon --brain-path "${vaultPath}"${argsStr}`,{stdio:"inherit",timeout:15000}),console.log(" Brain daemon started.")}catch{console.log(" Daemon failed to start. Run: brain serve --daemon")}}function readSavedDaemonArgs(brainPath){try{let serverJsonPath=join46(brainPath,".brain-server.json");return JSON.parse(readFileSync26(serverJsonPath,"utf-8")).args}catch{return}}function checkForUpdates(cachePath){try{let p=cachePath??CACHE_PATH;if(!existsSync39(p))return{updateAvailable:!1};let cache=JSON.parse(readFileSync26(p,"utf-8"));if(cache.updateAvailable&&cache.latestVersion)return{updateAvailable:!0,latestVersion:cache.latestVersion};return{updateAvailable:!1}}catch{return{updateAvailable:!1}}}function refreshVersionCache(localVersion){try{let version=localVersion??readLocalBrainVersion();if(!version)return;let latestTag=execSync13(`gh release view --repo ${BRAIN_REPO} --json tagName -q .tagName`,{stdio:"pipe",encoding:"utf-8"}).trim(),latestVersion=latestTag.replace(/^v/,""),localCore=version.replace(/^\d+\./,""),latestCore=latestVersion.replace(/^\d+\./,""),updateAvailable=compareVersions(latestCore,localCore)>0,cacheDir=join46(homedir31(),".genie");mkdirSync17(cacheDir,{recursive:!0}),writeFileSync19(CACHE_PATH,JSON.stringify({checkedAt:new Date().toISOString(),localVersion:version,latestTag,latestVersion,updateAvailable},null,2))}catch{}}async function updateBrain(){if(!existsSync39(join46(BRAIN_DIR2,"package.json")))return console.log(" Brain is not installed. Run: genie brain install"),!1;let oldVersion=readLocalBrainVersion()??"unknown";console.log(" Checking for updates...");let tag;try{tag=execSync13(`gh release view --repo ${BRAIN_REPO} --json tagName -q .tagName`,{stdio:"pipe",encoding:"utf-8"}).trim()}catch{return console.error(" Failed to check latest release. Ensure: gh auth login"),!1}let newVersion=tag.replace(/^v/,"");if(compareVersions(newVersion,oldVersion)<=0)return console.log(` Already at latest version (${oldVersion}).`),!0;console.log(` Upgrading: ${oldVersion} \u2192 ${newVersion}`),console.log("");let activeConfig=readActiveBrainConfig(),savedArgs=activeConfig?.brainPath?readSavedDaemonArgs(activeConfig.brainPath):void 0,wasRunning=activeConfig?await stopBrainDaemon():!1,tmpDir=join46(homedir31(),".cache","genie-brain");mkdirSync17(tmpDir,{recursive:!0}),execSync13(`gh release download ${tag} --repo ${BRAIN_REPO} --pattern '*.tgz' --dir "${tmpDir}" --clobber`,{stdio:"inherit"}),execSync13(`rm -rf "${BRAIN_DIR2}"`,{stdio:"pipe"}),mkdirSync17(BRAIN_DIR2,{recursive:!0}),execSync13(`tar xzf "${tmpDir}/khal-os-brain-${newVersion}.tgz" -C "${BRAIN_DIR2}" --strip-components=1`,{stdio:"inherit"}),execSync13("bun install",{cwd:BRAIN_DIR2,stdio:"inherit"}),console.log(`
|
|
3764
|
-
Updated: ${oldVersion} \u2192 ${newVersion}`);try{let migrateScript=`const b = require('${BRAIN_PKG2}'); if (b.runAllMigrations) b.runAllMigrations().then(() => process.exit(0)).catch((e) => { console.error(e); process.exit(1); }); else process.exit(0);`;
|
|
3765
|
-
`)[0]}). Run manually: brain install --apply --yes`)}}async function uninstallBrain(){try{if(!existsSync39(BRAIN_DIR2)){console.log(" Brain is not installed.");return}await stopBrainDaemon(),
|
|
3772
|
+
Template: ${template.name} (${template.id})`),template.description)console.log(`Description: ${template.description}`);if(template.icon)console.log(`Icon: ${template.icon}`);console.log(`Built-in: ${template.isBuiltin?"yes":"no"}`),printColumnPipeline(template.columns,`Pipeline (${template.columns.length} columns)`)}async function handleTemplateCreate(name,options){let tmpl=await getTemplateService();if(options.fromBoard){let board=await(await getBoardService()).getBoard(options.fromBoard);if(!board)throw Error(`Board not found: ${options.fromBoard}`);let template2=await tmpl.snapshotFromBoard(board.id,name);console.log(`Created template "${template2.name}" (${template2.id}) from board "${board.name}" with ${template2.columns.length} columns`);return}let columns;if(options.columns)columns=options.columns.split(",").map((colName,i2)=>({id:crypto.randomUUID(),name:colName.trim(),label:colName.trim(),gate:"human",action:null,auto_advance:!1,transitions:[],roles:["*"],color:"#94a3b8",parallel:!1,on_fail:null,position:i2}));let template=await tmpl.createTemplate({name,description:options.description,columns});console.log(`Created template "${template.name}" (${template.id}) with ${template.columns.length} columns`)}async function handleTemplateEdit(name,options){let tmpl=await getTemplateService(),template=await tmpl.getTemplate(name);if(!template)throw Error(`Template not found: ${name}`);if(!options.column)console.error("Error: --column is required for template edit."),process.exit(1);let updates={};if(options.gate)updates.gate=options.gate;if(options.action)updates.action=options.action;if(options.color)updates.color=options.color;if(options.rename)updates.name=options.rename,updates.label=options.rename;if(!await tmpl.updateTemplateColumn(template.id,options.column,updates))throw Error(`Failed to update template: ${name}`);console.log(`Updated column "${options.column}" on template "${template.name}".`)}async function handleTemplateRename(oldName,newName){let tmpl=await getTemplateService(),template=await tmpl.getTemplate(oldName);if(!template)throw Error(`Template not found: ${oldName}`);let updated=await tmpl.renameTemplate(template.id,newName);if(!updated)throw Error(`Failed to rename template: ${oldName}`);console.log(`Renamed template "${oldName}" to "${updated.name}".`)}async function handleTemplateDelete(name){let tmpl=await getTemplateService(),template=await tmpl.getTemplate(name);if(!template)throw Error(`Template not found: ${name}`);if(!await tmpl.deleteTemplate(template.id))throw Error(`Failed to delete template: ${name}`);console.log(`Deleted template "${template.name}" (${template.id}).`)}function registerBoardCommands(program2){let board=program2.command("board").description("Board and pipeline management");board.command("create <name>").description("Create a new board").option("--project <project>","Project name").option("--from <template>","Create from template name").option("--columns <columns>","Comma-separated column names").option("--description <text>","Board description").action(async(name,options)=>{try{await handleBoardCreate(name,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("list").description("List all boards").option("--project <project>","Filter by project").option("--all","Include archived boards").option("--json","Output as JSON").action(async(options)=>{try{await handleBoardList(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("show <name...>").description("Show board detail").option("--project <project>","Disambiguate by project").option("--json","Output as JSON").action(async(nameParts,options)=>{try{await handleBoardShow(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("edit <name...>").description("Edit board or column properties").option("--project <project>","Disambiguate by project").option("--column <col>","Column name to edit").option("--gate <gate>","New gate value (human|agent|human+agent)").option("--action <action>","New action skill").option("--color <color>","New color hex").option("--rename <new>","Rename the column").option("--name <new>","Rename the board itself").option("--description <text>","Update description").action(async(nameParts,options)=>{try{await handleBoardEdit(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("delete <name...>").description("Delete a board").option("--project <project>","Disambiguate by project").option("--force","Skip confirmation").action(async(nameParts,options)=>{try{await handleBoardDelete(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("columns <name...>").description("Show board column pipeline").option("--project <project>","Disambiguate by project").option("--json","Output as JSON").action(async(nameParts,options)=>{try{await handleBoardColumns(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("use <name...>").description("Set active board for current repo").option("--project <project>","Disambiguate by project").action(async(nameParts,options)=>{try{await handleBoardUse(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("export <name...>").description("Export board as JSON").option("--project <project>","Disambiguate by project").option("--output <file>","Write to file instead of stdout").option("--json","Output as JSON (default, accepted for consistency)").action(async(nameParts,options)=>{try{await handleBoardExport(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("reconcile <name...>").description("Fix orphaned column_ids by matching task stage to board columns").option("--project <project>","Disambiguate by project").option("--json","Output as JSON").action(async(nameParts,options)=>{try{await handleBoardReconcile(nameParts.join(" "),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("archive <name...>").description("Archive a board and its unfinished tasks").option("--project <project>","Disambiguate by project").action(async(nameParts,options)=>{try{let ts3=await getTaskService3(),board2=await resolveBoard(nameParts.join(" "),options.project);await ts3.archiveBoard(board2.id),console.log(`Archived board "${board2.name}" and its unfinished tasks.`)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),board.command("import").description("Import board from JSON file").requiredOption("--json <file>","JSON file to import").requiredOption("--project <project>","Target project").action(async(options)=>{try{await handleBoardImport(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}});let template=board.command("template").description("Board template management");template.command("list").description("List all board templates").option("--json","Output as JSON").action(async(options)=>{try{await handleTemplateList(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("show <name>").description("Show template detail with pipeline view").option("--json","Output as JSON").action(async(name,options)=>{try{await handleTemplateShow(name,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("create <name>").description("Create a board template").option("--from-board <board>","Create from existing board").option("--columns <columns>","Comma-separated column names").option("--description <text>","Template description").action(async(name,options)=>{try{await handleTemplateCreate(name,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("edit <name>").description("Edit a template column").option("--column <col>","Column name to edit").option("--gate <gate>","New gate value (human|agent|human+agent)").option("--action <action>","New action skill").option("--rename <new>","Rename the column").option("--color <color>","New color hex").action(async(name,options)=>{try{await handleTemplateEdit(name,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("rename <old> <new>").description("Rename a template").action(async(oldName,newName)=>{try{await handleTemplateRename(oldName,newName)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),template.command("delete <name>").description("Delete a template").action(async(name)=>{try{await handleTemplateDelete(name)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}import{execSync as execSync12}from"child_process";import{existsSync as existsSync39,mkdirSync as mkdirSync17,readFileSync as readFileSync26,realpathSync as realpathSync4,writeFileSync as writeFileSync19}from"fs";import{homedir as homedir31}from"os";import{dirname as dirname9,join as join46,resolve as resolve6}from"path";var BRAIN_PKG2="@khal-os/brain",BRAIN_REPO="khal-os/brain";function resolveGenieRoot(){try{let scriptDir=dirname9(realpathSync4(process.argv[1])),candidates=[resolve6(scriptDir,".."),resolve6(scriptDir,"..","..")];for(let c of candidates)if(existsSync39(join46(c,"package.json")))return c}catch{}return resolve6(import.meta.dir,"..","..")}var BRAIN_DIR2=join46(resolveGenieRoot(),"node_modules","@khal-os","brain"),CACHE_PATH=join46(homedir31(),".genie","brain-version-check.json");function compareVersions(a,b2){let partsA=a.split(".").map(Number),partsB=b2.split(".").map(Number);for(let i2=0;i2<Math.max(partsA.length,partsB.length);i2++){let diff=(partsA[i2]??0)-(partsB[i2]??0);if(diff!==0)return diff}return 0}function readLocalBrainVersion(){try{return JSON.parse(readFileSync26(join46(BRAIN_DIR2,"package.json"),"utf-8")).version??"unknown"}catch{return}}function resolveBrainBin(){let candidates=[join46(resolveGenieRoot(),"node_modules",".bin","brain"),join46(BRAIN_DIR2,"dist","cli.js")];for(let c of candidates)if(existsSync39(c))return c;return}function findBrainVault(){let candidates=[process.cwd(),join46(process.cwd(),"brain"),join46(homedir31(),"brain")];for(let dir of candidates)if(existsSync39(join46(dir,"brain.json")))return dir;return null}function readActiveBrainConfig(){try{let configPath2=join46(homedir31(),".brain","config.json");if(!existsSync39(configPath2))return null;let data=JSON.parse(readFileSync26(configPath2,"utf-8"));if(!data.pid)return null;return{pid:data.pid,pgPort:data.pgPort,brainPath:data.brainPath}}catch{return null}}function isProcessAlive2(pid){try{return process.kill(pid,0),!0}catch{return!1}}async function stopBrainDaemon(){let config=readActiveBrainConfig();if(!config?.pid||!isProcessAlive2(config.pid))return!1;let brainBin=resolveBrainBin(),brainPath=config.brainPath;if(brainBin)try{let pathArg=brainPath?` --brain-path "${brainPath}"`:"";execSync12(`"${brainBin}" serve stop${pathArg}`,{stdio:"pipe",timeout:1e4})}catch{}for(let i2=0;i2<25;i2++){if(!isProcessAlive2(config.pid))return!0;await new Promise((r)=>setTimeout(r,200))}try{process.kill(config.pid,"SIGKILL")}catch{}return!0}function startBrainDaemon(vaultPath,extraArgs){let bin=resolveBrainBin();if(!bin)return;try{let argsStr=extraArgs?.length?` ${extraArgs.join(" ")}`:"";execSync12(`"${bin}" serve --daemon --brain-path "${vaultPath}"${argsStr}`,{stdio:"inherit",timeout:15000}),console.log(" Brain daemon started.")}catch{console.log(" Daemon failed to start. Run: brain serve --daemon")}}function readSavedDaemonArgs(brainPath){try{let serverJsonPath=join46(brainPath,".brain-server.json");return JSON.parse(readFileSync26(serverJsonPath,"utf-8")).args}catch{return}}function checkForUpdates(cachePath){try{let p=cachePath??CACHE_PATH;if(!existsSync39(p))return{updateAvailable:!1};let cache=JSON.parse(readFileSync26(p,"utf-8"));if(cache.updateAvailable&&cache.latestVersion)return{updateAvailable:!0,latestVersion:cache.latestVersion};return{updateAvailable:!1}}catch{return{updateAvailable:!1}}}function refreshVersionCache(localVersion){try{let version=localVersion??readLocalBrainVersion();if(!version)return;let latestTag=execSync12(`gh release view --repo ${BRAIN_REPO} --json tagName -q .tagName`,{stdio:"pipe",encoding:"utf-8"}).trim(),latestVersion=latestTag.replace(/^v/,""),localCore=version.replace(/^\d+\./,""),latestCore=latestVersion.replace(/^\d+\./,""),updateAvailable=compareVersions(latestCore,localCore)>0,cacheDir=join46(homedir31(),".genie");mkdirSync17(cacheDir,{recursive:!0}),writeFileSync19(CACHE_PATH,JSON.stringify({checkedAt:new Date().toISOString(),localVersion:version,latestTag,latestVersion,updateAvailable},null,2))}catch{}}async function updateBrain(){if(!existsSync39(join46(BRAIN_DIR2,"package.json")))return console.log(" Brain is not installed. Run: genie brain install"),!1;let oldVersion=readLocalBrainVersion()??"unknown";console.log(" Checking for updates...");let tag;try{tag=execSync12(`gh release view --repo ${BRAIN_REPO} --json tagName -q .tagName`,{stdio:"pipe",encoding:"utf-8"}).trim()}catch{return console.error(" Failed to check latest release. Ensure: gh auth login"),!1}let newVersion=tag.replace(/^v/,"");if(compareVersions(newVersion,oldVersion)<=0)return console.log(` Already at latest version (${oldVersion}).`),!0;console.log(` Upgrading: ${oldVersion} \u2192 ${newVersion}`),console.log("");let activeConfig=readActiveBrainConfig(),savedArgs=activeConfig?.brainPath?readSavedDaemonArgs(activeConfig.brainPath):void 0,wasRunning=activeConfig?await stopBrainDaemon():!1,tmpDir=join46(homedir31(),".cache","genie-brain");mkdirSync17(tmpDir,{recursive:!0}),execSync12(`gh release download ${tag} --repo ${BRAIN_REPO} --pattern '*.tgz' --dir "${tmpDir}" --clobber`,{stdio:"inherit"}),execSync12(`rm -rf "${BRAIN_DIR2}"`,{stdio:"pipe"}),mkdirSync17(BRAIN_DIR2,{recursive:!0}),execSync12(`tar xzf "${tmpDir}/khal-os-brain-${newVersion}.tgz" -C "${BRAIN_DIR2}" --strip-components=1`,{stdio:"inherit"}),execSync12("bun install",{cwd:BRAIN_DIR2,stdio:"inherit"}),console.log(`
|
|
3773
|
+
Updated: ${oldVersion} \u2192 ${newVersion}`);try{let migrateScript=`const b = require('${BRAIN_PKG2}'); if (b.runAllMigrations) b.runAllMigrations().then(() => process.exit(0)).catch((e) => { console.error(e); process.exit(1); }); else process.exit(0);`;execSync12(`bun -e "${migrateScript}"`,{cwd:BRAIN_DIR2,stdio:"inherit"}),console.log(" Migrations applied.")}catch{console.log(" Migration skipped. Run: genie brain migrate")}if(refreshVersionCache(newVersion),wasRunning&&activeConfig?.brainPath)startBrainDaemon(activeConfig.brainPath,savedArgs);return!0}async function showVersion(){let localVersion="not installed";try{let brain=await import(BRAIN_PKG2);localVersion=brain.getVersion?.()??brain.VERSION??"unknown"}catch(err){let msg=err instanceof Error?err.message:String(err);if(isModuleNotFound(msg)){console.log(" Brain is not installed. Run: genie brain install");return}}console.log(` Local: ${localVersion}`),refreshVersionCache(localVersion);let check2=checkForUpdates();if(check2.updateAvailable&&check2.latestVersion)console.log(` Latest: ${check2.latestVersion}`),console.log(""),console.log(" Update available. Run: genie brain upgrade");else console.log(" Status: up to date")}async function installBrain(){let{loadGenieConfigSync:loadGenieConfigSync2}=await Promise.resolve().then(() => (init_genie_config2(),exports_genie_config));if(!loadGenieConfigSync2().brain.embedded)return console.log(""),console.log(" Brain is configured as external (brain.embedded=false)."),console.log(" Genie will not install brain into its node_modules."),console.log(""),console.log(" Install brain standalone instead:"),console.log(" bun install -g @khal-os/brain@next # dev channel"),console.log(" bun install -g @khal-os/brain # stable channel"),console.log(""),console.log(" Then run your own brain serve:"),console.log(" brain serve --brain-path <path> [--port <port>]"),console.log(""),console.log(" To re-enable embedded management, remove brain.embedded from"),console.log(" ~/.genie/config.json (or set it to true)."),console.log(""),!0;console.log(""),console.log(" Installing brain from GitHub release (enterprise)..."),console.log(""),console.log(" Source: https://github.com/khal-os/brain"),console.log(" Requires: GitHub org membership (khal-os)"),console.log("");try{try{execSync12("gh auth token",{stdio:"pipe"})}catch{return console.error(" GitHub CLI not authenticated. Run: gh auth login"),!1}let tag=execSync12(`gh release view --repo ${BRAIN_REPO} --json tagName -q .tagName`,{stdio:"pipe",encoding:"utf-8"}).trim(),version=tag.replace(/^v/,"");console.log(` Latest release: ${tag}`),console.log("");let root=resolveGenieRoot(),brainDir=join46(root,"node_modules","@khal-os","brain"),tmpDir=join46(homedir31(),".cache","genie-brain");mkdirSync17(tmpDir,{recursive:!0}),execSync12(`gh release download ${tag} --repo ${BRAIN_REPO} --pattern '*.tgz' --dir "${tmpDir}" --clobber`,{stdio:"inherit"}),execSync12(`rm -rf "${brainDir}"`,{stdio:"pipe"}),mkdirSync17(brainDir,{recursive:!0}),execSync12(`tar xzf "${tmpDir}/khal-os-brain-${version}.tgz" -C "${brainDir}" --strip-components=1`,{stdio:"inherit"}),execSync12("bun install",{cwd:brainDir,stdio:"inherit"}),console.log(""),console.log(` Brain ${version} installed from GitHub release.`),console.log("");try{let brain=await import(BRAIN_PKG2);if(brain.runAllMigrations)console.log(" Running brain migrations..."),await brain.runAllMigrations(),console.log(" Brain tables created in Postgres.")}catch{console.log(" Auto-migration skipped. Run: genie brain migrate")}await runBrainInstallWizard();let vaultPath=findBrainVault();if(vaultPath)startBrainDaemon(vaultPath);else console.log(" No brain vault found. Create one with: brain init --name <name> --path <path>");return console.log(""),console.log(" Get started:"),console.log(" genie brain init --name my-brain --path ./brain"),console.log(""),!0}catch(err){let msg=err instanceof Error?err.message:String(err);if(msg.includes("Authentication")||msg.includes("permission")||msg.includes("404"))console.error(" Access denied. Brain is enterprise-only."),console.log(""),console.log(" You need:"),console.log(" 1. Membership in the khal-os GitHub org"),console.log(" 2. GitHub CLI authenticated: gh auth login"),console.log(""),console.log(" Manual install:"),console.log(` gh release download --repo ${BRAIN_REPO} --pattern '*.tgz'`),console.log(" tar xzf khal-os-brain-*.tgz -C node_modules/@khal-os/brain --strip-components=1"),console.log("");else console.error(` Install failed: ${msg}`),console.log(""),console.log(" Manual install:"),console.log(` gh release download --repo ${BRAIN_REPO} --pattern '*.tgz'`),console.log(" tar xzf khal-os-brain-*.tgz -C node_modules/@khal-os/brain --strip-components=1"),console.log("");return!1}}async function runBrainInstallWizard(){try{let brain=await import(BRAIN_PKG2);if(brain.execute)console.log(""),console.log(" Running brain install wizard (rlmx + smoke test)..."),await brain.execute(["install","--apply","--yes"])}catch(err){let msg=err instanceof Error?err.message:String(err);console.log(` Install wizard skipped (${msg.split(`
|
|
3774
|
+
`)[0]}). Run manually: brain install --apply --yes`)}}async function uninstallBrain(){try{if(!existsSync39(BRAIN_DIR2)){console.log(" Brain is not installed.");return}await stopBrainDaemon(),execSync12(`rm -rf "${BRAIN_DIR2}"`,{stdio:"pipe"}),console.log(" Brain uninstalled.")}catch{console.error(` Uninstall failed. Manual: rm -rf ${BRAIN_DIR2}`)}}function isModuleNotFound(msg){return msg.includes("Cannot find")||msg.includes("not found")||msg.includes("MODULE_NOT_FOUND")}function printNotInstalledMessage(){console.log(""),console.log(" Brain is an enterprise knowledge graph engine."),console.log(" It is not installed."),console.log(""),console.log(" Quick install:"),console.log(""),console.log(" genie brain install"),console.log(""),console.log(" Requires GitHub org membership (khal-os)."),console.log("")}async function executeBrainCommand(args){try{let brain=await import(BRAIN_PKG2);if(brain.execute){await brain.execute(args);let check2=checkForUpdates();if(check2.updateAvailable&&check2.latestVersion)console.log(`
|
|
3766
3775
|
Update available (${check2.latestVersion}). Run: genie brain upgrade`)}else console.error("Brain module loaded but execute() not found."),console.error("Update: genie brain install")}catch(err){let msg=err instanceof Error?err.message:String(err);if(isModuleNotFound(msg))printNotInstalledMessage();else console.error(`Brain error: ${msg}`)}}function registerBrainCommands(program2){let brain=program2.command("brain").description("Knowledge graph engine (enterprise) \u2014 forwards unknown subcommands to @khal-os/brain").allowUnknownOption().allowExcessArguments().action(async(_options,cmd)=>{let args=cmd.args;if(args.length===0){brain.help();return}await executeBrainCommand(args)}).addHelpText("after",`
|
|
3767
3776
|
Forwarded commands (require @khal-os/brain installed):
|
|
3768
3777
|
status Show running brain server status
|
|
@@ -3801,8 +3810,8 @@ SyslogIdentifier=genie-scheduler
|
|
|
3801
3810
|
|
|
3802
3811
|
[Install]
|
|
3803
3812
|
WantedBy=default.target
|
|
3804
|
-
`}async function daemonInstallCommand(){let unitContent=generateSystemdUnit(),unitPath=systemdUnitPath();mkdirSync18(systemdDir(),{recursive:!0}),writeFileSync20(unitPath,unitContent,"utf-8"),console.log(`Wrote systemd unit: ${unitPath}`);let{spawnSync:
|
|
3805
|
-
Note: systemctl daemon-reload failed (systemd may not be available).`),stderr)console.log(` ${stderr}`);console.log("You can still run manually: genie serve --headless --foreground");return}let enableResult=
|
|
3813
|
+
`}async function daemonInstallCommand(){let unitContent=generateSystemdUnit(),unitPath=systemdUnitPath();mkdirSync18(systemdDir(),{recursive:!0}),writeFileSync20(unitPath,unitContent,"utf-8"),console.log(`Wrote systemd unit: ${unitPath}`);let{spawnSync:spawnSync6}=await import("child_process"),reloadResult=spawnSync6("systemctl",["--user","daemon-reload"],{stdio:["ignore","pipe","pipe"]});if(reloadResult.status!==0){let stderr=reloadResult.stderr?.toString().trim();if(console.log(`
|
|
3814
|
+
Note: systemctl daemon-reload failed (systemd may not be available).`),stderr)console.log(` ${stderr}`);console.log("You can still run manually: genie serve --headless --foreground");return}let enableResult=spawnSync6("systemctl",["--user","enable","genie-scheduler.service"],{stdio:["ignore","pipe","pipe"]});if(enableResult.status===0)console.log("Enabled genie-scheduler.service"),console.log(`
|
|
3806
3815
|
To start: systemctl --user start genie-scheduler`),console.log("Or: genie serve --headless");else{let stderr=enableResult.stderr?.toString().trim();if(console.log(`
|
|
3807
3816
|
Note: systemctl enable failed.`),stderr)console.log(` ${stderr}`);console.log("You can start manually: genie serve --headless")}}async function daemonStartCommand(options){console.log("Note: `genie daemon start` now redirects to `genie serve --headless`."),console.log(" Use `genie serve --headless` directly in the future.\n");let{spawn:spawnChild}=await import("child_process"),bunPath=process.execPath??"bun",genieBin=process.argv[1]??"genie";if(options.foreground)spawnChild(bunPath,[genieBin,"serve","start","--headless","--foreground"],{stdio:"inherit",env:{...process.env}}).on("exit",(code)=>process.exit(code??0)),await new Promise(()=>{});else spawnChild(bunPath,[genieBin,"serve","start","--headless","--daemon"],{stdio:"inherit",env:{...process.env}}).on("exit",(code)=>process.exit(code??0))}async function daemonStopCommand(){let pid=readServePid2(),source="serve";if(!pid)pid=readPid(),source="scheduler";if(!pid){console.log("No serve or scheduler PID file found. Nothing is running.");return}if(!isProcessAlive3(pid)){console.log(`Stale PID file (${source}, PID ${pid} is not running). Cleaning up.`),removeServePid2(),removePid();return}console.log(`Stopping genie serve (PID ${pid})...`),process.kill(pid,"SIGTERM");let deadline=Date.now()+1e4;while(Date.now()<deadline&&isProcessAlive3(pid))await new Promise((resolve7)=>setTimeout(resolve7,250));if(isProcessAlive3(pid)){console.log("Did not stop within 10s. Sending SIGKILL.");try{process.kill(pid,"SIGKILL")}catch{}}removeServePid2(),removePid(),console.log("Genie serve stopped.")}function getProcessUptime(pid){try{let procStat=readFileSync27(`/proc/${pid}/stat`,"utf-8"),bootTimeJiffies=Number.parseInt(procStat.split(" ")[21],10);if(Number.isNaN(bootTimeJiffies))return null;let uptimeSec=readFileSync27("/proc/uptime","utf-8"),processUptimeS=Number.parseFloat(uptimeSec.split(" ")[0])-bootTimeJiffies/100;return processUptimeS>0?formatUptime(processUptimeS*1000):null}catch{return null}}async function printDaemonStats(){try{let{getConnection:getConnection2,shutdown:shutdown3}=await Promise.resolve().then(() => (init_db(),exports_db)),sql=await getConnection2(),firedResult=await sql`
|
|
3808
3817
|
SELECT count(*)::int AS cnt FROM triggers WHERE status IN ('executing', 'completed')
|
|
@@ -3821,7 +3830,7 @@ Genie Scheduler Daemon`),console.log("\u2500".repeat(50)),console.log(` Status:
|
|
|
3821
3830
|
(showing last ${lines} of ${allLines.length} entries)`)}async function tailFollow(filePath,initialLines){let{watch:watch2}=await import("fs");tailStatic(filePath,initialLines),console.log(`
|
|
3822
3831
|
--- following (Ctrl+C to exit) ---
|
|
3823
3832
|
`);let lastSize=existsSync40(filePath)?readFileSync27(filePath).length:0,watcher2=watch2(filePath,()=>{try{let content=readFileSync27(filePath,"utf-8");if(content.length>lastSize){let newLines=content.slice(lastSize).trim().split(`
|
|
3824
|
-
`).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{createInterface as createInterface3}from"readline";init_db();init_wish_state();import{spawnSync as
|
|
3833
|
+
`).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{createInterface as createInterface3}from"readline";init_db();init_wish_state();import{spawnSync as spawnSync6}from"child_process";import{existsSync as existsSync41,mkdirSync as mkdirSync19,readFileSync as readFileSync28,renameSync as renameSync4,statSync as statSync5,writeFileSync as writeFileSync21}from"fs";import{homedir as homedir33}from"os";import{basename as basename8,join as join48,relative,resolve as resolve7}from"path";import{gunzipSync,gzipSync}from"zlib";var DB_NAME2="genie",DB_USER="postgres",DB_HOST="127.0.0.1",SNAPSHOT_FILE="snapshot.sql.gz";function getSnapshotPath(cwd){let repoRoot=resolveRepoPath(cwd),genieHome6=process.env.GENIE_HOME??join48(homedir33(),".genie");return join48(genieHome6,"backups",basename8(repoRoot),SNAPSHOT_FILE)}function assertOutsideRepo(snapshotPath,cwd){let repoRoot=resolveRepoPath(cwd),rel=relative(repoRoot,resolve7(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(port){return{...process.env,PGHOST:DB_HOST,PGPORT:String(port),PGUSER:DB_USER,PGPASSWORD:DB_USER,PGDATABASE:DB_NAME2}}function backup(cwd){let port=getActivePort(),snapshotPath=getSnapshotPath(cwd);assertOutsideRepo(snapshotPath,cwd);let snapshotDir=snapshotPath.slice(0,snapshotPath.lastIndexOf("/")),tmpPath=`${snapshotPath}.tmp`;mkdirSync19(snapshotDir,{recursive:!0});let result2=spawnSync6("pg_dump",["--no-owner","--no-acl"],{env:pgEnv(port),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);writeFileSync21(tmpPath,compressed),renameSync4(tmpPath,snapshotPath);let compressedBytes=statSync5(snapshotPath).size,uncompressedBytes=0;try{let sizeResult=spawnSync6("psql",["-t","-A","-c","SELECT pg_database_size(current_database())"],{env:pgEnv(port),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 port=getActivePort(),filePath=snapshotFile??getSnapshotPath(cwd);if(!existsSync41(filePath))throw Error(`Snapshot not found: ${filePath}`);let env=pgEnv(port),adminEnv={...env,PGDATABASE:"postgres"};spawnSync6("psql",["-v",`target_db=${DB_NAME2}`,"-c","SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = :'target_db' AND pid <> pg_backend_pid()"],{env:adminEnv,stdio:["pipe","pipe","pipe"],timeout:1e4});let dropResult=spawnSync6("psql",["-v",`target_db=${DB_NAME2}`,"-c",'DROP DATABASE IF EXISTS :"target_db"'],{env:adminEnv,stdio:["pipe","pipe","pipe"],timeout:1e4});if(dropResult.status!==0)throw Error(`Failed to drop database: ${dropResult.stderr?.toString().trim()}`);let createResult=spawnSync6("psql",["-v",`target_db=${DB_NAME2}`,"-c",'CREATE DATABASE :"target_db"'],{env:adminEnv,stdio:["pipe","pipe","pipe"],timeout:1e4});if(createResult.status!==0)throw Error(`Failed to create database: ${createResult.stderr?.toString().trim()}`);let compressed=readFileSync28(filePath),sql=gunzipSync(compressed),restoreResult=spawnSync6("psql",[],{env:{...env,PGDATABASE:DB_NAME2},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 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"})`)}async function dbStatusCommand(){let port=getActivePort(),dataDir=getDataDir();if(console.log(`
|
|
3825
3834
|
Genie Database Status`),console.log("\u2500".repeat(50)),console.log(` Port: ${port}`),console.log(" Host: 127.0.0.1"),console.log(` Data dir: ${dataDir}`),!await isAvailable()){console.log(" Status: stopped"),console.log(`
|
|
3826
3835
|
pgserve is not running. It will auto-start on first use.`),console.log("");return}console.log(" Status: running");try{let sql=await getConnection(),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(`
|
|
3827
3836
|
Migrations: ${migrations.applied.length} applied, ${migrations.pending.length} pending`);let tables=await sql`
|
|
@@ -3858,7 +3867,7 @@ coverage
|
|
|
3858
3867
|
`)}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(`
|
|
3859
3868
|
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:"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=join57(workspaceRoot,".genie","workspace.json");try{let raw=readFileSync32(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),writeFileSync23(configPath2,`${JSON.stringify(config,null,2)}
|
|
3860
3869
|
`,"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 existsSync51,mkdirSync as mkdirSync22,readFileSync as readFileSync33,writeFileSync as writeFileSync24}from"fs";import{join as join58}from"path";function pendingPath(workspaceRoot){return join58(workspaceRoot,".genie","pending-agents.json")}function loadPending(workspaceRoot){let filePath=pendingPath(workspaceRoot);if(!existsSync51(filePath))return{agents:[]};try{let raw=readFileSync33(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);mkdirSync22(join58(workspaceRoot,".genie"),{recursive:!0}),writeFileSync24(filePath,`${JSON.stringify(store,null,2)}
|
|
3861
|
-
`,"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:
|
|
3870
|
+
`,"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:execSync16}=__require("child_process"),match=execSync16("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??join59(workspaceRoot,"agents"),agentDir=join59(baseDir,name);if(existsSync52(agentDir))throw Error(`Agent directory already exists: ${agentDir}`);mkdirSync23(agentDir,{recursive:!0}),mkdirSync23(join59(agentDir,"brain","memory"),{recursive:!0}),mkdirSync23(join59(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"};writeFileSync25(join59(agentDir,".claude","settings.local.json"),`${JSON.stringify(settings,null,2)}
|
|
3862
3871
|
`),writeFileSync25(join59(agentDir,"brain","memory","MEMORY.md"),`# Memory Index
|
|
3863
3872
|
|
|
3864
3873
|
_This file is maintained by the auto-memory system. New memories are added automatically._
|
|
@@ -4094,7 +4103,7 @@ History for "${schedule.name}":
|
|
|
4094
4103
|
LIMIT ${limit}
|
|
4095
4104
|
`;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(`
|
|
4096
4105
|
(${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_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(`
|
|
4097
|
-
${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)","#9ca3af").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:
|
|
4106
|
+
${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)","#9ca3af").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:execSync17}=await import("child_process"),repoRoot=execSync17("git rev-parse --show-toplevel",{encoding:"utf-8"}).trim(),{join:join63}=await import("path"),configPath2=join63(repoRoot,".genie","config.json"),{existsSync:existsSync53,readFileSync:readFileSync34}=await import("fs");if(existsSync53(configPath2)){let config=JSON.parse(readFileSync34(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}
|
|
4098
4107
|
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(`
|
|
4099
4108
|
${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(`
|
|
4100
4109
|
Actors:`);for(let a of actors)console.log(` ${a.role}: ${a.actorId} (${a.actorType})`)}let tags=await ts3.getTaskTags(task.id,task.repoPath);if(tags.length>0)console.log(`
|
|
@@ -4177,10 +4186,10 @@ Stage Pipeline:`);let stages=t.stages;for(let i2=0;i2<stages.length;i2++){let s2
|
|
|
4177
4186
|
No fixable violations to apply.`);process.exit(report.summary.total>0?1:0)}if(options.dryRun){if(options.json)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(`
|
|
4178
4187
|
--- Dry-run diff (${wishPath}) ---`),console.log(renderDiff(markdown,fixed)),console.log(`
|
|
4179
4188
|
File not modified (--dry-run).`);process.exit(report.summary.total>0?1:0)}await writeFile9(wishPath,fixed,"utf-8");let docOrError2;try{docOrError2=parseWish(fixed)}catch(err){if(err instanceof WishParseError)docOrError2=err;else throw err}let report2=lintWish(docOrError2,fixed,lintOpts);report2={...report2,wish:slug,file:wishPath};let fixedCount=report.summary.fixable;if(options.json)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)}if(options.json)console.log(JSON.stringify(report));else console.log(formatLintReport(report,{color:process.stdout.isTTY??!1,path:wishPath}));let errors3=report.violations.filter((v)=>v.severity==="error").length;process.exit(errors3>0?1:0)}async function wishParseCommand(slug,options){try{let doc=parseWishFile(slug),json2=options.json?JSON.stringify(doc):JSON.stringify(doc,null,2);console.log(json2)}catch(error2){if(error2 instanceof WishParseError){let payload={error:error2.message,rule:error2.rule,line:error2.line,column:error2.column??null,file:error2.file??null};if(options.json)console.log(JSON.stringify(payload));else{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}`)}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 stat6(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=join64(process.cwd(),".genie","wishes");if(!existsSync54(wishesRoot))console.error(`\u274C Wishes directory not found: ${wishesRoot}`),process.exit(1);let entries=await readdir7(wishesRoot),rows=[];for(let entry2 of entries.sort()){if(entry2.startsWith("_")||entry2.startsWith("."))continue;if(!await isWishFile(join64(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.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
|
|
4180
|
-
`)}});async function startNamedSession(name){let{buildTeamLeadCommand:buildTeamLeadCommand2,sessionExists:sessionExists2}=await Promise.resolve().then(() => (init_team_lead_command(),exports_team_lead_command)),{getAgentsFilePath:getAgentsFilePath2}=await Promise.resolve().then(() => (init_session(),exports_session)),systemPromptFile=getAgentsFilePath2(),hasPriorSession=sessionExists2(name),cmd=buildTeamLeadCommand2(name,{systemPromptFile:systemPromptFile??void 0,continueName:hasPriorSession?name:void 0});console.log(hasPriorSession?`Resuming session: ${name}`:`Starting new session: ${name}`);let{spawnSync:
|
|
4189
|
+
`)}});async function startNamedSession(name){let{buildTeamLeadCommand:buildTeamLeadCommand2,sessionExists:sessionExists2}=await Promise.resolve().then(() => (init_team_lead_command(),exports_team_lead_command)),{getAgentsFilePath:getAgentsFilePath2}=await Promise.resolve().then(() => (init_session(),exports_session)),systemPromptFile=getAgentsFilePath2(),hasPriorSession=sessionExists2(name),cmd=buildTeamLeadCommand2(name,{systemPromptFile:systemPromptFile??void 0,continueName:hasPriorSession?name:void 0});console.log(hasPriorSession?`Resuming session: ${name}`:`Starting new session: ${name}`);let{spawnSync:spawnSync7}=await import("child_process"),result2=spawnSync7("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("--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)").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);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);registerProjectCommands(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("--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",`
|
|
4181
4190
|
Examples:
|
|
4182
4191
|
genie spawn engineer # Spawn built-in engineer role
|
|
4183
4192
|
genie spawn researcher --model sonnet # Spawn with model override
|
|
4184
4193
|
genie spawn my-agent --team my-feature # Spawn into a specific team
|
|
4185
4194
|
genie spawn council--questioner --provider codex # Use Codex provider`).action(async(name,options)=>{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("ls").description("List registered agents with runtime status").option("--json","Output as JSON").option("--source <name>","Filter by executor metadata source (e.g. omni)").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){if(tuiRightPane)process.env.GENIE_TUI_RIGHT=tuiRightPane;let{launchTui:launchTui2}=await Promise.resolve().then(() => exports_tui);await launchTui2(),process.exit(0)}if(args.length===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:writeFileSync27}=await import("fs"),{join:join70}=await import("path"),home=process.env.GENIE_HOME??join70((await import("os")).homedir(),".genie");try{writeFileSync27(join70(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:mkdirSync24,writeFileSync:writeFileSync27}=await import("fs"),{basename:basename15,join:join70}=await import("path"),cwd=process.cwd(),genieDir=join70(cwd,".genie");mkdirSync24(genieDir,{recursive:!0});let config={name:basename15(cwd),agents:{defaults:{}},tmux:{socket:"genie"},sdk:{}};if(writeFileSync27(join70(genieDir,"workspace.json"),`${JSON.stringify(config,null,2)}
|
|
4186
|
-
`),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:
|
|
4195
|
+
`),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:execSync19}=await import("child_process");try{execSync19(`tmux has-session -t =${initialAgent} 2>/dev/null`,{stdio:"pipe"})}catch{console.log(`Spawning ${initialAgent}...`);try{execSync19(`genie spawn ${initialAgent}`,{stdio:"inherit",timeout:15000})}catch{}}}if(initialAgent){let{writeFileSync:writeFileSync27}=await import("fs"),{join:join70}=await import("path"),home=process.env.GENIE_HOME??join70((await import("os")).homedir(),".genie");try{writeFileSync27(join70(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`)}
|