@linzumi/cli 1.0.37 → 1.0.38

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 CHANGED
@@ -58,7 +58,7 @@ Install the CLI or run it with `npx`:
58
58
  ```bash
59
59
  npm install -g @linzumi/cli@latest
60
60
  npx -y @linzumi/cli@latest signup
61
- npx -y @linzumi/cli@1.0.37 --version
61
+ npx -y @linzumi/cli@1.0.38 --version
62
62
  linzumi --version
63
63
  ```
64
64
 
@@ -9,7 +9,7 @@ var Zr=Object.create;var yn=Object.defineProperty;var Xr=Object.getOwnPropertyDe
9
9
  `+r)}function H(e,n,r,t,o,s){if(e.listenerCount("wsClientError")){let i=new Error(o);Error.captureStackTrace(i,H),e.emit("wsClientError",i,r,n)}else ye(r,t,o,s)}});import{spawn as ys}from"node:child_process";import{appendFileSync as ms,rmSync as Gr,writeFileSync as be,mkdirSync as ie,chmodSync as Fr,readFileSync as _s,readdirSync as xs,statSync as bs,unlinkSync as Ss}from"node:fs";import{dirname as Br,join as $e}from"node:path";var So=de(ur(),1),wo=de(Ke(),1),vo=de(Ye(),1),an=de(Ie(),1),Eo=de(br(),1);function j(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}import{appendFileSync as ko,openSync as hi}from"node:fs";import{homedir as Co}from"node:os";import{dirname as Oo,join as To}from"node:path";import{mkdirSync as Po}from"node:fs";var K="<SENSITIVE_DATA>",Sr=new Set(["access_token","authorization","code","cookie","kandan_preview_ticket","refresh_token","token"]),Ro=new Set(["--access-token","--api-key","--authorization","--cookie","--oauth-code","--password","--refresh-token","--secret","--token"]);function se(e,n,r={}){let t=r.logFile??Ao();try{Po(Oo(t),{recursive:!0}),ko(t,`${JSON.stringify({ts:new Date().toISOString(),event:e,...r.sessionId===void 0?{}:{sessionId:r.sessionId},...Io(n)})}
10
10
  `,"utf8")}catch{return}}function Ao(){let e=process.env.LINZUMI_CLI_AUDIT_LOG?.trim();return e===void 0||e===""?To(Co(),".linzumi","logs","command-events.jsonl"):e}function Io(e){return wr(e)}function dn(e,n){return jo(n)?K:typeof e=="string"?vr(e):Array.isArray(e)?n==="args"?Mo(e):e.map(r=>dn(r,void 0)):e!==null&&typeof e=="object"?wr(e):e}function wr(e){let n=typeof e.name=="string"?e.name.toLowerCase():void 0,r=n==="authorization"||n==="cookie"||n==="set-cookie";return Object.fromEntries(Object.entries(e).filter(([t])=>t!=="runner_console").map(([t,o])=>[t,r&&t==="value"?K:dn(o,t)]))}function Mo(e){let n=!1;return e.map(r=>{if(typeof r!="string")return n=!1,dn(r,void 0);if(n)return n=!1,K;let[t,o]=No(r);return Ro.has(t)?o===void 0?(n=!0,r):`${t}=${K}`:vr(r)})}function No(e){let n=e.indexOf("=");return n===-1?[e,void 0]:[e.slice(0,n),e.slice(n+1)]}function jo(e){return e===void 0?!1:/^(authorization|cookie|set-cookie|password)$/i.test(e)||/(^|[_-])(access[_-]?token|api[_-]?key|auth[_-]?token|oauth[_-]?code|refresh[_-]?token|secret|token)$/i.test(e)}function vr(e){return Lo(e).replace(/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,K)}function Lo(e){let n;try{n=new URL(e)}catch{return Jo(e)}for(let r of[...n.searchParams.keys()])Sr.has(r.toLowerCase())&&n.searchParams.set(r,K);return n.toString()}function Jo(e){let n=e.indexOf("?"),r=e.indexOf("#");if(n===-1||r!==-1&&r<n)return e;let t=e.slice(0,n),o=r===-1?e.slice(n+1):e.slice(n+1,r),s=r===-1?"":e.slice(r),i=new URLSearchParams(o),a=!1;for(let d of[...i.keys()])Sr.has(d.toLowerCase())&&(i.set(d,K),a=!0);switch(a){case!0:return`${t}?${i.toString()}${s}`;case!1:return e}}import{mkdirSync as $o,appendFileSync as Uo}from"node:fs";import{dirname as Do}from"node:path";function L(e){return e!==void 0&&j(e)?e:void 0}function Er(e){return Array.isArray(e)?e:void 0}function P(e){return typeof e=="string"&&e.trim()!==""?e.trim():void 0}function kr(e){return JSON.stringify(e)}var me,Vo=/(^|[_-])(token|secret|api[_-]?key|authorization|cookie|private[_-]?key|login[_-]?url)([_-]|$)/iu;function xe(e){let n=Fo();if(n===void 0)return;let r=Go(n),t=Bo(e),o={schemaVersion:1,provider:e.provider,captureKind:e.captureKind,ordinal:r.nextOrdinal,offsetMs:Math.max(0,Date.now()-r.startedAtMs),...t.rawText===void 0?{}:{rawText:t.rawText},...t.rawValue===void 0?{}:{rawValue:t.rawValue},...e.captureMetadata===void 0?{}:{captureMetadata:_e(e.captureMetadata)},...t.transforms.length===0?e.transforms===void 0?{}:{transforms:e.transforms}:{transforms:[...e.transforms??[],...t.transforms]}};r.nextOrdinal+=1,Uo(n,`${kr(o)}
