@sleep2agi/agent-node 2.5.0-preview.60 → 2.5.0-preview.61

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.
Files changed (2) hide show
  1. package/dist/cli.js +2 -2
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -82,7 +82,7 @@ ANET_BIN_REAL="$(node -e 'console.log(require("fs").realpathSync(process.argv[1]
82
82
  `)+`
83
83
  `}async function xr(A){let Q=await A.callCommHub("list_my_pending_create_requests",{});if(!Q?.ok){A.warn(`[create-node] pending reconcile failed: ${Q?.error||"unknown"}`);return}let B=Array.isArray(Q.requests)?Q.requests:[],C=0;for(let I of B){let E=typeof I?.request_id==="string"?I.request_id:"";if(!E)continue;if(A.recentlyHandledRequestIds?.has(E))continue;A.recentlyHandledRequestIds?.add(E);try{await A.handleCreateNodeDoorbell({request_id:E}),C+=1}catch(g){A.recentlyHandledRequestIds?.delete(E),A.warn(`[create-node] pending reconcile handler failed for ${E}: ${g?.message||g}`)}}if(C>0)A.log(`[create-node] pending reconcile handled ${C} request(s)`)}function Sj(A,Q){let B=ME(A,".anet"),C=ME(B,"config.json");try{S6(B,{recursive:!0,mode:448})}catch{}NE(C);let I={};try{I=JSON.parse(SU(C,"utf-8"))}catch{}if(I.hub!==Q)I.hub=Q,rB(C,I)}async function kr(A,Q){let{request_id:B}=A,C=await Q.callCommHub("get_create_request",{request_id:B});if(!C?.ok||!C.node_spec||!C.child_token){Q.warn(`[create-node] get_create_request failed: ${C?.error||"unknown"}`),await Q.callCommHub("ack_create_request",{request_id:B,status:"failed",error:C?.error||"get_failed"}).catch(()=>{});return}if(Q.allowedRuntimes&&Q.allowedRuntimes.length>0&&!Q.allowedRuntimes.includes(C.node_spec.runtime)){Q.warn(`[create-node] runtime '${C.node_spec.runtime}' not in daemon's allowed_runtimes: [${Q.allowedRuntimes.join(",")}]`),await Q.callCommHub("ack_create_request",{request_id:B,status:"rejected",error:`runtime_not_in_local_allowlist: ${C.node_spec.runtime}`}).catch(()=>{});return}let I;try{I=Tj(C.node_spec)}catch(N){Q.warn(`[create-node] spec rejected by daemon-side validate: ${N?.message||N}`),await Q.callCommHub("ack_create_request",{request_id:B,status:"rejected",error:`validate: ${N?.message||N}`}).catch(()=>{});return}let E;try{E=rN()}catch(N){Q.warn(`[create-node] anet_bin_unsafe_path: ${N?.message||N}`),await Q.callCommHub("ack_create_request",{request_id:B,status:"failed",error:`bin: ${N?.message||N}`}).catch(()=>{});return}try{S6(Q.workDir,{recursive:!0,mode:448})}catch{}try{Sj(v6(process.env,process.platform),Q.hubUrl)}catch(N){Q.warn(`[create-node] global config write failed (continuing): ${N?.message||N}`)}let g=ME(Q.workDir,".anet","nodes",C.node_spec.name);try{S6(g,{recursive:!0,mode:448})}catch{}let D=ME(g,"config.json"),U=C.node_spec.flags||{};try{let N={node_id:`node_${B.replace(/^cr_/,"")}`,node_name:C.node_spec.name,alias:C.node_spec.name,runtime:C.node_spec.runtime,...C.node_spec.model?{model:C.node_spec.model}:{},hub:Q.hubUrl,token:C.child_token,...Object.keys(U).length?{flags:U}:{}};rB(D,N),Q.log(`[create-node] wrote child config: ${D}`)}catch(N){Q.warn(`[create-node] write child config failed: ${N?.message||N}`),await Q.callCommHub("ack_create_request",{request_id:B,status:"failed",error:`write_config: ${N?.message||N}`}).catch(()=>{});return}if(C.env_blob&&Object.keys(C.env_blob).length>0){let N=ME(Q.workDir,".anet","nodes",C.node_spec.name,".env.local");try{HU(N,Q.serializeEnvLocal(C.env_blob))}catch(G){Q.warn(`[create-node] env.local write failed: ${G?.message||G}`)}}let F=-1;try{let N=$r(E,["node","start",C.node_spec.name],{cwd:Q.workDir,env:aN(),stdio:["ignore","ignore","ignore"],detached:!0});F=N.pid||-1;try{N.stdin?.destroy()}catch{}try{N.stdout?.destroy()}catch{}try{N.stderr?.destroy()}catch{}if(N.unref(),Q.log(`[create-node] spawned child '${C.node_spec.name}' pid=${F}`),F>0)try{process.kill(F,0),Q.log(`[create-node] post-spawn kill-0 verify OK: pid=${F} alive`)}catch(G){let $=`child died immediately after spawn: ${G?.message||G}`;Q.warn(`[create-node] ${$}`),await Q.callCommHub("ack_create_request",{request_id:B,status:"failed",error:$}).catch(()=>{});return}}catch(N){let G=(N?.message||String(N)).slice(0,800);Q.warn(`[create-node] fork (start) failed: ${G}`),await Q.callCommHub("ack_create_request",{request_id:B,status:"failed",error:`fork_start: ${G}`}).catch(()=>{});return}if(F>0&&typeof C.node_spec.name==="string")try{let N=`node_${B.replace(/^cr_/,"")}`,{recordSpawnedChild:G}=await Promise.resolve().then(() => ($E(),I0));G(N,C.node_spec.name,F)}catch(N){Q.warn(`[create-node] childrenMap record failed (stop-daemon won't see this child): ${N?.message||N}`)}let Y=5000;await new Promise((N)=>setTimeout(N,Y));let J=!1;if(F>0)try{process.kill(F,0),J=!0,Q.log(`[create-node] +${Y}ms capability check OK: pid=${F} still alive`)}catch(N){let G=`child died within ${Y}ms post-spawn (likely missing runtime binary or auth for runtime='${C.node_spec.runtime}'): ${N?.message||N}`;Q.warn(`[create-node] runtime_capability_check_failed: ${G}`);try{let{forgetSpawnedChild:$}=await Promise.resolve().then(() => ($E(),I0)),V=$(`node_${B.replace(/^cr_/,"")}`);Q.log(`[create-node] childrenMap rollback after capability failure: removed=${V}`)}catch($){Q.warn(`[create-node] childrenMap rollback failed: ${$?.message||$}`)}await Q.callCommHub("ack_create_request",{request_id:B,status:"runtime_capability_check_failed",error:G.slice(0,800),runtime:C.node_spec.runtime}).catch(()=>{});return}await Q.callCommHub("ack_create_request",{request_id:B,status:"started",child_pid:F}).catch((N)=>Q.warn(`[create-node] ack failed: ${N?.message||N}`))}function vr(A=process.env,Q=process.platform){try{return{state:"ready",abs:k6(A,Q)}}catch(B){return{state:"blocked",code:B?.anetBinCode??"anet_bin_unknown",detail:B instanceof Error?B.message:String(B)}}}var x6=!1,TU=null,T6="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",jj,_j,kLA,_r,qr,qj,Or,Tr;var xU=q(()=>{Xj();I6();jj=new Set(["PATH","HOME","LANG"]),_j=new Set(["PATH","HOME","LANG","USERPROFILE","HOMEDRIVE","HOMEPATH"]);kLA=new Set([...jj,..._j]);_r=/^[a-z][a-z0-9_-]{0,63}$/,qr=/^[a-zA-Z0-9._:\-]+$/,qj=new Set(["claude-agent-sdk","claude-code-cli","codex-sdk","codex-app-server","grok-build-acp","grok-build-cli","opencode-cli"]),Or={VALID_RUNTIMES:qj},Tr=new Set(["default","acceptEdits","plan","bypassPermissions"])});import{closeSync as br,constants as Pj,fstatSync as yr,lstatSync as fr,openSync as hr,readFileSync as mr,realpathSync as ur}from"fs";import{dirname as cr,join as lr,resolve as xj}from"path";function h6(){return["---",`name: ${vj}`,`description: Fixed Agent Network co-presence preview profile (${y6})`,"injectDefaultTools: false","discoverSkills: false","inheritSkills: false","tools:",...vU.map((A)=>` - ${A}`),"---",kU?`${b6}: Answer the current user directly. The runtime-owned outbound-only commhub MCP integration and general web_search are available; do not claim inbound CommHub, lifecycle/presence ownership, filesystem, shell, web-fetch/media, or subagent access. Web search is not an x.com-only network sandbox.`:tN?`${b6}: Answer the current user directly. The runtime-owned outbound-only commhub MCP integration plus read_file, grep, and list_dir are available under Grok's strict sandbox: project tree plus essential system paths only; protected credential paths remain denied. Do not claim shell, write/edit, web/media, lifecycle/presence ownership, or subagent access.`:`${b6}: Answer the current user directly. Only the runtime-owned outbound-only commhub MCP integration is available; do not claim inbound CommHub, lifecycle/presence ownership, filesystem, shell, web/media, or subagent access.`,""].join(`
84
84
  `)}function bj(A,Q){let B=ur(xj(Q)),C=lr(B,f6);if(xj(A)!==C||cr(C)!==B)throw Error("grok copresence agent profile is outside its runtime-owned home");let I=fr(C),E=process.getuid?.();if(I.isSymbolicLink()||!I.isFile()||I.nlink!==1||!fI(I.mode,384)||E!==void 0&&I.uid!==E)throw Error("grok copresence agent profile is not an owner-only regular file");let g=hr(C,Pj.O_RDONLY|(Pj.O_NOFOLLOW||0));try{let D=yr(g);if(!D.isFile()||D.nlink!==1||D.dev!==I.dev||D.ino!==I.ino||!fI(D.mode,384)||E!==void 0&&D.uid!==E||mr(g,"utf8")!==h6())throw Error("grok copresence agent profile differs from the fixed preview policy")}finally{br(g)}}var y6,kU,tN,vU,kj,vj="anet-copresence-preview",f6,b6="ANET_COPRESENCE_PROFILE_V1";var m6=q(()=>{Ug();y6=uR(),kU=y6==="x-search",tN=y6==="repo-read",vU=Object.freeze(["todo_write","search_tool","use_tool",...kU?["web_search"]:[],...tN?["read_file","grep","list_dir"]:[]]),kj=Object.freeze(["run_terminal_command","run_terminal_cmd","search_replace","write_file","edit_file","apply_patch","write","kill_command_or_subagent","get_command_or_subagent_output","wait_commands_or_subagents","scheduler_create","scheduler_delete","scheduler_list","monitor","update_goal","enter_plan_mode","exit_plan_mode","ask_user_question","web_fetch","http_request","image_gen","image_edit","generate_image","video_gen","generate_video","browser","computer","screenshot"]),f6=`${vj}.md`});var BG={};KA(BG,{resolveGrokCommhubMcpCommand:()=>d6,prepareGrokCliHome:()=>Ka,isOverBroadGrokTrustTarget:()=>s6,hardenExistingGrokSessionStore:()=>pj,grokProjectPolicyPaths:()=>tj,grokCliStateKey:()=>Ea,cleanupGrokCliStoppedTuiGeneration:()=>o6,cleanupGrokCliPostStopState:()=>r6,canTrustGrokProjectCwd:()=>La,assertNoProjectGrokExecutableSources:()=>ej,assertNoDiscoveredGrokHooks:()=>Za,assertGrokCommhubMcpDoctor:()=>Aa,acquireGrokProjectTurnLock:()=>t6,GROK_POST_STOP_CLEANUP_POLICY:()=>jC});import{createHash as ir,randomBytes as l6}from"crypto";import{spawn as pr}from"child_process";import{accessSync as mj,chmodSync as u6,closeSync as rA,constants as FA,existsSync as uj,fchmodSync as VE,fstatSync as yQ,lstatSync as nQ,mkdirSync as dr,openSync as qQ,readdirSync as QG,readFileSync as yU,readlinkSync as nr,realpathSync as oQ,renameSync as cj,rmdirSync as lj,rmSync as E0,statSync as fU,symlinkSync as or,unlinkSync as rr,writeFileSync as ar}from"fs";import{basename as i6,delimiter as sr,dirname as WE,isAbsolute as p6,join as CA,parse as tr,relative as c6,resolve as aA}from"path";import{homedir as ij}from"os";import{createServer as er}from"node:net";function d6(A,Q){if(!A||A.includes("\x00")||A.includes("\r")||A.includes(`
