@linzumi/cli 1.0.195 → 1.0.197

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.
@@ -40,7 +40,7 @@ ${u}`.split(`
40
40
  `,"utf8")}catch{return}}function CC(){let e=process.env.LINZUMI_CLI_AUDIT_LOG?.trim();return e===void 0||e===""?kC(SC(),".linzumi","logs","command-events.jsonl"):e}function y_(){let e=process.env.LINZUMI_RUNNER_LOG_FILE?.trim();return e===void 0||e===""?kC(SC(),".linzumi","logs","linzumi-runner.log"):e}function Zi(e){return fF(e)}function TC(e,n){return Ule(n)?jd:typeof e=="string"?mF(e):Array.isArray(e)?n==="args"?Nle(e):e.map(t=>TC(t,void 0)):e!==null&&typeof e=="object"?fF(e):e}function fF(e){let n=typeof e.name=="string"?e.name.toLowerCase():void 0,t=n==="authorization"||n==="cookie"||n==="set-cookie";return Object.fromEntries(Object.entries(e).filter(([r])=>r!=="runner_console").map(([r,o])=>[r,t&&r==="value"?jd:TC(o,r)]))}function Lle(e,n){let t=Fle(n.runner_console);return t===void 0?e:{...e,...Zi(t)}}function Fle(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Nle(e){let n=!1;return e.map(t=>{if(typeof t!="string")return n=!1,TC(t,void 0);if(n)return n=!1,jd;let[r,o]=zle(t);return qle.has(r)?o===void 0?(n=!0,t):`${r}=${jd}`:mF(t)})}function zle(e){let n=e.indexOf("=");return n===-1?[e,void 0]:[e.slice(0,n),e.slice(n+1)]}function Ule(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 mF(e){return Ble(e).replace(/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,jd)}function Ble(e){let n;try{n=new URL(e)}catch{return Jle(e)}for(let t of[...n.searchParams.keys()])cF.has(t.toLowerCase())&&n.searchParams.set(t,jd);return n.toString()}function Jle(e){let n=e.indexOf("?"),t=e.indexOf("#");if(n===-1||t!==-1&&t<n)return e;let r=e.slice(0,n),o=t===-1?e.slice(n+1):e.slice(n+1,t),i=t===-1?"":e.slice(t),s=new URLSearchParams(o),a=!1;for(let d of[...s.keys()])cF.has(d.toLowerCase())&&(s.set(d,jd),a=!0);switch(a){case!0:return`${r}?${s.toString()}${i}`;case!1:return e}}function Kle(e){return e.closed||e.destroyed?Promise.resolve():new Promise((n,t)=>{e.once("error",t),e.end(n)})}var jd,cF,qle,jle,zt=U(()=>{"use strict";g_();jd="<SENSITIVE_DATA>",cF=aF(new Set(["access_token","authorization","code","cookie","kandan_preview_ticket","refresh_token","token"])),qle=new Set(["--access-token","--api-key","--authorization","--cookie","--oauth-code","--password","--refresh-token","--secret","--token"]),jle=3e4});function Wle(e){let n=new Map;return{report:r=>{let o=r.key??r.message,i=r.audience??"user",s=e.nowMs(),a=n.get(o),d=a===void 0?{key:o,severity:r.severity,message:r.message,audience:i,count:1,firstAtMs:s,lastAtMs:s}:{...a,severity:r.severity,message:r.message,audience:i,count:a.count+1,lastAtMs:s};n.delete(o),n.set(o,d);for(let u of n.keys()){if(n.size<=Vle)break;n.delete(u)}return e.writeAuditEvent(hF,{severity:d.severity,audience:d.audience,key:d.key,message:d.message,count:d.count}),e.tuiActive()?(d.audience==="user"&&e.reportConsoleEvent(hF,{severity:d.severity,key:d.key,message:d.message,count:d.count}),d):(d.count===1&&e.writeStderr(`${Hle(d.severity)}${d.message}
41
41
  `),d)},notices:()=>Array.from(n.values()),reset:()=>n.clear()}}function Hle(e){switch(e){case"warning":return"WARNING: ";case"error":return"ERROR: ";case"info":return""}}function gF(e){PC=e}function Fr(e){return Gle.report(e)}var Vle,hF,PC,Gle,$f=U(()=>{"use strict";zt();Vle=50,hF="runner.notice";PC={tuiActive:()=>!1,reportConsoleEvent:()=>{}};Gle=Wle({tuiActive:()=>PC.tuiActive(),writeAuditEvent:(e,n)=>ye(e,n),reportConsoleEvent:(e,n)=>PC.reportConsoleEvent(e,n),writeStderr:e=>{process.stderr.write(e)},nowMs:Date.now})});import{realpath as __,writeFile as Zle,mkdir as Qle,open as Xle}from"node:fs/promises";import{constants as yF}from"node:fs";import{homedir as Yle}from"node:os";import{basename as EC,extname as xF,isAbsolute as bF,join as _F,relative as vF,resolve as RC}from"node:path";async function AC(e,n){if(n.attachments.length===0)return[];if(n.seq===void 0)throw new Error("Kandan attachment input missing source message seq");let t=_F(e.cwd,".kandan",e.attachmentDirectoryName,`message-${n.seq}`);await Qle(t,{recursive:!0});let r=[];for(let[o,i]of n.attachments.entries()){let s=i.url;if(s===void 0)throw new Error(`attachment ${o+1} for message ${n.seq} is missing a URL`);let a=ope(i.fileName??i.id??`attachment-${o+1}`,o),d=_F(t,a),u=kF(e.kandanUrl,s),c=await(e.fetch??globalThis.fetch)(u,{headers:npe(e,u)});if(!c.ok)throw new Error(`attachment ${a} download failed: ${c.status} ${c.statusText}`);let l=Buffer.from(await c.arrayBuffer());await Zle(d,l),r.push({fileName:a,contentType:i.contentType,sizeBytes:i.sizeBytes??l.byteLength,path:d,isImage:ipe(i.contentType,i.kind),dataBase64:l.toString("base64")})}return r}function MC(e,n,t={}){if(e.trimStart().startsWith("!"))return e;let r=n.length===0?[]:["","Linzumi attachments downloaded for this message:",...n.map(i=>{let s=[i.contentType,i.sizeBytes===void 0?void 0:`${i.sizeBytes} bytes`].flatMap(d=>d===void 0?[]:[d]),a=s.length===0?"":` (${s.join(", ")})`;return`- ${i.fileName}${a}: ${i.path}`})],o=t.uploadInstructionMode==="footer"?["If you create files that should be attached back to Kandan, end your assistant response with:","Kandan attachments:","- relative/or/absolute/path/to/file","Only attach non-hidden files: source/text files of any language are fine, as are common document, image, patch, archive, or video types."]:["When you create files that should be attached back to Linzumi, use the linzumi_upload_files MCP tool silently.","Do not mention that you are using the upload tool. Do not print an upload manifest or upload footer in the message.","The MCP upload tool is the only supported path for attaching generated files to Linzumi messages.","Attach files to the reply you already posted with target.kind=latest_assistant_message; only use new_message when you have not posted a reply yet, and never repeat your reply text as the new message body."];return[e,...r,"",...o].join(`
42
42
  `)}function SF(e){return e.flatMap(n=>n.isImage?[{type:"localImage",path:n.path}]:[])}async function DC(e,n){let t=await AC(e,n),r=MC(n.body,t,{uploadInstructionMode:"footer"}),o=t.flatMap(i=>{let s=spe(i.contentType);return s!==void 0?[{type:"image",source:{type:"base64",media_type:s,data:i.dataBase64}}]:[]});return o.length===0?r:[{type:"text",text:r},...o]}async function epe(e,n,t){if(y(t.kind)!=="codex_assistant_message")return{fileIds:[],attachedRawPaths:[]};let r=await __(e.cwd),o=await IF(r),i=await ape(n,r);if(i.length===0)return{fileIds:[],attachedRawPaths:[]};let s=await Promise.all(i.map(async({rawPath:c,resolvedPath:l})=>{let p=await PF(o,l);return{rawPath:c,fileName:EC(l),contentType:RF(l,p.classification),sizeBytes:p.bytes.byteLength,bytes:p.bytes}})),a=await ype(e.kandan,e.topic,"session:prepare_message_uploads",{workspace:e.workspace,channel:e.channel,files:s.map(c=>({file_name:c.fileName,content_type:c.contentType,size_bytes:c.sizeBytes}))}),d=$e(a.uploads)??[];if(d.length!==s.length)throw new Error("Kandan attachment prepare response count mismatch");return await Promise.all(s.map(async(c,l)=>{let p=E(d[l]),f=y(p?.upload_url),g=y(p?.upload_method)??"PUT";if(f===void 0)throw new Error("Kandan attachment prepare response missing upload_url");let m=c.bytes,_=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength),b=await(e.fetch??globalThis.fetch)(kF(e.kandanUrl,f),{method:g,headers:{"content-type":c.contentType},body:_});if(!b.ok)throw new Error(`Kandan attachment upload failed for ${c.fileName}: ${b.status} ${b.statusText}`)})),{fileIds:d.map(c=>{let l=y(E(c)?.file_id);if(l===void 0)throw new Error("Kandan attachment prepare response missing file_id");return l}),attachedRawPaths:s.map(c=>c.rawPath)}}async function OC(e,n){let t=await __(e),r=await IF(t),o=await TF(t,n),i=await PF(r,o);return{fileName:EC(o),contentType:RF(o,i.classification),sizeBytes:i.bytes.byteLength,bytes:i.bytes}}function kF(e,n){let t=rpe(n);if(t!==void 0)return t;if(e===void 0)throw new Error(`relative attachment URL cannot be resolved without Kandan URL: ${n}`);let r=e.replace(/^wss:\/\//,"https://").replace(/^ws:\/\//,"http://");return new URL(n,r).toString()}function npe(e,n){return tpe(e.kandanUrl,n)?{authorization:`Bearer ${e.token}`}:{}}function tpe(e,n){if(e===void 0)return!1;try{let t=new URL(e.replace(/^wss:\/\//,"https://").replace(/^ws:\/\//,"http://")).origin;return new URL(n).origin===t}catch{return!1}}function rpe(e){try{return new URL(e).toString()}catch{return}}function ope(e,n){let t=EC(e).replaceAll(/[^\w.\- ]/g,"_").trim(),r=t===""||t==="."||t===".."?`attachment-${n+1}`:t;return`${n+1}-${r}`}function ipe(e,n){return e!==void 0&&e.toLowerCase().startsWith("image/")?!0:n?.toLowerCase()==="image"}function spe(e){switch(e?.split(";")[0]?.trim().toLowerCase()){case"image/png":return"image/png";case"image/jpeg":return"image/jpeg";case"image/gif":return"image/gif";case"image/webp":return"image/webp";default:return}}async function ape(e,n){let t=e.split(/\r?\n/),r=t.findIndex(s=>s.trim().toLowerCase()==="kandan attachments:");if(r===-1)return[];let o=new Set,i=[];for(let s of t.slice(r+1)){let a=s.trim(),d=CF(a);if(d==="")continue;if(d===void 0)break;if(gpe(d))continue;if(!hpe(d))break;let u;try{u=await TF(n,d)}catch(c){if(c.code==="ENOENT")break;throw c}o.has(u)||(o.add(u),i.push({rawPath:d,resolvedPath:u}))}return i}function CF(e){if(e==="")return"";let n=e.startsWith("- ")?e.slice(2).trim():e;if(n!=="")return n.replace(/^`|`$/g,"")}async function TF(e,n){if(n==="")throw new Error("Kandan attachment path must not be empty");let t=bF(n)?RC(n):RC(e,n);return await __(t)}async function PF(e,n){let t=e.find(s=>dpe(s.path,n));if(t===void 0){let s=e.map(a=>a.label).join(", ");throw new Error(`Kandan attachment path must resolve inside an allowed upload root (${s}): ${n}`)}if(vF(t.path,n).split(/[\\/]+/).find(s=>s.startsWith("."))!==void 0)throw new Error(`Kandan attachment upload path must not include hidden path segments: ${n}`);let i=await Xle(n,yF.O_RDONLY|yF.O_NONBLOCK);try{if(!(await i.stat()).isFile())throw new Error(`Kandan attachment path is not a file: ${n}`);let a=xF(n).toLowerCase();if(wF.has(a))return{classification:"known-type",bytes:await i.readFile()};let d=Buffer.alloc(IC),{bytesRead:u}=await i.read(d,0,IC,0);if(d.subarray(0,u).includes(0))throw new Error(`Kandan attachment upload requires a known media/document type or text content (binary content is not allowed): ${n}`);let c=await i.readFile();if(c.subarray(0,IC).includes(0))throw new Error(`Kandan attachment upload requires a known media/document type or text content (binary content is not allowed): ${n}`);return{classification:"text-content",bytes:c}}finally{await i.close()}}async function IF(e){let n=[{path:e,label:"runner cwd"}],t=process.env.HOME?.trim(),r=RC(t===void 0||t===""?Yle():t,"Downloads");try{let o=await __(r);n.some(i=>i.path===o)||n.push({path:o,label:"~/Downloads"})}catch{return n}return n}function dpe(e,n){let t=vF(e,n);return t===""||!t.startsWith("..")&&!bF(t)}function upe(e){let n=e.toLowerCase();return n.endsWith(".png")?"image/png":n.endsWith(".jpg")||n.endsWith(".jpeg")?"image/jpeg":n.endsWith(".gif")?"image/gif":n.endsWith(".webp")?"image/webp":n.endsWith(".csv")?"text/csv":n.endsWith(".json")?"application/json":n.endsWith(".md")||n.endsWith(".txt")||n.endsWith(".log")?"text/plain":"application/octet-stream"}function RF(e,n){if(e.toLowerCase().endsWith(".py"))return"text/x-python";let r=upe(e);return n==="text-content"&&r==="application/octet-stream"?"text/plain":r}function cpe(e,n=[]){let t=e.split(/\r?\n/),r=t.findIndex(a=>a.trim().toLowerCase()==="kandan attachments:");if(r===-1)return e;let o=[],i=!1;for(let a of t.slice(r+1)){if(a.trim()===""){switch(i){case!0:o.push(a);break;case!1:break}continue}fpe(a,n)||(o.push(a),i=!0)}let s=[...t.slice(0,r),...o];for(;s.length>0&&s[s.length-1]?.trim()==="";)s.pop();return s.join(`
43
- `)}function lpe(e,n,t=[]){let r=cpe(e,t);switch(r.trim()===""&&n.length>0){case!0:return"Attached file.";case!1:return r}}function ppe(e,n){return y(e.kind)==="codex_assistant_message"?{...e,content:n}:e}function fpe(e,n){let t=CF(e.trim());return t===""?!0:t===void 0?!1:n.includes(t)}function hpe(e){let n=xF(e).toLowerCase();return n===""?!/\s/.test(e):wF.has(n)||mpe.test(n)}function gpe(e){return e.split(/[\\/]+/).some(n=>n.startsWith("."))}async function ype(e,n,t,r){let o=await e.push(n,t,r);if(ne(o)&&o.status==="ok"&&ne(o.response))return o.response;throw new Error(`kandan push failed: ${t}: ${JSON.stringify(o).slice(0,500)}`)}async function x_(e,n,t){switch(n){case"session:post_thread_message":case"session:stream_thread_message":case"session:edit_thread_message":break;default:return t}let r=n==="session:edit_thread_message",o=r?E(t.structured):E(E(t.payload)?.structured),i=typeof t.body=="string"?t.body:void 0;if(o===void 0||i===void 0||y(o.stream_state)!=="completed")return t;let s,a;try{let l=await epe(e,i,o);s=l.fileIds,a=l.attachedRawPaths}catch(l){return e.log?.("pipeline.attachment_prepare_degraded",{event:n,message:l instanceof Error?l.message:String(l)}),t}let d=lpe(i,s,a),u=ppe(o,d);if(d===i&&s.length===0)return t;let c={...t,body:d,...s.length===0?{}:{uploaded_file_ids:s}};return r?{...c,structured:u}:{...c,payload:{...E(t.payload)??{},structured:u}}}var wF,IC,mpe,b_=U(()=>{"use strict";et();zn();wF=new Set([".csv",".diff",".gif",".htm",".html",".jpeg",".jpg",".json",".jsonl",".log",".md",".mp4",".patch",".pdf",".png",".svg",".txt",".webm",".webp",".xml",".zip"]);IC=8192;mpe=/^\.[a-z0-9_+-]{1,12}$/});function k_(e,n){switch(e){case"warning":case"error":return{diagnostic_summary:jC(e,n)??`${e}: seen (no details)`,diagnostic_payload:qC(n,0),diagnostic_payload_keys:Object.keys(n).sort()};default:return{}}}function MF(e,n=12e3){let t=[],r=n,o=!1,i=a=>{if(!o){if(a.length<=r){t.push(a),r-=a.length;return}t.push(a.slice(0,r)),r=0,o=!0}},s=(a,d)=>{if(o)return;if(a===void 0){i("null");return}if(typeof a=="string"){let c=a.length<=w_?a:`${a.slice(0,w_)}...`;i(JSON.stringify(S_(c)));return}if(a===null||typeof a=="boolean"){i(JSON.stringify(a));return}if(typeof a=="number"){i(JSON.stringify(a)??"null");return}if(d>=AF){i(JSON.stringify("[max-depth]"));return}if(!ne(a)){i("[");for(let c=0;c<a.length;c+=1){if(o)return;c>0&&i(","),s(a[c],d+1)}i("]");return}i("{");let u=!0;for(let c in a){if(o)return;Object.prototype.hasOwnProperty.call(a,c)&&(u?u=!1:i(","),i(JSON.stringify(c)),i(":"),DF(c)?i(JSON.stringify(v_)):s(a[c],d+1))}i("}")};return s(e,0),o?`${t.join("")}...`:t.join("")}function jC(e,n){let t=EF(n.error),r=EF(n.item),o=Qi(n.code)??$C(n.code)??Qi(t?.code)??$C(t?.code)??Qi(n.status)??$C(n.status),i=Qi(n.message)??Qi(n.detail)??Qi(n.reason)??Qi(t?.message)??Qi(t?.detail)??Qi(t?.reason),s=Qi(r?.type),a=o===void 0?void 0:S_(o),d=a===void 0?e:`${e} ${a}`,u=i===void 0?s===void 0?void 0:`item.type=${s}`:S_(i);return u===void 0?void 0:`${d}: ${u}`}function qC(e,n){if(e===void 0)return null;if(typeof e=="string"){let t=S_(e);return t.length<=w_?t:`${t.slice(0,w_)}...`}return e===null||typeof e=="boolean"||typeof e=="number"?e:n>=AF?"[max-depth]":Array.isArray(e)?e.map(t=>qC(t,n+1)):Object.fromEntries(Object.entries(e).map(([t,r])=>[t,DF(t)?v_:qC(r,n+1)]))}function DF(e){let n=e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase();switch(n){case"authorization":case"cookie":case"cookies":case"credential":case"credentials":case"password":case"secret":case"token":case"access_key":case"api_key":case"auth_token":case"bearer_token":case"client_secret":case"id_token":case"private_key":case"proxy_authorization":case"refresh_token":case"secret_key":case"session_token":case"set_cookie":case"sig":case"signature":case"signing_key":case"x_amz_signature":case"x_api_key":return!0;default:return n.endsWith("_api_key")||n.endsWith("_access_key")||n.endsWith("_private_key")||n.endsWith("_secret_key")||n.endsWith("_authorization")||n.endsWith("_cookie")||n.endsWith("_cookies")||n.endsWith("_token")||n.endsWith("_secret")||n.endsWith("_password")||n.endsWith("_signature")||n.endsWith("_sig")||n.endsWith("_credential")||n.endsWith("_credentials")}}function S_(e){return e.replace(/https?:\/\/\S*(?:token|secret|signature|sig|x-amz-signature|api[_-]?key|access[_-]?key|private[_-]?key|refresh)\S*/gi,_pe).replace(/(^|[^A-Za-z0-9_-])(["']?)(set-cookie|cookie)\2\s*(:|=)\s*(["']?)[^\r\n"']*\5/gi,(n,t,r,o,i,s)=>`${t}${r}${o}${r}${i}${i===":"&&s===""?" ":""}${s}${v_}${s}`).replace(new RegExp(`(^|[^A-Za-z0-9_-])(["']?)(${xpe})\\2\\s*(:|=)\\s*(["']?)(?:(?:Bearer|Basic|Digest|Token|ApiKey|OAuth|Negotiate)\\s+)?[^"'\\s,;}&]+\\5`,"gi"),(n,t,r,o,i,s)=>`${t}${r}${o}${r}${i}${i===":"&&s===""?" ":""}${s}${v_}${s}`).replace(/\bBearer\s+[^\s,;]+/gi,"Bearer [redacted]")}function EF(e){return ne(e)?e:void 0}function Qi(e){return typeof e=="string"&&e.trim()!==""?e.trim():void 0}function $C(e){return typeof e=="number"&&Number.isFinite(e)?e.toString():void 0}var v_,_pe,AF,w_,xpe,C_=U(()=>{"use strict";zn();v_="[redacted]",_pe="[redacted-url]",AF=12,w_=8e3,xpe="(?:(?:[A-Za-z0-9]+[_-]+)*(?:proxy-authorization|authorization|set-cookie|cookie|x-api-key|api[_-]?key|access[_-]?key|access[_-]?token|private[_-]?key|refresh(?:[_-]?token)?|auth[_-]?token|id[_-]?token|client[_-]?secret|bearer[_-]?token|session[_-]?token|secret[_-]?key|signing[_-]?key|credential|credentials|token|secret|password|signature|sig))"});function qf(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:Lf(n.approvalPolicy,n.sandbox,{sandboxedNeverDefault:n.sandboxedApprovalNeverDefault}),...n.sandbox===void 0?{}:{sandbox:n.sandbox}}}function OF(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:Lf(n.approvalPolicy,n.sandbox,{sandboxedNeverDefault:n.sandboxedApprovalNeverDefault}),...n.sandbox===void 0?{}:{sandboxPolicy:bpe(n.sandbox,e.cwd)}}}function Uc(e,n,t){if(!(e===void 0||e==="default"))return jf(e,n,t)}function jf(e,n,t){let r=t?.sandboxedNeverDefault===!0&&n==="workspace-write";switch(e){case void 0:case"default":return r?"never":"on-request";case"never":return n==="danger-full-access"||r?"never":"on-request";case"on-request":case"on-failure":return e;default:throw new Error(`unsupported Codex approval policy: ${e}`)}}function Lf(e,n,t){let r=jf(e,n,t);return r==="never"&&n==="danger-full-access"?$F:r==="on-failure"?"on-request":r}function Ff(e,n,t){try{return Lf(e,n,t)===$F}catch{return!1}}function Bc(e){switch(e){case"read-only":case"workspace-write":return!0;default:return!1}}function Jc(e){switch(e){case"on-request":case"on-failure":case"untrusted":return!0;default:return!1}}function bpe(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 $F,Nf=U(()=>{"use strict";$F={granular:{sandbox_approval:!1,rules:!1,skill_approval:!1,request_permissions:!1,mcp_elicitations:!0}}});var T_,qF,LC=U(()=>{"use strict";T_=`<linzumi_markdown_media_guidance>
43
+ `)}function lpe(e,n,t=[]){let r=cpe(e,t);switch(r.trim()===""&&n.length>0){case!0:return"Attached file.";case!1:return r}}function ppe(e,n){return y(e.kind)==="codex_assistant_message"?{...e,content:n}:e}function fpe(e,n){let t=CF(e.trim());return t===""?!0:t===void 0?!1:n.includes(t)}function hpe(e){let n=xF(e).toLowerCase();return n===""?!/\s/.test(e):wF.has(n)||mpe.test(n)}function gpe(e){return e.split(/[\\/]+/).some(n=>n.startsWith("."))}async function ype(e,n,t,r){let o=await e.push(n,t,r);if(ne(o)&&o.status==="ok"&&ne(o.response))return o.response;throw new Error(`kandan push failed: ${t}: ${JSON.stringify(o).slice(0,500)}`)}async function x_(e,n,t){switch(n){case"session:post_thread_message":case"session:stream_thread_message":case"session:edit_thread_message":break;default:return t}let r=n==="session:edit_thread_message",o=r?E(t.structured):E(E(t.payload)?.structured),i=typeof t.body=="string"?t.body:void 0;if(o===void 0||i===void 0||y(o.stream_state)!=="completed")return t;let s,a;try{let l=await epe(e,i,o);s=l.fileIds,a=l.attachedRawPaths}catch(l){return e.log?.("pipeline.attachment_prepare_degraded",{event:n,message:l instanceof Error?l.message:String(l)}),t}let d=lpe(i,s,a),u=ppe(o,d);if(d===i&&s.length===0)return t;let c={...t,body:d,...s.length===0?{}:{uploaded_file_ids:s}};return r?{...c,structured:u}:{...c,payload:{...E(t.payload)??{},structured:u}}}var wF,IC,mpe,b_=U(()=>{"use strict";et();zn();wF=new Set([".csv",".diff",".gif",".htm",".html",".jpeg",".jpg",".json",".jsonl",".log",".md",".mp4",".patch",".pdf",".png",".svg",".txt",".webm",".webp",".xml",".zip"]);IC=8192;mpe=/^\.[a-z0-9_+-]{1,12}$/});function k_(e,n){switch(e){case"warning":case"error":return{diagnostic_summary:jC(e,n)??`${e}: seen (no details)`,diagnostic_payload:qC(n,0),diagnostic_payload_keys:Object.keys(n).sort()};default:return{}}}function MF(e,n=12e3){let t=[],r=n,o=!1,i=a=>{if(!o){if(a.length<=r){t.push(a),r-=a.length;return}t.push(a.slice(0,r)),r=0,o=!0}},s=(a,d)=>{if(o)return;if(a===void 0){i("null");return}if(typeof a=="string"){let c=a.length<=w_?a:`${a.slice(0,w_)}...`;i(JSON.stringify(S_(c)));return}if(a===null||typeof a=="boolean"){i(JSON.stringify(a));return}if(typeof a=="number"){i(JSON.stringify(a)??"null");return}if(d>=AF){i(JSON.stringify("[max-depth]"));return}if(!ne(a)){i("[");for(let c=0;c<a.length;c+=1){if(o)return;c>0&&i(","),s(a[c],d+1)}i("]");return}i("{");let u=!0;for(let c in a){if(o)return;Object.prototype.hasOwnProperty.call(a,c)&&(u?u=!1:i(","),i(JSON.stringify(c)),i(":"),DF(c)?i(JSON.stringify(v_)):s(a[c],d+1))}i("}")};return s(e,0),o?`${t.join("")}...`:t.join("")}function jC(e,n){let t=EF(n.error),r=EF(n.item),o=Qi(n.code)??$C(n.code)??Qi(t?.code)??$C(t?.code)??Qi(n.status)??$C(n.status),i=Qi(n.message)??Qi(n.detail)??Qi(n.reason)??Qi(t?.message)??Qi(t?.detail)??Qi(t?.reason),s=Qi(r?.type),a=o===void 0?void 0:S_(o),d=a===void 0?e:`${e} ${a}`,u=i===void 0?s===void 0?void 0:`item.type=${s}`:S_(i);return u===void 0?void 0:`${d}: ${u}`}function qC(e,n){if(e===void 0)return null;if(typeof e=="string"){let t=S_(e);return t.length<=w_?t:`${t.slice(0,w_)}...`}return e===null||typeof e=="boolean"||typeof e=="number"?e:n>=AF?"[max-depth]":Array.isArray(e)?e.map(t=>qC(t,n+1)):Object.fromEntries(Object.entries(e).map(([t,r])=>[t,DF(t)?v_:qC(r,n+1)]))}function DF(e){let n=e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[\s-]+/g,"_").toLowerCase();switch(n){case"authorization":case"cookie":case"cookies":case"credential":case"credentials":case"password":case"secret":case"token":case"access_key":case"api_key":case"auth_token":case"bearer_token":case"client_secret":case"id_token":case"private_key":case"proxy_authorization":case"refresh_token":case"secret_key":case"session_token":case"set_cookie":case"sig":case"signature":case"signing_key":case"x_amz_signature":case"x_api_key":return!0;default:return n.endsWith("_api_key")||n.endsWith("_access_key")||n.endsWith("_private_key")||n.endsWith("_secret_key")||n.endsWith("_authorization")||n.endsWith("_cookie")||n.endsWith("_cookies")||n.endsWith("_token")||n.endsWith("_secret")||n.endsWith("_password")||n.endsWith("_signature")||n.endsWith("_sig")||n.endsWith("_credential")||n.endsWith("_credentials")}}function S_(e){return e.replace(/https?:\/\/\S*(?:token|secret|signature|sig|x-amz-signature|api[_-]?key|access[_-]?key|private[_-]?key|refresh)\S*/gi,_pe).replace(/(^|[^A-Za-z0-9_-])(["']?)(set-cookie|cookie)\2\s*(:|=)\s*(["']?)[^\r\n"']*\5/gi,(n,t,r,o,i,s)=>`${t}${r}${o}${r}${i}${i===":"&&s===""?" ":""}${s}${v_}${s}`).replace(new RegExp(`(^|[^A-Za-z0-9_-])(["']?)(${xpe})\\2\\s*(:|=)\\s*(["']?)(?:(?:Bearer|Basic|Digest|Token|ApiKey|OAuth|Negotiate)\\s+)?[^"'\\s,;}&]+\\5`,"gi"),(n,t,r,o,i,s)=>`${t}${r}${o}${r}${i}${i===":"&&s===""?" ":""}${s}${v_}${s}`).replace(/\bBearer\s+[^\s,;]+/gi,"Bearer [redacted]")}function EF(e){return ne(e)?e:void 0}function Qi(e){return typeof e=="string"&&e.trim()!==""?e.trim():void 0}function $C(e){return typeof e=="number"&&Number.isFinite(e)?e.toString():void 0}var v_,_pe,AF,w_,xpe,C_=U(()=>{"use strict";zn();v_="[redacted]",_pe="[redacted-url]",AF=12,w_=8e3,xpe="(?:(?:[A-Za-z0-9]+[_-]+)*(?:proxy-authorization|authorization|set-cookie|cookie|x-api-key|api[_-]?key|access[_-]?key|access[_-]?token|private[_-]?key|refresh(?:[_-]?token)?|auth[_-]?token|id[_-]?token|client[_-]?secret|bearer[_-]?token|session[_-]?token|secret[_-]?key|signing[_-]?key|credential|credentials|token|secret|password|signature|sig))"});function qf(e){let n=e.channelSession;return{...n.model===void 0?{}:{model:n.model},...n.reasoningEffort===void 0?{}:{config:{model_reasoning_effort:n.reasoningEffort}},...e.fast===!0?{serviceTier:"fast"}:{},...n.codexEnvironmentId===void 0?{}:{environmentId:n.codexEnvironmentId},approvalPolicy:Lf(n.approvalPolicy,n.sandbox,{sandboxedNeverDefault:n.sandboxedApprovalNeverDefault}),...n.sandbox===void 0?{}:{sandbox:n.sandbox}}}function OF(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:Lf(n.approvalPolicy,n.sandbox,{sandboxedNeverDefault:n.sandboxedApprovalNeverDefault}),...n.sandbox===void 0?{}:{sandboxPolicy:bpe(n.sandbox,e.cwd)}}}function Uc(e,n,t){if(!(e===void 0||e==="default"))return jf(e,n,t)}function jf(e,n,t){let r=t?.sandboxedNeverDefault===!0&&n==="workspace-write";switch(e){case void 0:case"default":return r?"never":"on-request";case"never":return n==="danger-full-access"||r?"never":"on-request";case"on-request":case"on-failure":return e;default:throw new Error(`unsupported Codex approval policy: ${e}`)}}function Lf(e,n,t){let r=jf(e,n,t);return r==="never"&&n==="danger-full-access"?$F:r==="on-failure"?"on-request":r}function Ff(e,n,t){try{return Lf(e,n,t)===$F}catch{return!1}}function Bc(e){switch(e){case"read-only":case"workspace-write":return!0;default:return!1}}function Jc(e){switch(e){case"on-request":case"on-failure":case"untrusted":return!0;default:return!1}}function bpe(e,n){switch(e){case"danger-full-access":return{type:"dangerFullAccess"};case"read-only":return{type:"readOnly",networkAccess:!1};case"workspace-write":return{type:"workspaceWrite",writableRoots:[n],networkAccess:!1,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1};default:throw new Error(`unsupported Codex sandbox mode: ${e}`)}}var $F,Nf=U(()=>{"use strict";$F={granular:{sandbox_approval:!1,rules:!1,skill_approval:!1,request_permissions:!1,mcp_elicitations:!0}}});var T_,qF,LC=U(()=>{"use strict";T_=`<linzumi_markdown_media_guidance>
44
44
  Some Linzumi users have opted into rich Markdown media rendering. When you are
45
45
  writing a visible Linzumi message, channel message, or thread reply, you may use
46
46
  these Markdown-compatible media directives:
@@ -1510,7 +1510,7 @@ To kick the agent off:
1510
1510
  `,O=Buffer.byteLength(P,"utf8");if(O>s)return l("runner_diagnostics.spool_entry_dropped",{reason:"entry_too_large",entry_bytes:O,max_entry_bytes:s}),!1;BMe(n,{recursive:!0}),f(u)+O>i&&g(),_(O);let R=b()?`
1511
1511
  `:"";return NMe(u,`${R}${P}`,"utf8"),!0}catch(T){return l("runner_diagnostics.spool_failed",{error:T instanceof Error?T.message:String(T)}),!1}},v=C=>{let T=[],P=KMe(C,"utf8");for(let O of P.split(`
1512
1512
  `))if(O.trim()!=="")try{let R=JSON.parse(O);R!==null&&typeof R=="object"&&T.push({parsed:R,raw:O})}catch{}return T};return{append:w,drain:async C=>{if(c)return{uploadedBatches:0,uploadedEntries:0,remainingBatches:p().length,skipped:!0};c=!0;let T=0,P=0;try{g(),_(0);let O=a()-o;for(let R of p()){let j;try{j=v(R)}catch(H){l("runner_diagnostics.spool_batch_unreadable",{file:R,error:H instanceof Error?H.message:String(H)}),m(R,"unreadable");continue}let B=j.filter(H=>{let X=dDe(H.parsed);return X===void 0||X>=O});if(B.length===0){m(R,"empty_or_expired");continue}let K=$E(R,".jsonl"),D=B.map(H=>H.raw).join(`
1513
- `),J=B.map(H=>H.parsed.spooled_at).filter(H=>typeof H=="string"),W={bundle_name:"runner-diagnostics-spool",exported_at:new Date(a()).toISOString(),idempotency_key:K,diagnostics:{kind:"runner_diagnostic_log",spool_batch:!0,idempotency_key:K,entry_count:B.length,...J.length===0?{}:{first_spooled_at:J[0],last_spooled_at:J[J.length-1]}},telemetry_ndjson:D};try{await C(W)}catch(H){l("runner_diagnostics.spool_upload_failed",{file:R,remaining_batches:p().length,error:H instanceof Error?H.message:String(H)});break}T+=1,P+=B.length;try{xV(R)}catch(H){l("runner_diagnostics.spool_delete_failed",{file:R,error:H instanceof Error?H.message:String(H)})}}}catch(O){l("runner_diagnostics.spool_drain_failed",{error:O instanceof Error?O.message:String(O)})}finally{c=!1}return{uploadedBatches:T,uploadedEntries:P,remainingBatches:p().length,skipped:!1}},pendingBatchFiles:p}}var QMe,XMe,YMe,eDe,nDe,bV,rDe,oDe,wV=U(()=>{"use strict";Rb();QMe=32*1024*1024,XMe=10080*60*1e3,YMe=4*1024*1024,eDe=1024*1024,nDe="spool.jsonl",bV=/^batch-(\d{1,16})-[0-9a-f-]+\.jsonl$/;rDe=/\b([A-Z][A-Z0-9_]{1,})=("[^"\n]*"|'[^'\n]*'|[^\s"'`;,)\]}]+)/g,oDe=/(?:\/(?:[A-Za-z0-9._@~+-]|%[0-9A-Fa-f]{2})+){2,}/g});var Xt,jE,za=U(()=>{"use strict";Xt="1.0.195",jE=`linzumi ${Xt}`});import{closeSync as kV,existsSync as FE,mkdirSync as uDe,openSync as CV,readFileSync as TV,renameSync as cDe,unlinkSync as yu,writeFileSync as lDe,writeSync as PV}from"node:fs";import{dirname as IV,join as pDe}from"node:path";function NE(e){return e instanceof Hs||e instanceof Error&&e.name===EV&&"lockPath"in e&&"heldBy"in e}function zE(e,n=at(),t){let r=t===void 0?encodeURIComponent(e):uu(t);return pDe(IV(n),"runners",`${r}.lock`)}function zv(e){let n=zE(e.machineId,e.configPath,e.linzumiUrl),t=e.isPidAlive??jV,r=e.now??(()=>new Date),o=e.killPid??CDe,i=r().toISOString(),s={version:1,machineId:e.machineId,runnerId:e.runnerId,pid:e.pid??process.pid,cwd:e.cwd,workspace:e.workspace,...e.linzumiUrl===void 0?{}:{linzumiUrl:Gn(e.linzumiUrl)},...e.launchSource===void 0?{}:{launchSource:e.launchSource},startedAt:i,heartbeatAt:i,cliVersion:e.cliVersion??Xt,...e.gracefulUpdateDrain===!0?{gracefulUpdateDrain:!0}:{}};gDe(e.machineId,e.configPath,e.linzumiUrl,t,r,o,e.onTakeover),yDe(n,s,t,r,o,e.onTakeover,e.beforeReadExistingLock,e.beforeReplaceStaleLock);let a=()=>AV(n,s,r),d=setInterval(a,RV);return d.unref(),{path:n,record:s,heartbeat:a,release:()=>{clearInterval(d),$V(n,s)}}}function AV(e,n,t){try{let r=Bv(e);if(r===void 0||r.machineId!==n.machineId||r.runnerId!==n.runnerId||r.pid!==n.pid||r.startedAt!==n.startedAt)return;let o={...r,heartbeatAt:t().toISOString()},i=`${e}.tmp`;lDe(i,`${JSON.stringify(o,null,2)}
1513
+ `),J=B.map(H=>H.parsed.spooled_at).filter(H=>typeof H=="string"),W={bundle_name:"runner-diagnostics-spool",exported_at:new Date(a()).toISOString(),idempotency_key:K,diagnostics:{kind:"runner_diagnostic_log",spool_batch:!0,idempotency_key:K,entry_count:B.length,...J.length===0?{}:{first_spooled_at:J[0],last_spooled_at:J[J.length-1]}},telemetry_ndjson:D};try{await C(W)}catch(H){l("runner_diagnostics.spool_upload_failed",{file:R,remaining_batches:p().length,error:H instanceof Error?H.message:String(H)});break}T+=1,P+=B.length;try{xV(R)}catch(H){l("runner_diagnostics.spool_delete_failed",{file:R,error:H instanceof Error?H.message:String(H)})}}}catch(O){l("runner_diagnostics.spool_drain_failed",{error:O instanceof Error?O.message:String(O)})}finally{c=!1}return{uploadedBatches:T,uploadedEntries:P,remainingBatches:p().length,skipped:!1}},pendingBatchFiles:p}}var QMe,XMe,YMe,eDe,nDe,bV,rDe,oDe,wV=U(()=>{"use strict";Rb();QMe=32*1024*1024,XMe=10080*60*1e3,YMe=4*1024*1024,eDe=1024*1024,nDe="spool.jsonl",bV=/^batch-(\d{1,16})-[0-9a-f-]+\.jsonl$/;rDe=/\b([A-Z][A-Z0-9_]{1,})=("[^"\n]*"|'[^'\n]*'|[^\s"'`;,)\]}]+)/g,oDe=/(?:\/(?:[A-Za-z0-9._@~+-]|%[0-9A-Fa-f]{2})+){2,}/g});var Xt,jE,za=U(()=>{"use strict";Xt="1.0.197",jE=`linzumi ${Xt}`});import{closeSync as kV,existsSync as FE,mkdirSync as uDe,openSync as CV,readFileSync as TV,renameSync as cDe,unlinkSync as yu,writeFileSync as lDe,writeSync as PV}from"node:fs";import{dirname as IV,join as pDe}from"node:path";function NE(e){return e instanceof Hs||e instanceof Error&&e.name===EV&&"lockPath"in e&&"heldBy"in e}function zE(e,n=at(),t){let r=t===void 0?encodeURIComponent(e):uu(t);return pDe(IV(n),"runners",`${r}.lock`)}function zv(e){let n=zE(e.machineId,e.configPath,e.linzumiUrl),t=e.isPidAlive??jV,r=e.now??(()=>new Date),o=e.killPid??CDe,i=r().toISOString(),s={version:1,machineId:e.machineId,runnerId:e.runnerId,pid:e.pid??process.pid,cwd:e.cwd,workspace:e.workspace,...e.linzumiUrl===void 0?{}:{linzumiUrl:Gn(e.linzumiUrl)},...e.launchSource===void 0?{}:{launchSource:e.launchSource},startedAt:i,heartbeatAt:i,cliVersion:e.cliVersion??Xt,...e.gracefulUpdateDrain===!0?{gracefulUpdateDrain:!0}:{}};gDe(e.machineId,e.configPath,e.linzumiUrl,t,r,o,e.onTakeover),yDe(n,s,t,r,o,e.onTakeover,e.beforeReadExistingLock,e.beforeReplaceStaleLock);let a=()=>AV(n,s,r),d=setInterval(a,RV);return d.unref(),{path:n,record:s,heartbeat:a,release:()=>{clearInterval(d),$V(n,s)}}}function AV(e,n,t){try{let r=Bv(e);if(r===void 0||r.machineId!==n.machineId||r.runnerId!==n.runnerId||r.pid!==n.pid||r.startedAt!==n.startedAt)return;let o={...r,heartbeatAt:t().toISOString()},i=`${e}.tmp`;lDe(i,`${JSON.stringify(o,null,2)}
1514
1514
  `,"utf8"),cDe(i,e)}catch{}}function _u(e,n,t){if(!n(e.pid))return{state:"dead"};let r=e.heartbeatAt??e.startedAt,o=Date.parse(r);return Number.isNaN(o)||t().getTime()-o>fDe?{state:"wedged",reason:e.heartbeatAt===void 0?"missing_heartbeat":"stale_heartbeat"}:{state:"live"}}function MV(e,n,t,r){return t!==Uv||e.launchSource!==Uv?!1:r.state!=="live"?!0:mDe(n,e.cliVersion)>0}function mDe(e,n){let t=SV(e),r=SV(n);for(let o=0;o<3;o++){let i=t.core[o],s=r.core[o];if(i===void 0||s===void 0)throw new Error(`compareCliVersions: unexpected undefined at core index ${o}`);if(i!==s)return i>s?1:-1}return t.prerelease.length===0&&r.prerelease.length===0?0:t.prerelease.length===0?1:r.prerelease.length===0?-1:hDe(t.prerelease,r.prerelease)}function SV(e){let n=e.trim().replace(/^v/i,"").split("+",1)[0]??"",t=n.indexOf("-"),r=t===-1?n:n.slice(0,t),o=t===-1?"":n.slice(t+1),i=r.split("."),s=[LE(i[0]),LE(i[1]),LE(i[2])],a=o===""?[]:o.split(".").filter(d=>d!=="");return{core:s,prerelease:a}}function LE(e){let n=Number.parseInt(e??"",10);return Number.isInteger(n)&&n>=0?n:0}function hDe(e,n){let t=Math.max(e.length,n.length);for(let r=0;r<t;r++){let o=e[r],i=n[r];if(o===void 0)return-1;if(i===void 0)return 1;let s=Number.parseInt(o,10),a=Number.parseInt(i,10),d=s.toString()===o,u=a.toString()===i;if(d&&u){if(s!==a)return s>a?1:-1}else{if(d!==u)return d?-1:1;if(o!==i)return o>i?1:-1}}return 0}function DV(e,n,t,r,o){try{r(n.pid)}catch(i){let s=i!==null&&typeof i=="object"&&"code"in i?i.code:void 0;if(s!=="ESRCH")throw s==="EPERM"||s==="EACCES"?new Error(`Cannot take over the runner lock at ${e}: its holder process (pid ${n.pid}) is owned by another user and cannot be stopped. Stop that process, or remove the lock file, then retry.`):i}o?.({lockPath:e,holderPid:n.pid,holderRunnerId:n.runnerId,reason:t})}function gDe(e,n,t,r,o,i,s){if(t===void 0||Ir(t)!==Ir(ir))return;let a=zE(e,n),d=Bv(a);if(d!==void 0){if(_u(d,r,o).state==="live")throw new Hs(a,d);OV(a,r,()=>{let u=FE(a)?UE(a):void 0;if(u===void 0)return;let c=_u(u,r,o);if(c.state==="live")throw new Hs(a,u);c.state==="wedged"&&DV(a,u,c.reason,i,s),yu(a)})}}function yDe(e,n,t,r,o,i,s,a){if(Nv(e,n))return;s?.();let d=Bv(e);if(d===void 0){if(Nv(e,n))return;throw new Error(`another Linzumi runner lock appeared while starting: ${e}`)}if(_u(d,t,r).state==="live")throw new Hs(e,d);a?.(),OV(e,t,()=>{let u=FE(e)?UE(e):void 0;if(u!==void 0){let c=_u(u,t,r);if(c.state==="live")throw new Hs(e,u);c.state==="wedged"&&DV(e,u,c.reason,o,i),yu(e)}if(!Nv(e,n))throw new Error(`another Linzumi runner lock appeared while starting: ${e}`)})}function Nv(e,n){uDe(IV(e),{recursive:!0});try{let t=CV(e,"wx");try{PV(t,`${JSON.stringify(n,null,2)}
1515
1515
  `)}finally{kV(t)}return!0}catch(t){if(Ql(t,"EEXIST"))return!1;throw t}}function OV(e,n,t){let r=`${e}.replace`;for(;;)try{let o=CV(r,"wx");try{PV(o,`${process.pid}
1516
1516
  `),t()}finally{kV(o),yu(r)}return}catch(o){if(Ql(o,"EEXIST")){let i=_De(r);if(i===void 0)continue;if(n(i))throw new Error(["another Linzumi runner is already replacing a stale runner lock",`lock: ${e}`,"Wait for that startup to finish, then retry."].join(`
@@ -1622,10 +1622,10 @@ ${t}`.toLowerCase();return r.includes("not logged in")||r.includes("not authenti
1622
1622
  `),b0(t,n)}catch{try{eg(t,{force:!0})}catch{}return!1}if(e==="ts")try{eg(Y$e(),{force:!0})}catch{}return!0}function nqe(e){try{let n=globalThis.__linzumiCommanderChooserMarkJoined;if(n===void 0)return;let t=n();t!==void 0&&e("commander.chooser.fallback_reported",{...t})}catch{}}function xZ(e,n){let t=e!==null&&typeof e=="object"&&!Array.isArray(e)?e.commander_impl:void 0;if(typeof t!="string")return;let r=t.trim()==="rescript"?"rescript":"ts",o=eqe();if(o===r)return;let i=aQ(r);n("runner.commander_impl_assigned",{impl:r,previousCache:o??null,persisted:i,runningImpl:kM})}function tqe(e){let n=e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,80),t=Iu("sha256").update(e).digest("hex").slice(0,8),r=n===""?"runner":n;return Tt(pp(),`${r}.${t}.json`)}function rqe(e){let n=e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,80),t=Iu("sha256").update(e).digest("hex").slice(0,8),r=n===""?"runner":n;return Tt(pp(),`${r}.${t}.start-turn.json`)}function oqe(e){let n=e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,80),t=Iu("sha256").update(e).digest("hex").slice(0,8),r=n===""?"runner":n;return Tt(pp(),`${r}.${t}.vm-fallback-notice.json`)}function iqe(e,n){let t;try{if(!cp(e))return;t=Ha(e,"utf8")}catch(r){n("vm_fallback_notice_store.read_failed",{path:e,message:r instanceof Error?r.message:String(r)});return}try{let r=JSON.parse(t);if(typeof r=="object"&&r!==null){let o=r.readinessFingerprint;if(typeof o=="string"&&o!=="")return o}}catch{}}function bZ(e,n,t){try{if(n===void 0){eg(e,{force:!0});return}Ru(Ga(e),{recursive:!0});let r=`${e}.tmp`;ng(r,`${JSON.stringify({readinessFingerprint:n})}
1623
1623
  `,"utf8"),b0(r,e)}catch(r){t("vm_fallback_notice_store.write_failed",{path:e,message:r instanceof Error?r.message:String(r)})}}function sqe(e){let n=e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,80),t=Iu("sha256").update(e).digest("hex").slice(0,8),r=n===""?"runner":n;return Tt(pp(),`${r}.${t}.source-seq.json`)}function aqe(e,n){return`${e} ${n}`}function Qh(e){let n=e.issued_at;return typeof n=="string"&&n!==""?n:void 0}function uQ(e){return e.replayed===!0}function dqe(e,n){if(!uQ(e))return;let t=Qh(e);if(t===void 0)return;let r=Date.parse(t);if(Number.isNaN(r))return;let o=n-r;return o>dQ?o:void 0}function uqe(e,n){if(e.type!=="start_instance"||!uQ(e))return!1;let t=ro(e);return t===void 0?!1:n(t)}function cqe(e,n){return e!==void 0&&n<=e}function lqe(e,n,t){e.onAdvance(n,t),e.flush()}function pqe(e,n){return e().then(t=>(n?.(),t))}function fqe(e){return"then"in e&&typeof e.then=="function"}function mqe(e,n,t,r,o){let i;try{i=n()}catch(s){r("kandan.control_handler_threw",{controlType:e,message:s instanceof Error?s.message:String(s)}),t();return}if(i===void 0||!fqe(i)){t();return}i.then(t,s=>{if(o?.(s)==="quarantine"){t();return}r("kandan.control_ack_withheld_on_failure",{controlType:e,message:s instanceof Error?s.message:String(s)})})}function _qe(e,n=Date.now,t=cQ,r){let o=r?.afterMs??yqe,i=r?.forcedReconnectAfterMs??hqe,s=r?.forcedReconnectRetryMs??gqe,a=n(),d=!1,u,c=!1,l=0,p,f=0,g=0;return{recordServerAck:()=>{a=n(),u=void 0,c=!1,l=0,p=void 0,f=0,g=0,d&&(d=!1,e("kandan.connection_recovered",{staleThresholdMs:t}))},check:()=>{let m=n(),_=m-a;!d&&_>t&&(d=!0,u=m,e("kandan.connection_stale",{lastServerAckAgoMs:_,staleThresholdMs:t}));let b=u===void 0?0:m-u;if(d&&r?.onReconnectNeeded!==void 0&&u!==void 0&&b>=i&&(p===void 0||m-p>=s)&&(l+=1,p=m,e("kandan.connection_force_reconnect",{staleForMs:b,lastServerAckAgoMs:_,attempt:l,forcedReconnectAfterMs:i}),r.onReconnectNeeded({staleForMs:b,lastServerAckAgoMs:_,attempt:l})===!1?f+=1:f=0,r.onHardResetNeeded!==void 0&&f>=iM)){if(f=0,g>=vZ)c||(c=!0,e("kandan.connection_hard_reset_exhausted",{staleForMs:b,lastServerAckAgoMs:_,attempt:l,hardResets:g,hardResetFailureLimit:vZ}),r.onUnrecoverable({staleForMs:b,lastServerAckAgoMs:_}));else if(b<o){g+=1;let v=r.onHardResetNeeded({staleForMs:b,lastServerAckAgoMs:_,attempt:l,uninitiatedDispatches:iM,hardResets:g});e("kandan.connection_hard_reset",{staleForMs:b,lastServerAckAgoMs:_,attempt:l,uninitiatedDispatches:iM,hardResets:g,initiated:v!==!1})}}d&&!c&&r!==void 0&&u!==void 0&&b>=o&&(c=!0,e("kandan.connection_unrecoverable",{staleForMs:b,lastServerAckAgoMs:_,escalateAfterMs:o}),r.onUnrecoverable({staleForMs:b,lastServerAckAgoMs:_}))},isStale:()=>d}}function sM(e,n,t){let r=t?.discardSeqsOnFirstEpochAdoption===!0,o=t?.fsyncOnWrite===!0,{cursors:i,epoch:s}=wqe(e,n),a=s,d=!1,u,c=()=>{if(d){d=!1;try{Ru(Ga(e),{recursive:!0});let f=`${e}.tmp`,g=`${JSON.stringify({...a===void 0?{}:{[lQ]:a},...Object.fromEntries(i)})}
1624
1624
  `;if(o){let m=gZ(f,"w");try{ng(m,g,"utf8"),hZ(m)}finally{mZ(m)}b0(f,e);let _=gZ(Ga(e),"r");try{hZ(_)}finally{mZ(_)}}else ng(f,g,"utf8"),b0(f,e)}catch(f){n("control_cursor_store.write_failed",{path:e,message:f instanceof Error?f.message:String(f)})}}},l=()=>{d=!0,u===void 0&&(u=setTimeout(()=>{u=void 0,c()},xqe),u.unref?.())},p=()=>{u!==void 0&&(clearTimeout(u),u=void 0),c()};return{initial:f=>i.get(f),onAdvance:(f,g)=>{let m=i.get(f);m!==void 0&&g<=m||(i.set(f,g),l())},reset:(f,g)=>{i.get(f)!==g&&(i.set(f,g),l())},flush:p,epoch:()=>a,adoptEpoch:f=>{if(a===f)return!1;let g=a!==void 0,m=!g&&r&&i.size>0;return a=f,(g||m)&&(m&&n("control_cursor_store.pre_epoch_seqs_discarded",{path:e,epoch:f,discardedSeqs:i.size}),i.clear()),l(),(g||m)&&p(),g}}}function bqe(e,n,t,r){return{current:()=>e.epoch(),adopt:(o,i)=>{let s=e.epoch(),a=e.adoptEpoch(i),d=n.adoptEpoch(i),u=a||d;return u&&t("kandan.control_epoch_changed",{runnerId:r.runnerId,kandanUrl:r.kandanUrl,topic:o,previousEpoch:s??null,epoch:i,controlCursorCleared:a,startTurnWatermarksCleared:d}),u}}}function vqe(e,n){return typeof e=="object"&&e!==null&&e.code===n}function wqe(e,n){let t=new Map,r;try{r=Ha(e,"utf8")}catch(s){return vqe(s,"ENOENT")||n("control_cursor_store.read_failed",{path:e,message:s instanceof Error?s.message:String(s)}),{cursors:t,epoch:void 0}}let o;try{o=JSON.parse(r)}catch{o=void 0}if(o===null||typeof o!="object"||Array.isArray(o))return n("control_cursor_store.corrupt_ignored",{path:e}),{cursors:t,epoch:void 0};let i;for(let[s,a]of Object.entries(o)){if(s===lQ){typeof a=="string"&&a!==""&&(i=a);continue}typeof a=="number"&&Number.isInteger(a)&&a>=0&&t.set(s,a)}return{cursors:t,epoch:i}}function Sqe(e,n){return e.type==="replace_runner"?!0:!("instanceId"in e)||e.instanceId===void 0||e.instanceId===n}function kqe(e){return"instanceId"in e?e.instanceId:void 0}function Cqe(e,n){let t=new URL(n);if(t.protocol!=="https:"&&t.protocol!=="http:")throw new Error("workspace viewport URL must use http or https");let r=new URL(Gn(e)).origin;if(t.origin!==r)throw new Error("workspace viewport URL must stay on the configured Linzumi origin")}function Tqe(e,n){Cqe(e,n)}function aM(e){return e!==void 0&&e.delegated===!0&&e.threadProcess==="already_started"}function Tu(e){return e.threadProcess?.role==="thread"||e.agentReplay!==void 0?!1:e.spawnThreadRunner!==void 0||e.codexUrl===void 0}function Pqe(e,n){let t=e.threadProcess,r=ro(n);return t?.role!=="thread"?!(Tu(e)&&r!==void 0&&Eqe(n)):r!==void 0?r===t.kandanThreadId:"instanceId"in n&&n.instanceId!==void 0&&n.instanceId!==""||n.type==="replace_runner"}function Iqe(e,n,t){switch(e.threadProcess?.role){case"thread":return!1;default:switch(n.type){case"resolve_claude_user_input_request":case"deny_claude_user_input_request":return t.has(n.requestId);default:return!1}}}function Rqe(e,n,t,r,o){switch(e.threadProcess?.role){case"thread":return!1;default:switch(n.type){case"resolve_codex_user_input_request":case"deny_codex_user_input_request":return[t,...r.values()].filter(i=>i!==void 0).some(i=>i.currentKandanThreadId()===n.threadId||i.currentCodexThreadId()===n.threadId||i.currentCodexThreadId()===n.sessionId)||n.sessionId!==void 0&&o.has(n.sessionId);default:return!1}}}function Eqe(e){switch(e.type){case"forward_http_request":case"forward_tcp_open":case"forward_tcp_send":case"forward_tcp_close":case"resolve_claude_user_input_request":case"deny_claude_user_input_request":case"resolve_codex_user_input_request":case"deny_codex_user_input_request":return!0;default:return!1}}function Aqe(e){let n=e;if(n.kind!=="build_golden_image"&&n.type!=="build_golden_image")return;let t=Cu(n.golden_image_public_id),r=Cu(n.build_claim_token);if(!(t===void 0||r===void 0))return{goldenImagePublicId:t,buildClaimToken:r,projectPublicId:Cu(n.project_public_id),computeKey:Cu(n.compute_key),name:Cu(n.name),sourceThreadId:Cu(n.source_thread_id),cwd:Cu(n.cwd)}}function Cu(e){return typeof e=="string"&&e!==""?e:void 0}function Mqe(e){return e.type==="resolve_codex_user_input_request"?{...e,answers:e.answers.map(({questionId:n,selectedLabels:t})=>({questionId:n,...t===void 0?{}:{selectedLabels:t}}))}:e}function ro(e){switch(e.type){case"start_instance":case"reconnect_thread":case"forward_http_request":case"forward_tcp_open":case"forward_tcp_send":case"forward_tcp_close":case"remote_codex_exec":case"remote_codex_exec_cancel":case"stop_turn":case"steer_turn":case"list_agent_slash_commands":case"resolve_claude_user_input_request":case"deny_claude_user_input_request":case"resolve_codex_user_input_request":case"deny_codex_user_input_request":case"set_thread_collaboration_mode":case"compact_thread":case"review_thread":case"update_thread_interaction_access":{let n=y(e.threadId)?.trim();return n===void 0||n===""?void 0:n}default:return}}async function Dqe(e,n,t,r){let o=ro(r);if(o!==void 0){let s=r.type==="resolve_codex_user_input_request"||r.type==="deny_codex_user_input_request"?r.sessionId===void 0?void 0:await t.get(r.sessionId):void 0,a=n.get(o),d=Array.from(new Set([...a===void 0?[]:[a],...s===void 0?[]:[s],...Array.from(n.values()).filter(c=>c.currentKandanThreadId()===o)])),u=[...e?.currentKandanThreadId()===o?[e]:[],...d.filter(c=>c!==e)].filter(c=>c!==void 0);if(r.type==="update_thread_interaction_access"){let c,l;for(let p of u){let f=await p.handleControl(r);f!==void 0&&(c??=f,f.ok===!0&&(l??=f))}return l??c}for(let c of u){let l=await c.handleControl(r);if(l!==void 0)return l}return}let i=await(e?.handleControl(r)??Promise.resolve(void 0));if(i!==void 0)return i;for(let s of n.values()){let a=await s.handleControl(r);if(a!==void 0)return a}}function Oqe(e){return e.codexUrl===void 0&&e.threadProcessRole!=="thread"&&e.ownsStartedAppServer}async function $qe(e){let n=e.setTimeoutFn??setTimeout,t=Promise.allSettled([e.requiredHealthPublication,...e.pushes]).then(()=>{}),r=new Promise(o=>{n(()=>o(),e.safetyCapMs)?.unref?.()});await Promise.race([t,r]),e.exit()}function wZ(e,n=process.env){let t=n.LINZUMI_APP_SERVER_EXIT_LOOP_STATE_FILE?.trim();return t!==void 0&&t!==""?t:Tt(ig(),".linzumi","app-server-exit-loop",`${Sl(e)}.json`)}function jqe(e,n){return{load:()=>{try{let t=JSON.parse(Ha(e,"utf8"));return typeof t.count=="number"&&Number.isFinite(t.count)&&typeof t.lastExitAt=="string"?{count:t.count,lastExitAt:t.lastExitAt}:void 0}catch{return}},save:t=>{try{Ru(Ga(e),{recursive:!0}),ng(e,`${JSON.stringify(t,null,2)}
1625
- `)}catch(r){n?.(r instanceof Error?r.message:String(r))}}}}function Lqe(e,n=cp){try{if(n(e))return}catch{return}return`the runner's working directory ${e} no longer exists (deleted, or its disk/volume is unmounted); remount the volume or reconnect from an existing folder`}function Fqe(e,n,t=pQ,r=qqe){let o=e.load(),i=o===void 0?Number.NaN:Date.parse(o.lastExitAt),s=n-i,d=o!==void 0&&Number.isFinite(i)&&s>=0&&s<=t?o.count+1:1;return e.save({count:d,lastExitAt:new Date(n).toISOString()}),{count:d,crashLoop:d>=r}}function Nqe(e){let n=new Map,t={failed:!1},r;return{observeNotification:(o,i)=>{if(t.failed)return;let s=zqe(i);if(s===void 0)return;r=Date.now();let a=_0(i);if(y0.has(o)){for(let[d,u]of n)u===s&&(a===void 0||a===d)&&n.delete(d);return}a!==void 0&&n.set(a,s)},failActiveTurns:o=>{if(t.failed)return;t.failed=!0;let i=Array.from(n);if(n.clear(),i.length===0)return;e.onActiveThreadsFailed?.(i.map(([d])=>d));let s=Array.from(e.sessions()),a=typeof o=="function"?o:d=>o;for(let[d,u]of i){let c=a({threadId:d,turnId:u});e.log("codex.active_turn_failed_on_connection_loss",{thread_id:d,turn_id:u,cause:c});for(let l of s)Va(l,"turn/failed",{threadId:d,turnId:u,reason:c,...Hc("infra_turn_kill")},e.log)}},activeTurnCount:()=>n.size,activeTurns:()=>Array.from(n,([o,i])=>({threadId:o,turnId:i})),lastActivityAtMs:()=>r}}function zqe(e){let n=E(e.turn),t=E(e.item),r=E(t?.turn);return y(n?.id)??y(e.turnId)??y(e.turn_id)??y(t?.turnId)??y(t?.turn_id)??y(r?.id)}function _0(e){let n=E(e.thread),t=E(e.turn);return y(e.threadId)??y(e.thread_id)??y(n?.id)??y(t?.threadId)??y(t?.thread_id)}function Va(e,n,t,r,o){if(e===void 0)return!1;try{return e.handleCodexNotification(n,t,o),!0}catch(i){return r("codex.notification_session_dispatch_failed",{method:n,message:i instanceof Error?i.message:String(i)}),!1}}function Uqe(e,n=!0){let t=new Map,r=n,o=0,i=()=>[...t.values()].reduce((c,l)=>c+1+l.parentFrames.length+l.childFrames.length,0),s=(c,l)=>{if(c!=="item/started"&&c!=="item/completed")return;let p=E(l.item),f=_0(l);if(p===void 0||y(p.type)!=="subAgentActivity"||y(p.kind)!=="started"||f===void 0)return;let g=y(p.id),m=y(p.agentThreadId)??y(p.agent_thread_id);return{key:`${f}:${g??m??"missing-item-id"}`,sequence:0,activityPending:!0,method:c,params:l,parentThreadId:f,childThreadId:m,itemId:g,captureAuthority:"pre_disable_accepted",parentFrames:[],childFrames:[]}},a=(c,l)=>{let p=c.filter(f=>f.ownsCodexThreadId(l));switch(p.length){case 0:return;case 1:return p[0];default:{let f=p.filter(g=>g.currentCodexThreadId?.()===l);switch(f.length){case 1:return f[0];case 0:throw new Error(`multiple inherited channel sessions own Codex thread ${l}`);default:throw new Error(`multiple direct channel sessions own Codex thread ${l}`)}}}},d=(c,l)=>{let p=[...t.values()].filter(f=>f.key!==l&&f.activityPending&&f.childThreadId===c);if(p.length>1)throw new Error(`multiple deferred Codex subagent edges claim child ${c}`);return p[0]},u=c=>{let l=[...t.values()].flatMap(f=>[...f.activityPending&&d(f.parentThreadId,f.key)===void 0&&a(c,f.parentThreadId)!==void 0?[{kind:"activity",sequence:f.sequence,activity:f}]:[],...f.parentFrames.flatMap(g=>!f.activityPending&&a(c,f.parentThreadId)!==void 0?[{kind:"parent_frame",sequence:g.sequence,activity:f,frame:g}]:[]),...f.childFrames.flatMap(g=>!f.activityPending&&f.childThreadId!==void 0&&a(c,f.childThreadId)!==void 0?[{kind:"frame",sequence:g.sequence,activity:f,frame:g}]:[])]).sort((f,g)=>f.sequence-g.sequence)[0];if(l===void 0)return;let p=l.kind==="activity"||l.kind==="parent_frame"?a(c,l.activity.parentThreadId):l.activity.childThreadId===void 0?void 0:a(c,l.activity.childThreadId);if(p===void 0)throw new Error(`deferred Codex subagent owner disappeared for ${l.activity.parentThreadId}`);if(l.kind==="activity"){if(!Va(p,l.activity.method,l.activity.params,e,{captureAuthority:l.activity.captureAuthority}))return;if(l.activity.childThreadId!==void 0&&a(c,l.activity.childThreadId)===void 0)throw new Error(`deferred Codex subagent child was not registered: ${l.activity.childThreadId}`);l.activity.parentFrames.length===0&&l.activity.childFrames.length===0?t.delete(l.activity.key):t.set(l.activity.key,{...l.activity,activityPending:!1})}else if(l.kind==="parent_frame"){if(!p.ownsCodexThreadId(l.activity.parentThreadId))throw new Error(`deferred Codex subagent parent owner disappeared for ${l.activity.parentThreadId}`);if(!Va(p,l.frame.method,l.frame.params,e,{captureAuthority:l.activity.captureAuthority}))return;let g=l.activity.parentFrames.filter(({sequence:m})=>m!==l.frame.sequence);!l.activity.activityPending&&g.length===0&&l.activity.childFrames.length===0?t.delete(l.activity.key):t.set(l.activity.key,{...l.activity,parentFrames:g})}else{if(l.activity.childThreadId===void 0||!p.ownsCodexThreadId(l.activity.childThreadId))throw new Error(`deferred Codex subagent child owner disappeared for ${l.activity.childThreadId??l.activity.key}`);if(!Va(p,l.frame.method,l.frame.params,e,{captureAuthority:l.activity.captureAuthority}))return;let g=l.activity.childFrames.filter(({sequence:m})=>m!==l.frame.sequence);!l.activity.activityPending&&l.activity.parentFrames.length===0&&g.length===0?t.delete(l.activity.key):t.set(l.activity.key,{...l.activity,childFrames:g})}u(c)};return{dispatch:(c,l,p)=>{if(!r){u(c);let _=_0(p);if(_!==void 0&&y0.has(l)){let b=[...t.values()].filter(({activityPending:C,childThreadId:T})=>C&&T===_);if(b.length>1)throw new Error(`multiple deferred Codex subagent edges claim child ${_}`);let w=[...t.values()].filter(({activityPending:C,parentThreadId:T})=>C&&T===_).sort((C,T)=>C.sequence-T.sequence)[0],v=b[0],S=w??v;if(S!==void 0){if(i()>=1e3)throw new Error("deferred Codex subagent activity and frames exceeded 1000 entries");let C={sequence:o++,method:l,params:p};t.set(S.key,{...S,...w!==void 0?{parentFrames:[...S.parentFrames,C]}:{childFrames:[...S.childFrames,C]}}),e("codex.subagent_activity_parent_unresolved",{phase:w!==void 0?"post_disable_parent_terminal_deferred":"post_disable_child_terminal_deferred",parent_thread_id:S.parentThreadId,child_thread_id:S.childThreadId??null,item_id:S.itemId??null,method:l}),u(c);return}}for(let b of c)Va(b,l,p,e);return}u(c);let f=s(l,p);if(f===void 0){let _=_0(p),b=_===void 0?[]:[...t.values()].filter(({childThreadId:C,activityPending:T})=>T&&C===_);if(b.length>1)throw new Error(`multiple deferred Codex subagent edges claim child ${_}`);let w=b[0],v=_===void 0?void 0:[...t.values()].filter(({parentThreadId:C,activityPending:T})=>T&&C===_).sort((C,T)=>C.sequence-T.sequence)[0],S=v??w;if(S!==void 0){if(i()>=1e3)throw new Error("deferred Codex subagent activity and frames exceeded 1000 entries");let C={sequence:o++,method:l,params:p};t.set(S.key,{...S,...v!==void 0?{parentFrames:[...S.parentFrames,C]}:{childFrames:[...S.childFrames,C]}}),e("codex.subagent_activity_parent_unresolved",{phase:v!==void 0?"parent_frame_deferred":"child_frame_deferred",parent_thread_id:S.parentThreadId,child_thread_id:S.childThreadId??null,item_id:S.itemId??null,method:l});return}for(let C of c)Va(C,l,p,e);u(c);return}let g=d(f.parentThreadId,f.key);if(g!==void 0){if(i()>=1e3&&!t.has(f.key))throw new Error("deferred Codex subagent activity exceeded 1000 entries");let _=t.get(f.key);t.set(f.key,{...f,sequence:_?.sequence??o++,parentFrames:_?.parentFrames??[],childFrames:_?.childFrames??[]}),e("codex.subagent_activity_parent_unresolved",{phase:"nested_activity_deferred",parent_thread_id:f.parentThreadId,child_thread_id:f.childThreadId??null,item_id:f.itemId??null,blocked_by_parent_thread_id:g.parentThreadId,blocked_by_item_id:g.itemId??null,method:l});return}let m=a(c,f.parentThreadId);if(m===void 0){if(i()>=1e3&&!t.has(f.key))throw new Error("deferred Codex subagent activity exceeded 1000 entries");let _=t.get(f.key);t.set(f.key,{...f,sequence:_?.sequence??o++,parentFrames:_?.parentFrames??[],childFrames:_?.childFrames??[]}),e("codex.subagent_activity_parent_unresolved",{phase:"deferred",parent_thread_id:f.parentThreadId,child_thread_id:f.childThreadId??null,item_id:f.itemId??null,method:l});return}if(!Va(m,l,p,e))throw new Error(`Codex subagent activity owner dispatch failed for ${f.parentThreadId}`);u(c)},reconcile:c=>{u(c)},setEnabled:c=>{if(!c&&r&&t.size>0){let l=[...t.values()],p=new Map(l.map(_=>[_.key,_.childFrames.filter(({method:b})=>y0.has(b))])),f=new Map(l.map(_=>[_.key,_.parentFrames.filter(({method:b})=>y0.has(b))])),g=new Set,m=_=>{if(g.has(_.key))return;g.add(_.key);let b=d(_.parentThreadId,_.key);b!==void 0&&m(b)};for(let _ of l){let b=p.get(_.key)?.length??0,w=f.get(_.key)?.length??0;_.activityPending&&b===0&&w===0&&m(_),b>0&&m(_),w>0&&(d(_.parentThreadId,_.key)!==void 0||_.childFrames.length>0)&&m(_)}for(let _ of l){e("codex.subagent_activity_parent_unresolved",{phase:"feature_disabled",parent_thread_id:_.parentThreadId,child_thread_id:_.childThreadId??null,item_id:_.itemId??null,method:_.method,buffered_frame_count:_.parentFrames.length+_.childFrames.length});let b=p.get(_.key)??[];if(_.parentFrames.length===0&&b.length===0&&!g.has(_.key))t.delete(_.key);else{let w=g.has(_.key)?_.childFrames:b;t.set(_.key,{..._,activityPending:g.has(_.key),childFrames:w})}}}r=c},close:()=>{for(let c of t.values())e("codex.subagent_activity_parent_unresolved",{phase:"runner_close",parent_thread_id:c.parentThreadId,child_thread_id:c.childThreadId??null,item_id:c.itemId??null,method:c.method,buffered_frame_count:c.parentFrames.length+c.childFrames.length});t.clear()}}}async function Bqe(e){return e.closePromise!==void 0||(e.closePromise=(async()=>{let n=[];e.removeHandlers?.(),e.removeHandlers=void 0;for(let t of[...e.actions].reverse())try{await t()}catch(r){n.push(r instanceof Error?r:new Error(String(r)))}if(e.actions.splice(0),n[0]!==void 0)throw n[0]})()),e.closePromise}async function SZ(e){let n=new Map,t=[!1,!0];for(let r of t){let o=await e.request("thread/list",{limit:50,sortKey:"updated_at",sortDirection:"desc",archived:r,useStateDbOnly:!0,sourceKinds:["subAgentThreadSpawn"]});if("error"in o)throw new Error(`thread/list failed: ${o.error.message}`);let s=E(o.result)?.data;if(!Array.isArray(s))throw new Error("thread/list result.data must be an array");if(!s.every(ne))throw new Error("thread/list result.data entries must be objects");for(let a of s){let d=fQ(a),u=Kqe(a,r);n.has(d)||n.set(d,u)}}return Array.from(n.values()).sort(Vqe)}function Qs(e,n,t){let r=n.flatMap(i=>{let s=e[i];if(s==null)return[];if(typeof s!="string")throw new Error(`thread/list ${t} must be a string (${i})`);return[s]}),o=r[0];if(o!==void 0&&r.some(i=>i!==o))throw new Error(`thread/list ${t} aliases disagree`);return o}function uM(e,n,t){if(e!==void 0&&n!==void 0&&e!==n)throw new Error(`thread/list ${t} source and thread values disagree`);return e??n}function Jqe(e){let n=Qs(e,["parentThreadId","parent_thread_id"],"parent thread id"),t=Qs(e,["agentNickname","agent_nickname"],"agent nickname"),r=Qs(e,["agentRole","agent_role"],"agent role"),o={...n===void 0?{}:{parentThreadId:n},...t===void 0?{}:{agentNickname:t},...r===void 0?{}:{agentRole:r}},i=e.source;if(typeof i=="string"){if(i==="subAgentThreadSpawn"&&(n===void 0||n.trim()===""))throw new Error("thread/list subagent spawn requires a parent thread id");return{source:i,...o}}let s=E(i);if(s===void 0)throw new Error("thread/list thread source must be a string or object");let a=Qs(s,["custom"],"custom source");if(a!==void 0)return{source:a,...o};let d=Qs(s,["internal"],"internal source");if(d!==void 0)return{source:d,...o};let u=[s.subAgent,s.subagent].filter(b=>b!==void 0);if(u.length!==1)throw new Error("thread/list structured source requires exactly one subAgent/subagent value");let c=u[0];if(c==="review")return{source:"subAgentReview",...o};if(c==="compact")return{source:"subAgentCompact",...o};if(c==="memory_consolidation")return{source:"subAgentOther",...o};let l=E(c);if(l===void 0)throw new Error("thread/list subagent source has an unknown shape");let p=[E(l.thread_spawn),E(l.threadSpawn)].filter(b=>b!==void 0),f=p[0];if(f===void 0){if(Qs(l,["other"],"subagent other source")!==void 0)return{source:"subAgentOther",...o};throw new Error("thread/list subagent source has an unknown shape")}if(p.length!==1)throw new Error("thread/list subagent source has conflicting spawn variants");let g=uM(Qs(f,["parent_thread_id","parentThreadId"],"subagent parent thread id"),n,"parent thread id");if(g===void 0||g.trim()==="")throw new Error("thread/list subagent spawn requires a parent thread id");let m=uM(Qs(f,["agent_nickname","agentNickname"],"subagent nickname"),t,"agent nickname"),_=uM(Qs(f,["agent_role","agentRole"],"subagent role"),r,"agent role");return{source:"subAgentThreadSpawn",parentThreadId:g,...m===void 0?{}:{agentNickname:m},..._===void 0?{}:{agentRole:_}}}function Kqe(e,n){let t=fQ(e),r=E(e.gitInfo),o=y(e.preview)??"",i=y(e.name)??"",s=y(e.title)??(i===""?o:i),a=y(e.description)??y(e.summary)??o;return{id:t,title:s??"",description:a??"",preview:o.replace(/\s+/g," ").trim(),cwd:y(e.cwd)??"",...Jqe(e),createdAt:kZ(e.createdAt),updatedAt:kZ(e.updatedAt),archived:n,modelProvider:y(e.modelProvider)??"",cliVersion:y(e.cliVersion)??"",gitBranch:y(r?.branch)??"",gitOriginUrl:y(r?.originUrl)??"",path:y(e.path)??""}}function fQ(e){let n=e.id;if(typeof n!="string"||n.trim()==="")throw new Error("thread/list thread id must be a non-empty string");return n}function kZ(e){return typeof e=="number"&&Number.isFinite(e)?new Date(e*1e3).toISOString():y(e)??""}function Vqe(e,n){let t=E(e),r=E(n),o=Date.parse(y(t?.createdAt)??y(t?.updatedAt)??""),i=Date.parse(y(r?.createdAt)??y(r?.updatedAt)??"");return CZ(o)-CZ(i)}function CZ(e){return Number.isFinite(e)?e:Number.MAX_SAFE_INTEGER}function Wqe(e){if("error"in e)throw new Error(`thread/start failed: ${e.error.message}`);return y(E(E(e.result)?.thread)?.id)}function Ro(e){let n=e?.trim();return n===void 0||n===""?void 0:n}function IM(e){let n=Ro(e.projectSharedInstructions),t=Ro(e.projectPersonalInstructions),r=Ro(e.projectMemory);return{projectBound:e.projectId!==void 0||e.projectPublicId!==void 0||n!==void 0||t!==void 0||r!==void 0,projectSharedInstructions:n,projectPersonalInstructions:t,projectMemory:r}}function Hqe(e){return($e(e)??[]).flatMap(t=>{let r=E(t),o=y(r?.runnerId);return o===void 0?[]:[{runnerId:o,version:y(r?.version)??null}]})}function TZ(e){if(e===void 0)return{type:"missing"};let n=E(e);if(n===void 0)return{type:"invalid",reason:"runner_config_not_object"};let t=$e(n.allowedCwds);if(t===void 0)return{type:"invalid",reason:"allowed_cwds_not_array"};let r=[];for(let[s,a]of t.entries()){let d=y(a);if(d===void 0)return{type:"invalid",reason:`allowed_cwd_${s}_not_string`};r.push(d)}let o=n.configVersion,i=o==null?null:Y(o);return i===void 0?{type:"invalid",reason:"config_version_not_integer"}:{type:"ok",config:{allowedCwds:r,configVersion:i}}}function Hh(e){let n=E(e),t=E(n?.runner_config);if(t===void 0||!Object.prototype.hasOwnProperty.call(t,"multiAgentJobsEnabled"))return!1;let r=t.multiAgentJobsEnabled;if(typeof r!="boolean")throw new Error("runner_config.multiAgentJobsEnabled must be a boolean when present");return r}function cM(e){let n=E(e),t=E(n?.runner_config);if(t===void 0||!Object.prototype.hasOwnProperty.call(t,"documentSurfacesEnabled"))return!1;let r=t.documentSurfacesEnabled;if(typeof r!="boolean")throw new Error("runner_config.documentSurfacesEnabled must be a boolean when present");return r}function PZ(e){let n=e.linzumiAgentMcpToken??e.codingJobMcpToken;return n===void 0?!1:Rf(n)}function Gqe(e){let n=E(e);if(E(n?.runner_config)?.rosterEnabled!==!0)return;let r=E(n?.roster),o=r===void 0?void 0:$e(r.threads);if(o===void 0)return;let i=[],s=0;for(let a of o){let d=E(a),u=y(d?.kandan_thread_id);if(u===void 0){s+=1;continue}let c=y(d?.last_activity_at),l=c===void 0?Number.NaN:Date.parse(c),p=d?.channel_id,f=Y(p),g=y(p)??(f===void 0?null:String(f));i.push({kandanThreadId:u,providerSessionKey:y(d?.provider_session_key)??null,channelId:g,title:y(d?.title)??null,channelSlug:y(d?.channel_slug)??null,cwd:y(d?.cwd)??null,lastActivityAtMs:Number.isNaN(l)?null:l})}return{threads:i,truncated:r?.truncated===!0,skippedEntries:s}}function Zqe(e){return e.appliedModel!==void 0||e.appliedApprovalPolicy!==void 0||e.appliedReasoningEffort!==void 0||e.controlSandbox!==void 0}function Qqe(e){if(e.debugTrace===void 0)return;let n=new Date().toISOString();return ML({dir:e.debugTrace.dir,contentMode:e.debugTrace.contentMode,runId:[n,"pid",String(process.pid),"runner",e.runnerId].join("-"),manifest:{pid:process.pid,argv:OL(process.argv),runnerId:e.runnerId,cwd:e.cwd,kandanUrl:e.kandanUrl,workspaceSlug:e.workspaceSlug??null,threadProcess:e.threadProcess??null,fast:e.fast===!0,startedAt:n}})}function RM(e){let n=e.launchTui&&e.consoleReporter===void 0?void 0:(r,o)=>{e.launchTui||aA(r,o),e.consoleReporter?.(r,o)},t=e.logFile??y_();return t8(t),mb("runner_process"),pF(t,n)}function n6e(e,n,t,r){let o=iG({steps:{stopAccepting:()=>{n.stopAccepting()},interruptInFlightTurns:()=>n.interruptInFlightTurns().catch(s=>{t("runner.drain_interrupt_states_failed",{message:s instanceof Error?s.message:String(s)})}),checkpointCurrentTurn:()=>{},flushInboundQueues:()=>{n.flushInboundQueues()},flushOutbox:()=>e().catch(()=>{})},deadlineMs:Xqe,log:(s,a)=>t(s,a),exit:(s,a)=>{let d=Y5(a),u={log:(c,l)=>t(c,l)};Gv({trigger:d},u),XA({signal:a,stop:r?.supervisorStop,finishExit:()=>n8(s,{trigger:d,stdinWasTty:process.stdin.isTTY===!0,stdoutWasTty:process.stdout.isTTY===!0},{sinks:u})})},signals:r?.signals??["SIGTERM","SIGINT","SIGHUP"]}),i=()=>{e().catch(()=>{})};return process.once("exit",i),{uninstall:()=>{o.uninstall(),process.off("exit",i)},triggerFastExitDrain:s=>o.trigger(s)}}async function t6e(e,n,t){try{return e()}catch(r){if(!NE(r))throw r;t("runner.lock_held_by_live_process",{runnerId:n.runnerId,heldByRunnerId:r.heldBy.runnerId,heldByPid:r.heldBy.pid,lockPath:r.lockPath});let o=n.lockTakeover,i=RZ(r.lockPath,o?.takeover,t),s=_u(r.heldBy,i.isPidAlive,()=>new Date(i.now()));if(MV(r.heldBy,Xt,n.launchSource,s)){t("runner.lock_auto_takeover_for_update",{runnerId:n.runnerId,heldByRunnerId:r.heldBy.runnerId,heldByPid:r.heldBy.pid,lockPath:r.lockPath,fromVersion:r.heldBy.cliVersion,toVersion:Xt,launchSource:Uv,holderState:s.state});let c=o?.prompt??IZ(o);return await HE({holder:r.heldBy,lockPath:r.lockPath,baseMessage:r.message,takeOverWithoutPrompt:!0,prompt:c,takeover:i}),e()}if(!XV(o))throw r;let a=o.prompt??IZ(o),d=RZ(r.lockPath,o.takeover,t);if((await HE({holder:r.heldBy,lockPath:r.lockPath,baseMessage:r.message,takeOverWithoutPrompt:o.takeOverWithoutPrompt===!0,prompt:a,takeover:d})).outcome==="declined")throw new Dh;return t("runner.lock_takeover_interactive",{runnerId:n.runnerId,heldByRunnerId:r.heldBy.runnerId,heldByPid:r.heldBy.pid,lockPath:r.lockPath}),e()}}function IZ(e){return{isInteractive:()=>e?.forceNonInteractive!==!0&&Mh()&&process.stdin.isTTY===!0&&process.stderr.isTTY===!0,writeReport:n=>{process.stderr.write(`${n}
1626
- `)},promptYesNo:n=>r6e(n)}}function r6e(e){return new Promise(n=>{let t=M$e({input:process.stdin,output:process.stderr});t.question(e,r=>{t.close(),n(/^y(es)?$/i.test(r.trim()))})})}function RZ(e,n,t){return{isPidAlive:n?.isPidAlive??o6e,signalPid:n?.signalPid??((r,o)=>{process.kill(r,o)}),lockReleased:n?.lockReleased??(()=>!cp(e)),currentLockOwner:n?.currentLockOwner??(()=>gu(e)),sleep:n?.sleep??GV,now:n?.now??(()=>Date.now()),log:n?.log??((r,o)=>{t(r,o),ye(r,o)})}}function o6e(e){try{return process.kill(e,0),!0}catch(n){return(n!==null&&typeof n=="object"&&"code"in n?n.code:void 0)!=="ESRCH"}}function i6e(e,n,t,r,o,i){let s=d6e(n,r,o,i);ye("process.spawn",{command:e,args:s,cwd:t,purpose:"codex.tui"});let a=C0(e,s,{cwd:t,env:process.env,stdio:"inherit"});return ye("process.spawned",{command:e,args:s,cwd:t,pid:a.pid,purpose:"codex.tui"}),a.once("exit",(d,u)=>{ye("process.exit",{command:e,args:s,cwd:t,pid:a.pid,code:d,signal:u,purpose:"codex.tui"})}),a}async function s6e(e){await Promise.all(Array.from(e,n=>n.handleKandanReconnect()))}function a6e(e,n){if(!Array.isArray(e))return;let t=e.find(r=>ne(r)&&typeof r.name=="string"&&r.name.toLowerCase()===n.toLowerCase()&&typeof r.value=="string");return ne(t)&&typeof t.value=="string"?t.value:void 0}function d6e(e,n,t,r){let o=c6e(t,r);return n===void 0?["--remote",e,...o]:["resume","--remote",e,...o,n]}function u6e(e,n){let t=new Set(n);return e!==void 0&&t.add(e),Array.from(t).sort((r,o)=>r-o)}function CM(e){let n=new URL(e);if(n.port==="")return;let t=Number.parseInt(n.port,10);if(!Number.isInteger(t)||t<=0||t>65535)throw new Error(`invalid Kandan URL port: ${e}`);return t}function c6e(e,n){let t=e?.model===void 0?[]:["--model",e.model],r=e?.reasoningEffort===void 0?[]:["-c",`model_reasoning_effort="${e.reasoningEffort}"`],o=n===!0?["-c",'service_tier="fast"']:[];return[...t,...r,...o]}async function l6e(e,n){let t=await e.request("thread/resume",{threadId:n});if(!("error"in t))return;if(!t.error.message.includes("no rollout found"))throw new Error(`failed to prepare Codex TUI resume: ${t.error.message}`);let r=await e.request("thread/inject_items",{threadId:n,items:[{type:"agentMessage",text:""}]});if("error"in r)throw new Error(`failed to prepare Codex TUI resume: ${r.error.message}`);let o=await e.request("thread/resume",{threadId:n});if("error"in o)throw new Error(`failed to verify Codex TUI resume: ${o.error.message}`)}async function p6e(e,n,t,r){if(t.workspace===void 0||t.channel===void 0||t.threadId===void 0)return[];try{let o=await e.push(n,"session:thread_context",{workspace:t.workspace,channel:t.channel,thread_id:t.threadId});if(ne(o)&&o.status==="ok"&&ne(o.response))return ux(o.response.messages);r("kandan.reconnect_thread_context_fetch_failed",{thread_id:t.threadId,reply:JSON.stringify(o).slice(0,300)})}catch(o){r("kandan.reconnect_thread_context_fetch_failed",{thread_id:t.threadId,message:o instanceof Error?o.message:String(o)})}return[]}async function m6e(e,n,t,r){if(!(t.workspace===void 0||t.channel===void 0||t.threadId===void 0))try{let o=[],i,s,a,d=0;for(let u=0;u<f6e;u+=1){let c=await e.push(n,"session:thread_transcript",{workspace:t.workspace,channel:t.channel,thread_id:t.threadId,...a===void 0?{}:{cursor:a}});if(!ne(c)||c.status!=="ok"||!ne(c.response))return r("kandan.reconnect_thread_transcript_fetch_failed",{thread_id:t.threadId,page:u,reply:JSON.stringify(c).slice(0,300)}),u===0?void 0:{nodes:o,budget:i,threadTitle:s};let l=xK(c.response);if(l===void 0)return u===0?void 0:{nodes:o,budget:i,threadTitle:s};i=i??l.budget,s=s??l.threadTitle,o=[...l.nodes,...o],d+=l.nodes.reduce((g,m)=>m.kind==="reasoning"?g:g+m.body.length,0);let p=i?.maxEmissionTokens,f=p!==void 0&&d/4>=p;if(!l.hasMore||l.cursor===void 0||f)break;a=l.cursor}return{nodes:o,budget:i,threadTitle:s}}catch(o){r("kandan.reconnect_thread_transcript_fetch_failed",{thread_id:t.threadId,message:o instanceof Error?o.message:String(o)})}}async function EZ(e,n,t,r,o,i){i("kandan.reconnect_thread_unarchive_started",{codex_thread_id:n,discovered_by:r,message:o});try{let s=await Si("thread/unarchive",e.request("thread/unarchive",{threadId:n}));if("error"in s)throw new Error(`thread/unarchive failed: ${s.error.message}`);let a=await Si("thread/resume",e.request("thread/resume",t));if("error"in a)throw new Error(`thread/resume after unarchive failed: ${a.error.message}`);return i("kandan.reconnect_thread_unarchive_resumed",{codex_thread_id:n,discovered_by:r}),{mode:"resumed"}}catch(s){let a=s instanceof Error?s.message:String(s);throw i("kandan.reconnect_thread_unarchive_failed",{codex_thread_id:n,discovered_by:r,archive_error:o,message:a}),new Error(r==="forced_inject_not_found"?`thread/inject_items failed: ${o}; archive recovery failed: ${a}`:a)}}async function y6e(e,n,t,r){let o={threadId:n,...t},i;if(r.forceRehydrate===!0)i="the server marked the durable engine session dead after an acknowledged-but-unexecuted turn";else{let a=await Si("thread/resume",e.request("thread/resume",o));if(!("error"in a))return{mode:"resumed"};if(h6e(a.error.message))return await EZ(e,n,o,"resume_archived",a.error.message,r.log);i=a.error.message}r.log(r.forceRehydrate===!0?"kandan.reconnect_thread_rehydrate_forced":"kandan.reconnect_thread_resume_failed",{codex_thread_id:n,message:i,forced:r.forceRehydrate===!0,rehydrating:!0});let s;try{let a;try{a=await r.buildRehydrationItems?.(i)}catch(c){r.log("kandan.reconnect_thread_rehydration_items_failed",{codex_thread_id:n,message:c instanceof Error?c.message:String(c)}),a=void 0}let d=a!==void 0&&a.length>0?[...a]:[{type:"agentMessage",text:await r.buildRehydrationText(i)}],u=await Si("thread/inject_items",e.request("thread/inject_items",{threadId:n,items:d}));if("error"in u){if(r.forceRehydrate===!0&&g6e(u.error.message))return await EZ(e,n,o,"forced_inject_not_found",u.error.message,r.log);s=`thread/inject_items failed: ${u.error.message}`}else{let c=await Si("thread/resume",e.request("thread/resume",o));"error"in c&&(s=`rehydrated thread/resume failed: ${c.error.message}`)}}catch(a){s=a instanceof Error?a.message:String(a)}if(s!==void 0)throw r.log("kandan.reconnect_thread_rehydration_failed",{codex_thread_id:n,resume_failure:i,rehydration_failure:s}),new Error(`could not resume this thread's engine session (${i}) and rebuilding a fresh session from the thread transcript also failed (${s})`);return r.log("kandan.reconnect_thread_rehydrated",{codex_thread_id:n,resume_failure:i}),{mode:"rehydrated",resumeFailure:i}}async function _6e(e,n,t,r,o){let i="agent_provider_unavailable:codex";if(o("kandan.start_instance_codex_app_server_unavailable",{controlType:r.type,thread_id:ro(r)??null,instanceId:t}),r.type==="start_instance"||r.type==="reconnect_thread")try{await oo(e,n,r,"failed",i,{instanceId:t,failureClass:"engine_unavailable"})}catch(s){o("kandan.start_instance_unavailable_state_push_failed",{agent_provider:"codex",message:s instanceof Error?s.message:String(s)})}throw new Error(i)}async function lM(e,n,t,r,o,i,s,a,d,u,c,l,p,f,g,m,_,b,w,v,S,C,T,P,O,R,j,B){if(e===void 0)switch(m.type){case"remote_codex_exec":case"remote_codex_exec_cancel":return await pM(m,r,a.value,d,u,_);case"list_agent_slash_commands":case"resolve_claude_user_input_request":case"deny_claude_user_input_request":case"resolve_codex_user_input_request":case"deny_codex_user_input_request":break;case"compact_thread":case"review_thread":if(m.agentProvider!=="claude-code")return{instanceId:r,controlType:m.type,requestId:m.requestId.trim()||null,ok:!1,error:"agent_provider_unavailable:codex"};break;case"clone_repository":break;case"set_workspace_viewport":break;case"start_instance":case"reconnect_thread":{let D=ap(m);if(D.type==="ok"&&D.provider==="claude-code"||v!==void 0)break;return await _6e(n,t,r,m,_)}default:return{instanceId:r,controlType:m.type,requestId:"requestId"in m?y(m.requestId)??null:null,ok:!1,error:"agent_provider_unavailable:codex"}}let K=()=>{if(e===void 0)throw new Error("shared codex app-server connection is unavailable");return e};switch(m.type){case"set_workspace_viewport":return Tqe(o.kandanUrl,m.url),{instanceId:r,controlType:m.type,ok:!0,url:m.url};case"compact_thread":{let D=m.requestId.trim(),J=y(m.providerSessionKey)?.trim()??"",W=m.agentProvider??"codex";if(D==="")return{instanceId:r,controlType:m.type,requestId:null,ok:!1,error:"request_id_required"};if(W!=="codex")return{instanceId:r,controlType:m.type,requestId:D,ok:!1,error:`agent_compaction_unsupported:${W}`};if(J==="")return{instanceId:r,controlType:m.type,requestId:D,ok:!1,error:"provider_session_key_required"};let H=await K().request("thread/compact/start",{threadId:J});return"error"in H?{instanceId:r,controlType:m.type,requestId:D,ok:!1,error:`codex_compaction_failed:${H.error.message}`}:{instanceId:r,controlType:m.type,requestId:D,ok:!0,threadId:m.threadId,providerSessionKey:J}}case"start_instance":{let D=no(m.cwd,a.value),J=ap(m),W="starting_codex_session",H;switch(J.type){case"ok":break;case"unsupported":return{instanceId:r,controlType:m.type,ok:!1,error:`agent_provider_unsupported:${J.value}`}}let X=J.provider;if(!D.ok){_("kandan.start_instance_cwd_rejected",{thread_id:ro(m)??null,reason:D.reason,allowedCwdCount:a.value.length});try{await JZ(n,t,m,D.reason,a.value,{instanceId:r})}catch(we){_("kandan.start_instance_cwd_failed_state_push_failed",{reason:D.reason,message:we instanceof Error?we.message:String(we)})}return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:D.reason,allowedCwds:a.value}}let be=await s(X),Re=g0({agentProvider:X,modelProvider:y(m.modelProvider),model:y(m.model),modelTransportCatalogStatus:SM(m,_),llmProxyBinding:wM(m.llmProxy),hasNativeCodexAuth:be.hasNativeCodexAuth},Ma,be.agentProviders);if(Re.type==="blocked"){_("linzumi.start_instance_model_account_preflight_rejected",{agent_provider:X,model_provider:y(m.modelProvider)??null,model:y(m.model)??"default",reason:Re.code,discriminator:Re.reason});try{await oo(n,t,m,"failed",Re.message,{instanceId:r,failureClass:"provider_binding_rejected",modelAccountRejection:{identity:Re.identity,reason:Re.reason}})}catch(we){_("linzumi.start_instance_model_account_state_push_failed",{message:we instanceof Error?we.message:String(we)})}return{instanceId:r,controlType:m.type,ok:!1,error:Re.code}}let ie=Wa(m,"processing",`starting ${R6e(X)} session`,{instanceId:r});ie!==void 0&&n.push(t,"message_state",ie).catch(we=>{_("kandan.start_instance_processing_state_push_failed",{message:we instanceof Error?we.message:String(we)})});try{let we=await v?.(m,D.cwd);if(we!==void 0)return we;if(X==="codex"){let Oe=OZ(o,m);if(Oe!==void 0){try{await oo(n,t,m,"failed",Oe,{instanceId:r,failureClass:"provider_binding_rejected"})}catch(bn){_("kandan.start_instance_wafer_state_push_failed",{message:bn instanceof Error?bn.message:String(bn)})}return{instanceId:r,controlType:m.type,ok:!1,error:Oe}}}return X==="claude-code"?(W="starting_claude_code_session",(await jZ({kandan:n,topic:t,control:m,options:o,log:_,debugTrace:b,instanceId:r,cwd:D.cwd,matchedRoot:D.matchedRoot,activeClaudeCodeSessions:c,pendingClaudeCodeApprovals:l,pendingClaudeCodeUserQuestions:p,ensureClaudeCodeForwardPortSession:f,disposeClaudeCodeForwardPortSession:g,resumeSessionId:Ro(m.resumeSessionId),leaseEpochFor:C,onLiveSourceSeqAccepted:T,onUndeliveredFollowUpsAtClose:O,claudeThreadAccessStore:B,setStartupStage:bn=>{W=bn}})).controlResponse):(await yQ({codex:K(),kandan:n,topic:t,control:m,options:o,instanceId:r,cwd:D.cwd,matchedRoot:D.matchedRoot,onStartedThread:w,startAgentReplayCodex:S,setStartupStage:Oe=>{W=Oe},setStartedCodexThreadId:Oe=>{H=Oe}})).controlResponse}catch(we){let qe=AZ(W,we);_("kandan.start_instance_failed",{stage:W,message:we instanceof Error?we.message:String(we),thread_id:fn(m,"threadId")??null,source_seq:Y(m.sourceSeq)??Y(m.rootSeq)??null,codex_thread_id:H??null});try{X==="claude-code"?await BZ({kandan:n,topic:t,control:m,failureReason:qe,rawFailureText:we instanceof Error?we.message:String(we),failureClass:fM(W),codexThreadId:H,instanceId:r,log:_}):await oo(n,t,m,"failed",qe,{codexThreadId:H,instanceId:r,failureClass:fM(W)})}catch{}throw we}}case"reconnect_thread":{let D=no(m.cwd,a.value),J=ap(m),W=y(m.transportCeilingRecoveryRequestId),H="starting_codex_session";if(!D.ok){try{await JZ(n,t,m,D.reason,a.value,{instanceId:r})}catch(un){_("kandan.reconnect_thread_cwd_failed_state_push_failed",{reason:D.reason,message:un instanceof Error?un.message:String(un)})}return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:D.reason,allowedCwds:a.value}}switch(J.type){case"ok":break;case"unsupported":return{instanceId:r,controlType:m.type,ok:!1,error:`agent_provider_unsupported:${J.value}`}}let X=J.provider,be=await s(X),Re=g0({agentProvider:X,modelProvider:y(m.modelProvider),model:y(m.model),modelTransportCatalogStatus:SM(m,_),llmProxyBinding:wM(m.llmProxy),hasNativeCodexAuth:be.hasNativeCodexAuth},Ma,be.agentProviders);if(Re.type==="blocked"){_("linzumi.reconnect_thread_model_account_preflight_rejected",{agent_provider:X,model_provider:y(m.modelProvider)??null,model:y(m.model)??"default",reason:Re.code,discriminator:Re.reason});try{await oo(n,t,m,"failed",Re.message,{instanceId:r,failureClass:"provider_binding_rejected",modelAccountRejection:{identity:Re.identity,reason:Re.reason}})}catch(un){_("linzumi.reconnect_thread_model_account_state_push_failed",{message:un instanceof Error?un.message:String(un)})}return{instanceId:r,controlType:m.type,ok:!1,error:Re.code}}let ie=Ro(m.codexThreadId);if(ie===void 0)return{instanceId:r,controlType:m.type,ok:!1,error:"missing_codex_thread_id"};let we=Ro(m.workDescription),qe=await v?.(m,D.cwd);if(qe!==void 0)return qe;if(X==="codex"){let un=OZ(o,m);if(un!==void 0)return{instanceId:r,controlType:m.type,ok:!1,error:un}}if(X==="claude-code"){let un=c.get(ie);if(un!==void 0&&we!==void 0){let je=Y(m.rootSeq),Xe=Y(m.sourceSeq)??je,_e=ae=>{let pe=ae.disposition==="parked"?Wa(m,"queued",rl(ae.queuePosition),{instanceId:r,codexThreadId:ie}):Wa(m,"processing","queued Claude Code input",{instanceId:r,codexThreadId:ie});pe!==void 0&&n.push(t,"message_state",pe).catch(Te=>{_("kandan.reconnect_thread_queue_state_push_failed",{message:Te instanceof Error?Te.message:String(Te)})})},q=vi($e(m.attachments)??[]),F=await DC({cwd:D.cwd,kandanUrl:o.kandanUrl,token:o.token,fetch:o.fetch,attachmentDirectoryName:"local-claude-code-attachments"},{seq:Xe,body:we,attachments:q}).then(ae=>({ok:!0,content:ae})).catch(ae=>({ok:!1,error:ae}));if(!F.ok){let ae=F.error instanceof Error?F.error.message:String(F.error),pe=`Claude Code input attachment download failed: ${ae}`;try{await oo(n,t,m,"failed",pe,{instanceId:r,codexThreadId:ie,failureClass:"attachment_download_failed"})}catch(Te){_("kandan.reconnect_thread_queue_failed_state_push_failed",{message:Te instanceof Error?Te.message:String(Te)})}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_attachment_download_failed",message:ae}}let z=fn(m,"threadId"),V=fn(m,"channel");if(Xe!==void 0&&z!==void 0&&V!==void 0&&P?.(V,z,{seq:Xe,type:"thread.message",actorKind:void 0,actorSlug:void 0,actorUserId:void 0,threadId:z,threadTitle:void 0,replyToSeq:Y(m.rootSeq),localRunnerEventType:void 0,body:we,attachments:q,traceparent:y(m.traceparent)}),V!==void 0&&z!==void 0&&R?.({channel:V,threadId:z,sourceSeq:Xe,transportCeilingRecoveryRequestId:W})===!0)return _("claude_code.message_duplicate_ignored",{linzumi_thread_id:z,claude_session_id:ie,body_preview:Pu(we),source_seq:Xe??null}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,queuedInput:!0,duplicate:!0};await dm({cwd:D.cwd,threadKey:un.threadId,turnRef:Xe===void 0?`followup-${Date.now()}`:`seq-${Xe}`,log:(ae,pe)=>_(ae,pe)});try{let ae=un.enqueueInput({content:F.content,sourceSeq:Xe});if(ae==="duplicate")return _("claude_code.message_duplicate_ignored",{linzumi_thread_id:fn(m,"threadId")??null,claude_session_id:ie,body_preview:Pu(we),source_seq:Xe??null}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,queuedInput:!0,duplicate:!0};_e(ae),_("claude_code.message_queued",{linzumi_thread_id:fn(m,"threadId")??null,claude_session_id:ie,body_preview:Pu(we),message_received_at_ms:Date.now(),source_seq:Xe??null}),b?.record("commander","claude.input_queued",{linzumiThreadId:fn(m,"threadId")??null,claudeSessionId:ie,sourceSeq:Xe??null,bodyPreview:Pu(we)})}catch(ae){let pe=ae instanceof Error?ae.message:String(ae),Te=`Claude Code input queue closed: ${pe}`;try{await oo(n,t,m,"failed",Te,{instanceId:r,codexThreadId:ie,failureClass:"claude_input_queue_closed"})}catch(Z){_("kandan.reconnect_thread_queue_closed_state_push_failed",{message:Z instanceof Error?Z.message:String(Z)})}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_session_closed",message:pe}}if(Xe!==void 0){let ae=Xe,pe=un,Te="Claude Code session did not respond after resume - send your message again to start fresh",Z=j;Db({windowMs:Z?.windowMs??uh(process.env),isDelivered:()=>pe.inputDelivered(ae),isSessionClosed:()=>Pi(c,[ie],[pe.threadId])===void 0,lastSdkActivityMs:()=>pe.lastSdkActivityMs(),hasPendingBlockingRequest:()=>tg({threadId:pe.threadId,pendingApprovals:l,pendingQuestions:p}),log:_,onWedged:de=>{let ue=Z?.recordWedge(pe.threadId,ae)??Number.MAX_SAFE_INTEGER;_("claude_code.dispatch_liveness_wedged",{linzumi_thread_id:pe.threadId,claude_session_id:ie,source_seq:ae,waited_ms:de.waitedMs,cause:de.cause,attempt:Z===void 0?null:ue,dispatch:"queued_input"});let en=()=>{Z?.clear(pe.threadId,ae),oo(n,t,m,"failed",Te,{instanceId:r,codexThreadId:ie,failureClass:"claude_dispatch_wedged"}).catch(Ye=>{_("claude_code.dispatch_wedged_state_push_failed",{linzumi_thread_id:pe.threadId,source_seq:ae,message:Ye instanceof Error?Ye.message:String(Ye)})})};if(Z!==void 0&&ue===1){oo(n,t,m,"processing","restarting Claude Code session to recover this message",{instanceId:r,codexThreadId:ie}).catch(()=>{}),Z.killAndRespawn({threadId:pe.threadId,claudeSessionId:ie,reason:`claude_dispatch_liveness: no SDK output within ${de.waitedMs}ms of queued input (seq ${ae})`}).then(Ye=>{Ye==="no_replay_path"&&en()}).catch(Ye=>{_("claude_code.dispatch_supervisor_respawn_failed",{linzumi_thread_id:pe.threadId,source_seq:ae,message:Ye instanceof Error?Ye.message:String(Ye)}),en()});return}en()}})}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,queuedInput:!0}}if(un!==void 0)return{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_active_session_requires_work_description"};{let je=fn(m,"threadId"),Xe=fn(m,"channel"),_e=Y(m.sourceSeq)??Y(m.rootSeq);if(we!==void 0&&je!==void 0&&Xe!==void 0&&_e!==void 0&&R?.({channel:Xe,threadId:je,sourceSeq:_e,transportCeilingRecoveryRequestId:W})===!0)return _("claude_code.replayed_turn_already_applied_ignored",{linzumi_thread_id:je,claude_session_id:ie,body_preview:Pu(we),source_seq:_e,replayed:m.replayed===!0}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,queuedInput:!0,duplicate:!0}}try{let je=Wa(m,"processing","resuming Claude Code session",{instanceId:r,codexThreadId:ie});return je!==void 0&&n.push(t,"message_state",je).catch(_e=>{_("kandan.reconnect_thread_processing_state_push_failed",{message:_e instanceof Error?_e.message:String(_e)})}),H="starting_claude_code_session",(await jZ({kandan:n,topic:t,control:m,options:o,log:_,debugTrace:b,instanceId:r,cwd:D.cwd,matchedRoot:D.matchedRoot,resumeSessionId:ie,activeClaudeCodeSessions:c,pendingClaudeCodeApprovals:l,pendingClaudeCodeUserQuestions:p,ensureClaudeCodeForwardPortSession:f,disposeClaudeCodeForwardPortSession:g,leaseEpochFor:C,onLiveSourceSeqAccepted:T,onUndeliveredFollowUpsAtClose:O,claudeThreadAccessStore:B,setStartupStage:_e=>{H=_e}})).controlResponse}catch(je){let Xe=AZ(H,je);_("kandan.reconnect_thread_failed",{stage:H,message:je instanceof Error?je.message:String(je),thread_id:fn(m,"threadId")??null,source_seq:Y(m.sourceSeq)??Y(m.rootSeq)??null,agent_provider:X,provider_session_key:ie});try{await BZ({kandan:n,topic:t,control:m,failureReason:Xe,rawFailureText:je instanceof Error?je.message:String(je),failureClass:fM(H),codexThreadId:ie,instanceId:r,log:_})}catch{}throw je}}o.codexUrl===void 0&&zb(D.cwd,{configHome:Oa()});let Oe=mp(o,m),bn=w===void 0?void 0:await Si("thread/attach",w(m,D.cwd,ie));if(we!==void 0){let un=Y(m.rootSeq),je=Y(m.sourceSeq)??un;if(bn===void 0||je===void 0)throw new Error("cannot reconnect a Kandan thread without a session");let Xe=fn(m,"channel"),_e=fn(m,"threadId");if(Xe!==void 0&&_e!==void 0&&R?.({channel:Xe,threadId:_e,sourceSeq:je,transportCeilingRecoveryRequestId:W})===!0)return _("kandan.reconnect_thread_seq_already_applied",{linzumi_thread_id:_e,codex_thread_id:ie,source_seq:je}),{instanceId:r,controlType:m.type,cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,duplicate:!0};let q=fn(m,"workspace"),F=await y6e(K(),ie,qf({cwd:D.cwd,fast:Oe.fast,channelSession:{model:Oe.model,reasoningEffort:Oe.reasoningEffort,approvalPolicy:Oe.approvalPolicy,sandbox:Oe.sandbox,sandboxedApprovalNeverDefault:Oe.sandboxedApprovalNeverDefault}}),{forceRehydrate:m.sessionRehydrate===!0,log:_,buildRehydrationItems:async ae=>{let pe=await m6e(n,t,{workspace:q,channel:Xe,threadId:_e},_);if(pe===void 0||pe.nodes.length===0)return;let Te=bK({nodes:pe.nodes,budget:pe.budget,resumeFailure:ae,threadTitle:pe.threadTitle,linzumiContext:wa(m.linzumiContext)});return _("kandan.reconnect_thread_rehydration_ir_emitted",{linzumi_thread_id:_e,codex_thread_id:ie,emitted_nodes:Te.emittedNodeCount,omitted_nodes:Te.omittedNodeCount,redacted_reasoning:Te.redactedReasoningCount,emitted_token_estimate:Te.emittedTokenEstimate,max_emission_tokens:Te.maxEmissionTokens}),Te.items},buildRehydrationText:async ae=>T4({messages:await p6e(n,t,{workspace:q,channel:Xe,threadId:_e},_),resumeFailure:ae,linzumiContext:wa(m.linzumiContext)})});if(F.mode==="rehydrated"){ye("runner.thread_resume_rehydrated",{purpose:"linzumi.thread_runner",threadId:_e??null,codexThreadId:ie,sourceSeq:je,resumeFailure:F.resumeFailure});try{await oo(n,t,m,"processing","rebuilt the coding session from durable thread history after an unresumable engine session",{codexThreadId:ie,instanceId:r})}catch(ae){_("kandan.reconnect_thread_rehydrated_state_push_failed",{message:ae instanceof Error?ae.message:String(ae)})}}let z=Uo(o.token),V=vi($e(m.attachments)??[]);await bn.startThreadMessageTurn({seq:je,body:we,actorSlug:z.actorUsername,actorUserId:z.actorUserId,attachments:V,boundStartTimeout:!0,transportCeilingRecoveryRequestId:W})}return{instanceId:r,controlType:m.type,cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie}}case"list_claude_code_sessions":{let D=no(m.cwd,a.value);if(!D.ok)return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:D.reason};if(!i.includes("claude-code"))return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:"agent_provider_unavailable:claude-code"};let J;try{J=await c9({cwd:D.cwd,limit:Y(m.limit),messagesPerSession:Y(m.messagesPerSession),provider:o.claudeCodeSessionHistoryProvider})}catch(W){return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:W instanceof Error?`claude_code_session_history_failed:${W.message}`:"claude_code_session_history_failed"}}return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!0,cwd:D.cwd,matchedRoot:D.matchedRoot,sessions:J}}case"list_agent_slash_commands":{let D=no(m.cwd,a.value);if(!D.ok)return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:D.reason};let J=y(m.agentProvider)??"claude-code";if(J!=="claude-code")return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:`agent_provider_unsupported:${J}`};if(!i.includes("claude-code"))return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:"agent_provider_unavailable:claude-code"};let W=y(m.providerSessionKey),H=W===void 0?void 0:c.get(W);if(H===void 0)return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:"no_active_claude_session"};try{return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!0,cwd:D.cwd,matchedRoot:D.matchedRoot,provider:"claude-code",providerSessionKey:W,commands:await H.slashCommands()}}catch(X){return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:X instanceof Error?`agent_slash_commands_failed:${X.message}`:"agent_slash_commands_failed"}}}case"browse_directory":return $Le(m,o);case"create_project":return FLe(m,o,a);case"clone_repository":return await JLe(m,o,a);case"suggest_tasks":return VLe(m,o,a.value,{kandan:n,topic:t});case"remote_codex_exec":return await pM(m,r,a.value,d,u,_);case"remote_codex_exec_cancel":return await pM(m,r,a.value,d,u,_);case"start_turn":{let D=await s("codex"),J=g0({agentProvider:"codex",modelProvider:void 0,model:void 0,llmProxyBinding:"absent",hasNativeCodexAuth:D.hasNativeCodexAuth},Ma,D.agentProviders);if(J.type==="blocked"){_("linzumi.start_turn_model_account_preflight_rejected",{thread_id:m.threadId,agent_provider:J.identity[0],model_provider:J.identity[1]??null,model:J.identity[2],reason:J.code,discriminator:J.reason});try{await n.push(t,"codex_error",{instanceId:r,message:J.message})}catch(H){throw _("linzumi.start_turn_model_account_error_push_failed",{thread_id:m.threadId,message:H instanceof Error?H.message:String(H)}),H}return{instanceId:r,controlType:m.type,ok:!1,error:J.code}}let W=await K().request("turn/start",{threadId:m.threadId,input:m.input});return{instanceId:r,controlType:m.type,response:W}}case"steer_turn":{let D=Pi(c,[m.providerSessionKey,m.threadId],[m.threadId]);if(D!==void 0){let X=z6e(m.input);if(X===void 0)return{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_steer_requires_text_input"};let be;try{be=D.steerTurn(X)}catch(Oe){let bn=Oe instanceof Error?Oe.message:String(Oe);return _("claude_code.steer_failed",{thread_id:m.threadId,message:bn}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_steer_failed",message:bn,threadId:m.threadId}}if(!await P6e(be.applied))return _("claude_code.steer_not_applied",{thread_id:m.threadId,steered:be.steered}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_steer_not_applied",message:"The turn finished before the steering message could be applied. Linzumi will retry it as its own message automatically; if nothing happens shortly, send it as a new message.",threadId:m.threadId};let ie=Y(m.sourceSeq),we=y(m.workspace),qe=y(m.channel);return ie!==void 0&&we!==void 0&&qe!==void 0&&n.push(t,"message_state",{workspace:we,channel:qe,thread_id:m.threadId,instance_id:r,seq:ie,status:"processed",reason:xm,agent_provider:"claude-code"}).catch(Oe=>{_("claude_code.steer_terminal_state_push_failed",{thread_id:m.threadId,seq:ie,message:Oe instanceof Error?Oe.message:String(Oe)})}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",steered:be.steered,threadId:m.threadId}}let J=m.providerSessionKey??m.threadId,W=y(m.turnId);if(W===void 0)return{instanceId:r,controlType:m.type,agentProvider:"codex",threadId:m.threadId,ok:!1,error:"codex_steer_target_turn_unknown",message:"No live session tracks this thread, so the running turn cannot be steered from here. Linzumi will run the message as its own turn instead."};let H=await K().request("turn/steer",{threadId:J,expectedTurnId:W,input:um(m.input)});return{instanceId:r,controlType:m.type,response:H}}case"interrupt_turn":{let D=Pi(c,[m.threadId]);if(D!==void 0){let W=await D.interruptTurn("Interrupted by Linzumi");return{instanceId:r,controlType:m.type,agentProvider:"claude-code",interrupted:W,threadId:m.threadId}}let J=await K().request("turn/interrupt",{threadId:m.threadId,turnId:m.turnId??null});return{instanceId:r,controlType:m.type,response:J}}case"rewind_thread":return c.get(m.threadId)!==void 0||m.agentProvider==="claude-code"?{instanceId:r,controlType:m.type,agentProvider:"claude-code",requestId:y(m.requestId)??null,threadId:m.threadId,ok:!1,error:"claude_code_rewind_unsupported",message:"Claude Code does not support rewind yet"}:{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,threadId:m.threadId,ok:!1,error:"rewind_not_supported",message:"This runner does not support rewinding threads yet"};case"interrupt_queued_messages":{let D=y(m.agentProvider)?.trim();if(D!=="claude-code"){let H=await K().request("turn/interrupt",{threadId:m.threadId,turnId:null});return{instanceId:r,controlType:m.type,response:H}}let J=Pi(c,[m.threadId]);if(J===void 0)return{instanceId:r,controlType:m.type,agentProvider:D,ok:!1,error:"claude_code_session_not_active"};await J.interruptTurn("Claude Code interrupted by Linzumi"),J.abortController.abort(new Error("Claude Code interrupted by Linzumi"));let W=Y(m.throughSeq)??J.currentSourceSeq();if(W!==void 0)try{await Io(n,t,{workspace:J.workspace,channel:J.channel,threadId:J.threadId,sourceSeq:W,status:"failed",reason:"Claude Code interrupted by Linzumi",sessionId:m.threadId})}catch(H){_("kandan.claude_code_interrupt_state_push_failed",{message:H instanceof Error?H.message:String(H),thread_id:J.threadId,source_seq:W,claude_session_id:m.threadId})}return{instanceId:r,controlType:m.type,agentProvider:D,interrupted:!0,threadId:m.threadId}}case"stop_turn":{let D=Pi(c,[m.threadId,m.providerSessionKey],[m.threadId]);if(D!==void 0){let W=await k6e({activeSession:D,sessionKey:m.providerSessionKey??m.threadId,publishMessageState:H=>Io(n,t,H),log:_});return _("claude_code.turn_stopped",{thread_id:D.threadId,claude_session_id:m.providerSessionKey??m.threadId,discarded_queued_source_seqs:W}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:m.threadId,ok:!0,stopped:!0,confirmedHalt:!0}}let J=y(m.agentProvider)?.trim();if(J!=="claude-code")try{let W=await K().request("turn/interrupt",{threadId:m.providerSessionKey??m.threadId,turnId:m.turnId??null});return{instanceId:r,controlType:m.type,agentProvider:"codex",threadId:m.threadId,ok:!0,stopped:!0,confirmedHalt:!0,response:W}}catch(W){_("codex.stop_turn_no_session_interrupt_failed",{thread_id:m.threadId,message:W instanceof Error?W.message:String(W)})}return{instanceId:r,controlType:m.type,agentProvider:J??null,threadId:m.threadId,ok:!1,error:"stop_turn_session_not_active"}}case"resolve_codex_approval_request":{let D=l.get(m.requestId);if(D===void 0){if(m.agentProvider==="claude-code")return{instanceId:r,controlType:m.type,skipped:!0};let be=await K().request("resolve_codex_approval_request",{...m});return{instanceId:r,controlType:m.type,response:be}}if(m.agentProvider!==void 0&&m.agentProvider!=="claude-code")return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_approval_provider_mismatch"};if(D.sessionId!==void 0&&m.threadId!==D.sessionId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_approval_session_mismatch"};let J=D.decisions.get(m.decision);if(J===void 0)return _("runner.claude_code_approval_unknown_decision",{instanceId:r,requestId:m.requestId,decision:m.decision,threadId:D.threadId,claudeSessionId:D.sessionId}),{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_approval_unknown_decision",decision:m.decision};let W=Pi(c,[D.sessionId],[D.threadId]);if(W===void 0)return _("runner.claude_code_approval_session_not_active",{instanceId:r,requestId:m.requestId,threadId:D.threadId,claudeSessionId:D.sessionId}),{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_approval_session_not_active"};let H=J.type==="allow"?"processing":"failed";return await mQ({pending:D,decision:J,incomingStatus:H,publishMessageState:()=>Io(n,t,{workspace:D.workspace,channel:D.channel,threadId:D.threadId,sourceSeq:D.sourceSeq,status:H,reason:J.type==="allow"?"Claude Code tool approved":"Claude Code tool denied by Linzumi",sessionId:D.sessionId}),captureMessageStateAttemptGeneration:W.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:W.adoptMessageStateConsensusForAttempt,stopSession:be=>{W.interruptTurnBeforeAbort(be),W.abortController.abort(new Error(be))},log:_,reason:"human_decision"})==="stopped"?{instanceId:r,controlType:m.type,agentProvider:"claude-code",requestId:m.requestId,decision:m.decision,resolved:!1,error:"claude_code_approval_terminal_consensus"}:($Z({threadId:D.threadId,decision:J,log:_}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",requestId:m.requestId,decision:m.decision,resolved:!0})}case"resolve_codex_user_input_request":case"deny_codex_user_input_request":return{instanceId:r,controlType:m.type,agentProvider:"codex",threadId:m.threadId,requestId:m.requestId,ok:!1,error:"codex_user_input_request_not_found"};case"resolve_claude_user_input_request":{let D=p.get(m.requestId);if(D===void 0)return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:m.threadId,requestId:m.requestId,ok:!1,error:"claude_code_user_input_continuation_not_found"};if(m.agentProvider!==void 0&&m.agentProvider!=="claude-code")return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_provider_mismatch"};if(m.threadId!==D.threadId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_thread_mismatch"};if(D.sessionId!==void 0&&m.sessionId!==void 0&&m.sessionId!==D.sessionId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_session_mismatch"};let J=m.answers.map(H=>({questionId:H.questionId,selectedLabels:H.selectedLabels??[],freeText:y(H.freeText)})),W=$6e({pending:D,answers:J,actorUserId:m.actorUserId,actorSlug:m.actorSlug,answeredAt:new Date().toISOString()});switch(W.type){case"error":{_("runner.claude_code_user_input_resolution_failed",{instanceId:r,requestId:m.requestId,error:W.error,selectedLabels:[...W.selectedLabels],threadId:D.threadId,claudeSessionId:D.sessionId,kind:D.kind}),D.resolve({type:"deny",message:W.error});try{await dp(n,t,{workspace:D.workspace,channel:D.channel,threadId:D.threadId,sourceSeq:D.sourceSeq,sessionId:D.sessionId,leaseEpoch:D.leaseEpoch,request:D.request,answerState:{kind:"Denied",reason:W.error,answers:J.map(H=>({questionId:H.questionId,selectedLabels:[...H.selectedLabels],freeText:H.freeText})),actorUserId:m.actorUserId,actorSlug:m.actorSlug,answeredAt:new Date().toISOString()},streamState:"completed"})}catch(H){throw _("kandan.claude_code_user_question_completed_publish_failed",{requestId:m.requestId,message:H instanceof Error?H.message:String(H)}),H}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:D.threadId,requestId:m.requestId,ok:!1,error:W.error,selectedLabels:[...W.selectedLabels],requestKind:D.kind,denied:!0}}case"resolved":D.resolve(W.decision),D.kind==="tool_approval"&&$Z({threadId:D.threadId,decision:W.decision,log:_});break}{let H=Pi(c,[D.sessionId,y(m.sessionId)],[D.threadId]);if(H!==void 0){let X=D.threadId,be=D.sourceSeq,Re=D.sessionId;Db({windowMs:j?.windowMs??uh(process.env),isDelivered:()=>D.resolved(),isSessionClosed:()=>Pi(c,[Re],[X])===void 0,lastSdkActivityMs:()=>H.lastSdkActivityMs(),hasPendingBlockingRequest:()=>tg({threadId:X,pendingApprovals:l,pendingQuestions:p}),log:_,onWedged:ie=>{let we="Claude Code did not continue after your answer - the runner restarted the session; send your message again to continue";_("claude_code.dispatch_liveness_wedged",{linzumi_thread_id:X,claude_session_id:Re??null,source_seq:be,waited_ms:ie.waitedMs,cause:ie.cause,dispatch:W.dispatch}),H.abortController.abort(new Error(we)),(async()=>{let qe=H.sessionWork();qe!==void 0&&await Promise.race([qe.catch(()=>{}),new Promise(Oe=>{setTimeout(Oe,1e4).unref?.()})]),await Io(n,t,{workspace:D.workspace,channel:D.channel,threadId:X,sourceSeq:be,status:"failed",reason:we,sessionId:Re,failureClass:"claude_dispatch_wedged"})})().catch(qe=>{_("claude_code.dispatch_wedged_state_push_failed",{linzumi_thread_id:X,source_seq:be,message:qe instanceof Error?qe.message:String(qe)})})}})}}try{await dp(n,t,{workspace:D.workspace,channel:D.channel,threadId:D.threadId,sourceSeq:D.sourceSeq,sessionId:D.sessionId,leaseEpoch:D.leaseEpoch,request:D.request,answerState:W.answerState,streamState:"completed"})}catch(H){throw _("kandan.claude_code_user_question_completed_publish_failed",{requestId:m.requestId,message:H instanceof Error?H.message:String(H)}),H}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:D.threadId,requestId:m.requestId,answers:J.map(H=>({questionId:H.questionId,selectedLabels:[...H.selectedLabels],...y(H.freeText)===void 0?{}:{freeText:y(H.freeText)}})),actorUserId:m.actorUserId,actorSlug:m.actorSlug,requestKind:D.kind,resolved:!0}}case"deny_claude_user_input_request":{let D=p.get(m.requestId);if(D===void 0)return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:m.threadId,requestId:m.requestId,ok:!1,error:"claude_code_user_input_continuation_not_found"};if(m.agentProvider!==void 0&&m.agentProvider!=="claude-code")return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_provider_mismatch"};if(m.threadId!==D.threadId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_thread_mismatch"};if(D.sessionId!==void 0&&m.sessionId!==void 0&&m.sessionId!==D.sessionId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_session_mismatch"};D.resolve({type:"deny",message:m.reason??"Denied by Linzumi"});try{await dp(n,t,{workspace:D.workspace,channel:D.channel,threadId:D.threadId,sourceSeq:D.sourceSeq,sessionId:D.sessionId,leaseEpoch:D.leaseEpoch,request:D.request,answerState:{kind:"Denied",reason:m.reason??"Denied by Linzumi",actorUserId:m.actorUserId,actorSlug:m.actorSlug,answeredAt:new Date().toISOString()},streamState:"completed"})}catch(J){throw _("kandan.claude_code_user_question_completed_publish_failed",{requestId:m.requestId,message:J instanceof Error?J.message:String(J)}),J}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:D.threadId,requestId:m.requestId,reason:m.reason??"Denied by Linzumi",actorUserId:m.actorUserId,actorSlug:m.actorSlug,denied:!0}}case"read_thread":{let D=await K().request("thread/read",{threadId:m.threadId,includeTurns:m.includeTurns??!0});return{instanceId:r,controlType:m.type,response:D}}case"update_session_settings":{let D=y(m.threadId),J=Pi(c,[D],[D]),W=y(m.approvalPolicy)??void 0,H=y(m.sandbox)??void 0;if(J===void 0)return{instanceId:r,controlType:m.type,skipped:!0};let X=await J.updateSettings({model:y(m.model)??void 0,approvalPolicy:W,reasoningEffort:y(m.reasoningEffort)??void 0}),be=y(X.model),Re=y(X.approval_policy),ie=y(X.reasoning_effort),we=y(m.sandbox);if(Zqe({appliedModel:be,appliedApprovalPolicy:Re,appliedReasoningEffort:ie,controlSandbox:we})){let qe={workspace:J.workspace,channel:J.channel,thread_id:J.threadId,codex_thread_id:m.threadId,updated_at:new Date().toISOString(),...be!==void 0?{model:be}:{},...Re!==void 0?{approvalPolicy:Re}:{},...ie!==void 0?{reasoningEffort:ie}:{},...we!==void 0?{sandbox:we}:{}},Oe=await n.push(t,"session:settings",qe);if(!(ne(Oe)&&Oe.status==="ok"))throw new Error(`kandan push failed: session:settings: ${JSON.stringify(Oe).slice(0,500)}`)}return Re!==void 0&&B?.record(J.threadId,{approvalPolicy:Re,sandbox:H}),X.approval_policy==="never"&&await xQ({kandan:n,topic:t,pendingClaudeCodeApprovals:l,pendingClaudeCodeUserQuestions:p,sessionThreadId:J.threadId,actorUserId:m.actorUserId,actorSlug:m.actorSlug,captureMessageStateAttemptGeneration:J.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:J.adoptMessageStateConsensusForAttempt,stopSession:qe=>{J.interruptTurnBeforeAbort(qe),J.abortController.abort(new Error(qe))},log:_,reason:"full_access_enabled"}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:m.threadId,applied:X}}case"stop_instance":case"kill_instance":{let D="threadId"in m&&typeof m.threadId=="string"?m.threadId:void 0,J=D===void 0?void 0:c.get(D);return J!==void 0?(await J.interruptTurn("Claude Code stopped by Linzumi"),J.abortController.abort(new Error("Claude Code stopped by Linzumi")),{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:D,stopped:!0}):{instanceId:r,controlType:m.type,skipped:!0}}case"set_thread_collaboration_mode":return{instanceId:r,controlType:m.type,requestId:m.requestId,threadId:m.threadId,collaborationMode:m.collaborationMode,ok:!1,error:"thread_not_loaded"};case"review_thread":return{instanceId:r,controlType:m.type,requestId:m.requestId,threadId:m.threadId,ok:!1,error:"thread_not_loaded"};case"steer_child_thread":return _("steer_child_thread.missing_channel_session",{threadId:m.threadId,providerChildThreadId:m.providerChildThreadId,providerSessionKey:m.providerSessionKey}),{instanceId:r,controlType:m.type,ok:!1,error:"child_channel_session_not_loaded"};case"resolve_port_forward_request":case"update_thread_interaction_access":case"set_port_forward_enabled":case"forward_http_request":case"forward_tcp_open":case"forward_tcp_send":case"forward_tcp_close":case"start_local_editor":case"update_runner_config":case"multi_agent_jobs_state":case"document_surfaces_state":case"fleet_breaker_state":case"route_outage_state":case"stream_idle_timeout_default":case"set_commander_impl":case"replace_runner":return{instanceId:r,controlType:m.type,skipped:!0}}}async function pM(e,n,t,r,o,i){switch(e.type){case"remote_codex_exec":{let s=y(e.requestId)?.trim(),a=new AbortController;s!==void 0&&s!==""&&o.set(s,a);let d=await TK(e,{instanceId:n,allowedCwds:t,sandboxRunner:r,abortSignal:a.signal});return s!==void 0&&s!==""&&o.delete(s),i("remote_codex_exec.handled",{requestId:y(e.requestId)??null,ok:d.ok===!0,error:typeof d.error=="string"?d.error:null}),d}case"remote_codex_exec_cancel":{let s=y(e.requestId)?.trim();if(s===void 0||s==="")return{instanceId:n,controlType:e.type,ok:!1,error:"request_id_required"};let a=o.get(s);return a!==void 0&&(a.abort(new Error("remote_codex_exec_cancelled")),o.delete(s)),{instanceId:n,controlType:e.type,requestId:s,ok:!0,cancelled:a!==void 0}}}}function AZ(e,n){let t=b6e(n instanceof Error?n.message:String(n));switch(e){case"checking_project_trust":return`Codex could not start because this folder is not trusted locally. Trust the folder with linzumi paths add, or restart the runner from a trusted folder. Detail: ${t}`;case"starting_claude_code_session":return`Claude Code did not create a session. Restart the local runner and try again. Detail: ${t}`;case"claude_code_session_failed":return`Claude Code created a session, but the session failed before completing. Try starting the agent again; if it repeats, share this failed message with the runner owner. Detail: ${t}`;case"posting_claude_code_output":return`Claude Code created a session, but Linzumi could not post its response to this thread. Try starting the agent again; if it repeats, reconnect the local runner. Detail: ${t}`;case"starting_codex_session":return`Codex did not create a session. Restart the local runner and try again. Detail: ${t}`;case"binding_kandan_thread":return`Codex started, but Linzumi could not attach it to this thread. Try starting the agent again; if it repeats, share this failed message with the runner owner. Detail: ${t}`;case"starting_first_turn":return`Codex started, but the first prompt could not be delivered. Try sending the message again; if it repeats, reconnect the local runner. Detail: ${t}`}}function fM(e){return e==="checking_project_trust"?"project_untrusted":"start_stage_transient"}function fp(e,n){let t=e.trim();if(t.length<=n)return t;let r=" ... ";if(n<r.length+2)return t.slice(t.length-Math.max(1,n));let o=Math.max(1,Math.floor((n-r.length)/3)),i=Math.max(1,n-r.length-o);return`${t.slice(0,o)}${r}${t.slice(t.length-i)}`}function mM(e,n,t){let r=e==="startup"?`Claude Code startup readiness failed: ${n}`:`Claude Code readiness changed to ${n}`,o=t?.trim();return fp(o===void 0||o===""?r:`${r} (${o})`,480)}function x6e(e=Fr){e({severity:"info",key:"runner.execution_health_failed:claude-code",message:"Claude Code login restored - Claude Code coding jobs are available again."})}function b6e(e){return fp(e,240)}function v6e(){let e={value:{status:"starting",reason:"execution_leg_readiness_not_proven"}},n=(o,i=[])=>i.length===0?{status:"ready",adapters:o}:{status:"ready",adapters:o,failures:i},t=o=>{switch(o.status){case"starting":return[];case"ready":return o.failures??[];case"failed":return o.failures??[{adapter:o.adapter,reason:o.reason}]}};return{snapshot:()=>e.value,canClaimWork:o=>{switch(e.value.status){case"starting":case"failed":return!1;case"ready":return o===void 0||e.value.adapters.includes(o)}},markReady:o=>{switch(e.value.status){case"starting":e.value=n([o]);break;case"ready":{let i=t(e.value).find(s=>s.adapter===o);if(i!==void 0)throw new Error(`runner execution leg failed before readiness: ${i.reason}`);e.value.adapters.includes(o)||(e.value=n([...e.value.adapters,o],t(e.value)));break}case"failed":{let i=t(e.value),s=i.find(a=>a.adapter===o);if(s!==void 0)throw new Error(`runner execution leg failed before readiness: ${s.reason}`);e.value=n([o],i);break}}},markReadyAfterRecovery:o=>{switch(e.value.status){case"starting":e.value=n([o]);break;case"ready":{let i=e.value.adapters.includes(o)?e.value.adapters:[...e.value.adapters,o];e.value=n(i,t(e.value).filter(s=>s.adapter!==o));break}case"failed":{e.value=n([o],t(e.value).filter(i=>i.adapter!==o));break}}},markFailed:(o,i)=>{let s=o.trim();if(s==="")throw new Error("runner execution-leg failure requires a reason");let a={adapter:i,reason:s};switch(e.value.status){case"starting":e.value={status:"failed",adapter:i,reason:s};break;case"ready":{let d=e.value.adapters.filter(c=>c!==i),u=[...t(e.value).filter(c=>c.adapter!==i),a];e.value=d.length===0?{status:"failed",adapter:i,reason:s,...u.length===1?{}:{failures:u}}:n(d,u);break}case"failed":{let d=t(e.value);d.some(u=>u.adapter===i)||(e.value={...e.value,failures:[...d,a]});break}}},markNotReady:(o,i)=>{let s=o.trim();if(s==="")throw new Error("runner execution-leg demotion requires a reason");switch(e.value.status){case"starting":case"failed":break;case"ready":{let a=e.value.adapters.filter(u=>u!==i),d=[...t(e.value).filter(u=>u.adapter!==i),{adapter:i,reason:s}];e.value=a.length===0?{status:"failed",adapter:i,reason:s,...d.length===1?{}:{failures:d}}:n(a,d);break}}},refusalReason:o=>{switch(e.value.status){case"starting":return`runner_execution_leg_unhealthy: ${e.value.reason}`;case"failed":return`runner_execution_leg_unhealthy: ${(o===void 0?void 0:t(e.value).find(s=>s.adapter===o))?.reason??e.value.reason}`;case"ready":{if(o!==void 0&&!e.value.adapters.includes(o))return`runner_execution_leg_unhealthy: ${t(e.value).find(s=>s.adapter===o)?.reason??`${o}_readiness_not_proven`}`;throw new Error("runner execution leg is ready and has no refusal reason")}}},capabilityFields:()=>({executionHealth:e.value})}}async function w6e(e){if(MZ(e.health),e.activateDispatch(),await e.publishReadyHealth(),MZ(e.health),!e.signalGenerationReady())throw new Error("runner generation-ready signal was not delivered");return{type:"ready",delivered:!0}}function MZ(e){let n=e.snapshot();switch(n.status){case"ready":break;case"starting":throw new Error(`runner execution leg is starting: ${n.reason}`);case"failed":throw new Error(`runner execution leg is failed: ${n.reason}`)}}function S6e(e){let n=e.interruptActiveTurn(e.reason),t=e.interruptSessionControls;if(t!==void 0)try{t().catch(r=>{e.log("claude_code.session_control_interrupt_failed",{thread_id:e.threadId,message:r instanceof Error?r.message:String(r)})})}catch(r){e.log("claude_code.session_control_interrupt_failed",{thread_id:e.threadId,message:r instanceof Error?r.message:String(r)})}return n}async function k6e(e){let{activeSession:n}=e;n.interruptTurnBeforeAbort("stopped by user");let t=n.discardQueuedFollowUpsForStop();n.abortController.abort(new Error("stopped by user"));let r=n.currentSourceSeq(),o=[...new Set([r,...t].filter(s=>s!==void 0))],i=new Set(t);for(let s of o)try{await e.publishMessageState({workspace:n.workspace,channel:n.channel,threadId:n.threadId,sourceSeq:s,status:"interrupted",reason:"stopped by user",sessionId:e.sessionKey}),i.has(s)&&n.markFollowUpSeqDiscarded(s)}catch(a){e.log("kandan.claude_code_stop_state_push_failed",{message:a instanceof Error?a.message:String(a),thread_id:n.threadId,source_seq:s})}return t}function Pi(e,n,t=[]){let r=n.filter(i=>i!==void 0&&i!=="");for(let i of r){let s=e.get(i);if(s!==void 0)return s}let o=t.filter(i=>i!==void 0&&i!=="");if(o.length>0){for(let i of e.values())if(o.includes(i.threadId))return i}}function C6e(e,n){return Pi(e,[n],[n])===void 0?"codex":"claude-code"}async function P6e(e){let n;try{return await Promise.race([e,new Promise(t=>{n=setTimeout(()=>t(!0),T6e),n.unref?.()})])}finally{n!==void 0&&clearTimeout(n)}}async function mQ(e){let n=e.pending.sourceSeq;if(n===void 0)return e.log("claude_code.approval_consensus_source_seq_missing",{thread_id:e.pending.threadId,claude_session_id:e.pending.sessionId??null,reason:e.reason}),e.stopSession("Claude Code approval has no source sequence"),"stopped";let t=e.captureMessageStateAttemptGeneration(),r;try{r=await e.publishMessageState()}catch(i){e.log("claude_code.approval_consensus_push_unconfirmed",{thread_id:e.pending.threadId,source_seq:n,claude_session_id:e.pending.sessionId??null,reason:e.reason,message:i instanceof Error?i.message:String(i)}),r={kind:"unconfirmed"}}return e.adoptMessageStateConsensusForAttempt(n,e.incomingStatus,r,t)==="stop"?(e.log("claude_code.approval_terminal_consensus",{thread_id:e.pending.threadId,source_seq:n??null,claude_session_id:e.pending.sessionId??null,disposition:r.kind,reason:e.reason}),e.stopSession("Claude Code turn already terminated by the server"),"stopped"):(e.pending.resolve(e.decision),"resolved")}function DZ(e,n){switch(e.agentReplay?.provider){case"codex":return["codex"];case"claude-code":return["claude-code"];case"auto":case void 0:break}switch(e.claudeCodeRunner!==void 0||(n===void 0?e.claudeCodeAvailable===!0:n==="logged_in")){case!0:return["codex","claude-code"];case!1:return["codex"]}}function I6e(e){if(e.agentReplay?.provider==="codex"||e.codexUrl!==void 0||Xs(e))return!0;switch(e.dependencyStatus?.codex.available){case!1:return!1;case!0:case void 0:return!0}}function ap(e){let n=y(e.agentProvider)?.trim();switch(n){case void 0:case"":case"codex":return{type:"ok",provider:"codex"};case"claude-code":return{type:"ok",provider:"claude-code"};default:return{type:"unsupported",value:n}}}function R6e(e){switch(e){case"codex":return"Codex";case"claude-code":return"Claude Code"}}function v0(e){let n=y(e.modelProvider)?.trim(),t=E(e.llmProxy),r=y(t?.baseUrl)?.trim(),o=y(t?.token)?.trim(),i=r!==void 0&&r!==""&&o!==void 0&&o!==""?{baseUrl:r,token:o}:void 0;return n===void 0||n===""?i===void 0?{type:"none"}:{type:"provider",runtime:{provider:"openai-proxy",llmProxyBaseUrl:i.baseUrl,llmProxyToken:i.token}}:n!=="wafer"?{type:"error",error:`model_provider_unsupported:${n}`}:i===void 0?{type:"error",error:"wafer_model_provider_missing_llm_proxy"}:{type:"provider",runtime:{provider:"wafer",llmProxyBaseUrl:i.baseUrl,llmProxyToken:i.token}}}function hQ(e){if(e.type==="error")return e.error;if(e.type==="provider"&&e.runtime.provider==="openai-proxy"&&Bs()===void 0)return"codex_llm_proxy_requires_openai_api_key"}function OZ(e,n){let t=v0(n);switch(t.type){case"none":return;case"error":return t.error;case"provider":{let r=hQ(t);return r!==void 0?r:e.codexModelProvider?.provider===t.runtime.provider?void 0:t.runtime.provider==="wafer"?"wafer_model_provider_requires_thread_worker":"llm_proxy_model_provider_requires_thread_worker"}}}function E6e(e){if(e.linzumiAgentMcpToken===void 0||e.linzumiAgentMcpToken===""||GR(e.env))return;let n=A6e(e.env,e.kandanUrl);if(n===void 0||n==="")return hM("cloud agent turn requires a server URL (kandanUrl) and none was configured; refusing to run the @linzumi agent turn on the host");if(M6e(n))return hM(`cloud agent turn requires a PUBLICLY reachable server URL for the guest VM, got loopback ${n}; set LINZUMI_CLOUD_AGENT_PUBLIC_URL to the server's public base URL (e.g. https://serve.linzumi.com)`);if(!lu(e.env))return hM("smolcloud is the required execution path for @linzumi agent turns but no smolcloud API key resolved (SMOLCLOUD_API_KEY / cloud.apiKeyFile / SMOL_CLOUD_TOKEN); refusing to run the agent on the render host (set LINZUMI_VM_CLOUD_AGENT=0 only to explicitly opt back into host execution)");let t;try{t=Ks()}catch{throw new Error("workspace-agent cloud vm.json is present but invalid; refusing to arm the cloud agent turn on a corrupt config")}let r=YJ({env:e.env,config:t});if(r===void 0)throw new Error("workspace-agent cloud execution is enabled but no smolcloud API key resolved");let o=t?.agent,i={...o?.image===void 0?{}:{image:o.image},...o?.allowCidrs===void 0?{}:{allowCidrs:o.allowCidrs},...o?.autoStopSeconds===void 0?{}:{autoStopSeconds:o.autoStopSeconds}},s=e.modelProviderRuntime===void 0?void 0:(()=>{let a=P0(e.modelProviderRuntime);return{id:a.id,name:a.name,baseUrl:a.baseUrl,envKey:a.envKey,wireApi:a.wireApi,...a.httpHeaders===void 0?{}:{httpHeaders:a.httpHeaders},...a.envHttpHeaders===void 0?{}:{envHttpHeaders:a.envHttpHeaders}}})();return XJ({connection:r,workspaceSlug:e.workspaceSlug,kandanUrl:n,linzumiAgentMcpToken:e.linzumiAgentMcpToken,ownerUsername:e.ownerUsername,modelProvider:s,llmProxyToken:e.modelProviderRuntime?.llmProxyToken,agentSpec:i,prewarm:!0})}function hM(e){return()=>Promise.reject(new At(e))}function A6e(e,n){let t=e.LINZUMI_CLOUD_AGENT_PUBLIC_URL?.trim();return t!==void 0&&t!==""?t:n}function M6e(e){try{let n=new URL(e).hostname.toLowerCase();return n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="0.0.0.0"}catch{return!1}}function P0(e){let n=`${e.llmProxyBaseUrl.replace(/\/+$/,"")}/v1`;switch(e.provider){case"wafer":return{id:"linzumi",name:"Linzumi Proxy",baseUrl:n,envKey:"LINZUMI_LLM_PROXY_TOKEN",wireApi:"responses"};case"openai-proxy":return{id:"linzumi",name:"Linzumi Proxy",baseUrl:n,envKey:"OPENAI_API_KEY",wireApi:"responses",envHttpHeaders:{"x-linzumi-llm-proxy-token":"LINZUMI_LLM_PROXY_TOKEN"}}}}function gQ(e){switch(e.provider){case"wafer":return{LINZUMI_LLM_PROXY_TOKEN:e.llmProxyToken};case"openai-proxy":{let n=Bs();if(n===void 0)throw new Error("codex llm proxy requires API-key auth (OPENAI_API_KEY in the environment or $CODEX_HOME/auth.json); ChatGPT OAuth credentials cannot be forwarded");return{LINZUMI_LLM_PROXY_TOKEN:e.llmProxyToken,OPENAI_API_KEY:n}}}}async function yQ(e){e.options.codexUrl===void 0&&(e.setStartupStage("checking_project_trust"),zb(e.cwd,{configHome:Oa()})),e.setStartupStage("starting_codex_session");let n=Ro(e.control.developerPrompt),t=wa(e.control.linzumiContext),r=mp(e.options,e.control),o=await Si("thread/start",e.codex.request("thread/start",{cwd:e.cwd,serviceName:"kandan-local-runner",personality:"pragmatic",developerInstructions:zf({cwd:e.cwd,planTool:"linzumi-mcp",mcpAvailable:!Xs(e.options)||OM(e.options),devServicesAvailable:!Xs(e.options),developerPrompt:n,...IM(e.control),linzumiContext:t,...Bc(r.sandbox)&&r.sandbox!==void 0?{sandboxNetworkPosture:{sandbox:r.sandbox,approvalCapable:Jc(r.approvalPolicy)}}:{}}),...eje(r)})),i=Wqe(o);e.setStartedCodexThreadId(i);let s=Ro(e.control.workDescription);i!==void 0&&n!==void 0&&await G6e(e.kandan,e.topic,e.control,n,i);let a;if(i!==void 0&&e.onStartedThread!==void 0&&(e.setStartupStage("binding_kandan_thread"),a=await Si("thread/attach",e.onStartedThread(e.control,e.cwd,i))),i!==void 0&&s!==void 0){e.setStartupStage("starting_first_turn");let d=Y(e.control.rootSeq),u=Y(e.control.sourceSeq)??d,c=vi($e(e.control.attachments)??[]);if(a===void 0||u===void 0)throw new vb({codexThreadId:i,kandanThreadId:fn(e.control,"threadId"),hasThreadSession:a!==void 0,sourceSeq:u});let l=Uo(e.options.token);e.startAgentReplayCodex?.(),await a.startThreadMessageTurn({seq:u,body:s,actorSlug:l.actorUsername,actorUserId:l.actorUserId,attachments:c,boundStartTimeout:!0})}return{controlResponse:{instanceId:e.instanceId,controlType:e.control.type,cwd:e.cwd,matchedRoot:e.matchedRoot,response:o},providerSession:{provider:"codex",cwd:e.cwd,matchedRoot:e.matchedRoot,sessionId:i}}}function D6e(e){let n=e.LINZUMI_CLAUDE_TURN_STALL_MS?.trim();if(n===void 0||n==="")return 6e5;let t=Number.parseInt(n,10);return Number.isFinite(t)&&t>0?t:6e5}function O6e(e){let n=e.onInputDelivered,t=e.isLiveSteerAllowed,r=e.onInputWait,o=e.onSourceSeqDelivered,i=[gM(e.content)],s=[e.sourceSeq],a=[],d=new Set,u=[],c=new Map,l=v=>new Promise(S=>{c.set(v,S)}),p=(v,S)=>{let C=c.get(v);C!==void 0&&(c.delete(v),C(S))},f={closed:!1},g=()=>{for(;f.closed;){let v=u.shift();if(v===void 0)return;v({done:!0,value:void 0})}},m=(v,S,C)=>{s.push(S),n?.(),S!==void 0&&o!==void 0&&!d.has(S)&&(d.add(S),o(S)),C?.();let T=u.shift();if(T===void 0){i.push(v);return}p(v,!0),T({done:!1,value:v})},_=(v,S,C)=>s.length>0?(a.push({message:v,sourceSeq:S,onDelivered:C}),{disposition:"parked",queuePosition:a.length}):(m(v,S,C),{disposition:"delivered"}),b=v=>{if(f.closed)throw new Error("Claude Code streaming input is closed");let S=gM(v.content);return _(S,v.sourceSeq,v.onDelivered)},w=v=>{if(f.closed)throw new Error("Claude Code streaming input is closed");let S=gM(v),C=l(S);if(s.length===0)return _(S,void 0),{steered:"steered_queued",applied:C};if(t?.()===!1)return _(S,void 0),{steered:"steered_queued",applied:C};let T=u.shift();return T===void 0?i.push(S):(p(S,!0),T({done:!1,value:S})),{steered:"steered_live",applied:C}};return{messages:{[Symbol.asyncIterator](){return{next(){let v=i.shift();return v!==void 0?(p(v,!0),Promise.resolve({done:!1,value:v})):f.closed?Promise.resolve({done:!0,value:void 0}):(r?.(s[0]),new Promise(S=>{u.push(S)}))}}}},close:()=>{if(s.length===0)for(;a.length>0;){let v=a.shift();v!==void 0&&m(v.message,v.sourceSeq,v.onDelivered)}f.closed=!0,g();for(let[v,S]of c)c.delete(v),S(!1)},enqueue:b,enqueueSteer:w,drainUndeliveredFollowUps:()=>a.splice(0),completeTurn:()=>{let v=s.shift();if(!f.closed&&s.length===0){let S=a.shift();S!==void 0&&m(S.message,S.sourceSeq,S.onDelivered)}return v},currentSourceSeq:()=>s[0]}}function gM(e){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null}}function $Z(e){if(e.decision.type!=="allow")return;let n=b9(e.decision.updatedPermissions);if(n.length!==0)try{S9(e.threadId,n),e.log("claude_code.thread_permission_grants_recorded",{linzumi_thread_id:e.threadId,rules:n.map(FI)})}catch(t){e.log("claude_code.thread_permission_grants_persist_failed",{linzumi_thread_id:e.threadId,message:t instanceof Error?t.message:String(t)})}}function $6e(e){let n=e.answers.map(t=>({questionId:t.questionId,selectedLabels:[...t.selectedLabels],freeText:t.freeText}));switch(e.pending.kind){case"question":return{type:"resolved",decision:{type:"answer_question",updatedInput:m9(e.pending.originalInput,e.pending.request,e.answers)},answerState:{kind:"Answered",answers:n,actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:e.answeredAt},dispatch:"user_question_answer"};case"tool_approval":case"plan_review":{let t=e.answers.flatMap(i=>i.selectedLabels),r=t[0];if(r===void 0)return{type:"error",error:"claude_code_user_input_decision_missing",selectedLabels:t};let o=e.pending.approvalDecisions.get(r);return o===void 0?{type:"error",error:"claude_code_user_input_unknown_decision",selectedLabels:t}:{type:"resolved",decision:o,answerState:o.type==="deny"?{kind:"Denied",reason:o.message,answers:n,actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:e.answeredAt}:{kind:"Answered",answers:n,actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:e.answeredAt},dispatch:"user_input_decision"}}}}async function _Q(e){let n=e.sourceSeq;if(n===void 0)return{type:"deny",message:"Claude Code user input request had no source message"};if(e.pendingQuestions.has(e.questionRequest.requestId))return{type:"deny",message:"Claude Code user input request id was already pending"};if(tg({threadId:e.threadId,pendingApprovals:e.pendingApprovals,pendingQuestions:e.pendingQuestions}))return{type:"deny",message:"Claude Code already has a pending user input request"};if(e.signal.aborted)return{type:"deny",message:"Claude Code user input request cancelled by Linzumi"};let t="Claude Code user input request cancelled by Linzumi",r=e.approvalDecisions??new Map,o,i,s=!1,a=new Promise(d=>{let u=!1,c=()=>{i!==void 0&&e.signal.removeEventListener("abort",i),e.pendingQuestions.delete(e.questionRequest.requestId)},l=f=>{u||(u=!0,c(),d(f))};o=l,i=()=>{s||(s=!0,(async()=>{try{await dp(e.kandan,e.topic,{workspace:e.workspace,channel:e.channel,threadId:e.threadId,sourceSeq:n,sessionId:e.sessionId,leaseEpoch:e.leaseEpoch,request:e.questionRequest,answerState:{kind:"Denied",reason:t,answeredAt:new Date().toISOString()},streamState:"interrupted"})}catch(f){console.error("kandan.claude_code_user_input_abort_publish_failed",e.questionRequest.requestId,f instanceof Error?f.message:String(f))}finally{l({type:"deny",message:t})}})())};let p={sessionId:e.sessionId,workspace:e.workspace,channel:e.channel,threadId:e.threadId,sourceSeq:n,leaseEpoch:e.leaseEpoch,request:e.questionRequest,resolve:l,resolved:()=>u};switch(e.kind){case"question":e.pendingQuestions.set(e.questionRequest.requestId,{...p,kind:"question",originalInput:e.request.input});break;case"tool_approval":case"plan_review":e.pendingQuestions.set(e.questionRequest.requestId,{...p,kind:e.kind,approvalDecisions:r});break}});if(i!==void 0&&(e.signal.addEventListener("abort",i,{once:!0}),e.signal.aborted))return i(),a;try{await dp(e.kandan,e.topic,{workspace:e.workspace,channel:e.channel,threadId:e.threadId,sourceSeq:n,sessionId:e.sessionId,leaseEpoch:e.leaseEpoch,request:e.questionRequest,answerState:{kind:"NeedsAnswer"},streamState:"streaming"})}catch(d){return o?.({type:"deny",message:d instanceof Error?`Claude Code user input request push failed: ${d.message}`:"Claude Code user input request push failed"}),a}return a}async function dp(e,n,t){await e.push(n,"session:stream_thread_message",{workspace:t.workspace,channel:t.channel,thread_id:t.threadId,stream_key:g9(t.request.requestId),body:t.request.title,...t.leaseEpoch===void 0?{}:{lease_epoch:t.leaseEpoch},payload:{source_message_seq:t.sourceSeq,agent_provider:"claude-code",...t.sessionId===void 0?{}:{codex_thread_id:t.sessionId,provider_session_key:t.sessionId,claude_session_id:t.sessionId},structured:h9({request:t.request,sessionId:t.sessionId,sourceSeq:t.sourceSeq,answerState:t.answerState,streamState:t.streamState})}})}function tg(e){return[...e.pendingApprovals.values()].some(n=>n.threadId===e.threadId)||[...e.pendingQuestions.values()].some(n=>n.threadId===e.threadId)}async function q6e(e){let n=f9(e.request),t=new Map(n.choices.map(r=>[r.label,r.permissionDecision]));return _Q({kandan:e.kandan,topic:e.topic,pendingApprovals:e.pendingApprovals,pendingQuestions:e.pendingQuestions,workspace:e.workspace,channel:e.channel,threadId:e.threadId,sessionId:e.sessionId,sourceSeq:e.sourceSeq,request:e.request,questionRequest:n.request,kind:n.request.requestSource==="claude_code_plan_review"?"plan_review":"tool_approval",approvalDecisions:t,leaseEpoch:e.leaseEpoch,signal:e.signal})}function qZ(){return yM.value===void 0&&(yM.value=d8(a8(process.env))),yM.value}async function jZ(e){try{return await LZ(e)}catch(n){if(!(n instanceof Da))throw n;e.log("claude_code.dispatch_liveness_respawn_retry",{thread_id:fn(e.control,"threadId")??null,resume_session_id:e.resumeSessionId??null,waited_ms:n.waitedMs});try{return await LZ(e)}catch(t){throw t instanceof Da?new Error(j6e):t}}}async function LZ(e){let n=up(e.control,"workspace"),t=up(e.control,"channel"),r=up(e.control,"threadId"),o=Y(e.control.rootSeq),i=Y(e.control.sourceSeq)??o,s=Ro(e.control.workDescription);if(e.debugTrace?.record("commander","claude.provider_start",{controlType:e.control.type,instanceId:e.instanceId,workspace:n,channel:t,threadId:r,rootSeq:o??null,sourceSeq:i??null,resumeSessionId:e.resumeSessionId??null,cwd:e.cwd}),s===void 0)throw new Error("start_instance control missing workDescription");if(e.log("claude_code.turn_starting",{linzumi_thread_id:r,claude_session_id:e.resumeSessionId??null,body_preview:Pu(s),message_received_at_ms:Date.now()}),e.resumeSessionId!==void 0){let $=await qZ().acquire();($.waitedMs>0||$.timedOut)&&e.log("claude_code.resume_start_throttled",{linzumi_thread_id:r,claude_session_id:e.resumeSessionId,waited_ms:$.waitedMs,timed_out:$.timedOut})}let a=$=>{e.log("claude_code.turn_terminal",{turn_id:null,outcome:"failed",reason:$,thread_id:r,claude_session_id:e.resumeSessionId??null})},d,u=!1,c=!1,l,p=!1,f,g=0,m=!1,_=!1,b=!1,w,v=!1,S=$=>({workspace:n,channel:t,thread_id:r,codex_thread_id:$,provider_session_key:$,agent_provider:"claude-code",claude_session_id:$,cwd:e.cwd,instance_id:e.instanceId}),C=()=>{if(!u||!c||d===void 0)return;let $=()=>{let Le=d;if(p||!u||!c||Le===void 0)return;p=!0;let G=e.kandan.push(e.topic,"session:typing_start",S(Le)).then(()=>{}).catch(Pe=>{e.log("kandan.claude_code_typing_heartbeat_failed",{thread_id:r,claude_session_id:Le,message:Pe instanceof Error?Pe.message:String(Pe)})}).finally(()=>{p=!1});f=G,G.finally(()=>{f===G&&(f=void 0)})};$(),l===void 0&&(l=setInterval($,z$e),l.unref?.())},T=()=>{if(m){_=!0;return}u=!0,g+=1,C()},P=()=>{_&&(_=!1,T())},O=()=>{if(m){b=!0;return}ie.completeTurn()},R=()=>{b&&(b=!1,O())},j=()=>{b=!1,v=!0,ie.completeTurn()},B=async($,Le)=>{let G,Pe=new Promise(xt=>{G=setTimeout(()=>xt("timeout"),B$e),G.unref?.()}),We=await Promise.race([$.then(()=>"processed"),Pe]);G!==void 0&&clearTimeout(G),We==="timeout"&&e.log("claude_code.terminal_processing_timeout",{linzumi_thread_id:r,claude_session_id:Le.sessionId,event_type:Le.type})},K=async($,Le)=>{let G,Pe=new Promise(xt=>{G=setTimeout(()=>xt("timed_out"),U$e),G.unref?.()}),We=await Promise.race([$.then(()=>"settled"),Pe]);return G!==void 0&&clearTimeout(G),We==="timed_out"&&e.log("kandan.claude_code_typing_start_wait_timeout",{thread_id:r,claude_session_id:Le}),We},D=async()=>{let $=u,Le=d,G=g;if(u=!1,l!==void 0&&(clearInterval(l),l=void 0),!(!$||!c||Le===void 0))try{let Pe=f;if(Pe!==void 0&&await K(Pe,Le)==="timed_out"&&f===Pe&&(f=void 0,p=!1),u||g!==G)return;await e.kandan.push(e.topic,"session:typing_stop",S(Le))}catch(Pe){e.log("kandan.claude_code_typing_stop_failed",{thread_id:r,claude_session_id:Le,message:Pe instanceof Error?Pe.message:String(Pe)})}},J=vi($e(e.control.attachments)??[]),W=await DC({cwd:e.cwd,kandanUrl:e.options.kandanUrl,token:e.options.token,fetch:e.options.fetch,attachmentDirectoryName:"local-claude-code-attachments"},{seq:i,body:s,attachments:J}).then($=>({ok:!0,content:$})).catch($=>({ok:!1,error:$}));if(!W.ok){let $=W.error instanceof Error?W.error.message:String(W.error),Le=`Claude Code input attachment download failed: ${$}`;a(Le);try{await oo(e.kandan,e.topic,e.control,"failed",Le,{instanceId:e.instanceId,failureClass:"attachment_download_failed"})}catch(G){e.log("kandan.start_instance_claude_code_attachment_failed_state_push_failed",{message:G instanceof Error?G.message:String(G)})}return{controlResponse:{instanceId:e.instanceId,controlType:e.control.type,agentProvider:"claude-code",ok:!1,error:"claude_code_attachment_download_failed",message:$}}}let H=()=>{},X=!1,be=new Promise($=>{H=$}),Re=()=>{X||(X=!0,setImmediate(H))},ie=O6e({content:W.content,sourceSeq:i,onInputDelivered:T,isLiveSteerAllowed:()=>!m,onInputWait:$=>{$===void 0&&Re()},onSourceSeqDelivered:$=>{we.add($),e.onLiveSourceSeqAccepted?.({channel:t,threadId:r,sourceSeq:$})}}),we=new Set,qe=new Set,Oe=0,bn=Ro(e.control.developerPrompt),un=wa(e.control.linzumiContext),je=mp(e.options,e.control),Xe=y(e.control.approvalPolicy)!==void 0,_e=e.claudeThreadAccessStore?.resolve(r),q=gp(e.options),F=Xe?je.approvalPolicy:_e?.approvalPolicy??q.approvalPolicy,z=Xe?je.sandbox:_e?.sandbox??q.sandbox,V=F===void 0?void 0:jf(F,z),ae=V!==void 0?_M(V):je.approvalPolicy===void 0?void 0:_M(je.approvalPolicy);if(V!==void 0&&e.claudeThreadAccessStore?.record(r,{approvalPolicy:V,sandbox:z}),e.resumeSessionId!==void 0)try{await u9({cwd:e.cwd,sessionId:e.resumeSessionId,validator:e.options.claudeCodeSessionValidator})}catch($){throw a($ instanceof Error?$.message:String($)),$}let pe={runnerIdentity:Uo(e.options.token),codexVersion:void 0},Te=new AbortController,Z=Zm({stop:()=>{Te.signal.aborted||Te.abort(new Error("engine child reaper teardown"))},pid:void 0,ownProcessGroup:!1,kind:"claude_code"}),de=new Set(i===void 0?[]:[i]),ue={value:void 0},en=!1,Ye,Be=[],In=!1,ft,ee=Zs({kandanUrl:e.options.kandanUrl,accessToken:e.options.token,fetchImpl:e.options.fetch,operatingMode:"text"}),Q=s.trim().slice(0,2e3),he=iB({replacePlanSteps:ee.replaceCodingJobPlanSteps,threadId:r,goal:Q,log:e.log}),He=async()=>{if(e.resumeSessionId!==void 0)return;let $=5e3,Le=new AbortController,G,Pe=new Promise(We=>{G=setTimeout(()=>{Le.abort(new Error("claude goal seed timed out")),e.log("claude_code.goal_seed_timeout",{thread_id:r,timeout_ms:$}),We()},$)});try{await Promise.race([sB({upsertCodingJobPlan:ee.upsertCodingJobPlan,threadId:r,goal:Q,log:e.log,signal:Le.signal}),Pe])}finally{G!==void 0&&clearTimeout(G)}},N={model:je.model,modelProvider:je.modelProvider},ce=nB({flushJournaledTerminal:()=>te.flush(_Z),publishMessageState:$=>Io(e.kandan,e.topic,{workspace:n,channel:t,threadId:r,sourceSeq:$.sourceSeq,status:$.status,reason:$.reason,sessionId:d,fate:$.fate,retryable:$.retryable,holdDeadlineAt:$.holdDeadlineAt,model:$.model,provider:$.provider}),adoptMessageStateConsensus:($,Le,G)=>te.adoptMessageStateConsensus($,Le,G),acceptRestart:$=>te.acceptRouteOutageRestart($),enqueue:$=>ie.enqueue($).disposition,isSessionClosed:()=>Te.signal.aborted,attribution:()=>({...N.model===void 0?{}:{model:N.model},...N.modelProvider===void 0?{}:{provider:N.modelProvider}}),log:($,Le)=>e.log($,{thread_id:r,...Le})});i!==void 0&&ce.retainInput(i,W.content);let te=Y8({instanceId:e.instanceId,cwd:e.cwd,threadKey:`${n}:${t}:${r}`,persistDir:e.options.claudeCodeRunner===void 0?Zh():void 0,wire:()=>({workspaceSlug:n,channelSlug:t,kandanThreadId:r,codexThreadId:d??e.resumeSessionId,rootSeq:o,leaseEpoch:e.leaseEpochFor?.(r)}),push:async($,Le,G,Pe)=>{let We=await e.kandan.push(e.topic,$,Le,Pe);if(ne(We)&&We.status==="ok")return We;throw new Error(`kandan push failed: ${$}: ${JSON.stringify(We).slice(0,500)}`)},preparePush:($,Le)=>x_({kandan:e.kandan,topic:e.topic,workspace:n,channel:t,cwd:e.cwd,kandanUrl:e.options.kandanUrl,token:e.options.token,fetch:e.options.fetch,log:(G,Pe)=>e.log(G,Pe)},$,Le),runnerPayload:($,Le,G,Pe)=>Hi({...e.options,cwd:e.cwd},e.instanceId,$,Le,pe,G,Pe),currentSourceSeq:ie.currentSourceSeq,routeOutageActive:()=>Ta(void 0,N.model,0)==="active",runtimeMetadataForSourceSeq:()=>({model:N.model??null,model_provider:N.modelProvider??null}),onTurnTerminal:($,Le,G,Pe,We,xt,_a)=>{e.log("claude_code.turn_terminal",{turn_id:$,outcome:Le,reason:G??null,thread_id:r,claude_session_id:d??null,...xt===void 0?{}:{fate:xt}}),(Le==="failed"||Le==="interrupted")&&xt==="route_outage"&&We!==void 0&&ce.park({sourceSeq:We,reason:G,provider:_a?.provider,model:_a?.model,holdCeilingMs:_a?.holdCeilingMs}),Le==="completed"&&We!==void 0&&(e.onLiveSourceSeqAccepted?.({channel:t,threadId:r,sourceSeq:We}),ce.releaseRetained(We)),w?.(),w=void 0},onTodoWriteCompleted:he.handleTodoWrite,suppressProcessingState:()=>{for(let $ of e.pendingClaudeCodeApprovals.values())if($.threadId===r)return!0;for(let $ of e.pendingClaudeCodeUserQuestions.values())if($.threadId===r)return!0;return!1},log:e.log,debugTrace:e.debugTrace}),ke=e.options.claudeCodeRunner===void 0&&UB(process.env)?BB({captureDir:Tt(nQ(),`linzumi-claude-live-bash-${e.instanceId}`),onOutputDelta:($,Le)=>{d!==void 0&&te.handleTranscriptEvent({type:"command_output_delta",sessionId:d,itemKey:$,delta:Le})},log:($,Le)=>e.log($,Le)}):void 0,Ae,nn;try{let $=MQ(),Le=qM({...e.options,codingJobMcpToken:EM(e.control)});Ae=Le.cleanup;let G=$s({command:$.command,argsPrefix:$.argsPrefix,kandanUrl:e.options.kandanUrl,authFilePath:Le.path,ownerUsername:I0(e.options),operatingMode:"text",cwd:e.cwd,threadId:r,toolScope:e.options.codingJobToolScope,multiAgentJobs:e.options.multiAgentJobs===!0,devServices:{scope:e.options.runnerId,ownerPid:$M(e.options)}});nn=a4(G)}catch($){Ae?.(),Ae=void 0,e.log("claude_code.mcp_config_failed",{message:$ instanceof Error?$.message:String($),thread_id:r})}let Yn={kandan:e.kandan,topic:e.topic,workspace:n,channel:t,threadId:r,cwd:e.cwd,initialPrompt:s,rootSeq:o,log:e.log},pn=new Map,Kt=async $=>{let Le=Date.now(),G=DI($.rateLimit,Le);e.log("claude_code.rate_limit",{linzumi_thread_id:r,claude_session_id:$.sessionId??d??null,rate_limit_summary:`claude/${$.rateLimit.rateLimitType??"account"} ${G}`,status:$.rateLimit.status??null,utilization_percent:$.rateLimit.utilizationPercent??null,resets_at_ms:$.rateLimit.resetsAtMs??null});let Pe=$.rateLimit.rateLimitType??"account",We=Z6e($.rateLimit);if(We!==pn.get(Pe))try{await Q6e({kandan:e.kandan,topic:e.topic,workspace:n,channel:t,threadId:r,claudeSessionId:$.sessionId??d,rateLimit:$.rateLimit}),pn.set(Pe,We)}catch(xt){e.log("claude_code.rate_limit_post_failed",{thread_id:r,message:xt instanceof Error?xt.message:String(xt)})}},qo=async $=>{if(Oe=Date.now(),e.debugTrace?.record("claude-transcript","transcript.event",{eventType:$.type,threadId:r,activeSessionId:d??null,event:$}),jy.observeTranscriptEvent($),$.type==="tool_call"&&$.toolName==="Bash"){let G=y($.input.command);G!==void 0&&nx(r,G)}try{await U6e(Yn,$)}catch(G){e.log("claude_code.session_store_mirror_failed",{session_id:$.sessionId??null,event_type:$.type,message:G instanceof Error?G.message:String(G)})}if($.type==="session_started"){d=$.sessionId,e.log("claude_code.session_started",{linzumi_thread_id:r,claude_session_id:$.sessionId}),e.activeClaudeCodeSessions.set($.sessionId,{abortController:Te,workspace:n,channel:t,threadId:r,currentSourceSeq:ie.currentSourceSeq,adoptMessageStateConsensus:te.adoptMessageStateConsensus,captureMessageStateAttemptGeneration:te.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:te.adoptMessageStateConsensusForAttempt,pauseOutbox:()=>te.pauseOutbox(),resumeOutbox:()=>te.resumeOutbox(),inputDelivered:G=>we.has(G)||qe.has(G),lastSdkActivityMs:()=>Oe,enqueueInput:G=>{if(G.sourceSeq!==void 0&&de.has(G.sourceSeq))return"duplicate";let Pe=ie.enqueue(G);return G.sourceSeq!==void 0&&(ce.noteSupersession("new_user_input"),ce.retainInput(G.sourceSeq,G.content)),G.sourceSeq!==void 0&&de.add(G.sourceSeq),Pe},closeInput:ie.close,hasActiveTurn:()=>te.activeTurnId()!==void 0,sessionWork:()=>ue.value,steerTurn:ie.enqueueSteer,interruptTurn:async G=>{ce.noteSupersession("interrupt_turn");let Pe=te.interruptActiveTurn(G);return await Ye?.interrupt(),Pe},interruptTurnBeforeAbort:G=>{let Pe=Ye;return ce.noteSupersession("interrupt_before_abort"),S6e({reason:G,threadId:r,interruptActiveTurn:We=>te.interruptActiveTurn(We),interruptSessionControls:Pe===void 0?void 0:()=>Pe.interrupt(),log:e.log})},discardQueuedFollowUpsForStop:()=>(ce.noteSupersession("stop_discard"),ie.drainUndeliveredFollowUps().map(Pe=>Pe.sourceSeq).filter(Pe=>Pe!==void 0)),markFollowUpSeqDiscarded:G=>{qe.add(G)},slashCommands:async()=>{if(In)return Be;let G=await Ye?.supportedCommands();return In||G!==void 0&&(Be=G),Be},updateSettings:async G=>{let Pe={};if(G.model!==void 0&&(await Ye?.setModel(xM(G.model)),Pe.model=G.model,N.model=G.model),G.approvalPolicy!==void 0){let We=_M(G.approvalPolicy);We!==void 0&&(await Ye?.setPermissionMode(We),Pe.approval_policy=G.approvalPolicy)}if(G.reasoningEffort!==void 0){let We=NZ(G.reasoningEffort);We!==void 0&&(await Ye?.setEffort?.(We),Pe.reasoning_effort=G.reasoningEffort)}return Pe}}),e.ensureClaudeCodeForwardPortSession?.({sessionId:$.sessionId,workspace:n,channel:t,threadId:r,cwd:e.cwd,rootSeq:o,currentSourceSeq:ie.currentSourceSeq}),te.handleTranscriptEvent($),await e.kandan.push(e.topic,"session:bind",{workspace:n,channel:t,thread_id:r,codex_thread_id:$.sessionId,provider_session_key:$.sessionId,agent_provider:"claude-code",claude_session_id:$.sessionId,cwd:e.cwd,instance_id:e.instanceId}),c=!0,T();return}if($.type==="slash_command_catalog"){Be=$.commands,$.source==="commands_changed"&&(In=!0);return}let Le=$.type==="turn_completed"||$.type==="turn_interrupted"||$.type==="session_completed"||$.type==="session_failed";if(Le){m=!0;let G=te.activeTurnId(),Pe=!1,We=()=>{},xt=()=>{Pe=!0,We()},_a=new Promise(Fo=>{We=Fo});w=xt,te.handleTranscriptEvent($);let Bi=$.type==="turn_completed"||$.type==="turn_interrupted",Ny=Bi||G!==void 0||Pe;try{Ny?(await B(_a,$),await te.flush(_Z)):w===xt&&(w=void 0)}catch(Fo){e.log("claude_code.terminal_typing_flush_timeout",{linzumi_thread_id:r,claude_session_id:$.sessionId,event_type:$.type,message:Fo instanceof Error?Fo.message:String(Fo)})}w===xt&&(w=void 0),Bi&&(j(),ie.currentSourceSeq()!==void 0&&Re()),($.type==="session_completed"||$.type==="session_failed")&&d!==void 0&&(e.activeClaudeCodeSessions.delete(d),await e.disposeClaudeCodeForwardPortSession?.(d)),$.type==="session_completed"&&Re(),m=!1,await D(),R(),P(),await tx({threadKey:r,workspace:n,channel:t,threadId:r,push:(Fo,Rc)=>e.kandan.push(e.topic,Fo,Rc),log:(Fo,Rc)=>e.log(Fo,Rc)})}if(($.type==="turn_completed"||$.type==="session_completed")&&e.log("claude_code.turn_completed",{linzumi_thread_id:r,claude_session_id:$.sessionId,body_source:$.bodySource??null,body_preview:Pu($.body)}),$.type==="rate_limit"&&await Kt($),$.type==="tool_result"&&ke?.settleTool($.itemKey),($.type==="turn_interrupted"||$.type==="session_failed")&&ke?.settleAll(),$.type==="session_failed"&&e.log("claude_code.session_failed",{linzumi_thread_id:r,claude_session_id:$.sessionId??null,model_transport_lane:Lo.lane,reason:$.reason,api_error_status:$.apiErrorProvenance?.status??null,api_error_request_id:$.apiErrorProvenance?.requestId??null,api_error_message:$.apiErrorProvenance?.message??null}),$.type==="usage"){let G=r9($.usage);G!==void 0&&e.log("claude_code.token_usage",{linzumi_thread_id:r,claude_session_id:$.sessionId,token_usage_summary:G})}Le||te.handleTranscriptEvent($)},lr=E(e.control.llmProxy),xo=y(lr?.baseUrl)?.trim(),jo=y(lr?.token)?.trim(),Lo=g8({env:process.env,llmProxyBindingPresent:xo!==void 0&&xo!==""&&jo!==void 0&&jo!=="",hostedLinzumiAgentContext:e.control.linzumiAgent!==void 0||e.options.threadProcess?.role==="thread"&&e.options.linzumiAgentMcpToken!==void 0,routedNonAnthropicModel:vQ(je.model)!==void 0});e.log("claude_code.model_transport_lane",{linzumi_thread_id:r,lane:Lo.lane,credential_class:Lo.credentialClass,reason:Lo.reason});let jy=b8({lane:Lo.lane,workspace:n,channel:t,threadId:r,model:xM(je.model),push:($,Le)=>e.kandan.push(e.topic,$,Le),log:e.log}),jr,ha,zi;if(Lo.lane==="llm_proxy"&&xo!==void 0&&xo!==""&&jo!==void 0&&jo!==""){try{jr=await GP({upstreamBaseUrl:xo,initialToken:jo,log:(Le,G)=>e.log(Le,{linzumi_thread_id:r,...G}),debugTrace:e.debugTrace,debugTraceId:e.debugTrace===void 0?void 0:`claude-code:${e.instanceId}`,dispatcher:Xo()?.dispatcher,onUpstreamRateLimited:({retryAfterMs:Le})=>qZ().notifyRateLimited({retryAfterMs:Le})});let $=jr;ha=ZP({relay:jr,mint:()=>bQ(e.kandan,e.topic,$.currentToken()),log:(Le,G)=>e.log(Le,{linzumi_thread_id:r,...G})})}catch($){e.log("llm_proxy_relay.start_failed_fallback_to_env_token",{linzumi_thread_id:r,message:$ instanceof Error?$.message:String($)}),jr=void 0,ha=void 0}zi=jr!==void 0?UZ(process.env,{baseUrl:jr.baseUrl},je.model):UZ(process.env,{baseUrl:xo,token:jo},je.model)}else zi=W6e(process.env);let Ly=K$e(zi),Pc=()=>ie.currentSourceSeq()!==void 0&&!tg({threadId:r,pendingApprovals:e.pendingClaudeCodeApprovals,pendingQuestions:e.pendingClaudeCodeUserQuestions}),Fy=($,Le)=>{if(L6e($.toolName))return Promise.resolve({type:"allow"});let G=p9($);switch(G.type){case"question":return(async()=>{await D();let Pe=await _Q({kandan:e.kandan,topic:e.topic,pendingApprovals:e.pendingClaudeCodeApprovals,pendingQuestions:e.pendingClaudeCodeUserQuestions,workspace:n,channel:t,threadId:r,sessionId:d??e.resumeSessionId,sourceSeq:ie.currentSourceSeq(),request:$,questionRequest:G.request,kind:"question",approvalDecisions:void 0,leaseEpoch:e.leaseEpochFor?.(r),signal:Le});return T(),Pe})();case"invalid":return Promise.resolve({type:"deny",message:G.message});case"not_question":{let Pe=v9(dh(r),$);return Pe!==void 0?(e.log("claude_code.tool_approval_auto_granted",{linzumi_thread_id:r,tool_name:$.toolName,request_id:$.requestId}),Promise.resolve(Pe)):q6e({kandan:e.kandan,topic:e.topic,pendingApprovals:e.pendingClaudeCodeApprovals,pendingQuestions:e.pendingClaudeCodeUserQuestions,workspace:n,channel:t,threadId:r,sessionId:d??e.resumeSessionId,sourceSeq:ie.currentSourceSeq(),request:$,leaseEpoch:e.leaseEpochFor?.(r),signal:Le})}}},Ct=(async()=>{let $;await He(),await dm({cwd:e.cwd,threadKey:r,turnRef:i===void 0?"session-start":`seq-${i}`,log:(Pe,We)=>e.log(Pe,We)});let Le=NZ(je.reasoningEffort),G=dh(r).map(FI);try{try{$=await d9({cwd:e.cwd,prompt:s,includeHookEvents:!0,developerInstructions:zf({cwd:e.cwd,agentLabel:"Claude Code",planTool:"todo-write",devServicesAvailable:!0,developerPrompt:bn,...IM(e.control),linzumiContext:un}),model:xM(je.model),...typeof Le=="string"?{effort:Le}:{},...e.debugTrace===void 0?{}:{claudeCodeDebugFile:Tt(e.debugTrace.runDir,"claude-code-debug.log")},...ae===void 0?{}:{permissionMode:ae},...G.length===0?{}:{permissionGrantRules:G},resumeSessionId:e.resumeSessionId,abortController:Te,streamingInput:ie,...e.options.claudeCodeRunner===void 0?{turnStallThresholdMs:D6e(process.env),turnStallIsActive:Pc,apiWaitStatusThresholdMs:1e4,apiWaitStatusItemKey:Pe=>{let We=ie.currentSourceSeq();return We===void 0?void 0:`system:claude-api-wait:${We}:${Pe}`}}:{},runner:e.options.claudeCodeRunner,debugTrace:e.debugTrace,canUseTool:Fy,...nn===void 0?{}:{mcpServers:nn},...ke===void 0?{}:{preToolUseHookMatchers:ke.hookMatchers,wrapApprovedToolInput:(Pe,We,xt)=>We==="Bash"?ke.wrapApprovedTool(Pe,xt):void 0},env:Ly,allowedTools:["mcp__linzumi__*"],onSessionControls:Pe=>{Ye=Pe,ae==="bypassPermissions"&&(ft=xQ({kandan:e.kandan,topic:e.topic,pendingClaudeCodeApprovals:e.pendingClaudeCodeApprovals,pendingClaudeCodeUserQuestions:e.pendingClaudeCodeUserQuestions,sessionThreadId:r,captureMessageStateAttemptGeneration:te.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:te.adoptMessageStateConsensusForAttempt,stopSession:We=>{te.interruptActiveTurn(We),Te.abort(new Error(We))},log:e.log,reason:"full_access_started"}).catch(We=>{e.log("claude_code.startup_approval_drain_failed",{linzumi_thread_id:r,claude_session_id:d??null,message:We instanceof Error?We.message:String(We)})}))},onTurnCompleted:()=>{v?v=!1:O(),ie.currentSourceSeq()!==void 0&&Re()},onTranscriptEvent:qo})}finally{let We=ie.drainUndeliveredFollowUps().map(xt=>xt.sourceSeq).filter(xt=>xt!==void 0);We.length>0&&e.onUndeliveredFollowUpsAtClose!==void 0&&e.onUndeliveredFollowUpsAtClose({channel:t,threadId:r,sourceSeqs:We}),d!==void 0&&(e.activeClaudeCodeSessions.delete(d),await e.disposeClaudeCodeForwardPortSession?.(d)),await D(),ie.close(),Ae?.(),ke?.close()}}catch(Pe){throw te.submitLifecycle("codexDied",Pe instanceof Error?Pe.message:String(Pe)),await te.close(5e3).catch(()=>{}),await Promise.race([he.settle().catch(()=>{}),new Promise(We=>{setTimeout(We,5e3).unref?.()})]),a(Pe instanceof Error?Pe.message:String(Pe)),en||e.setStartupStage("claude_code_session_failed"),Pe}return en||e.setStartupStage("posting_claude_code_output"),await te.awaitTurnsSettled(3e4),await te.close(3e4),await Promise.race([he.settle(),new Promise(Pe=>{setTimeout(Pe,1e4).unref?.()})]),$})();Ct.finally(()=>Z.unregister()).catch(()=>{}),Ct.finally(()=>{ha?.stop(),jr?.close()}).catch(()=>{}),ue.value=Ct;let _f,kd=e.options.claudeCodeRunner===void 0||process.env.LINZUMI_CLAUDE_DISPATCH_LIVENESS_MS!==void 0?Db({windowMs:uh(process.env),isDelivered:()=>Oe>0,isSessionClosed:()=>!1,lastSdkActivityMs:()=>Oe,hasPendingBlockingRequest:()=>tg({threadId:r,pendingApprovals:e.pendingClaudeCodeApprovals,pendingQuestions:e.pendingClaudeCodeUserQuestions}),log:e.log,onWedged:$=>{_f={waitedMs:$.waitedMs},e.log("claude_code.dispatch_liveness_wedged",{linzumi_thread_id:r,claude_session_id:d??e.resumeSessionId??null,waited_ms:$.waitedMs,cause:$.cause,dispatch:e.resumeSessionId===void 0?"initial_turn":"resume_turn"}),Te.abort(new Da($.waitedMs))}}):void 0;Ct.finally(()=>kd?.stop()).catch(()=>{});let Cd;try{Cd=await Promise.race([Ct.then($=>({type:"session_ended",result:$})),be.then(()=>({type:"first_turn_settled"}))])}catch($){throw _f!==void 0&&!($ instanceof Da)?new Da(_f.waitedMs):$}finally{kd?.stop()}let ya=$=>({controlResponse:{instanceId:e.instanceId,controlType:e.control.type,agentProvider:"claude-code",cwd:e.cwd,matchedRoot:e.matchedRoot,response:{session:{id:$}}},providerSession:{provider:"claude-code",cwd:e.cwd,matchedRoot:e.matchedRoot,sessionId:$}});if(Cd.type==="session_ended")return ya(Cd.result.sessionId);e.setStartupStage("posting_claude_code_output"),en=!0,await te.awaitTurnsSettled(3e4);try{await te.flush(3e4)}catch($){e.log("claude_code.first_turn_flush_timeout",{linzumi_thread_id:r,claude_session_id:d??null,message:$ instanceof Error?$.message:String($)})}ft!==void 0&&await ft;let Ic=await Promise.race([Ct.then($=>({type:"session_ended",result:$}),()=>{}),new Promise($=>{setImmediate(()=>$(void 0))})]);if(Ic!==void 0)return ya(Ic.result.sessionId);Ct.then(()=>{e.log("claude_code.session_loop_ended",{linzumi_thread_id:r,claude_session_id:d??null})},$=>{e.log("claude_code.session_loop_failed",{linzumi_thread_id:r,claude_session_id:d??null,message:$ instanceof Error?$.message:String($)})});let xf=d??e.resumeSessionId;if(xf!==void 0)return ya(xf);let bf=await Ct;return ya(bf.sessionId)}function L6e(e){return e.startsWith("mcp__linzumi__")}function FZ(e){switch(e){case"untrusted":return 0;case"on-request":return 1;case"on-failure":return 2;case"never":return 3;default:return}}function _M(e){switch(e){case"never":return"bypassPermissions";case"on-request":case"untrusted":return"default";case"on-failure":return"acceptEdits";default:return}}function NZ(e){switch(e?.trim().toLowerCase()){case"default":return null;case"low":return"low";case"medium":return"medium";case"high":return"high";case"xhigh":return"xhigh";default:return}}function F6e(e,n){return[...e.entries()].filter(([,t])=>t.threadId===n)}function N6e(e,n){return[...e.entries()].flatMap(([t,r])=>{switch(r.kind){case"question":return[];case"tool_approval":case"plan_review":return r.threadId===n?[[t,r]]:[]}})}async function xQ(e){let n=F6e(e.pendingClaudeCodeApprovals,e.sessionThreadId);for(let[r,o]of n){if(await mQ({pending:o,decision:{type:"allow"},incomingStatus:"processing",publishMessageState:()=>Io(e.kandan,e.topic,{workspace:o.workspace,channel:o.channel,threadId:o.threadId,sourceSeq:o.sourceSeq,status:"processing",reason:"Claude Code tool approved",sessionId:o.sessionId??e.sessionThreadId}),captureMessageStateAttemptGeneration:e.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:e.adoptMessageStateConsensusForAttempt,stopSession:e.stopSession,log:e.log,reason:e.reason})==="stopped")return;e.log("claude_code.approval_request_auto_approved",{request_id:r,source_seq:o.sourceSeq,session_id:o.sessionId??e.sessionThreadId,reason:e.reason})}let t=N6e(e.pendingClaudeCodeUserQuestions,e.sessionThreadId);for(let[r,o]of t){let i=o.approvalDecisions.get("Allow")??{type:"allow"};o.resolve(i),await dp(e.kandan,e.topic,{workspace:o.workspace,channel:o.channel,threadId:o.threadId,sourceSeq:o.sourceSeq,sessionId:o.sessionId,leaseEpoch:o.leaseEpoch,request:o.request,answerState:i.type==="deny"?{kind:"Denied",reason:i.message,actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:new Date().toISOString()}:{kind:"Answered",answers:[{questionId:o.request.questions[0]?.questionId??`${r}:decision`,selectedLabels:["Allow"]}],actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:new Date().toISOString()},streamState:"completed"}),e.log("claude_code.user_input_request_auto_approved",{request_id:r,source_seq:o.sourceSeq,session_id:o.sessionId??e.sessionThreadId,kind:o.kind,reason:e.reason})}}function z6e(e){return ox(e)}async function U6e(e,n){let t=J6e(n);if(t===void 0)return;let r=K6e(e,n);if(r===void 0)return;let o="root",i=B6e(`${e.workspace}:${e.cwd}:${t}:${o}`);await e.kandan.push(e.topic,"claude_session_store_append",{workspace:e.workspace,channel:e.channel,thread_id:e.threadId,cwd:e.cwd,sessionId:t,subkey:o,sequence:i,entryType:n.type,payload:r})}function B6e(e){let n=zZ.get(e),t=Date.now()*1e3,r=n===void 0?t:Math.max(n+1,t);return zZ.set(e,r),r}function J6e(e){switch(e.type){case"unknown":case"session_failed":return e.sessionId;default:return e.sessionId}}function K6e(e,n){switch(n.type){case"assistant_delta":case"slash_command_catalog":return;case"session_started":return{prompt:e.initialPrompt,threadId:e.threadId,rootSeq:e.rootSeq??null};case"assistant_message":return{itemKey:n.itemKey,body:n.content,streamState:n.streamState};case"tool_call":return{itemKey:n.itemKey,toolName:n.toolName,input:n.input};case"tool_result":return{itemKey:n.itemKey,toolName:n.toolName??null,body:n.content,isError:n.isError};case"reasoning_delta":return;case"reasoning_message":return{itemKey:n.itemKey,body:n.content};case"command_output":return{itemKey:n.itemKey,body:n.content};case"command_output_delta":return;case"usage":return{usage:n.usage};case"rate_limit":return{body:`Claude Code rate limit: ${DI(n.rateLimit,Date.now())}`,status:n.rateLimit.status??null,rate_limit_type:n.rateLimit.rateLimitType??null,utilization_percent:n.rateLimit.utilizationPercent??null,resets_at_ms:n.rateLimit.resetsAtMs??null};case"unknown":return{itemKey:n.itemKey,body:n.summary};case"turn_completed":case"session_completed":return{body:n.body,bodySource:n.bodySource??null,usage:n.usage??null};case"turn_interrupted":return{body:"Claude Code turn interrupted"};case"session_failed":return{body:n.reason};case"agent_status":case"agent_task_update":case"permission_mode_changed":return}}function W6e(e){let n={};for(let[t,r]of Object.entries(e))r!==void 0&&(n[t]=r);return n}async function bQ(e,n,t){let r=await e.push(n,"llm_proxy:mint_session_token",t!==void 0&&t!==""?{currentToken:t}:{});if(ne(r)&&r.status==="ok"&&ne(r.response)&&typeof r.response.token=="string"&&r.response.token!==""){let o=r.response.max_age_seconds;return{token:r.response.token,...typeof o=="number"&&Number.isFinite(o)&&o>0?{maxAgeMs:o*1e3}:{}}}}function UZ(e,n,t){let r={};for(let[i,s]of Object.entries(e))s!==void 0&&(i==="ANTHROPIC_BASE_URL"||i==="ANTHROPIC_CUSTOM_HEADERS"||i.startsWith("CLAUDE_CODE_USE_")||(r[i]=s));r.ANTHROPIC_BASE_URL=n.baseUrl,n.token!==void 0&&(r.ANTHROPIC_CUSTOM_HEADERS=`${V6e}: ${n.token}`);let o=vQ(t);return o!==void 0&&(r.ANTHROPIC_DEFAULT_OPUS_MODEL=o,r.ANTHROPIC_DEFAULT_SONNET_MODEL=o,r.ANTHROPIC_DEFAULT_HAIKU_MODEL=o,r.CLAUDE_CODE_SUBAGENT_MODEL=o),r}function vQ(e){let n=e?.trim();switch(n){case void 0:case"":case"default":case"haiku":case"sonnet":case"opus":case"fable-5":return;default:return n.startsWith("claude")?void 0:n}}function xM(e){let n=e?.trim();switch(n){case void 0:case"":case"default":return;case"haiku":case"sonnet":case"opus":return n;case"fable-5":return"claude-fable-5";default:return H6e(n)?"sonnet":n}}function H6e(e){let n=e.toLowerCase();return n.startsWith("gpt-")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("o5")||n.startsWith("codex")}async function G6e(e,n,t,r,o){let i=fn(t,"workspace"),s=fn(t,"channel"),a=fn(t,"threadId"),d=y(t.modelProvider)?.trim(),u=y(t.model)?.trim();i===void 0||s===void 0||a===void 0||await e.push(n,"session:post_thread_message",{workspace:i,channel:s,thread_id:a,body:`Starting a new Codex thread with instructions:
1625
+ `)}catch(r){n?.(r instanceof Error?r.message:String(r))}}}}function Lqe(e,n=cp){try{if(n(e))return}catch{return}return`the runner's working directory ${e} no longer exists (deleted, or its disk/volume is unmounted); remount the volume or reconnect from an existing folder`}function Fqe(e,n,t=pQ,r=qqe){let o=e.load(),i=o===void 0?Number.NaN:Date.parse(o.lastExitAt),s=n-i,d=o!==void 0&&Number.isFinite(i)&&s>=0&&s<=t?o.count+1:1;return e.save({count:d,lastExitAt:new Date(n).toISOString()}),{count:d,crashLoop:d>=r}}function Nqe(e){let n=new Map,t={failed:!1},r;return{observeNotification:(o,i)=>{if(t.failed)return;let s=zqe(i);if(s===void 0)return;r=Date.now();let a=_0(i);if(y0.has(o)){for(let[d,u]of n)u===s&&(a===void 0||a===d)&&n.delete(d);return}a!==void 0&&n.set(a,s)},failActiveTurns:o=>{if(t.failed)return;t.failed=!0;let i=Array.from(n);if(n.clear(),i.length===0)return;e.onActiveThreadsFailed?.(i.map(([d])=>d));let s=Array.from(e.sessions()),a=typeof o=="function"?o:d=>o;for(let[d,u]of i){let c=a({threadId:d,turnId:u});e.log("codex.active_turn_failed_on_connection_loss",{thread_id:d,turn_id:u,cause:c});for(let l of s)Va(l,"turn/failed",{threadId:d,turnId:u,reason:c,...Hc("infra_turn_kill")},e.log)}},activeTurnCount:()=>n.size,activeTurns:()=>Array.from(n,([o,i])=>({threadId:o,turnId:i})),lastActivityAtMs:()=>r}}function zqe(e){let n=E(e.turn),t=E(e.item),r=E(t?.turn);return y(n?.id)??y(e.turnId)??y(e.turn_id)??y(t?.turnId)??y(t?.turn_id)??y(r?.id)}function _0(e){let n=E(e.thread),t=E(e.turn);return y(e.threadId)??y(e.thread_id)??y(n?.id)??y(t?.threadId)??y(t?.thread_id)}function Va(e,n,t,r,o){if(e===void 0)return!1;try{return e.handleCodexNotification(n,t,o),!0}catch(i){return r("codex.notification_session_dispatch_failed",{method:n,message:i instanceof Error?i.message:String(i)}),!1}}function Uqe(e,n=!0){let t=new Map,r=n,o=0,i=()=>[...t.values()].reduce((c,l)=>c+1+l.parentFrames.length+l.childFrames.length,0),s=(c,l)=>{if(c!=="item/started"&&c!=="item/completed")return;let p=E(l.item),f=_0(l);if(p===void 0||y(p.type)!=="subAgentActivity"||y(p.kind)!=="started"||f===void 0)return;let g=y(p.id),m=y(p.agentThreadId)??y(p.agent_thread_id);return{key:`${f}:${g??m??"missing-item-id"}`,sequence:0,activityPending:!0,method:c,params:l,parentThreadId:f,childThreadId:m,itemId:g,captureAuthority:"pre_disable_accepted",parentFrames:[],childFrames:[]}},a=(c,l)=>{let p=c.filter(f=>f.ownsCodexThreadId(l));switch(p.length){case 0:return;case 1:return p[0];default:{let f=p.filter(g=>g.currentCodexThreadId?.()===l);switch(f.length){case 1:return f[0];case 0:throw new Error(`multiple inherited channel sessions own Codex thread ${l}`);default:throw new Error(`multiple direct channel sessions own Codex thread ${l}`)}}}},d=(c,l)=>{let p=[...t.values()].filter(f=>f.key!==l&&f.activityPending&&f.childThreadId===c);if(p.length>1)throw new Error(`multiple deferred Codex subagent edges claim child ${c}`);return p[0]},u=c=>{let l=[...t.values()].flatMap(f=>[...f.activityPending&&d(f.parentThreadId,f.key)===void 0&&a(c,f.parentThreadId)!==void 0?[{kind:"activity",sequence:f.sequence,activity:f}]:[],...f.parentFrames.flatMap(g=>!f.activityPending&&a(c,f.parentThreadId)!==void 0?[{kind:"parent_frame",sequence:g.sequence,activity:f,frame:g}]:[]),...f.childFrames.flatMap(g=>!f.activityPending&&f.childThreadId!==void 0&&a(c,f.childThreadId)!==void 0?[{kind:"frame",sequence:g.sequence,activity:f,frame:g}]:[])]).sort((f,g)=>f.sequence-g.sequence)[0];if(l===void 0)return;let p=l.kind==="activity"||l.kind==="parent_frame"?a(c,l.activity.parentThreadId):l.activity.childThreadId===void 0?void 0:a(c,l.activity.childThreadId);if(p===void 0)throw new Error(`deferred Codex subagent owner disappeared for ${l.activity.parentThreadId}`);if(l.kind==="activity"){if(!Va(p,l.activity.method,l.activity.params,e,{captureAuthority:l.activity.captureAuthority}))return;if(l.activity.childThreadId!==void 0&&a(c,l.activity.childThreadId)===void 0)throw new Error(`deferred Codex subagent child was not registered: ${l.activity.childThreadId}`);l.activity.parentFrames.length===0&&l.activity.childFrames.length===0?t.delete(l.activity.key):t.set(l.activity.key,{...l.activity,activityPending:!1})}else if(l.kind==="parent_frame"){if(!p.ownsCodexThreadId(l.activity.parentThreadId))throw new Error(`deferred Codex subagent parent owner disappeared for ${l.activity.parentThreadId}`);if(!Va(p,l.frame.method,l.frame.params,e,{captureAuthority:l.activity.captureAuthority}))return;let g=l.activity.parentFrames.filter(({sequence:m})=>m!==l.frame.sequence);!l.activity.activityPending&&g.length===0&&l.activity.childFrames.length===0?t.delete(l.activity.key):t.set(l.activity.key,{...l.activity,parentFrames:g})}else{if(l.activity.childThreadId===void 0||!p.ownsCodexThreadId(l.activity.childThreadId))throw new Error(`deferred Codex subagent child owner disappeared for ${l.activity.childThreadId??l.activity.key}`);if(!Va(p,l.frame.method,l.frame.params,e,{captureAuthority:l.activity.captureAuthority}))return;let g=l.activity.childFrames.filter(({sequence:m})=>m!==l.frame.sequence);!l.activity.activityPending&&l.activity.parentFrames.length===0&&g.length===0?t.delete(l.activity.key):t.set(l.activity.key,{...l.activity,childFrames:g})}u(c)};return{dispatch:(c,l,p)=>{if(!r){u(c);let _=_0(p);if(_!==void 0&&y0.has(l)){let b=[...t.values()].filter(({activityPending:C,childThreadId:T})=>C&&T===_);if(b.length>1)throw new Error(`multiple deferred Codex subagent edges claim child ${_}`);let w=[...t.values()].filter(({activityPending:C,parentThreadId:T})=>C&&T===_).sort((C,T)=>C.sequence-T.sequence)[0],v=b[0],S=w??v;if(S!==void 0){if(i()>=1e3)throw new Error("deferred Codex subagent activity and frames exceeded 1000 entries");let C={sequence:o++,method:l,params:p};t.set(S.key,{...S,...w!==void 0?{parentFrames:[...S.parentFrames,C]}:{childFrames:[...S.childFrames,C]}}),e("codex.subagent_activity_parent_unresolved",{phase:w!==void 0?"post_disable_parent_terminal_deferred":"post_disable_child_terminal_deferred",parent_thread_id:S.parentThreadId,child_thread_id:S.childThreadId??null,item_id:S.itemId??null,method:l}),u(c);return}}for(let b of c)Va(b,l,p,e);return}u(c);let f=s(l,p);if(f===void 0){let _=_0(p),b=_===void 0?[]:[...t.values()].filter(({childThreadId:C,activityPending:T})=>T&&C===_);if(b.length>1)throw new Error(`multiple deferred Codex subagent edges claim child ${_}`);let w=b[0],v=_===void 0?void 0:[...t.values()].filter(({parentThreadId:C,activityPending:T})=>T&&C===_).sort((C,T)=>C.sequence-T.sequence)[0],S=v??w;if(S!==void 0){if(i()>=1e3)throw new Error("deferred Codex subagent activity and frames exceeded 1000 entries");let C={sequence:o++,method:l,params:p};t.set(S.key,{...S,...v!==void 0?{parentFrames:[...S.parentFrames,C]}:{childFrames:[...S.childFrames,C]}}),e("codex.subagent_activity_parent_unresolved",{phase:v!==void 0?"parent_frame_deferred":"child_frame_deferred",parent_thread_id:S.parentThreadId,child_thread_id:S.childThreadId??null,item_id:S.itemId??null,method:l});return}for(let C of c)Va(C,l,p,e);u(c);return}let g=d(f.parentThreadId,f.key);if(g!==void 0){if(i()>=1e3&&!t.has(f.key))throw new Error("deferred Codex subagent activity exceeded 1000 entries");let _=t.get(f.key);t.set(f.key,{...f,sequence:_?.sequence??o++,parentFrames:_?.parentFrames??[],childFrames:_?.childFrames??[]}),e("codex.subagent_activity_parent_unresolved",{phase:"nested_activity_deferred",parent_thread_id:f.parentThreadId,child_thread_id:f.childThreadId??null,item_id:f.itemId??null,blocked_by_parent_thread_id:g.parentThreadId,blocked_by_item_id:g.itemId??null,method:l});return}let m=a(c,f.parentThreadId);if(m===void 0){if(i()>=1e3&&!t.has(f.key))throw new Error("deferred Codex subagent activity exceeded 1000 entries");let _=t.get(f.key);t.set(f.key,{...f,sequence:_?.sequence??o++,parentFrames:_?.parentFrames??[],childFrames:_?.childFrames??[]}),e("codex.subagent_activity_parent_unresolved",{phase:"deferred",parent_thread_id:f.parentThreadId,child_thread_id:f.childThreadId??null,item_id:f.itemId??null,method:l});return}if(!Va(m,l,p,e))throw new Error(`Codex subagent activity owner dispatch failed for ${f.parentThreadId}`);u(c)},reconcile:c=>{u(c)},setEnabled:c=>{if(!c&&r&&t.size>0){let l=[...t.values()],p=new Map(l.map(_=>[_.key,_.childFrames.filter(({method:b})=>y0.has(b))])),f=new Map(l.map(_=>[_.key,_.parentFrames.filter(({method:b})=>y0.has(b))])),g=new Set,m=_=>{if(g.has(_.key))return;g.add(_.key);let b=d(_.parentThreadId,_.key);b!==void 0&&m(b)};for(let _ of l){let b=p.get(_.key)?.length??0,w=f.get(_.key)?.length??0;_.activityPending&&b===0&&w===0&&m(_),b>0&&m(_),w>0&&(d(_.parentThreadId,_.key)!==void 0||_.childFrames.length>0)&&m(_)}for(let _ of l){e("codex.subagent_activity_parent_unresolved",{phase:"feature_disabled",parent_thread_id:_.parentThreadId,child_thread_id:_.childThreadId??null,item_id:_.itemId??null,method:_.method,buffered_frame_count:_.parentFrames.length+_.childFrames.length});let b=p.get(_.key)??[];if(_.parentFrames.length===0&&b.length===0&&!g.has(_.key))t.delete(_.key);else{let w=g.has(_.key)?_.childFrames:b;t.set(_.key,{..._,activityPending:g.has(_.key),childFrames:w})}}}r=c},close:()=>{for(let c of t.values())e("codex.subagent_activity_parent_unresolved",{phase:"runner_close",parent_thread_id:c.parentThreadId,child_thread_id:c.childThreadId??null,item_id:c.itemId??null,method:c.method,buffered_frame_count:c.parentFrames.length+c.childFrames.length});t.clear()}}}async function Bqe(e){return e.closePromise!==void 0||(e.closePromise=(async()=>{let n=[];e.removeHandlers?.(),e.removeHandlers=void 0;for(let t of[...e.actions].reverse())try{await t()}catch(r){n.push(r instanceof Error?r:new Error(String(r)))}if(e.actions.splice(0),n[0]!==void 0)throw n[0]})()),e.closePromise}async function SZ(e){let n=new Map,t=[!1,!0];for(let r of t){let o=await e.request("thread/list",{limit:50,sortKey:"updated_at",sortDirection:"desc",sourceKinds:["subAgentThreadSpawn"],archived:r,useStateDbOnly:!0});if("error"in o)throw new Error(`thread/list failed: ${o.error.message}`);let s=E(o.result)?.data;if(!Array.isArray(s))throw new Error("thread/list result.data must be an array");if(!s.every(ne))throw new Error("thread/list result.data entries must be objects");for(let a of s){let d=fQ(a),u=Kqe(a,r);n.has(d)||n.set(d,u)}}return Array.from(n.values()).sort(Vqe)}function Qs(e,n,t){let r=n.flatMap(i=>{let s=e[i];if(s==null)return[];if(typeof s!="string")throw new Error(`thread/list ${t} must be a string (${i})`);return[s]}),o=r[0];if(o!==void 0&&r.some(i=>i!==o))throw new Error(`thread/list ${t} aliases disagree`);return o}function uM(e,n,t){if(e!==void 0&&n!==void 0&&e!==n)throw new Error(`thread/list ${t} source and thread values disagree`);return e??n}function Jqe(e){let n=Qs(e,["parentThreadId","parent_thread_id"],"parent thread id"),t=Qs(e,["agentNickname","agent_nickname"],"agent nickname"),r=Qs(e,["agentRole","agent_role"],"agent role"),o={...n===void 0?{}:{parentThreadId:n},...t===void 0?{}:{agentNickname:t},...r===void 0?{}:{agentRole:r}},i=e.source;if(typeof i=="string"){if(i==="subAgentThreadSpawn"&&(n===void 0||n.trim()===""))throw new Error("thread/list subagent spawn requires a parent thread id");return{source:i,...o}}let s=E(i);if(s===void 0)throw new Error("thread/list thread source must be a string or object");let a=Qs(s,["custom"],"custom source");if(a!==void 0)return{source:a,...o};let d=Qs(s,["internal"],"internal source");if(d!==void 0)return{source:d,...o};let u=[s.subAgent,s.subagent].filter(b=>b!==void 0);if(u.length!==1)throw new Error("thread/list structured source requires exactly one subAgent/subagent value");let c=u[0];if(c==="review")return{source:"subAgentReview",...o};if(c==="compact")return{source:"subAgentCompact",...o};if(c==="memory_consolidation")return{source:"subAgentOther",...o};let l=E(c);if(l===void 0)throw new Error("thread/list subagent source has an unknown shape");let p=[E(l.thread_spawn),E(l.threadSpawn)].filter(b=>b!==void 0),f=p[0];if(f===void 0){if(Qs(l,["other"],"subagent other source")!==void 0)return{source:"subAgentOther",...o};throw new Error("thread/list subagent source has an unknown shape")}if(p.length!==1)throw new Error("thread/list subagent source has conflicting spawn variants");let g=uM(Qs(f,["parent_thread_id","parentThreadId"],"subagent parent thread id"),n,"parent thread id");if(g===void 0||g.trim()==="")throw new Error("thread/list subagent spawn requires a parent thread id");let m=uM(Qs(f,["agent_nickname","agentNickname"],"subagent nickname"),t,"agent nickname"),_=uM(Qs(f,["agent_role","agentRole"],"subagent role"),r,"agent role");return{source:"subAgentThreadSpawn",parentThreadId:g,...m===void 0?{}:{agentNickname:m},..._===void 0?{}:{agentRole:_}}}function Kqe(e,n){let t=fQ(e),r=E(e.gitInfo),o=y(e.preview)??"",i=y(e.name)??"",s=y(e.title)??(i===""?o:i),a=y(e.description)??y(e.summary)??o;return{id:t,title:s??"",description:a??"",preview:o.replace(/\s+/g," ").trim(),cwd:y(e.cwd)??"",...Jqe(e),createdAt:kZ(e.createdAt),updatedAt:kZ(e.updatedAt),archived:n,modelProvider:y(e.modelProvider)??"",cliVersion:y(e.cliVersion)??"",gitBranch:y(r?.branch)??"",gitOriginUrl:y(r?.originUrl)??"",path:y(e.path)??""}}function fQ(e){let n=e.id;if(typeof n!="string"||n.trim()==="")throw new Error("thread/list thread id must be a non-empty string");return n}function kZ(e){return typeof e=="number"&&Number.isFinite(e)?new Date(e*1e3).toISOString():y(e)??""}function Vqe(e,n){let t=E(e),r=E(n),o=Date.parse(y(t?.createdAt)??y(t?.updatedAt)??""),i=Date.parse(y(r?.createdAt)??y(r?.updatedAt)??"");return CZ(o)-CZ(i)}function CZ(e){return Number.isFinite(e)?e:Number.MAX_SAFE_INTEGER}function Wqe(e){if("error"in e)throw new Error(`thread/start failed: ${e.error.message}`);return y(E(E(e.result)?.thread)?.id)}function Ro(e){let n=e?.trim();return n===void 0||n===""?void 0:n}function IM(e){let n=Ro(e.projectSharedInstructions),t=Ro(e.projectPersonalInstructions),r=Ro(e.projectMemory);return{projectBound:e.projectId!==void 0||e.projectPublicId!==void 0||n!==void 0||t!==void 0||r!==void 0,projectSharedInstructions:n,projectPersonalInstructions:t,projectMemory:r}}function Hqe(e){return($e(e)??[]).flatMap(t=>{let r=E(t),o=y(r?.runnerId);return o===void 0?[]:[{runnerId:o,version:y(r?.version)??null}]})}function TZ(e){if(e===void 0)return{type:"missing"};let n=E(e);if(n===void 0)return{type:"invalid",reason:"runner_config_not_object"};let t=$e(n.allowedCwds);if(t===void 0)return{type:"invalid",reason:"allowed_cwds_not_array"};let r=[];for(let[s,a]of t.entries()){let d=y(a);if(d===void 0)return{type:"invalid",reason:`allowed_cwd_${s}_not_string`};r.push(d)}let o=n.configVersion,i=o==null?null:Y(o);return i===void 0?{type:"invalid",reason:"config_version_not_integer"}:{type:"ok",config:{allowedCwds:r,configVersion:i}}}function Hh(e){let n=E(e),t=E(n?.runner_config);if(t===void 0||!Object.prototype.hasOwnProperty.call(t,"multiAgentJobsEnabled"))return!1;let r=t.multiAgentJobsEnabled;if(typeof r!="boolean")throw new Error("runner_config.multiAgentJobsEnabled must be a boolean when present");return r}function cM(e){let n=E(e),t=E(n?.runner_config);if(t===void 0||!Object.prototype.hasOwnProperty.call(t,"documentSurfacesEnabled"))return!1;let r=t.documentSurfacesEnabled;if(typeof r!="boolean")throw new Error("runner_config.documentSurfacesEnabled must be a boolean when present");return r}function PZ(e){let n=e.linzumiAgentMcpToken??e.codingJobMcpToken;return n===void 0?!1:Rf(n)}function Gqe(e){let n=E(e);if(E(n?.runner_config)?.rosterEnabled!==!0)return;let r=E(n?.roster),o=r===void 0?void 0:$e(r.threads);if(o===void 0)return;let i=[],s=0;for(let a of o){let d=E(a),u=y(d?.kandan_thread_id);if(u===void 0){s+=1;continue}let c=y(d?.last_activity_at),l=c===void 0?Number.NaN:Date.parse(c),p=d?.channel_id,f=Y(p),g=y(p)??(f===void 0?null:String(f));i.push({kandanThreadId:u,providerSessionKey:y(d?.provider_session_key)??null,channelId:g,title:y(d?.title)??null,channelSlug:y(d?.channel_slug)??null,cwd:y(d?.cwd)??null,lastActivityAtMs:Number.isNaN(l)?null:l})}return{threads:i,truncated:r?.truncated===!0,skippedEntries:s}}function Zqe(e){return e.appliedModel!==void 0||e.appliedApprovalPolicy!==void 0||e.appliedReasoningEffort!==void 0||e.controlSandbox!==void 0}function Qqe(e){if(e.debugTrace===void 0)return;let n=new Date().toISOString();return ML({dir:e.debugTrace.dir,contentMode:e.debugTrace.contentMode,runId:[n,"pid",String(process.pid),"runner",e.runnerId].join("-"),manifest:{pid:process.pid,argv:OL(process.argv),runnerId:e.runnerId,cwd:e.cwd,kandanUrl:e.kandanUrl,workspaceSlug:e.workspaceSlug??null,threadProcess:e.threadProcess??null,fast:e.fast===!0,startedAt:n}})}function RM(e){let n=e.launchTui&&e.consoleReporter===void 0?void 0:(r,o)=>{e.launchTui||aA(r,o),e.consoleReporter?.(r,o)},t=e.logFile??y_();return t8(t),mb("runner_process"),pF(t,n)}function n6e(e,n,t,r){let o=iG({steps:{stopAccepting:()=>{n.stopAccepting()},interruptInFlightTurns:()=>n.interruptInFlightTurns().catch(s=>{t("runner.drain_interrupt_states_failed",{message:s instanceof Error?s.message:String(s)})}),checkpointCurrentTurn:()=>{},flushInboundQueues:()=>{n.flushInboundQueues()},flushOutbox:()=>e().catch(()=>{})},deadlineMs:Xqe,log:(s,a)=>t(s,a),exit:(s,a)=>{let d=Y5(a),u={log:(c,l)=>t(c,l)};Gv({trigger:d},u),XA({signal:a,stop:r?.supervisorStop,finishExit:()=>n8(s,{trigger:d,stdinWasTty:process.stdin.isTTY===!0,stdoutWasTty:process.stdout.isTTY===!0},{sinks:u})})},signals:r?.signals??["SIGTERM","SIGINT","SIGHUP"]}),i=()=>{e().catch(()=>{})};return process.once("exit",i),{uninstall:()=>{o.uninstall(),process.off("exit",i)},triggerFastExitDrain:s=>o.trigger(s)}}async function t6e(e,n,t){try{return e()}catch(r){if(!NE(r))throw r;t("runner.lock_held_by_live_process",{runnerId:n.runnerId,heldByRunnerId:r.heldBy.runnerId,heldByPid:r.heldBy.pid,lockPath:r.lockPath});let o=n.lockTakeover,i=RZ(r.lockPath,o?.takeover,t),s=_u(r.heldBy,i.isPidAlive,()=>new Date(i.now()));if(MV(r.heldBy,Xt,n.launchSource,s)){t("runner.lock_auto_takeover_for_update",{runnerId:n.runnerId,heldByRunnerId:r.heldBy.runnerId,heldByPid:r.heldBy.pid,lockPath:r.lockPath,fromVersion:r.heldBy.cliVersion,toVersion:Xt,launchSource:Uv,holderState:s.state});let c=o?.prompt??IZ(o);return await HE({holder:r.heldBy,lockPath:r.lockPath,baseMessage:r.message,takeOverWithoutPrompt:!0,prompt:c,takeover:i}),e()}if(!XV(o))throw r;let a=o.prompt??IZ(o),d=RZ(r.lockPath,o.takeover,t);if((await HE({holder:r.heldBy,lockPath:r.lockPath,baseMessage:r.message,takeOverWithoutPrompt:o.takeOverWithoutPrompt===!0,prompt:a,takeover:d})).outcome==="declined")throw new Dh;return t("runner.lock_takeover_interactive",{runnerId:n.runnerId,heldByRunnerId:r.heldBy.runnerId,heldByPid:r.heldBy.pid,lockPath:r.lockPath}),e()}}function IZ(e){return{isInteractive:()=>e?.forceNonInteractive!==!0&&Mh()&&process.stdin.isTTY===!0&&process.stderr.isTTY===!0,writeReport:n=>{process.stderr.write(`${n}
1626
+ `)},promptYesNo:n=>r6e(n)}}function r6e(e){return new Promise(n=>{let t=M$e({input:process.stdin,output:process.stderr});t.question(e,r=>{t.close(),n(/^y(es)?$/i.test(r.trim()))})})}function RZ(e,n,t){return{isPidAlive:n?.isPidAlive??o6e,signalPid:n?.signalPid??((r,o)=>{process.kill(r,o)}),lockReleased:n?.lockReleased??(()=>!cp(e)),currentLockOwner:n?.currentLockOwner??(()=>gu(e)),sleep:n?.sleep??GV,now:n?.now??(()=>Date.now()),log:n?.log??((r,o)=>{t(r,o),ye(r,o)})}}function o6e(e){try{return process.kill(e,0),!0}catch(n){return(n!==null&&typeof n=="object"&&"code"in n?n.code:void 0)!=="ESRCH"}}function i6e(e,n,t,r,o,i){let s=d6e(n,r,o,i);ye("process.spawn",{command:e,args:s,cwd:t,purpose:"codex.tui"});let a=C0(e,s,{cwd:t,env:process.env,stdio:"inherit"});return ye("process.spawned",{command:e,args:s,cwd:t,pid:a.pid,purpose:"codex.tui"}),a.once("exit",(d,u)=>{ye("process.exit",{command:e,args:s,cwd:t,pid:a.pid,code:d,signal:u,purpose:"codex.tui"})}),a}async function s6e(e){await Promise.all(Array.from(e,n=>n.handleKandanReconnect()))}function a6e(e,n){if(!Array.isArray(e))return;let t=e.find(r=>ne(r)&&typeof r.name=="string"&&r.name.toLowerCase()===n.toLowerCase()&&typeof r.value=="string");return ne(t)&&typeof t.value=="string"?t.value:void 0}function d6e(e,n,t,r){let o=c6e(t,r);return n===void 0?["--remote",e,...o]:["resume","--remote",e,...o,n]}function u6e(e,n){let t=new Set(n);return e!==void 0&&t.add(e),Array.from(t).sort((r,o)=>r-o)}function CM(e){let n=new URL(e);if(n.port==="")return;let t=Number.parseInt(n.port,10);if(!Number.isInteger(t)||t<=0||t>65535)throw new Error(`invalid Kandan URL port: ${e}`);return t}function c6e(e,n){let t=e?.model===void 0?[]:["--model",e.model],r=e?.reasoningEffort===void 0?[]:["-c",`model_reasoning_effort="${e.reasoningEffort}"`],o=n===!0?["-c",'service_tier="fast"']:[];return[...t,...r,...o]}async function l6e(e,n){let t=await e.request("thread/resume",{threadId:n});if(!("error"in t))return;if(!t.error.message.includes("no rollout found"))throw new Error(`failed to prepare Codex TUI resume: ${t.error.message}`);let r=await e.request("thread/inject_items",{threadId:n,items:[{type:"agentMessage",text:""}]});if("error"in r)throw new Error(`failed to prepare Codex TUI resume: ${r.error.message}`);let o=await e.request("thread/resume",{threadId:n});if("error"in o)throw new Error(`failed to verify Codex TUI resume: ${o.error.message}`)}async function p6e(e,n,t,r){if(t.workspace===void 0||t.channel===void 0||t.threadId===void 0)return[];try{let o=await e.push(n,"session:thread_context",{workspace:t.workspace,channel:t.channel,thread_id:t.threadId});if(ne(o)&&o.status==="ok"&&ne(o.response))return ux(o.response.messages);r("kandan.reconnect_thread_context_fetch_failed",{thread_id:t.threadId,reply:JSON.stringify(o).slice(0,300)})}catch(o){r("kandan.reconnect_thread_context_fetch_failed",{thread_id:t.threadId,message:o instanceof Error?o.message:String(o)})}return[]}async function m6e(e,n,t,r){if(!(t.workspace===void 0||t.channel===void 0||t.threadId===void 0))try{let o=[],i,s,a,d=0;for(let u=0;u<f6e;u+=1){let c=await e.push(n,"session:thread_transcript",{workspace:t.workspace,channel:t.channel,thread_id:t.threadId,...a===void 0?{}:{cursor:a}});if(!ne(c)||c.status!=="ok"||!ne(c.response))return r("kandan.reconnect_thread_transcript_fetch_failed",{thread_id:t.threadId,page:u,reply:JSON.stringify(c).slice(0,300)}),u===0?void 0:{nodes:o,budget:i,threadTitle:s};let l=xK(c.response);if(l===void 0)return u===0?void 0:{nodes:o,budget:i,threadTitle:s};i=i??l.budget,s=s??l.threadTitle,o=[...l.nodes,...o],d+=l.nodes.reduce((g,m)=>m.kind==="reasoning"?g:g+m.body.length,0);let p=i?.maxEmissionTokens,f=p!==void 0&&d/4>=p;if(!l.hasMore||l.cursor===void 0||f)break;a=l.cursor}return{nodes:o,budget:i,threadTitle:s}}catch(o){r("kandan.reconnect_thread_transcript_fetch_failed",{thread_id:t.threadId,message:o instanceof Error?o.message:String(o)})}}async function EZ(e,n,t,r,o,i){i("kandan.reconnect_thread_unarchive_started",{codex_thread_id:n,discovered_by:r,message:o});try{let s=await Si("thread/unarchive",e.request("thread/unarchive",{threadId:n}));if("error"in s)throw new Error(`thread/unarchive failed: ${s.error.message}`);let a=await Si("thread/resume",e.request("thread/resume",t));if("error"in a)throw new Error(`thread/resume after unarchive failed: ${a.error.message}`);return i("kandan.reconnect_thread_unarchive_resumed",{codex_thread_id:n,discovered_by:r}),{mode:"resumed"}}catch(s){let a=s instanceof Error?s.message:String(s);throw i("kandan.reconnect_thread_unarchive_failed",{codex_thread_id:n,discovered_by:r,archive_error:o,message:a}),new Error(r==="forced_inject_not_found"?`thread/inject_items failed: ${o}; archive recovery failed: ${a}`:a)}}async function y6e(e,n,t,r){let o={threadId:n,...t},i;if(r.forceRehydrate===!0)i="the server marked the durable engine session dead after an acknowledged-but-unexecuted turn";else{let a=await Si("thread/resume",e.request("thread/resume",o));if(!("error"in a))return{mode:"resumed"};if(h6e(a.error.message))return await EZ(e,n,o,"resume_archived",a.error.message,r.log);i=a.error.message}r.log(r.forceRehydrate===!0?"kandan.reconnect_thread_rehydrate_forced":"kandan.reconnect_thread_resume_failed",{codex_thread_id:n,message:i,forced:r.forceRehydrate===!0,rehydrating:!0});let s;try{let a;try{a=await r.buildRehydrationItems?.(i)}catch(c){r.log("kandan.reconnect_thread_rehydration_items_failed",{codex_thread_id:n,message:c instanceof Error?c.message:String(c)}),a=void 0}let d=a!==void 0&&a.length>0?[...a]:[{type:"agentMessage",text:await r.buildRehydrationText(i)}],u=await Si("thread/inject_items",e.request("thread/inject_items",{threadId:n,items:d}));if("error"in u){if(r.forceRehydrate===!0&&g6e(u.error.message))return await EZ(e,n,o,"forced_inject_not_found",u.error.message,r.log);s=`thread/inject_items failed: ${u.error.message}`}else{let c=await Si("thread/resume",e.request("thread/resume",o));"error"in c&&(s=`rehydrated thread/resume failed: ${c.error.message}`)}}catch(a){s=a instanceof Error?a.message:String(a)}if(s!==void 0)throw r.log("kandan.reconnect_thread_rehydration_failed",{codex_thread_id:n,resume_failure:i,rehydration_failure:s}),new Error(`could not resume this thread's engine session (${i}) and rebuilding a fresh session from the thread transcript also failed (${s})`);return r.log("kandan.reconnect_thread_rehydrated",{codex_thread_id:n,resume_failure:i}),{mode:"rehydrated",resumeFailure:i}}async function _6e(e,n,t,r,o){let i="agent_provider_unavailable:codex";if(o("kandan.start_instance_codex_app_server_unavailable",{controlType:r.type,thread_id:ro(r)??null,instanceId:t}),r.type==="start_instance"||r.type==="reconnect_thread")try{await oo(e,n,r,"failed",i,{instanceId:t,failureClass:"engine_unavailable"})}catch(s){o("kandan.start_instance_unavailable_state_push_failed",{agent_provider:"codex",message:s instanceof Error?s.message:String(s)})}throw new Error(i)}async function lM(e,n,t,r,o,i,s,a,d,u,c,l,p,f,g,m,_,b,w,v,S,C,T,P,O,R,j,B){if(e===void 0)switch(m.type){case"remote_codex_exec":case"remote_codex_exec_cancel":return await pM(m,r,a.value,d,u,_);case"list_agent_slash_commands":case"resolve_claude_user_input_request":case"deny_claude_user_input_request":case"resolve_codex_user_input_request":case"deny_codex_user_input_request":break;case"compact_thread":case"review_thread":if(m.agentProvider!=="claude-code")return{instanceId:r,controlType:m.type,requestId:m.requestId.trim()||null,ok:!1,error:"agent_provider_unavailable:codex"};break;case"clone_repository":break;case"set_workspace_viewport":break;case"start_instance":case"reconnect_thread":{let D=ap(m);if(D.type==="ok"&&D.provider==="claude-code"||v!==void 0)break;return await _6e(n,t,r,m,_)}default:return{instanceId:r,controlType:m.type,requestId:"requestId"in m?y(m.requestId)??null:null,ok:!1,error:"agent_provider_unavailable:codex"}}let K=()=>{if(e===void 0)throw new Error("shared codex app-server connection is unavailable");return e};switch(m.type){case"set_workspace_viewport":return Tqe(o.kandanUrl,m.url),{instanceId:r,controlType:m.type,ok:!0,url:m.url};case"compact_thread":{let D=m.requestId.trim(),J=y(m.providerSessionKey)?.trim()??"",W=m.agentProvider??"codex";if(D==="")return{instanceId:r,controlType:m.type,requestId:null,ok:!1,error:"request_id_required"};if(W!=="codex")return{instanceId:r,controlType:m.type,requestId:D,ok:!1,error:`agent_compaction_unsupported:${W}`};if(J==="")return{instanceId:r,controlType:m.type,requestId:D,ok:!1,error:"provider_session_key_required"};let H=await K().request("thread/compact/start",{threadId:J});return"error"in H?{instanceId:r,controlType:m.type,requestId:D,ok:!1,error:`codex_compaction_failed:${H.error.message}`}:{instanceId:r,controlType:m.type,requestId:D,ok:!0,threadId:m.threadId,providerSessionKey:J}}case"start_instance":{let D=no(m.cwd,a.value),J=ap(m),W="starting_codex_session",H;switch(J.type){case"ok":break;case"unsupported":return{instanceId:r,controlType:m.type,ok:!1,error:`agent_provider_unsupported:${J.value}`}}let X=J.provider;if(!D.ok){_("kandan.start_instance_cwd_rejected",{thread_id:ro(m)??null,reason:D.reason,allowedCwdCount:a.value.length});try{await JZ(n,t,m,D.reason,a.value,{instanceId:r})}catch(we){_("kandan.start_instance_cwd_failed_state_push_failed",{reason:D.reason,message:we instanceof Error?we.message:String(we)})}return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:D.reason,allowedCwds:a.value}}let be=await s(X),Re=g0({agentProvider:X,modelProvider:y(m.modelProvider),model:y(m.model),modelTransportCatalogStatus:SM(m,_),llmProxyBinding:wM(m.llmProxy),hasNativeCodexAuth:be.hasNativeCodexAuth},Ma,be.agentProviders);if(Re.type==="blocked"){_("linzumi.start_instance_model_account_preflight_rejected",{agent_provider:X,model_provider:y(m.modelProvider)??null,model:y(m.model)??"default",reason:Re.code,discriminator:Re.reason});try{await oo(n,t,m,"failed",Re.message,{instanceId:r,failureClass:"provider_binding_rejected",modelAccountRejection:{identity:Re.identity,reason:Re.reason}})}catch(we){_("linzumi.start_instance_model_account_state_push_failed",{message:we instanceof Error?we.message:String(we)})}return{instanceId:r,controlType:m.type,ok:!1,error:Re.code}}let ie=Wa(m,"processing",`starting ${R6e(X)} session`,{instanceId:r});ie!==void 0&&n.push(t,"message_state",ie).catch(we=>{_("kandan.start_instance_processing_state_push_failed",{message:we instanceof Error?we.message:String(we)})});try{let we=await v?.(m,D.cwd);if(we!==void 0)return we;if(X==="codex"){let Oe=OZ(o,m);if(Oe!==void 0){try{await oo(n,t,m,"failed",Oe,{instanceId:r,failureClass:"provider_binding_rejected"})}catch(bn){_("kandan.start_instance_wafer_state_push_failed",{message:bn instanceof Error?bn.message:String(bn)})}return{instanceId:r,controlType:m.type,ok:!1,error:Oe}}}return X==="claude-code"?(W="starting_claude_code_session",(await jZ({kandan:n,topic:t,control:m,options:o,log:_,debugTrace:b,instanceId:r,cwd:D.cwd,matchedRoot:D.matchedRoot,activeClaudeCodeSessions:c,pendingClaudeCodeApprovals:l,pendingClaudeCodeUserQuestions:p,ensureClaudeCodeForwardPortSession:f,disposeClaudeCodeForwardPortSession:g,resumeSessionId:Ro(m.resumeSessionId),leaseEpochFor:C,onLiveSourceSeqAccepted:T,onUndeliveredFollowUpsAtClose:O,claudeThreadAccessStore:B,setStartupStage:bn=>{W=bn}})).controlResponse):(await yQ({codex:K(),kandan:n,topic:t,control:m,options:o,instanceId:r,cwd:D.cwd,matchedRoot:D.matchedRoot,onStartedThread:w,startAgentReplayCodex:S,setStartupStage:Oe=>{W=Oe},setStartedCodexThreadId:Oe=>{H=Oe}})).controlResponse}catch(we){let qe=AZ(W,we);_("kandan.start_instance_failed",{stage:W,message:we instanceof Error?we.message:String(we),thread_id:fn(m,"threadId")??null,source_seq:Y(m.sourceSeq)??Y(m.rootSeq)??null,codex_thread_id:H??null});try{X==="claude-code"?await BZ({kandan:n,topic:t,control:m,failureReason:qe,rawFailureText:we instanceof Error?we.message:String(we),failureClass:fM(W),codexThreadId:H,instanceId:r,log:_}):await oo(n,t,m,"failed",qe,{codexThreadId:H,instanceId:r,failureClass:fM(W)})}catch{}throw we}}case"reconnect_thread":{let D=no(m.cwd,a.value),J=ap(m),W=y(m.transportCeilingRecoveryRequestId),H="starting_codex_session";if(!D.ok){try{await JZ(n,t,m,D.reason,a.value,{instanceId:r})}catch(un){_("kandan.reconnect_thread_cwd_failed_state_push_failed",{reason:D.reason,message:un instanceof Error?un.message:String(un)})}return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:D.reason,allowedCwds:a.value}}switch(J.type){case"ok":break;case"unsupported":return{instanceId:r,controlType:m.type,ok:!1,error:`agent_provider_unsupported:${J.value}`}}let X=J.provider,be=await s(X),Re=g0({agentProvider:X,modelProvider:y(m.modelProvider),model:y(m.model),modelTransportCatalogStatus:SM(m,_),llmProxyBinding:wM(m.llmProxy),hasNativeCodexAuth:be.hasNativeCodexAuth},Ma,be.agentProviders);if(Re.type==="blocked"){_("linzumi.reconnect_thread_model_account_preflight_rejected",{agent_provider:X,model_provider:y(m.modelProvider)??null,model:y(m.model)??"default",reason:Re.code,discriminator:Re.reason});try{await oo(n,t,m,"failed",Re.message,{instanceId:r,failureClass:"provider_binding_rejected",modelAccountRejection:{identity:Re.identity,reason:Re.reason}})}catch(un){_("linzumi.reconnect_thread_model_account_state_push_failed",{message:un instanceof Error?un.message:String(un)})}return{instanceId:r,controlType:m.type,ok:!1,error:Re.code}}let ie=Ro(m.codexThreadId);if(ie===void 0)return{instanceId:r,controlType:m.type,ok:!1,error:"missing_codex_thread_id"};let we=Ro(m.workDescription),qe=await v?.(m,D.cwd);if(qe!==void 0)return qe;if(X==="codex"){let un=OZ(o,m);if(un!==void 0)return{instanceId:r,controlType:m.type,ok:!1,error:un}}if(X==="claude-code"){let un=c.get(ie);if(un!==void 0&&we!==void 0){let je=Y(m.rootSeq),Xe=Y(m.sourceSeq)??je,_e=ae=>{let pe=ae.disposition==="parked"?Wa(m,"queued",rl(ae.queuePosition),{instanceId:r,codexThreadId:ie}):Wa(m,"processing","queued Claude Code input",{instanceId:r,codexThreadId:ie});pe!==void 0&&n.push(t,"message_state",pe).catch(Te=>{_("kandan.reconnect_thread_queue_state_push_failed",{message:Te instanceof Error?Te.message:String(Te)})})},q=vi($e(m.attachments)??[]),F=await DC({cwd:D.cwd,kandanUrl:o.kandanUrl,token:o.token,fetch:o.fetch,attachmentDirectoryName:"local-claude-code-attachments"},{seq:Xe,body:we,attachments:q}).then(ae=>({ok:!0,content:ae})).catch(ae=>({ok:!1,error:ae}));if(!F.ok){let ae=F.error instanceof Error?F.error.message:String(F.error),pe=`Claude Code input attachment download failed: ${ae}`;try{await oo(n,t,m,"failed",pe,{instanceId:r,codexThreadId:ie,failureClass:"attachment_download_failed"})}catch(Te){_("kandan.reconnect_thread_queue_failed_state_push_failed",{message:Te instanceof Error?Te.message:String(Te)})}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_attachment_download_failed",message:ae}}let z=fn(m,"threadId"),V=fn(m,"channel");if(Xe!==void 0&&z!==void 0&&V!==void 0&&P?.(V,z,{seq:Xe,type:"thread.message",actorKind:void 0,actorSlug:void 0,actorUserId:void 0,threadId:z,threadTitle:void 0,replyToSeq:Y(m.rootSeq),localRunnerEventType:void 0,body:we,attachments:q,traceparent:y(m.traceparent)}),V!==void 0&&z!==void 0&&R?.({channel:V,threadId:z,sourceSeq:Xe,transportCeilingRecoveryRequestId:W})===!0)return _("claude_code.message_duplicate_ignored",{linzumi_thread_id:z,claude_session_id:ie,body_preview:Pu(we),source_seq:Xe??null}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,queuedInput:!0,duplicate:!0};await dm({cwd:D.cwd,threadKey:un.threadId,turnRef:Xe===void 0?`followup-${Date.now()}`:`seq-${Xe}`,log:(ae,pe)=>_(ae,pe)});try{let ae=un.enqueueInput({content:F.content,sourceSeq:Xe});if(ae==="duplicate")return _("claude_code.message_duplicate_ignored",{linzumi_thread_id:fn(m,"threadId")??null,claude_session_id:ie,body_preview:Pu(we),source_seq:Xe??null}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,queuedInput:!0,duplicate:!0};_e(ae),_("claude_code.message_queued",{linzumi_thread_id:fn(m,"threadId")??null,claude_session_id:ie,body_preview:Pu(we),message_received_at_ms:Date.now(),source_seq:Xe??null}),b?.record("commander","claude.input_queued",{linzumiThreadId:fn(m,"threadId")??null,claudeSessionId:ie,sourceSeq:Xe??null,bodyPreview:Pu(we)})}catch(ae){let pe=ae instanceof Error?ae.message:String(ae),Te=`Claude Code input queue closed: ${pe}`;try{await oo(n,t,m,"failed",Te,{instanceId:r,codexThreadId:ie,failureClass:"claude_input_queue_closed"})}catch(Z){_("kandan.reconnect_thread_queue_closed_state_push_failed",{message:Z instanceof Error?Z.message:String(Z)})}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_session_closed",message:pe}}if(Xe!==void 0){let ae=Xe,pe=un,Te="Claude Code session did not respond after resume - send your message again to start fresh",Z=j;Db({windowMs:Z?.windowMs??uh(process.env),isDelivered:()=>pe.inputDelivered(ae),isSessionClosed:()=>Pi(c,[ie],[pe.threadId])===void 0,lastSdkActivityMs:()=>pe.lastSdkActivityMs(),hasPendingBlockingRequest:()=>tg({threadId:pe.threadId,pendingApprovals:l,pendingQuestions:p}),log:_,onWedged:de=>{let ue=Z?.recordWedge(pe.threadId,ae)??Number.MAX_SAFE_INTEGER;_("claude_code.dispatch_liveness_wedged",{linzumi_thread_id:pe.threadId,claude_session_id:ie,source_seq:ae,waited_ms:de.waitedMs,cause:de.cause,attempt:Z===void 0?null:ue,dispatch:"queued_input"});let en=()=>{Z?.clear(pe.threadId,ae),oo(n,t,m,"failed",Te,{instanceId:r,codexThreadId:ie,failureClass:"claude_dispatch_wedged"}).catch(Ye=>{_("claude_code.dispatch_wedged_state_push_failed",{linzumi_thread_id:pe.threadId,source_seq:ae,message:Ye instanceof Error?Ye.message:String(Ye)})})};if(Z!==void 0&&ue===1){oo(n,t,m,"processing","restarting Claude Code session to recover this message",{instanceId:r,codexThreadId:ie}).catch(()=>{}),Z.killAndRespawn({threadId:pe.threadId,claudeSessionId:ie,reason:`claude_dispatch_liveness: no SDK output within ${de.waitedMs}ms of queued input (seq ${ae})`}).then(Ye=>{Ye==="no_replay_path"&&en()}).catch(Ye=>{_("claude_code.dispatch_supervisor_respawn_failed",{linzumi_thread_id:pe.threadId,source_seq:ae,message:Ye instanceof Error?Ye.message:String(Ye)}),en()});return}en()}})}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,queuedInput:!0}}if(un!==void 0)return{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_active_session_requires_work_description"};{let je=fn(m,"threadId"),Xe=fn(m,"channel"),_e=Y(m.sourceSeq)??Y(m.rootSeq);if(we!==void 0&&je!==void 0&&Xe!==void 0&&_e!==void 0&&R?.({channel:Xe,threadId:je,sourceSeq:_e,transportCeilingRecoveryRequestId:W})===!0)return _("claude_code.replayed_turn_already_applied_ignored",{linzumi_thread_id:je,claude_session_id:ie,body_preview:Pu(we),source_seq:_e,replayed:m.replayed===!0}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,queuedInput:!0,duplicate:!0}}try{let je=Wa(m,"processing","resuming Claude Code session",{instanceId:r,codexThreadId:ie});return je!==void 0&&n.push(t,"message_state",je).catch(_e=>{_("kandan.reconnect_thread_processing_state_push_failed",{message:_e instanceof Error?_e.message:String(_e)})}),H="starting_claude_code_session",(await jZ({kandan:n,topic:t,control:m,options:o,log:_,debugTrace:b,instanceId:r,cwd:D.cwd,matchedRoot:D.matchedRoot,resumeSessionId:ie,activeClaudeCodeSessions:c,pendingClaudeCodeApprovals:l,pendingClaudeCodeUserQuestions:p,ensureClaudeCodeForwardPortSession:f,disposeClaudeCodeForwardPortSession:g,leaseEpochFor:C,onLiveSourceSeqAccepted:T,onUndeliveredFollowUpsAtClose:O,claudeThreadAccessStore:B,setStartupStage:_e=>{H=_e}})).controlResponse}catch(je){let Xe=AZ(H,je);_("kandan.reconnect_thread_failed",{stage:H,message:je instanceof Error?je.message:String(je),thread_id:fn(m,"threadId")??null,source_seq:Y(m.sourceSeq)??Y(m.rootSeq)??null,agent_provider:X,provider_session_key:ie});try{await BZ({kandan:n,topic:t,control:m,failureReason:Xe,rawFailureText:je instanceof Error?je.message:String(je),failureClass:fM(H),codexThreadId:ie,instanceId:r,log:_})}catch{}throw je}}o.codexUrl===void 0&&zb(D.cwd,{configHome:Oa()});let Oe=mp(o,m),bn=w===void 0?void 0:await Si("thread/attach",w(m,D.cwd,ie));if(we!==void 0){let un=Y(m.rootSeq),je=Y(m.sourceSeq)??un;if(bn===void 0||je===void 0)throw new Error("cannot reconnect a Kandan thread without a session");let Xe=fn(m,"channel"),_e=fn(m,"threadId");if(Xe!==void 0&&_e!==void 0&&R?.({channel:Xe,threadId:_e,sourceSeq:je,transportCeilingRecoveryRequestId:W})===!0)return _("kandan.reconnect_thread_seq_already_applied",{linzumi_thread_id:_e,codex_thread_id:ie,source_seq:je}),{instanceId:r,controlType:m.type,cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie,duplicate:!0};let q=fn(m,"workspace"),F=await y6e(K(),ie,qf({cwd:D.cwd,fast:Oe.fast,channelSession:{model:Oe.model,reasoningEffort:Oe.reasoningEffort,approvalPolicy:Oe.approvalPolicy,sandbox:Oe.sandbox,sandboxedApprovalNeverDefault:Oe.sandboxedApprovalNeverDefault}}),{forceRehydrate:m.sessionRehydrate===!0,log:_,buildRehydrationItems:async ae=>{let pe=await m6e(n,t,{workspace:q,channel:Xe,threadId:_e},_);if(pe===void 0||pe.nodes.length===0)return;let Te=bK({nodes:pe.nodes,budget:pe.budget,resumeFailure:ae,threadTitle:pe.threadTitle,linzumiContext:wa(m.linzumiContext)});return _("kandan.reconnect_thread_rehydration_ir_emitted",{linzumi_thread_id:_e,codex_thread_id:ie,emitted_nodes:Te.emittedNodeCount,omitted_nodes:Te.omittedNodeCount,redacted_reasoning:Te.redactedReasoningCount,emitted_token_estimate:Te.emittedTokenEstimate,max_emission_tokens:Te.maxEmissionTokens}),Te.items},buildRehydrationText:async ae=>T4({messages:await p6e(n,t,{workspace:q,channel:Xe,threadId:_e},_),resumeFailure:ae,linzumiContext:wa(m.linzumiContext)})});if(F.mode==="rehydrated"){ye("runner.thread_resume_rehydrated",{purpose:"linzumi.thread_runner",threadId:_e??null,codexThreadId:ie,sourceSeq:je,resumeFailure:F.resumeFailure});try{await oo(n,t,m,"processing","rebuilt the coding session from durable thread history after an unresumable engine session",{codexThreadId:ie,instanceId:r})}catch(ae){_("kandan.reconnect_thread_rehydrated_state_push_failed",{message:ae instanceof Error?ae.message:String(ae)})}}let z=Uo(o.token),V=vi($e(m.attachments)??[]);await bn.startThreadMessageTurn({seq:je,body:we,actorSlug:z.actorUsername,actorUserId:z.actorUserId,attachments:V,boundStartTimeout:!0,transportCeilingRecoveryRequestId:W})}return{instanceId:r,controlType:m.type,cwd:D.cwd,matchedRoot:D.matchedRoot,codexThreadId:ie}}case"list_claude_code_sessions":{let D=no(m.cwd,a.value);if(!D.ok)return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:D.reason};if(!i.includes("claude-code"))return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:"agent_provider_unavailable:claude-code"};let J;try{J=await c9({cwd:D.cwd,limit:Y(m.limit),messagesPerSession:Y(m.messagesPerSession),provider:o.claudeCodeSessionHistoryProvider})}catch(W){return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:W instanceof Error?`claude_code_session_history_failed:${W.message}`:"claude_code_session_history_failed"}}return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!0,cwd:D.cwd,matchedRoot:D.matchedRoot,sessions:J}}case"list_agent_slash_commands":{let D=no(m.cwd,a.value);if(!D.ok)return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:D.reason};let J=y(m.agentProvider)??"claude-code";if(J!=="claude-code")return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:`agent_provider_unsupported:${J}`};if(!i.includes("claude-code"))return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:"agent_provider_unavailable:claude-code"};let W=y(m.providerSessionKey),H=W===void 0?void 0:c.get(W);if(H===void 0)return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:"no_active_claude_session"};try{return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!0,cwd:D.cwd,matchedRoot:D.matchedRoot,provider:"claude-code",providerSessionKey:W,commands:await H.slashCommands()}}catch(X){return{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,ok:!1,error:X instanceof Error?`agent_slash_commands_failed:${X.message}`:"agent_slash_commands_failed"}}}case"browse_directory":return $Le(m,o);case"create_project":return FLe(m,o,a);case"clone_repository":return await JLe(m,o,a);case"suggest_tasks":return VLe(m,o,a.value,{kandan:n,topic:t});case"remote_codex_exec":return await pM(m,r,a.value,d,u,_);case"remote_codex_exec_cancel":return await pM(m,r,a.value,d,u,_);case"start_turn":{let D=await s("codex"),J=g0({agentProvider:"codex",modelProvider:void 0,model:void 0,llmProxyBinding:"absent",hasNativeCodexAuth:D.hasNativeCodexAuth},Ma,D.agentProviders);if(J.type==="blocked"){_("linzumi.start_turn_model_account_preflight_rejected",{thread_id:m.threadId,agent_provider:J.identity[0],model_provider:J.identity[1]??null,model:J.identity[2],reason:J.code,discriminator:J.reason});try{await n.push(t,"codex_error",{instanceId:r,message:J.message})}catch(H){throw _("linzumi.start_turn_model_account_error_push_failed",{thread_id:m.threadId,message:H instanceof Error?H.message:String(H)}),H}return{instanceId:r,controlType:m.type,ok:!1,error:J.code}}let W=await K().request("turn/start",{threadId:m.threadId,input:m.input});return{instanceId:r,controlType:m.type,response:W}}case"steer_turn":{let D=Pi(c,[m.providerSessionKey,m.threadId],[m.threadId]);if(D!==void 0){let X=z6e(m.input);if(X===void 0)return{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_steer_requires_text_input"};let be;try{be=D.steerTurn(X)}catch(Oe){let bn=Oe instanceof Error?Oe.message:String(Oe);return _("claude_code.steer_failed",{thread_id:m.threadId,message:bn}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_steer_failed",message:bn,threadId:m.threadId}}if(!await P6e(be.applied))return _("claude_code.steer_not_applied",{thread_id:m.threadId,steered:be.steered}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",ok:!1,error:"claude_code_steer_not_applied",message:"The turn finished before the steering message could be applied. Linzumi will retry it as its own message automatically; if nothing happens shortly, send it as a new message.",threadId:m.threadId};let ie=Y(m.sourceSeq),we=y(m.workspace),qe=y(m.channel);return ie!==void 0&&we!==void 0&&qe!==void 0&&n.push(t,"message_state",{workspace:we,channel:qe,thread_id:m.threadId,instance_id:r,seq:ie,status:"processed",reason:xm,agent_provider:"claude-code"}).catch(Oe=>{_("claude_code.steer_terminal_state_push_failed",{thread_id:m.threadId,seq:ie,message:Oe instanceof Error?Oe.message:String(Oe)})}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",steered:be.steered,threadId:m.threadId}}let J=m.providerSessionKey??m.threadId,W=y(m.turnId);if(W===void 0)return{instanceId:r,controlType:m.type,agentProvider:"codex",threadId:m.threadId,ok:!1,error:"codex_steer_target_turn_unknown",message:"No live session tracks this thread, so the running turn cannot be steered from here. Linzumi will run the message as its own turn instead."};let H=await K().request("turn/steer",{threadId:J,expectedTurnId:W,input:um(m.input)});return{instanceId:r,controlType:m.type,response:H}}case"interrupt_turn":{let D=Pi(c,[m.threadId]);if(D!==void 0){let W=await D.interruptTurn("Interrupted by Linzumi");return{instanceId:r,controlType:m.type,agentProvider:"claude-code",interrupted:W,threadId:m.threadId}}let J=await K().request("turn/interrupt",{threadId:m.threadId,turnId:m.turnId??null});return{instanceId:r,controlType:m.type,response:J}}case"rewind_thread":return c.get(m.threadId)!==void 0||m.agentProvider==="claude-code"?{instanceId:r,controlType:m.type,agentProvider:"claude-code",requestId:y(m.requestId)??null,threadId:m.threadId,ok:!1,error:"claude_code_rewind_unsupported",message:"Claude Code does not support rewind yet"}:{instanceId:r,controlType:m.type,requestId:y(m.requestId)??null,threadId:m.threadId,ok:!1,error:"rewind_not_supported",message:"This runner does not support rewinding threads yet"};case"interrupt_queued_messages":{let D=y(m.agentProvider)?.trim();if(D!=="claude-code"){let H=await K().request("turn/interrupt",{threadId:m.threadId,turnId:null});return{instanceId:r,controlType:m.type,response:H}}let J=Pi(c,[m.threadId]);if(J===void 0)return{instanceId:r,controlType:m.type,agentProvider:D,ok:!1,error:"claude_code_session_not_active"};await J.interruptTurn("Claude Code interrupted by Linzumi"),J.abortController.abort(new Error("Claude Code interrupted by Linzumi"));let W=Y(m.throughSeq)??J.currentSourceSeq();if(W!==void 0)try{await Io(n,t,{workspace:J.workspace,channel:J.channel,threadId:J.threadId,sourceSeq:W,status:"failed",reason:"Claude Code interrupted by Linzumi",sessionId:m.threadId})}catch(H){_("kandan.claude_code_interrupt_state_push_failed",{message:H instanceof Error?H.message:String(H),thread_id:J.threadId,source_seq:W,claude_session_id:m.threadId})}return{instanceId:r,controlType:m.type,agentProvider:D,interrupted:!0,threadId:m.threadId}}case"stop_turn":{let D=Pi(c,[m.threadId,m.providerSessionKey],[m.threadId]);if(D!==void 0){let W=await k6e({activeSession:D,sessionKey:m.providerSessionKey??m.threadId,publishMessageState:H=>Io(n,t,H),log:_});return _("claude_code.turn_stopped",{thread_id:D.threadId,claude_session_id:m.providerSessionKey??m.threadId,discarded_queued_source_seqs:W}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:m.threadId,ok:!0,stopped:!0,confirmedHalt:!0}}let J=y(m.agentProvider)?.trim();if(J!=="claude-code")try{let W=await K().request("turn/interrupt",{threadId:m.providerSessionKey??m.threadId,turnId:m.turnId??null});return{instanceId:r,controlType:m.type,agentProvider:"codex",threadId:m.threadId,ok:!0,stopped:!0,confirmedHalt:!0,response:W}}catch(W){_("codex.stop_turn_no_session_interrupt_failed",{thread_id:m.threadId,message:W instanceof Error?W.message:String(W)})}return{instanceId:r,controlType:m.type,agentProvider:J??null,threadId:m.threadId,ok:!1,error:"stop_turn_session_not_active"}}case"resolve_codex_approval_request":{let D=l.get(m.requestId);if(D===void 0){if(m.agentProvider==="claude-code")return{instanceId:r,controlType:m.type,skipped:!0};let be=await K().request("resolve_codex_approval_request",{...m});return{instanceId:r,controlType:m.type,response:be}}if(m.agentProvider!==void 0&&m.agentProvider!=="claude-code")return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_approval_provider_mismatch"};if(D.sessionId!==void 0&&m.threadId!==D.sessionId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_approval_session_mismatch"};let J=D.decisions.get(m.decision);if(J===void 0)return _("runner.claude_code_approval_unknown_decision",{instanceId:r,requestId:m.requestId,decision:m.decision,threadId:D.threadId,claudeSessionId:D.sessionId}),{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_approval_unknown_decision",decision:m.decision};let W=Pi(c,[D.sessionId],[D.threadId]);if(W===void 0)return _("runner.claude_code_approval_session_not_active",{instanceId:r,requestId:m.requestId,threadId:D.threadId,claudeSessionId:D.sessionId}),{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_approval_session_not_active"};let H=J.type==="allow"?"processing":"failed";return await mQ({pending:D,decision:J,incomingStatus:H,publishMessageState:()=>Io(n,t,{workspace:D.workspace,channel:D.channel,threadId:D.threadId,sourceSeq:D.sourceSeq,status:H,reason:J.type==="allow"?"Claude Code tool approved":"Claude Code tool denied by Linzumi",sessionId:D.sessionId}),captureMessageStateAttemptGeneration:W.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:W.adoptMessageStateConsensusForAttempt,stopSession:be=>{W.interruptTurnBeforeAbort(be),W.abortController.abort(new Error(be))},log:_,reason:"human_decision"})==="stopped"?{instanceId:r,controlType:m.type,agentProvider:"claude-code",requestId:m.requestId,decision:m.decision,resolved:!1,error:"claude_code_approval_terminal_consensus"}:($Z({threadId:D.threadId,decision:J,log:_}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",requestId:m.requestId,decision:m.decision,resolved:!0})}case"resolve_codex_user_input_request":case"deny_codex_user_input_request":return{instanceId:r,controlType:m.type,agentProvider:"codex",threadId:m.threadId,requestId:m.requestId,ok:!1,error:"codex_user_input_request_not_found"};case"resolve_claude_user_input_request":{let D=p.get(m.requestId);if(D===void 0)return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:m.threadId,requestId:m.requestId,ok:!1,error:"claude_code_user_input_continuation_not_found"};if(m.agentProvider!==void 0&&m.agentProvider!=="claude-code")return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_provider_mismatch"};if(m.threadId!==D.threadId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_thread_mismatch"};if(D.sessionId!==void 0&&m.sessionId!==void 0&&m.sessionId!==D.sessionId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_session_mismatch"};let J=m.answers.map(H=>({questionId:H.questionId,selectedLabels:H.selectedLabels??[],freeText:y(H.freeText)})),W=$6e({pending:D,answers:J,actorUserId:m.actorUserId,actorSlug:m.actorSlug,answeredAt:new Date().toISOString()});switch(W.type){case"error":{_("runner.claude_code_user_input_resolution_failed",{instanceId:r,requestId:m.requestId,error:W.error,selectedLabels:[...W.selectedLabels],threadId:D.threadId,claudeSessionId:D.sessionId,kind:D.kind}),D.resolve({type:"deny",message:W.error});try{await dp(n,t,{workspace:D.workspace,channel:D.channel,threadId:D.threadId,sourceSeq:D.sourceSeq,sessionId:D.sessionId,leaseEpoch:D.leaseEpoch,request:D.request,answerState:{kind:"Denied",reason:W.error,answers:J.map(H=>({questionId:H.questionId,selectedLabels:[...H.selectedLabels],freeText:H.freeText})),actorUserId:m.actorUserId,actorSlug:m.actorSlug,answeredAt:new Date().toISOString()},streamState:"completed"})}catch(H){throw _("kandan.claude_code_user_question_completed_publish_failed",{requestId:m.requestId,message:H instanceof Error?H.message:String(H)}),H}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:D.threadId,requestId:m.requestId,ok:!1,error:W.error,selectedLabels:[...W.selectedLabels],requestKind:D.kind,denied:!0}}case"resolved":D.resolve(W.decision),D.kind==="tool_approval"&&$Z({threadId:D.threadId,decision:W.decision,log:_});break}{let H=Pi(c,[D.sessionId,y(m.sessionId)],[D.threadId]);if(H!==void 0){let X=D.threadId,be=D.sourceSeq,Re=D.sessionId;Db({windowMs:j?.windowMs??uh(process.env),isDelivered:()=>D.resolved(),isSessionClosed:()=>Pi(c,[Re],[X])===void 0,lastSdkActivityMs:()=>H.lastSdkActivityMs(),hasPendingBlockingRequest:()=>tg({threadId:X,pendingApprovals:l,pendingQuestions:p}),log:_,onWedged:ie=>{let we="Claude Code did not continue after your answer - the runner restarted the session; send your message again to continue";_("claude_code.dispatch_liveness_wedged",{linzumi_thread_id:X,claude_session_id:Re??null,source_seq:be,waited_ms:ie.waitedMs,cause:ie.cause,dispatch:W.dispatch}),H.abortController.abort(new Error(we)),(async()=>{let qe=H.sessionWork();qe!==void 0&&await Promise.race([qe.catch(()=>{}),new Promise(Oe=>{setTimeout(Oe,1e4).unref?.()})]),await Io(n,t,{workspace:D.workspace,channel:D.channel,threadId:X,sourceSeq:be,status:"failed",reason:we,sessionId:Re,failureClass:"claude_dispatch_wedged"})})().catch(qe=>{_("claude_code.dispatch_wedged_state_push_failed",{linzumi_thread_id:X,source_seq:be,message:qe instanceof Error?qe.message:String(qe)})})}})}}try{await dp(n,t,{workspace:D.workspace,channel:D.channel,threadId:D.threadId,sourceSeq:D.sourceSeq,sessionId:D.sessionId,leaseEpoch:D.leaseEpoch,request:D.request,answerState:W.answerState,streamState:"completed"})}catch(H){throw _("kandan.claude_code_user_question_completed_publish_failed",{requestId:m.requestId,message:H instanceof Error?H.message:String(H)}),H}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:D.threadId,requestId:m.requestId,answers:J.map(H=>({questionId:H.questionId,selectedLabels:[...H.selectedLabels],...y(H.freeText)===void 0?{}:{freeText:y(H.freeText)}})),actorUserId:m.actorUserId,actorSlug:m.actorSlug,requestKind:D.kind,resolved:!0}}case"deny_claude_user_input_request":{let D=p.get(m.requestId);if(D===void 0)return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:m.threadId,requestId:m.requestId,ok:!1,error:"claude_code_user_input_continuation_not_found"};if(m.agentProvider!==void 0&&m.agentProvider!=="claude-code")return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_provider_mismatch"};if(m.threadId!==D.threadId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_thread_mismatch"};if(D.sessionId!==void 0&&m.sessionId!==void 0&&m.sessionId!==D.sessionId)return{instanceId:r,controlType:m.type,ok:!1,error:"claude_code_user_input_session_mismatch"};D.resolve({type:"deny",message:m.reason??"Denied by Linzumi"});try{await dp(n,t,{workspace:D.workspace,channel:D.channel,threadId:D.threadId,sourceSeq:D.sourceSeq,sessionId:D.sessionId,leaseEpoch:D.leaseEpoch,request:D.request,answerState:{kind:"Denied",reason:m.reason??"Denied by Linzumi",actorUserId:m.actorUserId,actorSlug:m.actorSlug,answeredAt:new Date().toISOString()},streamState:"completed"})}catch(J){throw _("kandan.claude_code_user_question_completed_publish_failed",{requestId:m.requestId,message:J instanceof Error?J.message:String(J)}),J}return{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:D.threadId,requestId:m.requestId,reason:m.reason??"Denied by Linzumi",actorUserId:m.actorUserId,actorSlug:m.actorSlug,denied:!0}}case"read_thread":{let D=await K().request("thread/read",{threadId:m.threadId,includeTurns:m.includeTurns??!0});return{instanceId:r,controlType:m.type,response:D}}case"update_session_settings":{let D=y(m.threadId),J=Pi(c,[D],[D]),W=y(m.approvalPolicy)??void 0,H=y(m.sandbox)??void 0;if(J===void 0)return{instanceId:r,controlType:m.type,skipped:!0};let X=await J.updateSettings({model:y(m.model)??void 0,approvalPolicy:W,reasoningEffort:y(m.reasoningEffort)??void 0}),be=y(X.model),Re=y(X.approval_policy),ie=y(X.reasoning_effort),we=y(m.sandbox);if(Zqe({appliedModel:be,appliedApprovalPolicy:Re,appliedReasoningEffort:ie,controlSandbox:we})){let qe={workspace:J.workspace,channel:J.channel,thread_id:J.threadId,codex_thread_id:m.threadId,updated_at:new Date().toISOString(),...be!==void 0?{model:be}:{},...Re!==void 0?{approvalPolicy:Re}:{},...ie!==void 0?{reasoningEffort:ie}:{},...we!==void 0?{sandbox:we}:{}},Oe=await n.push(t,"session:settings",qe);if(!(ne(Oe)&&Oe.status==="ok"))throw new Error(`kandan push failed: session:settings: ${JSON.stringify(Oe).slice(0,500)}`)}return Re!==void 0&&B?.record(J.threadId,{approvalPolicy:Re,sandbox:H}),X.approval_policy==="never"&&await xQ({kandan:n,topic:t,pendingClaudeCodeApprovals:l,pendingClaudeCodeUserQuestions:p,sessionThreadId:J.threadId,actorUserId:m.actorUserId,actorSlug:m.actorSlug,captureMessageStateAttemptGeneration:J.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:J.adoptMessageStateConsensusForAttempt,stopSession:qe=>{J.interruptTurnBeforeAbort(qe),J.abortController.abort(new Error(qe))},log:_,reason:"full_access_enabled"}),{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:m.threadId,applied:X}}case"stop_instance":case"kill_instance":{let D="threadId"in m&&typeof m.threadId=="string"?m.threadId:void 0,J=D===void 0?void 0:c.get(D);return J!==void 0?(await J.interruptTurn("Claude Code stopped by Linzumi"),J.abortController.abort(new Error("Claude Code stopped by Linzumi")),{instanceId:r,controlType:m.type,agentProvider:"claude-code",threadId:D,stopped:!0}):{instanceId:r,controlType:m.type,skipped:!0}}case"set_thread_collaboration_mode":return{instanceId:r,controlType:m.type,requestId:m.requestId,threadId:m.threadId,collaborationMode:m.collaborationMode,ok:!1,error:"thread_not_loaded"};case"review_thread":return{instanceId:r,controlType:m.type,requestId:m.requestId,threadId:m.threadId,ok:!1,error:"thread_not_loaded"};case"steer_child_thread":return _("steer_child_thread.missing_channel_session",{threadId:m.threadId,providerChildThreadId:m.providerChildThreadId,providerSessionKey:m.providerSessionKey}),{instanceId:r,controlType:m.type,ok:!1,error:"child_channel_session_not_loaded"};case"resolve_port_forward_request":case"update_thread_interaction_access":case"set_port_forward_enabled":case"forward_http_request":case"forward_tcp_open":case"forward_tcp_send":case"forward_tcp_close":case"start_local_editor":case"update_runner_config":case"multi_agent_jobs_state":case"document_surfaces_state":case"fleet_breaker_state":case"route_outage_state":case"stream_idle_timeout_default":case"set_commander_impl":case"replace_runner":return{instanceId:r,controlType:m.type,skipped:!0}}}async function pM(e,n,t,r,o,i){switch(e.type){case"remote_codex_exec":{let s=y(e.requestId)?.trim(),a=new AbortController;s!==void 0&&s!==""&&o.set(s,a);let d=await TK(e,{instanceId:n,allowedCwds:t,sandboxRunner:r,abortSignal:a.signal});return s!==void 0&&s!==""&&o.delete(s),i("remote_codex_exec.handled",{requestId:y(e.requestId)??null,ok:d.ok===!0,error:typeof d.error=="string"?d.error:null}),d}case"remote_codex_exec_cancel":{let s=y(e.requestId)?.trim();if(s===void 0||s==="")return{instanceId:n,controlType:e.type,ok:!1,error:"request_id_required"};let a=o.get(s);return a!==void 0&&(a.abort(new Error("remote_codex_exec_cancelled")),o.delete(s)),{instanceId:n,controlType:e.type,requestId:s,ok:!0,cancelled:a!==void 0}}}}function AZ(e,n){let t=b6e(n instanceof Error?n.message:String(n));switch(e){case"checking_project_trust":return`Codex could not start because this folder is not trusted locally. Trust the folder with linzumi paths add, or restart the runner from a trusted folder. Detail: ${t}`;case"starting_claude_code_session":return`Claude Code did not create a session. Restart the local runner and try again. Detail: ${t}`;case"claude_code_session_failed":return`Claude Code created a session, but the session failed before completing. Try starting the agent again; if it repeats, share this failed message with the runner owner. Detail: ${t}`;case"posting_claude_code_output":return`Claude Code created a session, but Linzumi could not post its response to this thread. Try starting the agent again; if it repeats, reconnect the local runner. Detail: ${t}`;case"starting_codex_session":return`Codex did not create a session. Restart the local runner and try again. Detail: ${t}`;case"binding_kandan_thread":return`Codex started, but Linzumi could not attach it to this thread. Try starting the agent again; if it repeats, share this failed message with the runner owner. Detail: ${t}`;case"starting_first_turn":return`Codex started, but the first prompt could not be delivered. Try sending the message again; if it repeats, reconnect the local runner. Detail: ${t}`}}function fM(e){return e==="checking_project_trust"?"project_untrusted":"start_stage_transient"}function fp(e,n){let t=e.trim();if(t.length<=n)return t;let r=" ... ";if(n<r.length+2)return t.slice(t.length-Math.max(1,n));let o=Math.max(1,Math.floor((n-r.length)/3)),i=Math.max(1,n-r.length-o);return`${t.slice(0,o)}${r}${t.slice(t.length-i)}`}function mM(e,n,t){let r=e==="startup"?`Claude Code startup readiness failed: ${n}`:`Claude Code readiness changed to ${n}`,o=t?.trim();return fp(o===void 0||o===""?r:`${r} (${o})`,480)}function x6e(e=Fr){e({severity:"info",key:"runner.execution_health_failed:claude-code",message:"Claude Code login restored - Claude Code coding jobs are available again."})}function b6e(e){return fp(e,240)}function v6e(){let e={value:{status:"starting",reason:"execution_leg_readiness_not_proven"}},n=(o,i=[])=>i.length===0?{status:"ready",adapters:o}:{status:"ready",adapters:o,failures:i},t=o=>{switch(o.status){case"starting":return[];case"ready":return o.failures??[];case"failed":return o.failures??[{adapter:o.adapter,reason:o.reason}]}};return{snapshot:()=>e.value,canClaimWork:o=>{switch(e.value.status){case"starting":case"failed":return!1;case"ready":return o===void 0||e.value.adapters.includes(o)}},markReady:o=>{switch(e.value.status){case"starting":e.value=n([o]);break;case"ready":{let i=t(e.value).find(s=>s.adapter===o);if(i!==void 0)throw new Error(`runner execution leg failed before readiness: ${i.reason}`);e.value.adapters.includes(o)||(e.value=n([...e.value.adapters,o],t(e.value)));break}case"failed":{let i=t(e.value),s=i.find(a=>a.adapter===o);if(s!==void 0)throw new Error(`runner execution leg failed before readiness: ${s.reason}`);e.value=n([o],i);break}}},markReadyAfterRecovery:o=>{switch(e.value.status){case"starting":e.value=n([o]);break;case"ready":{let i=e.value.adapters.includes(o)?e.value.adapters:[...e.value.adapters,o];e.value=n(i,t(e.value).filter(s=>s.adapter!==o));break}case"failed":{e.value=n([o],t(e.value).filter(i=>i.adapter!==o));break}}},markFailed:(o,i)=>{let s=o.trim();if(s==="")throw new Error("runner execution-leg failure requires a reason");let a={adapter:i,reason:s};switch(e.value.status){case"starting":e.value={status:"failed",adapter:i,reason:s};break;case"ready":{let d=e.value.adapters.filter(c=>c!==i),u=[...t(e.value).filter(c=>c.adapter!==i),a];e.value=d.length===0?{status:"failed",adapter:i,reason:s,...u.length===1?{}:{failures:u}}:n(d,u);break}case"failed":{let d=t(e.value);d.some(u=>u.adapter===i)||(e.value={...e.value,failures:[...d,a]});break}}},markNotReady:(o,i)=>{let s=o.trim();if(s==="")throw new Error("runner execution-leg demotion requires a reason");switch(e.value.status){case"starting":case"failed":break;case"ready":{let a=e.value.adapters.filter(u=>u!==i),d=[...t(e.value).filter(u=>u.adapter!==i),{adapter:i,reason:s}];e.value=a.length===0?{status:"failed",adapter:i,reason:s,...d.length===1?{}:{failures:d}}:n(a,d);break}}},refusalReason:o=>{switch(e.value.status){case"starting":return`runner_execution_leg_unhealthy: ${e.value.reason}`;case"failed":return`runner_execution_leg_unhealthy: ${(o===void 0?void 0:t(e.value).find(s=>s.adapter===o))?.reason??e.value.reason}`;case"ready":{if(o!==void 0&&!e.value.adapters.includes(o))return`runner_execution_leg_unhealthy: ${t(e.value).find(s=>s.adapter===o)?.reason??`${o}_readiness_not_proven`}`;throw new Error("runner execution leg is ready and has no refusal reason")}}},capabilityFields:()=>({executionHealth:e.value})}}async function w6e(e){if(MZ(e.health),e.activateDispatch(),await e.publishReadyHealth(),MZ(e.health),!e.signalGenerationReady())throw new Error("runner generation-ready signal was not delivered");return{type:"ready",delivered:!0}}function MZ(e){let n=e.snapshot();switch(n.status){case"ready":break;case"starting":throw new Error(`runner execution leg is starting: ${n.reason}`);case"failed":throw new Error(`runner execution leg is failed: ${n.reason}`)}}function S6e(e){let n=e.interruptActiveTurn(e.reason),t=e.interruptSessionControls;if(t!==void 0)try{t().catch(r=>{e.log("claude_code.session_control_interrupt_failed",{thread_id:e.threadId,message:r instanceof Error?r.message:String(r)})})}catch(r){e.log("claude_code.session_control_interrupt_failed",{thread_id:e.threadId,message:r instanceof Error?r.message:String(r)})}return n}async function k6e(e){let{activeSession:n}=e;n.interruptTurnBeforeAbort("stopped by user");let t=n.discardQueuedFollowUpsForStop();n.abortController.abort(new Error("stopped by user"));let r=n.currentSourceSeq(),o=[...new Set([r,...t].filter(s=>s!==void 0))],i=new Set(t);for(let s of o)try{await e.publishMessageState({workspace:n.workspace,channel:n.channel,threadId:n.threadId,sourceSeq:s,status:"interrupted",reason:"stopped by user",sessionId:e.sessionKey}),i.has(s)&&n.markFollowUpSeqDiscarded(s)}catch(a){e.log("kandan.claude_code_stop_state_push_failed",{message:a instanceof Error?a.message:String(a),thread_id:n.threadId,source_seq:s})}return t}function Pi(e,n,t=[]){let r=n.filter(i=>i!==void 0&&i!=="");for(let i of r){let s=e.get(i);if(s!==void 0)return s}let o=t.filter(i=>i!==void 0&&i!=="");if(o.length>0){for(let i of e.values())if(o.includes(i.threadId))return i}}function C6e(e,n){return Pi(e,[n],[n])===void 0?"codex":"claude-code"}async function P6e(e){let n;try{return await Promise.race([e,new Promise(t=>{n=setTimeout(()=>t(!0),T6e),n.unref?.()})])}finally{n!==void 0&&clearTimeout(n)}}async function mQ(e){let n=e.pending.sourceSeq;if(n===void 0)return e.log("claude_code.approval_consensus_source_seq_missing",{thread_id:e.pending.threadId,claude_session_id:e.pending.sessionId??null,reason:e.reason}),e.stopSession("Claude Code approval has no source sequence"),"stopped";let t=e.captureMessageStateAttemptGeneration(),r;try{r=await e.publishMessageState()}catch(i){e.log("claude_code.approval_consensus_push_unconfirmed",{thread_id:e.pending.threadId,source_seq:n,claude_session_id:e.pending.sessionId??null,reason:e.reason,message:i instanceof Error?i.message:String(i)}),r={kind:"unconfirmed"}}return e.adoptMessageStateConsensusForAttempt(n,e.incomingStatus,r,t)==="stop"?(e.log("claude_code.approval_terminal_consensus",{thread_id:e.pending.threadId,source_seq:n??null,claude_session_id:e.pending.sessionId??null,disposition:r.kind,reason:e.reason}),e.stopSession("Claude Code turn already terminated by the server"),"stopped"):(e.pending.resolve(e.decision),"resolved")}function DZ(e,n){switch(e.agentReplay?.provider){case"codex":return["codex"];case"claude-code":return["claude-code"];case"auto":case void 0:break}switch(e.claudeCodeRunner!==void 0||(n===void 0?e.claudeCodeAvailable===!0:n==="logged_in")){case!0:return["codex","claude-code"];case!1:return["codex"]}}function I6e(e){if(e.agentReplay?.provider==="codex"||e.codexUrl!==void 0||Xs(e))return!0;switch(e.dependencyStatus?.codex.available){case!1:return!1;case!0:case void 0:return!0}}function ap(e){let n=y(e.agentProvider)?.trim();switch(n){case void 0:case"":case"codex":return{type:"ok",provider:"codex"};case"claude-code":return{type:"ok",provider:"claude-code"};default:return{type:"unsupported",value:n}}}function R6e(e){switch(e){case"codex":return"Codex";case"claude-code":return"Claude Code"}}function v0(e){let n=y(e.modelProvider)?.trim(),t=E(e.llmProxy),r=y(t?.baseUrl)?.trim(),o=y(t?.token)?.trim(),i=r!==void 0&&r!==""&&o!==void 0&&o!==""?{baseUrl:r,token:o}:void 0;return n===void 0||n===""?i===void 0?{type:"none"}:{type:"provider",runtime:{provider:"openai-proxy",llmProxyBaseUrl:i.baseUrl,llmProxyToken:i.token}}:n!=="wafer"?{type:"error",error:`model_provider_unsupported:${n}`}:i===void 0?{type:"error",error:"wafer_model_provider_missing_llm_proxy"}:{type:"provider",runtime:{provider:"wafer",llmProxyBaseUrl:i.baseUrl,llmProxyToken:i.token}}}function hQ(e){if(e.type==="error")return e.error;if(e.type==="provider"&&e.runtime.provider==="openai-proxy"&&Bs()===void 0)return"codex_llm_proxy_requires_openai_api_key"}function OZ(e,n){let t=v0(n);switch(t.type){case"none":return;case"error":return t.error;case"provider":{let r=hQ(t);return r!==void 0?r:e.codexModelProvider?.provider===t.runtime.provider?void 0:t.runtime.provider==="wafer"?"wafer_model_provider_requires_thread_worker":"llm_proxy_model_provider_requires_thread_worker"}}}function E6e(e){if(e.linzumiAgentMcpToken===void 0||e.linzumiAgentMcpToken===""||GR(e.env))return;let n=A6e(e.env,e.kandanUrl);if(n===void 0||n==="")return hM("cloud agent turn requires a server URL (kandanUrl) and none was configured; refusing to run the @linzumi agent turn on the host");if(M6e(n))return hM(`cloud agent turn requires a PUBLICLY reachable server URL for the guest VM, got loopback ${n}; set LINZUMI_CLOUD_AGENT_PUBLIC_URL to the server's public base URL (e.g. https://serve.linzumi.com)`);if(!lu(e.env))return hM("smolcloud is the required execution path for @linzumi agent turns but no smolcloud API key resolved (SMOLCLOUD_API_KEY / cloud.apiKeyFile / SMOL_CLOUD_TOKEN); refusing to run the agent on the render host (set LINZUMI_VM_CLOUD_AGENT=0 only to explicitly opt back into host execution)");let t;try{t=Ks()}catch{throw new Error("workspace-agent cloud vm.json is present but invalid; refusing to arm the cloud agent turn on a corrupt config")}let r=YJ({env:e.env,config:t});if(r===void 0)throw new Error("workspace-agent cloud execution is enabled but no smolcloud API key resolved");let o=t?.agent,i={...o?.image===void 0?{}:{image:o.image},...o?.allowCidrs===void 0?{}:{allowCidrs:o.allowCidrs},...o?.autoStopSeconds===void 0?{}:{autoStopSeconds:o.autoStopSeconds}},s=e.modelProviderRuntime===void 0?void 0:(()=>{let a=P0(e.modelProviderRuntime);return{id:a.id,name:a.name,baseUrl:a.baseUrl,envKey:a.envKey,wireApi:a.wireApi,...a.httpHeaders===void 0?{}:{httpHeaders:a.httpHeaders},...a.envHttpHeaders===void 0?{}:{envHttpHeaders:a.envHttpHeaders}}})();return XJ({connection:r,workspaceSlug:e.workspaceSlug,kandanUrl:n,linzumiAgentMcpToken:e.linzumiAgentMcpToken,ownerUsername:e.ownerUsername,modelProvider:s,llmProxyToken:e.modelProviderRuntime?.llmProxyToken,agentSpec:i,prewarm:!0})}function hM(e){return()=>Promise.reject(new At(e))}function A6e(e,n){let t=e.LINZUMI_CLOUD_AGENT_PUBLIC_URL?.trim();return t!==void 0&&t!==""?t:n}function M6e(e){try{let n=new URL(e).hostname.toLowerCase();return n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="0.0.0.0"}catch{return!1}}function P0(e){let n=`${e.llmProxyBaseUrl.replace(/\/+$/,"")}/v1`;switch(e.provider){case"wafer":return{id:"linzumi",name:"Linzumi Proxy",baseUrl:n,envKey:"LINZUMI_LLM_PROXY_TOKEN",wireApi:"responses"};case"openai-proxy":return{id:"linzumi",name:"Linzumi Proxy",baseUrl:n,envKey:"OPENAI_API_KEY",wireApi:"responses",envHttpHeaders:{"x-linzumi-llm-proxy-token":"LINZUMI_LLM_PROXY_TOKEN"}}}}function gQ(e){switch(e.provider){case"wafer":return{LINZUMI_LLM_PROXY_TOKEN:e.llmProxyToken};case"openai-proxy":{let n=Bs();if(n===void 0)throw new Error("codex llm proxy requires API-key auth (OPENAI_API_KEY in the environment or $CODEX_HOME/auth.json); ChatGPT OAuth credentials cannot be forwarded");return{LINZUMI_LLM_PROXY_TOKEN:e.llmProxyToken,OPENAI_API_KEY:n}}}}async function yQ(e){e.options.codexUrl===void 0&&(e.setStartupStage("checking_project_trust"),zb(e.cwd,{configHome:Oa()})),e.setStartupStage("starting_codex_session");let n=Ro(e.control.developerPrompt),t=wa(e.control.linzumiContext),r=mp(e.options,e.control),o=await Si("thread/start",e.codex.request("thread/start",eje(r,{cwd:e.cwd,serviceName:"kandan-local-runner",personality:"pragmatic",developerInstructions:zf({cwd:e.cwd,planTool:"linzumi-mcp",mcpAvailable:!Xs(e.options)||OM(e.options),devServicesAvailable:!Xs(e.options),developerPrompt:n,...IM(e.control),linzumiContext:t,...Bc(r.sandbox)&&r.sandbox!==void 0?{sandboxNetworkPosture:{sandbox:r.sandbox,approvalCapable:Jc(r.approvalPolicy)}}:{}})}))),i=Wqe(o);e.setStartedCodexThreadId(i);let s=Ro(e.control.workDescription);i!==void 0&&n!==void 0&&await G6e(e.kandan,e.topic,e.control,n,i);let a;if(i!==void 0&&e.onStartedThread!==void 0&&(e.setStartupStage("binding_kandan_thread"),a=await Si("thread/attach",e.onStartedThread(e.control,e.cwd,i))),i!==void 0&&s!==void 0){e.setStartupStage("starting_first_turn");let d=Y(e.control.rootSeq),u=Y(e.control.sourceSeq)??d,c=vi($e(e.control.attachments)??[]);if(a===void 0||u===void 0)throw new vb({codexThreadId:i,kandanThreadId:fn(e.control,"threadId"),hasThreadSession:a!==void 0,sourceSeq:u});let l=Uo(e.options.token);e.startAgentReplayCodex?.(),await a.startThreadMessageTurn({seq:u,body:s,actorSlug:l.actorUsername,actorUserId:l.actorUserId,attachments:c,boundStartTimeout:!0})}return{controlResponse:{instanceId:e.instanceId,controlType:e.control.type,cwd:e.cwd,matchedRoot:e.matchedRoot,response:o},providerSession:{provider:"codex",cwd:e.cwd,matchedRoot:e.matchedRoot,sessionId:i}}}function D6e(e){let n=e.LINZUMI_CLAUDE_TURN_STALL_MS?.trim();if(n===void 0||n==="")return 6e5;let t=Number.parseInt(n,10);return Number.isFinite(t)&&t>0?t:6e5}function O6e(e){let n=e.onInputDelivered,t=e.isLiveSteerAllowed,r=e.onInputWait,o=e.onSourceSeqDelivered,i=[gM(e.content)],s=[e.sourceSeq],a=[],d=new Set,u=[],c=new Map,l=v=>new Promise(S=>{c.set(v,S)}),p=(v,S)=>{let C=c.get(v);C!==void 0&&(c.delete(v),C(S))},f={closed:!1},g=()=>{for(;f.closed;){let v=u.shift();if(v===void 0)return;v({done:!0,value:void 0})}},m=(v,S,C)=>{s.push(S),n?.(),S!==void 0&&o!==void 0&&!d.has(S)&&(d.add(S),o(S)),C?.();let T=u.shift();if(T===void 0){i.push(v);return}p(v,!0),T({done:!1,value:v})},_=(v,S,C)=>s.length>0?(a.push({message:v,sourceSeq:S,onDelivered:C}),{disposition:"parked",queuePosition:a.length}):(m(v,S,C),{disposition:"delivered"}),b=v=>{if(f.closed)throw new Error("Claude Code streaming input is closed");let S=gM(v.content);return _(S,v.sourceSeq,v.onDelivered)},w=v=>{if(f.closed)throw new Error("Claude Code streaming input is closed");let S=gM(v),C=l(S);if(s.length===0)return _(S,void 0),{steered:"steered_queued",applied:C};if(t?.()===!1)return _(S,void 0),{steered:"steered_queued",applied:C};let T=u.shift();return T===void 0?i.push(S):(p(S,!0),T({done:!1,value:S})),{steered:"steered_live",applied:C}};return{messages:{[Symbol.asyncIterator](){return{next(){let v=i.shift();return v!==void 0?(p(v,!0),Promise.resolve({done:!1,value:v})):f.closed?Promise.resolve({done:!0,value:void 0}):(r?.(s[0]),new Promise(S=>{u.push(S)}))}}}},close:()=>{if(s.length===0)for(;a.length>0;){let v=a.shift();v!==void 0&&m(v.message,v.sourceSeq,v.onDelivered)}f.closed=!0,g();for(let[v,S]of c)c.delete(v),S(!1)},enqueue:b,enqueueSteer:w,drainUndeliveredFollowUps:()=>a.splice(0),completeTurn:()=>{let v=s.shift();if(!f.closed&&s.length===0){let S=a.shift();S!==void 0&&m(S.message,S.sourceSeq,S.onDelivered)}return v},currentSourceSeq:()=>s[0]}}function gM(e){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null}}function $Z(e){if(e.decision.type!=="allow")return;let n=b9(e.decision.updatedPermissions);if(n.length!==0)try{S9(e.threadId,n),e.log("claude_code.thread_permission_grants_recorded",{linzumi_thread_id:e.threadId,rules:n.map(FI)})}catch(t){e.log("claude_code.thread_permission_grants_persist_failed",{linzumi_thread_id:e.threadId,message:t instanceof Error?t.message:String(t)})}}function $6e(e){let n=e.answers.map(t=>({questionId:t.questionId,selectedLabels:[...t.selectedLabels],freeText:t.freeText}));switch(e.pending.kind){case"question":return{type:"resolved",decision:{type:"answer_question",updatedInput:m9(e.pending.originalInput,e.pending.request,e.answers)},answerState:{kind:"Answered",answers:n,actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:e.answeredAt},dispatch:"user_question_answer"};case"tool_approval":case"plan_review":{let t=e.answers.flatMap(i=>i.selectedLabels),r=t[0];if(r===void 0)return{type:"error",error:"claude_code_user_input_decision_missing",selectedLabels:t};let o=e.pending.approvalDecisions.get(r);return o===void 0?{type:"error",error:"claude_code_user_input_unknown_decision",selectedLabels:t}:{type:"resolved",decision:o,answerState:o.type==="deny"?{kind:"Denied",reason:o.message,answers:n,actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:e.answeredAt}:{kind:"Answered",answers:n,actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:e.answeredAt},dispatch:"user_input_decision"}}}}async function _Q(e){let n=e.sourceSeq;if(n===void 0)return{type:"deny",message:"Claude Code user input request had no source message"};if(e.pendingQuestions.has(e.questionRequest.requestId))return{type:"deny",message:"Claude Code user input request id was already pending"};if(tg({threadId:e.threadId,pendingApprovals:e.pendingApprovals,pendingQuestions:e.pendingQuestions}))return{type:"deny",message:"Claude Code already has a pending user input request"};if(e.signal.aborted)return{type:"deny",message:"Claude Code user input request cancelled by Linzumi"};let t="Claude Code user input request cancelled by Linzumi",r=e.approvalDecisions??new Map,o,i,s=!1,a=new Promise(d=>{let u=!1,c=()=>{i!==void 0&&e.signal.removeEventListener("abort",i),e.pendingQuestions.delete(e.questionRequest.requestId)},l=f=>{u||(u=!0,c(),d(f))};o=l,i=()=>{s||(s=!0,(async()=>{try{await dp(e.kandan,e.topic,{workspace:e.workspace,channel:e.channel,threadId:e.threadId,sourceSeq:n,sessionId:e.sessionId,leaseEpoch:e.leaseEpoch,request:e.questionRequest,answerState:{kind:"Denied",reason:t,answeredAt:new Date().toISOString()},streamState:"interrupted"})}catch(f){console.error("kandan.claude_code_user_input_abort_publish_failed",e.questionRequest.requestId,f instanceof Error?f.message:String(f))}finally{l({type:"deny",message:t})}})())};let p={sessionId:e.sessionId,workspace:e.workspace,channel:e.channel,threadId:e.threadId,sourceSeq:n,leaseEpoch:e.leaseEpoch,request:e.questionRequest,resolve:l,resolved:()=>u};switch(e.kind){case"question":e.pendingQuestions.set(e.questionRequest.requestId,{...p,kind:"question",originalInput:e.request.input});break;case"tool_approval":case"plan_review":e.pendingQuestions.set(e.questionRequest.requestId,{...p,kind:e.kind,approvalDecisions:r});break}});if(i!==void 0&&(e.signal.addEventListener("abort",i,{once:!0}),e.signal.aborted))return i(),a;try{await dp(e.kandan,e.topic,{workspace:e.workspace,channel:e.channel,threadId:e.threadId,sourceSeq:n,sessionId:e.sessionId,leaseEpoch:e.leaseEpoch,request:e.questionRequest,answerState:{kind:"NeedsAnswer"},streamState:"streaming"})}catch(d){return o?.({type:"deny",message:d instanceof Error?`Claude Code user input request push failed: ${d.message}`:"Claude Code user input request push failed"}),a}return a}async function dp(e,n,t){await e.push(n,"session:stream_thread_message",{workspace:t.workspace,channel:t.channel,thread_id:t.threadId,stream_key:g9(t.request.requestId),body:t.request.title,...t.leaseEpoch===void 0?{}:{lease_epoch:t.leaseEpoch},payload:{source_message_seq:t.sourceSeq,agent_provider:"claude-code",...t.sessionId===void 0?{}:{codex_thread_id:t.sessionId,provider_session_key:t.sessionId,claude_session_id:t.sessionId},structured:h9({request:t.request,sessionId:t.sessionId,sourceSeq:t.sourceSeq,answerState:t.answerState,streamState:t.streamState})}})}function tg(e){return[...e.pendingApprovals.values()].some(n=>n.threadId===e.threadId)||[...e.pendingQuestions.values()].some(n=>n.threadId===e.threadId)}async function q6e(e){let n=f9(e.request),t=new Map(n.choices.map(r=>[r.label,r.permissionDecision]));return _Q({kandan:e.kandan,topic:e.topic,pendingApprovals:e.pendingApprovals,pendingQuestions:e.pendingQuestions,workspace:e.workspace,channel:e.channel,threadId:e.threadId,sessionId:e.sessionId,sourceSeq:e.sourceSeq,request:e.request,questionRequest:n.request,kind:n.request.requestSource==="claude_code_plan_review"?"plan_review":"tool_approval",approvalDecisions:t,leaseEpoch:e.leaseEpoch,signal:e.signal})}function qZ(){return yM.value===void 0&&(yM.value=d8(a8(process.env))),yM.value}async function jZ(e){try{return await LZ(e)}catch(n){if(!(n instanceof Da))throw n;e.log("claude_code.dispatch_liveness_respawn_retry",{thread_id:fn(e.control,"threadId")??null,resume_session_id:e.resumeSessionId??null,waited_ms:n.waitedMs});try{return await LZ(e)}catch(t){throw t instanceof Da?new Error(j6e):t}}}async function LZ(e){let n=up(e.control,"workspace"),t=up(e.control,"channel"),r=up(e.control,"threadId"),o=Y(e.control.rootSeq),i=Y(e.control.sourceSeq)??o,s=Ro(e.control.workDescription);if(e.debugTrace?.record("commander","claude.provider_start",{controlType:e.control.type,instanceId:e.instanceId,workspace:n,channel:t,threadId:r,rootSeq:o??null,sourceSeq:i??null,resumeSessionId:e.resumeSessionId??null,cwd:e.cwd}),s===void 0)throw new Error("start_instance control missing workDescription");if(e.log("claude_code.turn_starting",{linzumi_thread_id:r,claude_session_id:e.resumeSessionId??null,body_preview:Pu(s),message_received_at_ms:Date.now()}),e.resumeSessionId!==void 0){let $=await qZ().acquire();($.waitedMs>0||$.timedOut)&&e.log("claude_code.resume_start_throttled",{linzumi_thread_id:r,claude_session_id:e.resumeSessionId,waited_ms:$.waitedMs,timed_out:$.timedOut})}let a=$=>{e.log("claude_code.turn_terminal",{turn_id:null,outcome:"failed",reason:$,thread_id:r,claude_session_id:e.resumeSessionId??null})},d,u=!1,c=!1,l,p=!1,f,g=0,m=!1,_=!1,b=!1,w,v=!1,S=$=>({workspace:n,channel:t,thread_id:r,codex_thread_id:$,provider_session_key:$,agent_provider:"claude-code",claude_session_id:$,cwd:e.cwd,instance_id:e.instanceId}),C=()=>{if(!u||!c||d===void 0)return;let $=()=>{let Le=d;if(p||!u||!c||Le===void 0)return;p=!0;let G=e.kandan.push(e.topic,"session:typing_start",S(Le)).then(()=>{}).catch(Pe=>{e.log("kandan.claude_code_typing_heartbeat_failed",{thread_id:r,claude_session_id:Le,message:Pe instanceof Error?Pe.message:String(Pe)})}).finally(()=>{p=!1});f=G,G.finally(()=>{f===G&&(f=void 0)})};$(),l===void 0&&(l=setInterval($,z$e),l.unref?.())},T=()=>{if(m){_=!0;return}u=!0,g+=1,C()},P=()=>{_&&(_=!1,T())},O=()=>{if(m){b=!0;return}ie.completeTurn()},R=()=>{b&&(b=!1,O())},j=()=>{b=!1,v=!0,ie.completeTurn()},B=async($,Le)=>{let G,Pe=new Promise(xt=>{G=setTimeout(()=>xt("timeout"),B$e),G.unref?.()}),We=await Promise.race([$.then(()=>"processed"),Pe]);G!==void 0&&clearTimeout(G),We==="timeout"&&e.log("claude_code.terminal_processing_timeout",{linzumi_thread_id:r,claude_session_id:Le.sessionId,event_type:Le.type})},K=async($,Le)=>{let G,Pe=new Promise(xt=>{G=setTimeout(()=>xt("timed_out"),U$e),G.unref?.()}),We=await Promise.race([$.then(()=>"settled"),Pe]);return G!==void 0&&clearTimeout(G),We==="timed_out"&&e.log("kandan.claude_code_typing_start_wait_timeout",{thread_id:r,claude_session_id:Le}),We},D=async()=>{let $=u,Le=d,G=g;if(u=!1,l!==void 0&&(clearInterval(l),l=void 0),!(!$||!c||Le===void 0))try{let Pe=f;if(Pe!==void 0&&await K(Pe,Le)==="timed_out"&&f===Pe&&(f=void 0,p=!1),u||g!==G)return;await e.kandan.push(e.topic,"session:typing_stop",S(Le))}catch(Pe){e.log("kandan.claude_code_typing_stop_failed",{thread_id:r,claude_session_id:Le,message:Pe instanceof Error?Pe.message:String(Pe)})}},J=vi($e(e.control.attachments)??[]),W=await DC({cwd:e.cwd,kandanUrl:e.options.kandanUrl,token:e.options.token,fetch:e.options.fetch,attachmentDirectoryName:"local-claude-code-attachments"},{seq:i,body:s,attachments:J}).then($=>({ok:!0,content:$})).catch($=>({ok:!1,error:$}));if(!W.ok){let $=W.error instanceof Error?W.error.message:String(W.error),Le=`Claude Code input attachment download failed: ${$}`;a(Le);try{await oo(e.kandan,e.topic,e.control,"failed",Le,{instanceId:e.instanceId,failureClass:"attachment_download_failed"})}catch(G){e.log("kandan.start_instance_claude_code_attachment_failed_state_push_failed",{message:G instanceof Error?G.message:String(G)})}return{controlResponse:{instanceId:e.instanceId,controlType:e.control.type,agentProvider:"claude-code",ok:!1,error:"claude_code_attachment_download_failed",message:$}}}let H=()=>{},X=!1,be=new Promise($=>{H=$}),Re=()=>{X||(X=!0,setImmediate(H))},ie=O6e({content:W.content,sourceSeq:i,onInputDelivered:T,isLiveSteerAllowed:()=>!m,onInputWait:$=>{$===void 0&&Re()},onSourceSeqDelivered:$=>{we.add($),e.onLiveSourceSeqAccepted?.({channel:t,threadId:r,sourceSeq:$})}}),we=new Set,qe=new Set,Oe=0,bn=Ro(e.control.developerPrompt),un=wa(e.control.linzumiContext),je=mp(e.options,e.control),Xe=y(e.control.approvalPolicy)!==void 0,_e=e.claudeThreadAccessStore?.resolve(r),q=gp(e.options),F=Xe?je.approvalPolicy:_e?.approvalPolicy??q.approvalPolicy,z=Xe?je.sandbox:_e?.sandbox??q.sandbox,V=F===void 0?void 0:jf(F,z),ae=V!==void 0?_M(V):je.approvalPolicy===void 0?void 0:_M(je.approvalPolicy);if(V!==void 0&&e.claudeThreadAccessStore?.record(r,{approvalPolicy:V,sandbox:z}),e.resumeSessionId!==void 0)try{await u9({cwd:e.cwd,sessionId:e.resumeSessionId,validator:e.options.claudeCodeSessionValidator})}catch($){throw a($ instanceof Error?$.message:String($)),$}let pe={runnerIdentity:Uo(e.options.token),codexVersion:void 0},Te=new AbortController,Z=Zm({stop:()=>{Te.signal.aborted||Te.abort(new Error("engine child reaper teardown"))},pid:void 0,ownProcessGroup:!1,kind:"claude_code"}),de=new Set(i===void 0?[]:[i]),ue={value:void 0},en=!1,Ye,Be=[],In=!1,ft,ee=Zs({kandanUrl:e.options.kandanUrl,accessToken:e.options.token,fetchImpl:e.options.fetch,operatingMode:"text"}),Q=s.trim().slice(0,2e3),he=iB({replacePlanSteps:ee.replaceCodingJobPlanSteps,threadId:r,goal:Q,log:e.log}),He=async()=>{if(e.resumeSessionId!==void 0)return;let $=5e3,Le=new AbortController,G,Pe=new Promise(We=>{G=setTimeout(()=>{Le.abort(new Error("claude goal seed timed out")),e.log("claude_code.goal_seed_timeout",{thread_id:r,timeout_ms:$}),We()},$)});try{await Promise.race([sB({upsertCodingJobPlan:ee.upsertCodingJobPlan,threadId:r,goal:Q,log:e.log,signal:Le.signal}),Pe])}finally{G!==void 0&&clearTimeout(G)}},N={model:je.model,modelProvider:je.modelProvider},ce=nB({flushJournaledTerminal:()=>te.flush(_Z),publishMessageState:$=>Io(e.kandan,e.topic,{workspace:n,channel:t,threadId:r,sourceSeq:$.sourceSeq,status:$.status,reason:$.reason,sessionId:d,fate:$.fate,retryable:$.retryable,holdDeadlineAt:$.holdDeadlineAt,model:$.model,provider:$.provider}),adoptMessageStateConsensus:($,Le,G)=>te.adoptMessageStateConsensus($,Le,G),acceptRestart:$=>te.acceptRouteOutageRestart($),enqueue:$=>ie.enqueue($).disposition,isSessionClosed:()=>Te.signal.aborted,attribution:()=>({...N.model===void 0?{}:{model:N.model},...N.modelProvider===void 0?{}:{provider:N.modelProvider}}),log:($,Le)=>e.log($,{thread_id:r,...Le})});i!==void 0&&ce.retainInput(i,W.content);let te=Y8({instanceId:e.instanceId,cwd:e.cwd,threadKey:`${n}:${t}:${r}`,persistDir:e.options.claudeCodeRunner===void 0?Zh():void 0,wire:()=>({workspaceSlug:n,channelSlug:t,kandanThreadId:r,codexThreadId:d??e.resumeSessionId,rootSeq:o,leaseEpoch:e.leaseEpochFor?.(r)}),push:async($,Le,G,Pe)=>{let We=await e.kandan.push(e.topic,$,Le,Pe);if(ne(We)&&We.status==="ok")return We;throw new Error(`kandan push failed: ${$}: ${JSON.stringify(We).slice(0,500)}`)},preparePush:($,Le)=>x_({kandan:e.kandan,topic:e.topic,workspace:n,channel:t,cwd:e.cwd,kandanUrl:e.options.kandanUrl,token:e.options.token,fetch:e.options.fetch,log:(G,Pe)=>e.log(G,Pe)},$,Le),runnerPayload:($,Le,G,Pe)=>Hi({...e.options,cwd:e.cwd},e.instanceId,$,Le,pe,G,Pe),currentSourceSeq:ie.currentSourceSeq,routeOutageActive:()=>Ta(void 0,N.model,0)==="active",runtimeMetadataForSourceSeq:()=>({model:N.model??null,model_provider:N.modelProvider??null}),onTurnTerminal:($,Le,G,Pe,We,xt,_a)=>{e.log("claude_code.turn_terminal",{turn_id:$,outcome:Le,reason:G??null,thread_id:r,claude_session_id:d??null,...xt===void 0?{}:{fate:xt}}),(Le==="failed"||Le==="interrupted")&&xt==="route_outage"&&We!==void 0&&ce.park({sourceSeq:We,reason:G,provider:_a?.provider,model:_a?.model,holdCeilingMs:_a?.holdCeilingMs}),Le==="completed"&&We!==void 0&&(e.onLiveSourceSeqAccepted?.({channel:t,threadId:r,sourceSeq:We}),ce.releaseRetained(We)),w?.(),w=void 0},onTodoWriteCompleted:he.handleTodoWrite,suppressProcessingState:()=>{for(let $ of e.pendingClaudeCodeApprovals.values())if($.threadId===r)return!0;for(let $ of e.pendingClaudeCodeUserQuestions.values())if($.threadId===r)return!0;return!1},log:e.log,debugTrace:e.debugTrace}),ke=e.options.claudeCodeRunner===void 0&&UB(process.env)?BB({captureDir:Tt(nQ(),`linzumi-claude-live-bash-${e.instanceId}`),onOutputDelta:($,Le)=>{d!==void 0&&te.handleTranscriptEvent({type:"command_output_delta",sessionId:d,itemKey:$,delta:Le})},log:($,Le)=>e.log($,Le)}):void 0,Ae,nn;try{let $=MQ(),Le=qM({...e.options,codingJobMcpToken:EM(e.control)});Ae=Le.cleanup;let G=$s({command:$.command,argsPrefix:$.argsPrefix,kandanUrl:e.options.kandanUrl,authFilePath:Le.path,ownerUsername:I0(e.options),operatingMode:"text",cwd:e.cwd,threadId:r,toolScope:e.options.codingJobToolScope,multiAgentJobs:e.options.multiAgentJobs===!0,devServices:{scope:e.options.runnerId,ownerPid:$M(e.options)}});nn=a4(G)}catch($){Ae?.(),Ae=void 0,e.log("claude_code.mcp_config_failed",{message:$ instanceof Error?$.message:String($),thread_id:r})}let Yn={kandan:e.kandan,topic:e.topic,workspace:n,channel:t,threadId:r,cwd:e.cwd,initialPrompt:s,rootSeq:o,log:e.log},pn=new Map,Kt=async $=>{let Le=Date.now(),G=DI($.rateLimit,Le);e.log("claude_code.rate_limit",{linzumi_thread_id:r,claude_session_id:$.sessionId??d??null,rate_limit_summary:`claude/${$.rateLimit.rateLimitType??"account"} ${G}`,status:$.rateLimit.status??null,utilization_percent:$.rateLimit.utilizationPercent??null,resets_at_ms:$.rateLimit.resetsAtMs??null});let Pe=$.rateLimit.rateLimitType??"account",We=Z6e($.rateLimit);if(We!==pn.get(Pe))try{await Q6e({kandan:e.kandan,topic:e.topic,workspace:n,channel:t,threadId:r,claudeSessionId:$.sessionId??d,rateLimit:$.rateLimit}),pn.set(Pe,We)}catch(xt){e.log("claude_code.rate_limit_post_failed",{thread_id:r,message:xt instanceof Error?xt.message:String(xt)})}},qo=async $=>{if(Oe=Date.now(),e.debugTrace?.record("claude-transcript","transcript.event",{eventType:$.type,threadId:r,activeSessionId:d??null,event:$}),jy.observeTranscriptEvent($),$.type==="tool_call"&&$.toolName==="Bash"){let G=y($.input.command);G!==void 0&&nx(r,G)}try{await U6e(Yn,$)}catch(G){e.log("claude_code.session_store_mirror_failed",{session_id:$.sessionId??null,event_type:$.type,message:G instanceof Error?G.message:String(G)})}if($.type==="session_started"){d=$.sessionId,e.log("claude_code.session_started",{linzumi_thread_id:r,claude_session_id:$.sessionId}),e.activeClaudeCodeSessions.set($.sessionId,{abortController:Te,workspace:n,channel:t,threadId:r,currentSourceSeq:ie.currentSourceSeq,adoptMessageStateConsensus:te.adoptMessageStateConsensus,captureMessageStateAttemptGeneration:te.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:te.adoptMessageStateConsensusForAttempt,pauseOutbox:()=>te.pauseOutbox(),resumeOutbox:()=>te.resumeOutbox(),inputDelivered:G=>we.has(G)||qe.has(G),lastSdkActivityMs:()=>Oe,enqueueInput:G=>{if(G.sourceSeq!==void 0&&de.has(G.sourceSeq))return"duplicate";let Pe=ie.enqueue(G);return G.sourceSeq!==void 0&&(ce.noteSupersession("new_user_input"),ce.retainInput(G.sourceSeq,G.content)),G.sourceSeq!==void 0&&de.add(G.sourceSeq),Pe},closeInput:ie.close,hasActiveTurn:()=>te.activeTurnId()!==void 0,sessionWork:()=>ue.value,steerTurn:ie.enqueueSteer,interruptTurn:async G=>{ce.noteSupersession("interrupt_turn");let Pe=te.interruptActiveTurn(G);return await Ye?.interrupt(),Pe},interruptTurnBeforeAbort:G=>{let Pe=Ye;return ce.noteSupersession("interrupt_before_abort"),S6e({reason:G,threadId:r,interruptActiveTurn:We=>te.interruptActiveTurn(We),interruptSessionControls:Pe===void 0?void 0:()=>Pe.interrupt(),log:e.log})},discardQueuedFollowUpsForStop:()=>(ce.noteSupersession("stop_discard"),ie.drainUndeliveredFollowUps().map(Pe=>Pe.sourceSeq).filter(Pe=>Pe!==void 0)),markFollowUpSeqDiscarded:G=>{qe.add(G)},slashCommands:async()=>{if(In)return Be;let G=await Ye?.supportedCommands();return In||G!==void 0&&(Be=G),Be},updateSettings:async G=>{let Pe={};if(G.model!==void 0&&(await Ye?.setModel(xM(G.model)),Pe.model=G.model,N.model=G.model),G.approvalPolicy!==void 0){let We=_M(G.approvalPolicy);We!==void 0&&(await Ye?.setPermissionMode(We),Pe.approval_policy=G.approvalPolicy)}if(G.reasoningEffort!==void 0){let We=NZ(G.reasoningEffort);We!==void 0&&(await Ye?.setEffort?.(We),Pe.reasoning_effort=G.reasoningEffort)}return Pe}}),e.ensureClaudeCodeForwardPortSession?.({sessionId:$.sessionId,workspace:n,channel:t,threadId:r,cwd:e.cwd,rootSeq:o,currentSourceSeq:ie.currentSourceSeq}),te.handleTranscriptEvent($),await e.kandan.push(e.topic,"session:bind",{workspace:n,channel:t,thread_id:r,codex_thread_id:$.sessionId,provider_session_key:$.sessionId,agent_provider:"claude-code",claude_session_id:$.sessionId,cwd:e.cwd,instance_id:e.instanceId}),c=!0,T();return}if($.type==="slash_command_catalog"){Be=$.commands,$.source==="commands_changed"&&(In=!0);return}let Le=$.type==="turn_completed"||$.type==="turn_interrupted"||$.type==="session_completed"||$.type==="session_failed";if(Le){m=!0;let G=te.activeTurnId(),Pe=!1,We=()=>{},xt=()=>{Pe=!0,We()},_a=new Promise(Fo=>{We=Fo});w=xt,te.handleTranscriptEvent($);let Bi=$.type==="turn_completed"||$.type==="turn_interrupted",Ny=Bi||G!==void 0||Pe;try{Ny?(await B(_a,$),await te.flush(_Z)):w===xt&&(w=void 0)}catch(Fo){e.log("claude_code.terminal_typing_flush_timeout",{linzumi_thread_id:r,claude_session_id:$.sessionId,event_type:$.type,message:Fo instanceof Error?Fo.message:String(Fo)})}w===xt&&(w=void 0),Bi&&(j(),ie.currentSourceSeq()!==void 0&&Re()),($.type==="session_completed"||$.type==="session_failed")&&d!==void 0&&(e.activeClaudeCodeSessions.delete(d),await e.disposeClaudeCodeForwardPortSession?.(d)),$.type==="session_completed"&&Re(),m=!1,await D(),R(),P(),await tx({threadKey:r,workspace:n,channel:t,threadId:r,push:(Fo,Rc)=>e.kandan.push(e.topic,Fo,Rc),log:(Fo,Rc)=>e.log(Fo,Rc)})}if(($.type==="turn_completed"||$.type==="session_completed")&&e.log("claude_code.turn_completed",{linzumi_thread_id:r,claude_session_id:$.sessionId,body_source:$.bodySource??null,body_preview:Pu($.body)}),$.type==="rate_limit"&&await Kt($),$.type==="tool_result"&&ke?.settleTool($.itemKey),($.type==="turn_interrupted"||$.type==="session_failed")&&ke?.settleAll(),$.type==="session_failed"&&e.log("claude_code.session_failed",{linzumi_thread_id:r,claude_session_id:$.sessionId??null,model_transport_lane:Lo.lane,reason:$.reason,api_error_status:$.apiErrorProvenance?.status??null,api_error_request_id:$.apiErrorProvenance?.requestId??null,api_error_message:$.apiErrorProvenance?.message??null}),$.type==="usage"){let G=r9($.usage);G!==void 0&&e.log("claude_code.token_usage",{linzumi_thread_id:r,claude_session_id:$.sessionId,token_usage_summary:G})}Le||te.handleTranscriptEvent($)},lr=E(e.control.llmProxy),xo=y(lr?.baseUrl)?.trim(),jo=y(lr?.token)?.trim(),Lo=g8({env:process.env,llmProxyBindingPresent:xo!==void 0&&xo!==""&&jo!==void 0&&jo!=="",hostedLinzumiAgentContext:e.control.linzumiAgent!==void 0||e.options.threadProcess?.role==="thread"&&e.options.linzumiAgentMcpToken!==void 0,routedNonAnthropicModel:vQ(je.model)!==void 0});e.log("claude_code.model_transport_lane",{linzumi_thread_id:r,lane:Lo.lane,credential_class:Lo.credentialClass,reason:Lo.reason});let jy=b8({lane:Lo.lane,workspace:n,channel:t,threadId:r,model:xM(je.model),push:($,Le)=>e.kandan.push(e.topic,$,Le),log:e.log}),jr,ha,zi;if(Lo.lane==="llm_proxy"&&xo!==void 0&&xo!==""&&jo!==void 0&&jo!==""){try{jr=await GP({upstreamBaseUrl:xo,initialToken:jo,log:(Le,G)=>e.log(Le,{linzumi_thread_id:r,...G}),debugTrace:e.debugTrace,debugTraceId:e.debugTrace===void 0?void 0:`claude-code:${e.instanceId}`,dispatcher:Xo()?.dispatcher,onUpstreamRateLimited:({retryAfterMs:Le})=>qZ().notifyRateLimited({retryAfterMs:Le})});let $=jr;ha=ZP({relay:jr,mint:()=>bQ(e.kandan,e.topic,$.currentToken()),log:(Le,G)=>e.log(Le,{linzumi_thread_id:r,...G})})}catch($){e.log("llm_proxy_relay.start_failed_fallback_to_env_token",{linzumi_thread_id:r,message:$ instanceof Error?$.message:String($)}),jr=void 0,ha=void 0}zi=jr!==void 0?UZ(process.env,{baseUrl:jr.baseUrl},je.model):UZ(process.env,{baseUrl:xo,token:jo},je.model)}else zi=W6e(process.env);let Ly=K$e(zi),Pc=()=>ie.currentSourceSeq()!==void 0&&!tg({threadId:r,pendingApprovals:e.pendingClaudeCodeApprovals,pendingQuestions:e.pendingClaudeCodeUserQuestions}),Fy=($,Le)=>{if(L6e($.toolName))return Promise.resolve({type:"allow"});let G=p9($);switch(G.type){case"question":return(async()=>{await D();let Pe=await _Q({kandan:e.kandan,topic:e.topic,pendingApprovals:e.pendingClaudeCodeApprovals,pendingQuestions:e.pendingClaudeCodeUserQuestions,workspace:n,channel:t,threadId:r,sessionId:d??e.resumeSessionId,sourceSeq:ie.currentSourceSeq(),request:$,questionRequest:G.request,kind:"question",approvalDecisions:void 0,leaseEpoch:e.leaseEpochFor?.(r),signal:Le});return T(),Pe})();case"invalid":return Promise.resolve({type:"deny",message:G.message});case"not_question":{let Pe=v9(dh(r),$);return Pe!==void 0?(e.log("claude_code.tool_approval_auto_granted",{linzumi_thread_id:r,tool_name:$.toolName,request_id:$.requestId}),Promise.resolve(Pe)):q6e({kandan:e.kandan,topic:e.topic,pendingApprovals:e.pendingClaudeCodeApprovals,pendingQuestions:e.pendingClaudeCodeUserQuestions,workspace:n,channel:t,threadId:r,sessionId:d??e.resumeSessionId,sourceSeq:ie.currentSourceSeq(),request:$,leaseEpoch:e.leaseEpochFor?.(r),signal:Le})}}},Ct=(async()=>{let $;await He(),await dm({cwd:e.cwd,threadKey:r,turnRef:i===void 0?"session-start":`seq-${i}`,log:(Pe,We)=>e.log(Pe,We)});let Le=NZ(je.reasoningEffort),G=dh(r).map(FI);try{try{$=await d9({cwd:e.cwd,prompt:s,includeHookEvents:!0,developerInstructions:zf({cwd:e.cwd,agentLabel:"Claude Code",planTool:"todo-write",devServicesAvailable:!0,developerPrompt:bn,...IM(e.control),linzumiContext:un}),model:xM(je.model),...typeof Le=="string"?{effort:Le}:{},...e.debugTrace===void 0?{}:{claudeCodeDebugFile:Tt(e.debugTrace.runDir,"claude-code-debug.log")},...ae===void 0?{}:{permissionMode:ae},...G.length===0?{}:{permissionGrantRules:G},resumeSessionId:e.resumeSessionId,abortController:Te,streamingInput:ie,...e.options.claudeCodeRunner===void 0?{turnStallThresholdMs:D6e(process.env),turnStallIsActive:Pc,apiWaitStatusThresholdMs:1e4,apiWaitStatusItemKey:Pe=>{let We=ie.currentSourceSeq();return We===void 0?void 0:`system:claude-api-wait:${We}:${Pe}`}}:{},runner:e.options.claudeCodeRunner,debugTrace:e.debugTrace,canUseTool:Fy,...nn===void 0?{}:{mcpServers:nn},...ke===void 0?{}:{preToolUseHookMatchers:ke.hookMatchers,wrapApprovedToolInput:(Pe,We,xt)=>We==="Bash"?ke.wrapApprovedTool(Pe,xt):void 0},env:Ly,allowedTools:["mcp__linzumi__*"],onSessionControls:Pe=>{Ye=Pe,ae==="bypassPermissions"&&(ft=xQ({kandan:e.kandan,topic:e.topic,pendingClaudeCodeApprovals:e.pendingClaudeCodeApprovals,pendingClaudeCodeUserQuestions:e.pendingClaudeCodeUserQuestions,sessionThreadId:r,captureMessageStateAttemptGeneration:te.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:te.adoptMessageStateConsensusForAttempt,stopSession:We=>{te.interruptActiveTurn(We),Te.abort(new Error(We))},log:e.log,reason:"full_access_started"}).catch(We=>{e.log("claude_code.startup_approval_drain_failed",{linzumi_thread_id:r,claude_session_id:d??null,message:We instanceof Error?We.message:String(We)})}))},onTurnCompleted:()=>{v?v=!1:O(),ie.currentSourceSeq()!==void 0&&Re()},onTranscriptEvent:qo})}finally{let We=ie.drainUndeliveredFollowUps().map(xt=>xt.sourceSeq).filter(xt=>xt!==void 0);We.length>0&&e.onUndeliveredFollowUpsAtClose!==void 0&&e.onUndeliveredFollowUpsAtClose({channel:t,threadId:r,sourceSeqs:We}),d!==void 0&&(e.activeClaudeCodeSessions.delete(d),await e.disposeClaudeCodeForwardPortSession?.(d)),await D(),ie.close(),Ae?.(),ke?.close()}}catch(Pe){throw te.submitLifecycle("codexDied",Pe instanceof Error?Pe.message:String(Pe)),await te.close(5e3).catch(()=>{}),await Promise.race([he.settle().catch(()=>{}),new Promise(We=>{setTimeout(We,5e3).unref?.()})]),a(Pe instanceof Error?Pe.message:String(Pe)),en||e.setStartupStage("claude_code_session_failed"),Pe}return en||e.setStartupStage("posting_claude_code_output"),await te.awaitTurnsSettled(3e4),await te.close(3e4),await Promise.race([he.settle(),new Promise(Pe=>{setTimeout(Pe,1e4).unref?.()})]),$})();Ct.finally(()=>Z.unregister()).catch(()=>{}),Ct.finally(()=>{ha?.stop(),jr?.close()}).catch(()=>{}),ue.value=Ct;let _f,kd=e.options.claudeCodeRunner===void 0||process.env.LINZUMI_CLAUDE_DISPATCH_LIVENESS_MS!==void 0?Db({windowMs:uh(process.env),isDelivered:()=>Oe>0,isSessionClosed:()=>!1,lastSdkActivityMs:()=>Oe,hasPendingBlockingRequest:()=>tg({threadId:r,pendingApprovals:e.pendingClaudeCodeApprovals,pendingQuestions:e.pendingClaudeCodeUserQuestions}),log:e.log,onWedged:$=>{_f={waitedMs:$.waitedMs},e.log("claude_code.dispatch_liveness_wedged",{linzumi_thread_id:r,claude_session_id:d??e.resumeSessionId??null,waited_ms:$.waitedMs,cause:$.cause,dispatch:e.resumeSessionId===void 0?"initial_turn":"resume_turn"}),Te.abort(new Da($.waitedMs))}}):void 0;Ct.finally(()=>kd?.stop()).catch(()=>{});let Cd;try{Cd=await Promise.race([Ct.then($=>({type:"session_ended",result:$})),be.then(()=>({type:"first_turn_settled"}))])}catch($){throw _f!==void 0&&!($ instanceof Da)?new Da(_f.waitedMs):$}finally{kd?.stop()}let ya=$=>({controlResponse:{instanceId:e.instanceId,controlType:e.control.type,agentProvider:"claude-code",cwd:e.cwd,matchedRoot:e.matchedRoot,response:{session:{id:$}}},providerSession:{provider:"claude-code",cwd:e.cwd,matchedRoot:e.matchedRoot,sessionId:$}});if(Cd.type==="session_ended")return ya(Cd.result.sessionId);e.setStartupStage("posting_claude_code_output"),en=!0,await te.awaitTurnsSettled(3e4);try{await te.flush(3e4)}catch($){e.log("claude_code.first_turn_flush_timeout",{linzumi_thread_id:r,claude_session_id:d??null,message:$ instanceof Error?$.message:String($)})}ft!==void 0&&await ft;let Ic=await Promise.race([Ct.then($=>({type:"session_ended",result:$}),()=>{}),new Promise($=>{setImmediate(()=>$(void 0))})]);if(Ic!==void 0)return ya(Ic.result.sessionId);Ct.then(()=>{e.log("claude_code.session_loop_ended",{linzumi_thread_id:r,claude_session_id:d??null})},$=>{e.log("claude_code.session_loop_failed",{linzumi_thread_id:r,claude_session_id:d??null,message:$ instanceof Error?$.message:String($)})});let xf=d??e.resumeSessionId;if(xf!==void 0)return ya(xf);let bf=await Ct;return ya(bf.sessionId)}function L6e(e){return e.startsWith("mcp__linzumi__")}function FZ(e){switch(e){case"untrusted":return 0;case"on-request":return 1;case"on-failure":return 2;case"never":return 3;default:return}}function _M(e){switch(e){case"never":return"bypassPermissions";case"on-request":case"untrusted":return"default";case"on-failure":return"acceptEdits";default:return}}function NZ(e){switch(e?.trim().toLowerCase()){case"default":return null;case"low":return"low";case"medium":return"medium";case"high":return"high";case"xhigh":return"xhigh";default:return}}function F6e(e,n){return[...e.entries()].filter(([,t])=>t.threadId===n)}function N6e(e,n){return[...e.entries()].flatMap(([t,r])=>{switch(r.kind){case"question":return[];case"tool_approval":case"plan_review":return r.threadId===n?[[t,r]]:[]}})}async function xQ(e){let n=F6e(e.pendingClaudeCodeApprovals,e.sessionThreadId);for(let[r,o]of n){if(await mQ({pending:o,decision:{type:"allow"},incomingStatus:"processing",publishMessageState:()=>Io(e.kandan,e.topic,{workspace:o.workspace,channel:o.channel,threadId:o.threadId,sourceSeq:o.sourceSeq,status:"processing",reason:"Claude Code tool approved",sessionId:o.sessionId??e.sessionThreadId}),captureMessageStateAttemptGeneration:e.captureMessageStateAttemptGeneration,adoptMessageStateConsensusForAttempt:e.adoptMessageStateConsensusForAttempt,stopSession:e.stopSession,log:e.log,reason:e.reason})==="stopped")return;e.log("claude_code.approval_request_auto_approved",{request_id:r,source_seq:o.sourceSeq,session_id:o.sessionId??e.sessionThreadId,reason:e.reason})}let t=N6e(e.pendingClaudeCodeUserQuestions,e.sessionThreadId);for(let[r,o]of t){let i=o.approvalDecisions.get("Allow")??{type:"allow"};o.resolve(i),await dp(e.kandan,e.topic,{workspace:o.workspace,channel:o.channel,threadId:o.threadId,sourceSeq:o.sourceSeq,sessionId:o.sessionId,leaseEpoch:o.leaseEpoch,request:o.request,answerState:i.type==="deny"?{kind:"Denied",reason:i.message,actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:new Date().toISOString()}:{kind:"Answered",answers:[{questionId:o.request.questions[0]?.questionId??`${r}:decision`,selectedLabels:["Allow"]}],actorUserId:e.actorUserId,actorSlug:e.actorSlug,answeredAt:new Date().toISOString()},streamState:"completed"}),e.log("claude_code.user_input_request_auto_approved",{request_id:r,source_seq:o.sourceSeq,session_id:o.sessionId??e.sessionThreadId,kind:o.kind,reason:e.reason})}}function z6e(e){return ox(e)}async function U6e(e,n){let t=J6e(n);if(t===void 0)return;let r=K6e(e,n);if(r===void 0)return;let o="root",i=B6e(`${e.workspace}:${e.cwd}:${t}:${o}`);await e.kandan.push(e.topic,"claude_session_store_append",{workspace:e.workspace,channel:e.channel,thread_id:e.threadId,cwd:e.cwd,sessionId:t,subkey:o,sequence:i,entryType:n.type,payload:r})}function B6e(e){let n=zZ.get(e),t=Date.now()*1e3,r=n===void 0?t:Math.max(n+1,t);return zZ.set(e,r),r}function J6e(e){switch(e.type){case"unknown":case"session_failed":return e.sessionId;default:return e.sessionId}}function K6e(e,n){switch(n.type){case"assistant_delta":case"slash_command_catalog":return;case"session_started":return{prompt:e.initialPrompt,threadId:e.threadId,rootSeq:e.rootSeq??null};case"assistant_message":return{itemKey:n.itemKey,body:n.content,streamState:n.streamState};case"tool_call":return{itemKey:n.itemKey,toolName:n.toolName,input:n.input};case"tool_result":return{itemKey:n.itemKey,toolName:n.toolName??null,body:n.content,isError:n.isError};case"reasoning_delta":return;case"reasoning_message":return{itemKey:n.itemKey,body:n.content};case"command_output":return{itemKey:n.itemKey,body:n.content};case"command_output_delta":return;case"usage":return{usage:n.usage};case"rate_limit":return{body:`Claude Code rate limit: ${DI(n.rateLimit,Date.now())}`,status:n.rateLimit.status??null,rate_limit_type:n.rateLimit.rateLimitType??null,utilization_percent:n.rateLimit.utilizationPercent??null,resets_at_ms:n.rateLimit.resetsAtMs??null};case"unknown":return{itemKey:n.itemKey,body:n.summary};case"turn_completed":case"session_completed":return{body:n.body,bodySource:n.bodySource??null,usage:n.usage??null};case"turn_interrupted":return{body:"Claude Code turn interrupted"};case"session_failed":return{body:n.reason};case"agent_status":case"agent_task_update":case"permission_mode_changed":return}}function W6e(e){let n={};for(let[t,r]of Object.entries(e))r!==void 0&&(n[t]=r);return n}async function bQ(e,n,t){let r=await e.push(n,"llm_proxy:mint_session_token",t!==void 0&&t!==""?{currentToken:t}:{});if(ne(r)&&r.status==="ok"&&ne(r.response)&&typeof r.response.token=="string"&&r.response.token!==""){let o=r.response.max_age_seconds;return{token:r.response.token,...typeof o=="number"&&Number.isFinite(o)&&o>0?{maxAgeMs:o*1e3}:{}}}}function UZ(e,n,t){let r={};for(let[i,s]of Object.entries(e))s!==void 0&&(i==="ANTHROPIC_BASE_URL"||i==="ANTHROPIC_CUSTOM_HEADERS"||i.startsWith("CLAUDE_CODE_USE_")||(r[i]=s));r.ANTHROPIC_BASE_URL=n.baseUrl,n.token!==void 0&&(r.ANTHROPIC_CUSTOM_HEADERS=`${V6e}: ${n.token}`);let o=vQ(t);return o!==void 0&&(r.ANTHROPIC_DEFAULT_OPUS_MODEL=o,r.ANTHROPIC_DEFAULT_SONNET_MODEL=o,r.ANTHROPIC_DEFAULT_HAIKU_MODEL=o,r.CLAUDE_CODE_SUBAGENT_MODEL=o),r}function vQ(e){let n=e?.trim();switch(n){case void 0:case"":case"default":case"haiku":case"sonnet":case"opus":case"fable-5":return;default:return n.startsWith("claude")?void 0:n}}function xM(e){let n=e?.trim();switch(n){case void 0:case"":case"default":return;case"haiku":case"sonnet":case"opus":return n;case"fable-5":return"claude-fable-5";default:return H6e(n)?"sonnet":n}}function H6e(e){let n=e.toLowerCase();return n.startsWith("gpt-")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("o5")||n.startsWith("codex")}async function G6e(e,n,t,r,o){let i=fn(t,"workspace"),s=fn(t,"channel"),a=fn(t,"threadId"),d=y(t.modelProvider)?.trim(),u=y(t.model)?.trim();i===void 0||s===void 0||a===void 0||await e.push(n,"session:post_thread_message",{workspace:i,channel:s,thread_id:a,body:`Starting a new Codex thread with instructions:
1627
1627
 
1628
- ${r}`,payload:{metadata:{local_codex_runner:{event_type:"codex_start_instructions",codex_thread_id:o,instructions_body:r,...d===void 0||d===""?{}:{model_provider:d},...u===void 0||u===""?{}:{model:u}}}},client_message_id:`codex-start-instructions-${a}`})}function Pu(e){let n=e.replace(/\s+/g," ").trim();return n.length<=50?n:`${n.slice(0,47)}...`}function Z6e(e){return[e.status??"na",e.rateLimitType??"na",e.utilizationPercent??"na",e.resetsAtMs??"na"].join(":")}async function Q6e(e){await e.kandan.push(e.topic,"claude_rate_limit_state",{workspace:e.workspace,channel:e.channel,thread_id:e.threadId,agent_provider:"claude-code",...e.claudeSessionId===void 0?{}:{claude_session_id:e.claudeSessionId},rate_limit_type:e.rateLimit.rateLimitType??"account",status:e.rateLimit.status??"allowed",...e.rateLimit.utilizationPercent===void 0?{}:{utilization_percent:Math.min(100,Math.max(0,Math.round(e.rateLimit.utilizationPercent)))},...e.rateLimit.resetsAtMs===void 0?{}:{resets_at_ms:e.rateLimit.resetsAtMs}})}async function oo(e,n,t,r,o,i={}){let{failureClass:s,fateOverride:a,modelAccountRejection:d,...u}=i,c=Wa(t,r,o,{...u,...r==="failed"?Hc(s):{},...r==="failed"&&a!==void 0?{fate:a,retryable:ZC(a)}:{},...r==="failed"&&d!==void 0?{modelAccountRejection:d}:{}});c!==void 0&&await e.push(n,"message_state",c)}async function BZ(e,n={}){let t,r;try{r=U_(e.rawFailureText??e.failureReason),t=B_({stalled:!1,provenance:r})}catch(o){e.log("claude_code.start_path_fate_classification_failed",{message:o instanceof Error?o.message:String(o)})}t==="route_outage"&&r!==void 0&&X6e(e,r,n)||await oo(e.kandan,e.topic,e.control,"failed",e.failureReason,{codexThreadId:e.codexThreadId,instanceId:e.instanceId,failureClass:e.failureClass,...t===void 0?{}:{fateOverride:t}})}function X6e(e,n,t={}){let r=t.executeHold??uI,o=t.snapshotHoldCeilingMs??il,i=Y(e.control.rootSeq),s=Y(e.control.sourceSeq)??i,a=fn(e.control,"workspace"),d=fn(e.control,"channel"),u=fn(e.control,"threadId"),c=n.holdCeilingMinutes===void 0?void 0:n.holdCeilingMinutes*6e4,l=o();if(s===void 0||a===void 0||d===void 0||u===void 0||c===void 0&&(l===void 0||l<=0))return!1;let p=n.providerOutageRoute?.model,f=n.providerOutageRoute?.provider;return r({sourceSeq:s,reason:e.failureReason,provider:f,model:p,holdCeilingMs:c},{snapshotHoldCeilingMs:o,publishMessageState:g=>Io(e.kandan,e.topic,{workspace:a,channel:d,threadId:u,sourceSeq:g.sourceSeq,status:g.status,reason:g.reason,sessionId:e.codexThreadId,fate:g.fate,retryable:g.retryable,holdDeadlineAt:g.holdDeadlineAt,model:g.model,provider:g.provider}),adoptMessageStateConsensus:(g,m,_)=>(e.log("claude_code.start_path_route_outage_consensus_without_pipeline",{thread_id:u,source_seq:g,incoming_status:m,disposition:_.kind}),"stop"),redispatch:()=>!1,isSuperseded:()=>!1,attribution:()=>({...p===void 0?{}:{model:p},...f===void 0?{}:{provider:f}}),log:(g,m)=>e.log(g,{thread_id:u,start_path_never_started_turn:!0,...m})}).then(g=>{e.log("claude_code.start_path_route_outage_hold_settled",{thread_id:u,queued_seq:s,outcome:g})}).catch(async g=>{e.log("claude_code.start_path_route_outage_hold_crashed",{thread_id:u,queued_seq:s,message:g instanceof Error?g.message:String(g)});try{await oo(e.kandan,e.topic,e.control,"failed",e.failureReason,{codexThreadId:e.codexThreadId,instanceId:e.instanceId,failureClass:e.failureClass,fateOverride:"route_outage"})}catch{}}),!0}async function JZ(e,n,t,r,o,i={}){let s=Y(t.rootSeq),a=Y(t.sourceSeq)??s;if(a===void 0)return;let d=fn(t,"workspace"),u=fn(t,"channel"),c=fn(t,"threadId");d===void 0||u===void 0||c===void 0||await e.push(n,"message_state",{workspace:d,channel:u,thread_id:c,...i.instanceId===void 0?{}:{instance_id:i.instanceId},seq:a,status:"failed",reason:r,allowed_cwds:o})}async function Io(e,n,t){if(t.sourceSeq===void 0)return{kind:"unconfirmed"};let o=await(t.publishMode==="connected_only"?e.pushIfConnected:e.push)(n,"message_state",{workspace:t.workspace,channel:t.channel,thread_id:t.threadId,seq:t.sourceSeq,status:t.status,reason:t.reason,...t.status==="failed"?Hc(t.failureClass):{},...t.fate===void 0?{}:{fate:t.fate},...t.retryable===!0?{retryable:!0}:{},...t.holdDeadlineAt===void 0?{}:{hold_deadline_at:t.holdDeadlineAt},...t.model===void 0?{}:{model:t.model},...t.provider===void 0?{}:{provider:t.provider},...t.sessionId===void 0?{}:{codex_thread_id:t.sessionId},agent_provider:"claude-code"});return Od(o,"full")}function Wa(e,n,t,r={}){let o=Y(e.rootSeq),i=Y(e.sourceSeq)??o;if(i===void 0)return;let s=up(e,"workspace"),a=up(e,"channel"),d=up(e,"threadId"),u=ap(e),c=u.type==="ok"&&u.provider!=="codex"?u.provider:void 0;return{workspace:s,channel:a,thread_id:d,...r.instanceId===void 0?{}:{instance_id:r.instanceId},seq:i,status:n,reason:t,...r.codexThreadId===void 0?{}:{codex_thread_id:r.codexThreadId},...r.retryable===!0?{retryable:!0}:{},...r.fate!==void 0&&Bo(r.fate)?{fate:r.fate}:{},...r.modelAccountRejection===void 0?{}:{model_account_compatibility_identity:{agent_provider:r.modelAccountRejection.identity[0],model_provider:r.modelAccountRejection.identity[1]??null,model:r.modelAccountRejection.identity[2]},model_account_compatibility_rejection_reason:r.modelAccountRejection.reason},...c===void 0?{}:{agent_provider:c}}}function up(e,n){return Y6e(e,n)}function Y6e(e,n){let t=fn(e,n);if(t===void 0)throw new Error(`${e.type} control missing ${n}`);return t}function fn(e,n){let t=y(e[n])?.trim();if(!(t===void 0||t===""))return t}function mp(e,n){let t=gp(e),r=n.sandbox??t.sandbox,o=y(n.modelProvider)?.trim(),i=n.sandboxedApprovalNeverDefault===!0?!0:void 0;return{model:n.model??t.model,modelProvider:o===void 0||o===""?void 0:o,modelTransportCatalogStatus:n.modelTransportCatalogStatus,reasoningEffort:n.reasoningEffort??t.reasoningEffort,collaborationMode:n.collaborationMode??t.collaborationMode,approvalPolicy:jf(n.approvalPolicy??t.approvalPolicy,r,{sandboxedNeverDefault:i}),sandbox:r,sandboxedApprovalNeverDefault:i,fast:n.fast??e.fast,allowPortForwardingByDefault:n.allowPortForwardingByDefault??t.allowPortForwardingByDefault??!0}}function eje(e){return{...e.model===void 0?{}:{model:e.model},...e.reasoningEffort===void 0?{}:{reasoningEffort:e.reasoningEffort},...e.approvalPolicy===void 0?{}:{approvalPolicy:Lf(e.approvalPolicy,e.sandbox,{sandboxedNeverDefault:e.sandboxedApprovalNeverDefault})},...e.sandbox===void 0?{}:{sandbox:e.sandbox},...e.fast===!0?{serviceTier:"fast"}:{}}}function wQ(e){let{runtimeSettings:n}=e;return{type:"reconnect_thread",workspace:e.workspaceSlug,channel:e.channelSlug,threadId:e.kandanThreadId,codexThreadId:e.codexThreadId,cwd:e.cwd,agentProvider:"codex",...n.collaborationMode===void 0?{}:{collaborationMode:n.collaborationMode},...e.rootSeq===void 0?{}:{rootSeq:e.rootSeq},...n.model===void 0?{}:{model:n.model},...n.reasoningEffort===void 0?{}:{reasoningEffort:n.reasoningEffort},...n.sandbox===void 0?{}:{sandbox:n.sandbox},...n.approvalPolicy===void 0?{}:{approvalPolicy:n.approvalPolicy},...n.fast===void 0?{}:{fast:n.fast}}}function nje(e){switch(e){case"exhausted":return"couldn't resume this job after several attempts; please resend your last message to continue.";case"withheld":return"this message may have already run before an unexpected shutdown; it was not re-run to avoid duplicating work. Please resend if it did not complete.";case"permanent":return"couldn't resume this job's coding session."}}function tje(e){switch(e){case"exhausted":return"dead_letter_exhausted";case"withheld":return"dead_letter_withheld";case"permanent":return"dead_letter_permanent"}}function ip(e){let n=e.control,t=Y(n.rootSeq),r=y(n.model),o=y(n.reasoningEffort),i=y(n.sandbox),s=y(n.approvalPolicy),a=n.collaborationMode==="plan"||n.collaborationMode==="default"?n.collaborationMode:void 0,d=typeof n.fast=="boolean"?n.fast:void 0;return{type:"reconnect_thread",workspace:e.workspace,channel:e.channel,threadId:e.kandanThreadId,codexThreadId:e.codexThreadId,cwd:e.cwd,agentProvider:"codex",...a===void 0?{}:{collaborationMode:a},...t===void 0?{}:{rootSeq:t},...r===void 0?{}:{model:r},...o===void 0?{}:{reasoningEffort:o},...i===void 0?{}:{sandbox:i},...s===void 0?{}:{approvalPolicy:s},...d===void 0?{}:{fast:d}}}function rje(e){let{control:n}=e;if(n.type!=="reconnect_thread")return;let t=fn(n,"channel"),r=fn(n,"threadId"),o=fn(n,"workspace"),i=Y(n.rootSeq),s=Y(n.sourceSeq)??i,a=Ro(n.workDescription),d=y(n.codexThreadId),u=y(n.cwd);if(!pG({controlType:n.type,channel:t,threadId:r,sourceSeq:s,workDescription:a,workspace:o,codexThreadId:d,cwd:u,agentProvider:n.agentProvider,hasRegistryRecord:e.hasRegistryRecord}).hold||t===void 0||r===void 0||s===void 0||a===void 0)return;let l={seq:s,type:"thread.message",actorKind:void 0,actorSlug:e.identity.actorUsername,actorUserId:e.identity.actorUserId,threadId:r,threadTitle:void 0,replyToSeq:i,localRunnerEventType:void 0,body:a,attachments:vi($e(n.attachments)??[]),traceparent:y(n.traceparent)},p=e.hasRegistryRecord||o===void 0||d===void 0||u===void 0?void 0:{workspace:o,channel:t,kandanThreadId:r,codexThreadId:d,cwd:u,agentProvider:"codex",control:wQ({workspaceSlug:o,channelSlug:t,kandanThreadId:r,codexThreadId:d,cwd:u,rootSeq:i,runtimeSettings:e.runtimeSettings}),updatedAtMs:e.nowMs};return{channel:t,threadId:r,sourceSeq:s,codexThreadId:d,queuePayload:jc(l),registryRecord:p}}async function oje(e){let{plan:n}=e,t=e.queue.enqueue(n.sourceSeq,"replay",n.queuePayload,e.nowMs);try{if(n.registryRecord!==void 0&&e.upsertRegistryRecord(n.registryRecord),e.queuedStatePayload!==void 0)try{await e.pushQueuedState(e.queuedStatePayload)}catch(r){e.log("runner.update_restart_drain_held_state_push_failed",{thread_id:n.threadId,source_seq:n.sourceSeq,message:r instanceof Error?r.message:String(r)})}e.trackHeld({channel:n.channel,threadId:n.threadId,sourceSeq:n.sourceSeq,heldAtMs:e.nowMs})}catch(r){return e.log("runner.update_restart_drain_hold_compensated",{thread_id:n.threadId,source_seq:n.sourceSeq,residual_duplicate_entry:!t.accepted,message:r instanceof Error?r.message:String(r)}),t.accepted&&e.queue.deadLetter(n.sourceSeq),{held:!1}}return{held:!0,enqueuedFresh:t.accepted}}function KZ(e){if(e.rootPid===void 0&&e.start===void 0)return;let n=[process.pid,...e.rootPid===void 0?[]:[e.rootPid],...e.commanderBoundPids??[]],t=e.commanderBoundPorts??[];return{...e.rootPid===void 0?{}:{rootPid:e.rootPid},...n.length===0?{}:{commanderBoundPids:n},...t.length===0?{}:{commanderBoundPorts:t},...e.start===void 0?{}:{start:e.start}}}function VZ(e){return e.threadProcess?.role!=="thread"&&e.codexUrl===void 0}async function ije(e){let n=process.env.LINZUMI_E2E_COMMANDER_BOUND_HTTP_PORT;if(n===void 0||n.trim()==="")return;let t=sje(n,"LINZUMI_E2E_COMMANDER_BOUND_HTTP_PORT"),r=E$e((o,i)=>{i.writeHead(200,{"content-type":"text/plain; charset=utf-8"}),i.end(`linzumi commander-bound probe
1628
+ ${r}`,payload:{metadata:{local_codex_runner:{event_type:"codex_start_instructions",codex_thread_id:o,instructions_body:r,...d===void 0||d===""?{}:{model_provider:d},...u===void 0||u===""?{}:{model:u}}}},client_message_id:`codex-start-instructions-${a}`})}function Pu(e){let n=e.replace(/\s+/g," ").trim();return n.length<=50?n:`${n.slice(0,47)}...`}function Z6e(e){return[e.status??"na",e.rateLimitType??"na",e.utilizationPercent??"na",e.resetsAtMs??"na"].join(":")}async function Q6e(e){await e.kandan.push(e.topic,"claude_rate_limit_state",{workspace:e.workspace,channel:e.channel,thread_id:e.threadId,agent_provider:"claude-code",...e.claudeSessionId===void 0?{}:{claude_session_id:e.claudeSessionId},rate_limit_type:e.rateLimit.rateLimitType??"account",status:e.rateLimit.status??"allowed",...e.rateLimit.utilizationPercent===void 0?{}:{utilization_percent:Math.min(100,Math.max(0,Math.round(e.rateLimit.utilizationPercent)))},...e.rateLimit.resetsAtMs===void 0?{}:{resets_at_ms:e.rateLimit.resetsAtMs}})}async function oo(e,n,t,r,o,i={}){let{failureClass:s,fateOverride:a,modelAccountRejection:d,...u}=i,c=Wa(t,r,o,{...u,...r==="failed"?Hc(s):{},...r==="failed"&&a!==void 0?{fate:a,retryable:ZC(a)}:{},...r==="failed"&&d!==void 0?{modelAccountRejection:d}:{}});c!==void 0&&await e.push(n,"message_state",c)}async function BZ(e,n={}){let t,r;try{r=U_(e.rawFailureText??e.failureReason),t=B_({stalled:!1,provenance:r})}catch(o){e.log("claude_code.start_path_fate_classification_failed",{message:o instanceof Error?o.message:String(o)})}t==="route_outage"&&r!==void 0&&X6e(e,r,n)||await oo(e.kandan,e.topic,e.control,"failed",e.failureReason,{codexThreadId:e.codexThreadId,instanceId:e.instanceId,failureClass:e.failureClass,...t===void 0?{}:{fateOverride:t}})}function X6e(e,n,t={}){let r=t.executeHold??uI,o=t.snapshotHoldCeilingMs??il,i=Y(e.control.rootSeq),s=Y(e.control.sourceSeq)??i,a=fn(e.control,"workspace"),d=fn(e.control,"channel"),u=fn(e.control,"threadId"),c=n.holdCeilingMinutes===void 0?void 0:n.holdCeilingMinutes*6e4,l=o();if(s===void 0||a===void 0||d===void 0||u===void 0||c===void 0&&(l===void 0||l<=0))return!1;let p=n.providerOutageRoute?.model,f=n.providerOutageRoute?.provider;return r({sourceSeq:s,reason:e.failureReason,provider:f,model:p,holdCeilingMs:c},{snapshotHoldCeilingMs:o,publishMessageState:g=>Io(e.kandan,e.topic,{workspace:a,channel:d,threadId:u,sourceSeq:g.sourceSeq,status:g.status,reason:g.reason,sessionId:e.codexThreadId,fate:g.fate,retryable:g.retryable,holdDeadlineAt:g.holdDeadlineAt,model:g.model,provider:g.provider}),adoptMessageStateConsensus:(g,m,_)=>(e.log("claude_code.start_path_route_outage_consensus_without_pipeline",{thread_id:u,source_seq:g,incoming_status:m,disposition:_.kind}),"stop"),redispatch:()=>!1,isSuperseded:()=>!1,attribution:()=>({...p===void 0?{}:{model:p},...f===void 0?{}:{provider:f}}),log:(g,m)=>e.log(g,{thread_id:u,start_path_never_started_turn:!0,...m})}).then(g=>{e.log("claude_code.start_path_route_outage_hold_settled",{thread_id:u,queued_seq:s,outcome:g})}).catch(async g=>{e.log("claude_code.start_path_route_outage_hold_crashed",{thread_id:u,queued_seq:s,message:g instanceof Error?g.message:String(g)});try{await oo(e.kandan,e.topic,e.control,"failed",e.failureReason,{codexThreadId:e.codexThreadId,instanceId:e.instanceId,failureClass:e.failureClass,fateOverride:"route_outage"})}catch{}}),!0}async function JZ(e,n,t,r,o,i={}){let s=Y(t.rootSeq),a=Y(t.sourceSeq)??s;if(a===void 0)return;let d=fn(t,"workspace"),u=fn(t,"channel"),c=fn(t,"threadId");d===void 0||u===void 0||c===void 0||await e.push(n,"message_state",{workspace:d,channel:u,thread_id:c,...i.instanceId===void 0?{}:{instance_id:i.instanceId},seq:a,status:"failed",reason:r,allowed_cwds:o})}async function Io(e,n,t){if(t.sourceSeq===void 0)return{kind:"unconfirmed"};let o=await(t.publishMode==="connected_only"?e.pushIfConnected:e.push)(n,"message_state",{workspace:t.workspace,channel:t.channel,thread_id:t.threadId,seq:t.sourceSeq,status:t.status,reason:t.reason,...t.status==="failed"?Hc(t.failureClass):{},...t.fate===void 0?{}:{fate:t.fate},...t.retryable===!0?{retryable:!0}:{},...t.holdDeadlineAt===void 0?{}:{hold_deadline_at:t.holdDeadlineAt},...t.model===void 0?{}:{model:t.model},...t.provider===void 0?{}:{provider:t.provider},...t.sessionId===void 0?{}:{codex_thread_id:t.sessionId},agent_provider:"claude-code"});return Od(o,"full")}function Wa(e,n,t,r={}){let o=Y(e.rootSeq),i=Y(e.sourceSeq)??o;if(i===void 0)return;let s=up(e,"workspace"),a=up(e,"channel"),d=up(e,"threadId"),u=ap(e),c=u.type==="ok"&&u.provider!=="codex"?u.provider:void 0;return{workspace:s,channel:a,thread_id:d,...r.instanceId===void 0?{}:{instance_id:r.instanceId},seq:i,status:n,reason:t,...r.codexThreadId===void 0?{}:{codex_thread_id:r.codexThreadId},...r.retryable===!0?{retryable:!0}:{},...r.fate!==void 0&&Bo(r.fate)?{fate:r.fate}:{},...r.modelAccountRejection===void 0?{}:{model_account_compatibility_identity:{agent_provider:r.modelAccountRejection.identity[0],model_provider:r.modelAccountRejection.identity[1]??null,model:r.modelAccountRejection.identity[2]},model_account_compatibility_rejection_reason:r.modelAccountRejection.reason},...c===void 0?{}:{agent_provider:c}}}function up(e,n){return Y6e(e,n)}function Y6e(e,n){let t=fn(e,n);if(t===void 0)throw new Error(`${e.type} control missing ${n}`);return t}function fn(e,n){let t=y(e[n])?.trim();if(!(t===void 0||t===""))return t}function mp(e,n){let t=gp(e),r=n.sandbox??t.sandbox,o=y(n.modelProvider)?.trim(),i=n.sandboxedApprovalNeverDefault===!0?!0:void 0;return{model:n.model??t.model,modelProvider:o===void 0||o===""?void 0:o,modelTransportCatalogStatus:n.modelTransportCatalogStatus,reasoningEffort:n.reasoningEffort??t.reasoningEffort,collaborationMode:n.collaborationMode??t.collaborationMode,approvalPolicy:jf(n.approvalPolicy??t.approvalPolicy,r,{sandboxedNeverDefault:i}),sandbox:r,sandboxedApprovalNeverDefault:i,fast:n.fast??e.fast,allowPortForwardingByDefault:n.allowPortForwardingByDefault??t.allowPortForwardingByDefault??!0}}function eje(e,n={}){return{...e.model===void 0?{}:{model:e.model},...e.fast===!0?{serviceTier:"fast"}:{},...n.cwd===void 0?{}:{cwd:n.cwd},...e.approvalPolicy===void 0?{}:{approvalPolicy:Lf(e.approvalPolicy,e.sandbox,{sandboxedNeverDefault:e.sandboxedApprovalNeverDefault})},...e.sandbox===void 0?{}:{sandbox:e.sandbox},...e.reasoningEffort===void 0?{}:{config:{model_reasoning_effort:e.reasoningEffort}},...n.serviceName===void 0?{}:{serviceName:n.serviceName},...n.developerInstructions===void 0?{}:{developerInstructions:n.developerInstructions},...n.personality===void 0?{}:{personality:n.personality}}}function wQ(e){let{runtimeSettings:n}=e;return{type:"reconnect_thread",workspace:e.workspaceSlug,channel:e.channelSlug,threadId:e.kandanThreadId,codexThreadId:e.codexThreadId,cwd:e.cwd,agentProvider:"codex",...n.collaborationMode===void 0?{}:{collaborationMode:n.collaborationMode},...e.rootSeq===void 0?{}:{rootSeq:e.rootSeq},...n.model===void 0?{}:{model:n.model},...n.reasoningEffort===void 0?{}:{reasoningEffort:n.reasoningEffort},...n.sandbox===void 0?{}:{sandbox:n.sandbox},...n.approvalPolicy===void 0?{}:{approvalPolicy:n.approvalPolicy},...n.fast===void 0?{}:{fast:n.fast}}}function nje(e){switch(e){case"exhausted":return"couldn't resume this job after several attempts; please resend your last message to continue.";case"withheld":return"this message may have already run before an unexpected shutdown; it was not re-run to avoid duplicating work. Please resend if it did not complete.";case"permanent":return"couldn't resume this job's coding session."}}function tje(e){switch(e){case"exhausted":return"dead_letter_exhausted";case"withheld":return"dead_letter_withheld";case"permanent":return"dead_letter_permanent"}}function ip(e){let n=e.control,t=Y(n.rootSeq),r=y(n.model),o=y(n.reasoningEffort),i=y(n.sandbox),s=y(n.approvalPolicy),a=n.collaborationMode==="plan"||n.collaborationMode==="default"?n.collaborationMode:void 0,d=typeof n.fast=="boolean"?n.fast:void 0;return{type:"reconnect_thread",workspace:e.workspace,channel:e.channel,threadId:e.kandanThreadId,codexThreadId:e.codexThreadId,cwd:e.cwd,agentProvider:"codex",...a===void 0?{}:{collaborationMode:a},...t===void 0?{}:{rootSeq:t},...r===void 0?{}:{model:r},...o===void 0?{}:{reasoningEffort:o},...i===void 0?{}:{sandbox:i},...s===void 0?{}:{approvalPolicy:s},...d===void 0?{}:{fast:d}}}function rje(e){let{control:n}=e;if(n.type!=="reconnect_thread")return;let t=fn(n,"channel"),r=fn(n,"threadId"),o=fn(n,"workspace"),i=Y(n.rootSeq),s=Y(n.sourceSeq)??i,a=Ro(n.workDescription),d=y(n.codexThreadId),u=y(n.cwd);if(!pG({controlType:n.type,channel:t,threadId:r,sourceSeq:s,workDescription:a,workspace:o,codexThreadId:d,cwd:u,agentProvider:n.agentProvider,hasRegistryRecord:e.hasRegistryRecord}).hold||t===void 0||r===void 0||s===void 0||a===void 0)return;let l={seq:s,type:"thread.message",actorKind:void 0,actorSlug:e.identity.actorUsername,actorUserId:e.identity.actorUserId,threadId:r,threadTitle:void 0,replyToSeq:i,localRunnerEventType:void 0,body:a,attachments:vi($e(n.attachments)??[]),traceparent:y(n.traceparent)},p=e.hasRegistryRecord||o===void 0||d===void 0||u===void 0?void 0:{workspace:o,channel:t,kandanThreadId:r,codexThreadId:d,cwd:u,agentProvider:"codex",control:wQ({workspaceSlug:o,channelSlug:t,kandanThreadId:r,codexThreadId:d,cwd:u,rootSeq:i,runtimeSettings:e.runtimeSettings}),updatedAtMs:e.nowMs};return{channel:t,threadId:r,sourceSeq:s,codexThreadId:d,queuePayload:jc(l),registryRecord:p}}async function oje(e){let{plan:n}=e,t=e.queue.enqueue(n.sourceSeq,"replay",n.queuePayload,e.nowMs);try{if(n.registryRecord!==void 0&&e.upsertRegistryRecord(n.registryRecord),e.queuedStatePayload!==void 0)try{await e.pushQueuedState(e.queuedStatePayload)}catch(r){e.log("runner.update_restart_drain_held_state_push_failed",{thread_id:n.threadId,source_seq:n.sourceSeq,message:r instanceof Error?r.message:String(r)})}e.trackHeld({channel:n.channel,threadId:n.threadId,sourceSeq:n.sourceSeq,heldAtMs:e.nowMs})}catch(r){return e.log("runner.update_restart_drain_hold_compensated",{thread_id:n.threadId,source_seq:n.sourceSeq,residual_duplicate_entry:!t.accepted,message:r instanceof Error?r.message:String(r)}),t.accepted&&e.queue.deadLetter(n.sourceSeq),{held:!1}}return{held:!0,enqueuedFresh:t.accepted}}function KZ(e){if(e.rootPid===void 0&&e.start===void 0)return;let n=[process.pid,...e.rootPid===void 0?[]:[e.rootPid],...e.commanderBoundPids??[]],t=e.commanderBoundPorts??[];return{...e.rootPid===void 0?{}:{rootPid:e.rootPid},...n.length===0?{}:{commanderBoundPids:n},...t.length===0?{}:{commanderBoundPorts:t},...e.start===void 0?{}:{start:e.start}}}function VZ(e){return e.threadProcess?.role!=="thread"&&e.codexUrl===void 0}async function ije(e){let n=process.env.LINZUMI_E2E_COMMANDER_BOUND_HTTP_PORT;if(n===void 0||n.trim()==="")return;let t=sje(n,"LINZUMI_E2E_COMMANDER_BOUND_HTTP_PORT"),r=E$e((o,i)=>{i.writeHead(200,{"content-type":"text/plain; charset=utf-8"}),i.end(`linzumi commander-bound probe
1629
1629
  `)});return await aje(r,t),e("runner.e2e_commander_bound_http_probe_started",{port:t}),{port:t,close:()=>dje(r)}}function sje(e,n){let t=e.trim(),r=Number.parseInt(t,10);if(!/^\d+$/u.test(t)||!Number.isInteger(r))throw new Error(`${n} must be an integer TCP port`);if(r<=0||r>65535)throw new Error(`${n} must be between 1 and 65535`);return r}function aje(e,n){return new Promise((t,r)=>{let o=s=>{e.off("listening",i),r(s)},i=()=>{e.off("error",o),t()};e.once("error",o),e.once("listening",i),e.listen(n,"127.0.0.1")})}function dje(e){return e.listening?new Promise((n,t)=>{e.close(r=>{if(r!==void 0){t(r);return}n()})}):Promise.resolve()}function uje(e){return ul({rootPid:process.pid,commanderBoundPids:[process.pid],onCandidate:n=>{if(n.portKind!=="commander_bound"||e.managedForwardPorts.has(n.port))return;let t=es(n.command);e.markCommanderManagedForwardPort(n.port,{processName:t?.appName??qm(n),processIconKey:t?.iconKey??"terminal"}),e.pushForwardPortEvent("forward_port_resolved",{instanceId:e.instanceId,requestId:`commander-bound-${n.pid}-${n.port}`,port:n.port,decision:"approve",capabilities:e.capabilitiesPayload()})},onCandidateLost:n=>{n.portKind==="commander_bound"&&e.managedForwardPorts.has(n.port)&&(e.clearCommanderManagedForwardPort(n.port),e.pushForwardPortEvent("forward_port_revoked",{instanceId:e.instanceId,requestId:`commander-bound-${n.pid}-${n.port}`,port:n.port,decision:"revoked",reason:"listener_exited",capabilities:Ia(e.capabilitiesPayload(),n.port)}))},onError:n=>e.log("port_forward.commander_bound_watch_failed",{message:n.message})})}function cje(e){if(e.codingJobToolScope==="coding"&&e.linzumiAgent?.mcpToken===void 0&&!IM(e).projectBound)return"coding"}function EM(e){if(e.multiAgentJobsEnabled!==!0)return;let n=e.codingJob?.mcpToken?.trim();if(n===void 0||n==="")throw new Error(`${e.type} control enabled multi-agent jobs without codingJob.mcpToken`);return n}function lje(e,n){return EM(e)}function pje(e){let n=mp(e.options,e.control),t=v0(e.control);return{...e.options,clientId:void 0,machineId:void 0,runnerLockConfigPath:void 0,workspaceSlug:e.workspaceSlug,cwd:e.cwd,codexUrl:void 0,launchTui:!1,allowedCwds:Array.from(new Set([e.cwd,...e.options.allowedCwds])),codeServerBin:e.options.editorRuntime?.mode==="server_managed"?void 0:e.options.codeServerBin,editorRuntime:void 0,threadProcess:{role:"thread",kandanThreadId:e.kandanThreadId},codexModelProvider:t.type==="provider"?t.runtime:void 0,linzumiAgentMcpToken:e.control.linzumiAgent?.mcpToken??e.options.linzumiAgentMcpToken,codingJobMcpToken:EM(e.control),codingJobToolScope:cje(e.control),multiAgentJobs:e.control.multiAgentJobsEnabled===!0,multiAgentJobsEligible:e.control.multiAgentJobsEligible===!0,vmExecution:e.options.vmExecution,executionMode:e.control.type==="start_instance"?MM(e.control.executionMode):e.options.executionMode,egressMode:e.control.type==="start_instance"?DM(e.control.egressMode):e.options.egressMode,projectId:e.control.type==="start_instance"?dLe(e.control.projectId):e.options.projectId,projectPublicId:e.control.type==="start_instance"?rg(e.control.projectPublicId):e.options.projectPublicId,goldenImagePublicId:e.control.type==="start_instance"?rg(e.control.goldenImagePublicId):e.options.goldenImagePublicId,spawnThreadRunner:void 0,localVmReadinessProbe:void 0,threadRunnerReadyTimeoutMs:e.options.threadRunnerReadyTimeoutMs,runtimeDefaults:{model:n.model,reasoningEffort:n.reasoningEffort,collaborationMode:n.collaborationMode,sandbox:n.sandbox,approvalPolicy:n.approvalPolicy,allowPortForwardingByDefault:n.allowPortForwardingByDefault},channelSession:void 0}}function fje(e){if(e===void 0||!Number.isInteger(e)||e<=0)return!0;try{return process.kill(e,0),!0}catch(n){return n?.code==="EPERM"}}function m0(e){if(e.kind==="starting")return"starting";let n=e.handle;return n.codex.isClosed?.()===!0||n.sessionClosed?.()===!0?"dead":fje(n.processPid)?"live":"dead"}async function Gh(e){switch(e.kind){case"running":if(e.handle.closeWithOutcome!==void 0)return e.handle.closeWithOutcome();await e.handle.close();return;case"starting":try{let n=await e.promise;if(n.closeWithOutcome!==void 0)return n.closeWithOutcome();await n.close();return}catch{return}}}function hje(e){return e.length>WZ?e.slice(e.length-WZ):e}function HZ(e){let n=e instanceof Error?e.message:String(e??"");return gje.test(n)}function yje(e){let n=no(e.cwd,e.allowedCwds);if(n.ok)return;let t=e.allowedCwds.length===0?"none":e.allowedCwds.join(", ");return{reason:n.reason,message:`${kQ} (${n.reason}): working directory ${e.cwd} cannot start a coding session on this runner (allowed roots: ${t})`}}function _je(e){return e.split(`
1630
1630
  `).map(n=>n.trim()).find(n=>n.startsWith(kQ))}function xje(e){let t=(e instanceof Error?e.message:String(e??"")).trim();return`stillborn_worker: ${t===""?"the engine worker never started":fp(t,TM)}`}function bje(e){if(vI(e)){let n=e instanceof Error?e.message:String(e);return{reason:`cwd_stillbirth_circuit_open: ${fp(n.trim(),TM)}`,failureClass:"cwd_stillbirth_circuit_open"}}if(UA(e)){let n=e instanceof Error?e.message:String(e);return{reason:`runner_updating: ${fp(n.trim(),TM)}`,failureClass:"runner_updating"}}return{reason:xje(e),failureClass:"stillborn_worker"}}function vje(e){let n=`thread Codex worker exited before ready: code=${e.code??"null"} signal=${e.signal??"null"}`,t=e.capturedOutput.trim();return t===""?n:`${n}
1631
1631
  worker output: ${t}`}async function wje(e,n={}){let t=Math.max(1,n.maxAttempts??SQ),r=n.backoffMs??mje,o=n.sleep??(s=>new Promise(a=>setTimeout(a,s))),i;for(let s=1;s<=t;s++){let a=await e(s);if(a.kind==="ready")return a.handle;i=a;let d=_je(a.capturedOutput),u=s<t&&d===void 0;if(ye("runner.thread_runner_exited_before_ready",{purpose:"linzumi.thread_runner",attempt:s,maxAttempts:t,code:a.code,signal:a.signal,capturedOutput:a.capturedOutput,willRespawn:u,...d===void 0?{}:{deterministicPreflightFailure:d}}),d!==void 0)throw new Error(d);if(!u)break;n.onRespawn?.({attemptNumber:s+1,previous:a}),r>0&&await o(r)}throw new Error(vje(i??{kind:"exited-before-ready",code:null,signal:null,capturedOutput:""}))}function Sje(e){return Zm({stop:()=>{try{e.exitCode===null&&e.signalCode===null&&e.kill("SIGINT")}catch{}},pid:e.pid,ownProcessGroup:!1,kind:"linzumi.thread_runner"})}function kje(){AM.value=zh({argv1:process.argv[1],cwd:process.cwd(),onEvent:TQ})}function Cje(e,n){return{LINZUMI_THREAD_RUNNER_ROLE:"thread",LINZUMI_THREAD_RUNNER_KANDAN_THREAD_ID:e.threadProcess?.kandanThreadId??"",LINZUMI_THREAD_RUNNER_TOKEN:e.token,LINZUMI_DEV_SERVICES_PARENT_PID:String(n.devServicesParentPid),...e.codexModelProvider===void 0?{}:{LINZUMI_LLM_PROXY_TOKEN:e.codexModelProvider.llmProxyToken},LINZUMI_THREAD_RUNNER_AGENT_MCP_TOKEN:e.linzumiAgentMcpToken??"",LINZUMI_THREAD_RUNNER_CODING_JOB_MCP_TOKEN:e.codingJobMcpToken??"",...n.forwardableOpenAiApiKey===void 0?{}:{OPENAI_API_KEY:n.forwardableOpenAiApiKey}}}async function Tje(e){let n=gH({pinnedRef:AM,argv1:process.argv[1],cwd:process.cwd(),onEvent:TQ}),t=e.threadProcess?.kandanThreadId??"",r=nV({codexBin:e.codexBin,source:e.dependencyStatus?.codex.source}),o=["run",...Oje(r.codexBin===e.codexBin?e:{...e,codexBin:r.codexBin})],i=GZ(n,o),s=GZ(n,$je(o)),a=e.codexModelProvider?.provider==="openai-proxy"?Bs():void 0,d={...process.env,...Cje(e,{devServicesParentPid:$M(e),forwardableOpenAiApiKey:a})};return wje(async c=>{ye("process.spawn",{command:process.execPath,args:s,cwd:e.cwd,attempt:c,purpose:"linzumi.thread_runner",codex_bin_path:r.codexBin,codex_bin_source:r.source??null,codex_version:e.dependencyStatus?.codex.version??null});let l=C0(process.execPath,i,{cwd:e.cwd,env:d,stdio:["inherit","pipe","pipe","ipc"]}),p="",f={active:!0},g=(C,T)=>{let P=l[C];P!==null&&P.on("data",LW({tuiActive:dA,terminal:T,writeAuditEvent:ye,pid:l.pid,streamName:C,capture:f,appendCapturedOutput:O=>{p=hje(`${p}${O}`)}}))};g("stdout",process.stdout),g("stderr",process.stderr),ye("process.spawned",{command:process.execPath,args:s,cwd:e.cwd,pid:l.pid,attempt:c,purpose:"linzumi.thread_runner"});let m=Sje(l),_=new Set,b={exited:!1},w={closed:!1};l.on("message",C=>{bH(C)&&(w.closed=!0,ye("runner.thread_runner_session_detached",{purpose:"linzumi.thread_runner",kandanThreadId:C.kandanThreadId,reason:C.reason,pid:l.pid})),vH(C)&&SH(T=>{if(l.send===void 0||l.connected===!1)throw new Error("thread worker IPC channel closed");l.send(T)},C,CQ.value)}),l.once("exit",(C,T)=>{ye("process.exit",{command:process.execPath,args:s,cwd:e.cwd,pid:l.pid,code:C,signal:T,purpose:"linzumi.thread_runner"}),m.unregister(),b.exited=!0;for(let P of _)P();_.clear()});let v=await new Promise((C,T)=>{let P=!1,O,R=()=>{O!==void 0&&clearTimeout(O),l.off("message",B),l.off("close",K)},j=W=>{P||(P=!0,R(),W())},B=W=>{let H=(()=>{try{return Rje(W,t)}catch(X){j(()=>T(X instanceof Error?X:new Error(String(X))));return}})();H!==void 0&&j(()=>C({kind:"ready",kandanThreadId:H.kandanThreadId,commanderManagedPorts:H.commanderManagedPorts}))},K=(W,H)=>{j(()=>C({kind:"exited-before-ready",code:W,signal:H,capturedOutput:p}))},D=()=>{j(()=>{l.kill("SIGINT"),T(PQ(t,J))})};l.on("message",B),l.once("close",K);let J=IQ(e);O=setTimeout(D,J)});if(v.kind==="exited-before-ready")return v;f.active=!1;let S=async()=>{let C=await dB(l);return(C==="exited_after_sigkill"||C==="abandoned")&&ye("runner.thread_runner_close_escalated",{purpose:"linzumi.thread_runner",kandanThreadId:t,pid:l.pid,outcome:C}),C};return{kind:"ready",handle:{kandanThreadId:v.kandanThreadId,codex:CH(l),processPid:l.pid,commanderManagedPorts:v.commanderManagedPorts,sessionClosed:()=>w.closed,onExit:C=>{if(b.exited){queueMicrotask(C);return}_.add(C)},closeWithOutcome:S,close:async()=>{await S()}}}},{onRespawn:({attemptNumber:c})=>{ye("runner.thread_runner_respawn",{purpose:"linzumi.thread_runner",kandanThreadId:t,cwd:e.cwd,attempt:c,maxAttempts:SQ})}})}function GZ(e,n){return[...Xh(process.execArgv),e,...n]}function Xh(e,n=0){let t=e[n];if(t===void 0)return[];if(Pje(t)){let r=e[n+1];return r===void 0?Xh(e,n+1):[t,r,...Xh(e,n+2)]}return Ije(t)?[t,...Xh(e,n+1)]:Xh(e,n+1)}function Pje(e){return["--require","-r","--import","--loader","--experimental-loader"].includes(e)}function Ije(e){return["--require=","-r=","--import=","--loader=","--experimental-loader="].some(n=>e.startsWith(n))}function Rje(e,n){if(!ne(e)||e.type!=="linzumi_thread_codex_worker_ready")return;let t=y(e.kandanThreadId);if(t!==n)throw new Error("thread Codex worker reported invalid ready payload");return{kandanThreadId:t,commanderManagedPorts:Eje(e.commanderManagedPorts)}}function Eje(e){return Array.isArray(e)?e.flatMap(n=>{if(!ne(n))return[];let t=Y(n.port);if(t===void 0||t<1||t>65535)return[];let r=Y(n.pid),o=y(n.processName),i=y(n.processIconKey),s=Aje(n.agentProvider);return[{port:t,...r===void 0?{}:{pid:r},...o===void 0?{}:{processName:o},...i===void 0?{}:{processIconKey:i},...s===void 0?{}:{agentProvider:s}}]}):[]}function Aje(e){switch(y(e)){case"codex":return"codex";case"claude-code":return"claude-code";default:return}}function Mje(e,n){let t=n?.proc??process;return new Promise(r=>{let o=R0(()=>{t.off("disconnect",o),t.off("SIGINT",o),t.off("SIGTERM",i),e.off("exit",o),r()}),i=()=>{if(_G({signal:"SIGTERM",parentIpcConnected:t.connected===!0,platform:t.platform})){n?.log?.(yG,{signal:"SIGTERM",parentIpcConnected:!0});return}o()};t.once("disconnect",o),t.once("SIGINT",o),t.on("SIGTERM",i),e.once("exit",o)})}function Dje(e,n){return new Promise((t,r)=>{let o=!1,i=setTimeout(()=>{o||(o=!0,r(PQ(n.kandanThreadId,n.timeoutMs)))},n.timeoutMs);e.then(s=>{o||(o=!0,clearTimeout(i),t(s))},s=>{o||(o=!0,clearTimeout(i),r(s))})})}function PQ(e,n){return new Error(`thread Codex worker did not report ready within ${n}ms for Kandan thread ${e}`)}function IQ(e){let n=e.threadRunnerReadyTimeoutMs??L$e;if(Number.isFinite(n)&&n>=0)return n;throw new Error("thread runner ready timeout must be a non-negative number")}function Oje(e){return["--api-url",e.kandanUrl,"--cwd",e.cwd,"--codex-bin",e.codexBin,...sr("--workspace",e.workspaceSlug),...sr("--log-file",e.logFile),...sr("--debug-trace-dir",e.debugTrace?.dir),...sr("--debug-trace-content",e.debugTrace?.contentMode),...e.fast===!0?["--fast"]:[],...sr("--allowed-cwd",e.allowedCwds.join(",")),...sr("--forward-port",(e.allowedForwardPorts??[]).join(",")),...sr("--code-server-bin",e.codeServerBin),...sr("--model",e.runtimeDefaults?.model),...sr("--reasoning-effort",e.runtimeDefaults?.reasoningEffort),...sr("--collaboration-mode",e.runtimeDefaults?.collaborationMode),...sr("--sandbox",e.runtimeDefaults?.sandbox),...sr("--approval-policy",e.runtimeDefaults?.approvalPolicy),...e.codexModelProvider===void 0?[]:["--model-provider",e.codexModelProvider.provider,"--llm-proxy-base-url",e.codexModelProvider.llmProxyBaseUrl],...e.vmExecution===!0?["--vm-execution"]:[],...sr("--execution-mode",e.executionMode),...sr("--egress-mode",e.egressMode),...sr("--project-public-id",e.projectPublicId),...sr("--golden-image-id",e.goldenImagePublicId),...sr("--multi-agent-jobs-eligible",String(e.multiAgentJobsEligible===!0)),...sr("--multi-agent-jobs-enabled",String(e.multiAgentJobs===!0)),...e.runtimeDefaults===void 0?[]:e.runtimeDefaults.allowPortForwardingByDefault?["--allow-port-forwarding-by-default"]:["--no-allow-port-forwarding-by-default"]]}function $je(e){let n=[];for(let t=0;t<e.length;t+=1){let r=e[t];if(r==="--token"){n.push(r,"<redacted>"),t+=1;continue}r!==void 0&&n.push(r)}return n}function sr(e,n){return n===void 0||n===""?[]:[e,n]}function qje(e,n,t){let r=jn(e),o=a=>d=>{n("onboarding.discovery_chain_failed",{phase:a,runnerId:e.runnerId,workspace:r??null,message:d instanceof Error?d.message:String(d)})};if(!sLe(e,r)){Promise.resolve().then(()=>t?.()).catch(o("no_scan_reprobe"));return}let i=aLe(e,r);if(tM.has(i)){n("onboarding.discovery_agents_already_started",{runnerId:e.runnerId,workspace:r});return}tM.add(i),n("onboarding.discovery_agents_started",{runnerId:e.runnerId,workspace:r,kandanUrl:e.kandanUrl});let s=Date.now();Promise.allSettled([EQ(e,n),nLe(e,n)]).then(async a=>{let d=Date.now()-s,u=0;for(let c of a){if(c.status!=="fulfilled"||c.value===void 0)continue;u+=c.value.successfulPostStartWriteCount??0,await ei(e,n,{...c.value,metadata:{...c.value.metadata,initial_search_duration_ms:d}})&&(u+=1)}u===0&&(tM.delete(i),n("onboarding.discovery_agents_start_key_cleared",{runnerId:e.runnerId,workspace:r})),n("onboarding.discovery_initial_search_completed",{runnerId:e.runnerId,workspace:r,duration_ms:d,workers_completed:2,successful_write_count:u}),await t?.()}).catch(o("initial_search"))}function w0(e,n){return{...e,successfulPostStartWriteCount:n}}async function bM(e,n){return await n?e+1:e}function RQ(e){return e.filter(n=>n.status==="fulfilled").length}async function Fje(e,n,t){let r=y(t.workspace)??jn(e);if(r===void 0)throw new Error("workspace_required");let o=Uje(t.sources),i=zje(e.runnerId,r,o);if(rM.has(i)){n("onboarding.conversation_import_skipped",{runnerId:e.runnerId,workspace:r,sources:o,reason:"already_running"});return}rM.add(i);try{await Nje(e,n,t,r,o)}finally{rM.delete(i)}}async function Nje(e,n,t,r,o){if(o.length===0){await ei(e,n,{phase:"conversations",status:"completed",placesSearched:0,message:"No local conversation imports selected",currentPlace:"Codex and Claude Code stores",metadata:{worker_id:"conversations-local-import",worker_label:"Local conversation import",imported_count:0,reported_count:0}});return}await ei(e,n,{phase:"conversations",status:"running",placesSearched:0,message:"Importing local conversations",currentPlace:"Codex and Claude Code stores",metadata:{worker_id:"conversations-local-import",worker_label:"Local conversation import",imported_count:0,reported_count:0}});let i=e.localConversationDiscovery?.()??nC({candidateLimit:h0}),s=new Set(o),a=i.candidates.filter(f=>s.has(f.source)).slice(0,h0),d=a.length,u=Zs({kandanUrl:e.kandanUrl,accessToken:e.token,fetchImpl:e.fetch,operatingMode:"text"}),c=0,l=0,p=0;for(let[f,g]of a.entries()){try{let _=tC(g),b=await u.noteAgentConversation({workspace:r,runner_id:e.runnerId,source:g.source,import_key:g.importKey,import_to_office_channel:!0,path:g.path,display_name:g.displayName,...g.activityAt===void 0?{}:{activity_at:g.activityAt},metadata:g.metadata,title_messages:Wje(_)}),w=Gje(b),v=y(w?.thread_id);if(y(w?.status)==="failed"){p+=1,n("onboarding.conversation_import_candidate_skipped",{runnerId:e.runnerId,workspace:r,source:g.source,import_key:g.importKey,message:y(w?.error)??"conversation_import_failed"});continue}if(v!==void 0){let C=await Jje({client:u,options:e,workspaceSlug:r,threadId:v,candidate:g,messages:_});await Hje({client:u,workspaceSlug:r,runnerId:e.runnerId,candidate:g,threadId:v,officeImport:w,replayedMessageCount:_.length,replayedChunkCount:C}).catch(T=>{n("onboarding.conversation_import_replay_completion_failed",{runnerId:e.runnerId,workspace:r,source:g.source,import_key:g.importKey,message:T instanceof Error?T.message:String(T)})})}c+=1}catch(_){l+=1,n("onboarding.conversation_import_candidate_failed",{runnerId:e.runnerId,workspace:r,source:g.source,import_key:g.importKey,message:_ instanceof Error?_.message:String(_)})}let m=f+1;(m===a.length||m%Lje===0)&&await ei(e,n,{phase:"conversations",status:"running",placesSearched:i.placesSearched,message:"Importing local conversations",currentPlace:"Codex and Claude Code stores",metadata:{worker_id:"conversations-local-import",worker_label:"Local conversation import",duration_ms:i.durationMs,codex_count:o.includes("codex")?i.codexCount:0,claude_code_count:o.includes("claude_code")?i.claudeCodeCount:0,candidate_limit:h0,imported_count:c,failed_import_count:l,skipped_import_count:p,reported_count:c,total_count:d}})}await ei(e,n,{phase:"conversations",status:"completed",placesSearched:i.placesSearched,message:"Local conversation import finished",currentPlace:"Codex and Claude Code stores",metadata:{worker_id:"conversations-local-import",worker_label:"Local conversation import",duration_ms:i.durationMs,codex_count:o.includes("codex")?i.codexCount:0,claude_code_count:o.includes("claude_code")?i.claudeCodeCount:0,candidate_limit:h0,imported_count:c,failed_import_count:l,skipped_import_count:p,reported_count:c,total_count:d}})}function zje(e,n,t){return`${e}:${n}:${[...t].sort().join(",")}`}function Uje(e){return Array.from(new Set(($e(e)??[]).flatMap(n=>{switch(y(n)){case"codex":return["codex"];case"claude_code":return["claude_code"];default:return[]}}))).sort()}function Bje(e){return ar(($e(e)??[]).flatMap(n=>{let t=y(n)?.trim();return t===void 0||t===""?[]:[t]}))}async function Jje(e){let n=0;for(let t of e.messages){let r=Kje(t);for(let o of r){let i=Zje(e.candidate.importKey,o.itemKey),s={import_role:t.role,import_source:e.candidate.source,...o.activityAt===void 0?{}:{source_activity_at:o.activityAt}};if(!(o.attachments.length>0&&o.index===r.length-1)){await e.client.sendThreadReply({workspace:e.workspaceSlug,thread_id:e.threadId,body:o.body,client_message_id:i,...s}),n+=1;continue}let d=await Qje({client:e.client,options:e.options,workspaceSlug:e.workspaceSlug,threadId:e.threadId,candidatePath:e.candidate.path,body:o.body,attachments:o.attachments});if(d.uploadedFileIds.length>0){await e.client.attachMessageFiles({workspace:e.workspaceSlug,target:{kind:"new_message",thread_id:e.threadId},body:d.body,uploaded_file_ids:d.uploadedFileIds,client_message_id:i,...s}),n+=1;continue}await e.client.sendThreadReply({workspace:e.workspaceSlug,thread_id:e.threadId,body:d.body,client_message_id:i,...s}),n+=1}}return n}function Kje(e){let n=Vje(e.body);return n.map((t,r)=>({itemKey:n.length===1?e.itemKey:`${e.itemKey}:part-${r+1}`,body:t,attachments:r===n.length-1?e.attachments:[],activityAt:e.activityAt,index:r}))}function Vje(e){let n=e.trim();if(n.length<=sp)return[n];let t=[],r=n;for(;r.length>sp;){let o=r.slice(0,sp),i=o.lastIndexOf(`
@@ -2133,7 +2133,7 @@ Tools:
2133
2133
  Auth:
2134
2134
  Uses --token, LINZUMI_MCP_ACCESS_TOKEN, or cached local runner OAuth from linzumi auth.
2135
2135
  Hosted personal agents use --delegation-auth-file with a signed delegation grant.
2136
- `}async function eKe(e){let n=v$(e);if(n.get("help")===!0){process.stdout.write(goe());return}let t=S$(n,"api-url"),r=await b$({kandanUrl:t,explicitToken:Xn(n,"token")??process.env.LINZUMI_MCP_ACCESS_TOKEN,authFilePath:Xn(n,"auth-file"),delegationAuthFilePath:Xn(n,"delegation-auth-file"),workspaceSlug:Xn(n,"workspace"),channelSlug:Xn(n,"channel")}),o=Xn(n,"owner-username")??process.env.LINZUMI_MCP_OWNER_USERNAME,i=w$(Xn(n,"mode")),s=yoe(Xn(n,"tool-scope")),a=Xn(n,"cwd")??process.cwd(),d=Xn(n,"thread-id")??process.env.LINZUMI_THREAD_RUNNER_KANDAN_THREAD_ID,u=Zs({kandanUrl:t,accessToken:r.accessToken,authMode:r.mode,operatingMode:i}),c=new _S({name:"linzumi",version:"0.1.0"});uKe(c),tKe(c,{client:u,toolScope:s,operatingMode:i,cwd:a,kandanUrl:t,defaultThreadId:d,ownerUsername:o,agentSession:n.get("agent-session")===!0,documentSurfaces:Rf(r.accessToken),askUserQuestionTool:n.get("ask-user-question-tool")===!0,devServices:nKe(process.env),multiAgentJobs:n.get("multi-agent-jobs")===!0}),await c.connect(new bS)}function nKe(e){let n=e.LINZUMI_DEV_SERVICES_SCOPE?.trim(),t=Number.parseInt(e.LINZUMI_DEV_SERVICES_OWNER_PID??"",10);if(!(n===void 0||n===""||!Number.isInteger(t)||t<=0))return{scopeDir:Wd(n),ownerPid:t}}function tKe(e,n){let{client:t,toolScope:r,operatingMode:o,cwd:i,kandanUrl:s,defaultThreadId:a,ownerUsername:d,agentSession:u,devServices:c}=n,l=r==="all"||r==="coding";if(n.askUserQuestionTool===!0&&e.tool(l4,`Ask the user up to ${lm} structured multiple-choice questions and BLOCK until they answer in the Linzumi thread. Use this whenever you need a decision or clarification mid-task. Each question needs a short header (max ${pm} chars) and ${fm}-${mm} options {label, description}; a built-in "${hm}" free-text choice is always shown in addition to your options, so never add one yourself. Set multiSelect true to allow choosing several options. Returns {answers} keyed by question text: a single label string, an array of labels for multiSelect, and {"other": "<typed text>"} for a free-text reply.`,{questions:A.array(A.object({question:A.string().describe("The question to ask the user."),header:A.string().describe(`Short category header shown above the question (max ${pm} chars, e.g. "Auth", "Scope").`),options:A.array(A.object({label:A.string().describe("Option label the user taps."),description:A.string().optional().describe("One-line explanation of the option.")})).describe(`${fm}-${mm} options for this question.`),multiSelect:A.boolean().optional().describe("True lets the user select several options; the answer becomes an array.")})).describe(`1-${lm} questions to ask atomically.`)},async p=>fKe((f,g)=>e.server.elicitInput(f,g),p)),n.documentSurfaces===!0){let p=async(f,g)=>De(await t.agentDocumentTool({...g,tool:f}));e.tool("linzumi_lookup_documents","Search document titles and content within the controlling human's visibility ceiling. Returns authorized results in canonical search order; zero, one, and multiple matches carry the rule-03 ambiguity meaning.",{query:A.string().min(1).describe("Document title or content search query.")},async f=>p("lookup_documents",f)),e.tool("linzumi_read_document","Read one in-scope document as full AST and metadata, including pending proposals and required-agent-context comments. Both controlling-human visibility and agent delegation are required.",{document_id:A.string().uuid().describe("Document UUID.")},async f=>p("read_document",f)),e.tool("linzumi_propose_document_patch","Create an agent-attributed structural patch proposal. This never directly mutates document content; per-document auto-apply is resolved server-side after proposal persistence.",{document_id:A.string().uuid().describe("Document UUID."),patch:A.record(A.unknown()).describe("Revisioned structural document patch."),rationale:A.string().min(1).describe("Why this change is proposed.")},async f=>p("propose_document_patch",f)),e.tool("linzumi_create_document","Create an agent-attributed document through an atomic bootstrap proposal and apply transaction in the named folder or workspace default folder.",{title:A.string().min(1).describe("Document title."),initial_patch:A.record(A.unknown()).describe("Bootstrap structural patch."),folder_id:A.string().uuid().optional().describe("Destination folder UUID.")},async f=>p("create_document",f))}u&&(e.tool("linzumi_agent_reply","Post your single @linzumi reply for the current turn into the surface where you were mentioned. Call EXACTLY ONCE per turn with your final answer; the reply links to this working session automatically. Fails with already_replied on a second call and no_active_asker_binding when no turn is active.",{body:A.string().min(1).describe("Plain-text reply body to post.")},async p=>De(await t.agentReply({body:p.body}))),e.tool("linzumi_list_coding_jobs","List the coding jobs the current asker can see in this workspace: runner connections (online and recent) with their bound job threads. Live state - never answered from search.",{},async()=>De(await t.agentListCodingJobs({}))),e.tool("linzumi_start_coding_job","Start a coding job exactly as if the asking user clicked start: same runner/channel authorization, same pipeline. Returns status 'unavailable' with a reason when the runner cannot take the job (relay that honestly).",{channel:A.string().describe("Channel slug to host the job thread."),runner_key:A.string().describe("Runner (computer) to run the job on."),cwd:A.string().describe("Working directory on the runner."),work_description:A.string().min(1).describe("What the job should do - the initial instruction."),model:A.string().optional().describe("Model override (optional)."),model_provider:A.string().optional().describe("Model provider override, e.g. 'wafer' (optional)."),execution_mode:A.enum(["raw","local_vm"]).optional().describe("Execution placement override (optional)."),project_task_id:A.string().optional().describe("Project task item to bind the job to (task_id from linzumi_get_project_tasks). The task flips todo -> active and links to the new job."),visibility:A.enum(["project","private"]).optional().describe("Job visibility. Defaults to 'project'; private jobs are limited to directly authorized participants.")},async p=>De(await t.agentStartCodingJob(p))),e.tool("linzumi_interrupt_coding_job","Interrupt a coding job: mode 'steer' (default) discards its queued follow-ups so your next message lands first; mode 'stop' terminates the current turn.",{channel:A.string().describe("Channel slug hosting the job thread."),thread_id:A.string().uuid().describe("The job thread UUID."),mode:A.enum(["steer","stop"]).optional().describe("Interrupt mode; defaults to 'steer'.")},async p=>De(await t.agentInterruptCodingJob(p))),e.tool("linzumi_send_coding_job_message","Message a coding job or a person. Queue is the encouraged default: it lands in the colleague's inbox for their own cadence. Steer only for urgent, potentially-clashing work because it interrupts the running turn. Would this be worthless or harmful after their turn finishes? If no, queue. Delivery urgency is not access control. To message a person, pass to_user and omit channel and thread_id: delivery lands in their personal inbox.",{channel:A.string().optional().describe("Channel slug hosting the job thread. Required unless to_user is set."),thread_id:A.string().uuid().optional().describe("The job thread UUID. Required unless to_user is set."),to_user:A.string().min(1).optional().describe("Username of a workspace member to message instead of a job. Delivery lands in their personal inbox."),body:A.string().min(1).describe("Message body to send."),delivery:A.enum(["queue","steer"]).optional().describe("Delivery urgency. Defaults to 'queue'.")},async p=>De(await t.agentSendCodingJobMessage(p))),e.tool("linzumi_read_coding_job_thread","Read a coding job's thread (asker-visible history) plus its workflow status metadata.",{channel:A.string().describe("Channel slug hosting the job thread."),thread_id:A.string().uuid().describe("The job thread UUID."),limit:A.number().int().min(1).max(100).optional().describe("Maximum replies to return."),before_seq:A.number().int().positive().optional().describe("Return replies before this channel seq.")},async p=>De(await t.agentReadCodingJobThread(p))),e.tool("linzumi_resolve_job_approval","Resolve a coding job's pending approval request with the asking user's decision ('approve' or 'deny'). Only relays the asker's authority - never approve without their explicit instruction.",{channel:A.string().describe("Channel slug hosting the job thread."),thread_id:A.string().uuid().describe("The job thread UUID."),source_seq:A.number().int().positive().describe("Channel seq of the message the approval request rides on."),request_id:A.string().describe("The approval request id."),decision:A.enum(["approve","deny"]).describe("The asker's decision.")},async p=>De(await t.agentResolveJobApproval(p))),e.tool("linzumi_archive_coding_job","Archive a coding job's thread (or any thread the asking user owns) so it leaves the active list; history is preserved. Do this when the asker says to archive a job or thread - never just promise it.",{channel:A.string().describe("Channel slug hosting the thread."),thread_id:A.string().uuid().describe("The thread UUID to archive.")},async p=>De(await t.agentArchiveCodingJob(p))),e.tool("linzumi_unarchive_coding_job","Unarchive a previously archived coding job thread the asking user owns, returning it to the active list.",{channel:A.string().describe("Channel slug hosting the thread."),thread_id:A.string().uuid().describe("The thread UUID to unarchive.")},async p=>De(await t.agentUnarchiveCodingJob(p))),e.tool("linzumi_set_thread_status","Set a thread's lifecycle status as the asking user: 'closed' marks it done, 'open' reopens it. Works on threads the asker owns.",{channel:A.string().describe("Channel slug hosting the thread."),thread_id:A.string().uuid().describe("The thread UUID."),status:A.enum(["open","closed"]).describe("Replacement lifecycle status ('closed' = done).")},async p=>De(await t.agentSetThreadStatus(p))),e.tool("linzumi_create_channel","Create a new public channel in this workspace as the asking user. The slug is derived from the name.",{name:A.string().min(1).describe("Channel name to create.")},async p=>De(await t.agentCreateChannel(p))),e.tool("linzumi_rename_channel","Rename a channel's display name as the asking user. The channel's URL slug stays stable.",{channel:A.string().describe("Current channel slug to rename."),name:A.string().min(1).describe("New display name.")},async p=>De(await t.agentRenameChannel(p))),e.tool("linzumi_archive_channel","Archive a channel in this workspace as the asking user. History is preserved; the channel leaves the active sidebar.",{channel:A.string().describe("Channel slug to archive.")},async p=>De(await t.agentArchiveChannel(p))),e.tool("linzumi_unarchive_channel","Unarchive a previously archived channel as the asking user.",{channel:A.string().describe("Channel slug to unarchive.")},async p=>De(await t.agentUnarchiveChannel(p))),e.tool("linzumi_add_reaction","Add an emoji reaction to a channel message as the asking user. Accepts unicode emoji or a workspace :shortcode:.",{channel:A.string().describe("Channel slug containing the message."),message_seq:A.number().int().positive().describe("Channel seq of the message to react to."),emoji:A.string().min(1).describe("Emoji to add (unicode or :shortcode:).")},async p=>De(await t.agentAddReaction(p))),e.tool("linzumi_remove_reaction","Remove the asking user's emoji reaction from a channel message.",{channel:A.string().describe("Channel slug containing the message."),message_seq:A.number().int().positive().describe("Channel seq of the reacted message."),emoji:A.string().min(1).describe("Emoji to remove (unicode or :shortcode:).")},async p=>De(await t.agentRemoveReaction(p))),e.tool("linzumi_pin_message","Pin a channel message as the asking user. Thread replies re-point to their root message.",{channel:A.string().describe("Channel slug containing the message."),message_seq:A.number().int().positive().describe("Channel seq of the message to pin.")},async p=>De(await t.agentPinMessage(p))),e.tool("linzumi_unpin_message","Remove a pin from a channel message as the asking user.",{channel:A.string().describe("Channel slug containing the message."),message_seq:A.number().int().positive().describe("Channel seq of the pinned message.")},async p=>De(await t.agentUnpinMessage(p)))),r==="all"&&(e.tool("linzumi_get_message","Read one Linzumi message by scoped message_seq/message_id or a Linzumi message URL, with optional bounded before/after context.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),message_id:A.union([A.string(),A.number()]).optional().describe("Message seq inside the scoped channel."),message_seq:A.union([A.string(),A.number()]).optional().describe("Alias for message_id."),message_url:A.string().optional().describe("Full Linzumi message URL with #message-<seq>."),before:A.number().int().min(0).max(100).optional().describe("Number of visible messages before the target."),after:A.number().int().min(0).max(100).optional().describe("Number of visible messages after the target.")},async p=>De(await t.getMessage(p))),e.tool("linzumi_get_thread","Read one Linzumi thread by thread_id in the scoped channel, including the parent message and bounded replies.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().describe("Linzumi thread UUID."),limit:A.number().int().min(1).max(100).optional().describe("Maximum replies to return."),before_seq:A.number().int().positive().optional().describe("Return replies before this channel seq.")},async p=>De(await t.getThread(p))),e.tool("linzumi_get_thread_transcript","Read a Linzumi thread's full transcript as canonical IR nodes (user/assistant messages, command executions, file changes, tool calls, statuses), cursor-paginated over the complete history. Use the returned cursor with has_more to walk older pages.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().describe("Linzumi thread UUID."),limit:A.number().int().min(1).max(500).optional().describe("Maximum transcript nodes per page (default 200)."),cursor:A.number().int().positive().optional().describe("Return nodes below this seq (the previous page reply cursor).")},async p=>De(await t.getThreadTranscript(p))),e.tool("linzumi_get_channel","Read scoped Linzumi channel metadata and bounded recent channel messages.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),limit:A.number().int().min(1).max(100).optional().describe("Maximum messages to return."),before_seq:A.number().int().positive().optional().describe("Return messages before this channel seq.")},async p=>De(await t.getChannel(p))),e.tool("linzumi_search_workspace","Search the Linzumi workspace with hybrid lexical+semantic retrieval, scoped to what the authorizing user can access. Returns scored content chunks with provenance (channel, thread, authored time) and a permalink to cite.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),query:A.string().min(1).describe("Natural-language or keyword query to retrieve against."),limit:A.number().int().min(1).max(25).optional().describe("Maximum results to return (default 10, server-capped)."),source_types:A.array(A.enum(["message","coding_job","github_pr","github_pr_review","github_check_run","github_workflow_run","github_diff","dictation","file"])).optional().describe("Restrict results to these corpora; omit for all."),authored_after:A.string().optional().describe("ISO8601 instant; only content authored at or after this time."),authored_before:A.string().optional().describe("ISO8601 instant; only content authored at or before this time."),repo:A.string().optional().describe("Restrict GitHub-sourced results to one repository by full name (owner/name)."),check_status:A.enum(["pending","success","failed"]).optional().describe("Restrict check and workflow results to one conclusion bucket.")},async p=>De(await t.searchWorkspace(p))),e.tool("linzumi_ask_workspace",'Ask the Linzumi workspace a natural-language question and get a synthesized, citation-backed answer over what the authorizing user can access. Costs an LLM call on cache misses, so prefer linzumi_search_workspace for simple lookups. A "refused" status means there was not enough accessible evidence - treat it as "the workspace does not know", never retry verbatim.',{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),question:A.string().min(1).max(2e3).describe("Natural-language question to answer with citations."),channel:A.string().optional().describe("Optional channel slug providing conversational context; never widens access."),allow_cached:A.boolean().optional().describe("Allow serving a cached synthesis when the evidence set is unchanged (default true). Set false to force fresh synthesis.")},async p=>De(await t.askWorkspace(p))),e.tool("linzumi_about_me","Read what the authorizing user has told Linzumi about themselves: their profile facts (homes, unit preferences, and other self-maintained attributes) plus their derived current timezone. Use it to personalize answers (e.g. pick the right city for weather, use their preferred units). Predicates may have multiple active values; prefer the one consistent with the derived timezone.",{},async p=>De(await t.aboutMe(p)))),l&&(e.tool("linzumi_web_search","Search the public web for live or external information: news, current events, weather, prices, third-party API docs, research. Returns result titles, URLs, and snippets. Use this whenever the answer lives outside the Linzumi workspace; follow up with linzumi_fetch_url to read a result page.",{query:A.string().min(1).describe("Web search query (natural language or keywords)."),limit:A.number().int().min(1).max(10).optional().describe("Maximum results to return (default 8, server-capped).")},async p=>De(await t.webSearch(p))),e.tool("linzumi_fetch_url","Fetch one public http(s) URL and return its readable text content (HTML is reduced to plain text; large pages are truncated). Use it to read pages found via linzumi_web_search or any public docs/API reference. Only public addresses are reachable - private/internal hosts are rejected with url_not_allowed.",{url:A.string().min(1).describe("Absolute public http(s) URL to fetch.")},async p=>De(await t.fetchUrl(p)))),r==="all"&&(e.tool("linzumi_list_ui_targets","List every UI surface you can ask the user to open in their own Linzumi window (channels, DMs, threads, projects, coding jobs, computers, catch-up, activity, settings tabs, pane layouts) with the structured args each kind takes. Use UI control only when the user asks for help or asks to be shown something.",{},async()=>await moe(t.listUiTargets({}))),e.tool("linzumi_open_ui","Ask the user to open one whitelisted UI surface in their own already-open Linzumi window. A consent toast appears in THEIR session; navigation happens only if they tap Open. The call blocks until they decide and returns status opened/dismissed/expired - or error no_active_ui_session when they have no Linzumi window open (tell them to open Linzumi), or invalid_target with a detail. Use it only when the user asks for help or asks to be shown something; kinds and per-kind args come from linzumi_list_ui_targets.",{kind:A.string().min(1).describe("Target kind from linzumi_list_ui_targets (e.g. settings_workspace, channel, pane_layout)."),args:A.record(A.unknown()).optional().describe("Structured per-kind args from linzumi_list_ui_targets (never a URL - the server computes every path)."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope.")},async p=>await moe(t.openUi(Li(p,a))))),l&&(e.tool("linzumi_get_coding_job_metadata","Read the active coding job workflow metadata for a thread, including the agent-owned goal, ordered plan steps, step lock versions, and workflow status.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread.")},async p=>De(await t.getCodingJobMetadata(Li(p,a)))),e.tool("linzumi_rename_coding_job","Update the current coding job thread title and workflow-facing title. Use this when the job scope changes materially so the Linzumi thread list and metadata overview stay accurate.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),title:A.string().min(1).max(100).describe("Concise user-visible title for this coding job.")},async p=>De(await t.renameCodingJob(Li(p,a)))),e.tool("linzumi_upsert_coding_job_plan","Set or update the current coding job goal. Use this at job start and whenever the goal changes materially.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),goal:A.string().min(1).max(1e4).describe("Concrete user-visible goal for this coding job.")},async p=>De(await t.upsertCodingJobPlan(Li(p,a)))),e.tool("linzumi_replace_coding_job_plan_steps","Replace the ordered coding job plan steps. Use this for the initial plan and for substantial rewrites when the old plan no longer fits the work.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),goal:A.string().min(1).max(1e4).optional().describe("Required when no plan exists yet; updates the current coding job goal."),steps:A.array(A.object({title:A.string().min(1).max(255),description:A.string().min(1).max(1e4),status:A.enum(["pending","active","completed","blocked","canceled"]),status_note:A.string().min(1).max(4e3).optional(),completed_debrief:A.string().min(1).max(2e4).optional()})).min(1).max(50).describe("Ordered user-visible plan steps. Completed steps must include completed_debrief.")},async p=>De(await t.replaceCodingJobPlanSteps(Li(p,a)))),e.tool("linzumi_update_coding_job_plan_step","Update one coding job plan step status or note. Read metadata first and pass the current step lock_version.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),step_id:A.string().uuid().describe("Step id returned by linzumi_get_coding_job_metadata."),lock_version:A.number().int().positive().describe("Current step lock_version from metadata."),status:A.enum(["pending","active","completed","blocked","canceled"]),status_note:A.string().min(1).max(4e3).optional(),completed_debrief:A.string().min(1).max(2e4).optional().describe("Required when marking a step completed.")},async p=>De(await t.updateCodingJobPlanStep(Li(p,a)))),e.tool("linzumi_link_coding_job_pull_request","Link the active coding job to its primary GitHub pull request so PR comments, files, commits, checks, deployments, and reviews can flow into the metadata view.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),github_repo_owner:A.string().min(1).max(255),github_repo_name:A.string().min(1).max(255),github_pr_number:A.number().int().positive(),github_pr_url:A.string().url(),title:A.string().min(1).max(255),body:A.string().min(1).max(1e5).optional(),head_branch:A.string().min(1).max(255),head_sha:A.string().min(7).max(64),base_branch:A.string().min(1).max(255),base_sha:A.string().min(7).max(64),state:A.enum(["draft","open","closed","merged"]).optional(),is_draft:A.boolean().optional(),review_status:A.enum(["unknown","review_required","approved","changes_requested"]).optional(),source_remote_url:A.string().min(1).max(1e3).describe("Git remote URL for the local job worktree; required when this job has no repo workspace yet."),runtime_worktree_root:A.string().min(1).max(1e3).describe("Absolute local worktree path for the coding job; required when this job has no repo workspace yet."),dirty_status:A.enum(["unknown","clean","dirty"]).optional(),dirty_summary:A.string().min(1).max(2e3).optional()},async p=>De(await t.linkCodingJobPullRequest(Li(p,a)))),e.tool("linzumi_upload_files",["Upload local files to Linzumi and attach them to a new, exact, or latest assistant message. Use silently; do not mention this tool in the visible reply.","The JSON result includes message.attachments[].url as an absolute URL. Use those returned URLs when writing rich media directives such as ::audio, ::video, ::image, or Markdown images. Do not guess attachment URLs before upload.","For a message that should both attach files and show inline rich media, use a two-step flow: first upload/attach the files to create or target the message, then edit the same target message with body text that references the returned absolute URLs. When the result has target_seq, use target.kind=message_seq and message_seq=target_seq for that follow-up edit; result.message is the edit event that carries the new attachments, and target_message is the original target."].join(" "),{target:A.object({kind:A.enum(["new_message","message_seq","latest_assistant_message"]).describe("new_message creates a message; message_seq edits an exact message; latest_assistant_message edits the latest assistant message in the scoped thread/channel."),message_seq:A.union([A.string(),A.number()]).optional().describe("Required when kind is message_seq."),thread_id:A.string().optional().describe("Thread UUID. Defaults to the active Linzumi thread when the MCP server was launched with one.")}).describe("Attachment target. Prefer latest_assistant_message to attach files to the reply you already posted; use new_message ONLY when no assistant message exists yet in the scoped thread. Never re-use your visible reply text as a new_message body - that posts the reply twice. To reference uploaded files in the message body, upload first, then edit message_seq/latest_assistant_message with the returned absolute attachment URLs. If the upload result includes target_seq, use message_seq=target_seq for that follow-up edit."),files:A.array(A.string().min(1)).min(1).max(16).describe("Local file paths to upload. Paths must be non-hidden files inside the approved workspace or Downloads; source/text files of any language are supported, plus common document, image, patch, archive, and video types."),body:A.string().min(1).max(2e4).optional().describe("Required for new_message: a SHORT file-share caption (for example: Attached the generated report), never a copy of your visible reply - that would post the reply twice. Optional replacement body for message_seq/latest_assistant_message; when omitted, the existing message body is preserved. Rich media directives in body must use Linzumi attachment download URLs returned by this tool."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the target thread's channel (when the thread is known) or the authenticated token scope.")},async p=>{let f=loe(p.target,a);try{let g=await iKe({client:t,cwd:i,kandanUrl:s,target:f,files:p.files,workspace:p.workspace,channel:p.channel,body:p.body});return De(poe(s,g))}catch(g){throw oKe(g)}}),e.tool("linzumi_edit_message","Edit an exact scoped Linzumi message by message_seq. Use after linzumi_upload_files when you need a body-only follow-up edit that embeds returned attachment URLs. Requires channel.write, and thread.write when target.thread_id is set. Rich media src/poster values must be Linzumi attachment download URLs.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),target:A.object({message_seq:A.union([A.string(),A.number()]).describe("Exact message seq to edit. After linzumi_upload_files returns target_seq, pass that value here."),thread_id:A.string().optional().describe("Thread UUID when editing a thread message. Use the upload result target_message.thread_id when present.")}).describe("Exact message target for the body edit."),body:A.string().min(1).max(2e4).describe("Replacement Markdown body. Rich media src/poster values must be Linzumi attachment download URLs returned by linzumi_upload_files.")},async p=>De(poe(s,await t.editMessage({...p,target:loe(p.target,a)}))))),r==="all"&&(e.tool("linzumi_list_vault_secrets","List vault secret names, descriptions, and whether each secret is personal or workspace-owned. Does not return secret values.",{},async p=>De(await t.listVaultSecrets(p))),e.tool("linzumi_list_projects","List the projects in the current workspace with their project_id (needed by the other project task tools), slug, title, description, and state.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope.")},async p=>De(await t.listProjects(p))),e.tool("linzumi_get_project_tasks",`Read a project's full task graph: task GROUPS (kind "group", organizational containers, exactly one level deep) and ISSUES (kind "issue", the executable work items), each with status (todo/active/blocked/review/done/canceled), DERIVED work_state readiness (ready = todo with every dependency satisfied; blocked = todo with unsatisfied dependencies; running/stalled = active with/without a connected job), parent group, assignee, lock_version, and dependency edges (depends_on_task_ids / unblocks_task_ids). Always read this before reorganizing. Inside a project-bound coding job the project is inferred automatically; otherwise pass project_id from linzumi_list_projects.`,{project_id:A.string().optional().describe("Project id from linzumi_list_projects. Omit inside a coding job started from a project to use that project.")},async p=>De(await t.getProjectTasks(Li(p,a)))),e.tool("linzumi_create_project_task",'Create a task group (kind "group") or issue (kind "issue", the default) in a project. Groups organize issues and are exactly one level deep: a parent_id must name a GROUP, and groups themselves can never have a parent. New tasks default to status "todo" and append to the end unless position is given. Inside a project-bound coding job the project is inferred; otherwise pass project_id.',{project_id:A.string().optional().describe("Project id from linzumi_list_projects. Omit inside a coding job started from a project to use that project."),title:A.string().min(1).describe("Task title."),kind:A.enum(["issue","group"]).optional().describe('What to create: "issue" (executable work item, default) or "group" (organizational container).'),description:A.string().optional().describe("Detailed description of the work - written so an engineer (or coding agent) could execute the task from it."),status:A.enum(["todo","active","blocked","review","done","canceled"]).optional().describe('Initial status. Defaults to "todo".'),parent_id:A.string().optional().describe("task_id of the GROUP to place an issue in. Only issues can have a parent."),assignee:A.string().optional().describe("Username of a workspace member to assign."),position:A.number().int().min(0).optional().describe("Sort position. Defaults to appending at the end.")},async p=>De(await t.createProjectTask(Li(p,a)))),e.tool("linzumi_update_project_task",'Update a task group or issue: retitle, edit description/status_note, transition status (todo/active/blocked/review/done/canceled), reassign, reorder (position), or reorganize (parent_id moves an issue into a group; clear_parent moves it to top level). Only the fields you pass change; description and status_note accept null to clear. Prefer updating existing tasks over delete-and-recreate. Pass the lock_version from your last read to fail loudly ("stale") instead of overwriting a concurrent edit.',{task_id:A.string().describe("task_id of the group or issue to update."),title:A.string().min(1).optional().describe("New title."),description:A.string().nullable().optional().describe("New description. Pass null to clear it."),status:A.enum(["todo","active","blocked","review","done","canceled"]).optional().describe('New status. "done"/"canceled" satisfy dependent tasks; "blocked" is a manual hold.'),status_note:A.string().nullable().optional().describe("Short human-readable note about the current status. Pass null to clear it."),position:A.number().int().min(0).optional().describe("New sort position among siblings."),parent_id:A.string().optional().describe("task_id of the GROUP to move this issue into. Do not combine with clear_parent."),clear_parent:A.boolean().optional().describe("true moves the issue to the top level (no group). Do not combine with parent_id."),assignee:A.string().optional().describe("Username of a workspace member to assign. Do not combine with clear_assignee."),clear_assignee:A.boolean().optional().describe("true removes the assignee. Do not combine with assignee."),lock_version:A.number().int().positive().optional().describe("The task's lock_version from your last read, for compare-and-swap safety.")},async p=>De(await t.updateProjectTask(p))),e.tool("linzumi_delete_project_task",`Permanently delete a task group or issue. Dependency edges on the task are removed with it (dependents may become ready). Deletion is normally the USER's call - prefer status "canceled" or an update unless you are certain the entry is obsolete.`,{task_id:A.string().describe("task_id of the group or issue to delete.")},async p=>De(await t.deleteProjectTask(p))),e.tool("linzumi_add_project_task_dependency",'Add the dependency edge "task_id is blocked by depends_on_task_id" between two ISSUES in the same project (groups cannot have dependencies). The dependent stays blocked until the prerequisite reaches done or canceled. The graph must stay acyclic: an edge that would create a cycle is refused with reason "would_create_cycle" and the offending cycle_path so you can restructure. Duplicate and self edges are rejected.',{task_id:A.string().describe("task_id of the DEPENDENT issue (the one that must wait)."),depends_on_task_id:A.string().describe("task_id of the PREREQUISITE issue (the one that must finish first).")},async p=>De(await t.addProjectTaskDependency(p))),e.tool("linzumi_remove_project_task_dependency",'Remove the dependency edge "task_id is blocked by depends_on_task_id". The dependent issue may become ready if that was its last unsatisfied dependency.',{task_id:A.string().describe("task_id of the DEPENDENT issue."),depends_on_task_id:A.string().describe("task_id of the PREREQUISITE issue the edge points at.")},async p=>De(await t.removeProjectTaskDependency(p))),e.tool("linzumi_get_call_transcript","Read the full transcript of a completed Linzumi notetaker call: call metadata (title, platform, started/ended/transcribed times), participants, and every spoken segment in order with speaker names and millisecond offsets. Pass the call_id embedded in the request (or copied from the call card). Errors: call_not_found (missing or not visible to you), call_transcript_not_ready (call still connecting, in progress, or transcribing - retry later).",{call_id:A.string().describe("The call id from the call card or the launching message (a CallRecording id - the opaque GraphQL id and the bare uuid both work).")},async p=>De(await t.getCallTranscript(p))),u||(e.tool("linzumi_start_coding_job","Start a coding job as the invoking user (same authorization and pipeline as clicking start). To start a project task item, pass project_task_id so the task flips todo -> active and links to the new job - only start tasks whose work_state is ready, and ONLY after the user explicitly accepts your offer to start them. Omit channel, runner_key, and cwd to reuse this job's own channel, computer, and folder. Returns status 'unavailable' with a reason when the runner cannot take the job (relay that honestly).",{work_description:A.string().min(1).describe("What the job should do - the initial instruction. For a task item, write it from the task title and description."),project_task_id:A.string().optional().describe("Project task item to bind the job to (task_id from linzumi_get_project_tasks). The task flips todo -> active and links to the new job."),visibility:A.enum(["project","private"]).optional().describe("Child-job visibility. Defaults to 'project'; private jobs are limited to directly authorized participants."),channel:A.string().optional().describe("Channel slug to host the job thread. Omit to use this job's own channel."),runner_key:A.string().optional().describe("Runner (computer) to run the job on. Omit to use this job's own computer."),cwd:A.string().optional().describe("Working directory on the runner. Omit to use this job's own folder."),model:A.string().optional().describe("Model override (optional)."),model_provider:A.string().optional().describe("Model provider override, e.g. 'wafer' (optional)."),agent_provider:A.string().optional().describe("Agent provider override, e.g. 'codex' (optional)."),reasoning_effort:A.enum(["default","low","medium","high","xhigh","ultra"]).optional().describe("Reasoning effort override (optional)."),approval_policy:A.enum(["default","on-request","on-failure","never"]).optional().describe("Approval policy override (optional)."),sandbox:A.enum(["default","workspace-write","read-only","danger-full-access"]).optional().describe("Sandbox override (optional)."),fast:A.boolean().optional().describe("Fast-mode override (optional)."),allow_port_forwarding_by_default:A.boolean().optional().describe("Default port-forwarding override (optional)."),execution_mode:A.enum(["raw","local_vm"]).optional().describe("Execution placement override (optional)."),egress_mode:A.enum(["open","hardened"]).optional().describe("Local-VM egress override (optional).")},async p=>De(await t.agentStartCodingJob(Li(p,a)))),n.multiAgentJobs===!0&&(e.tool("linzumi_spawn_child_job","Spawn a durable child coding job under YOUR OWN job, on any harness or model - plan a DAG and delegate its legs to workers you then coordinate through discovery and messaging. The child lands on this job's channel, computer, and folder; it inherits this job's project and visibility (a private parent's children stay private), human roles cascade to it, and a human manages its lifecycle. Returns status 'unavailable' with a reason when the runner cannot take the job (relay that honestly).",{work_description:A.string().min(1).describe("What the child job should do - the initial instruction, written to stand alone."),agent_provider:A.string().optional().describe("Harness for the child, e.g. 'codex' or 'claude-code'. Omit to reuse this job's own harness. A different harness is fine: a cross-harness child is always a child job."),model:A.string().optional().describe("Model override for the child (optional)."),model_provider:A.string().optional().describe("Model provider override, e.g. 'wafer' (optional)."),reasoning_effort:A.enum(["default","low","medium","high","xhigh","ultra"]).optional().describe("Reasoning effort override (optional)."),project_task_id:A.string().optional().describe("Project task item to bind the child to (task_id from linzumi_get_project_tasks). The task flips todo -> active and links to the new job."),visibility:A.enum(["project","private"]).optional().describe("Child visibility. Defaults to this job's own visibility; a private parent's children must stay private.")},async p=>De(await t.agentSpawnChildJob(Li(p,a)))),e.tool("linzumi_discover_coding_jobs","Search current sitreps inside this coding job project for overlapping files, modules, objectives, or blockers. Results include durable job addresses for coordination. Private jobs outside your visible set never appear.",{query:A.string().min(1).describe("Free-text clash-surface query, such as a file path, module, migration, or objective.")},async p=>De(await t.agentDiscoverCodingJobs({...p,source_thread_id:a}))),e.tool("linzumi_send_coding_job_message","Message a visible coding job in this project, or a person. Queue is the encouraged default: it lands in the colleague's inbox for their own cadence. Steer only for urgent, potentially-clashing work because it interrupts the running turn. Would this be worthless or harmful after their turn finishes? If no, queue. Delivery urgency is not access control. To message a person, pass to_user and omit channel and thread_id: delivery lands in their personal inbox.",{channel:A.string().optional().describe("Channel slug hosting the target job. Required unless to_user is set."),thread_id:A.string().uuid().optional().describe("Target job thread UUID. Required unless to_user is set."),to_user:A.string().min(1).optional().describe("Username of a workspace member to message instead of a job. Delivery lands in their personal inbox."),body:A.string().min(1).describe("Coordination message to send."),delivery:A.enum(["queue","steer"]).optional().describe("Delivery urgency. Defaults to 'queue'.")},async p=>De(await t.agentSendCodingJobMessage({...p,source_thread_id:a})))))),ZJe(r)&&(e.tool("linzumi_upload_custom_emoji","Upload a local image as a workspace custom emoji. For generated emoji art, create a transparent PNG with a simple centered subject, crisp edges, strong contrast, minimal tiny details, and enough outline/highlight separation to read at 16-24px on both dark and light backgrounds. Use lowercase shortcode names without colons unless preserving a user-provided :name:.",{name:uoe.describe("Custom emoji shortcode name, with or without surrounding colons."),file:A.string().min(1).describe("Local PNG/WebP/GIF/JPEG file path to upload. Prefer transparent PNG for generated emoji."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope.")},async p=>De(await sKe({client:t,cwd:i,kandanUrl:s,name:p.name,file:p.file,workspace:p.workspace}))),e.tool("linzumi_rename_custom_emoji","Rename an existing workspace custom emoji. The new name may include surrounding colons; Linzumi stores the normalized shortcode without colons.",{emoji_id:A.union([A.string(),A.number().int().positive()]).describe("Workspace custom emoji id returned by linzumi_upload_custom_emoji or workspace emoji listings."),name:uoe.describe("New shortcode name, with or without surrounding colons."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope.")},async p=>De(await t.renameCustomEmoji(p)))),e.tool("linzumi_media_guide","Return the full Linzumi rich-media authoring guide (audio/video/image directives, URL rules, upload-then-embed flow, examples). Call once BEFORE writing any ::audio/::video/::image directive or Markdown image into a Linzumi message.",{},async()=>({content:[{type:"text",text:T_}]})),e.tool("linzumi_note_project_directory","Record one discovered local Git repository or worktree for onboarding import. Call once per project as soon as it is found.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),runner_id:A.string().min(1).describe("Local runner/computer id provided in the discovery prompt."),path:A.string().min(1).describe("Absolute local path to the repository worktree root."),display_name:A.string().optional().describe("Short project label. Defaults to the path basename."),activity_at:A.string().optional().describe("Best-known recent activity time as an ISO-8601 timestamp."),import_key:A.string().optional().describe("Stable dedupe key. Defaults to path."),metadata:A.record(A.unknown()).optional().describe("Small structured metadata such as branch or remote origin.")},async p=>De(await t.noteProjectDirectory(p))),e.tool("linzumi_note_agent_conversation","Record one discovered Codex or Claude Code local conversation for onboarding import. Call once per conversation as soon as it is found.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),runner_id:A.string().min(1).describe("Local runner/computer id provided in the discovery prompt."),source:A.enum(["codex","claude_code"]).describe("Conversation source."),import_key:A.string().min(1).describe("Stable dedupe key, such as a session id or file path."),path:A.string().optional().describe("Absolute local path to the conversation file or directory."),display_name:A.string().optional().describe("Short label for the discovered conversation."),activity_at:A.string().optional().describe("Best-known recent activity time as an ISO-8601 timestamp."),metadata:A.record(A.unknown()).optional().describe("Small structured metadata such as session id or project path.")},async p=>De(await t.noteAgentConversation(p))),e.tool("linzumi_note_onboarding_discovery_status","Record onboarding discovery progress. Call when a search phase starts, checks another place, completes, or fails.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),runner_id:A.string().min(1).describe("Local runner/computer id provided in the discovery prompt."),phase:A.enum(["projects","conversations"]).describe("Discovery phase being reported."),status:A.enum(["starting","running","completed","failed"]).describe("Current phase status."),places_searched:A.number().int().nonnegative().optional().describe("Count of concrete folders/files/known locations checked so far."),message:A.string().optional().describe("Short user-facing status note."),current_place:A.string().optional().describe("Current folder, file, Git command target, or known location being checked."),current_source:A.string().optional().describe("Short machine-readable source label such as git, codex, or claude_code."),last_error:A.string().optional().describe("Short failure detail when status is failed."),metadata:A.record(A.unknown()).optional().describe("Small structured status metadata.")},async p=>De(await t.noteOnboardingDiscoveryStatus(p))),r==="all"&&QJe(o)&&(e.tool("linzumi_dm_owner","Send a plain-text DM to the configured Commander owner. Requires dm.write and a visible owner username.",{owner_username:A.string().optional().describe("Owner username. Defaults to LINZUMI_MCP_OWNER_USERNAME or --owner-username."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Source channel slug used to verify owner visibility."),body:A.string().min(1).max(2e4).describe("Plain-text message body to DM.")},async p=>{let f=p.owner_username??d;if(f===void 0)throw new Error("owner_username is required for linzumi_dm_owner");return De(await t.dmOwner({...p,owner_username:f}))}),e.tool("linzumi_send_channel_message","Post a NEW standalone Markdown message into the scoped Linzumi channel as the authenticated local-runner user. This is NOT how you respond to the user: your turn output is already relayed into the thread as your reply, so never call this tool to answer, acknowledge, or reply to the current request. Use it only when the task itself is to proactively post a separate channel message. Requires channel.write. Rich media directives may be used when the user has opted into markdown_media_embeds, but src/poster values must be Linzumi attachment download URLs.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),body:A.string().min(1).max(2e4).describe("Markdown message body to post. Rich media src/poster values must be Linzumi attachment download URLs, not third-party URLs, /relative paths, or local filesystem paths.")},async p=>De(await t.sendChannelMessage(p))),e.tool("linzumi_send_thread_reply","Post a Markdown reply into some OTHER existing Linzumi thread as the authenticated local-runner user. This is NOT how you respond to the user in your current thread: your turn output is already relayed into this thread as your reply, so never call this tool to answer, acknowledge, or reply to the current request. Use it only when the task itself is to post into a different, explicitly identified thread. Requires thread.write. Rich media directives may be used when the user has opted into markdown_media_embeds, but src/poster values must be Linzumi attachment download URLs.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().describe("Existing Linzumi thread UUID."),body:A.string().min(1).max(2e4).describe("Markdown reply body to post. Rich media src/poster values must be Linzumi attachment download URLs, not third-party URLs, /relative paths, or local filesystem paths.")},async p=>De(await t.sendThreadReply(p))),e.tool("linzumi_send_dm","Send a plain-text DM as the authenticated local-runner user to a visible user in the scoped workspace/channel. Requires dm.write.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Source channel slug used to verify target visibility."),username:A.string().describe("Visible Linzumi username to DM."),body:A.string().min(1).max(2e4).describe("Plain-text message body to DM.")},async p=>De(await t.sendDm(p)))),r==="all"&&e.tool("linzumi_get_vault_values","Request values for explicit vault env var names after a thread-scoped human approval. Requires vault.read; thread_id resolves the approval thread.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug used to disambiguate the approval thread when needed."),thread_id:A.string().uuid().describe("Existing Linzumi thread UUID for the inline approval."),env_var_names:A.array(A.string().regex(/^[A-Z][A-Z0-9_]{0,127}$/)).min(1).max(20).describe("Explicit vault env var names to request. This tool cannot list all vault keys."),description:A.string().min(1).max(500).describe("Human-readable reason shown in the approval request."),justification:A.string().min(10).max(1e3).describe("Agent justification shown to the approver.")},async p=>De(await t.getVaultValues(p))),r==="all"&&!u&&c!==void 0&&rKe(e,i,c)}function coe(e){return{name:e.record.name,command:e.record.command,cwd:e.record.cwd,ports:[...e.record.ports],restart_on_branch_change:e.record.restartOnBranchChange,desired_state:e.record.desiredState,liveness:e.liveness,port_health:e.portProbes.map(n=>({port:n.port,listening:n.listening})),started_at_ms:e.record.startedAtMs??null,last_exit:e.lastExit===void 0?null:{code:e.lastExit.code,signal:e.lastExit.signal,at_ms:e.lastExit.atMs},log_path:e.record.logPath}}function rKe(e,n,t){e.tool("linzumi_dev_service_start","Start a long-running local dev server (npm run dev, storybook, docker compose up, ...) as a MANAGED SERVICE owned by the Linzumi runner. Use this instead of running dev servers in your own shell: a managed service survives the end of your turn and branch switches, is auto-restarted if it crashes, and its declared ports are health-probed and surfaced in the product. Calling start for an existing name declaratively RESTARTS it (e.g. after a checkout). Declare EVERY port the app serves from (primary plus HMR/asset/bundle sibling ports).",{name:A.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/).describe("Stable service name (slug), e.g. 'web' or 'storybook'. Reusing a name restarts that service."),command:A.string().min(1).describe("Shell command that runs the server in the foreground (never daemonize/screen/nohup it yourself), e.g. 'npm run dev'. Runs via the user's login shell."),cwd:A.string().optional().describe("Working directory for the service. Defaults to the session cwd."),ports:A.array(A.number().int().min(1).max(65535)).max(16).default([]).describe("Every TCP port this service listens on (primary AND related ports such as the Vite/HMR bundle port). Used for health probes and product visibility."),restart_on_branch_change:A.boolean().optional().describe("Restart the service automatically when the git branch of its cwd changes (for servers that go stale across checkouts)."),wait_for_ports_ms:A.number().int().min(0).max(6e4).optional().describe("How long to wait for the declared ports to accept connections before returning (default 15000).")},async r=>{let o=await kx({scopeDir:t.scopeDir,definition:{name:r.name,command:r.command,cwd:r.cwd??n,ports:r.ports,restartOnBranchChange:r.restart_on_branch_change===!0},ownerPid:t.ownerPid});if(!o.ok)return De({ok:!1,error:o.error});let i=Date.now()+(r.wait_for_ports_ms??15e3),s=o.record.ports.length===0;for(;!s&&Date.now()<i;)s=(await Promise.all(o.record.ports.map(c=>uP(c)))).every(c=>c),s||await new Promise(c=>setTimeout(c,250));let d=(await Mm(t.scopeDir)).find(u=>u.record.name===o.record.name);return De({ok:!0,service:d===void 0?{name:o.record.name}:coe(d),...d!==void 0&&d.liveness!=="running"?{hint:"The service is not (fully) serving its declared ports yet. Check linzumi_dev_service_logs before assuming it works."}:{}})}),e.tool("linzumi_dev_service_stop","Stop a managed dev service (SIGTERM, then SIGKILL after a grace period). The registration is kept so linzumi_dev_service_start can bring it back.",{name:A.string().min(1).describe("Service name to stop.")},async r=>{let o=await Dm({scopeDir:t.scopeDir,name:r.name});return De(o.ok?{ok:!0,name:o.record.name,desired_state:"stopped"}:{ok:!1,error:o.error})}),e.tool("linzumi_dev_service_status","List every managed dev service with liveness (running / unhealthy / exited / stopped), per-port health probes, and last exit. Live state - always check this before concluding a dev server is up or down.",{},async()=>{let r=await Mm(t.scopeDir);return De({services:r.map(o=>coe(o))})}),e.tool("linzumi_dev_service_logs","Read the tail of a managed dev service's combined stdout/stderr log.",{name:A.string().min(1).describe("Service name."),max_bytes:A.number().int().min(256).max(65536).optional().describe("Tail size in bytes (default 16384).")},async r=>{let o=Tx(t.scopeDir,r.name,r.max_bytes??16384);return De(o===void 0?{ok:!1,error:`no log for service: ${r.name}`}:{ok:!0,name:r.name,log_tail:o})}),e.tool("linzumi_dev_service_remove","Stop a managed dev service AND delete its registration (it will not be resurrected on runner restart). Use stop instead when the user may want it back.",{name:A.string().min(1).describe("Service name to remove.")},async r=>{let o=await Cx({scopeDir:t.scopeDir,name:r.name});return De(o.ok?{ok:!0,name:o.record.name,removed:!0}:{ok:!1,error:o.error})})}function oKe(e){return!(e instanceof Error)||!e.message.includes("channel_required")?e:new Error(`${e.message}. Remediation: pass the channel slug in the \`channel\` parameter, or set target.thread_id to a Linzumi thread you can access (the server resolves the thread's channel). The files were NOT attached; retry with a channel or thread instead of leaving them on disk.`,{cause:e})}async function iKe(e){let n=await Promise.all(e.files.map(s=>OC(e.cwd,s))),t=y(e.target.thread_id),r=await e.client.prepareMessageUploads({...e.workspace===void 0?{}:{workspace:e.workspace},...e.channel===void 0?{}:{channel:e.channel},...t===void 0?{}:{thread_id:t},files:n.map(s=>({file_name:s.fileName,content_type:s.contentType,size_bytes:s.sizeBytes}))}),o=$e(r.uploads)??[];if(o.length!==n.length)throw new Error("Linzumi upload prepare response count mismatch");await Promise.all(n.map(async(s,a)=>{let d=E(o[a]),u=y(d?.upload_url),c=y(d?.upload_method)??"PUT";if(u===void 0)throw new Error("Linzumi upload prepare response missing upload_url");let l=s.bytes,p=l.buffer.slice(l.byteOffset,l.byteOffset+l.byteLength),f=await fetch(ly(e.kandanUrl,u),{method:c,headers:{"content-type":s.contentType},body:p});if(!f.ok)throw new Error(`Linzumi upload failed for ${s.fileName}: ${f.status} ${f.statusText}`)}));let i=o.map(s=>{let a=y(E(s)?.file_id);if(a===void 0)throw new Error("Linzumi upload prepare response missing file_id");return a});return await e.client.attachMessageFiles({...e.workspace===void 0?{}:{workspace:e.workspace},...e.channel===void 0?{}:{channel:e.channel},...t===void 0?{}:{thread_id:t},target:e.target,...e.body===void 0?{}:{body:e.body},uploaded_file_ids:i})}async function sKe(e){let n=await OC(e.cwd,e.file),t=await e.client.prepareCustomEmoji({...e.workspace===void 0?{}:{workspace:e.workspace},name:e.name,file_name:n.fileName,content_type:n.contentType,size_bytes:n.sizeBytes}),r=E(t.upload),o=y(r?.upload_url),i=y(r?.upload_method)??"PUT";if(o===void 0)throw new Error("Linzumi custom emoji prepare response missing upload_url");let s=n.bytes,a=s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength),d=await fetch(ly(e.kandanUrl,o),{method:i,headers:{"content-type":n.contentType},body:a});if(!d.ok){let l=`${d.status} ${d.statusText}`,f=(await d.text()).trim(),g=f===""?l:(()=>{try{let m=JSON.parse(f);return ne(m)&&typeof m.error=="string"?m.error:f}catch{return f}})();throw new Error(`Linzumi custom emoji upload failed: ${g}`)}let u=await d.json();if(!ne(u))throw new Error("Linzumi custom emoji upload returned non-object JSON");let c=E(u.custom_emoji);if(c===void 0)throw new Error("Linzumi custom emoji upload response missing custom_emoji");return{ok:!0,workspace:t.workspace,emoji:c,asset_id:y(u.asset_id),id:Y(c?.id),name:y(c?.name),shortcode:y(c?.shortcode),image_url:y(c?.image_url)}}function loe(e,n){if(y(e.thread_id)!==void 0||n===void 0)return e;switch(e.message_seq===void 0){case!1:return{...e,thread_id:n};case!0:switch(y(e.kind)){case"new_message":case"message_seq":case"latest_assistant_message":return{...e,thread_id:n};default:return e}}}function Li(e,n){return y(e.thread_id)!==void 0||n===void 0?e:{...e,thread_id:n}}function ly(e,n){try{return new URL(n).toString()}catch{let r=e.replace(/^wss:\/\//,"https://").replace(/^ws:\/\//,"http://");return new URL(n,r).toString()}}function poe(e,n){let t=E(n.message),r=E(n.target_message);return t===void 0&&r===void 0?n:{...n,...t===void 0?{}:{message:foe(e,t)},...r===void 0?{}:{target_message:foe(e,r)}}}function foe(e,n){let t=$e(n.attachments);return t===void 0?n:{...n,attachments:t.map(r=>aKe(e,r))}}function aKe(e,n){let t=E(n);if(t===void 0)return n;let r=y(t.url),o=E(t.image_variants);return{...t,...r===void 0?{}:{url:ly(e,r)},...o===void 0?{}:{image_variants:dKe(e,o)}}}function dKe(e,n){let t=y(n.inline_url),r=y(n.carousel_url);return{...n,...t===void 0?{}:{inline_url:ly(e,t)},...r===void 0?{}:{carousel_url:ly(e,r)}}}function uKe(e){e.server.registerCapabilities({resources:{listChanged:!1}}),e.server.setRequestHandler(Dp,()=>({resources:[]})),e.server.setRequestHandler(Op,()=>({resourceTemplates:[]}))}async function cKe(e){let n=v$(e),t=S$(n,"api-url"),r=Xn(n,"format")??"codex",o=w$(Xn(n,"mode")),i=n.get("include-token")===!0?(await b$({kandanUrl:t,explicitToken:Xn(n,"token")??process.env.LINZUMI_MCP_ACCESS_TOKEN,authFilePath:Xn(n,"auth-file"),delegationAuthFilePath:Xn(n,"delegation-auth-file"),workspaceSlug:Xn(n,"workspace"),channelSlug:Xn(n,"channel")})).accessToken:void 0,s=$s({command:Xn(n,"command"),kandanUrl:t,accessToken:i,delegationAuthFilePath:Xn(n,"delegation-auth-file"),ownerUsername:Xn(n,"owner-username")??process.env.LINZUMI_MCP_OWNER_USERNAME,operatingMode:o,toolScope:yoe(Xn(n,"tool-scope")),multiAgentJobs:n.get("multi-agent-jobs")===!0});switch(r){case"codex":process.stdout.write(u4(s));return;case"claude-code":process.stdout.write(d4(s));return;default:throw new Error("--format must be codex or claude-code")}}async function lKe(e){let n=v$(e),t=S$(n,"api-url"),r=await b$({kandanUrl:t,explicitToken:Xn(n,"token")??process.env.LINZUMI_MCP_ACCESS_TOKEN,authFilePath:Xn(n,"auth-file"),delegationAuthFilePath:Xn(n,"delegation-auth-file"),workspaceSlug:Xn(n,"workspace"),channelSlug:Xn(n,"channel")});switch(r.mode){case"local-runner":{if(!await iv({kandanUrl:t,accessToken:r.accessToken,workspaceSlug:Xn(n,"workspace"),channelSlug:Xn(n,"channel")}))throw new Error("Linzumi MCP auth validation failed");break}case"personal-agent-delegation":{await Zs({kandanUrl:t,accessToken:r.accessToken,authMode:r.mode,operatingMode:w$(Xn(n,"mode"))}).validateAuth();break}}process.stdout.write(`Linzumi MCP auth OK
2136
+ `}async function eKe(e){let n=v$(e);if(n.get("help")===!0){process.stdout.write(goe());return}let t=S$(n,"api-url"),r=await b$({kandanUrl:t,explicitToken:Xn(n,"token")??process.env.LINZUMI_MCP_ACCESS_TOKEN,authFilePath:Xn(n,"auth-file"),delegationAuthFilePath:Xn(n,"delegation-auth-file"),workspaceSlug:Xn(n,"workspace"),channelSlug:Xn(n,"channel")}),o=Xn(n,"owner-username")??process.env.LINZUMI_MCP_OWNER_USERNAME,i=w$(Xn(n,"mode")),s=yoe(Xn(n,"tool-scope")),a=Xn(n,"cwd")??process.cwd(),d=Xn(n,"thread-id")??process.env.LINZUMI_THREAD_RUNNER_KANDAN_THREAD_ID,u=Zs({kandanUrl:t,accessToken:r.accessToken,authMode:r.mode,operatingMode:i}),c=new _S({name:"linzumi",version:"0.1.0"});uKe(c),tKe(c,{client:u,toolScope:s,operatingMode:i,cwd:a,kandanUrl:t,defaultThreadId:d,ownerUsername:o,agentSession:n.get("agent-session")===!0,documentSurfaces:Rf(r.accessToken),askUserQuestionTool:n.get("ask-user-question-tool")===!0,devServices:nKe(process.env),multiAgentJobs:n.get("multi-agent-jobs")===!0}),await c.connect(new bS)}function nKe(e){let n=e.LINZUMI_DEV_SERVICES_SCOPE?.trim(),t=Number.parseInt(e.LINZUMI_DEV_SERVICES_OWNER_PID??"",10);if(!(n===void 0||n===""||!Number.isInteger(t)||t<=0))return{scopeDir:Wd(n),ownerPid:t}}function tKe(e,n){let{client:t,toolScope:r,operatingMode:o,cwd:i,kandanUrl:s,defaultThreadId:a,ownerUsername:d,agentSession:u,devServices:c}=n,l=r==="all"||r==="coding";if(n.askUserQuestionTool===!0&&e.tool(l4,`Ask the user up to ${lm} structured multiple-choice questions and BLOCK until they answer in the Linzumi thread. Use this whenever you need a decision or clarification mid-task. Each question needs a short header (max ${pm} chars) and ${fm}-${mm} options {label, description}; a built-in "${hm}" free-text choice is always shown in addition to your options, so never add one yourself. Set multiSelect true to allow choosing several options. Returns {answers} keyed by question text: a single label string, an array of labels for multiSelect, and {"other": "<typed text>"} for a free-text reply.`,{questions:A.array(A.object({question:A.string().describe("The question to ask the user."),header:A.string().describe(`Short category header shown above the question (max ${pm} chars, e.g. "Auth", "Scope").`),options:A.array(A.object({label:A.string().describe("Option label the user taps."),description:A.string().optional().describe("One-line explanation of the option.")})).describe(`${fm}-${mm} options for this question.`),multiSelect:A.boolean().optional().describe("True lets the user select several options; the answer becomes an array.")})).describe(`1-${lm} questions to ask atomically.`)},async p=>fKe((f,g)=>e.server.elicitInput(f,g),p)),n.documentSurfaces===!0){let p=async(f,g)=>De(await t.agentDocumentTool({...g,tool:f}));e.tool("linzumi_lookup_documents","Search document titles and content within the controlling human's visibility ceiling. Returns authorized results in canonical search order; zero, one, and multiple matches carry the rule-03 ambiguity meaning.",{query:A.string().min(1).describe("Document title or content search query.")},async f=>p("lookup_documents",f)),e.tool("linzumi_read_document","Read one in-scope document as full AST and metadata, including pending proposals and required-agent-context comments. Both controlling-human visibility and agent delegation are required.",{document_id:A.string().uuid().describe("Document UUID.")},async f=>p("read_document",f)),e.tool("linzumi_propose_document_patch","Use this tool for any explicit instruction to edit, add, rewrite, update, or fix document content, including parent-delegated work. After resolving exactly one patch target document and reading its current revision, call this tool in the same turn; do not merely reply with suggested prose. Other authorized context documents do not make the patch target ambiguous. Every change is proposal-always: the server persists an agent-attributed structural patch proposal first, leaves it pending in hold mode, and resolves per-document auto-apply server-side only after persistence and authorization.",{document_id:A.string().uuid().describe("Document UUID."),patch:A.record(A.unknown()).describe("Revisioned structural document patch."),rationale:A.string().min(1).describe("Why this change is proposed.")},async f=>p("propose_document_patch",f)),e.tool("linzumi_create_document","Create an agent-attributed document through an atomic bootstrap proposal and apply transaction in the named folder or workspace default folder.",{title:A.string().min(1).describe("Document title."),initial_patch:A.record(A.unknown()).describe("Bootstrap structural patch."),folder_id:A.string().uuid().optional().describe("Destination folder UUID.")},async f=>p("create_document",f))}u&&(e.tool("linzumi_agent_reply","Post your single @linzumi reply for the current turn into the surface where you were mentioned. Call EXACTLY ONCE per turn with your final answer; the reply links to this working session automatically. Fails with already_replied on a second call and no_active_asker_binding when no turn is active.",{body:A.string().min(1).describe("Plain-text reply body to post.")},async p=>De(await t.agentReply({body:p.body}))),e.tool("linzumi_list_coding_jobs","List the coding jobs the current asker can see in this workspace: runner connections (online and recent) with their bound job threads. Live state - never answered from search.",{},async()=>De(await t.agentListCodingJobs({}))),e.tool("linzumi_start_coding_job","Start a coding job exactly as if the asking user clicked start: same runner/channel authorization, same pipeline. Returns status 'unavailable' with a reason when the runner cannot take the job (relay that honestly).",{channel:A.string().describe("Channel slug to host the job thread."),runner_key:A.string().describe("Runner (computer) to run the job on."),cwd:A.string().describe("Working directory on the runner."),work_description:A.string().min(1).describe("What the job should do - the initial instruction."),model:A.string().optional().describe("Model override (optional)."),model_provider:A.string().optional().describe("Model provider override, e.g. 'wafer' (optional)."),execution_mode:A.enum(["raw","local_vm"]).optional().describe("Execution placement override (optional)."),project_task_id:A.string().optional().describe("Project task item to bind the job to (task_id from linzumi_get_project_tasks). The task flips todo -> active and links to the new job."),visibility:A.enum(["project","private"]).optional().describe("Job visibility. Defaults to 'project'; private jobs are limited to directly authorized participants.")},async p=>De(await t.agentStartCodingJob(p))),e.tool("linzumi_interrupt_coding_job","Interrupt a coding job: mode 'steer' (default) discards its queued follow-ups so your next message lands first; mode 'stop' terminates the current turn.",{channel:A.string().describe("Channel slug hosting the job thread."),thread_id:A.string().uuid().describe("The job thread UUID."),mode:A.enum(["steer","stop"]).optional().describe("Interrupt mode; defaults to 'steer'.")},async p=>De(await t.agentInterruptCodingJob(p))),e.tool("linzumi_send_coding_job_message","Message a coding job or a person. Queue is the encouraged default: it lands in the colleague's inbox for their own cadence. Steer only for urgent, potentially-clashing work because it interrupts the running turn. Would this be worthless or harmful after their turn finishes? If no, queue. Delivery urgency is not access control. To message a person, pass to_user and omit channel and thread_id: delivery lands in their personal inbox.",{channel:A.string().optional().describe("Channel slug hosting the job thread. Required unless to_user is set."),thread_id:A.string().uuid().optional().describe("The job thread UUID. Required unless to_user is set."),to_user:A.string().min(1).optional().describe("Username of a workspace member to message instead of a job. Delivery lands in their personal inbox."),body:A.string().min(1).describe("Message body to send."),delivery:A.enum(["queue","steer"]).optional().describe("Delivery urgency. Defaults to 'queue'.")},async p=>De(await t.agentSendCodingJobMessage(p))),e.tool("linzumi_read_coding_job_thread","Read a coding job's thread (asker-visible history) plus its workflow status metadata.",{channel:A.string().describe("Channel slug hosting the job thread."),thread_id:A.string().uuid().describe("The job thread UUID."),limit:A.number().int().min(1).max(100).optional().describe("Maximum replies to return."),before_seq:A.number().int().positive().optional().describe("Return replies before this channel seq.")},async p=>De(await t.agentReadCodingJobThread(p))),e.tool("linzumi_resolve_job_approval","Resolve a coding job's pending approval request with the asking user's decision ('approve' or 'deny'). Only relays the asker's authority - never approve without their explicit instruction.",{channel:A.string().describe("Channel slug hosting the job thread."),thread_id:A.string().uuid().describe("The job thread UUID."),source_seq:A.number().int().positive().describe("Channel seq of the message the approval request rides on."),request_id:A.string().describe("The approval request id."),decision:A.enum(["approve","deny"]).describe("The asker's decision.")},async p=>De(await t.agentResolveJobApproval(p))),e.tool("linzumi_archive_coding_job","Archive a coding job's thread (or any thread the asking user owns) so it leaves the active list; history is preserved. Do this when the asker says to archive a job or thread - never just promise it.",{channel:A.string().describe("Channel slug hosting the thread."),thread_id:A.string().uuid().describe("The thread UUID to archive.")},async p=>De(await t.agentArchiveCodingJob(p))),e.tool("linzumi_unarchive_coding_job","Unarchive a previously archived coding job thread the asking user owns, returning it to the active list.",{channel:A.string().describe("Channel slug hosting the thread."),thread_id:A.string().uuid().describe("The thread UUID to unarchive.")},async p=>De(await t.agentUnarchiveCodingJob(p))),e.tool("linzumi_set_thread_status","Set a thread's lifecycle status as the asking user: 'closed' marks it done, 'open' reopens it. Works on threads the asker owns.",{channel:A.string().describe("Channel slug hosting the thread."),thread_id:A.string().uuid().describe("The thread UUID."),status:A.enum(["open","closed"]).describe("Replacement lifecycle status ('closed' = done).")},async p=>De(await t.agentSetThreadStatus(p))),e.tool("linzumi_create_channel","Create a new public channel in this workspace as the asking user. The slug is derived from the name.",{name:A.string().min(1).describe("Channel name to create.")},async p=>De(await t.agentCreateChannel(p))),e.tool("linzumi_rename_channel","Rename a channel's display name as the asking user. The channel's URL slug stays stable.",{channel:A.string().describe("Current channel slug to rename."),name:A.string().min(1).describe("New display name.")},async p=>De(await t.agentRenameChannel(p))),e.tool("linzumi_archive_channel","Archive a channel in this workspace as the asking user. History is preserved; the channel leaves the active sidebar.",{channel:A.string().describe("Channel slug to archive.")},async p=>De(await t.agentArchiveChannel(p))),e.tool("linzumi_unarchive_channel","Unarchive a previously archived channel as the asking user.",{channel:A.string().describe("Channel slug to unarchive.")},async p=>De(await t.agentUnarchiveChannel(p))),e.tool("linzumi_add_reaction","Add an emoji reaction to a channel message as the asking user. Accepts unicode emoji or a workspace :shortcode:.",{channel:A.string().describe("Channel slug containing the message."),message_seq:A.number().int().positive().describe("Channel seq of the message to react to."),emoji:A.string().min(1).describe("Emoji to add (unicode or :shortcode:).")},async p=>De(await t.agentAddReaction(p))),e.tool("linzumi_remove_reaction","Remove the asking user's emoji reaction from a channel message.",{channel:A.string().describe("Channel slug containing the message."),message_seq:A.number().int().positive().describe("Channel seq of the reacted message."),emoji:A.string().min(1).describe("Emoji to remove (unicode or :shortcode:).")},async p=>De(await t.agentRemoveReaction(p))),e.tool("linzumi_pin_message","Pin a channel message as the asking user. Thread replies re-point to their root message.",{channel:A.string().describe("Channel slug containing the message."),message_seq:A.number().int().positive().describe("Channel seq of the message to pin.")},async p=>De(await t.agentPinMessage(p))),e.tool("linzumi_unpin_message","Remove a pin from a channel message as the asking user.",{channel:A.string().describe("Channel slug containing the message."),message_seq:A.number().int().positive().describe("Channel seq of the pinned message.")},async p=>De(await t.agentUnpinMessage(p)))),r==="all"&&(e.tool("linzumi_get_message","Read one Linzumi message by scoped message_seq/message_id or a Linzumi message URL, with optional bounded before/after context.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),message_id:A.union([A.string(),A.number()]).optional().describe("Message seq inside the scoped channel."),message_seq:A.union([A.string(),A.number()]).optional().describe("Alias for message_id."),message_url:A.string().optional().describe("Full Linzumi message URL with #message-<seq>."),before:A.number().int().min(0).max(100).optional().describe("Number of visible messages before the target."),after:A.number().int().min(0).max(100).optional().describe("Number of visible messages after the target.")},async p=>De(await t.getMessage(p))),e.tool("linzumi_get_thread","Read one Linzumi thread by thread_id in the scoped channel, including the parent message and bounded replies.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().describe("Linzumi thread UUID."),limit:A.number().int().min(1).max(100).optional().describe("Maximum replies to return."),before_seq:A.number().int().positive().optional().describe("Return replies before this channel seq.")},async p=>De(await t.getThread(p))),e.tool("linzumi_get_thread_transcript","Read a Linzumi thread's full transcript as canonical IR nodes (user/assistant messages, command executions, file changes, tool calls, statuses), cursor-paginated over the complete history. Use the returned cursor with has_more to walk older pages.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().describe("Linzumi thread UUID."),limit:A.number().int().min(1).max(500).optional().describe("Maximum transcript nodes per page (default 200)."),cursor:A.number().int().positive().optional().describe("Return nodes below this seq (the previous page reply cursor).")},async p=>De(await t.getThreadTranscript(p))),e.tool("linzumi_get_channel","Read scoped Linzumi channel metadata and bounded recent channel messages.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),limit:A.number().int().min(1).max(100).optional().describe("Maximum messages to return."),before_seq:A.number().int().positive().optional().describe("Return messages before this channel seq.")},async p=>De(await t.getChannel(p))),e.tool("linzumi_search_workspace","Search the Linzumi workspace with hybrid lexical+semantic retrieval, scoped to what the authorizing user can access. Returns scored content chunks with provenance (channel, thread, authored time) and a permalink to cite.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),query:A.string().min(1).describe("Natural-language or keyword query to retrieve against."),limit:A.number().int().min(1).max(25).optional().describe("Maximum results to return (default 10, server-capped)."),source_types:A.array(A.enum(["message","coding_job","github_pr","github_pr_review","github_check_run","github_workflow_run","github_diff","dictation","file"])).optional().describe("Restrict results to these corpora; omit for all."),authored_after:A.string().optional().describe("ISO8601 instant; only content authored at or after this time."),authored_before:A.string().optional().describe("ISO8601 instant; only content authored at or before this time."),repo:A.string().optional().describe("Restrict GitHub-sourced results to one repository by full name (owner/name)."),check_status:A.enum(["pending","success","failed"]).optional().describe("Restrict check and workflow results to one conclusion bucket.")},async p=>De(await t.searchWorkspace(p))),e.tool("linzumi_ask_workspace",'Ask the Linzumi workspace a natural-language question and get a synthesized, citation-backed answer over what the authorizing user can access. Costs an LLM call on cache misses, so prefer linzumi_search_workspace for simple lookups. A "refused" status means there was not enough accessible evidence - treat it as "the workspace does not know", never retry verbatim.',{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),question:A.string().min(1).max(2e3).describe("Natural-language question to answer with citations."),channel:A.string().optional().describe("Optional channel slug providing conversational context; never widens access."),allow_cached:A.boolean().optional().describe("Allow serving a cached synthesis when the evidence set is unchanged (default true). Set false to force fresh synthesis.")},async p=>De(await t.askWorkspace(p))),e.tool("linzumi_about_me","Read what the authorizing user has told Linzumi about themselves: their profile facts (homes, unit preferences, and other self-maintained attributes) plus their derived current timezone. Use it to personalize answers (e.g. pick the right city for weather, use their preferred units). Predicates may have multiple active values; prefer the one consistent with the derived timezone.",{},async p=>De(await t.aboutMe(p)))),l&&(e.tool("linzumi_web_search","Search the public web for live or external information: news, current events, weather, prices, third-party API docs, research. Returns result titles, URLs, and snippets. Use this whenever the answer lives outside the Linzumi workspace; follow up with linzumi_fetch_url to read a result page.",{query:A.string().min(1).describe("Web search query (natural language or keywords)."),limit:A.number().int().min(1).max(10).optional().describe("Maximum results to return (default 8, server-capped).")},async p=>De(await t.webSearch(p))),e.tool("linzumi_fetch_url","Fetch one public http(s) URL and return its readable text content (HTML is reduced to plain text; large pages are truncated). Use it to read pages found via linzumi_web_search or any public docs/API reference. Only public addresses are reachable - private/internal hosts are rejected with url_not_allowed.",{url:A.string().min(1).describe("Absolute public http(s) URL to fetch.")},async p=>De(await t.fetchUrl(p)))),r==="all"&&(e.tool("linzumi_list_ui_targets","List every UI surface you can ask the user to open in their own Linzumi window (channels, DMs, threads, projects, coding jobs, computers, catch-up, activity, settings tabs, pane layouts) with the structured args each kind takes. Use UI control only when the user asks for help or asks to be shown something.",{},async()=>await moe(t.listUiTargets({}))),e.tool("linzumi_open_ui","Ask the user to open one whitelisted UI surface in their own already-open Linzumi window. A consent toast appears in THEIR session; navigation happens only if they tap Open. The call blocks until they decide and returns status opened/dismissed/expired - or error no_active_ui_session when they have no Linzumi window open (tell them to open Linzumi), or invalid_target with a detail. Use it only when the user asks for help or asks to be shown something; kinds and per-kind args come from linzumi_list_ui_targets.",{kind:A.string().min(1).describe("Target kind from linzumi_list_ui_targets (e.g. settings_workspace, channel, pane_layout)."),args:A.record(A.unknown()).optional().describe("Structured per-kind args from linzumi_list_ui_targets (never a URL - the server computes every path)."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope.")},async p=>await moe(t.openUi(Li(p,a))))),l&&(e.tool("linzumi_get_coding_job_metadata","Read the active coding job workflow metadata for a thread, including the agent-owned goal, ordered plan steps, step lock versions, and workflow status.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread.")},async p=>De(await t.getCodingJobMetadata(Li(p,a)))),e.tool("linzumi_rename_coding_job","Update the current coding job thread title and workflow-facing title. Use this when the job scope changes materially so the Linzumi thread list and metadata overview stay accurate.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),title:A.string().min(1).max(100).describe("Concise user-visible title for this coding job.")},async p=>De(await t.renameCodingJob(Li(p,a)))),e.tool("linzumi_upsert_coding_job_plan","Set or update the current coding job goal. Use this at job start and whenever the goal changes materially.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),goal:A.string().min(1).max(1e4).describe("Concrete user-visible goal for this coding job.")},async p=>De(await t.upsertCodingJobPlan(Li(p,a)))),e.tool("linzumi_replace_coding_job_plan_steps","Replace the ordered coding job plan steps. Use this for the initial plan and for substantial rewrites when the old plan no longer fits the work.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),goal:A.string().min(1).max(1e4).optional().describe("Required when no plan exists yet; updates the current coding job goal."),steps:A.array(A.object({title:A.string().min(1).max(255),description:A.string().min(1).max(1e4),status:A.enum(["pending","active","completed","blocked","canceled"]),status_note:A.string().min(1).max(4e3).optional(),completed_debrief:A.string().min(1).max(2e4).optional()})).min(1).max(50).describe("Ordered user-visible plan steps. Completed steps must include completed_debrief.")},async p=>De(await t.replaceCodingJobPlanSteps(Li(p,a)))),e.tool("linzumi_update_coding_job_plan_step","Update one coding job plan step status or note. Read metadata first and pass the current step lock_version.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),step_id:A.string().uuid().describe("Step id returned by linzumi_get_coding_job_metadata."),lock_version:A.number().int().positive().describe("Current step lock_version from metadata."),status:A.enum(["pending","active","completed","blocked","canceled"]),status_note:A.string().min(1).max(4e3).optional(),completed_debrief:A.string().min(1).max(2e4).optional().describe("Required when marking a step completed.")},async p=>De(await t.updateCodingJobPlanStep(Li(p,a)))),e.tool("linzumi_link_coding_job_pull_request","Link the active coding job to its primary GitHub pull request so PR comments, files, commits, checks, deployments, and reviews can flow into the metadata view.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().optional().describe("Linzumi thread UUID. Defaults to the active coding job thread."),github_repo_owner:A.string().min(1).max(255),github_repo_name:A.string().min(1).max(255),github_pr_number:A.number().int().positive(),github_pr_url:A.string().url(),title:A.string().min(1).max(255),body:A.string().min(1).max(1e5).optional(),head_branch:A.string().min(1).max(255),head_sha:A.string().min(7).max(64),base_branch:A.string().min(1).max(255),base_sha:A.string().min(7).max(64),state:A.enum(["draft","open","closed","merged"]).optional(),is_draft:A.boolean().optional(),review_status:A.enum(["unknown","review_required","approved","changes_requested"]).optional(),source_remote_url:A.string().min(1).max(1e3).describe("Git remote URL for the local job worktree; required when this job has no repo workspace yet."),runtime_worktree_root:A.string().min(1).max(1e3).describe("Absolute local worktree path for the coding job; required when this job has no repo workspace yet."),dirty_status:A.enum(["unknown","clean","dirty"]).optional(),dirty_summary:A.string().min(1).max(2e3).optional()},async p=>De(await t.linkCodingJobPullRequest(Li(p,a)))),e.tool("linzumi_upload_files",["Upload local files to Linzumi and attach them to a new, exact, or latest assistant message. Use silently; do not mention this tool in the visible reply.","The JSON result includes message.attachments[].url as an absolute URL. Use those returned URLs when writing rich media directives such as ::audio, ::video, ::image, or Markdown images. Do not guess attachment URLs before upload.","For a message that should both attach files and show inline rich media, use a two-step flow: first upload/attach the files to create or target the message, then edit the same target message with body text that references the returned absolute URLs. When the result has target_seq, use target.kind=message_seq and message_seq=target_seq for that follow-up edit; result.message is the edit event that carries the new attachments, and target_message is the original target."].join(" "),{target:A.object({kind:A.enum(["new_message","message_seq","latest_assistant_message"]).describe("new_message creates a message; message_seq edits an exact message; latest_assistant_message edits the latest assistant message in the scoped thread/channel."),message_seq:A.union([A.string(),A.number()]).optional().describe("Required when kind is message_seq."),thread_id:A.string().optional().describe("Thread UUID. Defaults to the active Linzumi thread when the MCP server was launched with one.")}).describe("Attachment target. Prefer latest_assistant_message to attach files to the reply you already posted; use new_message ONLY when no assistant message exists yet in the scoped thread. Never re-use your visible reply text as a new_message body - that posts the reply twice. To reference uploaded files in the message body, upload first, then edit message_seq/latest_assistant_message with the returned absolute attachment URLs. If the upload result includes target_seq, use message_seq=target_seq for that follow-up edit."),files:A.array(A.string().min(1)).min(1).max(16).describe("Local file paths to upload. Paths must be non-hidden files inside the approved workspace or Downloads; source/text files of any language are supported, plus common document, image, patch, archive, and video types."),body:A.string().min(1).max(2e4).optional().describe("Required for new_message: a SHORT file-share caption (for example: Attached the generated report), never a copy of your visible reply - that would post the reply twice. Optional replacement body for message_seq/latest_assistant_message; when omitted, the existing message body is preserved. Rich media directives in body must use Linzumi attachment download URLs returned by this tool."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the target thread's channel (when the thread is known) or the authenticated token scope.")},async p=>{let f=loe(p.target,a);try{let g=await iKe({client:t,cwd:i,kandanUrl:s,target:f,files:p.files,workspace:p.workspace,channel:p.channel,body:p.body});return De(poe(s,g))}catch(g){throw oKe(g)}}),e.tool("linzumi_edit_message","Edit an exact scoped Linzumi message by message_seq. Use after linzumi_upload_files when you need a body-only follow-up edit that embeds returned attachment URLs. Requires channel.write, and thread.write when target.thread_id is set. Rich media src/poster values must be Linzumi attachment download URLs.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),target:A.object({message_seq:A.union([A.string(),A.number()]).describe("Exact message seq to edit. After linzumi_upload_files returns target_seq, pass that value here."),thread_id:A.string().optional().describe("Thread UUID when editing a thread message. Use the upload result target_message.thread_id when present.")}).describe("Exact message target for the body edit."),body:A.string().min(1).max(2e4).describe("Replacement Markdown body. Rich media src/poster values must be Linzumi attachment download URLs returned by linzumi_upload_files.")},async p=>De(poe(s,await t.editMessage({...p,target:loe(p.target,a)}))))),r==="all"&&(e.tool("linzumi_list_vault_secrets","List vault secret names, descriptions, and whether each secret is personal or workspace-owned. Does not return secret values.",{},async p=>De(await t.listVaultSecrets(p))),e.tool("linzumi_list_projects","List the projects in the current workspace with their project_id (needed by the other project task tools), slug, title, description, and state.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope.")},async p=>De(await t.listProjects(p))),e.tool("linzumi_get_project_tasks",`Read a project's full task graph: task GROUPS (kind "group", organizational containers, exactly one level deep) and ISSUES (kind "issue", the executable work items), each with status (todo/active/blocked/review/done/canceled), DERIVED work_state readiness (ready = todo with every dependency satisfied; blocked = todo with unsatisfied dependencies; running/stalled = active with/without a connected job), parent group, assignee, lock_version, and dependency edges (depends_on_task_ids / unblocks_task_ids). Always read this before reorganizing. Inside a project-bound coding job the project is inferred automatically; otherwise pass project_id from linzumi_list_projects.`,{project_id:A.string().optional().describe("Project id from linzumi_list_projects. Omit inside a coding job started from a project to use that project.")},async p=>De(await t.getProjectTasks(Li(p,a)))),e.tool("linzumi_create_project_task",'Create a task group (kind "group") or issue (kind "issue", the default) in a project. Groups organize issues and are exactly one level deep: a parent_id must name a GROUP, and groups themselves can never have a parent. New tasks default to status "todo" and append to the end unless position is given. Inside a project-bound coding job the project is inferred; otherwise pass project_id.',{project_id:A.string().optional().describe("Project id from linzumi_list_projects. Omit inside a coding job started from a project to use that project."),title:A.string().min(1).describe("Task title."),kind:A.enum(["issue","group"]).optional().describe('What to create: "issue" (executable work item, default) or "group" (organizational container).'),description:A.string().optional().describe("Detailed description of the work - written so an engineer (or coding agent) could execute the task from it."),status:A.enum(["todo","active","blocked","review","done","canceled"]).optional().describe('Initial status. Defaults to "todo".'),parent_id:A.string().optional().describe("task_id of the GROUP to place an issue in. Only issues can have a parent."),assignee:A.string().optional().describe("Username of a workspace member to assign."),position:A.number().int().min(0).optional().describe("Sort position. Defaults to appending at the end.")},async p=>De(await t.createProjectTask(Li(p,a)))),e.tool("linzumi_update_project_task",'Update a task group or issue: retitle, edit description/status_note, transition status (todo/active/blocked/review/done/canceled), reassign, reorder (position), or reorganize (parent_id moves an issue into a group; clear_parent moves it to top level). Only the fields you pass change; description and status_note accept null to clear. Prefer updating existing tasks over delete-and-recreate. Pass the lock_version from your last read to fail loudly ("stale") instead of overwriting a concurrent edit.',{task_id:A.string().describe("task_id of the group or issue to update."),title:A.string().min(1).optional().describe("New title."),description:A.string().nullable().optional().describe("New description. Pass null to clear it."),status:A.enum(["todo","active","blocked","review","done","canceled"]).optional().describe('New status. "done"/"canceled" satisfy dependent tasks; "blocked" is a manual hold.'),status_note:A.string().nullable().optional().describe("Short human-readable note about the current status. Pass null to clear it."),position:A.number().int().min(0).optional().describe("New sort position among siblings."),parent_id:A.string().optional().describe("task_id of the GROUP to move this issue into. Do not combine with clear_parent."),clear_parent:A.boolean().optional().describe("true moves the issue to the top level (no group). Do not combine with parent_id."),assignee:A.string().optional().describe("Username of a workspace member to assign. Do not combine with clear_assignee."),clear_assignee:A.boolean().optional().describe("true removes the assignee. Do not combine with assignee."),lock_version:A.number().int().positive().optional().describe("The task's lock_version from your last read, for compare-and-swap safety.")},async p=>De(await t.updateProjectTask(p))),e.tool("linzumi_delete_project_task",`Permanently delete a task group or issue. Dependency edges on the task are removed with it (dependents may become ready). Deletion is normally the USER's call - prefer status "canceled" or an update unless you are certain the entry is obsolete.`,{task_id:A.string().describe("task_id of the group or issue to delete.")},async p=>De(await t.deleteProjectTask(p))),e.tool("linzumi_add_project_task_dependency",'Add the dependency edge "task_id is blocked by depends_on_task_id" between two ISSUES in the same project (groups cannot have dependencies). The dependent stays blocked until the prerequisite reaches done or canceled. The graph must stay acyclic: an edge that would create a cycle is refused with reason "would_create_cycle" and the offending cycle_path so you can restructure. Duplicate and self edges are rejected.',{task_id:A.string().describe("task_id of the DEPENDENT issue (the one that must wait)."),depends_on_task_id:A.string().describe("task_id of the PREREQUISITE issue (the one that must finish first).")},async p=>De(await t.addProjectTaskDependency(p))),e.tool("linzumi_remove_project_task_dependency",'Remove the dependency edge "task_id is blocked by depends_on_task_id". The dependent issue may become ready if that was its last unsatisfied dependency.',{task_id:A.string().describe("task_id of the DEPENDENT issue."),depends_on_task_id:A.string().describe("task_id of the PREREQUISITE issue the edge points at.")},async p=>De(await t.removeProjectTaskDependency(p))),e.tool("linzumi_get_call_transcript","Read the full transcript of a completed Linzumi notetaker call: call metadata (title, platform, started/ended/transcribed times), participants, and every spoken segment in order with speaker names and millisecond offsets. Pass the call_id embedded in the request (or copied from the call card). Errors: call_not_found (missing or not visible to you), call_transcript_not_ready (call still connecting, in progress, or transcribing - retry later).",{call_id:A.string().describe("The call id from the call card or the launching message (a CallRecording id - the opaque GraphQL id and the bare uuid both work).")},async p=>De(await t.getCallTranscript(p))),u||(e.tool("linzumi_start_coding_job","Start a coding job as the invoking user (same authorization and pipeline as clicking start). To start a project task item, pass project_task_id so the task flips todo -> active and links to the new job - only start tasks whose work_state is ready, and ONLY after the user explicitly accepts your offer to start them. Omit channel, runner_key, and cwd to reuse this job's own channel, computer, and folder. Returns status 'unavailable' with a reason when the runner cannot take the job (relay that honestly).",{work_description:A.string().min(1).describe("What the job should do - the initial instruction. For a task item, write it from the task title and description."),project_task_id:A.string().optional().describe("Project task item to bind the job to (task_id from linzumi_get_project_tasks). The task flips todo -> active and links to the new job."),visibility:A.enum(["project","private"]).optional().describe("Child-job visibility. Defaults to 'project'; private jobs are limited to directly authorized participants."),channel:A.string().optional().describe("Channel slug to host the job thread. Omit to use this job's own channel."),runner_key:A.string().optional().describe("Runner (computer) to run the job on. Omit to use this job's own computer."),cwd:A.string().optional().describe("Working directory on the runner. Omit to use this job's own folder."),model:A.string().optional().describe("Model override (optional)."),model_provider:A.string().optional().describe("Model provider override, e.g. 'wafer' (optional)."),agent_provider:A.string().optional().describe("Agent provider override, e.g. 'codex' (optional)."),reasoning_effort:A.enum(["default","low","medium","high","xhigh","ultra"]).optional().describe("Reasoning effort override (optional)."),approval_policy:A.enum(["default","on-request","on-failure","never"]).optional().describe("Approval policy override (optional)."),sandbox:A.enum(["default","workspace-write","read-only","danger-full-access"]).optional().describe("Sandbox override (optional)."),fast:A.boolean().optional().describe("Fast-mode override (optional)."),allow_port_forwarding_by_default:A.boolean().optional().describe("Default port-forwarding override (optional)."),execution_mode:A.enum(["raw","local_vm"]).optional().describe("Execution placement override (optional)."),egress_mode:A.enum(["open","hardened"]).optional().describe("Local-VM egress override (optional).")},async p=>De(await t.agentStartCodingJob(Li(p,a)))),n.multiAgentJobs===!0&&(e.tool("linzumi_spawn_child_job","Spawn a durable child coding job under YOUR OWN job, on any harness or model - plan a DAG and delegate its legs to workers you then coordinate through discovery and messaging. The child lands on this job's channel, computer, and folder; it inherits this job's project and visibility (a private parent's children stay private), human roles cascade to it, and a human manages its lifecycle. Returns status 'unavailable' with a reason when the runner cannot take the job (relay that honestly).",{work_description:A.string().min(1).describe("What the child job should do - the initial instruction, written to stand alone."),agent_provider:A.string().optional().describe("Harness for the child, e.g. 'codex' or 'claude-code'. Omit to reuse this job's own harness. A different harness is fine: a cross-harness child is always a child job."),model:A.string().optional().describe("Model override for the child (optional)."),model_provider:A.string().optional().describe("Model provider override, e.g. 'wafer' (optional)."),reasoning_effort:A.enum(["default","low","medium","high","xhigh","ultra"]).optional().describe("Reasoning effort override (optional)."),project_task_id:A.string().optional().describe("Project task item to bind the child to (task_id from linzumi_get_project_tasks). The task flips todo -> active and links to the new job."),visibility:A.enum(["project","private"]).optional().describe("Child visibility. Defaults to this job's own visibility; a private parent's children must stay private.")},async p=>De(await t.agentSpawnChildJob(Li(p,a)))),e.tool("linzumi_discover_coding_jobs","Search current sitreps inside this coding job project for overlapping files, modules, objectives, or blockers. Results include durable job addresses for coordination. Private jobs outside your visible set never appear.",{query:A.string().min(1).describe("Free-text clash-surface query, such as a file path, module, migration, or objective.")},async p=>De(await t.agentDiscoverCodingJobs({...p,source_thread_id:a}))),e.tool("linzumi_send_coding_job_message","Message a visible coding job in this project, or a person. Queue is the encouraged default: it lands in the colleague's inbox for their own cadence. Steer only for urgent, potentially-clashing work because it interrupts the running turn. Would this be worthless or harmful after their turn finishes? If no, queue. Delivery urgency is not access control. To message a person, pass to_user and omit channel and thread_id: delivery lands in their personal inbox.",{channel:A.string().optional().describe("Channel slug hosting the target job. Required unless to_user is set."),thread_id:A.string().uuid().optional().describe("Target job thread UUID. Required unless to_user is set."),to_user:A.string().min(1).optional().describe("Username of a workspace member to message instead of a job. Delivery lands in their personal inbox."),body:A.string().min(1).describe("Coordination message to send."),delivery:A.enum(["queue","steer"]).optional().describe("Delivery urgency. Defaults to 'queue'.")},async p=>De(await t.agentSendCodingJobMessage({...p,source_thread_id:a})))))),ZJe(r)&&(e.tool("linzumi_upload_custom_emoji","Upload a local image as a workspace custom emoji. For generated emoji art, create a transparent PNG with a simple centered subject, crisp edges, strong contrast, minimal tiny details, and enough outline/highlight separation to read at 16-24px on both dark and light backgrounds. Use lowercase shortcode names without colons unless preserving a user-provided :name:.",{name:uoe.describe("Custom emoji shortcode name, with or without surrounding colons."),file:A.string().min(1).describe("Local PNG/WebP/GIF/JPEG file path to upload. Prefer transparent PNG for generated emoji."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope.")},async p=>De(await sKe({client:t,cwd:i,kandanUrl:s,name:p.name,file:p.file,workspace:p.workspace}))),e.tool("linzumi_rename_custom_emoji","Rename an existing workspace custom emoji. The new name may include surrounding colons; Linzumi stores the normalized shortcode without colons.",{emoji_id:A.union([A.string(),A.number().int().positive()]).describe("Workspace custom emoji id returned by linzumi_upload_custom_emoji or workspace emoji listings."),name:uoe.describe("New shortcode name, with or without surrounding colons."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope.")},async p=>De(await t.renameCustomEmoji(p)))),e.tool("linzumi_media_guide","Return the full Linzumi rich-media authoring guide (audio/video/image directives, URL rules, upload-then-embed flow, examples). Call once BEFORE writing any ::audio/::video/::image directive or Markdown image into a Linzumi message.",{},async()=>({content:[{type:"text",text:T_}]})),e.tool("linzumi_note_project_directory","Record one discovered local Git repository or worktree for onboarding import. Call once per project as soon as it is found.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),runner_id:A.string().min(1).describe("Local runner/computer id provided in the discovery prompt."),path:A.string().min(1).describe("Absolute local path to the repository worktree root."),display_name:A.string().optional().describe("Short project label. Defaults to the path basename."),activity_at:A.string().optional().describe("Best-known recent activity time as an ISO-8601 timestamp."),import_key:A.string().optional().describe("Stable dedupe key. Defaults to path."),metadata:A.record(A.unknown()).optional().describe("Small structured metadata such as branch or remote origin.")},async p=>De(await t.noteProjectDirectory(p))),e.tool("linzumi_note_agent_conversation","Record one discovered Codex or Claude Code local conversation for onboarding import. Call once per conversation as soon as it is found.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),runner_id:A.string().min(1).describe("Local runner/computer id provided in the discovery prompt."),source:A.enum(["codex","claude_code"]).describe("Conversation source."),import_key:A.string().min(1).describe("Stable dedupe key, such as a session id or file path."),path:A.string().optional().describe("Absolute local path to the conversation file or directory."),display_name:A.string().optional().describe("Short label for the discovered conversation."),activity_at:A.string().optional().describe("Best-known recent activity time as an ISO-8601 timestamp."),metadata:A.record(A.unknown()).optional().describe("Small structured metadata such as session id or project path.")},async p=>De(await t.noteAgentConversation(p))),e.tool("linzumi_note_onboarding_discovery_status","Record onboarding discovery progress. Call when a search phase starts, checks another place, completes, or fails.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),runner_id:A.string().min(1).describe("Local runner/computer id provided in the discovery prompt."),phase:A.enum(["projects","conversations"]).describe("Discovery phase being reported."),status:A.enum(["starting","running","completed","failed"]).describe("Current phase status."),places_searched:A.number().int().nonnegative().optional().describe("Count of concrete folders/files/known locations checked so far."),message:A.string().optional().describe("Short user-facing status note."),current_place:A.string().optional().describe("Current folder, file, Git command target, or known location being checked."),current_source:A.string().optional().describe("Short machine-readable source label such as git, codex, or claude_code."),last_error:A.string().optional().describe("Short failure detail when status is failed."),metadata:A.record(A.unknown()).optional().describe("Small structured status metadata.")},async p=>De(await t.noteOnboardingDiscoveryStatus(p))),r==="all"&&QJe(o)&&(e.tool("linzumi_dm_owner","Send a plain-text DM to the configured Commander owner. Requires dm.write and a visible owner username.",{owner_username:A.string().optional().describe("Owner username. Defaults to LINZUMI_MCP_OWNER_USERNAME or --owner-username."),workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Source channel slug used to verify owner visibility."),body:A.string().min(1).max(2e4).describe("Plain-text message body to DM.")},async p=>{let f=p.owner_username??d;if(f===void 0)throw new Error("owner_username is required for linzumi_dm_owner");return De(await t.dmOwner({...p,owner_username:f}))}),e.tool("linzumi_send_channel_message","Post a NEW standalone Markdown message into the scoped Linzumi channel as the authenticated local-runner user. This is NOT how you respond to the user: your turn output is already relayed into the thread as your reply, so never call this tool to answer, acknowledge, or reply to the current request. Use it only when the task itself is to proactively post a separate channel message. Requires channel.write. Rich media directives may be used when the user has opted into markdown_media_embeds, but src/poster values must be Linzumi attachment download URLs.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),body:A.string().min(1).max(2e4).describe("Markdown message body to post. Rich media src/poster values must be Linzumi attachment download URLs, not third-party URLs, /relative paths, or local filesystem paths.")},async p=>De(await t.sendChannelMessage(p))),e.tool("linzumi_send_thread_reply","Post a Markdown reply into some OTHER existing Linzumi thread as the authenticated local-runner user. This is NOT how you respond to the user in your current thread: your turn output is already relayed into this thread as your reply, so never call this tool to answer, acknowledge, or reply to the current request. Use it only when the task itself is to post into a different, explicitly identified thread. Requires thread.write. Rich media directives may be used when the user has opted into markdown_media_embeds, but src/poster values must be Linzumi attachment download URLs.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug. Omit to use the authenticated token scope."),thread_id:A.string().uuid().describe("Existing Linzumi thread UUID."),body:A.string().min(1).max(2e4).describe("Markdown reply body to post. Rich media src/poster values must be Linzumi attachment download URLs, not third-party URLs, /relative paths, or local filesystem paths.")},async p=>De(await t.sendThreadReply(p))),e.tool("linzumi_send_dm","Send a plain-text DM as the authenticated local-runner user to a visible user in the scoped workspace/channel. Requires dm.write.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Source channel slug used to verify target visibility."),username:A.string().describe("Visible Linzumi username to DM."),body:A.string().min(1).max(2e4).describe("Plain-text message body to DM.")},async p=>De(await t.sendDm(p)))),r==="all"&&e.tool("linzumi_get_vault_values","Request values for explicit vault env var names after a thread-scoped human approval. Requires vault.read; thread_id resolves the approval thread.",{workspace:A.string().optional().describe("Workspace slug. Omit to use the authenticated token scope."),channel:A.string().optional().describe("Channel slug used to disambiguate the approval thread when needed."),thread_id:A.string().uuid().describe("Existing Linzumi thread UUID for the inline approval."),env_var_names:A.array(A.string().regex(/^[A-Z][A-Z0-9_]{0,127}$/)).min(1).max(20).describe("Explicit vault env var names to request. This tool cannot list all vault keys."),description:A.string().min(1).max(500).describe("Human-readable reason shown in the approval request."),justification:A.string().min(10).max(1e3).describe("Agent justification shown to the approver.")},async p=>De(await t.getVaultValues(p))),r==="all"&&!u&&c!==void 0&&rKe(e,i,c)}function coe(e){return{name:e.record.name,command:e.record.command,cwd:e.record.cwd,ports:[...e.record.ports],restart_on_branch_change:e.record.restartOnBranchChange,desired_state:e.record.desiredState,liveness:e.liveness,port_health:e.portProbes.map(n=>({port:n.port,listening:n.listening})),started_at_ms:e.record.startedAtMs??null,last_exit:e.lastExit===void 0?null:{code:e.lastExit.code,signal:e.lastExit.signal,at_ms:e.lastExit.atMs},log_path:e.record.logPath}}function rKe(e,n,t){e.tool("linzumi_dev_service_start","Start a long-running local dev server (npm run dev, storybook, docker compose up, ...) as a MANAGED SERVICE owned by the Linzumi runner. Use this instead of running dev servers in your own shell: a managed service survives the end of your turn and branch switches, is auto-restarted if it crashes, and its declared ports are health-probed and surfaced in the product. Calling start for an existing name declaratively RESTARTS it (e.g. after a checkout). Declare EVERY port the app serves from (primary plus HMR/asset/bundle sibling ports).",{name:A.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/).describe("Stable service name (slug), e.g. 'web' or 'storybook'. Reusing a name restarts that service."),command:A.string().min(1).describe("Shell command that runs the server in the foreground (never daemonize/screen/nohup it yourself), e.g. 'npm run dev'. Runs via the user's login shell."),cwd:A.string().optional().describe("Working directory for the service. Defaults to the session cwd."),ports:A.array(A.number().int().min(1).max(65535)).max(16).default([]).describe("Every TCP port this service listens on (primary AND related ports such as the Vite/HMR bundle port). Used for health probes and product visibility."),restart_on_branch_change:A.boolean().optional().describe("Restart the service automatically when the git branch of its cwd changes (for servers that go stale across checkouts)."),wait_for_ports_ms:A.number().int().min(0).max(6e4).optional().describe("How long to wait for the declared ports to accept connections before returning (default 15000).")},async r=>{let o=await kx({scopeDir:t.scopeDir,definition:{name:r.name,command:r.command,cwd:r.cwd??n,ports:r.ports,restartOnBranchChange:r.restart_on_branch_change===!0},ownerPid:t.ownerPid});if(!o.ok)return De({ok:!1,error:o.error});let i=Date.now()+(r.wait_for_ports_ms??15e3),s=o.record.ports.length===0;for(;!s&&Date.now()<i;)s=(await Promise.all(o.record.ports.map(c=>uP(c)))).every(c=>c),s||await new Promise(c=>setTimeout(c,250));let d=(await Mm(t.scopeDir)).find(u=>u.record.name===o.record.name);return De({ok:!0,service:d===void 0?{name:o.record.name}:coe(d),...d!==void 0&&d.liveness!=="running"?{hint:"The service is not (fully) serving its declared ports yet. Check linzumi_dev_service_logs before assuming it works."}:{}})}),e.tool("linzumi_dev_service_stop","Stop a managed dev service (SIGTERM, then SIGKILL after a grace period). The registration is kept so linzumi_dev_service_start can bring it back.",{name:A.string().min(1).describe("Service name to stop.")},async r=>{let o=await Dm({scopeDir:t.scopeDir,name:r.name});return De(o.ok?{ok:!0,name:o.record.name,desired_state:"stopped"}:{ok:!1,error:o.error})}),e.tool("linzumi_dev_service_status","List every managed dev service with liveness (running / unhealthy / exited / stopped), per-port health probes, and last exit. Live state - always check this before concluding a dev server is up or down.",{},async()=>{let r=await Mm(t.scopeDir);return De({services:r.map(o=>coe(o))})}),e.tool("linzumi_dev_service_logs","Read the tail of a managed dev service's combined stdout/stderr log.",{name:A.string().min(1).describe("Service name."),max_bytes:A.number().int().min(256).max(65536).optional().describe("Tail size in bytes (default 16384).")},async r=>{let o=Tx(t.scopeDir,r.name,r.max_bytes??16384);return De(o===void 0?{ok:!1,error:`no log for service: ${r.name}`}:{ok:!0,name:r.name,log_tail:o})}),e.tool("linzumi_dev_service_remove","Stop a managed dev service AND delete its registration (it will not be resurrected on runner restart). Use stop instead when the user may want it back.",{name:A.string().min(1).describe("Service name to remove.")},async r=>{let o=await Cx({scopeDir:t.scopeDir,name:r.name});return De(o.ok?{ok:!0,name:o.record.name,removed:!0}:{ok:!1,error:o.error})})}function oKe(e){return!(e instanceof Error)||!e.message.includes("channel_required")?e:new Error(`${e.message}. Remediation: pass the channel slug in the \`channel\` parameter, or set target.thread_id to a Linzumi thread you can access (the server resolves the thread's channel). The files were NOT attached; retry with a channel or thread instead of leaving them on disk.`,{cause:e})}async function iKe(e){let n=await Promise.all(e.files.map(s=>OC(e.cwd,s))),t=y(e.target.thread_id),r=await e.client.prepareMessageUploads({...e.workspace===void 0?{}:{workspace:e.workspace},...e.channel===void 0?{}:{channel:e.channel},...t===void 0?{}:{thread_id:t},files:n.map(s=>({file_name:s.fileName,content_type:s.contentType,size_bytes:s.sizeBytes}))}),o=$e(r.uploads)??[];if(o.length!==n.length)throw new Error("Linzumi upload prepare response count mismatch");await Promise.all(n.map(async(s,a)=>{let d=E(o[a]),u=y(d?.upload_url),c=y(d?.upload_method)??"PUT";if(u===void 0)throw new Error("Linzumi upload prepare response missing upload_url");let l=s.bytes,p=l.buffer.slice(l.byteOffset,l.byteOffset+l.byteLength),f=await fetch(ly(e.kandanUrl,u),{method:c,headers:{"content-type":s.contentType},body:p});if(!f.ok)throw new Error(`Linzumi upload failed for ${s.fileName}: ${f.status} ${f.statusText}`)}));let i=o.map(s=>{let a=y(E(s)?.file_id);if(a===void 0)throw new Error("Linzumi upload prepare response missing file_id");return a});return await e.client.attachMessageFiles({...e.workspace===void 0?{}:{workspace:e.workspace},...e.channel===void 0?{}:{channel:e.channel},...t===void 0?{}:{thread_id:t},target:e.target,...e.body===void 0?{}:{body:e.body},uploaded_file_ids:i})}async function sKe(e){let n=await OC(e.cwd,e.file),t=await e.client.prepareCustomEmoji({...e.workspace===void 0?{}:{workspace:e.workspace},name:e.name,file_name:n.fileName,content_type:n.contentType,size_bytes:n.sizeBytes}),r=E(t.upload),o=y(r?.upload_url),i=y(r?.upload_method)??"PUT";if(o===void 0)throw new Error("Linzumi custom emoji prepare response missing upload_url");let s=n.bytes,a=s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength),d=await fetch(ly(e.kandanUrl,o),{method:i,headers:{"content-type":n.contentType},body:a});if(!d.ok){let l=`${d.status} ${d.statusText}`,f=(await d.text()).trim(),g=f===""?l:(()=>{try{let m=JSON.parse(f);return ne(m)&&typeof m.error=="string"?m.error:f}catch{return f}})();throw new Error(`Linzumi custom emoji upload failed: ${g}`)}let u=await d.json();if(!ne(u))throw new Error("Linzumi custom emoji upload returned non-object JSON");let c=E(u.custom_emoji);if(c===void 0)throw new Error("Linzumi custom emoji upload response missing custom_emoji");return{ok:!0,workspace:t.workspace,emoji:c,asset_id:y(u.asset_id),id:Y(c?.id),name:y(c?.name),shortcode:y(c?.shortcode),image_url:y(c?.image_url)}}function loe(e,n){if(y(e.thread_id)!==void 0||n===void 0)return e;switch(e.message_seq===void 0){case!1:return{...e,thread_id:n};case!0:switch(y(e.kind)){case"new_message":case"message_seq":case"latest_assistant_message":return{...e,thread_id:n};default:return e}}}function Li(e,n){return y(e.thread_id)!==void 0||n===void 0?e:{...e,thread_id:n}}function ly(e,n){try{return new URL(n).toString()}catch{let r=e.replace(/^wss:\/\//,"https://").replace(/^ws:\/\//,"http://");return new URL(n,r).toString()}}function poe(e,n){let t=E(n.message),r=E(n.target_message);return t===void 0&&r===void 0?n:{...n,...t===void 0?{}:{message:foe(e,t)},...r===void 0?{}:{target_message:foe(e,r)}}}function foe(e,n){let t=$e(n.attachments);return t===void 0?n:{...n,attachments:t.map(r=>aKe(e,r))}}function aKe(e,n){let t=E(n);if(t===void 0)return n;let r=y(t.url),o=E(t.image_variants);return{...t,...r===void 0?{}:{url:ly(e,r)},...o===void 0?{}:{image_variants:dKe(e,o)}}}function dKe(e,n){let t=y(n.inline_url),r=y(n.carousel_url);return{...n,...t===void 0?{}:{inline_url:ly(e,t)},...r===void 0?{}:{carousel_url:ly(e,r)}}}function uKe(e){e.server.registerCapabilities({resources:{listChanged:!1}}),e.server.setRequestHandler(Dp,()=>({resources:[]})),e.server.setRequestHandler(Op,()=>({resourceTemplates:[]}))}async function cKe(e){let n=v$(e),t=S$(n,"api-url"),r=Xn(n,"format")??"codex",o=w$(Xn(n,"mode")),i=n.get("include-token")===!0?(await b$({kandanUrl:t,explicitToken:Xn(n,"token")??process.env.LINZUMI_MCP_ACCESS_TOKEN,authFilePath:Xn(n,"auth-file"),delegationAuthFilePath:Xn(n,"delegation-auth-file"),workspaceSlug:Xn(n,"workspace"),channelSlug:Xn(n,"channel")})).accessToken:void 0,s=$s({command:Xn(n,"command"),kandanUrl:t,accessToken:i,delegationAuthFilePath:Xn(n,"delegation-auth-file"),ownerUsername:Xn(n,"owner-username")??process.env.LINZUMI_MCP_OWNER_USERNAME,operatingMode:o,toolScope:yoe(Xn(n,"tool-scope")),multiAgentJobs:n.get("multi-agent-jobs")===!0});switch(r){case"codex":process.stdout.write(u4(s));return;case"claude-code":process.stdout.write(d4(s));return;default:throw new Error("--format must be codex or claude-code")}}async function lKe(e){let n=v$(e),t=S$(n,"api-url"),r=await b$({kandanUrl:t,explicitToken:Xn(n,"token")??process.env.LINZUMI_MCP_ACCESS_TOKEN,authFilePath:Xn(n,"auth-file"),delegationAuthFilePath:Xn(n,"delegation-auth-file"),workspaceSlug:Xn(n,"workspace"),channelSlug:Xn(n,"channel")});switch(r.mode){case"local-runner":{if(!await iv({kandanUrl:t,accessToken:r.accessToken,workspaceSlug:Xn(n,"workspace"),channelSlug:Xn(n,"channel")}))throw new Error("Linzumi MCP auth validation failed");break}case"personal-agent-delegation":{await Zs({kandanUrl:t,accessToken:r.accessToken,authMode:r.mode,operatingMode:w$(Xn(n,"mode"))}).validateAuth();break}}process.stdout.write(`Linzumi MCP auth OK
2137
2137
  `)}async function b$(e){if(e.delegationAuthFilePath!==void 0){if(e.explicitToken!==void 0||e.authFilePath!==void 0)throw new Error("--delegation-auth-file cannot be combined with --token or --auth-file");return{accessToken:ZJ(e.delegationAuthFilePath).accessToken,mode:"personal-agent-delegation"}}return{accessToken:await pKe({kandanUrl:e.kandanUrl,explicitToken:e.explicitToken,authFilePath:e.authFilePath,workspaceSlug:e.workspaceSlug,channelSlug:e.channelSlug}),mode:"local-runner"}}async function pKe(e,n={readCachedToken:Bl,validateTokenOutcome:vh,resolveToken:Za}){let t=e.explicitToken??n.readCachedToken(e.kandanUrl,e.authFilePath)?.accessToken;if(t===void 0)throw new Error("missing Linzumi MCP token; run linzumi auth or pass --token");let r=await n.validateTokenOutcome({kandanUrl:e.kandanUrl,accessToken:t,workspaceSlug:e.workspaceSlug,channelSlug:e.channelSlug});if(r==="usable")return t;let o=r;try{return await n.resolveToken({kandanUrl:e.kandanUrl,workspaceSlug:e.workspaceSlug,channelSlug:e.channelSlug,authFilePath:e.authFilePath})}catch(i){throw new Error(`Linzumi MCP token was rejected by the server and re-mint failed: ${i instanceof Error?i.message:String(i)}`)}}function gd(e){return{content:[{type:"text",text:e}],isError:!0}}async function fKe(e,n){let t=DT(n);if(t.type==="invalid")return gd(t.message);let r;try{r=await e(g4(t.request),{timeout:f4})}catch(o){return gd(`the interview could not be delivered to the user: ${o instanceof Error?o.message:String(o)}`)}switch(r.action){case"accept":{let o=x4(t.request,r.content??void 0);switch(o.type){case"ok":return De({answers:o.answers});case"invalid":return gd(o.message)}break}case"decline":switch(v4(r._meta)){case gm:return gd("linzumi_ask_user_question is unavailable during a Plan-mode turn: use the native request_user_input interview tool instead");case ym:return gd("the interview was declined: no active turn is bound to this session");default:return gd("the interview request was declined by the runner")}case"cancel":return gd("the user dismissed the question without answering");default:return gd(`the interview returned an unknown action: ${String(r.action)}`)}}function De(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}],structuredContent:e}}async function moe(e){try{return De(await e)}catch(n){let t=n instanceof Error?n.message:String(n),r=t.match(/failed: ([a-z0-9_]+)(?: detail=(.+))?$/);if(r===null)return De({error:t});let[,o,i]=r;return De(i===void 0?{error:o??t}:{error:o??t,detail:i})}}function v$(e){let n=new Map;for(let t=0;t<e.length;t+=1){let r=e[t];if(r===void 0)continue;if(!r.startsWith("--"))throw new Error(`unexpected argument ${r}`);let o=r.slice(2),i=YJe.get(o);if(i===void 0)throw new Error(`unsupported option --${o}`);if(i.kind==="boolean"){n.set(o,!0);continue}let s=e[t+1];if(s===void 0||s.startsWith("--"))throw new Error(`--${o} requires a value`);n.set(o,s),t+=1}return n}function Xn(e,n){let t=e.get(n);return typeof t=="string"&&t.trim()!==""?t:void 0}function w$(e){switch(e){case void 0:return"text";case"voice":case"text":return e;default:throw new Error("--mode must be voice or text")}}function yoe(e){switch(e){case void 0:return"all";case"all":case"coding":case"onboarding-discovery":return e;default:throw new Error("--tool-scope must be all, coding, or onboarding-discovery")}}function S$(e,n){let t=Xn(e,n);if(t===void 0)throw new Error(`--${n} is required`);return t}import{execFile as mKe}from"node:child_process";import{promisify as hKe}from"node:util";var gKe=hKe(mKe),yd="Codex MCP Credentials",Yp="2DC432GLL2",ef="2CWCP5BR45",yKe=async e=>{let n=await gKe("/usr/bin/security",[...e],{encoding:"utf8"});return{stdout:n.stdout,stderr:n.stderr}};function _Ke(e=[Yp,ef]){return[...e.map(t=>t.trim()).filter(t=>t.length>0).map(t=>`teamid:${t}`),"apple:"].join(",")}function xKe(e){return["set-generic-password-partition-list","-S",e.partitionList,"-s",yd,"-a",e.account,"-k",e.keychainPassword]}function bKe(){return["find-generic-password","-s",yd]}function vKe(){return["dump-keychain"]}function wKe(e){let n=[],t=new Set;for(let r of e.split(`
2138
2138
  `)){let o=r.trim();if(!o.startsWith('"acct"'))continue;let i=o.indexOf("=");if(i===-1)continue;let s=o.slice(i+1).trim(),a;s==="<NULL>"?a="":s.startsWith('"')&&s.endsWith('"')&&s.length>=2?a=s.slice(1,-1):a=s,t.has(a)||(t.add(a),n.push(a))}return n}function _oe(e){let n=e.trim();return n==="<NULL>"?"":n.startsWith('"')&&n.endsWith('"')&&n.length>=2?n.slice(1,-1):n}function SKe(e){let n=[],t=new Set,r,o,i=!1,s=()=>{if(r===yd){let a=o??"";t.has(a)||(t.add(a),n.push(a))}r=void 0,o=void 0,i=!1};for(let a of e.split(`
2139
2139
  `)){let d=a.trim();if(d.startsWith("keychain:")){s();continue}if(d.startsWith('"svce"')){let u=d.indexOf("=");u!==-1&&(r=_oe(d.slice(u+1)));continue}if(d.startsWith('"acct"')){let u=d.indexOf("=");u!==-1&&!i&&(o=_oe(d.slice(u+1)),i=!0)}}return s(),n}async function kKe(e){try{let{stdout:n}=await e(vKe());return SKe(n)}catch(n){if(xoe(n))return[];try{let{stdout:t}=await e(bKe());return wKe(t)}catch(t){if(xoe(t))return[];throw t}}}function xoe(e){if(typeof e!="object"||e===null)return!1;let n=e;if(n.code===44)return!0;let t=`${n.stderr??""}${n.message??""}`;return t.includes("could not be found")||t.includes("SecKeychainSearchCopyNext")||t.includes("errSecItemNotFound")}function CKe(e){if(typeof e=="object"&&e!==null){let n=e,t=typeof n.stderr=="string"?n.stderr.trim():"";if(t.length>0)return t;if(typeof n.message=="string")return n.message}return String(e)}async function boe(e){let n=e.platform??process.platform,t=e.write??(l=>{process.stdout.write(l)}),r=e.writeError??(l=>{process.stderr.write(l)}),o=e.exec??yKe,i=e.teamIds??[Yp,ef],s=_Ke(i);if(n!=="darwin")return t(`fix-codex-keychain only applies on macOS (darwin). Nothing to do on ${n}.