11
11
  `,"utf8")}function Fo(){let e=process.env.LINZUMI_AGENT_REPLAY_RECORD_FILE?.trim();return e===void 0||e===""?void 0:e}function Go(e){return me!==void 0&&me.path===e||($o(Do(e),{recursive:!0}),me={path:e,startedAtMs:Date.now(),nextOrdinal:0}),me}function Bo(e){if(process.env.LINZUMI_AGENT_REPLAY_EXACT_RAW==="1")return{rawText:e.rawText,rawValue:e.rawValue,transforms:[]};let n=[],r=e.rawValue===void 0?void 0:_e(e.rawValue,"$.rawValue",n);return{rawText:zo(e.rawText,n),rawValue:r,transforms:n}}function zo(e,n){if(e!==void 0)try{let r=JSON.parse(e);return JSON.stringify(_e(r,"$.rawText",n))}catch{return e}}function _e(e,n="$",r=[]){if(Array.isArray(e))return e.map((o,s)=>_e(o,`${n}[${s}]`,r));if(!j(e))return e;let t=Object.entries(e).map(([o,s])=>{let i=`${n}.${o}`;return Vo.test(o)?(r.push({type:"credential_redaction",path:i}),[o,"[REDACTED]"]):[o,s===void 0?void 0:_e(s,i,r)]});return Object.fromEntries(t)}function Cr(e){return{name:"linzumi",command:e.command??"linzumi",args:[...e.argsPrefix??[],"mcp","server","--api-url",e.kandanUrl,...e.authFilePath===void 0?[]:["--auth-file",e.authFilePath],...e.delegationAuthFilePath===void 0?[]:["--delegation-auth-file",e.delegationAuthFilePath],...e.ownerUsername===void 0?[]:["--owner-username",e.ownerUsername],...e.cwd===void 0?[]:["--cwd",e.cwd],...e.threadId===void 0?[]:["--thread-id",e.threadId],"--mode",e.operatingMode??"text",...e.toolScope===void 0||e.toolScope==="all"?[]:["--tool-scope",e.toolScope],...e.agentSession===!0?["--agent-session"]:[]],env:{...e.accessToken===void 0?{}:{LINZUMI_MCP_ACCESS_TOKEN:e.accessToken},ELECTRON_RUN_AS_NODE:"1"}}}function cn(e){return["-c",`mcp_servers.${e.name}.command=${JSON.stringify(e.command)}`,"-c",`mcp_servers.${e.name}.args=${qo(e.args)}`,...Object.entries(e.env).flatMap(([n,r])=>["-c",`mcp_servers.${e.name}.env.${n}=${JSON.stringify(r)}`])]}function qo(e){return`[${e.map(n=>JSON.stringify(n)).join(", ")}]`}var Ai=["# Managed by Linzumi - do not edit by hand.","# This isolated CODEX_HOME keeps Linzumi-spawned codex processes off the","# user's ~/.codex config and the macOS Keychain. See codexHome.ts.",'mcp_oauth_credentials_store = "file"','cli_auth_credentials_store = "file"',""].join(`