85
- `))throw Error("grok copresence CommHub MCP command is invalid");let B=GI()?[""]:[...(process.env.PATHEXT||".COM;.EXE;.BAT;.CMD").split(";").map((g)=>g.trim()).filter(Boolean),""],C=(g)=>B.map((D)=>`${g}${D}`),I=(g)=>GI()?[]:[aA(g,"node_modules",A,"bin",`${A}.exe`)],E=p6(A)?C(A):Q.split(sr).filter(Boolean).flatMap((g)=>[...I(g),...C(aA(g,A))]);for(let g of E)try{let D=oQ(g);if(!fU(D).isFile())continue;return mj(D,FA.X_OK),D}catch{}throw Error("grok copresence CommHub MCP command could not be resolved or executed")}function Aa(A){let Q;try{Q=JSON.parse(A)}catch{throw Error("grok copresence CommHub MCP doctor returned invalid JSON")}let B=Array.isArray(Q?.servers)?Q.servers.find((g)=>g?.name==="commhub"):void 0,C=["command found","server started","handshake OK","4 tools discovered"],I=Array.isArray(B?.checks)?B.checks:[],E=C.filter((g)=>!I.some((D)=>D?.label===g&&D?.passed===!0));if(Q?.healthy_count!==1||Q?.failing_count!==0||B?.healthy!==!0||E.length>0)throw Error(`grok copresence CommHub MCP readiness failed${E.length?`: ${E.join(", ")}`:""}`)}function Qa(A){let Q=IQ(A);if(!Q)return;let B=process.getuid?.();if(Q.isSymbolicLink()||!Q.isDirectory())throw Error(`grok-build-cli refuses transient post-stop state at ${A}: expected a real directory`);if(B!==void 0)EB(A,B,Q.uid)}function Ba(A){let Q=IQ(A);if(!Q)return;let B=`${A}.anet-post-stop-${l6(12).toString("hex")}`;if(IQ(B))throw Error(`grok-build-cli refuses occupied transient quarantine path: ${B}`);cj(A,B);let C=nQ(B);if(C.isSymbolicLink()||!C.isDirectory()||!HB(Q,C))throw Error(`grok-build-cli transient post-stop state changed during quarantine: ${A}`);E0(B,{recursive:!0,force:!1})}async function Ca(A){let Q=Dg(A,MQ()),B=er();B.on("connection",(I)=>{try{I.destroy()}catch{}}),await new Promise((I,E)=>{let g=(U)=>{B.removeListener("listening",D),E(Error(`grok-build-cli project turn lock is already held (${Q}): ${U?.message||U}`))},D=()=>{B.removeListener("error",g),I()};B.once("error",g),B.once("listening",D),B.listen(Q)});let C=!1;return{async release(){if(C)return;C=!0,await new Promise((I)=>B.close(()=>I()))}}}function pj(A){let Q=CA(aA(A),"sessions");if(!IQ(Q))return;if(yj.has(Q))return;let C=process.getuid?.(),I=(E)=>{let g=nQ(E);if(g.isSymbolicLink())throw Error(`grok-build-cli refuses symlink in isolated session store: ${E}`);if(C!==void 0)EB(E,C,g.uid);if(g.isDirectory()){let U;try{U=qQ(E,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0)),nB(()=>VE(U,448))}finally{if(U!==void 0)rA(U)}for(let F of QG(E))I(CA(E,F));return}if(!g.isFile()||g.nlink!==1)throw Error(`grok-build-cli refuses non-private session state: ${E}`);let D=qQ(E,FA.O_RDONLY|(FA.O_NOFOLLOW||0));try{let U=yQ(D);if(!U.isFile()||U.nlink!==1||U.dev!==g.dev||U.ino!==g.ino)throw Error(`grok-build-cli session state changed during mode repair: ${E}`);nB(()=>VE(D,384))}finally{rA(D)}};I(Q),yj.add(Q)}function Ea(A){if(!A||A==="."||A==="..")throw Error("grok-build-cli node identity cannot be empty, '.' or '..'");return`node-${ir("sha256").update(A).digest("hex").slice(0,24)}`}function IQ(A){try{return nQ(A)}catch(Q){if(Q?.code==="ENOENT")return;throw Q}}function EB(A,Q,B){if(Q!==B)throw Error(`grok-build-cli refuses ${A}: owner ${B} does not match runtime uid ${Q}`)}function bU(A,Q){if(!IQ(A))dr(A,{mode:448});let B;try{B=qQ(A,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0));let C=yQ(B);if(!C.isDirectory())throw Error(`grok-build-cli refuses ${Q} at ${A}: expected a real directory, not a symlink or file`);let I=process.getuid?.();if(I!==void 0)EB(A,I,C.uid);nB(()=>VE(B,448))}catch(C){if(C?.code==="ELOOP"||C?.code==="ENOTDIR")throw Error(`grok-build-cli refuses ${Q} at ${A}: expected a real directory, not a symlink or file`);throw C}finally{if(B!==void 0)rA(B)}}function n6(A){let Q=IQ(A);if(!Q)return;if(Q.isSymbolicLink()||!Q.isFile())throw Error(`grok-build-cli refuses generated state at ${A}: expected a regular file`);let B=process.getuid?.();if(B!==void 0)EB(A,B,Q.uid)}function ga(A){if(!IQ(A))return;n6(A);let B=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0));try{let C=yQ(B);if(!C.isFile())throw Error(`grok-build-cli refuses generated state at ${A}: not a regular file`);let I=process.getuid?.();if(I!==void 0)EB(A,I,C.uid);return yU(B,"utf8")}finally{rA(B)}}function _C(A,Q){n6(A);let B=CA(WE(A),`.${i6(A)}.${l6(8).toString("hex")}.tmp`),C=qQ(B,FA.O_WRONLY|FA.O_CREAT|FA.O_EXCL|(FA.O_NOFOLLOW||0),384);try{ar(C,Q,"utf8"),nB(()=>VE(C,384)),rA(C),cj(B,A)}catch(I){try{rA(C)}catch{}throw E0(B,{force:!0}),I}}function fj(A){if(!IQ(A))return;n6(A),E0(A,{force:!0})}function HB(A,Q){return A.dev===Q.dev&&A.ino===Q.ino}function C0(A,Q){let B=aA(A);if(A!==B)throw Error(`grok-build-cli refuses ${Q}: path is not canonical`);let C;try{C=qQ(B,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0));let I=yQ(C);if(!I.isDirectory()||oQ(B)!==B)throw Error(`grok-build-cli refuses ${Q}: expected a real directory`);let E=process.getuid?.();if(E!==void 0)EB(B,E,I.uid);nB(()=>VE(C,448))}catch(I){if(I?.code==="ELOOP"||I?.code==="ENOTDIR")throw Error(`grok-build-cli refuses ${Q}: expected a real directory`);throw I}finally{if(C!==void 0)rA(C)}}function dj(A){let Q=nQ(A),B=process.getuid?.();if(Q.isSymbolicLink()||!Q.isFile()||Q.nlink!==1)throw Error(`grok-build-cli refuses post-stop state at ${A}: expected a single-link regular file`);if(B!==void 0)EB(A,B,Q.uid);let C;try{C=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let I=yQ(C);if(!I.isFile()||I.nlink!==1||!HB(Q,I))throw Error(`grok-build-cli refuses post-stop state at ${A}: file changed during validation`);if(B!==void 0)EB(A,B,I.uid);return{fd:C,stat:I}}catch(I){if(C!==void 0)rA(C);throw I}}function eN(A,Q){if(!IQ(A))return;let C=dj(A);try{if(Q!==void 0&&C.stat.size!==Q)throw Error(`grok-build-cli refuses post-stop state at ${A}: expected size ${Q}`);let I=nQ(A);if(!HB(C.stat,I))throw Error(`grok-build-cli refuses post-stop state at ${A}: file changed before removal`);E0(A)}finally{rA(C.fd)}}function Ua(A){let Q=process.getuid?.();if(Q===void 0)throw Error("grok-build-cli cannot prove project placeholder ownership on this platform");let B;try{B=qQ(A,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0));let C=yQ(B),I=nQ(A);if(!C.isDirectory()||I.isSymbolicLink()||!I.isDirectory()||!HB(C,I)||oQ(A)!==A)throw Error("grok-build-cli refuses post-stop project cleanup: expected the canonical real project cwd");return EB(A,Q,C.uid),{fd:B,stat:C,uid:Q}}catch(C){if(B!==void 0)rA(B);if(C?.code==="ELOOP"||C?.code==="ENOTDIR")throw Error("grok-build-cli refuses post-stop project cleanup: expected the canonical real project cwd");throw C}}function AG(A,Q,B,C){if(Q.isSymbolicLink()||!Q.isFile()||Q.nlink!==1||Q.size!==0||GI()&&(Q.mode&4095)!==292)throw Error(`grok-build-cli refuses post-stop project placeholder at ${A}: expected an empty owner-held single-link regular file with mode 0444`);if(EB(A,B,Q.uid),C&&!HB(Q,C))throw Error(`grok-build-cli refuses post-stop project placeholder at ${A}: file changed during validation`)}function Fa(A,Q,B){let C=CA(A,Q),I=IQ(C);if(!I)return;if(Da.has(Q)&&!I.isSymbolicLink()&&I.isDirectory())return;AG(C,I,B);let E;try{E=qQ(C,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let g=yQ(E);return AG(C,g,B,I),{path:C,fd:E,stat:g}}catch(g){if(E!==void 0)rA(E);throw g}}function hj(A,Q,B){let C=nQ(A);if(C.isSymbolicLink()||!C.isDirectory()||!HB(C,Q)||oQ(A)!==A)throw Error("grok-build-cli refuses post-stop project cleanup: project cwd changed during validation");EB(A,B,C.uid)}function nj(A){let Q=Ua(A),B=[];try{for(let C of jC.projectSandboxPlaceholders.basenames){let I=Fa(A,C,Q.uid);if(I)B.push(I)}hj(A,Q.stat,Q.uid);for(let C of B){let I=nQ(C.path);AG(C.path,I,Q.uid,C.stat)}for(let C of B){hj(A,Q.stat,Q.uid);let I=nQ(C.path);AG(C.path,I,Q.uid,C.stat),rr(C.path)}}finally{for(let C of B)rA(C.fd);rA(Q.fd)}}function oj(A){if(!IQ(A))return;let Q=dj(A);try{nB(()=>VE(Q.fd,384))}finally{rA(Q.fd)}}function Ya(A){let Q=tr(A);return CA(Q.dir,`${Q.name}.lock`)}function rj(A,Q){if(!Number.isSafeInteger(Q)||Q<=0)throw Error("grok-build-cli post-stop cleanup requires positive integer TUI process ids");return CA(A,`sandbox-blocked-dir.${Q}`)}function aj(A){let Q=IQ(A);if(!Q)return;if(Q.isSymbolicLink()||!Q.isDirectory())throw Error(`grok-build-cli refuses post-stop state at ${A}: expected an empty real directory`);let B=process.getuid?.();if(B!==void 0)EB(A,B,Q.uid);let C=nQ(A);if(!HB(Q,C))throw Error(`grok-build-cli refuses post-stop state at ${A}: directory changed before removal`);try{lj(A)}catch(I){if(I?.code==="ENOTEMPTY"||I?.code==="EEXIST")throw Error(`grok-build-cli refuses post-stop state at ${A}: expected an empty real directory`);throw I}}function o6(A){let Q=aA(A.stateHome),B=aA(A.projectCwd);if(A.stateHome!==Q||A.projectCwd!==B)throw Error("grok-build-cli stopped-generation cleanup requires canonical absolute paths");let C=rj(Q,A.tuiProcessId);C0(Q,"stopped-generation state home"),aj(C),nj(B)}function Na(A){return Ja.some((Q)=>A.startsWith(Q))}function Ga(A,Q,B){if(Q.isDirectory()){nB(()=>u6(A,448));let E=!1,g;try{g=qQ(A,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0));let U=yQ(g);if(!U.isDirectory()||!HB(Q,U)||B!==void 0&&U.uid!==B)throw Error(`grok-build-cli refuses post-stop sandbox placeholder ${A}: identity changed during reclaim`);E=QG(A).length===0}finally{if(g!==void 0)rA(g)}if(!E){nB(()=>u6(A,0));return}let D=nQ(A);if(D.isSymbolicLink()||!D.isDirectory()||!HB(Q,D))throw Error(`grok-build-cli refuses post-stop sandbox placeholder ${A}: directory changed before removal`);lj(A);return}if(!Q.isFile()||Q.nlink!==1||Q.size!==0)return;nB(()=>u6(A,448));let C;try{C=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let E=yQ(C);if(!E.isFile()||E.nlink!==1||E.size!==0||!HB(Q,E)||B!==void 0&&E.uid!==B)throw Error(`grok-build-cli refuses post-stop sandbox placeholder ${A}: file changed during reclaim`)}finally{if(C!==void 0)rA(C)}let I=nQ(A);if(I.isSymbolicLink()||!I.isFile()||!HB(Q,I))throw Error(`grok-build-cli refuses post-stop sandbox placeholder ${A}: file changed before removal`);E0(A)}function sj(A,Q=""){let B=nQ(A);if(B.isSymbolicLink()){if(Q==="agent_id")return;throw Error(`grok-build-cli refuses symlink in post-stop state: ${A}`)}let C=process.getuid?.();if(C!==void 0)EB(A,C,B.uid);if(Na(i6(A))){Ga(A,B,C);return}if(B.isDirectory()){C0(A,`post-stop directory ${A}`);for(let I of QG(A))sj(CA(A,I),Q?CA(Q,I):I);return}if(!B.isFile()||B.nlink!==1)throw Error(`grok-build-cli refuses non-private post-stop state: ${A}`);oj(A)}function r6(A){let Q=aA(A.stateHome),B=aA(A.projectCwd),C=aA(A.leaderSocket);if(A.stateHome!==Q||A.projectCwd!==B||A.leaderSocket!==C)throw Error("grok-build-cli post-stop cleanup requires canonical absolute paths");if(!Array.isArray(A.tuiProcessIds)||new Set(A.tuiProcessIds).size!==A.tuiProcessIds.length)throw Error("grok-build-cli post-stop cleanup requires unique TUI process ids");let I=A.tuiProcessIds.map((F)=>rj(Q,F));C0(Q,"post-stop state home");let E=WE(C);C0(E,"post-stop runtime directory");for(let F of jC.emptyStateFiles)eN(CA(Q,F),0);for(let F of jC.stateFiles)eN(CA(Q,F));let g=CA(Q,"sessions");if(IQ(g))C0(g,"post-stop sessions directory");let D=encodeURIComponent(B),U=CA(g,D);if(IQ(U))C0(U,"post-stop cwd session directory");for(let F of jC.cwdSessionFiles)eN(CA(U,F));for(let F of jC.sessionRootFiles)eN(CA(g,F));for(let F of jC.transientStateDirectories)Qa(CA(Q,F));for(let F of jC.transientStateDirectories)Ba(CA(Q,F));for(let F of I)aj(F);sj(Q),oj(Ya(C)),nj(B)}function $a(A,Q){let B=process.getuid?.(),C,I;try{C=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0)),I=qQ(Q,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let E=yQ(C),g=yQ(I),D=(N)=>N.isFile()&&N.nlink===1&&(B===void 0||N.uid===B)&&N.size>0&&N.size<=4096;if(!D(E)||GI()&&(E.mode&2)!==0||!D(g)||!fI(g.mode,384)||E.size!==g.size)return!1;let U=yU(C),F=yU(I),Y=yQ(C),J=yQ(I);return HB(E,Y)&&HB(g,J)&&E.size===Y.size&&g.size===J.size&&U.equals(F)}catch{return!1}finally{if(I!==void 0)rA(I);if(C!==void 0)rA(C)}}function Ma(A,Q,B){let C=CA(A,B),I=CA(Q,B);if(!uj(C))return;let E=IQ(I);if(E){if(E.isSymbolicLink()&&aA(WE(I),nr(I))===aA(C))return;if(E.isFile()&&!E.isSymbolicLink()&&$a(C,I))return;throw Error(`grok-build-cli refuses generated credential state at ${I}`)}or(C,I)}function Va(A){let Q=IQ(A);if(!Q)return;let B=process.getuid?.();if(B===void 0&&GI())throw Error("grok-build-cli requires Unix uid checks for source auth.json");if(Q.isSymbolicLink()||!Q.isFile()||Q.nlink!==1)throw Error("grok-build-cli source auth.json must be a single-link regular file");if(B!==void 0&&Q.uid!==B)throw Error("grok-build-cli source auth.json must be owned by the runtime uid");if(!fI(Q.mode,384))throw Error("grok-build-cli source auth.json must have mode 0600");let C;try{C=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let I=yQ(C);if(!I.isFile()||I.nlink!==1||I.dev!==Q.dev||I.ino!==Q.ino)throw Error("grok-build-cli source auth.json changed during validation");if(B!==void 0&&I.uid!==B||!fI(I.mode,384))throw Error("grok-build-cli source auth.json changed security metadata during validation");return yU(C,"utf8")}catch(I){if(I?.code==="ELOOP")throw Error("grok-build-cli source auth.json must not be a symlink");throw I}finally{if(C!==void 0)rA(C)}}function a6(A){let Q=oQ(aA(A)),B=[],C=Q,I=!1;while(!0){if(B.push(C),IQ(CA(C,".git"))){I=!0;break}let g=WE(C);if(g===C)break;C=g}let E=I?B:[Q];return{directories:E,root:E[E.length-1]}}function tj(A){return a6(A).directories.flatMap((Q)=>[CA(Q,".grok"),CA(Q,".claude"),CA(Q,".cursor"),CA(Q,".mcp.json"),CA(Q,".envrc")])}function ej(A,Q=!1){for(let B of a6(A).directories){let C=CA(B,".grok"),I=IQ(C);if(I&&(I.isSymbolicLink()||!I.isDirectory()))throw Error(`grok-build-cli refuses project policy state at ${C}: expected a real directory`);for(let E of[".grok/hooks",".grok/plugins"]){let g=CA(B,E);if(!IQ(g))continue;throw Error(`grok-build-cli refuses project executable configuration at ${g}: Grok can execute it outside the model tool sandbox`)}if(!Q)continue;for(let E of[".grok",".claude",".cursor"]){let g=CA(B,E),D=IQ(g);if(D&&(D.isSymbolicLink()||!D.isDirectory()))throw Error(`grok-build-cli refuses project policy state at ${g}: expected a real directory`);if(D&&QG(g).length!==0)throw Error(`grok-build-cli refuses project executable configuration at ${g}: shared-TUI folder trust requires an empty project extension directory`)}for(let E of[".mcp.json",".envrc"]){let g=CA(B,E);if(!IQ(g))continue;throw Error(`grok-build-cli refuses project executable configuration at ${g}: folder trust would activate code outside the model tool sandbox`)}}}function A_(A,Q){let B=c6(A,Q);return B===""||B!==".."&&!B.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!p6(B)}function Wa(A,Q){let B=CA(Q,".anet"),C=aA(A.command),I=aA(A.serverPath),E=aA(A.envFile);if(A.command!==C||A.serverPath!==I||A.envFile!==E||I!==CA(B,"node-server.js")||E!==CA(B,".env"))throw Error("grok-build-cli commhub MCP paths must be the canonical project .anet artifacts");try{if(!fU(C).isFile()||oQ(C)!==C)throw Error("not canonical");mj(C,FA.X_OK)}catch{throw Error("grok-build-cli commhub MCP command is not a canonical executable file")}let g=process.getuid?.();for(let[D,U,F]of[[I,"server",void 0],[E,"environment",384]]){let Y=nQ(D);if(Y.isSymbolicLink()||!Y.isFile()||Y.nlink!==1||oQ(D)!==D||g!==void 0&&Y.uid!==g||F!==void 0&&!fI(Y.mode,F))throw Error(`grok-build-cli commhub MCP ${U} is not an owner-held canonical file`)}for(let[D,U]of[[A.alias,"alias"],[A.resumeId,"resume id"]])if(!D||/[\0\r\n]/.test(D))throw Error(`grok-build-cli commhub MCP ${U} is invalid`);return{command:C,serverPath:I,envFile:E,alias:A.alias,resumeId:A.resumeId}}function wa(A,Q,B){let C=(F,Y,J)=>{let N=nQ(F),G=qQ(F,FA.O_RDONLY|(FA.O_NOFOLLOW||0));try{let $=yQ(G),V=process.getuid?.();if(!$.isFile()||$.nlink!==1||$.dev!==N.dev||$.ino!==N.ino||V!==void 0&&$.uid!==V||J!==void 0&&!fI($.mode,J))throw Error(`grok-build-cli commhub MCP ${Y} changed during staging`);return yU(G,"utf8")}finally{rA(G)}},I=CA(B,"runtime-mcp");bU(I,"commhub MCP runtime directory");let E=CA(WE(Q),".anet-grok-credentials"),g=CA(E,i6(B));bU(E,"commhub MCP credential root"),bU(g,"commhub MCP credential directory");let D=CA(I,"node-server.js"),U=CA(g,".env");return _C(D,C(A.serverPath,"server")),_C(U,C(A.envFile,"environment",384)),{config:{...A,serverPath:D,envFile:U},credentialDir:g}}function s6(A,Q){return WE(A)===A||A===Q}function La(A,Q){try{let B=oQ(aA(A));if(!fU(B).isDirectory())return!1;return!s6(B,oQ(aA(Q??ij())))}catch{return!1}}function Xa(A,Q){let B=aA(A),C=oQ(B);if(C!==B)throw Error("grok-build-cli refuses folder trust through a symlinked project path");if(!fU(C).isDirectory())throw Error("grok-build-cli folder trust target must be a directory");let E=oQ(aA(ij()));if(s6(C,E))throw Error("grok-build-cli refuses over-broad folder trust for a home or filesystem root");for(let g of[E,...Q.map((D)=>aA(D))])if(A_(C,g))throw Error("grok-build-cli refuses folder trust overlapping runtime credential or state paths");return C}async function t6(A,Q="flock",B=process.env){let C=a6(A).root,I=oQ(C);if(!GI()){let $=CA(I,Ia),V=qQ($,FA.O_RDWR|FA.O_CREAT,384),M;try{M=await Ca($)}catch(Z){throw rA(V),Z}let W=!1;return{fd:V,async release(){if(W)return;W=!0,await M.release(),rA(V)}}}let E=!1;try{E=oQ(A)!==I}catch{E=!1}if(!fU(I).isDirectory())throw Error(`grok-build-cli project root is not a directory: ${I}`);let D=CA(I,".anet"),U=IQ(D);if(!U||U.isSymbolicLink()||!U.isDirectory())throw Error(`grok-build-cli requires a real project .anet directory for its turn lock: ${D}`);let F=CA(D,".grok-build-cli-turn.lock"),Y=qQ(F,FA.O_RDWR|FA.O_CREAT|(FA.O_NOFOLLOW||0),384);try{let $=yQ(Y);if(!$.isFile()||$.nlink!==1)throw Error(`grok-build-cli turn lock must be a single-link regular file: ${F}`);let V=process.getuid?.();if(V!==void 0)EB(F,V,$.uid);nB(()=>VE(Y,384))}catch($){throw rA(Y),$}let J="process.stdout.write('LOCKED\\n');process.stdin.resume()",N=pr(Q,["--no-fork","--exclusive","--nonblock","3",process.execPath,"-e",J],{cwd:I,env:pN(B),stdio:["pipe","pipe","pipe",Y]});try{await new Promise(($,V)=>{let M="",W="",Z=!1,z=setTimeout(()=>{if(Z)return;Z=!0,N.kill("SIGKILL"),V(Error("grok-build-cli timed out acquiring the project turn lock"))},3000);z.unref?.();let X=(O)=>{if(Z)return;Z=!0,clearTimeout(z),V(Error(O))};N.stdout.setEncoding("utf8"),N.stdout.on("data",(O)=>{if(M=(M+O).slice(-64),!Z&&M.includes(`LOCKED
85
+ `))throw Error("grok copresence CommHub MCP command is invalid");let B=GI()?[""]:[...(process.env.PATHEXT||".COM;.EXE;.BAT;.CMD").split(";").map((g)=>g.trim()).filter(Boolean),""],C=(g)=>B.map((D)=>`${g}${D}`),I=(g)=>GI()?[]:[aA(g,"node_modules",A,"bin",`${A}.exe`)],E=p6(A)?C(A):Q.split(sr).filter(Boolean).flatMap((g)=>[...I(g),...C(aA(g,A))]);for(let g of E)try{let D=oQ(g);if(!fU(D).isFile())continue;return mj(D,FA.X_OK),D}catch{}throw Error("grok copresence CommHub MCP command could not be resolved or executed")}function Aa(A){let Q;try{Q=JSON.parse(A)}catch{throw Error("grok copresence CommHub MCP doctor returned invalid JSON")}let B=Array.isArray(Q?.servers)?Q.servers.find((g)=>g?.name==="commhub"):void 0,C=["command found","server started","handshake OK","4 tools discovered"],I=Array.isArray(B?.checks)?B.checks:[],E=C.filter((g)=>!I.some((D)=>D?.label===g&&D?.passed===!0));if(Q?.healthy_count!==1||Q?.failing_count!==0||B?.healthy!==!0||E.length>0)throw Error(`grok copresence CommHub MCP readiness failed${E.length?`: ${E.join(", ")}`:""}`)}function Qa(A){let Q=IQ(A);if(!Q)return;let B=process.getuid?.();if(Q.isSymbolicLink()||!Q.isDirectory())throw Error(`grok-build-cli refuses transient post-stop state at ${A}: expected a real directory`);if(B!==void 0)EB(A,B,Q.uid)}function Ba(A){let Q=IQ(A);if(!Q)return;let B=`${A}.anet-post-stop-${l6(12).toString("hex")}`;if(IQ(B))throw Error(`grok-build-cli refuses occupied transient quarantine path: ${B}`);cj(A,B);let C=nQ(B);if(C.isSymbolicLink()||!C.isDirectory()||!HB(Q,C))throw Error(`grok-build-cli transient post-stop state changed during quarantine: ${A}`);E0(B,{recursive:!0,force:!1})}async function Ca(A){let Q=Dg(A,MQ()),B=er();B.on("connection",(I)=>{try{I.destroy()}catch{}}),await new Promise((I,E)=>{let g=(U)=>{B.removeListener("listening",D),E(Error(`grok-build-cli project turn lock is already held (${Q}): ${U?.message||U}`))},D=()=>{B.removeListener("error",g),I()};B.once("error",g),B.once("listening",D),B.listen(Q)});let C=!1;return{async release(){if(C)return;C=!0,await new Promise((I)=>B.close(()=>I()))}}}function pj(A){let Q=CA(aA(A),"sessions");if(!IQ(Q))return;if(yj.has(Q))return;let C=process.getuid?.(),I=(E)=>{let g=nQ(E);if(g.isSymbolicLink())throw Error(`grok-build-cli refuses symlink in isolated session store: ${E}`);if(C!==void 0)EB(E,C,g.uid);if(g.isDirectory()){let U;try{U=qQ(E,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0)),nB(()=>VE(U,448))}finally{if(U!==void 0)rA(U)}for(let F of QG(E))I(CA(E,F));return}if(!g.isFile()||g.nlink!==1)throw Error(`grok-build-cli refuses non-private session state: ${E}`);let D=qQ(E,FA.O_RDONLY|(FA.O_NOFOLLOW||0));try{let U=yQ(D);if(!U.isFile()||U.nlink!==1||U.dev!==g.dev||U.ino!==g.ino)throw Error(`grok-build-cli session state changed during mode repair: ${E}`);nB(()=>VE(D,384))}finally{rA(D)}};I(Q),yj.add(Q)}function Ea(A){if(!A||A==="."||A==="..")throw Error("grok-build-cli node identity cannot be empty, '.' or '..'");return`node-${ir("sha256").update(A).digest("hex").slice(0,24)}`}function IQ(A){try{return nQ(A)}catch(Q){if(Q?.code==="ENOENT")return;throw Q}}function EB(A,Q,B){if(Q!==B)throw Error(`grok-build-cli refuses ${A}: owner ${B} does not match runtime uid ${Q}`)}function bU(A,Q){if(!IQ(A))dr(A,{mode:448});let B;try{B=qQ(A,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0));let C=yQ(B);if(!C.isDirectory())throw Error(`grok-build-cli refuses ${Q} at ${A}: expected a real directory, not a symlink or file`);let I=process.getuid?.();if(I!==void 0)EB(A,I,C.uid);nB(()=>VE(B,448))}catch(C){if(C?.code==="ELOOP"||C?.code==="ENOTDIR")throw Error(`grok-build-cli refuses ${Q} at ${A}: expected a real directory, not a symlink or file`);throw C}finally{if(B!==void 0)rA(B)}}function n6(A){let Q=IQ(A);if(!Q)return;if(Q.isSymbolicLink()||!Q.isFile())throw Error(`grok-build-cli refuses generated state at ${A}: expected a regular file`);let B=process.getuid?.();if(B!==void 0)EB(A,B,Q.uid)}function ga(A){if(!IQ(A))return;n6(A);let B=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0));try{let C=yQ(B);if(!C.isFile())throw Error(`grok-build-cli refuses generated state at ${A}: not a regular file`);let I=process.getuid?.();if(I!==void 0)EB(A,I,C.uid);return yU(B,"utf8")}finally{rA(B)}}function _C(A,Q){n6(A);let B=CA(WE(A),`.${i6(A)}.${l6(8).toString("hex")}.tmp`),C=qQ(B,FA.O_WRONLY|FA.O_CREAT|FA.O_EXCL|(FA.O_NOFOLLOW||0),384);try{ar(C,Q,"utf8"),nB(()=>VE(C,384)),rA(C),cj(B,A)}catch(I){try{rA(C)}catch{}throw E0(B,{force:!0}),I}}function fj(A){if(!IQ(A))return;n6(A),E0(A,{force:!0})}function HB(A,Q){return A.dev===Q.dev&&A.ino===Q.ino}function C0(A,Q){let B=aA(A);if(A!==B)throw Error(`grok-build-cli refuses ${Q}: path is not canonical`);let C;try{C=qQ(B,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0));let I=yQ(C);if(!I.isDirectory()||oQ(B)!==B)throw Error(`grok-build-cli refuses ${Q}: expected a real directory`);let E=process.getuid?.();if(E!==void 0)EB(B,E,I.uid);nB(()=>VE(C,448))}catch(I){if(I?.code==="ELOOP"||I?.code==="ENOTDIR")throw Error(`grok-build-cli refuses ${Q}: expected a real directory`);throw I}finally{if(C!==void 0)rA(C)}}function dj(A){let Q=nQ(A),B=process.getuid?.();if(Q.isSymbolicLink()||!Q.isFile()||Q.nlink!==1)throw Error(`grok-build-cli refuses post-stop state at ${A}: expected a single-link regular file`);if(B!==void 0)EB(A,B,Q.uid);let C;try{C=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let I=yQ(C);if(!I.isFile()||I.nlink!==1||!HB(Q,I))throw Error(`grok-build-cli refuses post-stop state at ${A}: file changed during validation`);if(B!==void 0)EB(A,B,I.uid);return{fd:C,stat:I}}catch(I){if(C!==void 0)rA(C);throw I}}function eN(A,Q){if(!IQ(A))return;let C=dj(A);try{if(Q!==void 0&&C.stat.size!==Q)throw Error(`grok-build-cli refuses post-stop state at ${A}: expected size ${Q}`);let I=nQ(A);if(!HB(C.stat,I))throw Error(`grok-build-cli refuses post-stop state at ${A}: file changed before removal`);E0(A)}finally{rA(C.fd)}}function Ua(A){let Q=process.getuid?.();if(Q===void 0)throw Error("grok-build-cli cannot prove project placeholder ownership on this platform");let B;try{B=qQ(A,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0));let C=yQ(B),I=nQ(A);if(!C.isDirectory()||I.isSymbolicLink()||!I.isDirectory()||!HB(C,I)||oQ(A)!==A)throw Error("grok-build-cli refuses post-stop project cleanup: expected the canonical real project cwd");return EB(A,Q,C.uid),{fd:B,stat:C,uid:Q}}catch(C){if(B!==void 0)rA(B);if(C?.code==="ELOOP"||C?.code==="ENOTDIR")throw Error("grok-build-cli refuses post-stop project cleanup: expected the canonical real project cwd");throw C}}function AG(A,Q,B,C){if(Q.isSymbolicLink()||!Q.isFile()||Q.nlink!==1||Q.size!==0||GI()&&(Q.mode&4095)!==292)throw Error(`grok-build-cli refuses post-stop project placeholder at ${A}: expected an empty owner-held single-link regular file with mode 0444`);if(EB(A,B,Q.uid),C&&!HB(Q,C))throw Error(`grok-build-cli refuses post-stop project placeholder at ${A}: file changed during validation`)}function Fa(A,Q,B){let C=CA(A,Q),I=IQ(C);if(!I)return;if(Da.has(Q)&&!I.isSymbolicLink()&&I.isDirectory())return;AG(C,I,B);let E;try{E=qQ(C,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let g=yQ(E);return AG(C,g,B,I),{path:C,fd:E,stat:g}}catch(g){if(E!==void 0)rA(E);throw g}}function hj(A,Q,B){let C=nQ(A);if(C.isSymbolicLink()||!C.isDirectory()||!HB(C,Q)||oQ(A)!==A)throw Error("grok-build-cli refuses post-stop project cleanup: project cwd changed during validation");EB(A,B,C.uid)}function nj(A){let Q=Ua(A),B=[];try{for(let C of jC.projectSandboxPlaceholders.basenames){let I=Fa(A,C,Q.uid);if(I)B.push(I)}hj(A,Q.stat,Q.uid);for(let C of B){let I=nQ(C.path);AG(C.path,I,Q.uid,C.stat)}for(let C of B){hj(A,Q.stat,Q.uid);let I=nQ(C.path);AG(C.path,I,Q.uid,C.stat),rr(C.path)}}finally{for(let C of B)rA(C.fd);rA(Q.fd)}}function oj(A){if(!IQ(A))return;let Q=dj(A);try{nB(()=>VE(Q.fd,384))}finally{rA(Q.fd)}}function Ya(A){let Q=tr(A);return CA(Q.dir,`${Q.name}.lock`)}function rj(A,Q){if(!Number.isSafeInteger(Q)||Q<=0)throw Error("grok-build-cli post-stop cleanup requires positive integer TUI process ids");return CA(A,`sandbox-blocked-dir.${Q}`)}function aj(A){let Q=IQ(A);if(!Q)return;if(Q.isSymbolicLink()||!Q.isDirectory())throw Error(`grok-build-cli refuses post-stop state at ${A}: expected an empty real directory`);let B=process.getuid?.();if(B!==void 0)EB(A,B,Q.uid);let C=nQ(A);if(!HB(Q,C))throw Error(`grok-build-cli refuses post-stop state at ${A}: directory changed before removal`);try{lj(A)}catch(I){if(I?.code==="ENOTEMPTY"||I?.code==="EEXIST")throw Error(`grok-build-cli refuses post-stop state at ${A}: expected an empty real directory`);throw I}}function o6(A){let Q=aA(A.stateHome),B=aA(A.projectCwd);if(A.stateHome!==Q||A.projectCwd!==B)throw Error("grok-build-cli stopped-generation cleanup requires canonical absolute paths");let C=rj(Q,A.tuiProcessId);C0(Q,"stopped-generation state home"),aj(C),nj(B)}function Na(A){return Ja.some((Q)=>A.startsWith(Q))}function Ga(A,Q,B){if(Q.isDirectory()){nB(()=>u6(A,448));let E=!1,g;try{g=qQ(A,FA.O_RDONLY|(FA.O_DIRECTORY||0)|(FA.O_NOFOLLOW||0));let U=yQ(g);if(!U.isDirectory()||!HB(Q,U)||B!==void 0&&U.uid!==B)throw Error(`grok-build-cli refuses post-stop sandbox placeholder ${A}: identity changed during reclaim`);E=QG(A).length===0}finally{if(g!==void 0)rA(g)}if(!E){nB(()=>u6(A,0));return}let D=nQ(A);if(D.isSymbolicLink()||!D.isDirectory()||!HB(Q,D))throw Error(`grok-build-cli refuses post-stop sandbox placeholder ${A}: directory changed before removal`);lj(A);return}if(!Q.isFile()||Q.nlink!==1||Q.size!==0)return;nB(()=>u6(A,448));let C;try{C=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let E=yQ(C);if(!E.isFile()||E.nlink!==1||E.size!==0||!HB(Q,E)||B!==void 0&&E.uid!==B)throw Error(`grok-build-cli refuses post-stop sandbox placeholder ${A}: file changed during reclaim`)}finally{if(C!==void 0)rA(C)}let I=nQ(A);if(I.isSymbolicLink()||!I.isFile()||!HB(Q,I))throw Error(`grok-build-cli refuses post-stop sandbox placeholder ${A}: file changed before removal`);E0(A)}function sj(A,Q=""){let B=nQ(A);if(B.isSymbolicLink()){if(Q==="agent_id")return;throw Error(`grok-build-cli refuses symlink in post-stop state: ${A}`)}let C=process.getuid?.();if(C!==void 0)EB(A,C,B.uid);if(Na(i6(A))){Ga(A,B,C);return}if(B.isDirectory()){C0(A,`post-stop directory ${A}`);for(let I of QG(A))sj(CA(A,I),Q?CA(Q,I):I);return}if(!B.isFile()||B.nlink!==1)throw Error(`grok-build-cli refuses non-private post-stop state: ${A}`);oj(A)}function r6(A){let Q=aA(A.stateHome),B=aA(A.projectCwd),C=aA(A.leaderSocket);if(A.stateHome!==Q||A.projectCwd!==B||A.leaderSocket!==C)throw Error("grok-build-cli post-stop cleanup requires canonical absolute paths");if(!Array.isArray(A.tuiProcessIds)||new Set(A.tuiProcessIds).size!==A.tuiProcessIds.length)throw Error("grok-build-cli post-stop cleanup requires unique TUI process ids");let I=A.tuiProcessIds.map((F)=>rj(Q,F));C0(Q,"post-stop state home");let E=WE(C);C0(E,"post-stop runtime directory");for(let F of jC.emptyStateFiles)eN(CA(Q,F),0);for(let F of jC.stateFiles)eN(CA(Q,F));let g=CA(Q,"sessions");if(IQ(g))C0(g,"post-stop sessions directory");let D=encodeURIComponent(B),U=CA(g,D);if(IQ(U))C0(U,"post-stop cwd session directory");for(let F of jC.cwdSessionFiles)eN(CA(U,F));for(let F of jC.sessionRootFiles)eN(CA(g,F));for(let F of jC.transientStateDirectories)Qa(CA(Q,F));for(let F of jC.transientStateDirectories)Ba(CA(Q,F));for(let F of I)aj(F);sj(Q),oj(Ya(C)),nj(B)}function $a(A,Q){let B=process.getuid?.(),C,I;try{C=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0)),I=qQ(Q,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let E=yQ(C),g=yQ(I),D=(N)=>N.isFile()&&N.nlink===1&&(B===void 0||N.uid===B)&&N.size>0&&N.size<=4096;if(!D(E)||GI()&&(E.mode&2)!==0||!D(g)||!fI(g.mode,384)||E.size!==g.size)return!1;let U=yU(C),F=yU(I),Y=yQ(C),J=yQ(I);return HB(E,Y)&&HB(g,J)&&E.size===Y.size&&g.size===J.size&&U.equals(F)}catch{return!1}finally{if(I!==void 0)rA(I);if(C!==void 0)rA(C)}}function Ma(A,Q,B){let C=CA(A,B),I=CA(Q,B);if(!uj(C))return;let E=IQ(I);if(E){if(E.isSymbolicLink()&&aA(WE(I),nr(I))===aA(C))return;if(E.isFile()&&!E.isSymbolicLink()&&$a(C,I))return;throw Error(`grok-build-cli refuses generated credential state at ${I}`)}or(C,I)}function Va(A){let Q=IQ(A);if(!Q)return;let B=process.getuid?.();if(B===void 0&&GI())throw Error("grok-build-cli requires Unix uid checks for source auth.json");if(Q.isSymbolicLink()||!Q.isFile()||Q.nlink!==1)throw Error("grok-build-cli source auth.json must be a single-link regular file");if(B!==void 0&&Q.uid!==B)throw Error("grok-build-cli source auth.json must be owned by the runtime uid");if(!fI(Q.mode,384))throw Error("grok-build-cli source auth.json must have mode 0600");let C;try{C=qQ(A,FA.O_RDONLY|(FA.O_NOFOLLOW||0));let I=yQ(C);if(!I.isFile()||I.nlink!==1||I.dev!==Q.dev||I.ino!==Q.ino)throw Error("grok-build-cli source auth.json changed during validation");if(B!==void 0&&I.uid!==B||!fI(I.mode,384))throw Error("grok-build-cli source auth.json changed security metadata during validation");return yU(C,"utf8")}catch(I){if(I?.code==="ELOOP")throw Error("grok-build-cli source auth.json must not be a symlink");throw I}finally{if(C!==void 0)rA(C)}}function a6(A){let Q=oQ(aA(A)),B=[],C=Q,I=!1;while(!0){if(B.push(C),IQ(CA(C,".git"))){I=!0;break}let g=WE(C);if(g===C)break;C=g}let E=I?B:[Q];return{directories:E,root:E[E.length-1]}}function tj(A){return a6(A).directories.flatMap((Q)=>[CA(Q,".grok"),CA(Q,".claude"),CA(Q,".cursor"),CA(Q,".mcp.json"),CA(Q,".envrc")])}function ej(A,Q=!1){for(let B of a6(A).directories){let C=CA(B,".grok"),I=IQ(C);if(I&&(I.isSymbolicLink()||!I.isDirectory()))throw Error(`grok-build-cli refuses project policy state at ${C}: expected a real directory`);for(let E of[".grok/hooks",".grok/plugins"]){let g=CA(B,E);if(!IQ(g))continue;throw Error(`grok-build-cli refuses project executable configuration at ${g}: Grok can execute it outside the model tool sandbox`)}if(!Q)continue;for(let E of[".grok",".claude",".cursor"]){let g=CA(B,E),D=IQ(g);if(D&&(D.isSymbolicLink()||!D.isDirectory()))throw Error(`grok-build-cli refuses project policy state at ${g}: expected a real directory`);if(D&&QG(g).length!==0)throw Error(`grok-build-cli refuses project executable configuration at ${g}: shared-TUI folder trust requires an empty project extension directory`)}for(let E of[".mcp.json",".envrc"]){let g=CA(B,E);if(!IQ(g))continue;throw Error(`grok-build-cli refuses project executable configuration at ${g}: folder trust would activate code outside the model tool sandbox`)}}}function A_(A,Q){let B=c6(A,Q);return B===""||B!==".."&&!B.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!p6(B)}function Wa(A,Q){let B=CA(Q,".anet"),C=aA(A.command),I=aA(A.serverPath),E=aA(A.envFile);if(A.command!==C||A.serverPath!==I||A.envFile!==E||I!==CA(B,"node-server.js")||E!==CA(B,".env"))throw Error("grok-build-cli commhub MCP paths must be the canonical project .anet artifacts");try{if(!fU(C).isFile()||oQ(C)!==C)throw Error("not canonical");mj(C,FA.X_OK)}catch{throw Error("grok-build-cli commhub MCP command is not a canonical executable file")}let g=process.getuid?.();for(let[D,U,F]of[[I,"server",void 0],[E,"environment",384]]){let Y=nQ(D);if(Y.isSymbolicLink()||!Y.isFile()||Y.nlink!==1||oQ(D)!==D||g!==void 0&&Y.uid!==g||F!==void 0&&!fI(Y.mode,F))throw Error(`grok-build-cli commhub MCP ${U} is not an owner-held canonical file`)}for(let[D,U]of[[A.alias,"alias"],[A.resumeId,"resume id"]])if(!D||/[\0\r\n]/.test(D))throw Error(`grok-build-cli commhub MCP ${U} is invalid`);return{command:C,serverPath:I,envFile:E,alias:A.alias,resumeId:A.resumeId,activeTaskFile:A.activeTaskFile}}function wa(A,Q,B){let C=(F,Y,J)=>{let N=nQ(F),G=qQ(F,FA.O_RDONLY|(FA.O_NOFOLLOW||0));try{let $=yQ(G),V=process.getuid?.();if(!$.isFile()||$.nlink!==1||$.dev!==N.dev||$.ino!==N.ino||V!==void 0&&$.uid!==V||J!==void 0&&!fI($.mode,J))throw Error(`grok-build-cli commhub MCP ${Y} changed during staging`);return yU(G,"utf8")}finally{rA(G)}},I=CA(B,"runtime-mcp");bU(I,"commhub MCP runtime directory");let E=CA(WE(Q),".anet-grok-credentials"),g=CA(E,i6(B));bU(E,"commhub MCP credential root"),bU(g,"commhub MCP credential directory");let D=CA(I,"node-server.js"),U=CA(g,".env");return _C(D,C(A.serverPath,"server")),_C(U,C(A.envFile,"environment",384)),{config:{...A,serverPath:D,envFile:U},credentialDir:g}}function s6(A,Q){return WE(A)===A||A===Q}function La(A,Q){try{let B=oQ(aA(A));if(!fU(B).isDirectory())return!1;return!s6(B,oQ(aA(Q??ij())))}catch{return!1}}function Xa(A,Q){let B=aA(A),C=oQ(B);if(C!==B)throw Error("grok-build-cli refuses folder trust through a symlinked project path");if(!fU(C).isDirectory())throw Error("grok-build-cli folder trust target must be a directory");let E=oQ(aA(ij()));if(s6(C,E))throw Error("grok-build-cli refuses over-broad folder trust for a home or filesystem root");for(let g of[E,...Q.map((D)=>aA(D))])if(A_(C,g))throw Error("grok-build-cli refuses folder trust overlapping runtime credential or state paths");return C}async function t6(A,Q="flock",B=process.env){let C=a6(A).root,I=oQ(C);if(!GI()){let $=CA(I,Ia),V=qQ($,FA.O_RDWR|FA.O_CREAT,384),M;try{M=await Ca($)}catch(Z){throw rA(V),Z}let W=!1;return{fd:V,async release(){if(W)return;W=!0,await M.release(),rA(V)}}}let E=!1;try{E=oQ(A)!==I}catch{E=!1}if(!fU(I).isDirectory())throw Error(`grok-build-cli project root is not a directory: ${I}`);let D=CA(I,".anet"),U=IQ(D);if(!U||U.isSymbolicLink()||!U.isDirectory())throw Error(`grok-build-cli requires a real project .anet directory for its turn lock: ${D}`);let F=CA(D,".grok-build-cli-turn.lock"),Y=qQ(F,FA.O_RDWR|FA.O_CREAT|(FA.O_NOFOLLOW||0),384);try{let $=yQ(Y);if(!$.isFile()||$.nlink!==1)throw Error(`grok-build-cli turn lock must be a single-link regular file: ${F}`);let V=process.getuid?.();if(V!==void 0)EB(F,V,$.uid);nB(()=>VE(Y,384))}catch($){throw rA(Y),$}let J="process.stdout.write('LOCKED\\n');process.stdin.resume()",N=pr(Q,["--no-fork","--exclusive","--nonblock","3",process.execPath,"-e",J],{cwd:I,env:pN(B),stdio:["pipe","pipe","pipe",Y]});try{await new Promise(($,V)=>{let M="",W="",Z=!1,z=setTimeout(()=>{if(Z)return;Z=!0,N.kill("SIGKILL"),V(Error("grok-build-cli timed out acquiring the project turn lock"))},3000);z.unref?.();let X=(O)=>{if(Z)return;Z=!0,clearTimeout(z),V(Error(O))};N.stdout.setEncoding("utf8"),N.stdout.on("data",(O)=>{if(M=(M+O).slice(-64),!Z&&M.includes(`LOCKED
86
86
  `))Z=!0,clearTimeout(z),$()}),N.stderr.setEncoding("utf8"),N.stderr.on("data",(O)=>{W=(W+O).slice(-500)}),N.once("error",(O)=>X(`grok-build-cli could not start flock: ${O.message}`)),N.once("exit",(O)=>{if(!Z)X(O===1?`grok-build-cli project is busy; concurrent turns are refused (lock ${F}${E?`, resolved by walking up from ${A} — see issue #884`:""})`:`grok-build-cli flock holder exited before acquisition (${O??"signal"}${W?`: ${W.trim()}`:""})`)})})}catch($){throw rA(Y),$}let G=!1;return{fd:Y,async release(){if(G)return;G=!0,await new Promise(($)=>{if(N.exitCode!==null||N.signalCode!==null)return $();let V=setTimeout(()=>{N.kill("SIGKILL"),$()},1000);V.unref?.(),N.once("exit",()=>{clearTimeout(V),$()}),N.stdin.end()}),rA(Y)}}}function Za(A){let Q;try{Q=JSON.parse(A)}catch{throw Error("grok-build-cli hook audit returned invalid JSON")}if(!Q||typeof Q!=="object"||!Array.isArray(Q.hooks))throw Error("grok-build-cli hook audit response is missing the hooks array");let B=0,C=(E)=>{if(!E||typeof E!=="object")return;if(typeof E.hookCount==="number"&&E.hookCount>0)B+=E.hookCount;if(Array.isArray(E.hooks)&&E!==Q)B+=E.hooks.length;if(Array.isArray(E))E.forEach(C);else Object.values(E).forEach(C)};if(Q.plugins)C(Q.plugins);let I=Q.hooks.length+B;if(I>0)throw Error(`grok-build-cli refuses to start: grok inspect discovered ${I} executable hook${I===1?"":"s"} outside the model tool sandbox`)}function Ka(A){let Q=aA(A.sourceHome),B=aA(A.stateRoot),C=aA(A.stateHome),I=CA(Q,"auth.json"),E=[...new Set(A.denyPaths.filter(Boolean).map((d)=>aA(d)))],g=IQ(Q);if(!g||g.isSymbolicLink()||!g.isDirectory())throw Error("grok-build-cli source GROK_HOME must be an existing real directory");if(oQ(Q)!==Q)throw Error("grok-build-cli source GROK_HOME must not traverse a symlinked ancestor");let D=c6(B,C);if(!D||D==="."||D===".."||D.startsWith(`..${process.platform==="win32"?"\\":"/"}`)||p6(D)||WE(D)!==".")throw Error(`grok-build-cli isolated state home must be one direct child of ${B}`);if(Q===C)throw Error("grok-build-cli source GROK_HOME and isolated state home must be different");if(A.useLeader===!0&&!A.projectCwd)throw Error("grok-build-cli shared TUI requires an explicit project cwd for folder trust");if(A.useLeader===!0&&E.some((d)=>A_(d,I)))throw Error("grok-build-cli shared TUI auth path overlaps a required sandbox deny; choose a separate GROK_HOME");let U=A.projectCwd?A.useLeader===!0?Xa(A.projectCwd,[Q,B,C,I]):oQ(aA(A.projectCwd)):void 0;if(U)ej(U,A.useLeader===!0);let F=A.commhubMcp?Wa(A.commhubMcp,U):void 0,Y=Va(I);bU(B,"isolated state root"),bU(C,"isolated state home");let J=F?wa(F,B,C):void 0,N=J?.config;pj(C);for(let d of["hooks","hooks-paths","plugins","agents","skills","commands","lsp","lsp-servers","lsp.json","settings.json","managed_config.toml","requirements.toml"])E0(CA(C,d),{recursive:!0,force:!0});let G=CA(C,".sandbox-profile-id"),$=(ga(G)||"").trim();if(!/^anet-[a-f0-9]{24}$/.test($))$=`anet-${l6(12).toString("hex")}`,_C(G,`${$}
