@linzumi/cli 1.0.277 → 1.0.278
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/README.md +1 -1
- package/dist/cloud-supervisor.mjs +1 -1
- package/dist/hosted-coding-account-worker.js +1 -1
- package/dist/index.js +284 -284
- package/dist/remote-codex-harness-worker.js +1 -1
- package/package.json +2 -2
|
@@ -752,6 +752,6 @@ const watchdog = setInterval(() => {
|
|
|
752
752
|
}, config.pollIntervalMs);
|
|
753
753
|
`.trim()}function _x(e,n){return{command:e,args:["-e",G1(),$1(n)]}}var B1=2e3,U1=(()=>{let e=process.env.LINZUMI_CODEX_WS_KEEPALIVE_MS;if(e===void 0)return 2e4;let n=Number.parseInt(e,10);return Number.isInteger(n)&&n>0?n:2e4})();function W1(e){let n=e;if(typeof n.ping=="function"&&n.readyState===WebSocket.OPEN)try{n.ping()}catch{}}var H1=["LINZUMI_MCP_ACCESS_TOKEN","LINZUMI_MCP_OWNER_USERNAME"];async function V1(){return new Promise((e,n)=>{let t=K1();t.on("error",r=>n(r)),t.listen(0,"127.0.0.1",()=>{let r=t.address();if(typeof r=="object"&&r!==null){let i=r.port;t.close(o=>{o!==void 0?n(o):e(i)})}else t.close(),n(new Error("failed to allocate loopback port"))})})}async function Sx(e,n,t={}){return vx(e,n,t,1)}async function vx(e,n,t,r){let o=`ws://127.0.0.1:${await V1()}`,a=tj(o,t);r===1&&uj();let d="",s=Y1(),l=_x(process.execPath,{command:e,args:a,pollIntervalMs:B1,protectedPidsDir:mc()});Ee("process.spawn",{command:e,args:a,cwd:n,purpose:"codex.app_server"});let c=L1(l.command,[...l.args],{cwd:n,env:X1(t.env,t.inheritEnv??!0,n),stdio:s,detached:!0});hx(c,"stdout"),hx(c,"stderr",_=>{d=Q1(`${d}${_}`)});let u=mx({stop:()=>yx(c),pid:c.pid,ownProcessGroup:!0,kind:"codex.app_server"});c.once("exit",()=>u.unregister());let f=()=>{u.unregister(),yx(c)},p,h=()=>(u.unregister(),p??=nj(c),p);Ee("process.spawned",{command:e,args:a,cwd:n,pid:c.pid,purpose:"codex.app_server"}),c.once("exit",(_,y)=>{Ee("process.exit",{command:e,args:a,cwd:n,pid:c.pid,code:_,signal:y,purpose:"codex.app_server"})});try{await Tj(o,c)}catch(_){if(f(),Z1(_,d,r))return Ee("process.spawn.retry",{command:e,cwd:n,attempt:r,reason:"loopback_bind_in_use",purpose:"codex.app_server"}),vx(e,n,t,r+1);throw _}return{url:o,process:c,stop:f,stopAndWait:h}}function Q1(e){return e.length>12e3?e.slice(e.length-12e3):e}function Z1(e,n,t){let i=e instanceof Error?e.message:String(e);return t<3&&i.includes("codex app-server exited before readyz")&&n.includes("EADDRINUSE")&&n.includes("listen")}function Y1(){return["ignore","pipe","pipe"]}function hx(e,n,t=void 0){let r=e[n];r!==null&&r.on("data",i=>{let o=i.toString();t?.(o),Ee("process.output",{pid:e.pid,purpose:"codex.app_server",stream:n,chars:o.length,output:o})})}function X1(e,n,t){let r=n?{...process.env}:{};for(let i of H1)delete r[i];if(e!==void 0)for(let[i,o]of Object.entries(e))o===void 0?delete r[i]:r[i]=o;return n&&(r=Ml(r),r=b_(t,r,{log:(i,o)=>Ee(i,o)}),r=Ml(r)),r}function yx(e,n=process.kill){if(e.pid!==void 0)try{let t=Oo(e.pid,"SIGINT",n);t.sparedPids.length>0&&Ee("process.group_signal_spared_listeners",{pid:e.pid,signal:"SIGINT",sparedPids:[...t.sparedPids],purpose:"codex.app_server"});return}catch(t){xx(e.pid,"SIGINT",t)}e.kill("SIGINT")}function ej(e){try{return process.kill(-e,0),!0}catch(n){return Sf(n)!=="ESRCH"}}function nj(e,n={}){let t=e.pid;if(t===void 0)return Promise.reject(new Error("cannot reap owned Codex app-server without a process id"));let r=n.sigintGraceMs??5e3,i=n.sigkillWaitMs??5e3,o=n.killProcess??process.kill,a=n.listGroupPids??hc,d=n.processGroupExists??ej,s=n.protectedPids??_c;return new Promise((l,c)=>{let u=e.exitCode!==null||e.signalCode!==null,f=!1,p,h,_,y=()=>{p!==void 0&&clearTimeout(p),h!==void 0&&clearTimeout(h),_!==void 0&&clearTimeout(_)},g=O=>{if(!f)switch(f=!0,y(),e.off("exit",M),O){case"reaped":l();break;case"abandoned":c(new Error(`owned Codex app-server process group ${t} could not be confirmed reaped`));break}},v=()=>{let O=a(t);if(O===void 0)return;let J=s();return O.filter(k=>!J.has(k))},S=()=>{let O=v(),J=O===void 0?!d(t):O.length===0;return u&&J?(g("reaped"),!0):!1},R=()=>{f||_!==void 0||(_=setTimeout(()=>{_=void 0,S()||R()},10),_.unref?.())},E=O=>{try{let J=Oo(t,O,o,a,s());J.sparedPids.length>0&&Ee("process.group_signal_spared_listeners",{pid:t,signal:O,sparedPids:[...J.sparedPids],purpose:"codex.app_server"})}catch(J){if(Sf(J)!=="ESRCH"){xx(t,O,J);try{e.kill(O)}catch{}}}},M=()=>{u=!0,S()||R()};e.once("exit",M),E("SIGINT"),!S()&&(p=setTimeout(()=>{f||(E("SIGKILL"),S()||R(),h=setTimeout(()=>g("abandoned"),i),h.unref?.())},r),p.unref?.())})}function xx(e,n,t){let r=Sf(t),i=t instanceof Error?t.message:String(t);Ee(r==="EPERM"?"process.group_signal_denied":r==="ESRCH"?"process.group_signal_missing":"process.group_signal_failed",{pid:e,signal:n,code:r,message:i,fallback:"child_signal",purpose:"codex.app_server"}),r==="EPERM"&&process.stderr.write(`codex app-server process-group ${n} denied for pid ${e}; falling back to direct child ${n}
|
|
754
754
|
`)}function Sf(e){if(e!==null&&typeof e=="object"&&"code"in e){let n=e.code;return typeof n=="string"?n:void 0}}function tj(e,n={}){return["app-server",...pj(n),"--listen",e]}var rj=["-c","features.apps=false"],ij=["-c","features.default_mode_request_user_input=true"],wx="LINZUMI_CODEX_STREAM_IDLE_TIMEOUT_MS",oj="LINZUMI_CODEX_STREAM_IDLE_TIMEOUT_SOURCE",vf=5e3,xf=6e5,aj=["flag","env","server_default"];function dj(e){return aj.find(n=>n===e)}function sj(e){let n=e?.trim();if(e===void 0||n===void 0||n==="")return{state:"unset"};if(!/^[0-9]+$/.test(n))return{state:"invalid",raw:e};let t=Number(n);return!Number.isSafeInteger(t)||t<vf||t>xf?{state:"invalid",raw:e}:{state:"applied",timeoutMs:t}}function kx(e=process.env){let n=sj(e[wx]);if(n.state==="unset")return n;let t=dj(e[oj]?.trim())??"env";return{...n,source:t}}function lj(e=process.env){let n=kx(e);return n.state==="applied"?n.timeoutMs:void 0}function uj(e=process.env,n=t=>{process.stderr.write(`${t}
|
|
755
|
-
`)}){let t=kx(e);if(t.state!=="unset"){if(t.state==="invalid"){let r=cj();n(`ERROR: ${wx}='${t.raw}' is invalid; stream-idle-timeout stays OFF. Accepted: ${r}.`),Ee("codex.stream_idle_timeout_config_invalid",{level:"error",raw:t.raw,source:t.source,acceptedFormat:r,minMs:vf,maxMs:xf});return}Ee("codex.stream_idle_timeout_config_applied",{level:"info",timeoutMs:t.timeoutMs,source:t.source})}}function cj(){return`a plain positive integer between ${vf} and ${xf} (milliseconds)`}var Tx="openai-linzumi";function Ax(){let e=Tx;return["-c",`model_providers.${e}.name="OpenAI"`,"-c",`model_providers.${e}.wire_api="responses"`,"-c",`model_providers.${e}.requires_openai_auth=true`,"-c",`model_providers.${e}.supports_websockets=true`]}function fj(e){let n=Tx;return[...Ax(),"-c",`model_providers.${n}.stream_idle_timeout_ms=${e}`,"-c",`model_provider="${n}"`]}function pj(e,n=process.env){let t=lj(n);return[...rj,...e.nativeQuestionBridge==="durable"?ij:[],...fx(),...e.model===void 0?[]:["-c",`model=${JSON.stringify(e.model)}`],...e.reasoningEffort===void 0?[]:["-c",`model_reasoning_effort=${JSON.stringify(e.reasoningEffort)}`],...e.fast===!0?["-c",`service_tier=${JSON.stringify("fast")}`]:[],...(e.mcpServers??[]).flatMap(r=>Kg(r,{neverEquivalentGranularApprovalPolicy:e.neverEquivalentGranularApprovalPolicy===!0})),...e.modelProvider===void 0?t===void 0?Ax():fj(t):mj(e.modelProvider,t)]}function mj(e,n){return["-c",`model_providers.${e.id}.name=${JSON.stringify(e.name)}`,"-c",`model_providers.${e.id}.base_url=${JSON.stringify(e.baseUrl)}`,"-c",`model_providers.${e.id}.env_key=${JSON.stringify(e.envKey)}`,"-c",`model_providers.${e.id}.wire_api=${JSON.stringify(e.wireApi)}`,...Object.entries(e.httpHeaders??{}).flatMap(([t,r])=>["-c",`model_providers.${e.id}.http_headers.${t}=${JSON.stringify(r)}`]),...Object.entries(e.envHttpHeaders??{}).flatMap(([t,r])=>["-c",`model_providers.${e.id}.env_http_headers.${t}=${JSON.stringify(r)}`]),...n===void 0?[]:["-c",`model_providers.${e.id}.stream_idle_timeout_ms=${n}`],"-c",`model_provider=${JSON.stringify(e.id)}`]}async function Cx(e,n=r=>new z1(r),t=2e3){let r=await bj(e,n,t),i=J1(),o=new Map,a=new Set,d=new Set,s=[],l=new Set,c={nextId:1,closeError:void 0},u=_=>{let y=new Error(_);o.forEach(g=>g.reject(y)),o.clear()},f=setInterval(()=>W1(r),U1);f.unref?.();let p=_=>{if(clearInterval(f),u(_),c.closeError===void 0){c.closeError=new Error(_);for(let y of l)bx(y,c.closeError);l.clear()}};return r.addEventListener("close",()=>p("codex app-server websocket closed")),r.addEventListener("error",()=>p("codex app-server websocket closed")),r.addEventListener("message",_=>{let y=String(_.data),g=gj(y);if(g===void 0){_j(y,i);return}if(Zo({direction:"codex_to_commander",captureKind:yj(g),message:g,rawText:y,connectionId:i}),"id"in g&&("result"in g||"error"in g)){let v=o.get(g.id);v!==void 0&&(o.delete(g.id),v.resolve(g));return}if("id"in g&&typeof g.method=="string"){vj(r,g,d,i);return}if(!("id"in g)&&typeof g.method=="string"){let v=g;a.size===0?s.push(v):a.forEach(S=>gx(S,v))}}),await wj(r,o,i),{request:(_,y)=>{let g=c.nextId;return c.nextId+=1,Rx(r,o,y===void 0?{jsonrpc:"2.0",id:g,method:_}:{jsonrpc:"2.0",id:g,method:_,params:y},i)},notify:(_,y)=>{let g=y===void 0?{jsonrpc:"2.0",method:_}:{jsonrpc:"2.0",method:_,params:y};Zo({direction:"commander_to_codex",captureKind:"outgoing",message:g,rawText:JSON.stringify(g),connectionId:i}),r.send(JSON.stringify(g))},onNotification:_=>{a.add(_),s.splice(0).forEach(y=>gx(_,y))},onRequest:_=>{d.add(_)},onClose:_=>{if(c.closeError!==void 0){bx(_,c.closeError);return}l.add(_)},isClosed:()=>c.closeError!==void 0,close:()=>{clearInterval(f),r.close()}}}function Zo(e){uu()&&lo({provider:"codex-app-server",captureKind:e.captureKind,rawText:e.rawText,rawValue:{message:e.message},captureMetadata:{direction:e.direction,capturedAtMs:Date.now(),capturePid:process.pid,connectionId:e.connectionId,...hj(e.message),...e.extraMetadata??{}}})}function _j(e,n){uu()&&lo({provider:"codex-app-server",captureKind:"incoming",rawText:e,captureMetadata:{direction:"codex_to_commander",capturedAtMs:Date.now(),capturePid:process.pid,connectionId:n,malformed:!0}})}function hj(e){return!("params"in e)||!z(e.params)?{}:Vm(e.params)}function yj(e){return"id"in e&&("result"in e||"error"in e)?"response":"id"in e&&typeof e.method=="string"?"request":"notification"}function gj(e){let n=String(e);try{let t=JSON.parse(n);if(!z(t))throw new Error("codex app-server sent non-object JSON-RPC message");return t}catch(t){Ee("codex.app_server_frame_malformed",{purpose:"codex.app_server",message:t instanceof Error?t.message:String(t),payload:vt(n,512),payloadChars:n.length});return}}function gx(e,n){try{e(n)}catch(t){Ee("codex.notification_callback_failed",{purpose:"codex.app_server",method:n.method,message:t instanceof Error?t.message:String(t)})}}function bx(e,n){try{e(n)}catch(t){Ee("codex.close_callback_failed",{purpose:"codex.app_server",message:t instanceof Error?t.message:String(t)})}}async function bj(e,n,t=2e3){let r=Date.now()+t,i;for(;Date.now()<=r;){let o=n(e);try{return await kj(o,Math.max(1,r-Date.now())),o}catch(a){i=a instanceof Error?a:new Error(String(a)),Sj(o)}}throw i??new Error("websocket open failed")}function Sj(e){let n=()=>{e.removeEventListener("error",t),e.removeEventListener("close",r)},t=()=>n(),r=()=>n();e.addEventListener("error",t,{once:!0}),e.addEventListener("close",r,{once:!0});try{e.close()}catch(i){n(),console.warn(`codex_app_server_failed_open_close_threw error_name=${i instanceof Error?i.name:"NonErrorThrow"}`)}}async function vj(e,n,t,r){let i=o=>xj(e,o,n.method,r);try{if(t.size===0){i({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`unhandled Codex app-server request: ${n.method}`}});return}for(let o of t){let a=await o(n);if(a!==void 0){i({jsonrpc:"2.0",id:n.id,result:a});return}}i({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`unhandled Codex app-server request: ${n.method}`}})}catch(o){i({jsonrpc:"2.0",id:n.id,error:{code:-32e3,message:o instanceof Error?o.message:String(o)}})}}function xj(e,n,t,r){let i=JSON.stringify(n);Zo({direction:"commander_to_codex",captureKind:"response",message:n,rawText:i,connectionId:r,extraMetadata:{requestMethod:t}}),e.send(i)}async function wj(e,n,t){let r=await Rx(e,n,{jsonrpc:"2.0",id:"initialize",method:"initialize",params:{clientInfo:{name:"kandan-local-codex-runner",version:"0.0.1"},capabilities:{experimentalApi:!0}}},t);if("error"in r)throw new Error(`codex initialize failed: ${r.error.message}`);let i={jsonrpc:"2.0",method:"initialized"};Zo({direction:"commander_to_codex",captureKind:"outgoing",message:i,rawText:JSON.stringify(i),connectionId:t}),e.send(JSON.stringify(i))}function Rx(e,n,t,r){return e.readyState!==WebSocket.OPEN?Promise.reject(new Error("codex app-server websocket is not open")):new Promise((i,o)=>{n.set(t.id,{resolve:i,reject:o}),Zo({direction:"commander_to_codex",captureKind:"request",message:t,rawText:JSON.stringify(t),connectionId:r}),e.send(JSON.stringify(t))})}function kj(e,n){return new Promise((t,r)=>{let i,o=()=>{i!==void 0&&clearTimeout(i),e.removeEventListener("open",a),e.removeEventListener("error",d)},a=()=>{o(),t()},d=()=>{o(),r(new Error("websocket open failed"))};e.addEventListener("open",a,{once:!0}),e.addEventListener("error",d,{once:!0}),i=setTimeout(()=>{o(),r(new Error("websocket open timed out"))},n),i.unref?.()})}function Tj(e,n,t=1e4){let r=Aj(e),i=Date.now()+t;return new Promise((o,a)=>{let d=!1,s,l=p=>{d||(d=!0,s!==void 0&&clearTimeout(s),n.off("exit",c),p==="ready"?o():a(p))},c=(p,h)=>{l(new Error(`codex app-server exited before readyz: ${p??h??"unknown"}`))},u=()=>{s=setTimeout(f,50)},f=async()=>{if(Date.now()>i){l(new Error("timed out waiting for codex app-server readyz"));return}try{(await fetch(r)).ok?l("ready"):u()}catch{u()}};n.once("exit",c),f()})}function Aj(e){let n=new URL(e);return n.protocol=n.protocol==="wss:"?"https:":"http:",n.pathname="/readyz",n.search="",n.hash="",n.toString()}import{delimiter as VW,isAbsolute as QW,join as Px,parse as ZW,resolve as YW,sep as XW}from"node:path";var e4=[".volta",".nvm",".npm",".asdf",".fnm",".bun",Px(".cargo","bin"),Px(".local","bin")];var Ix=["wafer","openai"];var wf="1.0.277",o4=`linzumi ${wf}`;var Mx="LINZUMI_REMOTE_CODEX_HARNESS_CONFIG_B64",$x="linzumi-remote-codex-harness",Ij=Object.assign((e,n)=>{Ee(e,n)},{close:()=>Promise.resolve()});async function Gx(e=process.env){await Ej(Oj(e))}async function Ej(e,n={}){let t={startCodexAppServer:Sx,connectCodexAppServer:Cx,connectPhoenixClient:ey,attachChannelSession:yv,waitUntilShutdown:Lj,writeStdout:u=>process.stdout.write(u),log:Ij,...n},r=$j(e),i=zg(process.execPath,jj(process.argv[1]),process.execArgv),o;try{o=await t.startCodexAppServer(e.codexBin,e.workerCwd,{model:e.model,reasoningEffort:e.reasoningEffort,fast:e.fast,inheritEnv:!1,env:Gj(process.env,e.execServerUrl),neverEquivalentGranularApprovalPolicy:K_(e.approvalPolicy,e.sandbox),mcpServers:[Jg({command:i.command,argsPrefix:i.argsPrefix,kandanUrl:e.kandanUrl,authFilePath:r.path,ownerUsername:e.listenUser,operatingMode:"text",cwd:e.cwd,threadId:e.kandanThreadId})]})}catch(u){throw r.cleanup(),u}o.process.once("exit",()=>r.cleanup());let a,d,s,c=Jj(async()=>{await s?.close(),d?.close(),a?.close(),o.stop(),r.cleanup()});try{d=await t.connectCodexAppServer(o.url),await Mj(d,e.execServerUrl),a=await t.connectPhoenixClient(e.kandanUrl,e.token);let u=`local_runner:${e.runnerId}`,f=()=>Nj(e),p=[],h={value:void 0};a.onControl(S=>{let R=h.value;if(R===void 0){p.push(S);return}R(S)});let _=await a.join(u,f(),{rejoinPayload:f}),y={current:Wc(_)};if(y.current.type==="invalid")throw t.log("runner.supported_runner_events_invalid",{source:"remote_harness_join",runner_id:e.runnerId,reason:y.current.reason}),new Error(`invalid supported_runner_events in Kandan join response: ${y.current.reason}`);a.onReconnect(S=>{let R=cv(y.current,S.get(u));switch(R.type){case"accepted":y.current=R.support;break;case"rejected_invalid":t.log("runner.supported_runner_events_invalid",{source:"remote_harness_rejoin",runner_id:e.runnerId,reason:R.reason});break}return s?.handleKandanReconnect()}),s=await t.attachChannelSession({kandan:a,codex:d,topic:u,instanceId:e.instanceId,onRequiredAdtRecoveryUnrecoverable:S=>{t.log("adt.required_recovery_unrecoverable",{reason:S,runner_id:e.runnerId,instance_id:e.instanceId}),process.exit(75)},options:{kandanUrl:e.kandanUrl,token:e.token,runnerId:e.runnerId,cwd:e.cwd,codexBin:e.codexBin,runnerEventSupport:()=>y.current,fast:e.fast,launchTui:!1,enablePortForwardWatch:!1,channelSession:{workspaceSlug:e.workspaceSlug,channelSlug:e.channelSlug,kandanThreadId:e.kandanThreadId,rootSeq:e.rootSeq,startCodexThread:!0,linzumiContext:e.linzumiContext,developerPrompt:e.developerPrompt,agentNickname:e.agentNickname,listenUser:e.listenUser,model:e.model,reasoningEffort:e.reasoningEffort,sandbox:e.sandbox,approvalPolicy:e.approvalPolicy,codexEnvironmentId:$x,allowPortForwardingByDefault:e.allowPortForwardingByDefault}},log:t.log});let g=S=>{let R=s,E=a;if(R===void 0||E===void 0){p.push(S);return}R.handleControl(S).then(M=>M===void 0?void 0:E.push(u,"codex_response",M)).catch(M=>E.push(u,"codex_error",{instanceId:e.instanceId,message:hS(M)})).catch(M=>{t.log("remote_codex_harness.control_push_failed",{message:M instanceof Error?M.message:String(M)})})};h.value=g,p.splice(0).forEach(g),d.onNotification(S=>{let R=S.params??{};s?.handleCodexNotification(S.method,R)}),await s.startThreadMessageTurn({seq:e.sourceSeq,body:e.workDescription}),t.writeStdout(`LINZUMI_REMOTE_CODEX_HARNESS_READY ${e.readyToken}
|
|
755
|
+
`)}){let t=kx(e);if(t.state!=="unset"){if(t.state==="invalid"){let r=cj();n(`ERROR: ${wx}='${t.raw}' is invalid; stream-idle-timeout stays OFF. Accepted: ${r}.`),Ee("codex.stream_idle_timeout_config_invalid",{level:"error",raw:t.raw,source:t.source,acceptedFormat:r,minMs:vf,maxMs:xf});return}Ee("codex.stream_idle_timeout_config_applied",{level:"info",timeoutMs:t.timeoutMs,source:t.source})}}function cj(){return`a plain positive integer between ${vf} and ${xf} (milliseconds)`}var Tx="openai-linzumi";function Ax(){let e=Tx;return["-c",`model_providers.${e}.name="OpenAI"`,"-c",`model_providers.${e}.wire_api="responses"`,"-c",`model_providers.${e}.requires_openai_auth=true`,"-c",`model_providers.${e}.supports_websockets=true`]}function fj(e){let n=Tx;return[...Ax(),"-c",`model_providers.${n}.stream_idle_timeout_ms=${e}`,"-c",`model_provider="${n}"`]}function pj(e,n=process.env){let t=lj(n);return[...rj,...e.nativeQuestionBridge==="durable"?ij:[],...fx(),...e.model===void 0?[]:["-c",`model=${JSON.stringify(e.model)}`],...e.reasoningEffort===void 0?[]:["-c",`model_reasoning_effort=${JSON.stringify(e.reasoningEffort)}`],...e.fast===!0?["-c",`service_tier=${JSON.stringify("fast")}`]:[],...(e.mcpServers??[]).flatMap(r=>Kg(r,{neverEquivalentGranularApprovalPolicy:e.neverEquivalentGranularApprovalPolicy===!0})),...e.modelProvider===void 0?t===void 0?Ax():fj(t):mj(e.modelProvider,t)]}function mj(e,n){return["-c",`model_providers.${e.id}.name=${JSON.stringify(e.name)}`,"-c",`model_providers.${e.id}.base_url=${JSON.stringify(e.baseUrl)}`,"-c",`model_providers.${e.id}.env_key=${JSON.stringify(e.envKey)}`,"-c",`model_providers.${e.id}.wire_api=${JSON.stringify(e.wireApi)}`,...Object.entries(e.httpHeaders??{}).flatMap(([t,r])=>["-c",`model_providers.${e.id}.http_headers.${t}=${JSON.stringify(r)}`]),...Object.entries(e.envHttpHeaders??{}).flatMap(([t,r])=>["-c",`model_providers.${e.id}.env_http_headers.${t}=${JSON.stringify(r)}`]),...n===void 0?[]:["-c",`model_providers.${e.id}.stream_idle_timeout_ms=${n}`],"-c",`model_provider=${JSON.stringify(e.id)}`]}async function Cx(e,n=r=>new z1(r),t=2e3){let r=await bj(e,n,t),i=J1(),o=new Map,a=new Set,d=new Set,s=[],l=new Set,c={nextId:1,closeError:void 0},u=_=>{let y=new Error(_);o.forEach(g=>g.reject(y)),o.clear()},f=setInterval(()=>W1(r),U1);f.unref?.();let p=_=>{if(clearInterval(f),u(_),c.closeError===void 0){c.closeError=new Error(_);for(let y of l)bx(y,c.closeError);l.clear()}};return r.addEventListener("close",()=>p("codex app-server websocket closed")),r.addEventListener("error",()=>p("codex app-server websocket closed")),r.addEventListener("message",_=>{let y=String(_.data),g=gj(y);if(g===void 0){_j(y,i);return}if(Zo({direction:"codex_to_commander",captureKind:yj(g),message:g,rawText:y,connectionId:i}),"id"in g&&("result"in g||"error"in g)){let v=o.get(g.id);v!==void 0&&(o.delete(g.id),v.resolve(g));return}if("id"in g&&typeof g.method=="string"){vj(r,g,d,i);return}if(!("id"in g)&&typeof g.method=="string"){let v=g;a.size===0?s.push(v):a.forEach(S=>gx(S,v))}}),await wj(r,o,i),{request:(_,y)=>{let g=c.nextId;return c.nextId+=1,Rx(r,o,y===void 0?{jsonrpc:"2.0",id:g,method:_}:{jsonrpc:"2.0",id:g,method:_,params:y},i)},notify:(_,y)=>{let g=y===void 0?{jsonrpc:"2.0",method:_}:{jsonrpc:"2.0",method:_,params:y};Zo({direction:"commander_to_codex",captureKind:"outgoing",message:g,rawText:JSON.stringify(g),connectionId:i}),r.send(JSON.stringify(g))},onNotification:_=>{a.add(_),s.splice(0).forEach(y=>gx(_,y))},onRequest:_=>{d.add(_)},onClose:_=>{if(c.closeError!==void 0){bx(_,c.closeError);return}l.add(_)},isClosed:()=>c.closeError!==void 0,close:()=>{clearInterval(f),r.close()}}}function Zo(e){uu()&&lo({provider:"codex-app-server",captureKind:e.captureKind,rawText:e.rawText,rawValue:{message:e.message},captureMetadata:{direction:e.direction,capturedAtMs:Date.now(),capturePid:process.pid,connectionId:e.connectionId,...hj(e.message),...e.extraMetadata??{}}})}function _j(e,n){uu()&&lo({provider:"codex-app-server",captureKind:"incoming",rawText:e,captureMetadata:{direction:"codex_to_commander",capturedAtMs:Date.now(),capturePid:process.pid,connectionId:n,malformed:!0}})}function hj(e){return!("params"in e)||!z(e.params)?{}:Vm(e.params)}function yj(e){return"id"in e&&("result"in e||"error"in e)?"response":"id"in e&&typeof e.method=="string"?"request":"notification"}function gj(e){let n=String(e);try{let t=JSON.parse(n);if(!z(t))throw new Error("codex app-server sent non-object JSON-RPC message");return t}catch(t){Ee("codex.app_server_frame_malformed",{purpose:"codex.app_server",message:t instanceof Error?t.message:String(t),payload:vt(n,512),payloadChars:n.length});return}}function gx(e,n){try{e(n)}catch(t){Ee("codex.notification_callback_failed",{purpose:"codex.app_server",method:n.method,message:t instanceof Error?t.message:String(t)})}}function bx(e,n){try{e(n)}catch(t){Ee("codex.close_callback_failed",{purpose:"codex.app_server",message:t instanceof Error?t.message:String(t)})}}async function bj(e,n,t=2e3){let r=Date.now()+t,i;for(;Date.now()<=r;){let o=n(e);try{return await kj(o,Math.max(1,r-Date.now())),o}catch(a){i=a instanceof Error?a:new Error(String(a)),Sj(o)}}throw i??new Error("websocket open failed")}function Sj(e){let n=()=>{e.removeEventListener("error",t),e.removeEventListener("close",r)},t=()=>n(),r=()=>n();e.addEventListener("error",t,{once:!0}),e.addEventListener("close",r,{once:!0});try{e.close()}catch(i){n(),console.warn(`codex_app_server_failed_open_close_threw error_name=${i instanceof Error?i.name:"NonErrorThrow"}`)}}async function vj(e,n,t,r){let i=o=>xj(e,o,n.method,r);try{if(t.size===0){i({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`unhandled Codex app-server request: ${n.method}`}});return}for(let o of t){let a=await o(n);if(a!==void 0){i({jsonrpc:"2.0",id:n.id,result:a});return}}i({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`unhandled Codex app-server request: ${n.method}`}})}catch(o){i({jsonrpc:"2.0",id:n.id,error:{code:-32e3,message:o instanceof Error?o.message:String(o)}})}}function xj(e,n,t,r){let i=JSON.stringify(n);Zo({direction:"commander_to_codex",captureKind:"response",message:n,rawText:i,connectionId:r,extraMetadata:{requestMethod:t}}),e.send(i)}async function wj(e,n,t){let r=await Rx(e,n,{jsonrpc:"2.0",id:"initialize",method:"initialize",params:{clientInfo:{name:"kandan-local-codex-runner",version:"0.0.1"},capabilities:{experimentalApi:!0}}},t);if("error"in r)throw new Error(`codex initialize failed: ${r.error.message}`);let i={jsonrpc:"2.0",method:"initialized"};Zo({direction:"commander_to_codex",captureKind:"outgoing",message:i,rawText:JSON.stringify(i),connectionId:t}),e.send(JSON.stringify(i))}function Rx(e,n,t,r){return e.readyState!==WebSocket.OPEN?Promise.reject(new Error("codex app-server websocket is not open")):new Promise((i,o)=>{n.set(t.id,{resolve:i,reject:o}),Zo({direction:"commander_to_codex",captureKind:"request",message:t,rawText:JSON.stringify(t),connectionId:r}),e.send(JSON.stringify(t))})}function kj(e,n){return new Promise((t,r)=>{let i,o=()=>{i!==void 0&&clearTimeout(i),e.removeEventListener("open",a),e.removeEventListener("error",d)},a=()=>{o(),t()},d=()=>{o(),r(new Error("websocket open failed"))};e.addEventListener("open",a,{once:!0}),e.addEventListener("error",d,{once:!0}),i=setTimeout(()=>{o(),r(new Error("websocket open timed out"))},n),i.unref?.()})}function Tj(e,n,t=1e4){let r=Aj(e),i=Date.now()+t;return new Promise((o,a)=>{let d=!1,s,l=p=>{d||(d=!0,s!==void 0&&clearTimeout(s),n.off("exit",c),p==="ready"?o():a(p))},c=(p,h)=>{l(new Error(`codex app-server exited before readyz: ${p??h??"unknown"}`))},u=()=>{s=setTimeout(f,50)},f=async()=>{if(Date.now()>i){l(new Error("timed out waiting for codex app-server readyz"));return}try{(await fetch(r)).ok?l("ready"):u()}catch{u()}};n.once("exit",c),f()})}function Aj(e){let n=new URL(e);return n.protocol=n.protocol==="wss:"?"https:":"http:",n.pathname="/readyz",n.search="",n.hash="",n.toString()}import{delimiter as VW,isAbsolute as QW,join as Px,parse as ZW,resolve as YW,sep as XW}from"node:path";var e4=[".volta",".nvm",".npm",".asdf",".fnm",".bun",Px(".cargo","bin"),Px(".local","bin")];var Ix=["wafer","openai"];var wf="1.0.278",o4=`linzumi ${wf}`;var Mx="LINZUMI_REMOTE_CODEX_HARNESS_CONFIG_B64",$x="linzumi-remote-codex-harness",Ij=Object.assign((e,n)=>{Ee(e,n)},{close:()=>Promise.resolve()});async function Gx(e=process.env){await Ej(Oj(e))}async function Ej(e,n={}){let t={startCodexAppServer:Sx,connectCodexAppServer:Cx,connectPhoenixClient:ey,attachChannelSession:yv,waitUntilShutdown:Lj,writeStdout:u=>process.stdout.write(u),log:Ij,...n},r=$j(e),i=zg(process.execPath,jj(process.argv[1]),process.execArgv),o;try{o=await t.startCodexAppServer(e.codexBin,e.workerCwd,{model:e.model,reasoningEffort:e.reasoningEffort,fast:e.fast,inheritEnv:!1,env:Gj(process.env,e.execServerUrl),neverEquivalentGranularApprovalPolicy:K_(e.approvalPolicy,e.sandbox),mcpServers:[Jg({command:i.command,argsPrefix:i.argsPrefix,kandanUrl:e.kandanUrl,authFilePath:r.path,ownerUsername:e.listenUser,operatingMode:"text",cwd:e.cwd,threadId:e.kandanThreadId})]})}catch(u){throw r.cleanup(),u}o.process.once("exit",()=>r.cleanup());let a,d,s,c=Jj(async()=>{await s?.close(),d?.close(),a?.close(),o.stop(),r.cleanup()});try{d=await t.connectCodexAppServer(o.url),await Mj(d,e.execServerUrl),a=await t.connectPhoenixClient(e.kandanUrl,e.token);let u=`local_runner:${e.runnerId}`,f=()=>Nj(e),p=[],h={value:void 0};a.onControl(S=>{let R=h.value;if(R===void 0){p.push(S);return}R(S)});let _=await a.join(u,f(),{rejoinPayload:f}),y={current:Wc(_)};if(y.current.type==="invalid")throw t.log("runner.supported_runner_events_invalid",{source:"remote_harness_join",runner_id:e.runnerId,reason:y.current.reason}),new Error(`invalid supported_runner_events in Kandan join response: ${y.current.reason}`);a.onReconnect(S=>{let R=cv(y.current,S.get(u));switch(R.type){case"accepted":y.current=R.support;break;case"rejected_invalid":t.log("runner.supported_runner_events_invalid",{source:"remote_harness_rejoin",runner_id:e.runnerId,reason:R.reason});break}return s?.handleKandanReconnect()}),s=await t.attachChannelSession({kandan:a,codex:d,topic:u,instanceId:e.instanceId,onRequiredAdtRecoveryUnrecoverable:S=>{t.log("adt.required_recovery_unrecoverable",{reason:S,runner_id:e.runnerId,instance_id:e.instanceId}),process.exit(75)},options:{kandanUrl:e.kandanUrl,token:e.token,runnerId:e.runnerId,cwd:e.cwd,codexBin:e.codexBin,runnerEventSupport:()=>y.current,fast:e.fast,launchTui:!1,enablePortForwardWatch:!1,channelSession:{workspaceSlug:e.workspaceSlug,channelSlug:e.channelSlug,kandanThreadId:e.kandanThreadId,rootSeq:e.rootSeq,startCodexThread:!0,linzumiContext:e.linzumiContext,developerPrompt:e.developerPrompt,agentNickname:e.agentNickname,listenUser:e.listenUser,model:e.model,reasoningEffort:e.reasoningEffort,sandbox:e.sandbox,approvalPolicy:e.approvalPolicy,codexEnvironmentId:$x,allowPortForwardingByDefault:e.allowPortForwardingByDefault}},log:t.log});let g=S=>{let R=s,E=a;if(R===void 0||E===void 0){p.push(S);return}R.handleControl(S).then(M=>M===void 0?void 0:E.push(u,"codex_response",M)).catch(M=>E.push(u,"codex_error",{instanceId:e.instanceId,message:hS(M)})).catch(M=>{t.log("remote_codex_harness.control_push_failed",{message:M instanceof Error?M.message:String(M)})})};h.value=g,p.splice(0).forEach(g),d.onNotification(S=>{let R=S.params??{};s?.handleCodexNotification(S.method,R)}),await s.startThreadMessageTurn({seq:e.sourceSeq,body:e.workDescription}),t.writeStdout(`LINZUMI_REMOTE_CODEX_HARNESS_READY ${e.readyToken}
|
|
756
756
|
`);let v=await Promise.race([t.waitUntilShutdown(c).then(()=>({type:"shutdown"})),Kj(o.process).then(S=>({type:"codex_exit",exit:S}))]);v.type==="codex_exit"&&(t.log("remote_codex_harness.codex_app_server_exited",{code:v.exit.code,signal:v.exit.signal}),await c())}catch(u){throw await c(),u}}function Oj(e){let n=e[Mx];if(n===void 0||n.trim()==="")throw new Error(`${Mx} is required`);return qj(JSON.parse(Buffer.from(n,"base64url").toString("utf8")))}function qj(e){let n=zj(e);return{kandanUrl:An(n,"kandanUrl"),token:An(n,"token"),runnerId:An(n,"runnerId"),instanceId:An(n,"instanceId"),workspaceSlug:An(n,"workspaceSlug"),channelSlug:An(n,"channelSlug"),kandanThreadId:An(n,"kandanThreadId"),rootSeq:Fx(n,"rootSeq"),sourceSeq:Fx(n,"sourceSeq"),cwd:An(n,"cwd"),workerCwd:An(n,"workerCwd"),workDescription:An(n,"workDescription"),...wi(n,"developerPrompt"),...wi(n,"agentNickname"),readyToken:An(n,"readyToken"),codexBin:An(n,"codexBin"),execServerUrl:An(n,"execServerUrl"),listenUser:An(n,"listenUser"),...wi(n,"model"),...wi(n,"reasoningEffort"),...wi(n,"approvalPolicy"),...wi(n,"sandbox"),...jx(n,"fast"),...jx(n,"allowPortForwardingByDefault"),...Bj(n,"linzumiContext")}}async function Mj(e,n){let t=await e.request("environment/add",{environmentId:$x,execServerUrl:n});Fj(t,"environment/add")}function Fj(e,n){if("error"in e)throw new Error(`${n} failed: ${e.error.message}`)}function jj(e){if(e===void 0||e.trim()==="")return e;switch(Pj(e)){case"remote-codex-harness-worker.js":case"remote-codex-harness-worker.mjs":case"remote-codex-harness-worker.cjs":return Ss(qx(e),"linzumi.js");case"remoteCodexHarnessWorkerEntrypoint.ts":case"remoteCodexHarnessWorkerEntrypoint.js":return Ss(qx(e),"index.ts");default:return e}}function $j(e){let n=Cj(Ss(Rj(),"linzumi-mcp-auth-"));Ex(n,448);let t=Ss(n,"auth.json");try{Ff({kandanUrl:e.kandanUrl,accessToken:e.token,authFilePath:t}),Ex(t,384)}catch(i){throw Ox(n,{recursive:!0,force:!0}),i}let r=!1;return{path:t,cleanup:()=>{r||(r=!0,Ox(n,{recursive:!0,force:!0}))}}}function Gj(e,n){let t={CODEX_EXEC_SERVER_URL:n,LINZUMI_REMOTE_CODEX_HARNESS:"1"};for(let r of Dj){let i=e[r];i!==void 0&&i.trim()!==""&&(t[r]=i)}return t}var Dj=["PATH","HOME","TMPDIR","SHELL","USER","LOGNAME","CODEX_HOME","XDG_CONFIG_HOME","XDG_DATA_HOME","SSL_CERT_FILE","NIX_SSL_CERT_FILE","NODE_EXTRA_CA_CERTS"];function Nj(e){return{clientName:"kandan-remote-codex-harness-worker",clientId:e.instanceId,connectionMode:"session_worker",runnerPid:process.pid,version:wf,cwd:e.cwd,workspace:e.workspaceSlug,channel:e.channelSlug,capabilities:{codexAppServer:!0,client_message_ids:!0,commander_pipeline:"pipeline",defaultAgentProvider:"codex",agentProviders:["codex"],modelProviders:[...Ix],remoteCodexExecution:!1,allowedCwdSuggestions:[],allowedCwdProjects:[],portForwarding:!1,tcpForwarding:!1,linzumiMcp:!0}}}function Lj(e){return new Promise((n,t)=>{let r=()=>{e().then(n,t)};process.once("SIGINT",r),process.once("SIGTERM",r)})}function Jj(e){let n;return()=>(n=n??e(),n)}function Kj(e){return e.exitCode!==null||e.signalCode!==null?Promise.resolve({code:e.exitCode,signal:e.signalCode}):new Promise(n=>{e.once("exit",(t,r)=>{n({code:t,signal:r})})})}function zj(e){if(e===null||typeof e!="object"||Array.isArray(e))throw new Error("remote Codex harness worker config must be an object");return e}function An(e,n){let t=e[n];if(typeof t!="string"||t.trim()==="")throw new Error(`remote Codex harness worker config missing ${n}`);return t}function Fx(e,n){let t=e[n];if(typeof t!="number"||!Number.isInteger(t)||t<=0)throw new Error(`remote Codex harness worker config missing ${n}`);return t}function wi(e,n){let t=e[n];if(t===void 0)return{};if(typeof t!="string"||t.trim()==="")throw new Error(`remote Codex harness worker config invalid ${n}`);return{[n]:t}}function jx(e,n){let t=e[n];if(t===void 0)return{};if(typeof t!="boolean")throw new Error(`remote Codex harness worker config invalid ${n}`);return{[n]:t}}function Bj(e,n){let t=e[n];if(t===void 0)return{};if(t===null||typeof t!="object"||Array.isArray(t))throw new Error(`remote Codex harness worker config invalid ${n}`);return{[n]:t}}import{resolve as Uj}from"node:path";import{fileURLToPath as Wj}from"node:url";var Dx=process.argv[1];if(Dx!==void 0&&Wj(import.meta.url)===Uj(Dx))try{await Gx()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}
|
|
757
757
|
`),process.exit(1)}export{Gx as runRemoteCodexHarnessWorkerFromEnv};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linzumi/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.278",
|
|
4
4
|
"description": "Linzumi CLI \u2014 point a Codex agent at the real code on your laptop, with your team watching and steering from shared threads.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@anthropic-ai/claude-agent-sdk": "0.3.283",
|
|
44
44
|
"@inquirer/prompts": "^7.8.6",
|
|
45
45
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
46
|
-
"@openai/codex": "0.
|
|
46
|
+
"@openai/codex": "0.158.0",
|
|
47
47
|
"blessed": "^0.1.81",
|
|
48
48
|
"proper-lockfile": "3.2.0",
|
|
49
49
|
"undici": "^6.25.0",
|