12
- `);function Or(){return["-c",'mcp_oauth_credentials_store="file"',"-c",'cli_auth_credentials_store="file"']}var Wo=(()=>{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 Ho(e){let n=e;if(typeof n.ping=="function"&&n.readyState===WebSocket.OPEN)try{n.ping()}catch{}}function Rr(e,n={}){return["app-server",...Zo(n),"--listen",e]}var Ko=["-c","features.apps=false"];function Zo(e){return[...Ko,...Or(),...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(n=>cn(n)),...e.modelProvider===void 0?[]:Xo(e.modelProvider)]}function Xo(e){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(([n,r])=>["-c",`model_providers.${e.id}.http_headers.${n}=${JSON.stringify(r)}`]),...Object.entries(e.envHttpHeaders??{}).flatMap(([n,r])=>["-c",`model_providers.${e.id}.env_http_headers.${n}=${JSON.stringify(r)}`]),"-c",`model_provider=${JSON.stringify(e.id)}`]}async function Ar(e,n=r=>new an.default(r)){let r=await es(e,n),t=new Map,o=new Set,s=new Set,i=[],a=new Set,d={nextId:1,closeError:void 0},c=u=>{let h=new Error(u);t.forEach(l=>l.reject(h)),t.clear()},f=setInterval(()=>Ho(r),Wo);f.unref?.();let p=u=>{if(clearInterval(f),c(u),d.closeError===void 0){d.closeError=new Error(u);for(let h of a)Pr(h,d.closeError);a.clear()}};return r.addEventListener("close",()=>p("codex app-server websocket closed")),r.addEventListener("error",()=>p("codex app-server websocket closed")),r.addEventListener("message",u=>{let h=String(u.data),l=Qo(h);if(l!==void 0){if(xe({provider:"codex-app-server",captureKind:Yo(l),rawText:h,rawValue:{message:l}}),"id"in l&&("result"in l||"error"in l)){let m=t.get(l.id);m!==void 0&&(t.delete(l.id),m.resolve(l));return}if("id"in l&&typeof l.method=="string"){rs(r,l,s);return}if(!("id"in l)&&typeof l.method=="string"){let m=l;o.size===0?i.push(m):o.forEach(w=>Tr(w,m))}}}),await ts(r,t),{request:(u,h)=>{let l=d.nextId;return d.nextId+=1,Ir(r,t,h===void 0?{jsonrpc:"2.0",id:l,method:u}:{jsonrpc:"2.0",id:l,method:u,params:h})},notify:(u,h)=>{let l=h===void 0?{jsonrpc:"2.0",method:u}:{jsonrpc:"2.0",method:u,params:h};xe({provider:"codex-app-server",captureKind:"outgoing",rawText:JSON.stringify(l),rawValue:{message:l}}),r.send(JSON.stringify(l))},onNotification:u=>{o.add(u),i.splice(0).forEach(h=>Tr(u,h))},onRequest:u=>{s.add(u)},onClose:u=>{if(d.closeError!==void 0){Pr(u,d.closeError);return}a.add(u)},close:()=>{clearInterval(f),r.close()}}}function Yo(e){return"id"in e&&("result"in e||"error"in e)?"response":"id"in e&&typeof e.method=="string"?"request":"notification"}function Qo(e){let n=String(e);try{let r=JSON.parse(n);if(!j(r))throw new Error("codex app-server sent non-object JSON-RPC message");return r}catch(r){se("codex.app_server_frame_malformed",{purpose:"codex.app_server",message:r instanceof Error?r.message:String(r),payload:n.slice(0,512),payloadChars:n.length});return}}function Tr(e,n){try{e(n)}catch(r){se("codex.notification_callback_failed",{purpose:"codex.app_server",method:n.method,message:r instanceof Error?r.message:String(r)})}}function Pr(e,n){try{e(n)}catch(r){se("codex.close_callback_failed",{purpose:"codex.app_server",message:r instanceof Error?r.message:String(r)})}}async function es(e,n,r=2e3){let t=Date.now()+r,o;for(;Date.now()<=t;){let s=n(e);try{return await os(s),s}catch(i){o=i instanceof Error?i:new Error(String(i)),ns(s)}}throw o??new Error("websocket open failed")}function ns(e){try{e.close()}catch{}}async function rs(e,n,r){try{if(r.size===0){e.send(JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`unhandled Codex app-server request: ${n.method}`}}));return}for(let t of r){let o=await t(n);if(o!==void 0){e.send(JSON.stringify({jsonrpc:"2.0",id:n.id,result:o}));return}}e.send(JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`unhandled Codex app-server request: ${n.method}`}}))}catch(t){e.send(JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}))}}async function ts(e,n){let r=await Ir(e,n,{jsonrpc:"2.0",id:"initialize",method:"initialize",params:{clientInfo:{name:"kandan-local-codex-runner",version:"0.0.1"},capabilities:{experimentalApi:!0}}});if("error"in r)throw new Error(`codex initialize failed: ${r.error.message}`);let t={jsonrpc:"2.0",method:"initialized"};xe({provider:"codex-app-server",captureKind:"outgoing",rawText:JSON.stringify(t),rawValue:{message:t}}),e.send(JSON.stringify(t))}function Ir(e,n,r){return e.readyState!==WebSocket.OPEN?Promise.reject(new Error("codex app-server websocket is not open")):new Promise((t,o)=>{n.set(r.id,{resolve:t,reject:o}),xe({provider:"codex-app-server",captureKind:"request",rawText:JSON.stringify(r),rawValue:{message:r}}),e.send(JSON.stringify(r))})}function os(e){return new Promise((n,r)=>{e.addEventListener("open",()=>n(),{once:!0}),e.addEventListener("error",()=>r(new Error("websocket open failed")),{once:!0})})}var Hi=300*1e3;function Ne(e){let n=new URL(e);switch(n.protocol){case"ws:":n.protocol="http:";break;case"wss:":n.protocol="https:";break;case"http:":case"https:":break;default:throw new Error("--api-url must be ws://, wss://, http://, or https://")}return n.pathname="",n.search="",n.hash="",n.toString().replace(/\/$/,"")}function Mr(e){let n=e.fetchImpl??fetch,r=Ne(e.kandanUrl),t=e.authMode==="personal-agent-delegation"?"/api/v2/personal-agent-mcp":"/api/v2/local-runner-mcp",o=e.operatingMode??"text",s=async(i,a,d,c={})=>{let f=new URL(a,r),p={...d,operating_mode:o},g={method:i,headers:{authorization:`Bearer ${e.accessToken}`},...c.signal===void 0?{}:{signal:c.signal}};if(i==="GET")for(let[w,v]of Object.entries(p))v!=null&&f.searchParams.set(w,String(v));else g.headers={...g.headers,"content-type":"application/json"},g.body=JSON.stringify(p);let u=await n(f,g),h=await u.json(),l=j(h)?h:void 0;if(l===void 0)throw new Error(`Linzumi MCP API returned non-object JSON from ${a}`);if(u.ok&&l.ok===!0)return l;let m=typeof l.error=="string"?l.error:`HTTP ${u.status}`;throw new Error(`Linzumi MCP API ${a} failed: ${m}`)};return{validateAuth:()=>s("GET",`${t}/validate`,{}),issueOnboardingDiscoveryToken:i=>s("POST",`${t}/onboarding-discovery-token`,i),getMessage:i=>s("GET",`${t}/message`,i),getThread:i=>s("GET",`${t}/thread`,i),getChannel:i=>s("GET",`${t}/channel`,i),searchWorkspace:i=>s("GET",`${t}/search`,i),askWorkspace:i=>s("POST",`${t}/ask`,i),webSearch:i=>s("GET",`${t}/web-search`,i),fetchUrl:i=>s("GET",`${t}/fetch-url`,i),getCodingJobMetadata:i=>s("GET",`${t}/coding-job-metadata`,i),listProjects:i=>s("GET",`${t}/projects`,i),getProjectTasks:i=>s("GET",`${t}/project-tasks`,i),createProjectTask:i=>s("POST",`${t}/project-tasks/create`,i),updateProjectTask:i=>s("POST",`${t}/project-tasks/update`,i),deleteProjectTask:i=>s("POST",`${t}/project-tasks/delete`,i),addProjectTaskDependency:i=>s("POST",`${t}/project-tasks/add-dependency`,i),removeProjectTaskDependency:i=>s("POST",`${t}/project-tasks/remove-dependency`,i),renameCodingJob:i=>s("POST",`${t}/coding-job-title`,i),upsertCodingJobPlan:(i,a)=>s("POST",`${t}/coding-job-plan`,i,a),replaceCodingJobPlanSteps:i=>s("POST",`${t}/coding-job-plan/steps`,i),updateCodingJobPlanStep:i=>s("POST",`${t}/coding-job-plan/step`,i),linkCodingJobPullRequest:i=>s("POST",`${t}/coding-job-primary-pr`,i),listVaultSecrets:i=>s("GET",`${t}/vault-secrets`,i),noteProjectDirectory:i=>s("POST",`${t}/discovered-project`,i),noteAgentConversation:i=>s("POST",`${t}/discovered-conversation`,i),noteOnboardingDiscoveryStatus:i=>s("POST",`${t}/discovery-status`,i),sendChannelMessage:i=>s("POST",`${t}/channel-message`,i),agentReply:i=>s("POST",`${t}/agent-reply`,i),agentListCodingJobs:i=>s("GET",`${t}/agent/coding-jobs`,i),agentStartCodingJob:i=>s("POST",`${t}/agent/start-coding-job`,i),agentInterruptCodingJob:i=>s("POST",`${t}/agent/interrupt-coding-job`,i),agentSendCodingJobMessage:i=>s("POST",`${t}/agent/send-coding-job-message`,i),agentReadCodingJobThread:i=>s("GET",`${t}/agent/coding-job-thread`,i),agentResolveJobApproval:i=>s("POST",`${t}/agent/resolve-job-approval`,i),agentArchiveCodingJob:i=>s("POST",`${t}/agent/archive-coding-job`,i),agentUnarchiveCodingJob:i=>s("POST",`${t}/agent/unarchive-coding-job`,i),agentSetThreadStatus:i=>s("POST",`${t}/agent/set-thread-status`,i),agentCreateChannel:i=>s("POST",`${t}/agent/create-channel`,i),agentRenameChannel:i=>s("POST",`${t}/agent/rename-channel`,i),agentArchiveChannel:i=>s("POST",`${t}/agent/archive-channel`,i),agentUnarchiveChannel:i=>s("POST",`${t}/agent/unarchive-channel`,i),agentAddReaction:i=>s("POST",`${t}/agent/add-reaction`,i),agentRemoveReaction:i=>s("POST",`${t}/agent/remove-reaction`,i),agentPinMessage:i=>s("POST",`${t}/agent/pin-message`,i),agentUnpinMessage:i=>s("POST",`${t}/agent/unpin-message`,i),prepareMessageUploads:i=>s("POST",`${t}/message-uploads/prepare`,i),attachMessageFiles:i=>s("POST",`${t}/message-files/attach`,i),prepareCustomEmoji:i=>s("POST",`${t}/custom-emoji/prepare`,i),renameCustomEmoji:i=>s("POST",`${t}/custom-emoji/rename`,i),sendThreadReply:i=>s("POST",`${t}/thread-reply`,i),sendDm:i=>s("POST",`${t}/dm`,i),dmOwner:i=>s("POST",`${t}/dm-owner`,i),getVaultValues:i=>s("POST",`${t}/vault-values`,i)}}import{existsSync as ss,mkdirSync as ea,readFileSync as is,writeFileSync as na}from"node:fs";import{homedir as as}from"node:os";import{dirname as oa,join as ds}from"node:path";function cs(){return ds(as(),".linzumi","auth.json")}function Nr(e,n=cs()){if(!ss(n))return;let r=ls(is(n,"utf8")),t=Ne(e),o=r.local_codex_runner?.[t];if(!(o===void 0||o.access_token.trim()==="")&&!(o.expires_at!==void 0&&Date.parse(o.expires_at)<=Date.now()))return{accessToken:o.access_token,kandanBaseUrl:t,issuedAt:o.issued_at,expiresAt:o.expires_at}}function ls(e){let n=JSON.parse(e);if(typeof n!="object"||n===null||Array.isArray(n))throw new Error("Kandan auth cache must contain a JSON object");let r=n,t=r.local_codex_runner,o=r.personal_agent_delegation;if(t!==void 0&&(typeof t!="object"||t===null||Array.isArray(t)))throw new Error("Kandan auth cache local_codex_runner must be an object");if(o!==void 0&&(typeof o!="object"||o===null||Array.isArray(o)))throw new Error("Kandan auth cache personal_agent_delegation must be an object");return{version:1,local_codex_runner:fs(t),personal_agent_delegation:us(o)}}function us(e){if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.access_token,r=e.issued_at,t=e.expires_at;if(!(typeof n!="string"||typeof r!="string"))return{access_token:n,issued_at:r,expires_at:typeof t=="string"?t:void 0}}function fs(e){if(!(typeof e!="object"||e===null||Array.isArray(e)))return Object.fromEntries(Object.entries(e).flatMap(([n,r])=>{if(typeof r!="object"||r===null||Array.isArray(r))return[];let t=r.access_token,o=r.issued_at,s=r.expires_at;return typeof t!="string"||typeof o!="string"?[]:[[n,{access_token:t,issued_at:o,expires_at:typeof s=="string"?s:void 0}]]}))}function jr(e){let n=e.channelSession;return{...n.model===void 0?{}:{model:n.model},...n.reasoningEffort===void 0?{}:{reasoningEffort:n.reasoningEffort},...e.fast===!0?{serviceTier:"fast"}:{},...n.codexEnvironmentId===void 0?{}:{environmentId:n.codexEnvironmentId},approvalPolicy:Jr(n.approvalPolicy,n.sandbox),...n.sandbox===void 0?{}:{sandbox:n.sandbox}}}function Lr(e){let n=e.channelSession;return{cwd:e.cwd,...n.model===void 0?{}:{model:n.model},...n.reasoningEffort===void 0?{}:{effort:n.reasoningEffort},...e.fast===!0?{serviceTier:"fast"}:{},...n.codexEnvironmentId===void 0?{}:{environmentId:n.codexEnvironmentId},approvalPolicy:Jr(n.approvalPolicy,n.sandbox),...n.sandbox===void 0?{}:{sandboxPolicy:ps(n.sandbox,e.cwd)}}}function Jr(e,n){switch(e){case void 0:case"default":return"on-request";case"never":return n==="danger-full-access"?"never":"on-request";case"on-request":case"on-failure":return e;default:throw new Error(`unsupported Codex approval policy: ${e}`)}}function ps(e,n){switch(e){case"danger-full-access":return{type:"dangerFullAccess"};case"read-only":return{type:"readOnly",access:{type:"fullAccess"},networkAccess:!1};case"workspace-write":return{type:"workspaceWrite",writableRoots:[n],readOnlyAccess:{type:"fullAccess"},networkAccess:!1,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1};default:throw new Error(`unsupported Codex sandbox mode: ${e}`)}}var ln={mcpAuthFileContents:"LINZUMI_CLOUD_MCP_AUTH_JSON",llmProxyToken:"LINZUMI_CLOUD_LLM_PROXY_TOKEN"};function $r(e){let n;try{n=JSON.parse(Buffer.from(e,"base64").toString("utf8"))}catch{throw new Error("invalid guest cloud turn config payload (not base64 JSON)")}if(typeof n!="object"||n===null||Array.isArray(n))throw new Error("invalid guest cloud turn config payload");let r=n;for(let[t,o]of[["codexVersion",r.codexVersion],["sandbox",r.sandbox],["approvalPolicy",r.approvalPolicy],["kandanUrl",r.kandanUrl],["cwd",r.cwd]])if(typeof o!="string"||o==="")throw new Error(`invalid guest cloud turn config payload (${t} missing)`);if(!Array.isArray(r.input))throw new Error("invalid guest cloud turn config payload (input)");if(typeof r.appServerPort!="number"||!Number.isInteger(r.appServerPort))throw new Error("invalid guest cloud turn config payload (appServerPort)");return r}var Z="/home/agent",hs=`${Z}/.linzumi-provisioned`;var un="/dev/shm/linzumi",ba=`${un}/codex`,Sa=`${un}/mcp-auth.json`;var wa=`${un}/codex.env`;var Oa=`${Z}/cloud-supervisor.mjs`,Ur=`${Z}/mcp-server.mjs`,fn=`${Z}/.secrets`,pn=`${fn}/mcp-auth.json`,je=`${Z}/.codex`,Dr=`${je}/linzumi-thread-map.json`;var hn=`${Z}/.turn-heartbeats`,Vr=5e3,gs=/^[A-Za-z0-9-]{8,64}$/;function gn(e){if(!gs.test(e))throw new Error(`invalid cloud turn nonce: ${JSON.stringify(e.slice(0,80))}`)}var ws=3e4,vs=200;function zr(e){return e.replace(/\bsmk_[A-Za-z0-9._-]+/g,"smk_[REDACTED]").replace(/\b(sk|lz|tok|bearer)[-_][A-Za-z0-9._-]{8,}/gi,"$1_[REDACTED]")}var Je;function Es(e){Je=e;try{ie(Br(e),{recursive:!0}),be(e,"")}catch{Je=void 0}}function J(e){let n=`${JSON.stringify(e)}
12
+ `);function Or(){return["-c",'mcp_oauth_credentials_store="file"',"-c",'cli_auth_credentials_store="file"']}var Wo=(()=>{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 Ho(e){let n=e;if(typeof n.ping=="function"&&n.readyState===WebSocket.OPEN)try{n.ping()}catch{}}function Rr(e,n={}){return["app-server",...Zo(n),"--listen",e]}var Ko=["-c","features.apps=false"];function Zo(e){return[...Ko,...Or(),...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(n=>cn(n)),...e.modelProvider===void 0?[]:Xo(e.modelProvider)]}function Xo(e){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(([n,r])=>["-c",`model_providers.${e.id}.http_headers.${n}=${JSON.stringify(r)}`]),...Object.entries(e.envHttpHeaders??{}).flatMap(([n,r])=>["-c",`model_providers.${e.id}.env_http_headers.${n}=${JSON.stringify(r)}`]),"-c",`model_provider=${JSON.stringify(e.id)}`]}async function Ar(e,n=r=>new an.default(r)){let r=await es(e,n),t=new Map,o=new Set,s=new Set,i=[],a=new Set,d={nextId:1,closeError:void 0},c=u=>{let h=new Error(u);t.forEach(l=>l.reject(h)),t.clear()},f=setInterval(()=>Ho(r),Wo);f.unref?.();let p=u=>{if(clearInterval(f),c(u),d.closeError===void 0){d.closeError=new Error(u);for(let h of a)Pr(h,d.closeError);a.clear()}};return r.addEventListener("close",()=>p("codex app-server websocket closed")),r.addEventListener("error",()=>p("codex app-server websocket closed")),r.addEventListener("message",u=>{let h=String(u.data),l=Qo(h);if(l!==void 0){if(xe({provider:"codex-app-server",captureKind:Yo(l),rawText:h,rawValue:{message:l}}),"id"in l&&("result"in l||"error"in l)){let m=t.get(l.id);m!==void 0&&(t.delete(l.id),m.resolve(l));return}if("id"in l&&typeof l.method=="string"){rs(r,l,s);return}if(!("id"in l)&&typeof l.method=="string"){let m=l;o.size===0?i.push(m):o.forEach(w=>Tr(w,m))}}}),await ts(r,t),{request:(u,h)=>{let l=d.nextId;return d.nextId+=1,Ir(r,t,h===void 0?{jsonrpc:"2.0",id:l,method:u}:{jsonrpc:"2.0",id:l,method:u,params:h})},notify:(u,h)=>{let l=h===void 0?{jsonrpc:"2.0",method:u}:{jsonrpc:"2.0",method:u,params:h};xe({provider:"codex-app-server",captureKind:"outgoing",rawText:JSON.stringify(l),rawValue:{message:l}}),r.send(JSON.stringify(l))},onNotification:u=>{o.add(u),i.splice(0).forEach(h=>Tr(u,h))},onRequest:u=>{s.add(u)},onClose:u=>{if(d.closeError!==void 0){Pr(u,d.closeError);return}a.add(u)},close:()=>{clearInterval(f),r.close()}}}function Yo(e){return"id"in e&&("result"in e||"error"in e)?"response":"id"in e&&typeof e.method=="string"?"request":"notification"}function Qo(e){let n=String(e);try{let r=JSON.parse(n);if(!j(r))throw new Error("codex app-server sent non-object JSON-RPC message");return r}catch(r){se("codex.app_server_frame_malformed",{purpose:"codex.app_server",message:r instanceof Error?r.message:String(r),payload:n.slice(0,512),payloadChars:n.length});return}}function Tr(e,n){try{e(n)}catch(r){se("codex.notification_callback_failed",{purpose:"codex.app_server",method:n.method,message:r instanceof Error?r.message:String(r)})}}function Pr(e,n){try{e(n)}catch(r){se("codex.close_callback_failed",{purpose:"codex.app_server",message:r instanceof Error?r.message:String(r)})}}async function es(e,n,r=2e3){let t=Date.now()+r,o;for(;Date.now()<=t;){let s=n(e);try{return await os(s),s}catch(i){o=i instanceof Error?i:new Error(String(i)),ns(s)}}throw o??new Error("websocket open failed")}function ns(e){try{e.close()}catch{}}async function rs(e,n,r){try{if(r.size===0){e.send(JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`unhandled Codex app-server request: ${n.method}`}}));return}for(let t of r){let o=await t(n);if(o!==void 0){e.send(JSON.stringify({jsonrpc:"2.0",id:n.id,result:o}));return}}e.send(JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`unhandled Codex app-server request: ${n.method}`}}))}catch(t){e.send(JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}))}}async function ts(e,n){let r=await Ir(e,n,{jsonrpc:"2.0",id:"initialize",method:"initialize",params:{clientInfo:{name:"kandan-local-codex-runner",version:"0.0.1"},capabilities:{experimentalApi:!0}}});if("error"in r)throw new Error(`codex initialize failed: ${r.error.message}`);let t={jsonrpc:"2.0",method:"initialized"};xe({provider:"codex-app-server",captureKind:"outgoing",rawText:JSON.stringify(t),rawValue:{message:t}}),e.send(JSON.stringify(t))}function Ir(e,n,r){return e.readyState!==WebSocket.OPEN?Promise.reject(new Error("codex app-server websocket is not open")):new Promise((t,o)=>{n.set(r.id,{resolve:t,reject:o}),xe({provider:"codex-app-server",captureKind:"request",rawText:JSON.stringify(r),rawValue:{message:r}}),e.send(JSON.stringify(r))})}function os(e){return new Promise((n,r)=>{e.addEventListener("open",()=>n(),{once:!0}),e.addEventListener("error",()=>r(new Error("websocket open failed")),{once:!0})})}var Hi=300*1e3;function Ne(e){let n=new URL(e);switch(n.protocol){case"ws:":n.protocol="http:";break;case"wss:":n.protocol="https:";break;case"http:":case"https:":break;default:throw new Error("--api-url must be ws://, wss://, http://, or https://")}return n.pathname="",n.search="",n.hash="",n.toString().replace(/\/$/,"")}function Mr(e){let n=e.fetchImpl??fetch,r=Ne(e.kandanUrl),t=e.authMode==="personal-agent-delegation"?"/api/v2/personal-agent-mcp":"/api/v2/local-runner-mcp",o=e.operatingMode??"text",s=async(i,a,d,c={})=>{let f=new URL(a,r),p={...d,operating_mode:o},g={method:i,headers:{authorization:`Bearer ${e.accessToken}`},...c.signal===void 0?{}:{signal:c.signal}};if(i==="GET")for(let[w,v]of Object.entries(p))v!=null&&f.searchParams.set(w,String(v));else g.headers={...g.headers,"content-type":"application/json"},g.body=JSON.stringify(p);let u=await n(f,g),h=await u.json(),l=j(h)?h:void 0;if(l===void 0)throw new Error(`Linzumi MCP API returned non-object JSON from ${a}`);if(u.ok&&l.ok===!0)return l;let m=typeof l.error=="string"?l.error:`HTTP ${u.status}`;throw new Error(`Linzumi MCP API ${a} failed: ${m}`)};return{validateAuth:()=>s("GET",`${t}/validate`,{}),issueOnboardingDiscoveryToken:i=>s("POST",`${t}/onboarding-discovery-token`,i),getMessage:i=>s("GET",`${t}/message`,i),getThread:i=>s("GET",`${t}/thread`,i),getChannel:i=>s("GET",`${t}/channel`,i),searchWorkspace:i=>s("GET",`${t}/search`,i),askWorkspace:i=>s("POST",`${t}/ask`,i),webSearch:i=>s("GET",`${t}/web-search`,i),fetchUrl:i=>s("GET",`${t}/fetch-url`,i),getCodingJobMetadata:i=>s("GET",`${t}/coding-job-metadata`,i),listProjects:i=>s("GET",`${t}/projects`,i),getProjectTasks:i=>s("GET",`${t}/project-tasks`,i),createProjectTask:i=>s("POST",`${t}/project-tasks/create`,i),updateProjectTask:i=>s("POST",`${t}/project-tasks/update`,i),deleteProjectTask:i=>s("POST",`${t}/project-tasks/delete`,i),addProjectTaskDependency:i=>s("POST",`${t}/project-tasks/add-dependency`,i),removeProjectTaskDependency:i=>s("POST",`${t}/project-tasks/remove-dependency`,i),getCallTranscript:i=>s("GET",`${t}/call-transcript`,i),renameCodingJob:i=>s("POST",`${t}/coding-job-title`,i),upsertCodingJobPlan:(i,a)=>s("POST",`${t}/coding-job-plan`,i,a),replaceCodingJobPlanSteps:i=>s("POST",`${t}/coding-job-plan/steps`,i),updateCodingJobPlanStep:i=>s("POST",`${t}/coding-job-plan/step`,i),linkCodingJobPullRequest:i=>s("POST",`${t}/coding-job-primary-pr`,i),listVaultSecrets:i=>s("GET",`${t}/vault-secrets`,i),noteProjectDirectory:i=>s("POST",`${t}/discovered-project`,i),noteAgentConversation:i=>s("POST",`${t}/discovered-conversation`,i),noteOnboardingDiscoveryStatus:i=>s("POST",`${t}/discovery-status`,i),sendChannelMessage:i=>s("POST",`${t}/channel-message`,i),agentReply:i=>s("POST",`${t}/agent-reply`,i),agentListCodingJobs:i=>s("GET",`${t}/agent/coding-jobs`,i),agentStartCodingJob:i=>s("POST",`${t}/agent/start-coding-job`,i),agentInterruptCodingJob:i=>s("POST",`${t}/agent/interrupt-coding-job`,i),agentSendCodingJobMessage:i=>s("POST",`${t}/agent/send-coding-job-message`,i),agentReadCodingJobThread:i=>s("GET",`${t}/agent/coding-job-thread`,i),agentResolveJobApproval:i=>s("POST",`${t}/agent/resolve-job-approval`,i),agentArchiveCodingJob:i=>s("POST",`${t}/agent/archive-coding-job`,i),agentUnarchiveCodingJob:i=>s("POST",`${t}/agent/unarchive-coding-job`,i),agentSetThreadStatus:i=>s("POST",`${t}/agent/set-thread-status`,i),agentCreateChannel:i=>s("POST",`${t}/agent/create-channel`,i),agentRenameChannel:i=>s("POST",`${t}/agent/rename-channel`,i),agentArchiveChannel:i=>s("POST",`${t}/agent/archive-channel`,i),agentUnarchiveChannel:i=>s("POST",`${t}/agent/unarchive-channel`,i),agentAddReaction:i=>s("POST",`${t}/agent/add-reaction`,i),agentRemoveReaction:i=>s("POST",`${t}/agent/remove-reaction`,i),agentPinMessage:i=>s("POST",`${t}/agent/pin-message`,i),agentUnpinMessage:i=>s("POST",`${t}/agent/unpin-message`,i),prepareMessageUploads:i=>s("POST",`${t}/message-uploads/prepare`,i),attachMessageFiles:i=>s("POST",`${t}/message-files/attach`,i),prepareCustomEmoji:i=>s("POST",`${t}/custom-emoji/prepare`,i),renameCustomEmoji:i=>s("POST",`${t}/custom-emoji/rename`,i),sendThreadReply:i=>s("POST",`${t}/thread-reply`,i),sendDm:i=>s("POST",`${t}/dm`,i),dmOwner:i=>s("POST",`${t}/dm-owner`,i),getVaultValues:i=>s("POST",`${t}/vault-values`,i)}}import{existsSync as ss,mkdirSync as ea,readFileSync as is,writeFileSync as na}from"node:fs";import{homedir as as}from"node:os";import{dirname as oa,join as ds}from"node:path";function cs(){return ds(as(),".linzumi","auth.json")}function Nr(e,n=cs()){if(!ss(n))return;let r=ls(is(n,"utf8")),t=Ne(e),o=r.local_codex_runner?.[t];if(!(o===void 0||o.access_token.trim()==="")&&!(o.expires_at!==void 0&&Date.parse(o.expires_at)<=Date.now()))return{accessToken:o.access_token,kandanBaseUrl:t,issuedAt:o.issued_at,expiresAt:o.expires_at}}function ls(e){let n=JSON.parse(e);if(typeof n!="object"||n===null||Array.isArray(n))throw new Error("Kandan auth cache must contain a JSON object");let r=n,t=r.local_codex_runner,o=r.personal_agent_delegation;if(t!==void 0&&(typeof t!="object"||t===null||Array.isArray(t)))throw new Error("Kandan auth cache local_codex_runner must be an object");if(o!==void 0&&(typeof o!="object"||o===null||Array.isArray(o)))throw new Error("Kandan auth cache personal_agent_delegation must be an object");return{version:1,local_codex_runner:fs(t),personal_agent_delegation:us(o)}}function us(e){if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.access_token,r=e.issued_at,t=e.expires_at;if(!(typeof n!="string"||typeof r!="string"))return{access_token:n,issued_at:r,expires_at:typeof t=="string"?t:void 0}}function fs(e){if(!(typeof e!="object"||e===null||Array.isArray(e)))return Object.fromEntries(Object.entries(e).flatMap(([n,r])=>{if(typeof r!="object"||r===null||Array.isArray(r))return[];let t=r.access_token,o=r.issued_at,s=r.expires_at;return typeof t!="string"||typeof o!="string"?[]:[[n,{access_token:t,issued_at:o,expires_at:typeof s=="string"?s:void 0}]]}))}function jr(e){let n=e.channelSession;return{...n.model===void 0?{}:{model:n.model},...n.reasoningEffort===void 0?{}:{reasoningEffort:n.reasoningEffort},...e.fast===!0?{serviceTier:"fast"}:{},...n.codexEnvironmentId===void 0?{}:{environmentId:n.codexEnvironmentId},approvalPolicy:Jr(n.approvalPolicy,n.sandbox),...n.sandbox===void 0?{}:{sandbox:n.sandbox}}}function Lr(e){let n=e.channelSession;return{cwd:e.cwd,...n.model===void 0?{}:{model:n.model},...n.reasoningEffort===void 0?{}:{effort:n.reasoningEffort},...e.fast===!0?{serviceTier:"fast"}:{},...n.codexEnvironmentId===void 0?{}:{environmentId:n.codexEnvironmentId},approvalPolicy:Jr(n.approvalPolicy,n.sandbox),...n.sandbox===void 0?{}:{sandboxPolicy:ps(n.sandbox,e.cwd)}}}function Jr(e,n){switch(e){case void 0:case"default":return"on-request";case"never":return n==="danger-full-access"?"never":"on-request";case"on-request":case"on-failure":return e;default:throw new Error(`unsupported Codex approval policy: ${e}`)}}function ps(e,n){switch(e){case"danger-full-access":return{type:"dangerFullAccess"};case"read-only":return{type:"readOnly",access:{type:"fullAccess"},networkAccess:!1};case"workspace-write":return{type:"workspaceWrite",writableRoots:[n],readOnlyAccess:{type:"fullAccess"},networkAccess:!1,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1};default:throw new Error(`unsupported Codex sandbox mode: ${e}`)}}var ln={mcpAuthFileContents:"LINZUMI_CLOUD_MCP_AUTH_JSON",llmProxyToken:"LINZUMI_CLOUD_LLM_PROXY_TOKEN"};function $r(e){let n;try{n=JSON.parse(Buffer.from(e,"base64").toString("utf8"))}catch{throw new Error("invalid guest cloud turn config payload (not base64 JSON)")}if(typeof n!="object"||n===null||Array.isArray(n))throw new Error("invalid guest cloud turn config payload");let r=n;for(let[t,o]of[["codexVersion",r.codexVersion],["sandbox",r.sandbox],["approvalPolicy",r.approvalPolicy],["kandanUrl",r.kandanUrl],["cwd",r.cwd]])if(typeof o!="string"||o==="")throw new Error(`invalid guest cloud turn config payload (${t} missing)`);if(!Array.isArray(r.input))throw new Error("invalid guest cloud turn config payload (input)");if(typeof r.appServerPort!="number"||!Number.isInteger(r.appServerPort))throw new Error("invalid guest cloud turn config payload (appServerPort)");return r}var Z="/home/agent",hs=`${Z}/.linzumi-provisioned`;var un="/dev/shm/linzumi",ba=`${un}/codex`,Sa=`${un}/mcp-auth.json`;var wa=`${un}/codex.env`;var Oa=`${Z}/cloud-supervisor.mjs`,Ur=`${Z}/mcp-server.mjs`,fn=`${Z}/.secrets`,pn=`${fn}/mcp-auth.json`,je=`${Z}/.codex`,Dr=`${je}/linzumi-thread-map.json`;var hn=`${Z}/.turn-heartbeats`,Vr=5e3,gs=/^[A-Za-z0-9-]{8,64}$/;function gn(e){if(!gs.test(e))throw new Error(`invalid cloud turn nonce: ${JSON.stringify(e.slice(0,80))}`)}var ws=3e4,vs=200;function zr(e){return e.replace(/\bsmk_[A-Za-z0-9._-]+/g,"smk_[REDACTED]").replace(/\b(sk|lz|tok|bearer)[-_][A-Za-z0-9._-]{8,}/gi,"$1_[REDACTED]")}var Je;function Es(e){Je=e;try{ie(Br(e),{recursive:!0}),be(e,"")}catch{Je=void 0}}function J(e){let n=`${JSON.stringify(e)}
13
13
  `;if(process.stdout.write(n),Je!==void 0)try{ms(Je,n)}catch{}}function Le(e,n,r){J({phase:"exit",ok:e,reason:zr(n),turnMs:r})}function ks(e){return{id:e.id,name:e.name,baseUrl:e.baseUrl,envKey:e.envKey,wireApi:e.wireApi,...e.httpHeaders===void 0?{}:{httpHeaders:{...e.httpHeaders}},...e.envHttpHeaders===void 0?{}:{envHttpHeaders:{...e.envHttpHeaders}}}}function Cs(e){if(e.sandbox!=="danger-full-access")throw new Error(`guest cloud turn requires sandbox "danger-full-access", got ${JSON.stringify(e.sandbox)}`);if(e.approvalPolicy!=="never")throw new Error(`guest cloud turn requires approvalPolicy "never", got ${JSON.stringify(e.approvalPolicy)}`)}function Os(e,n=je){let r=Cr({command:"node",argsPrefix:[Ur],kandanUrl:e.kandanUrl,authFilePath:pn,ownerUsername:e.ownerUsername,operatingMode:"text",cwd:e.cwd,threadId:e.threadId,agentSession:!0});return Rr(`ws://127.0.0.1:${e.appServerPort}`,{model:e.model,reasoningEffort:e.reasoningEffort,mcpServers:[r],...e.modelProvider===void 0?{}:{modelProvider:ks(e.modelProvider)},env:{CODEX_HOME:n,...qr(e)}})}function qr(e){let n=process.env[ln.llmProxyToken];return e.modelProvider===void 0||n===void 0||n===""?{}:{[e.modelProvider.envKey]:n}}function Ts(e,n){let r=process.env[ln.mcpAuthFileContents];if(r===void 0||r==="")throw new Error("guest cloud turn missing MCP auth-cache (LINZUMI_CLOUD_MCP_AUTH_JSON)");ie(e,{recursive:!0,mode:448}),Fr(e,448),be(n,r,{mode:384}),Fr(n,384)}function Ps(e){try{Gr(e,{recursive:!0,force:!0})}catch{}}var Rs=64;function Wr(e){try{let n=JSON.parse(_s(e,"utf8"));if(typeof n!="object"||n===null||Array.isArray(n))return{};let r={};for(let[t,o]of Object.entries(n))typeof o=="string"&&o!==""&&(r[t]=o);return r}catch{return{}}}function As(e,n,r){try{let t=Wr(e);delete t[n];let o=Object.entries(t),s=o.slice(Math.max(0,o.length-(Rs-1)));s.push([n,r]),ie(Br(e),{recursive:!0}),be(e,JSON.stringify(Object.fromEntries(s)))}catch{}}var Is=new Set(["turn/completed","turn/failed","turn/aborted"]),Ms=2e3;function Ns(e){let n=L(L(e)?.item);if(n===void 0||P(n.type)!=="agentMessage")return"";let r=P(n.text);return r!==void 0&&r!==""?r:(Er(n.content)??[]).map(s=>{let i=L(s);if(i===void 0)return;let a=P(i.type);if(!(a!=="text"&&a!=="output_text"&&a!=="input_text"))return P(i.text)??P(i.content)}).filter(s=>s!==void 0&&s!=="").join(`