87
87
  `);let V=`${$}-read-only`,M=`${$}-strict`,W=`${$}-workspace`;if(!E.filter((d)=>uj(d)).length)throw Error("grok-build-cli cannot create a sandbox without an existing secret path to deny");let z=[...new Set([...E,...A.useLeader===!0?[]:[I],...A.projectCwd?tj(A.projectCwd):[]])],O=z.filter((d)=>!z.some((k)=>{if(k===d)return!1;let l=c6(k,d);return l!==""&&l!==".."&&!l.startsWith(`..${process.platform==="win32"?"\\":"/"}`)})).map((d)=>JSON.stringify(d)).join(", ");_C(CA(C,"config.toml"),["[cli]",`use_leader = ${A.useLeader===!0?"true":"false"}`,"",...A.useLeader===!0?["[ui]",'default_selected_permission = "always_allow_all_sessions"',"remember_tool_approvals = true",""]:[],"[compat.claude]","mcps = false","hooks = false","","[compat.cursor]","mcps = false","hooks = false","",...N?["[mcp_servers.commhub]",`command = ${JSON.stringify(N.command)}`,`args = [${JSON.stringify(N.serverPath)}]`,`env = { ANET_COMMHUB_ENV_FILE = ${JSON.stringify(N.envFile)}, ANET_COMMHUB_MODE = "outbound-only", ${N.activeTaskFile?`ANET_ACTIVE_NETWORK_TASK_FILE = ${JSON.stringify(N.activeTaskFile)}, `:""}COMMHUB_ALIAS = ${JSON.stringify(N.alias)}, COMMHUB_RESUME_ID = ${JSON.stringify(N.resumeId)} }`,"enabled = true",""]:[],"[folder_trust]","enabled = true","","[session]","load_envrc = false","","[features]","telemetry = false","","[telemetry]","mixpanel_enabled = false","trace_upload = false","","[toolset.bash]","auto_background_on_timeout = false",""].join(`
