@linzumi/cli 1.0.279 → 1.0.280
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 +305 -305
- package/dist/remote-codex-harness-worker.js +1 -1
- package/package.json +1 -1
|
@@ -746,6 +746,6 @@ const watchdog = setInterval(() => {
|
|
|
746
746
|
}, config.pollIntervalMs);
|
|
747
747
|
`.trim()}function Hv(e,n){return{command:e,args:["-e",AF(),TF(n)]}}var qF=2e3,MF=(()=>{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 FF(e){let n=e;if(typeof n.ping=="function"&&n.readyState===WebSocket.OPEN)try{n.ping()}catch{}}var jF=["LINZUMI_MCP_ACCESS_TOKEN","LINZUMI_MCP_OWNER_USERNAME"];async function $F(){return new Promise((e,n)=>{let t=EF();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 ex(e,n,t={}){return nx(e,n,t,1)}async function nx(e,n,t,r){let o=`ws://127.0.0.1:${await $F()}`,a=zF(o,t);r===1&&YF();let d="",s=GF(),l=Hv(process.execPath,{command:e,args:a,pollIntervalMs:qF,protectedPidsDir:ac()});Ee("process.spawn",{command:e,args:a,cwd:n,purpose:"codex.app_server"});let c=PF(l.command,[...l.args],{cwd:n,env:LF(t.env,t.inheritEnv??!0,n),stdio:s,detached:!0});Qv(c,"stdout"),Qv(c,"stderr",_=>{d=DF(`${d}${_}`)});let u=Vv({stop:()=>Zv(c),pid:c.pid,ownProcessGroup:!0,kind:"codex.app_server"});c.once("exit",()=>u.unregister());let f=()=>{u.unregister(),Zv(c)},p,h=()=>(u.unregister(),p??=KF(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 p1(o,c)}catch(_){if(f(),NF(_,d,r))return Ee("process.spawn.retry",{command:e,cwd:n,attempt:r,reason:"loopback_bind_in_use",purpose:"codex.app_server"}),nx(e,n,t,r+1);throw _}return{url:o,process:c,stop:f,stopAndWait:h}}function DF(e){return e.length>12e3?e.slice(e.length-12e3):e}function NF(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 GF(){return["ignore","pipe","pipe"]}function Qv(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 LF(e,n,t){let r=n?{...process.env}:{};for(let i of jF)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=Rl(r),r=c_(t,r,{log:(i,o)=>Ee(i,o)}),r=Rl(r)),r}function Zv(e,n=process.kill){if(e.pid!==void 0)try{let t=Ro(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){tx(e.pid,"SIGINT",t)}e.kill("SIGINT")}function JF(e){try{return process.kill(-e,0),!0}catch(n){return ff(n)!=="ESRCH"}}function KF(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??sc,d=n.processGroupExists??JF,s=n.protectedPids??dc;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(_)},b=D=>{if(!f)switch(f=!0,y(),e.off("exit",E),D){case"reaped":l();break;case"abandoned":c(new Error(`owned Codex app-server process group ${t} could not be confirmed reaped`));break}},v=()=>{let D=a(t);if(D===void 0)return;let U=s();return D.filter(k=>!U.has(k))},g=()=>{let D=v(),U=D===void 0?!d(t):D.length===0;return u&&U?(b("reaped"),!0):!1},C=()=>{f||_!==void 0||(_=setTimeout(()=>{_=void 0,g()||C()},10),_.unref?.())},R=D=>{try{let U=Ro(t,D,o,a,s());U.sparedPids.length>0&&Ee("process.group_signal_spared_listeners",{pid:t,signal:D,sparedPids:[...U.sparedPids],purpose:"codex.app_server"})}catch(U){if(ff(U)!=="ESRCH"){tx(t,D,U);try{e.kill(D)}catch{}}}},E=()=>{u=!0,g()||C()};e.once("exit",E),R("SIGINT"),!g()&&(p=setTimeout(()=>{f||(R("SIGKILL"),g()||C(),h=setTimeout(()=>b("abandoned"),i),h.unref?.())},r),p.unref?.())})}function tx(e,n,t){let r=ff(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}
|
|
748
748
|
`)}function ff(e){if(e!==null&&typeof e=="object"&&"code"in e){let n=e.code;return typeof n=="string"?n:void 0}}function zF(e,n={}){return["app-server",...n1(n),"--listen",e]}var UF=["-c","features.apps=false"],BF=["-c","features.default_mode_request_user_input=true"],rx="LINZUMI_CODEX_STREAM_IDLE_TIMEOUT_MS",WF="LINZUMI_CODEX_STREAM_IDLE_TIMEOUT_SOURCE",pf=5e3,mf=6e5,VF=["flag","env","server_default"];function HF(e){return VF.find(n=>n===e)}function QF(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<pf||t>mf?{state:"invalid",raw:e}:{state:"applied",timeoutMs:t}}function ix(e=process.env){let n=QF(e[rx]);if(n.state==="unset")return n;let t=HF(e[WF]?.trim())??"env";return{...n,source:t}}function ZF(e=process.env){let n=ix(e);return n.state==="applied"?n.timeoutMs:void 0}function YF(e=process.env,n=t=>{process.stderr.write(`${t}
|
|
749
|
-
`)}){let t=ix(e);if(t.state!=="unset"){if(t.state==="invalid"){let r=XF();n(`ERROR: ${rx}='${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:pf,maxMs:mf});return}Ee("codex.stream_idle_timeout_config_applied",{level:"info",timeoutMs:t.timeoutMs,source:t.source})}}function XF(){return`a plain positive integer between ${pf} and ${mf} (milliseconds)`}var ox="openai-linzumi";function ax(){let e=ox;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 e1(e){let n=ox;return[...ax(),"-c",`model_providers.${n}.stream_idle_timeout_ms=${e}`,"-c",`model_provider="${n}"`]}function n1(e,n=process.env){let t=ZF(n);return[...UF,...e.nativeQuestionBridge==="durable"?BF:[],...Bv(),...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=>wg(r,{neverEquivalentGranularApprovalPolicy:e.neverEquivalentGranularApprovalPolicy===!0})),...e.modelProvider===void 0?t===void 0?ax():e1(t):t1(e.modelProvider,t)]}function t1(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 dx(e,n=r=>new OF(r),t=2e3){let r=await d1(e,n,t),i=IF(),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(b=>b.reject(y)),o.clear()},f=setInterval(()=>FF(r),MF);f.unref?.();let p=_=>{if(clearInterval(f),u(_),c.closeError===void 0){c.closeError=new Error(_);for(let y of l)Xv(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),b=a1(y);if(b===void 0){r1(y,i);return}if(Wo({direction:"codex_to_commander",captureKind:o1(b),message:b,rawText:y,connectionId:i}),"id"in b&&("result"in b||"error"in b)){let v=o.get(b.id);v!==void 0&&(o.delete(b.id),v.resolve(b));return}if("id"in b&&typeof b.method=="string"){l1(r,b,d,i);return}if(!("id"in b)&&typeof b.method=="string"){let v=b;a.size===0?s.push(v):a.forEach(g=>Yv(g,v))}}),await c1(r,o,i),{request:(_,y)=>{let b=c.nextId;return c.nextId+=1,sx(r,o,y===void 0?{jsonrpc:"2.0",id:b,method:_}:{jsonrpc:"2.0",id:b,method:_,params:y},i)},notify:(_,y)=>{let b=y===void 0?{jsonrpc:"2.0",method:_}:{jsonrpc:"2.0",method:_,params:y};Wo({direction:"commander_to_codex",captureKind:"outgoing",message:b,rawText:JSON.stringify(b),connectionId:i}),r.send(JSON.stringify(b))},onNotification:_=>{a.add(_),s.splice(0).forEach(y=>Yv(_,y))},onRequest:_=>{d.add(_)},onClose:_=>{if(c.closeError!==void 0){Xv(_,c.closeError);return}l.add(_)},isClosed:()=>c.closeError!==void 0,close:()=>{clearInterval(f),r.close()}}}function Wo(e){iu()&&ao({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,...i1(e.message),...e.extraMetadata??{}}})}function r1(e,n){iu()&&ao({provider:"codex-app-server",captureKind:"incoming",rawText:e,captureMetadata:{direction:"codex_to_commander",capturedAtMs:Date.now(),capturePid:process.pid,connectionId:n,malformed:!0}})}function i1(e){return!("params"in e)||!z(e.params)?{}:Lm(e.params)}function o1(e){return"id"in e&&("result"in e||"error"in e)?"response":"id"in e&&typeof e.method=="string"?"request":"notification"}function a1(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:bt(n,512),payloadChars:n.length});return}}function Yv(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 Xv(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 d1(e,n,t=2e3){let r=Date.now()+t,i;for(;Date.now()<=r;){let o=n(e);try{return await f1(o,Math.max(1,r-Date.now())),o}catch(a){i=a instanceof Error?a:new Error(String(a)),s1(o)}}throw i??new Error("websocket open failed")}function s1(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 l1(e,n,t,r){let i=o=>u1(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 u1(e,n,t,r){let i=JSON.stringify(n);Wo({direction:"commander_to_codex",captureKind:"response",message:n,rawText:i,connectionId:r,extraMetadata:{requestMethod:t}}),e.send(i)}async function c1(e,n,t){let r=await sx(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"};Wo({direction:"commander_to_codex",captureKind:"outgoing",message:i,rawText:JSON.stringify(i),connectionId:t}),e.send(JSON.stringify(i))}function sx(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}),Wo({direction:"commander_to_codex",captureKind:"request",message:t,rawText:JSON.stringify(t),connectionId:r}),e.send(JSON.stringify(t))})}function f1(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 p1(e,n,t=1e4){let r=m1(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 m1(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 bB,isAbsolute as SB,join as lx,parse as vB,resolve as xB,sep as wB}from"node:path";var kB=[".volta",".nvm",".npm",".asdf",".fnm",".bun",lx(".cargo","bin"),lx(".local","bin")];var ux=["wafer","openai"];var _f="1.0.279",PB=`linzumi ${_f}`;var mx="LINZUMI_REMOTE_CODEX_HARNESS_CONFIG_B64",yx="linzumi-remote-codex-harness",g1=Object.assign((e,n)=>{Ee(e,n)},{close:()=>Promise.resolve()});async function gx(e=process.env){await b1(S1(e))}async function b1(e,n={}){let t={startCodexAppServer:ex,connectCodexAppServer:dx,connectPhoenixClient:Bh,attachChannelSession:ZS,waitUntilShutdown:P1,writeStdout:u=>process.stdout.write(u),log:g1,...n},r=T1(e),i=kg(process.execPath,k1(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:A1(process.env,e.execServerUrl),neverEquivalentGranularApprovalPolicy:F_(e.approvalPolicy,e.sandbox),mcpServers:[xg({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=I1(async()=>{await s?.close(),d?.close(),a?.close(),o.stop(),r.cleanup()});try{d=await t.connectCodexAppServer(o.url),await x1(d,e.execServerUrl),a=await t.connectPhoenixClient(e.kandanUrl,e.token);let u=`local_runner:${e.runnerId}`,f=()=>R1(e),p=[],h={value:void 0};a.onControl(g=>{let C=h.value;if(C===void 0){p.push(g);return}C(g)});let _=await a.join(u,f(),{rejoinPayload:f}),y={current:Nc(_)};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(g=>{let C=US(y.current,g.get(u));switch(C.type){case"accepted":y.current=C.support;break;case"rejected_invalid":t.log("runner.supported_runner_events_invalid",{source:"remote_harness_rejoin",runner_id:e.runnerId,reason:C.reason});break}return s?.handleKandanReconnect()}),s=await t.attachChannelSession({kandan:a,codex:d,topic:u,instanceId:e.instanceId,onRequiredAdtRecoveryUnrecoverable:g=>{t.log("adt.required_recovery_unrecoverable",{reason:g,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:yx,allowPortForwardingByDefault:e.allowPortForwardingByDefault}},log:t.log});let b=g=>{let C=s,R=a;if(C===void 0||R===void 0){p.push(g);return}C.handleControl(g).then(E=>E===void 0?void 0:R.push(u,"codex_response",E)).catch(E=>R.push(u,"codex_error",{instanceId:e.instanceId,message:Qb(E)})).catch(E=>{t.log("remote_codex_harness.control_push_failed",{message:E instanceof Error?E.message:String(E)})})};h.value=b,p.splice(0).forEach(b),d.onNotification(g=>{let C=g.params??{};s?.handleCodexNotification(g.method,C)}),await s.startThreadMessageTurn({seq:e.sourceSeq,body:e.workDescription}),t.writeStdout(`LINZUMI_REMOTE_CODEX_HARNESS_READY ${e.readyToken}
|
|
749
|
+
`)}){let t=ix(e);if(t.state!=="unset"){if(t.state==="invalid"){let r=XF();n(`ERROR: ${rx}='${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:pf,maxMs:mf});return}Ee("codex.stream_idle_timeout_config_applied",{level:"info",timeoutMs:t.timeoutMs,source:t.source})}}function XF(){return`a plain positive integer between ${pf} and ${mf} (milliseconds)`}var ox="openai-linzumi";function ax(){let e=ox;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 e1(e){let n=ox;return[...ax(),"-c",`model_providers.${n}.stream_idle_timeout_ms=${e}`,"-c",`model_provider="${n}"`]}function n1(e,n=process.env){let t=ZF(n);return[...UF,...e.nativeQuestionBridge==="durable"?BF:[],...Bv(),...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=>wg(r,{neverEquivalentGranularApprovalPolicy:e.neverEquivalentGranularApprovalPolicy===!0})),...e.modelProvider===void 0?t===void 0?ax():e1(t):t1(e.modelProvider,t)]}function t1(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 dx(e,n=r=>new OF(r),t=2e3){let r=await d1(e,n,t),i=IF(),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(b=>b.reject(y)),o.clear()},f=setInterval(()=>FF(r),MF);f.unref?.();let p=_=>{if(clearInterval(f),u(_),c.closeError===void 0){c.closeError=new Error(_);for(let y of l)Xv(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),b=a1(y);if(b===void 0){r1(y,i);return}if(Wo({direction:"codex_to_commander",captureKind:o1(b),message:b,rawText:y,connectionId:i}),"id"in b&&("result"in b||"error"in b)){let v=o.get(b.id);v!==void 0&&(o.delete(b.id),v.resolve(b));return}if("id"in b&&typeof b.method=="string"){l1(r,b,d,i);return}if(!("id"in b)&&typeof b.method=="string"){let v=b;a.size===0?s.push(v):a.forEach(g=>Yv(g,v))}}),await c1(r,o,i),{request:(_,y)=>{let b=c.nextId;return c.nextId+=1,sx(r,o,y===void 0?{jsonrpc:"2.0",id:b,method:_}:{jsonrpc:"2.0",id:b,method:_,params:y},i)},notify:(_,y)=>{let b=y===void 0?{jsonrpc:"2.0",method:_}:{jsonrpc:"2.0",method:_,params:y};Wo({direction:"commander_to_codex",captureKind:"outgoing",message:b,rawText:JSON.stringify(b),connectionId:i}),r.send(JSON.stringify(b))},onNotification:_=>{a.add(_),s.splice(0).forEach(y=>Yv(_,y))},onRequest:_=>{d.add(_)},onClose:_=>{if(c.closeError!==void 0){Xv(_,c.closeError);return}l.add(_)},isClosed:()=>c.closeError!==void 0,close:()=>{clearInterval(f),r.close()}}}function Wo(e){iu()&&ao({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,...i1(e.message),...e.extraMetadata??{}}})}function r1(e,n){iu()&&ao({provider:"codex-app-server",captureKind:"incoming",rawText:e,captureMetadata:{direction:"codex_to_commander",capturedAtMs:Date.now(),capturePid:process.pid,connectionId:n,malformed:!0}})}function i1(e){return!("params"in e)||!z(e.params)?{}:Lm(e.params)}function o1(e){return"id"in e&&("result"in e||"error"in e)?"response":"id"in e&&typeof e.method=="string"?"request":"notification"}function a1(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:bt(n,512),payloadChars:n.length});return}}function Yv(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 Xv(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 d1(e,n,t=2e3){let r=Date.now()+t,i;for(;Date.now()<=r;){let o=n(e);try{return await f1(o,Math.max(1,r-Date.now())),o}catch(a){i=a instanceof Error?a:new Error(String(a)),s1(o)}}throw i??new Error("websocket open failed")}function s1(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 l1(e,n,t,r){let i=o=>u1(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 u1(e,n,t,r){let i=JSON.stringify(n);Wo({direction:"commander_to_codex",captureKind:"response",message:n,rawText:i,connectionId:r,extraMetadata:{requestMethod:t}}),e.send(i)}async function c1(e,n,t){let r=await sx(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"};Wo({direction:"commander_to_codex",captureKind:"outgoing",message:i,rawText:JSON.stringify(i),connectionId:t}),e.send(JSON.stringify(i))}function sx(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}),Wo({direction:"commander_to_codex",captureKind:"request",message:t,rawText:JSON.stringify(t),connectionId:r}),e.send(JSON.stringify(t))})}function f1(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 p1(e,n,t=1e4){let r=m1(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 m1(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 bB,isAbsolute as SB,join as lx,parse as vB,resolve as xB,sep as wB}from"node:path";var kB=[".volta",".nvm",".npm",".asdf",".fnm",".bun",lx(".cargo","bin"),lx(".local","bin")];var ux=["wafer","openai"];var _f="1.0.280",PB=`linzumi ${_f}`;var mx="LINZUMI_REMOTE_CODEX_HARNESS_CONFIG_B64",yx="linzumi-remote-codex-harness",g1=Object.assign((e,n)=>{Ee(e,n)},{close:()=>Promise.resolve()});async function gx(e=process.env){await b1(S1(e))}async function b1(e,n={}){let t={startCodexAppServer:ex,connectCodexAppServer:dx,connectPhoenixClient:Bh,attachChannelSession:ZS,waitUntilShutdown:P1,writeStdout:u=>process.stdout.write(u),log:g1,...n},r=T1(e),i=kg(process.execPath,k1(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:A1(process.env,e.execServerUrl),neverEquivalentGranularApprovalPolicy:F_(e.approvalPolicy,e.sandbox),mcpServers:[xg({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=I1(async()=>{await s?.close(),d?.close(),a?.close(),o.stop(),r.cleanup()});try{d=await t.connectCodexAppServer(o.url),await x1(d,e.execServerUrl),a=await t.connectPhoenixClient(e.kandanUrl,e.token);let u=`local_runner:${e.runnerId}`,f=()=>R1(e),p=[],h={value:void 0};a.onControl(g=>{let C=h.value;if(C===void 0){p.push(g);return}C(g)});let _=await a.join(u,f(),{rejoinPayload:f}),y={current:Nc(_)};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(g=>{let C=US(y.current,g.get(u));switch(C.type){case"accepted":y.current=C.support;break;case"rejected_invalid":t.log("runner.supported_runner_events_invalid",{source:"remote_harness_rejoin",runner_id:e.runnerId,reason:C.reason});break}return s?.handleKandanReconnect()}),s=await t.attachChannelSession({kandan:a,codex:d,topic:u,instanceId:e.instanceId,onRequiredAdtRecoveryUnrecoverable:g=>{t.log("adt.required_recovery_unrecoverable",{reason:g,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:yx,allowPortForwardingByDefault:e.allowPortForwardingByDefault}},log:t.log});let b=g=>{let C=s,R=a;if(C===void 0||R===void 0){p.push(g);return}C.handleControl(g).then(E=>E===void 0?void 0:R.push(u,"codex_response",E)).catch(E=>R.push(u,"codex_error",{instanceId:e.instanceId,message:Qb(E)})).catch(E=>{t.log("remote_codex_harness.control_push_failed",{message:E instanceof Error?E.message:String(E)})})};h.value=b,p.splice(0).forEach(b),d.onNotification(g=>{let C=g.params??{};s?.handleCodexNotification(g.method,C)}),await s.startThreadMessageTurn({seq:e.sourceSeq,body:e.workDescription}),t.writeStdout(`LINZUMI_REMOTE_CODEX_HARNESS_READY ${e.readyToken}
|
|
750
750
|
`);let v=await Promise.race([t.waitUntilShutdown(c).then(()=>({type:"shutdown"})),E1(o.process).then(g=>({type:"codex_exit",exit:g}))]);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 S1(e){let n=e[mx];if(n===void 0||n.trim()==="")throw new Error(`${mx} is required`);return v1(JSON.parse(Buffer.from(n,"base64url").toString("utf8")))}function v1(e){let n=O1(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:_x(n,"rootSeq"),sourceSeq:_x(n,"sourceSeq"),cwd:An(n,"cwd"),workerCwd:An(n,"workerCwd"),workDescription:An(n,"workDescription"),...vi(n,"developerPrompt"),...vi(n,"agentNickname"),readyToken:An(n,"readyToken"),codexBin:An(n,"codexBin"),execServerUrl:An(n,"execServerUrl"),listenUser:An(n,"listenUser"),...vi(n,"model"),...vi(n,"reasoningEffort"),...vi(n,"approvalPolicy"),...vi(n,"sandbox"),...hx(n,"fast"),...hx(n,"allowPortForwardingByDefault"),...q1(n,"linzumiContext")}}async function x1(e,n){let t=await e.request("environment/add",{environmentId:yx,execServerUrl:n});w1(t,"environment/add")}function w1(e,n){if("error"in e)throw new Error(`${n} failed: ${e.error.message}`)}function k1(e){if(e===void 0||e.trim()==="")return e;switch(y1(e)){case"remote-codex-harness-worker.js":case"remote-codex-harness-worker.mjs":case"remote-codex-harness-worker.cjs":return ms(px(e),"linzumi.js");case"remoteCodexHarnessWorkerEntrypoint.ts":case"remoteCodexHarnessWorkerEntrypoint.js":return ms(px(e),"index.ts");default:return e}}function T1(e){let n=_1(ms(h1(),"linzumi-mcp-auth-"));cx(n,448);let t=ms(n,"auth.json");try{Cf({kandanUrl:e.kandanUrl,accessToken:e.token,authFilePath:t}),cx(t,384)}catch(i){throw fx(n,{recursive:!0,force:!0}),i}let r=!1;return{path:t,cleanup:()=>{r||(r=!0,fx(n,{recursive:!0,force:!0}))}}}function A1(e,n){let t={CODEX_EXEC_SERVER_URL:n,LINZUMI_REMOTE_CODEX_HARNESS:"1"};for(let r of C1){let i=e[r];i!==void 0&&i.trim()!==""&&(t[r]=i)}return t}var C1=["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 R1(e){return{clientName:"kandan-remote-codex-harness-worker",clientId:e.instanceId,connectionMode:"session_worker",runnerPid:process.pid,version:_f,cwd:e.cwd,workspace:e.workspaceSlug,channel:e.channelSlug,capabilities:{codexAppServer:!0,client_message_ids:!0,commander_pipeline:"pipeline",defaultAgentProvider:"codex",agentProviders:["codex"],modelProviders:[...ux],remoteCodexExecution:!1,allowedCwdSuggestions:[],allowedCwdProjects:[],portForwarding:!1,tcpForwarding:!1,linzumiMcp:!0}}}function P1(e){return new Promise((n,t)=>{let r=()=>{e().then(n,t)};process.once("SIGINT",r),process.once("SIGTERM",r)})}function I1(e){let n;return()=>(n=n??e(),n)}function E1(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 O1(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 _x(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 vi(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 hx(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 q1(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 M1}from"node:path";import{fileURLToPath as F1}from"node:url";var bx=process.argv[1];if(bx!==void 0&&F1(import.meta.url)===M1(bx))try{await gx()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}
|
|
751
751
|
`),process.exit(1)}export{gx as runRemoteCodexHarnessWorkerFromEnv};
|
package/package.json
CHANGED