@sleep2agi/agent-node 2.5.0-preview.167 → 2.5.0-preview.168
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -234,7 +234,7 @@ Use this node's CommHub connection. Directory and exact session are checked by i
|
|
|
234
234
|
`)}function u2(A,Q){let B=FIA(Q);try{return tZ(A,B,{mode:384,flag:"wx"}),{path:A,content:B}}catch(I){if(I?.code!=="EEXIST")throw I;let C;try{C=hq(A,"utf8").split(`
|
|
235
235
|
`,1)[0]??""}catch{throw I}if(C!==YIA(Q)){let E=Error(`ANET-COMMHUB.md in ${zkA(A)} belongs to another node (or a human); `+"give this node its own working directory — one OpenCode node per directory");throw E.code="EEXIST",E}return tZ(A,B,{mode:384,flag:"w"}),i2(A,384),{path:A,content:B}}}function GIA(A){let Q;try{Q=hq(A.path,"utf8")}catch(B){return B?.code==="ENOENT"}if(Q!==A.content)return!1;return yq(A.path,{force:!0}),!0}function $IA(A,Q){let B=new URL(Q.url);if(!["http:","https:"].includes(B.protocol)||B.username||B.password)throw Error("OpenCode CommHub MCP URL must be credential-free HTTP(S)");if(!Q.token)throw Error("OpenCode CommHub MCP token is required");let I=JSON.parse(A.OPENCODE_CONFIG_CONTENT??"{}"),C=JSON.parse(A.OPENCODE_PERMISSION??"{}"),E=eZ(A.PWD??"",HkA);if(!A.PWD||!eF(E).startsWith(`${eF(A.PWD)}${process.platform==="win32"?"\\":"/"}`))throw Error("OpenCode CommHub instruction path escaped the launch workspace");let g=u2(E,Q.alias);I.mcp={...I.mcp??{},commhub:{type:"remote",url:B.toString(),enabled:!0,oauth:!1,headers:{Authorization:`Bearer {env:${nF}}`}}},I.tools={...I.tools??{},"commhub_*":!0},I.permission={...I.permission??{},"commhub_*":"allow"},I.instructions=[...I.instructions??[],E],delete I.permission["*"],delete C["*"],C["commhub_*"]="allow";let U=A.XDG_CONFIG_HOME;if(!U)throw Error("OpenCode CommHub MCP requires a launch-scoped config root");let J=eZ(U,"opencode","opencode.json"),Y=JSON.parse(hq(J,"utf8")),F=Y.permission?.["*"];if(F!=="deny"&&F!=="allow"&&F!==void 0)throw Error("OpenCode rendered config has an unsupported wildcard permission");if(F==="deny")delete Y.permission["*"];let G=`${J}.tmp-${process.pid}-${AW(8).toString("hex")}`;return tZ(G,`${JSON.stringify(Y,null,2)}
|
|
236
236
|
`,{mode:384,flag:"wx"}),i2(G,384),FA(G,J),i2(J,384),A.OPENCODE_CONFIG_CONTENT=JSON.stringify(I),A.OPENCODE_PERMISSION=JSON.stringify(C),A[nF]=Q.token,g}function DIA(A,Q){uU(Q);let B=JSON.parse(A.OPENCODE_CONFIG_CONTENT??"{}");B.model=Q,A.OPENCODE_CONFIG_CONTENT=JSON.stringify(B)}function oF(A,Q){return`${A}${Q}`.slice(-KkA)}function aF(A){return A?.replace(/[\u0000-\u001f\u007f]/g," ").replace(/\s+/g," ").trim().slice(0,64)||void 0}function l2(A){return`'${A.replaceAll("'",`'"'"'`)}'`}function _kA(A){return/^-{0,2}[a-z][a-z-]*$/.test(A)?A:l2(A)}async function nZ(){return await new Promise((A,Q)=>{let B=LkA();B.unref(),B.once("error",Q),B.listen(0,"127.0.0.1",()=>{let I=B.address();if(!I||typeof I==="string"){B.close(),Q(Error("could not reserve an OpenCode loopback port"));return}B.close((C)=>C?Q(C):A(I.port))})})}function NIA(A){let Q=A>0?A+RkA:0;return new gIA.Agent({headersTimeout:Q,bodyTimeout:Q})}async function VIA(A,Q,B,I){try{return await eA(A,Q,`/session/${B}/abort`,{method:"POST",body:"{}"},5000),!0}catch(C){return I(`[opencode-copresence] session abort failed: ${C?.message??C}`),!1}}async function wkA(A,Q,B,I){let C=Date.now()+I;while(Date.now()<C){if(A.exitCode!==null||A.signalCode!==null)throw Error("OpenCode serve exited before readiness");try{if((await uq(Q,B,"/global/health",{},300))?.healthy===!0){let g=await fetch(`${Q}/global/health`,{signal:AbortSignal.timeout(500)});if(g.status!==401)throw Error(`OpenCode serve authentication gate returned HTTP ${g.status}`);return}}catch(E){if(/authentication gate/.test(E?.message??""))throw E}await new Promise((E)=>setTimeout(E,50))}throw Error(`OpenCode serve readiness timed out after ${I}ms`)}async function qkA(A,Q,B,I,C=(U,J={},Y=2000)=>uq(A,Q,U,J,Y),E,g){let U=I>0?Date.now()+I:Number.POSITIVE_INFINITY,J=!1,Y=0,F=0;while(Date.now()<U){try{let G=await C("/session/status",{},2000);if(!G||typeof G!=="object"||Array.isArray(G))Y=0,F=0;if(G&&typeof G==="object"&&!Array.isArray(G)){let $=G[B];if($?.type==="idle")return;if($&&typeof $==="object"&&$.type&&$.type!=="idle"){if(Y=0,F=0,!J)J=!0,await E?.()}if($!==void 0&&!($&&typeof $==="object"&&$.type))Y=0,F=0;if($===void 0)try{if((await C(`/session/${B}`,{},2000))?.id===B)return;Y=0,F=0}catch(D){if(String(D?.code??"").startsWith("opencode_v1_")&&String(D.code).endsWith("_refused"))throw D;if(Hy(D)){if(Y===0)F=Date.now();if(Y+=1,Ky({missingPolls:Y,missingSinceMs:F})==="owner_left")throw new mq(g??N$({sinceMs:Date.now()}))}else Y=0,F=0}}}catch(G){if(G?.code==="opencode_copresence_owner_left")throw G;if(String(G?.code??"").startsWith("opencode_v1_")&&String(G.code).endsWith("_refused"))throw G;Y=0,F=0}await new Promise((G)=>setTimeout(G,100))}throw new FE("admission",I)}function p2(A){let Q=[],B=[];for(let C of A?.parts??[]){if(C?.type==="text"&&typeof C.text==="string"){Q.push(C.text);continue}if(typeof C?.type==="string"&&C.type!=="step-start"&&C.type!=="step-finish")B.push(C.type)}let I=Q.join("").trim();if(I)return I;if(B.length>0)return`[opencode: assistant responded with ${Array.from(new Set(B)).sort().join(", ")} (no text)]`;return"[opencode: assistant returned no reply]"}function uU(A){if(!A)return;let Q=A.indexOf("/");if(Q<=0||Q===A.length-1)throw Error(`OpenCode model must use provider/model form (got ${JSON.stringify(A)})`);return{providerID:A.slice(0,Q),modelID:A.slice(Q+1)}}function c2(A){let Q=A?.trim();if(!Q)throw Error("OpenCode copresence requires an explicit provider/model");return uU(Q),Q}async function rF(A,Q){if(uZ(Q))return;if(!Vq(Q,"SIGTERM"))throw Error("refusing to stop OpenCode process group after identity mismatch");let B=Date.now()+5000;while(Date.now()<B&&!uZ(Q))await new Promise((I)=>setTimeout(I,50));if(!uZ(Q)){if(!Vq(Q,"SIGKILL"))throw Error("refusing to force-stop OpenCode process group after identity mismatch")}if(A.exitCode===null&&A.signalCode===null)await Promise.race([new Promise((I)=>A.once("exit",()=>I())),new Promise((I)=>setTimeout(I,1000))])}function oZ(A,Q,B,I,C,E,g,U,J,Y){let G=["#!/usr/bin/env bash","set -eu",...Object.entries({...I,OPENCODE_SERVER_USERNAME:UIA,...Y?{}:{OPENCODE_SERVER_PASSWORD:E}}).filter((D)=>typeof D[1]==="string"&&(!Y||!/^(?:HTTP|HTTPS|ALL|NO)_PROXY$/i.test(D[0]))).map(([D,N])=>`export ${D}=${l2(N)}`),...Y?[`export OPENCODE_SERVER_PASSWORD="$(<${l2(Y)})"`]:[],`cd ${l2(U)}`,...sp(tj(J),g),`exec ${l2(B)} ${A.attachArgs({url:C,sessionId:g,cwd:U}).map(_kA).join(" ")}`,""],$=`${Q}.tmp-${process.pid}-${AW(8).toString("hex")}`;tZ($,G.join(`
|
|
237
|
-
`),{mode:448,flag:"wx"}),i2($,448),FA($,Q),i2(Q,448)}async function fq(A){let Q=c2(A.model),B=A.backend??YC;if(A.borrowedV1&&B.generation!=="v1")throw Error("Borrowed runtime is V1 only");if(B.generation==="v2"){let{openVettedOpenCodeV2Copresence:M}=await Promise.resolve().then(() => (xq(),Sq));return await M({...A,backend:B})}let I=A.log??(()=>{}),C=A.warn??(()=>{}),E=A.borrowedV1;if(E&&(B.generation!=="v1"||A.cwd!==E.expectedBinding.directory||A.workDir!==E.stateRoot||A.checkpoint||A.newSession||A.sessionId&&A.sessionId!==E.expectedBinding.sessionId||Q!==`${E.model.providerID}/${E.model.modelID}`))throw Error("OpenCode borrowed runtime requires exact V1 directory/state/session/model and no import/new-session");let g,U,J,Y="",F,G,$;if(E)g=await zBA(E),F=g.url,G="";else{let M=await nZ();F=`http://127.0.0.1:${M}`,G=AW(32).toString("base64url");let z={...A.env,OPENCODE_SERVER_USERNAME:UIA,OPENCODE_SERVER_PASSWORD:G};if($=A.checkpoint&&!A.newSession?TBA(A.workDir,A.checkpoint,A.sessionId):void 0,$){if(SBA(A.binary,z,A.cwd,$),!$.cleanShutdown)C("[opencode-copresence] restoring the last checkpoint after an unclean exit; later human turns may be absent")}else if(A.checkpoint&&A.sessionId&&!A.newSession)C("[opencode-copresence] saved session has no V1 checkpoint (legacy launch); startup creates a new session, not a history recovery");if(U=MkA(A.binary,B.serveArgs({hostname:"127.0.0.1",port:M}),{cwd:A.cwd,env:z,stdio:["pipe","pipe","pipe"],detached:process.platform==="linux"}),U.stdout.setEncoding("utf8"),U.stderr.setEncoding("utf8"),U.stdout.on("data",(K)=>{Y=oF(Y,K)}),U.stderr.on("data",(K)=>{Y=oF(Y,K)}),!U.pid)throw Error("OpenCode serve spawn returned no pid");if(J=h2(U.pid),process.platform==="linux"&&(!J||J.pgrp!==U.pid)){try{U.kill("SIGKILL")}catch{}throw Error("OpenCode serve failed the detached process-group identity handshake")}}let D=!1,N=Promise.resolve(),V=g?"":eZ(A.workDir,"opencode-attach.sh"),Z=!1,W,X=(M,z={},K=5000,R)=>g?g.request(M,z,K,R):uq(F,G,M,z,K,R),L=async(M)=>{if(!g)return VIA(F,G,M,C);try{return await X(`/session/${M}/abort`,{method:"POST",body:"{}"}),!0}catch{return C("[opencode-copresence] exact borrowed turn abort failed"),!1}};try{if(U)await wkA(U,F,G,A.startupTimeoutMs??20000);let M=g?await g.readSession():$?await X(`/session/${$.data.info.id}`):await X("/session",{method:"POST",body:JSON.stringify({title:A.title??"Agent Network shared TUI"})});if(typeof M?.id!=="string"||!/^ses_[A-Za-z0-9]+$/.test(M.id))throw Error("OpenCode POST /session returned an invalid session id");if($)xBA($,{info:M,messages:await X(`/session/${M.id}/message`,{},30000)});let z=async(R)=>{if(!A.checkpoint)return;let h=await X(`/session/${M.id}`),k=await X(`/session/${M.id}/message`,{},30000);PBA(A.workDir,A.checkpoint,{info:h,messages:k},R)};if(await z(!1),!g)oZ(B,V,A.binary,A.env,F,G,M.id,A.cwd,A.workDir);if(I(`[opencode-copresence] ready session=${M.id.slice(0,12)} attach=${V}`),!g)uV(A.workDir,V,{log:I,warn:C,respawn:A.tmuxRespawn,tmux:A.tmuxRunner});let K={url:F,sessionId:M.id,attachScriptPath:V,get isRunning(){return!D&&!Z&&(g?g.isAdmitted:U.exitCode===null&&U.signalCode===null)},notify(R,h=30000,k){return(async()=>{if(!K.isRunning)throw Error("OpenCode copresence server is not running");if(g)throw Error("Borrowed V1 TUI notifications are not enabled; no global toast fallback");let S=aF(k);await X("/tui/show-toast",{method:"POST",body:JSON.stringify({title:S?`Agent Network · 来自 ${S}`:"Agent Network message",message:S?`[来自 ${S}] ${R}`:R,variant:"info",duration:15000})},h)})()},submit(R,h=I0,k,S,b){let y=N.then(async()=>{if(!K.isRunning)throw Error("OpenCode copresence server is not running");let T=h>0?h:0,n=T>0?Date.now()+T:0,m=AS(T,eP({env:process.env.OPENCODE_ADMISSION_CAP_MS})),O=0,v=N$({taskId:b?.taskId,sender:k,sinceMs:Date.now()});await qkA(F,G,M.id,m,X,S?.onAdmissionBusy,v);let e=aF(k),t=e?`[来自 ${e}] ${R}`:R,gA=uU(Q);for(;;){let CA=jkA();if(n>0&&Date.now()>=n)throw new FE("admission",T);let UA,f=n>0?Math.max(1,n-Date.now()):0,d=NIA(f),AA=f>0?AbortSignal.timeout(f):void 0;try{UA=await X(`/session/${M.id}/message`,{method:"POST",body:JSON.stringify({messageID:CA,model:gA,parts:[{type:"text",text:t}]}),...AA?{signal:AA}:{}},0,d)}catch(a){if(AA?.aborted&&(a?.name==="TimeoutError"||a?.name==="AbortError")){let u=await X(`/session/${M.id}/message`,{},5000).catch(()=>null),EA=NBA(u,CA);if(EA==="not_submitted")throw C(`[opencode-copresence] task deadline ${T}ms reached; submission did not land`),new FE("admission",T);if(EA!=="abort"){if(g)Z=!0;throw C(`[opencode-copresence] task deadline ${T}ms reached; leaving the session running (history unread or the live turn is not ours)`),new FE("reply",T)}let uA=await L(M.id);if(g&&!uA)Z=!0;throw C(`[opencode-copresence] task deadline ${T}ms reached; submission landed — session ${uA?"aborted":"abort failed"}`),new FE("reply",T,uA?"aborted":"abort_failed")}if(g)Z=!0;throw a}finally{d.destroy?.()?.catch(()=>{})}if(UA?.info?.role!=="assistant"){if(g)Z=!0;throw f2(p2(UA),UA?.info?.parentID,CA,"response is not an assistant message")}if(UA.info.parentID!==CA){let a=await X(`/session/${M.id}/message`,{},30000).catch(()=>null),u=Nq(Array.isArray(a)?a:null,CA,UA.info.parentID);if(!u.accepted){if(g)Z=!0;throw C(`[opencode-copresence] reply ownership refused: ${u.reason}`),f2(p2(UA),UA.info.parentID,CA,u.reason)}I(`[opencode-copresence] reply parent chain verified through ${u.hops} intermediate message(s)`)}S?.onSubmitted?.(),S?.onConsumed?.();let qA=y2(UA);if(qA){let a=`${qA.name}: ${qA.message}`,u=(UA?.parts??[]).some((pA)=>F9(pA?.type)),EA=pI(O,a,u);if(EA.action==="retry"){if(O+=1,n>0)n+=EA.waitMs;C(`[opencode-copresence] model at capacity; retry ${EA.attempt}/${IY} in ${EA.waitMs}ms; same model, reply deadline extended`),await iI(EA,{sleep:S?.capacityRetrySleep,onRetry:S?.onCapacityRetry});continue}C(`[opencode-copresence] provider error for this turn: ${a}`);let uA=(UA?.parts??[]).some((pA)=>pA?.type==="text"&&typeof pA.text==="string"&&pA.text.trim())?p2(UA):"";throw new sE(EA.action==="exhaust"?{name:qA.name,message:cI}:EA.action==="side_effect"?{name:qA.name,message:lI}:qA,uA)}let zA=p2(UA);return await z(!1).catch(()=>C("[opencode-copresence] checkpoint save failed; last saved history retained")),{replyText:zA,stdout:JSON.stringify(UA)}}}).catch(async(T)=>{if(g&&Z)await g.retainRecovery();throw T});return N=y.then(()=>{return},()=>{return}),y},async close(R){if(g)return W??=(async()=>{if(D=!0,await N,Z)throw await g.retainRecovery(),Error("Borrowed V1 turn completion unknown; recovery retained, no automatic reopen");let h=await g.request("/session/status").catch(()=>null);if((h&&typeof h==="object"&&!Array.isArray(h)?Object.hasOwn(h,M.id)?h[M.id]:{type:"idle"}:null)?.type!=="idle")throw await g.retainRecovery(),Error("Borrowed V1 close requires a proven idle session; recovery retained");await g.close()})();if(D)return;if(K.isRunning)await z(!0).catch(()=>C("[opencode-copresence] final checkpoint failed; recovery is limited to last saved history"));if(D=!0,mV(A.workDir,{restart:R?.restart===!0,log:I,warn:C,tmux:A.tmuxRunner}),yq(V,{force:!0}),J)await rF(U,J);else try{U.kill("SIGKILL")}catch{}}};return U?.once("exit",(R,h)=>{if(!D)C(`[opencode-copresence] serve exited code=${R} signal=${h}; next task must reopen`)}),K}catch(M){if(g)throw await g.close(),M;if(yq(V,{force:!0}),J)await rF(U,J).catch(()=>{});else try{U.kill("SIGKILL")}catch{}throw Object.assign(M instanceof Error?M:Error(String(M)),{startupOutput:Y.slice(-1000)})}}async function OkA(A){let Q=c2(A.model),B=A.backend??YC;if(A.sharedServer&&B.generation!=="v2")throw Error("Shared OpenCode Server requires the V2 backend");if(A.borrowedV1){if(B.generation!=="v1"||A.unsafeTools||A.commhubToken||A.commhubMcpUrl||A.providerEnvKeys?.length)throw Error("Borrowed V1 uses its explicit scoped admission; owned credential/environment options are forbidden");let{sharedServer:W,resumeSessionId:X,reconcileResumedModel:L,...M}=A,z=await fq({...M,model:Q,backend:B,binary:A.borrowedV1.attestation.binary,env:{},cwd:eF(A.cwd),workDir:eF(A.workDir)});try{return await A.onSession?.(z.sessionId),z}catch(K){throw await z.close(),K}}let I=eF(A.workDir),C=eF(A.cwd),E=A.unsafeTools===!0,g=mg(B.generation,{unsafeTools:E,mode:"copresence"});if(g)throw Error(g);let U=[I,...jY(C)],J=B.buildChildEnv({workDir:I,cwd:C,unsafeTools:!1,launchBase:A.launchBase,credentialMode:"probe",managedPolicyMode:"redirect-only"}),Y;try{let W=T0(I,J);Y=B.resolveBinary({requestedBinary:A.binary,expectedVersion:A.expectedVersion,searchPath:A.binarySearchPath,probeEnv:J,probeCwd:W,forbiddenRoots:U})}finally{if(!og(I,J))throw Error("opencode copresence failed to discard credential-free version-probe root")}if(!Y)throw Error("opencode copresence version probe returned no accepted binary");let F=B.buildChildEnv({workDir:I,cwd:C,unsafeTools:E,launchBase:A.launchBase,credentialMode:"runtime",persistAuth:B.generation==="v1"}),G,$=!1,D,N,V=()=>{if($)return!0;let W=r9(I,F);if(W)$=!0;return W},Z=()=>{if(!D)return;if(!GIA(D))A.warn?.(`[opencode-copresence] left ${D.path} in place; its content is no longer ours`);D=void 0};try{if(DIA(F,Q),B.generation==="v2"){let{wireOpenCodeV2NativeProviders:M}=await Promise.resolve().then(() => (eBA(),tBA));M(F,{workDir:I,parentEnv:process.env,configEnvKeys:A.providerEnvKeys??[]})}if(A.commhubMcpUrl||A.commhubToken){if(!A.commhubMcpUrl||!A.commhubToken)throw Error("OpenCode copresence requires both CommHub MCP URL and token");if(A.sharedServer){let{openSharedV2CommhubMcp:M}=await Promise.resolve().then(() => (CIA(),IIA));D=u2(eZ(C,"ANET-COMMHUB.md"),A.commhubAlias),N=await M(C,I,A.commhubMcpUrl,A.commhubToken,D.path)}else D=B.generation==="v2"?(await Promise.resolve().then(() => (xq(),Sq))).wireOpenCodeV2CommhubMcp(F,{url:A.commhubMcpUrl,token:A.commhubToken,alias:A.commhubAlias}):$IA(F,{url:A.commhubMcpUrl,token:A.commhubToken,alias:A.commhubAlias})}let W=T0(I,F),X=B.revalidateBinary(Y,{expectedVersion:A.expectedVersion,forbiddenRoots:U});return G=await fq({backend:B,binary:X,env:F,cwd:W,workDir:I,model:Q,expectedVersion:A.expectedVersion,title:A.title,startupTimeoutMs:A.startupTimeoutMs,checkpoint:A.checkpoint,sessionId:A.sessionId,newSession:A.newSession,sharedServer:A.sharedServer,sharedMcpUrl:N?.url,resumeSessionId:A.resumeSessionId,reconcileResumedModel:A.reconcileResumedModel,tmuxRespawn:A.tmuxRespawn,tmuxRunner:A.tmuxRunner,log:A.log,warn:A.warn}),await A.onSession?.(G.sessionId),{get url(){return G.url},get sessionId(){return G.sessionId},get attachScriptPath(){return G.attachScriptPath},get isRunning(){return G.isRunning},get backgroundControl(){return G.backgroundControl},notify:(M,z,K)=>G.notify(M,z,K),submit:(M,z,K,R)=>G.submit(M,z,K,R),async close(M){if(await G.close(M),await N?.close(),Z(),!await $q(V))A.warn?.("[opencode-copresence] launch-root cleanup deferred; a live descendant still references it")}}}catch(W){throw await G?.close().catch(()=>{}),await N?.close().catch(()=>{}),Z(),await $q(V),W}}var gIA,UIA="opencode",FE,mq,KkA=65536,nF="ANET_OPENCODE_COMMHUB_TOKEN",HkA="ANET-COMMHUB.md",EIA=0,sZ=0,RkA=60000,uq;var kq=H(()=>{CQ();m$();P0();ag();UC();mZ();L0();Zq();cV();xN();KBA();kBA();gIA=OP(OZ(),1);FE=class FE extends Error{code="opencode_copresence_timeout";phase;timeoutMs;aborted;userReplyText;constructor(A,Q,B="running"){let I=JIA(Q),C="可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)",E=A==="reply"?B:"running",g=E==="aborted"?`⏳ opencode 任务等待回复已达 ${I} 上限,桥接层已中止该会话。这一轮已停止,迟到的输出不会再作为新消息发回。${"可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)"}。`:E==="abort_failed"?`⏳ opencode 任务等待回复已达 ${I} 上限。桥接层尝试中止会话失败,会话可能仍在运行,迟到的结果仍可能作为新消息出现;详见节点日志。${"可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)"}。`:A==="reply"?`⏳ opencode 任务仍在节点的 TUI 会话里运行,没有被中止;bridge 等待回复已达 ${I} 上限,停止等待。`+`这一轮的最终结果不会再自动回传到这里,请到节点 TUI 查看进度和结果。${"可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)"}。`:`opencode 任务未提交:共享会话忙,${I} 内未获提交 —— 这段时间共享会话一直被 TUI 里的一轮占着(不是节点卡死),本任务没有发出,可稍后重发。`+`排队上限可用 OPENCODE_ADMISSION_CAP_MS 调整(默认 10 分钟,0 = 不额外限制)。${"可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)"}。`;super(E==="aborted"?`OpenCode reply wait exceeded ${Q}ms; the shared session was aborted`:E==="abort_failed"?`OpenCode reply wait exceeded ${Q}ms; session abort failed and the turn may still be running`:A==="reply"?`OpenCode reply wait exceeded ${Q}ms; the turn keeps running in the shared session (not aborted)`:`OpenCode session remained busy for ${Q}ms; task was not submitted`);this.name="OpenCodeCopresenceTimeoutError",this.phase=A,this.timeoutMs=Q,this.aborted=E==="aborted",this.userReplyText=g}};mq=class mq extends Error{code="opencode_copresence_owner_left";phase="owner_left";owner;userReplyText;constructor(A){super("OpenCode shared session owner left; the queued task was terminated (owner_left)");this.name="OpenCodeCopresenceOwnerLeftError",this.owner=A,this.userReplyText=jy(A)}};uq=eA});var WIA={};DA(WIA,{grokPreflightMessage:()=>TkA});function TkA(A,Q){let B=Q||"(空)";if(A.code==="ENOENT")return["grok CLI 不在 PATH 上 —— 这**不等于**没装。"," grok 的官方安装位置是 ~/.grok/bin/grok,而它默认不在登录 PATH 里。"," 先看装没装: ls -l ~/.grok/bin/grok",' 装了就加进去: export PATH="$HOME/.grok/bin:$PATH"'," \uD83D\uDD34 这个节点若是 daemon 建的:子节点继承 **daemon 的** PATH,"," 在你自己的 shell 里 export 没用 —— 要改 daemon 的启动环境再重启 daemon。",` ${"没装的话按 docs/grok-build-cli-preview.md 装"}。`,` 当前 PATH: ${B}`].join(`
|
|
237
|
+
`),{mode:448,flag:"wx"}),i2($,448),FA($,Q),i2(Q,448)}async function fq(A){let Q=c2(A.model),B=A.backend??YC;if(A.borrowedV1&&B.generation!=="v1")throw Error("Borrowed runtime is V1 only");if(B.generation==="v2"){let{openVettedOpenCodeV2Copresence:M}=await Promise.resolve().then(() => (xq(),Sq));return await M({...A,backend:B})}let I=A.log??(()=>{}),C=A.warn??(()=>{}),E=A.borrowedV1;if(E&&(B.generation!=="v1"||A.cwd!==E.expectedBinding.directory||A.workDir!==E.stateRoot||A.checkpoint||A.newSession||A.sessionId&&A.sessionId!==E.expectedBinding.sessionId||Q!==`${E.model.providerID}/${E.model.modelID}`))throw Error("OpenCode borrowed runtime requires exact V1 directory/state/session/model and no import/new-session");let g,U,J,Y="",F,G,$;if(E)g=await zBA(E),F=g.url,G="";else{let M=await nZ();F=`http://127.0.0.1:${M}`,G=AW(32).toString("base64url");let z={...A.env,OPENCODE_SERVER_USERNAME:UIA,OPENCODE_SERVER_PASSWORD:G};if($=A.checkpoint&&!A.newSession?TBA(A.workDir,A.checkpoint,A.sessionId):void 0,$){if(SBA(A.binary,z,A.cwd,$),!$.cleanShutdown)C("[opencode-copresence] restoring the last checkpoint after an unclean exit; later human turns may be absent")}else if(A.checkpoint&&A.sessionId&&!A.newSession)C("[opencode-copresence] saved session has no V1 checkpoint (legacy launch); startup creates a new session, not a history recovery");if(U=MkA(A.binary,B.serveArgs({hostname:"127.0.0.1",port:M}),{cwd:A.cwd,env:z,stdio:["pipe","pipe","pipe"],detached:process.platform==="linux"}),U.stdout.setEncoding("utf8"),U.stderr.setEncoding("utf8"),U.stdout.on("data",(K)=>{Y=oF(Y,K)}),U.stderr.on("data",(K)=>{Y=oF(Y,K)}),!U.pid)throw Error("OpenCode serve spawn returned no pid");if(J=h2(U.pid),process.platform==="linux"&&(!J||J.pgrp!==U.pid)){try{U.kill("SIGKILL")}catch{}throw Error("OpenCode serve failed the detached process-group identity handshake")}}let D=!1,N=Promise.resolve(),V=g?"":eZ(A.workDir,"opencode-attach.sh"),Z=!1,W,X=(M,z={},K=5000,R)=>g?g.request(M,z,K,R):uq(F,G,M,z,K,R),L=async(M)=>{if(!g)return VIA(F,G,M,C);try{return await X(`/session/${M}/abort`,{method:"POST",body:"{}"}),!0}catch{return C("[opencode-copresence] exact borrowed turn abort failed"),!1}};try{if(U)await wkA(U,F,G,A.startupTimeoutMs??20000);let M=g?await g.readSession():$?await X(`/session/${$.data.info.id}`):await X("/session",{method:"POST",body:JSON.stringify({title:A.title??"Agent Network shared TUI"})});if(typeof M?.id!=="string"||!/^ses_[A-Za-z0-9]+$/.test(M.id))throw Error("OpenCode POST /session returned an invalid session id");if($)xBA($,{info:M,messages:await X(`/session/${M.id}/message`,{},30000)});let z=async(R)=>{if(!A.checkpoint)return;let h=await X(`/session/${M.id}`),k=await X(`/session/${M.id}/message`,{},30000);PBA(A.workDir,A.checkpoint,{info:h,messages:k},R)};if(await z(!1),!g)oZ(B,V,A.binary,A.env,F,G,M.id,A.cwd,A.workDir);if(I(`[opencode-copresence] ready session=${M.id.slice(0,12)} attach=${V}`),!g)uV(A.workDir,V,{log:I,warn:C,respawn:A.tmuxRespawn,tmux:A.tmuxRunner});let K={url:F,sessionId:M.id,attachScriptPath:V,get isRunning(){return!D&&!Z&&(g?g.isAdmitted:U.exitCode===null&&U.signalCode===null)},notify(R,h=30000,k){return(async()=>{if(!K.isRunning)throw Error("OpenCode copresence server is not running");if(g)throw Error("Borrowed V1 TUI notifications are not enabled; no global toast fallback");let S=aF(k);await X("/tui/show-toast",{method:"POST",body:JSON.stringify({title:S?`Agent Network · 来自 ${S}`:"Agent Network message",message:S?`[来自 ${S}] ${R}`:R,variant:"info",duration:15000})},h)})()},submit(R,h=I0,k,S,b){let y=N.then(async()=>{if(!K.isRunning)throw Error("OpenCode copresence server is not running");let T=h>0?h:0,n=T>0?Date.now()+T:0,m=AS(T,eP({env:process.env.OPENCODE_ADMISSION_CAP_MS})),O=0,v=N$({taskId:b?.taskId,sender:k,sinceMs:Date.now()});await qkA(F,G,M.id,m,X,S?.onAdmissionBusy,v);let e=aF(k),t=e?`[来自 ${e}] ${R}`:R,gA=uU(Q);for(;;){let CA=jkA();if(n>0&&Date.now()>=n)throw new FE("admission",T);let UA,f=n>0?Math.max(1,n-Date.now()):0,d=NIA(f),AA=f>0?AbortSignal.timeout(f):void 0;try{UA=await X(`/session/${M.id}/message`,{method:"POST",body:JSON.stringify({messageID:CA,model:gA,parts:[{type:"text",text:t}]}),...AA?{signal:AA}:{}},0,d)}catch(a){if(AA?.aborted&&(a?.name==="TimeoutError"||a?.name==="AbortError")){let u=await X(`/session/${M.id}/message`,{},5000).catch(()=>null),EA=NBA(u,CA);if(EA==="not_submitted")throw C(`[opencode-copresence] task deadline ${T}ms reached; submission did not land`),new FE("admission",T);if(EA!=="abort"){if(g)Z=!0;throw C(`[opencode-copresence] task deadline ${T}ms reached; leaving the session running (history unread or the live turn is not ours)`),new FE("reply",T)}let uA=await L(M.id);if(g&&!uA)Z=!0;throw C(`[opencode-copresence] task deadline ${T}ms reached; submission landed — session ${uA?"aborted":"abort failed"}`),new FE("reply",T,uA?"aborted":"abort_failed")}if(g)Z=!0;throw a}finally{d.destroy?.()?.catch(()=>{})}if(UA?.info?.role!=="assistant"){if(g)Z=!0;throw f2(p2(UA),UA?.info?.parentID,CA,"response is not an assistant message")}if(UA.info.parentID!==CA){let a=await X(`/session/${M.id}/message`,{},30000).catch(()=>null),u=Nq(Array.isArray(a)?a:null,CA,UA.info.parentID);if(!u.accepted){if(g)Z=!0;throw C(`[opencode-copresence] reply ownership refused: ${u.reason}`),f2(p2(UA),UA.info.parentID,CA,u.reason)}I(`[opencode-copresence] reply parent chain verified through ${u.hops} intermediate message(s)`)}S?.onSubmitted?.(),S?.onConsumed?.();let qA=y2(UA);if(qA){let a=`${qA.name}: ${qA.message}`,u=(UA?.parts??[]).some((pA)=>F9(pA?.type)),EA=pI(O,a,u);if(EA.action==="retry"){if(O+=1,n>0)n+=EA.waitMs;C(`[opencode-copresence] model at capacity; retry ${EA.attempt}/${IY} in ${EA.waitMs}ms; same model, reply deadline extended`),await iI(EA,{sleep:S?.capacityRetrySleep,onRetry:S?.onCapacityRetry});continue}C(`[opencode-copresence] provider error for this turn: ${a}`);let uA=(UA?.parts??[]).some((pA)=>pA?.type==="text"&&typeof pA.text==="string"&&pA.text.trim())?p2(UA):"";throw new sE(EA.action==="exhaust"?{name:qA.name,message:cI}:EA.action==="side_effect"?{name:qA.name,message:lI}:qA,uA)}let zA=p2(UA);return await z(!1).catch(()=>C("[opencode-copresence] checkpoint save failed; last saved history retained")),{replyText:zA,stdout:JSON.stringify(UA)}}}).catch(async(T)=>{if(g&&Z)await g.retainRecovery();throw T});return N=y.then(()=>{return},()=>{return}),y},async close(R){if(g)return W??=(async()=>{if(D=!0,await N,Z)throw await g.retainRecovery(),Error("Borrowed V1 turn completion unknown; recovery retained, no automatic reopen");let h=await g.request("/session/status").catch(()=>null);if((h&&typeof h==="object"&&!Array.isArray(h)?Object.hasOwn(h,M.id)?h[M.id]:{type:"idle"}:null)?.type!=="idle")throw await g.retainRecovery(),Error("Borrowed V1 close requires a proven idle session; recovery retained");await g.close()})();if(D)return;if(K.isRunning)await z(!0).catch(()=>C("[opencode-copresence] final checkpoint failed; recovery is limited to last saved history"));if(D=!0,mV(A.workDir,{restart:R?.restart===!0,log:I,warn:C,tmux:A.tmuxRunner}),yq(V,{force:!0}),J)await rF(U,J);else try{U.kill("SIGKILL")}catch{}}};return U?.once("exit",(R,h)=>{if(!D)C(`[opencode-copresence] serve exited code=${R} signal=${h}; next task must reopen`)}),K}catch(M){if(g)throw await g.close(),M;if(yq(V,{force:!0}),J)await rF(U,J).catch(()=>{});else try{U.kill("SIGKILL")}catch{}throw Object.assign(M instanceof Error?M:Error(String(M)),{startupOutput:Y.slice(-1000)})}}async function OkA(A){let Q=c2(A.model),B=A.backend??YC;if(A.sharedServer&&B.generation!=="v2")throw Error("Shared OpenCode Server requires the V2 backend");if(A.borrowedV1){if(B.generation!=="v1"||A.unsafeTools||A.commhubToken||A.commhubMcpUrl||A.providerEnvKeys?.length)throw Error("Borrowed V1 uses its explicit scoped admission; owned credential/environment options are forbidden");let{sharedServer:W,resumeSessionId:X,reconcileResumedModel:L,...M}=A,z=await fq({...M,model:Q,backend:B,binary:A.borrowedV1.attestation.binary,env:{},cwd:eF(A.cwd),workDir:eF(A.workDir)});try{return await A.onSession?.(z.sessionId),z}catch(K){throw await z.close(),K}}let I=eF(A.workDir),C=eF(A.cwd),E=A.unsafeTools===!0,g=mg(B.generation,{unsafeTools:E,mode:"copresence"});if(g)throw Error(g);let U=[I,...jY(C)],J=B.buildChildEnv({workDir:I,cwd:C,unsafeTools:!1,launchBase:A.launchBase,credentialMode:"probe",managedPolicyMode:"redirect-only"}),Y;try{let W=T0(I,J);Y=B.resolveBinary({requestedBinary:A.binary,expectedVersion:A.expectedVersion,searchPath:A.binarySearchPath,probeEnv:J,probeCwd:W,forbiddenRoots:U})}finally{if(!og(I,J))throw Error("opencode copresence failed to discard credential-free version-probe root")}if(!Y)throw Error("opencode copresence version probe returned no accepted binary");let F=B.buildChildEnv({workDir:I,cwd:C,unsafeTools:E,launchBase:A.launchBase,credentialMode:"runtime",persistAuth:B.generation==="v1"}),G,$=!1,D,N,V=()=>{if($)return!0;let W=r9(I,F);if(W)$=!0;return W},Z=()=>{if(!D)return;if(!GIA(D))A.warn?.(`[opencode-copresence] left ${D.path} in place; its content is no longer ours`);D=void 0};try{if(DIA(F,Q),B.generation==="v2"){let{wireOpenCodeV2NativeProviders:M}=await Promise.resolve().then(() => (eBA(),tBA));M(F,{workDir:I,parentEnv:process.env,configEnvKeys:A.providerEnvKeys??[]})}if(A.commhubMcpUrl||A.commhubToken){if(!A.commhubMcpUrl||!A.commhubToken)throw Error("OpenCode copresence requires both CommHub MCP URL and token");if(A.sharedServer){let{openSharedV2CommhubMcp:M}=await Promise.resolve().then(() => (CIA(),IIA));D=u2(eZ(C,"ANET-COMMHUB.md"),A.commhubAlias),N=await M(C,I,A.commhubMcpUrl,A.commhubToken,D.path)}else D=B.generation==="v2"?(await Promise.resolve().then(() => (xq(),Sq))).wireOpenCodeV2CommhubMcp(F,{url:A.commhubMcpUrl,token:A.commhubToken,alias:A.commhubAlias}):$IA(F,{url:A.commhubMcpUrl,token:A.commhubToken,alias:A.commhubAlias})}let W=T0(I,F),X=B.revalidateBinary(Y,{expectedVersion:A.expectedVersion,forbiddenRoots:U});return G=await fq({backend:B,binary:X,env:F,cwd:W,workDir:I,model:Q,expectedVersion:A.expectedVersion,title:A.title,startupTimeoutMs:A.startupTimeoutMs,checkpoint:A.checkpoint,sessionId:A.sessionId,newSession:A.newSession,sharedServer:A.sharedServer,sharedMcpUrl:N?.url,resumeSessionId:A.resumeSessionId,reconcileResumedModel:A.reconcileResumedModel,tmuxRespawn:A.tmuxRespawn,tmuxRunner:A.tmuxRunner,log:A.log,warn:A.warn}),await A.onSession?.(G.sessionId),{get url(){return G.url},get sessionId(){return G.sessionId},get attachScriptPath(){return G.attachScriptPath},get isRunning(){return G.isRunning},get backgroundControl(){return G.backgroundControl},...G.selectedModel?{selectedModel:()=>G.selectedModel()}:{},...G.setSelectedModel?{setSelectedModel:(M)=>G.setSelectedModel(M)}:{},notify:(M,z,K)=>G.notify(M,z,K),submit:(M,z,K,R)=>G.submit(M,z,K,R),async close(M){if(await G.close(M),await N?.close(),Z(),!await $q(V))A.warn?.("[opencode-copresence] launch-root cleanup deferred; a live descendant still references it")}}}catch(W){throw await G?.close().catch(()=>{}),await N?.close().catch(()=>{}),Z(),await $q(V),W}}var gIA,UIA="opencode",FE,mq,KkA=65536,nF="ANET_OPENCODE_COMMHUB_TOKEN",HkA="ANET-COMMHUB.md",EIA=0,sZ=0,RkA=60000,uq;var kq=H(()=>{CQ();m$();P0();ag();UC();mZ();L0();Zq();cV();xN();KBA();kBA();gIA=OP(OZ(),1);FE=class FE extends Error{code="opencode_copresence_timeout";phase;timeoutMs;aborted;userReplyText;constructor(A,Q,B="running"){let I=JIA(Q),C="可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)",E=A==="reply"?B:"running",g=E==="aborted"?`⏳ opencode 任务等待回复已达 ${I} 上限,桥接层已中止该会话。这一轮已停止,迟到的输出不会再作为新消息发回。${"可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)"}。`:E==="abort_failed"?`⏳ opencode 任务等待回复已达 ${I} 上限。桥接层尝试中止会话失败,会话可能仍在运行,迟到的结果仍可能作为新消息出现;详见节点日志。${"可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)"}。`:A==="reply"?`⏳ opencode 任务仍在节点的 TUI 会话里运行,没有被中止;bridge 等待回复已达 ${I} 上限,停止等待。`+`这一轮的最终结果不会再自动回传到这里,请到节点 TUI 查看进度和结果。${"可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)"}。`:`opencode 任务未提交:共享会话忙,${I} 内未获提交 —— 这段时间共享会话一直被 TUI 里的一轮占着(不是节点卡死),本任务没有发出,可稍后重发。`+`排队上限可用 OPENCODE_ADMISSION_CAP_MS 调整(默认 10 分钟,0 = 不额外限制)。${"可用 OPENCODE_TIMEOUT_MS 或 config.json flags.timeout / flags.opencodeTimeoutMs 调整(单位 ms,0 = 不设上限)"}。`;super(E==="aborted"?`OpenCode reply wait exceeded ${Q}ms; the shared session was aborted`:E==="abort_failed"?`OpenCode reply wait exceeded ${Q}ms; session abort failed and the turn may still be running`:A==="reply"?`OpenCode reply wait exceeded ${Q}ms; the turn keeps running in the shared session (not aborted)`:`OpenCode session remained busy for ${Q}ms; task was not submitted`);this.name="OpenCodeCopresenceTimeoutError",this.phase=A,this.timeoutMs=Q,this.aborted=E==="aborted",this.userReplyText=g}};mq=class mq extends Error{code="opencode_copresence_owner_left";phase="owner_left";owner;userReplyText;constructor(A){super("OpenCode shared session owner left; the queued task was terminated (owner_left)");this.name="OpenCodeCopresenceOwnerLeftError",this.owner=A,this.userReplyText=jy(A)}};uq=eA});var WIA={};DA(WIA,{grokPreflightMessage:()=>TkA});function TkA(A,Q){let B=Q||"(空)";if(A.code==="ENOENT")return["grok CLI 不在 PATH 上 —— 这**不等于**没装。"," grok 的官方安装位置是 ~/.grok/bin/grok,而它默认不在登录 PATH 里。"," 先看装没装: ls -l ~/.grok/bin/grok",' 装了就加进去: export PATH="$HOME/.grok/bin:$PATH"'," \uD83D\uDD34 这个节点若是 daemon 建的:子节点继承 **daemon 的** PATH,"," 在你自己的 shell 里 export 没用 —— 要改 daemon 的启动环境再重启 daemon。",` ${"没装的话按 docs/grok-build-cli-preview.md 装"}。`,` 当前 PATH: ${B}`].join(`
|
|
238
238
|
`);if(A.code==="EACCES")return["grok CLI 找到了,但不可执行(EACCES)。",' chmod +x "$(command -v grok)"',` 当前 PATH: ${B}`].join(`
|
|
239
239
|
`);let I=(A.stderr||"").trim().slice(0,200);return[`grok CLI 在,但 \`grok --version\` 没跑成功${typeof A.status==="number"?`(exit ${A.status})`:""}。`," 这不是找不到,是它自己起不来 —— 先手动跑一次 `grok --version` 看它说什么。",...I?[` 它的 stderr: ${I}`]:[]].join(`
|
|
240
240
|
`)}import{spawn as PkA}from"child_process";import{EventEmitter as SkA}from"events";import{readFileSync as xkA,writeFileSync as kkA}from"fs";import{basename as vkA,relative as bkA,resolve as XIA}from"path";function ykA(A){let Q=A?.trim();return Q?["agent","-m",Q,"stdio"]:["agent","stdio"]}function MIA(A){return A&&typeof A==="object"?A:void 0}function fkA(A,Q){if(typeof A==="string"&&/402\s*Payment\s*Required|usage balance exhausted/i.test(A))return!0;if(Q&&typeof Q==="object"&&!Array.isArray(Q)){let B=Q;if(B.http_status===402||B.status_code===402)return!0;let I=B.message;if(typeof I==="string"&&/402\s*Payment\s*Required|usage balance exhausted/i.test(I))return!0;return!1}if(typeof Q==="string"&&/402\s*Payment\s*Required|usage balance exhausted/i.test(Q))return!0;return!1}function hkA(A){let Q=`grok ACP error ${A.code}: ${A.message}`,B=fkA(A.message??"",A.data);if(A.data===void 0)return B?`${Q} — ${LIA}`:Q;let I;try{I=JSON.stringify(A.data)}catch{I=String(A.data)}if(I.length>1000)I=`${I.slice(0,1000)}...`;return B?`${Q} data=${I} — ${LIA}`:`${Q} data=${I}`}var d2,LIA="grok 账号额度耗尽(402 Grok Build usage balance exhausted):充值或换一个还有额度的账号;这不是网络、模型或节点的问题";var cq=H(()=>{d2=class d2 extends SkA{child=null;nextId=1;pending=new Map;rxBuffer="";closed=!1;cwd=process.cwd();lastIncomingAt=Date.now();get lastActivityAt(){return this.lastIncomingAt}start(A={}){if(this.child)throw Error("GrokAcpClient already started");this.cwd=XIA(A.cwd??process.cwd());let Q=A.binary??"grok";this.child=PkA(Q,ykA(A.model),{cwd:this.cwd,env:{...process.env,...A.env},stdio:["pipe","pipe","pipe"]}),this.child.stdout.setEncoding("utf8"),this.child.stdout.on("data",(B)=>this.onStdout(B)),this.child.stderr.setEncoding("utf8"),this.child.stderr.on("data",(B)=>this.emit("stderr",B)),this.child.on("exit",(B,I)=>{this.closed=!0,this.emit("exit",{code:B,signal:I});for(let[,C]of this.pending)C.reject(Error(`grok agent stdio exited (code=${B} signal=${I})`));this.pending.clear()}),this.child.on("error",(B)=>this.emit("error",B))}async request(A,Q,B=30000){if(!this.child||this.closed)throw Error("GrokAcpClient not started or already exited");let I=this.nextId++,C={jsonrpc:"2.0",id:I,method:A,...Q!==void 0?{params:Q}:{}};return new Promise((E,g)=>{let U=setTimeout(()=>{this.pending.delete(I),g(Error(`grok ACP request '${A}' (id=${I}) timed out after ${B}ms`))},B);this.pending.set(I,{resolve:(J)=>{clearTimeout(U),E(J)},reject:(J)=>{clearTimeout(U),g(J)}}),this.child.stdin.write(JSON.stringify(C)+`
|
|
@@ -326,7 +326,7 @@ ${A}`}function ly(A,Q,B,I,C){let{interactiveDashboardTask:E,messageType:g}=B,U=i
|
|
|
326
326
|
`,"config.json",B.stat),!0}function jl(A,Q){return typeof A.opencodeConfiguredModelAtLastOpen==="string"&&A.opencodeConfiguredModelAtLastOpen!==Q}P0();UC();async function _l(A,Q){let B=!1,I;for(let C of A)try{await Q(C)}catch(E){if(!B)I=E;B=!0}if(B)throw I}function Xj(A,Q){let B=Promise.resolve(),I=new Map,C=async(E)=>{let g=Q?.initialDelayMs??0;while(!0)try{await E();return}catch(U){if(A(U),!Q)return;await new Promise((J)=>{setTimeout(J,g).unref?.()}),g=Math.min(g*2,Q.maxDelayMs)}};return{schedule(E){let g=I.get(E);if(g){g.dirty=!0;return}let U={dirty:!1};I.set(E,U);let J=async()=>{try{do U.dirty=!1,await C(E);while(U.dirty)}finally{I.delete(E)}};B=B.then(J,J)},idle(){return B}}}var _MA=new Set(["replied","failed","cancelled","expired"]);function RMA(A){return typeof A==="string"&&_MA.has(A)}async function Rl(A,Q){if(!Q)return{skip:!1,status:null,reason:"no-task-id"};let B;try{B=await A(Q)}catch{return{skip:!1,status:null,reason:"lookup-failed"}}if(!B||B.ok===!1||!B.task)return{skip:!1,status:null,reason:"not-found"};let I=typeof B.task.status==="string"?B.task.status:null;return RMA(I)?{skip:!0,status:I,reason:"terminal"}:{skip:!1,status:I,reason:"open"}}function wl(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 TV(A){let Q=A.type??"task";if(Q!=="task"&&Q!=="broadcast")return!1;let B=wl(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 ql(A){if(!TV(A))return null;let Q=wl(A)?.client_request_id;return typeof Q==="string"?Q:null}async function Ol(A,Q){for(let B of A)await Q(B)}function Tl(A){if(!Number.isInteger(A.maxConcurrent)||A.maxConcurrent<1)throw Error("maxConcurrent must be a positive integer");let Q=new Set,B=new Set,I=A.reservedPrioritySlots??0;if(!Number.isInteger(I)||I<0||I>=A.maxConcurrent)throw Error("reservedPrioritySlots out of range");let C=new Set,E=[],g=()=>{while(Q.size<A.maxConcurrent&&E.length>0){if(!E[0].priority&&B.size>=A.maxConcurrent-I)break;let U=E.shift(),J=A.key(U.message);if(C.delete(J),Q.add(J),!U.priority)B.add(J);let Y;try{Y=U.handler(U.message)}catch(F){Y=Promise.reject(F)}Y.catch(A.onError).finally(()=>{Q.delete(J),B.delete(J);try{A.onSettled?.()}catch(F){A.onError(F)}finally{g()}})}};return{submit(U,J){let Y=0,F=0;for(let G of U){let $=A.key(G);if(Q.has($)||C.has($)){F++;continue}C.add($);let D=A.prioritize?.(G)===!0||A.prioritizeRecovery?.(G)===!0,N=D?E.findIndex((Z)=>!Z.priority):-1,V={message:G,handler:J,priority:D};if(N<0)E.push(V);else E.splice(N,0,V);Y++}return g(),{active:Q.size,queued:E.length,accepted:Y,deduplicated:F}},stats(){return{active:Q.size,queued:E.length}}}}function Pl(A,Q){return A!=="codex-app-server"||Q===0}var wMA={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 Sl(A){let Q=wMA[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 xl(A){let Q=A||"task";return Q==="task"||Q==="broadcast"}function kl(A){let{alias:Q,from:B,content:I,msgType:C}=A;if(B===Q&&!A.imBridge)return"self";if(I.startsWith(`[${Q}]`))return"own-prefix";let E=C==="task"||C==="broadcast"||C==="reply";if(!E&&B!=="hub"&&B!=="api"){if(A.lastReplyAt&&A.now-A.lastReplyAt<A.cooldownMs)return"cooldown"}if(!E&&A.isLowValue(I))return"low-value-inbound";return null}var qMA="skipped by agent-node: self-sent task (sender is this node; reply-loop guard), no turn ran. To wake a node later, use a Hub scheduled task or /aloop instead of send_task to yourself. (#519)",OMA="skipped by agent-node: task text starts with this node's own reply prefix (echo of its own reply; reply-loop guard), no turn ran. (#519)";function TMA(A){if(A==="self")return qMA;if(A==="own-prefix")return OMA;return null}async function vl(A,Q){let B=TMA(Q.reason);if(!B)return{kind:"not-applicable",detail:`reason ${Q.reason} does not close a task`};if(!xl(Q.msgType))return{kind:"not-applicable",detail:`type ${Q.msgType} carries no task`};if(!Q.taskId)return{kind:"not-applicable",detail:"no task id"};try{let I=await A("cancel_task",{task_id:Q.taskId,reason:B});if(I&&typeof I==="object"&&I.ok===!0)return{kind:"closed",tool:"cancel_task"};return{kind:"not-closed",tool:"cancel_task",detail:JSON.stringify(I??null).slice(0,200)}}catch(I){return{kind:"error",tool:"cancel_task",detail:String(I?.message??I).slice(0,200)}}}async function bl(A,Q){if(!xl(Q.msgType))return{kind:"not-applicable",detail:`type ${Q.msgType} carries no task`};if(!Q.taskId)return{kind:"not-applicable",detail:"no task id"};let I=`${Q.result.trim()||"(empty reply)"} [low-value reply withheld from sender by agent-node (#519)]`.slice(0,4000);try{return await A("report_completion",{alias:Q.alias,task:Q.taskId,result:I}),{kind:"closed",tool:"report_completion"}}catch(C){return{kind:"error",tool:"report_completion",detail:String(C?.message??C).slice(0,200)}}}function GD(A,Q){switch(Q.kind){case"closed":return`closed task ${A} via ${Q.tool} (#519)`;case"not-closed":return`task ${A} not closed by ${Q.tool} (already terminal?): ${Q.detail}`;case"not-applicable":return`task ${A} left as-is: ${Q.detail}`;case"error":return`failed to close task ${A} via ${Q.tool}: ${Q.detail}`}}function PV(){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 yl(){let A=null,Q=PV();return{async getOrOpen(B){if(A?.isRunning)return A;return Q.run(async()=>{if(A?.isRunning)return A;A=null;let I=await B();if(!I.isRunning)throw Error("codex app-server session stopped while opening");return A=I,I})},invalidate(B){if(!B||A===B)A=null},current(){return A},pending(){return Q.pending()}}}$D();C4();import{closeSync as DD,constants as vE,existsSync as bMA,fchmodSync as xV,fstatSync as hl,fsyncSync as yMA,ftruncateSync as fMA,lstatSync as hMA,mkdirSync as mMA,openSync as Hj,readdirSync as uMA,readFileSync as cMA,realpathSync as Kj,writeSync as lMA}from"node:fs";import{join as ml,resolve as jj}from"node:path";function ul(){return process.platform==="linux"&&bMA("/proc/self/fd")}function cl(A,Q){return ul()?`/proc/self/fd/${A}`:Q}function ll(A,Q){let B=hl(A),I=process.getuid?.();if(!B.isFile()||B.nlink!==1||I!==void 0&&B.uid!==I)throw Error(`private log is not a single owner-controlled file: ${Q}`);xV(A,384)}function pl(A){let Q=jj(A);if(Kj(Q)!==Q)throw Error(`private log directory is not canonical: ${Q}`);let B=Hj(Q,vE.O_RDONLY|(vE.O_DIRECTORY||0)|(vE.O_NOFOLLOW||0));try{let I=hl(B),C=process.getuid?.();if(!I.isDirectory()||C!==void 0&&I.uid!==C)throw Error(`private log directory is not owner-controlled: ${Q}`);if(ul()&&Kj(`/proc/self/fd/${B}`)!==Q)throw Error(`private log directory changed during validation: ${Q}`);if(process.platform!=="win32")xV(B,448);return B}catch(I){throw DD(B),I}}function il(A,Q,B){let I=0;while(I<Q.length){let C=lMA(A,Q,I,Q.length-I,B===null?null:B+I);if(C<=0)throw Error("private log write made no progress");I+=C}}function pMA(A,Q){let B=Hj(A,vE.O_RDWR|(vE.O_NOFOLLOW||0));try{ll(B,A);let I=Buffer.from(Q.redactText(cMA(B,"utf8")).text,"utf8");if(fMA(B,0),I.length>0)il(B,I,0);yMA(B),xV(B,384)}finally{DD(B)}}function dl(A,Q){let B=jj(A);mMA(B,{recursive:!0,mode:448});let I=hMA(B),C=process.getuid?.();if(I.isSymbolicLink()||!I.isDirectory()||Kj(B)!==B||C!==void 0&&I.uid!==C)throw Error(`private log directory is not owner-controlled: ${B}`);let E=pl(B);try{let g=cl(E,B);for(let U of uMA(g)){if(!U.endsWith(".log"))continue;pMA(ml(g,U),Q)}}finally{DD(E)}return B}function _j(A,Q,B,I){if(!/^\d{4}-\d{2}-\d{2}\.log$/.test(Q))throw Error("private log filename is not a canonical daily log name");let C=pl(A),E=ml(cl(C,jj(A)),Q),g;try{g=Hj(E,vE.O_WRONLY|vE.O_CREAT|vE.O_APPEND|(vE.O_NOFOLLOW||0),384),ll(g,E);let U=Buffer.from(I.redactText(B).text,"utf8");if(U.length>0)il(g,U,null);xV(g,384)}finally{if(g!==void 0)DD(g);DD(C)}}function Rj(A){return JSON.stringify(A)}function nl(A){let Q=A.configNodeId||"",B=A.envNodeId||"";if(Q){if(B&&B!==Q)A.warn?.(`COMMHUB_NODE_ID mismatch: env=${Rj(B)} config=${Rj(Q)} config_path=${Rj(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 iMA(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 I=JSON.parse(B);return I?.task_id||I?.message_id||I?.id||null}catch{return null}}function hY(A,Q,B,I={}){let C=a1({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",...I.errorCode?{error_code:I.errorCode}:{},...I.errorMessage?{error_message:n1(I.errorMessage)}:{}});if(I.event)C.event=I.event;A.log(o1(C))}async function ol(A,Q,B){let I=B.now??Date.now,C=B.sleep??((V)=>new Promise((Z)=>setTimeout(Z,V))),E=B.timeoutMs??120000,g=B.pollIntervalMs??2000,U=B.stale30Ms??30000,J=B.stale60Ms??60000,Y=B.emit,F=I()+E,G=null,$=new Set,D=!1,N=!1;while(I()<F){G=await B.getTask(A);let V=G?.task||G,Z=V?.status;if((Z==="acked"||Z==="running"||Z==="processing")&&!$.has(Z))$.add(Z),Y(Z==="acked"?"acked":"started",A);if(Z==="replied"||Z==="failed"||Z==="cancelled")return Y(Z==="replied"?"replied":"failed",A,{...Z==="replied"?{}:{errorCode:`task_${Z}`,event:"task.failed"}}),{kind:"terminal",status:Z,latest:G,row:V};let W=I()-Q;if(!D&&W>=U&&Z==="delivered")D=!0,Y("delivered",A,{event:"task.warning.delivered_stale_30s"});if(!N&&W>=J&&Z==="delivered")N=!0,Y("delivered",A,{event:"task.warning.delivered_stale_60s"});await C(g)}return Y("expired",A,{errorCode:"lifecycle_timeout"}),{kind:"expired",latest:G}}async function al(A,Q,B){hY(Q,"sending",null);try{let I=await B({alias:A.alias,task:A.task,priority:A.priority||"normal",from_session:Q.fromAlias,parent_task_id:Q.parentTaskId||void 0}),C=iMA(I);if(!C)hY(Q,"failed",null,{errorCode:"missing_task_id",errorMessage:"CommHub response omitted task_id"});else hY(Q,"delivered",C);return I}catch(I){throw hY(Q,"failed",null,{errorCode:"send_failed",errorMessage:I}),I}}function rl(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 sl(A,Q,B){let I=await B.deliverToRuntime(A);if(Q)return{kind:"request",result:I};return await B.acknowledge(A.id),{kind:"terminal_peer_reply",result:I}}function tl(A,Q){if(A.type!=="new_reply")return!1;return Q(),!0}G9();function wj(){return{hubSupportsTool:null}}function dMA(A){if(!(A instanceof CI))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 nMA(A){if(!(A instanceof CI))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"||dMA(A)}async function el(A,Q,B=wj()){try{let I=await Q.sendAtomic(A);return B.hubSupportsTool=!0,{route:"atomic",payload:I}}catch(I){if(!nMA(I))throw I;return{route:"legacy-reply",payload:await Q.sendLegacyReply(A)}}}CQ();import{chmodSync as Ap,closeSync as qj,existsSync as oMA,fchmodSync as aMA,fsyncSync as rMA,openSync as Qp,readFileSync as sMA,unlinkSync as Bp,writeFileSync as tMA}from"node:fs";import{randomBytes as eMA}from"node:crypto";var Ip=15000,A8A=2500,gp=300000,ND=2000,Q8A=new Set(["replied","failed","cancelled","expired"]);function Tj(A){if(A===void 0||A===null||String(A).trim()==="")return Ip;let Q=Number(A);if(!Number.isSafeInteger(Q))return Ip;return Math.min(gp,Math.max(A8A,Q))}function Oj(){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 m0(A){if(!Array.isArray(A))return[];return[...new Set(A.filter((Q)=>typeof Q==="string"&&Q.length>0&&Q.length<=512))].slice(-ND)}function B8A(A){if(!A||typeof A!=="object")return Oj();let Q=A;return{version:3,consumed_task_ids:m0(Q.consumed_task_ids),consumed_client_request_ids:m0(Q.consumed_client_request_ids),surfaced_outbound_terminal_ids:m0(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(-ND):m0(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(-ND):m0(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 Cp(A){return ql(A)}function Ep(A){return typeof A.task_id==="string"&&A.task_id?A.task_id:A.id}function I8A(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)}var C8A=new Set(["from_node_id_identity_mismatch","node_token_required"]);function E8A(A){let Q=A;return Q?.appLevel===!0&&typeof Q.code==="string"&&C8A.has(Q.code)}class Up{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=m0(Q.consumed_task_ids),Q.consumed_client_request_ids=m0(Q.consumed_client_request_ids),Q.surfaced_outbound_terminal_ids=m0(Q.surfaced_outbound_terminal_ids),Q.outbound_deliveries=Q.outbound_deliveries.filter((B)=>B.state!=="delivered").slice(-ND),Q.inbound_lifecycle=Q.inbound_lifecycle.slice(-ND),this.write(Q),this.state=Q})}claimOutbound(A,Q,B,I){return this.withLock(()=>{let C=this.read(),E=C.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+I;else C.outbound_deliveries.push({task_id:A,idempotency_key:Q,state:"delivering",lease_until:B+I});return this.write(C),this.state=C,!0},!1)}withLock(A,Q){let B=`${this.path}.lock`,I;try{I=Qp(B,"wx",384)}catch{if(arguments.length>1)return Q;throw Error("compensation cursor is locked")}try{return A()}finally{qj(I);try{Bp(B)}catch{}}}read(){if(!oMA(this.path))return Oj();try{let A=B8A(JSON.parse(sMA(this.path,"utf8")));return Ap(this.path,384),A}catch{return Oj()}}write(A){let Q=`${this.path}.tmp-${process.pid}-${eMA(6).toString("hex")}`,B=null;try{B=Qp(Q,"wx",384),aMA(B,384),tMA(B,`${JSON.stringify(A)}
|
|
327
327
|
`,"utf8"),rMA(B),qj(B),B=null,FA(Q,this.path),Ap(this.path,384)}finally{if(B!==null)qj(B);try{Bp(Q)}catch{}}}}function Jp(A){let Q=Tj(A.intervalMs),B=A.adapters,I=new Up(A.cursorPath),C="probing",E=null,g=!1,U=!1,J=null,Y=0,F=!1,G=!1,$=B.now??Date.now,D=Math.max(30000,Q*2),N=B.setTimer??((R,h)=>{let k=setTimeout(R,h);return k.unref?.(),k}),V=B.clearTimer??((R)=>clearTimeout(R)),Z=(R)=>{let h=I.snapshot(),k=Ep(R),S=Cp(R);return h.consumed_task_ids.includes(k)||!!S&&h.consumed_client_request_ids.includes(S)},W=(R)=>{let h=Ep(R),k=Cp(R);I.update((S)=>{if(S.consumed_task_ids.push(h),k)S.consumed_client_request_ids.push(k);let b=S.inbound_lifecycle.find((y)=>y.task_id===h);if(b)b.state="completed";else S.inbound_lifecycle.push({task_id:h,state:"completed"})})},X={delivered:0,submitted:1,consumed:2,completed:3},L=(R,h)=>{if(!R)return;I.update((k)=>{let S=k.inbound_lifecycle.find((b)=>b.task_id===R);if(!S)k.inbound_lifecycle.push({task_id:R,state:h});else if(X[h]>X[S.state])S.state=h;if(X[h]>=X.consumed)k.consumed_task_ids.push(R)})},M=(R)=>{if(U||C==="realtime-only")return;if(J!==null)V(J);J=N(()=>{J=null,K("timer")},R)},z=async(R)=>{try{let h=I.snapshot().outbound_terminal_watermark,[k,S]=await Promise.all([B.getInbox(),G?Promise.resolve({tasks:[],hasMore:!1}):B.listOutbound(h).catch((y)=>{if(!E8A(y))throw y;return G=!0,B.warn(`[commhub-compensation] outbound reconciliation disabled: this node's token is not bound to its node_id (${y.code}); inbox compensation continues. Re-issue a node-bound token to restore lost-reply reconciliation.`),{tasks:[],hasMore:!1}})]),b=S.tasks;if(C==="probing")C="active",B.log(`[commhub-compensation] active (${Q}ms; SSE remains primary)`);if(k.some((y)=>!Z(y)))B.scheduleInboxDrain();for(let y of b){if(!y?.task_id||!Q8A.has(y.status))continue;if(!Number.isSafeInteger(y.terminal_seq)||Number(y.terminal_seq)<=0)throw Object.assign(Error("Hub terminal sequence missing"),{code:-32602});let T=Number(y.terminal_seq),n=I.snapshot();if(T<=n.outbound_terminal_watermark)continue;let m=I.snapshot().outbound_deliveries.find((v)=>v.task_id===y.task_id);if(m?.state==="delivered"){I.update((v)=>{v.outbound_terminal_watermark=Math.max(v.outbound_terminal_watermark,T)});continue}let O=m?.idempotency_key??`commhub-terminal:${y.task_id}`;if(!I.claimOutbound(y.task_id,O,$(),D))break;try{await B.onOutboundTerminal(y,O)}catch(v){throw I.update((e)=>{let t=e.outbound_deliveries.find((gA)=>gA.task_id===y.task_id);if(t)t.state="pending",t.lease_until=0}),v}I.update((v)=>{let e=v.outbound_deliveries.find((t)=>t.task_id===y.task_id);if(e)e.state="delivered",e.lease_until=0;v.outbound_terminal_watermark=Math.max(v.outbound_terminal_watermark,T)})}if(I.update((y)=>{y.last_success_at=new Date($()).toISOString()}),S.hasMore)g=!0;Y=0,B.log(`[commhub-compensation] ${R} poll ok; inbox=${k.length} outbound=${b.length}`),M(Q)}catch(h){if(I8A(h)){if(C="realtime-only",!F)F=!0,B.warn("[commhub-compensation] Hub lacks durable inbox/outbox polling capability; realtime-only mode (SSE/turn-steer only)");return}Y++;let k=Math.min(gp,Q*2**Math.min(Y,5));B.warn(`[commhub-compensation] poll failed; retry in ${k}ms: ${h instanceof Error?h.message:String(h)}`),M(k)}},K=(R)=>{if(U||C==="realtime-only")return;if(E){g=!0;return}E=(async()=>{let h=R;do g=!1,await z(h),h="idle";while(g&&!U&&C!=="realtime-only")})().finally(()=>{E=null})};return{get mode(){return C},get outboundDisabled(){return G},trigger:K,recordConsumed:W,recordLifecycle:L,wasConsumed:Z,async idle(){await E},stop(){if(U=!0,J!==null)V(J);J=null}}}import{appendFileSync as $UA,mkdirSync as AX,statSync as DUA}from"fs";import{appendFileSync as g8A,mkdirSync as U8A,writeSync as J8A}from"node:fs";import{join as Y8A}from"node:path";function Yp(A){if(A instanceof Error)return`${A.name}: ${A.message}`.replace(/[\r\n]+/g," ");return String(A).replace(/[\r\n]+/g," ")}function F8A(A){if(A instanceof Error)return A.stack||`${A.name}: ${A.message}`;return String(A)}function Fp(A){let Q=A.stdout??process.stdout,B=A.stderr??process.stderr,I=A.now??(()=>new Date),C=A.redact??((Z)=>Z),E=A.exit??((Z)=>process.exit(Z)),g=A.alias??"agent-node",U=!1,J=!1,Y=!1,F="normal",G=!1,$=(Z,W,X)=>{return`[${I().toISOString().slice(11,19)}] [${Z.padEnd(5)}] [${g}] [${W}] ${X}`},D=(Z)=>{try{let W=I().toISOString().slice(0,10),X=C(Z);if(A.appendLine)A.appendLine(W,X);else U8A(A.logDir,{recursive:!0,mode:448}),g8A(Y8A(A.logDir,`${W}.log`),X+`
|
|
328
328
|
`,{mode:384})}catch{}},N=(Z)=>(W)=>{if(W?.code==="EPIPE"){if(Z==="stdout")U=!0;else J=!0;if(!Y)Y=!0,D($("WARN","stream",`${Z} EPIPE; terminal output disabled, file logging continues`));return}if(F=`${Z} error: ${Yp(W)}`,!G)G=!0,E(1)};Q.on("error",N("stdout")),B.on("error",N("stderr"));let V=(Z,W)=>{if(G)return;G=!0,F=`${Z}: ${Yp(W)}`;let X=F8A(W);if(D($("ERROR","fatal",`${Z}: ${X}`)),!J)try{J8A(2,`${X}
|
|
329
|
-
`)}catch(L){if(L?.code==="EPIPE")J=!0}E(1)};return process.on("uncaughtException",(Z)=>V("uncaughtException",Z)),process.on("unhandledRejection",(Z)=>V("unhandledRejection",Z)),process.on("exit",(Z)=>D($(Z===0?"INFO":"ERROR","exit",`code=${Z} reason=${F}`))),{outputBroken:()=>U||J}}var Gp={name:"@sleep2agi/agent-node",version:"2.5.0-preview.
|
|
329
|
+
`)}catch(L){if(L?.code==="EPIPE")J=!0}E(1)};return process.on("uncaughtException",(Z)=>V("uncaughtException",Z)),process.on("unhandledRejection",(Z)=>V("unhandledRejection",Z)),process.on("exit",(Z)=>D($(Z===0?"INFO":"ERROR","exit",`code=${Z} reason=${F}`))),{outputBroken:()=>U||J}}var Gp={name:"@sleep2agi/agent-node",version:"2.5.0-preview.168",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.289",undici:"^6.27.0",ws:"^8.22.0",zod:"^4.4.3"},optionalDependencies:{"@openai/codex":"^0.133.0","@openai/codex-sdk":"^0.133.0","node-pty":"^1.1.0"},devDependencies:{"@types/ws":"^8.18.2"}};a$();_$();import{chmodSync as $8A,existsSync as D8A,mkdirSync as N8A,readFileSync as V8A,writeFileSync as Z8A}from"node:fs";import{join as W8A}from"node:path";var $p="model_reasoning_effort";function Pj(A){return H$(A)}function X8A(A,Q){let B=A.includes(`\r
|
|
330
330
|
`)?`\r
|
|
331
331
|
`:`
|
|
332
332
|
`,I=A.endsWith(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sleep2agi/agent-node",
|
|
3
|
-
"version": "2.5.0-preview.
|
|
3
|
+
"version": "2.5.0-preview.168",
|
|
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"
|