88
88
  `));let j=CA(C,"trusted_folders.toml");if(A.useLeader===!0)_C(j,[`[folders.${JSON.stringify(U)}]`,"trusted = true",`decided_at = ${Math.floor(Date.now()/1000)}`,""].join(`
@@ -221,7 +221,7 @@ ${A}`}function d3(A,Q,B,C,I){let{interactiveDashboardTask:E,messageType:g}=B,D=Z
221
221
  `,"config.json",Q?.stat),{config:I,source:"prev",primaryError:B}}function j7(A){return JSON.parse(tg(A,"config.json").body)}function _7(A,Q){let B=tg(A,"config.json");bN(A,JSON.stringify(Q,null,2)+`
222
222
  `,"config.json",B.stat)}function q7(A){let Q=tg(A,"config.json");return bN(`${A}.prev`,Q.body,"config.json.prev"),{backedUp:!0}}function O7(A,Q){let B=tg(A,"config.json"),C=JSON.parse(B.body);if(C.session===Q)return!1;return C.session=Q,bN(A,JSON.stringify(C,null,2)+`
223
223
  `,"config.json",B.stat),!0}lN();async function f7(A,Q){let B=!1,C;for(let I of A)try{await Q(I)}catch(E){if(!B)C=E;B=!0}if(B)throw C}function N6(A,Q){let B=Promise.resolve(),C=new Map,I=async(E)=>{let g=Q?.initialDelayMs??0;while(!0)try{await E();return}catch(D){if(A(D),!Q)return;await new Promise((U)=>{setTimeout(U,g).unref?.()}),g=Math.min(g*2,Q.maxDelayMs)}};return{schedule(E){let g=C.get(E);if(g){g.dirty=!0;return}let D={dirty:!1};C.set(E,D);let U=async()=>{try{do D.dirty=!1,await I(E);while(D.dirty)}finally{C.delete(E)}};B=B.then(U,U)},idle(){return B}}}function h7(A){if(A.meta&&typeof A.meta==="object"&&!Array.isArray(A.meta))return A.meta;if(typeof A.meta_json!=="string"||A.meta_json.length===0)return null;try{let Q=JSON.parse(A.meta_json);return Q&&typeof Q==="object"&&!Array.isArray(Q)?Q:null}catch{return null}}function G6(A){let Q=A.type??"task";if(Q!=="task"&&Q!=="broadcast")return!1;let B=h7(A);if(!B||B.source!=="dashboard-chat")return!1;if(typeof B.client_request_id!=="string"||!/^dreq_[a-f0-9]{32}$/.test(B.client_request_id))return!1;return B.auth_origin==="user"}function m7(A){if(!G6(A))return null;let Q=h7(A)?.client_request_id;return typeof Q==="string"?Q:null}async function u7(A,Q){for(let B of A)await Q(B)}function c7(A){if(!Number.isInteger(A.maxConcurrent)||A.maxConcurrent<1)throw Error("maxConcurrent must be a positive integer");let Q=new Set,B=new Set,C=[],I=()=>{while(Q.size<A.maxConcurrent&&C.length>0){let E=C.shift(),g=A.key(E.message);B.delete(g),Q.add(g);let D;try{D=E.handler(E.message)}catch(U){D=Promise.reject(U)}D.catch(A.onError).finally(()=>{Q.delete(g);try{A.onSettled?.()}catch(U){A.onError(U)}finally{I()}})}};return{submit(E,g){let D=0,U=0;for(let F of E){let Y=A.key(F);if(Q.has(Y)||B.has(Y)){U++;continue}B.add(Y),C.push({message:F,handler:g}),D++}return I(),{active:Q.size,queued:C.length,accepted:D,deduplicated:U}},stats(){return{active:Q.size,queued:C.length}}}}function l7(A,Q){return A!=="codex-app-server"||Q===0}var Lo={self:"sender alias equals node alias; reply-loop guard","own-prefix":"message carries this node's own reply prefix; reply-loop guard",cooldown:"sender cooldown is active","low-value-inbound":"non-task message matched the low-value filter"};function i7(A){let Q=Lo[A.reason]||"inbound filter rejected the message";return`skipped inbound ${A.messageType} ${A.taskId} from ${A.sender}: ${A.reason} (${Q}); acknowledged without model delivery`}function iN(){let A=null;return{run(Q){if(A)return A;let B=Promise.resolve().then(Q);return A=B,B.finally(()=>{if(A===B)A=null}).catch(()=>{}),B},pending(){return A}}}function p7(){let A=null,Q=iN();return{async getOrOpen(B){if(A?.isRunning)return A;return Q.run(async()=>{if(A?.isRunning)return A;A=null;let C=await B();if(!C.isRunning)throw Error("codex app-server session stopped while opening");return A=C,C})},invalidate(B){if(!B||A===B)A=null},current(){return A},pending(){return Q.pending()}}}jU();import{closeSync as _U,constants as pI,existsSync as Ro,fchmodSync as dN,fstatSync as n7,fsyncSync as jo,ftruncateSync as _o,lstatSync as qo,mkdirSync as Oo,openSync as w6,readdirSync as To,readFileSync as So,realpathSync as W6,writeSync as Po}from"node:fs";import{join as o7,resolve as L6}from"node:path";function r7(){return process.platform==="linux"&&Ro("/proc/self/fd")}function a7(A,Q){return r7()?`/proc/self/fd/${A}`:Q}function s7(A,Q){let B=n7(A),C=process.getuid?.();if(!B.isFile()||B.nlink!==1||C!==void 0&&B.uid!==C)throw Error(`private log is not a single owner-controlled file: ${Q}`);dN(A,384)}function t7(A){let Q=L6(A);if(W6(Q)!==Q)throw Error(`private log directory is not canonical: ${Q}`);let B=w6(Q,pI.O_RDONLY|(pI.O_DIRECTORY||0)|(pI.O_NOFOLLOW||0));try{let C=n7(B),I=process.getuid?.();if(!C.isDirectory()||I!==void 0&&C.uid!==I)throw Error(`private log directory is not owner-controlled: ${Q}`);if(r7()&&W6(`/proc/self/fd/${B}`)!==Q)throw Error(`private log directory changed during validation: ${Q}`);if(process.platform!=="win32")dN(B,448);return B}catch(C){throw _U(B),C}}function e7(A,Q,B){let C=0;while(C<Q.length){let I=Po(A,Q,C,Q.length-C,B===null?null:B+C);if(I<=0)throw Error("private log write made no progress");C+=I}}function xo(A,Q){let B=w6(A,pI.O_RDWR|(pI.O_NOFOLLOW||0));try{s7(B,A);let C=Buffer.from(Q.redactText(So(B,"utf8")).text,"utf8");if(_o(B,0),C.length>0)e7(B,C,0);jo(B),dN(B,384)}finally{_U(B)}}function Aj(A,Q){let B=L6(A);Oo(B,{recursive:!0,mode:448});let C=qo(B),I=process.getuid?.();if(C.isSymbolicLink()||!C.isDirectory()||W6(B)!==B||I!==void 0&&C.uid!==I)throw Error(`private log directory is not owner-controlled: ${B}`);let E=t7(B);try{let g=a7(E,B);for(let D of To(g)){if(!D.endsWith(".log"))continue;xo(o7(g,D),Q)}}finally{_U(E)}return B}function Qj(A,Q,B,C){if(!/^\d{4}-\d{2}-\d{2}\.log$/.test(Q))throw Error("private log filename is not a canonical daily log name");let I=t7(A),E=o7(a7(I,L6(A)),Q),g;try{g=w6(E,pI.O_WRONLY|pI.O_CREAT|pI.O_APPEND|(pI.O_NOFOLLOW||0),384),s7(g,E);let D=Buffer.from(C.redactText(B).text,"utf8");if(D.length>0)e7(g,D,null);dN(g,384)}finally{if(g!==void 0)_U(g);_U(I)}}function X6(A){return JSON.stringify(A)}function Bj(A){let Q=A.configNodeId||"",B=A.envNodeId||"";if(Q){if(B&&B!==Q)A.warn?.(`COMMHUB_NODE_ID mismatch: env=${X6(B)} config=${X6(Q)} config_path=${X6(A.configPath||"config.json")}; ignoring env COMMHUB_NODE_ID, using config node_id`);return{value:Q,source:"config"}}if(B)return{value:B,source:"env"};return{value:"",source:"none"}}function ko(A){let Q=A?.task_id||A?.message_id||A?.id;if(Q)return String(Q);let B=A?.content?.[0]?.text;if(typeof B!=="string")return null;try{let C=JSON.parse(B);return C?.task_id||C?.message_id||C?.id||null}catch{return null}}function Q0(A,Q,B,C={}){let I=YN({from_alias:A.fromAlias,to_alias:A.toAlias,task_id:B,parent_task_id:A.parentTaskId,network_id:A.networkId,transport:"mcp_http",status:Q,duration_ms:Date.now()-A.startedAt,lifecycle_tracking:"tracked",...C.errorCode?{error_code:C.errorCode}:{},...C.errorMessage?{error_message:UN(C.errorMessage)}:{}});if(C.event)I.event=C.event;A.log(FN(I))}async function Ij(A,Q,B){let C=B.now??Date.now,I=B.sleep??((V)=>new Promise((M)=>setTimeout(M,V))),E=B.timeoutMs??120000,g=B.pollIntervalMs??2000,D=B.stale30Ms??30000,U=B.stale60Ms??60000,F=B.emit,Y=C()+E,J=null,N=new Set,G=!1,$=!1;while(C()<Y){J=await B.getTask(A);let V=J?.task||J,M=V?.status;if((M==="acked"||M==="running"||M==="processing")&&!N.has(M))N.add(M),F(M==="acked"?"acked":"started",A);if(M==="replied"||M==="failed"||M==="cancelled")return F(M==="replied"?"replied":"failed",A,{...M==="replied"?{}:{errorCode:`task_${M}`,event:"task.failed"}}),{kind:"terminal",status:M,latest:J,row:V};let W=C()-Q;if(!G&&W>=D&&M==="delivered")G=!0,F("delivered",A,{event:"task.warning.delivered_stale_30s"});if(!$&&W>=U&&M==="delivered")$=!0,F("delivered",A,{event:"task.warning.delivered_stale_60s"});await I(g)}return F("expired",A,{errorCode:"lifecycle_timeout"}),{kind:"expired",latest:J}}async function Cj(A,Q,B){Q0(Q,"sending",null);try{let C=await B({alias:A.alias,task:A.task,priority:A.priority||"normal",from_session:Q.fromAlias,parent_task_id:Q.parentTaskId||void 0}),I=ko(C);if(!I)Q0(Q,"failed",null,{errorCode:"missing_task_id",errorMessage:"CommHub response omitted task_id"});else Q0(Q,"delivered",I);return C}catch(C){throw Q0(Q,"failed",null,{errorCode:"send_failed",errorMessage:C}),C}}function Ej(A){let Q=A||"task";if(Q==="task"||Q==="broadcast")return{deliverToRuntime:!0,replyExpected:!0};if(Q==="reply")return{deliverToRuntime:!0,replyExpected:!1};return{deliverToRuntime:!1,replyExpected:!1}}async function gj(A,Q,B){let C=await B.deliverToRuntime(A);if(Q)return{kind:"request",result:C};return await B.acknowledge(A.id),{kind:"terminal_peer_reply",result:C}}function Dj(A,Q){if(A.type!=="new_reply")return!1;return Q(),!0}function Z6(){return{hubSupportsTool:null}}function vo(A){if(!(A instanceof mB))return!1;if(A.code===-32601)return!0;let Q=String(A.message||"");return A.code===-32602&&/(?:unknown|not found|does not exist).{0,80}send_peer_reply|send_peer_reply.{0,80}(?:unknown|not found|does not exist)/i.test(Q)}function bo(A){if(!(A instanceof mB))return!1;return A.code==="peer_reply_unsupported"||A.code==="peer_reply_origin_not_node"||A.code==="reply_task_not_owned"||A.code==="peer_reply_node_token_required"||vo(A)}async function Uj(A,Q,B=Z6()){try{let C=await Q.sendAtomic(A);return B.hubSupportsTool=!0,{route:"atomic",payload:C}}catch(C){if(!bo(C))throw C;return{route:"legacy-reply",payload:await Q.sendLegacyReply(A)}}}import{chmodSync as Fj,closeSync as K6,existsSync as yo,fchmodSync as fo,fsyncSync as ho,openSync as Yj,readFileSync as mo,renameSync as uo,unlinkSync as Jj,writeFileSync as co}from"node:fs";import{randomBytes as lo}from"node:crypto";var Nj=15000,io=2500,Mj=300000,qU=2000,po=new Set(["replied","failed","cancelled","expired"]);function H6(A){if(A===void 0||A===null||String(A).trim()==="")return Nj;let Q=Number(A);if(!Number.isSafeInteger(Q))return Nj;return Math.min(Mj,Math.max(io,Q))}function z6(){return{version:3,consumed_task_ids:[],consumed_client_request_ids:[],surfaced_outbound_terminal_ids:[],outbound_deliveries:[],outbound_terminal_watermark:0,inbound_lifecycle:[],last_success_at:null}}function RC(A){if(!Array.isArray(A))return[];return[...new Set(A.filter((Q)=>typeof Q==="string"&&Q.length>0&&Q.length<=512))].slice(-qU)}function no(A){if(!A||typeof A!=="object")return z6();let Q=A;return{version:3,consumed_task_ids:RC(Q.consumed_task_ids),consumed_client_request_ids:RC(Q.consumed_client_request_ids),surfaced_outbound_terminal_ids:RC(Q.surfaced_outbound_terminal_ids),outbound_deliveries:Array.isArray(Q.outbound_deliveries)?Q.outbound_deliveries.filter((B)=>!!B&&typeof B.task_id==="string"&&typeof B.idempotency_key==="string"&&["pending","delivering","delivered"].includes(B.state)).slice(-qU):RC(Q.surfaced_outbound_terminal_ids).map((B)=>({task_id:B,idempotency_key:`commhub-terminal:${B}`,state:"delivered"})),outbound_terminal_watermark:Number.isSafeInteger(Q.outbound_terminal_watermark)&&Number(Q.outbound_terminal_watermark)>=0?Number(Q.outbound_terminal_watermark):0,inbound_lifecycle:Array.isArray(Q.inbound_lifecycle)?Q.inbound_lifecycle.filter((B)=>!!B&&typeof B.task_id==="string"&&["delivered","submitted","consumed","completed"].includes(B.state)).slice(-qU):RC(Q.consumed_task_ids).map((B)=>({task_id:B,state:"consumed"})),last_success_at:typeof Q.last_success_at==="string"?Q.last_success_at:null}}function Gj(A){return m7(A)}function $j(A){return typeof A.task_id==="string"&&A.task_id?A.task_id:A.id}function oo(A){let Q=A,B=String(Q?.message??A??"");return Q?.code===-32601||Q?.code===-32602||/unknown tool|tool .+ not found|method not found|-3260[12]/i.test(B)}class Vj{path;state;constructor(A){this.path=A;this.state=this.read()}snapshot(){return this.state=this.read(),this.state}update(A){this.withLock(()=>{let Q=this.read();A(Q),Q.consumed_task_ids=RC(Q.consumed_task_ids),Q.consumed_client_request_ids=RC(Q.consumed_client_request_ids),Q.surfaced_outbound_terminal_ids=RC(Q.surfaced_outbound_terminal_ids),Q.outbound_deliveries=Q.outbound_deliveries.filter((B)=>B.state!=="delivered").slice(-qU),Q.inbound_lifecycle=Q.inbound_lifecycle.slice(-qU),this.write(Q),this.state=Q})}claimOutbound(A,Q,B,C){return this.withLock(()=>{let I=this.read(),E=I.outbound_deliveries.find((g)=>g.task_id===A);if(E?.state==="delivered"||E?.state==="delivering"&&(E.lease_until??0)>B)return!1;if(E)E.state="delivering",E.lease_until=B+C;else I.outbound_deliveries.push({task_id:A,idempotency_key:Q,state:"delivering",lease_until:B+C});return this.write(I),this.state=I,!0},!1)}withLock(A,Q){let B=`${this.path}.lock`,C;try{C=Yj(B,"wx",384)}catch{if(arguments.length>1)return Q;throw Error("compensation cursor is locked")}try{return A()}finally{K6(C);try{Jj(B)}catch{}}}read(){if(!yo(this.path))return z6();try{let A=no(JSON.parse(mo(this.path,"utf8")));return Fj(this.path,384),A}catch{return z6()}}write(A){let Q=`${this.path}.tmp-${process.pid}-${lo(6).toString("hex")}`,B=null;try{B=Yj(Q,"wx",384),fo(B,384),co(B,`${JSON.stringify(A)}
224
- `,"utf8"),ho(B),K6(B),B=null,uo(Q,this.path),Fj(this.path,384)}finally{if(B!==null)K6(B);try{Jj(Q)}catch{}}}}function Wj(A){let Q=H6(A.intervalMs),B=A.adapters,C=new Vj(A.cursorPath),I="probing",E=null,g=!1,D=!1,U=null,F=0,Y=!1,J=B.now??Date.now,N=Math.max(30000,Q*2),G=B.setTimer??((j,v)=>{let m=setTimeout(j,v);return m.unref?.(),m}),$=B.clearTimer??((j)=>clearTimeout(j)),V=(j)=>{let v=C.snapshot(),m=$j(j),h=Gj(j);return v.consumed_task_ids.includes(m)||!!h&&v.consumed_client_request_ids.includes(h)},M=(j)=>{let v=$j(j),m=Gj(j);C.update((h)=>{if(h.consumed_task_ids.push(v),m)h.consumed_client_request_ids.push(m);let d=h.inbound_lifecycle.find((k)=>k.task_id===v);if(d)d.state="completed";else h.inbound_lifecycle.push({task_id:v,state:"completed"})})},W={delivered:0,submitted:1,consumed:2,completed:3},Z=(j,v)=>{if(!j)return;C.update((m)=>{let h=m.inbound_lifecycle.find((d)=>d.task_id===j);if(!h)m.inbound_lifecycle.push({task_id:j,state:v});else if(W[v]>W[h.state])h.state=v;if(W[v]>=W.consumed)m.consumed_task_ids.push(j)})},z=(j)=>{if(D||I==="realtime-only")return;if(U!==null)$(U);U=G(()=>{U=null,O("timer")},j)},X=async(j)=>{try{let v=C.snapshot().outbound_terminal_watermark,[m,h]=await Promise.all([B.getInbox(),B.listOutbound(v)]),d=h.tasks;if(I==="probing")I="active",B.log(`[commhub-compensation] active (${Q}ms; SSE remains primary)`);if(m.some((k)=>!V(k)))B.scheduleInboxDrain();for(let k of d){if(!k?.task_id||!po.has(k.status))continue;if(!Number.isSafeInteger(k.terminal_seq)||Number(k.terminal_seq)<=0)throw Object.assign(Error("Hub terminal sequence missing"),{code:-32602});let l=Number(k.terminal_seq),bA=C.snapshot();if(l<=bA.outbound_terminal_watermark)continue;let FQ=C.snapshot().outbound_deliveries.find((cA)=>cA.task_id===k.task_id);if(FQ?.state==="delivered"){C.update((cA)=>{cA.outbound_terminal_watermark=Math.max(cA.outbound_terminal_watermark,l)});continue}let YQ=FQ?.idempotency_key??`commhub-terminal:${k.task_id}`;if(!C.claimOutbound(k.task_id,YQ,J(),N))break;try{await B.onOutboundTerminal(k,YQ)}catch(cA){throw C.update((YA)=>{let BQ=YA.outbound_deliveries.find((JQ)=>JQ.task_id===k.task_id);if(BQ)BQ.state="pending",BQ.lease_until=0}),cA}C.update((cA)=>{let YA=cA.outbound_deliveries.find((BQ)=>BQ.task_id===k.task_id);if(YA)YA.state="delivered",YA.lease_until=0;cA.outbound_terminal_watermark=Math.max(cA.outbound_terminal_watermark,l)})}if(C.update((k)=>{k.last_success_at=new Date(J()).toISOString()}),h.hasMore)g=!0;F=0,B.log(`[commhub-compensation] ${j} poll ok; inbox=${m.length} outbound=${d.length}`),z(Q)}catch(v){if(oo(v)){if(I="realtime-only",!Y)Y=!0,B.warn("[commhub-compensation] Hub lacks durable inbox/outbox polling capability; realtime-only mode (SSE/turn-steer only)");return}F++;let m=Math.min(Mj,Q*2**Math.min(F,5));B.warn(`[commhub-compensation] poll failed; retry in ${m}ms: ${v instanceof Error?v.message:String(v)}`),z(m)}},O=(j)=>{if(D||I==="realtime-only")return;if(E){g=!0;return}E=(async()=>{let v=j;do g=!1,await X(v),v="idle";while(g&&!D&&I!=="realtime-only")})().finally(()=>{E=null})};return{get mode(){return I},trigger:O,recordConsumed:M,recordLifecycle:Z,wasConsumed:V,async idle(){await E},stop(){if(D=!0,U!==null)$(U);U=null}}}import{appendFileSync as xu,mkdirSync as y2}from"fs";var wj={name:"@sleep2agi/agent-node",version:"2.5.0-preview.60",description:"AI Agent runtime for CommHub networks. Supports Claude Code CLI, Claude Agent SDK, Codex SDK, Codex app-server, Grok Build ACP, and OpenCode CLI.",bin:{"agent-node":"dist/cli.js"},type:"module",files:["dist","README.md"],scripts:{build:"bun build src/cli.ts --outdir dist --entry-naming cli.js --target node --minify --external @anthropic-ai/claude-agent-sdk --external '@anthropic-ai/claude-agent-sdk-*' --external @openai/codex-sdk --external node-pty && bun build src/upload-file-mcp-stdio.ts --outdir dist --entry-naming upload-file-mcp-stdio.js --target node --minify",prepublishOnly:"npm run build"},keywords:["agent","ai","commhub","claude","claude-code","codex","gpt5","grok","xai","grok-build-cli","copresence","acp","sdk","minimax","mimo","runtime","node","anthropic"],author:"sleep2agi",license:"Apache-2.0",homepage:"https://anet.sh",repository:{type:"git",url:"git+https://github.com/sleep2agi/agent-network.git",directory:"agent-node"},publishConfig:{access:"public",tag:"preview"},bugs:{url:"https://github.com/sleep2agi/agent-network/issues"},engines:{node:">=18.17.0"},dependencies:{"@anthropic-ai/claude-agent-sdk":"^0.3.226",undici:"^6.27.0",zod:"^4.4.3"},optionalDependencies:{"@openai/codex":"^0.133.0","@openai/codex-sdk":"^0.133.0","node-pty":"^1.1.0"}};var __dirname="/home/runner/work/agent-network/agent-network/agent-node/src";function Zu(){let A=t2(import.meta.url,process.argv[1]);return A?A.replace(/\/+$/,"")+"/dist":__dirname}var V2A={};function W2A(){return W7({role:_?.role,probe:()=>(xU(),a2(sN)).probeAnetBinReadiness(),now:()=>Date.now(),log:L,logState:V2A})}var XB=M2A(),w2A=Z6(),Ku=process.env.ANET_OPENCODE_BIN,YY=process.env.ANET_OPENCODE_VERSION,zu=process.env.PATH||"",sm=process.env.ANET_OPENCODE_SAFE_BASE,AB=process.argv.slice(2),WA={},Hu=[];if(AB.length===1&&AB[0]==="--print-entrypoint")console.log(G2A(process.argv[1])),process.exit(0);var Ru="2.1.0";try{let A=new URL(".",import.meta.url).pathname;for(let Q of["../package.json","../../package.json"])try{let B=JSON.parse(JI(gA(A,Q),"utf-8"));if(B.version){Ru=B.version;break}}catch{}}catch{}for(let A=0;A<AB.length;A++){if(AB[A]==="--version"||AB[A]==="-v")console.log(`agent-node v${Ru}`),process.exit(0);if(AB[A]==="-h"||AB[A]==="--help")console.log(`
224
+ `,"utf8"),ho(B),K6(B),B=null,uo(Q,this.path),Fj(this.path,384)}finally{if(B!==null)K6(B);try{Jj(Q)}catch{}}}}function Wj(A){let Q=H6(A.intervalMs),B=A.adapters,C=new Vj(A.cursorPath),I="probing",E=null,g=!1,D=!1,U=null,F=0,Y=!1,J=B.now??Date.now,N=Math.max(30000,Q*2),G=B.setTimer??((j,v)=>{let m=setTimeout(j,v);return m.unref?.(),m}),$=B.clearTimer??((j)=>clearTimeout(j)),V=(j)=>{let v=C.snapshot(),m=$j(j),h=Gj(j);return v.consumed_task_ids.includes(m)||!!h&&v.consumed_client_request_ids.includes(h)},M=(j)=>{let v=$j(j),m=Gj(j);C.update((h)=>{if(h.consumed_task_ids.push(v),m)h.consumed_client_request_ids.push(m);let d=h.inbound_lifecycle.find((k)=>k.task_id===v);if(d)d.state="completed";else h.inbound_lifecycle.push({task_id:v,state:"completed"})})},W={delivered:0,submitted:1,consumed:2,completed:3},Z=(j,v)=>{if(!j)return;C.update((m)=>{let h=m.inbound_lifecycle.find((d)=>d.task_id===j);if(!h)m.inbound_lifecycle.push({task_id:j,state:v});else if(W[v]>W[h.state])h.state=v;if(W[v]>=W.consumed)m.consumed_task_ids.push(j)})},z=(j)=>{if(D||I==="realtime-only")return;if(U!==null)$(U);U=G(()=>{U=null,O("timer")},j)},X=async(j)=>{try{let v=C.snapshot().outbound_terminal_watermark,[m,h]=await Promise.all([B.getInbox(),B.listOutbound(v)]),d=h.tasks;if(I==="probing")I="active",B.log(`[commhub-compensation] active (${Q}ms; SSE remains primary)`);if(m.some((k)=>!V(k)))B.scheduleInboxDrain();for(let k of d){if(!k?.task_id||!po.has(k.status))continue;if(!Number.isSafeInteger(k.terminal_seq)||Number(k.terminal_seq)<=0)throw Object.assign(Error("Hub terminal sequence missing"),{code:-32602});let l=Number(k.terminal_seq),bA=C.snapshot();if(l<=bA.outbound_terminal_watermark)continue;let FQ=C.snapshot().outbound_deliveries.find((cA)=>cA.task_id===k.task_id);if(FQ?.state==="delivered"){C.update((cA)=>{cA.outbound_terminal_watermark=Math.max(cA.outbound_terminal_watermark,l)});continue}let YQ=FQ?.idempotency_key??`commhub-terminal:${k.task_id}`;if(!C.claimOutbound(k.task_id,YQ,J(),N))break;try{await B.onOutboundTerminal(k,YQ)}catch(cA){throw C.update((YA)=>{let BQ=YA.outbound_deliveries.find((JQ)=>JQ.task_id===k.task_id);if(BQ)BQ.state="pending",BQ.lease_until=0}),cA}C.update((cA)=>{let YA=cA.outbound_deliveries.find((BQ)=>BQ.task_id===k.task_id);if(YA)YA.state="delivered",YA.lease_until=0;cA.outbound_terminal_watermark=Math.max(cA.outbound_terminal_watermark,l)})}if(C.update((k)=>{k.last_success_at=new Date(J()).toISOString()}),h.hasMore)g=!0;F=0,B.log(`[commhub-compensation] ${j} poll ok; inbox=${m.length} outbound=${d.length}`),z(Q)}catch(v){if(oo(v)){if(I="realtime-only",!Y)Y=!0,B.warn("[commhub-compensation] Hub lacks durable inbox/outbox polling capability; realtime-only mode (SSE/turn-steer only)");return}F++;let m=Math.min(Mj,Q*2**Math.min(F,5));B.warn(`[commhub-compensation] poll failed; retry in ${m}ms: ${v instanceof Error?v.message:String(v)}`),z(m)}},O=(j)=>{if(D||I==="realtime-only")return;if(E){g=!0;return}E=(async()=>{let v=j;do g=!1,await X(v),v="idle";while(g&&!D&&I!=="realtime-only")})().finally(()=>{E=null})};return{get mode(){return I},trigger:O,recordConsumed:M,recordLifecycle:Z,wasConsumed:V,async idle(){await E},stop(){if(D=!0,U!==null)$(U);U=null}}}import{appendFileSync as xu,mkdirSync as y2}from"fs";var wj={name:"@sleep2agi/agent-node",version:"2.5.0-preview.61",description:"AI Agent runtime for CommHub networks. Supports Claude Code CLI, Claude Agent SDK, Codex SDK, Codex app-server, Grok Build ACP, and OpenCode CLI.",bin:{"agent-node":"dist/cli.js"},type:"module",files:["dist","README.md"],scripts:{build:"bun build src/cli.ts --outdir dist --entry-naming cli.js --target node --minify --external @anthropic-ai/claude-agent-sdk --external '@anthropic-ai/claude-agent-sdk-*' --external @openai/codex-sdk --external node-pty && bun build src/upload-file-mcp-stdio.ts --outdir dist --entry-naming upload-file-mcp-stdio.js --target node --minify",prepublishOnly:"npm run build"},keywords:["agent","ai","commhub","claude","claude-code","codex","gpt5","grok","xai","grok-build-cli","copresence","acp","sdk","minimax","mimo","runtime","node","anthropic"],author:"sleep2agi",license:"Apache-2.0",homepage:"https://anet.sh",repository:{type:"git",url:"git+https://github.com/sleep2agi/agent-network.git",directory:"agent-node"},publishConfig:{access:"public",tag:"preview"},bugs:{url:"https://github.com/sleep2agi/agent-network/issues"},engines:{node:">=18.17.0"},dependencies:{"@anthropic-ai/claude-agent-sdk":"^0.3.226",undici:"^6.27.0",zod:"^4.4.3"},optionalDependencies:{"@openai/codex":"^0.133.0","@openai/codex-sdk":"^0.133.0","node-pty":"^1.1.0"}};var __dirname="/home/runner/work/agent-network/agent-network/agent-node/src";function Zu(){let A=t2(import.meta.url,process.argv[1]);return A?A.replace(/\/+$/,"")+"/dist":__dirname}var V2A={};function W2A(){return W7({role:_?.role,probe:()=>(xU(),a2(sN)).probeAnetBinReadiness(),now:()=>Date.now(),log:L,logState:V2A})}var XB=M2A(),w2A=Z6(),Ku=process.env.ANET_OPENCODE_BIN,YY=process.env.ANET_OPENCODE_VERSION,zu=process.env.PATH||"",sm=process.env.ANET_OPENCODE_SAFE_BASE,AB=process.argv.slice(2),WA={},Hu=[];if(AB.length===1&&AB[0]==="--print-entrypoint")console.log(G2A(process.argv[1])),process.exit(0);var Ru="2.1.0";try{let A=new URL(".",import.meta.url).pathname;for(let Q of["../package.json","../../package.json"])try{let B=JSON.parse(JI(gA(A,Q),"utf-8"));if(B.version){Ru=B.version;break}}catch{}}catch{}for(let A=0;A<AB.length;A++){if(AB[A]==="--version"||AB[A]==="-v")console.log(`agent-node v${Ru}`),process.exit(0);if(AB[A]==="-h"||AB[A]==="--help")console.log(`
225
225
  @sleep2agi/agent-node — AI Agent 节点,一行命令加入 CommHub 网络
226
226
 
227
227
  用法:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-node",
3
- "version": "2.5.0-preview.60",
3
+ "version": "2.5.0-preview.61",
4
4
  "description": "AI Agent runtime for CommHub networks. Supports Claude Code CLI, Claude Agent SDK, Codex SDK, Codex app-server, Grok Build ACP, and OpenCode CLI.",
5
5
  "bin": {
6
6
  "agent-node": "dist/cli.js"