14
14
 
15
15
  `)}function js(e){let n=L(L(e)?.item);if(n===void 0)return!1;let r=P(n.type);if(r!=="mcpToolCall"&&r!=="dynamicToolCall"&&r!=="collabAgentToolCall"||P(n.status)!=="completed"||n.error!==void 0&&n.error!==null||n.success===!1)return!1;let t=P(n.tool)??"";return(t.split("__").pop()??t)==="linzumi_agent_reply"}var Ls=15e3;function Js(e){return/already_replied|no_active_asker_binding/i.test(e)}async function $s(e){let n=e.body.trim();if(n==="")return"skipped";let r=Nr(e.kandanUrl,e.mcpAuthPath);if(r===void 0)throw new Error("reply relay: no agent token in the guest MCP auth file");let t=async(s,i)=>{let a=new AbortController,d=setTimeout(()=>a.abort(),Ls);try{return await fetch(s,{...i,signal:a.signal})}finally{clearTimeout(d)}},o=Mr({kandanUrl:e.kandanUrl,accessToken:r.accessToken,operatingMode:"text",fetchImpl:t});try{return await o.agentReply({body:n}),"posted"}catch(s){let i=s instanceof Error?s.message:String(s);if(Js(i))return"already";throw new Error(`reply relay failed: ${i}`)}}function Us(e){if(e==="item/commandExecution/requestApproval"||e==="item/fileChange/requestApproval")return{decision:"approved"}}async function Ds(e,n,r){for(;;){if(r.exitCode!==null&&r.exitCode!==void 0)throw new Error(`codex app-server exited before it accepted a connection (code ${r.exitCode})`);try{return await Ar(e)}catch(t){if(Date.now()>=n)throw t;await new Promise(o=>setTimeout(o,vs))}}}var Vs=360*60*1e3;function Fs(e,n){try{for(let r of xs(e))try{let t=$e(e,r);n-bs(t).mtimeMs>Vs&&Ss(t)}catch{}}catch{}}function Gs(e,n,r=Vr){gn(n);let t=$e(e,`${n}.beat`),o=()=>{try{be(t,`${Date.now()}