@lmctl-ai/lmctl 0.1.141 → 0.1.143

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.
Files changed (2) hide show
  1. package/dist/cli/index.js +190 -169
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,6 +1,6 @@
1
- var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{for(var r in t)fk(e,r,{get:t[r],enumerable:!0})};import{existsSync as Hs,readdirSync as SH,readFileSync as mk}from"node:fs";import{homedir as pk,platform as Uf}from"node:os";import{join as Mt}from"node:path";function br(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Mt(pk(),_k)}function Js(){return Mt(br(),Wf)}function Xr(){return Mt(br(),hk)}function jt(e){return Mt(Xr(),e)}function Tr(e){return Mt(jt(e),Wf)}function Xa(e){return Mt(jt(e),"projects")}function Xs(){return Mt(br(),gk)}function ze(e){return!(e.length===0||e.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e)||e==="."||e==="..")}function Gs(){let e=Xs();if(!Hs(e))return null;try{let t=mk(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function Dt(){let e=process.env.LMCTL_WORKSPACE;return e!==void 0&&e.length>0&&ze(e)?e:Gs()}function le(e){if(e!==void 0&&e.length>0)return e;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let t=Dt();if(t!==null)return Tr(t);let r=Js();return Hs(r)||!Hs(Xr())?r:Tr(Bf)}function Vs(e,t){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":e??"default"} db: ${t}`}function Ek(e,t=Uf()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function qf(e,t=process.stderr,r=Uf()){Ek(e,r)&&t.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
1
+ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{for(var r in t)fk(e,r,{get:t[r],enumerable:!0})};import{existsSync as Hs,readdirSync as vH,readFileSync as mk}from"node:fs";import{homedir as pk,platform as Uf}from"node:os";import{join as Mt}from"node:path";function br(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Mt(pk(),_k)}function Js(){return Mt(br(),Wf)}function Xr(){return Mt(br(),hk)}function jt(e){return Mt(Xr(),e)}function Tr(e){return Mt(jt(e),Wf)}function Xa(e){return Mt(jt(e),"projects")}function Xs(){return Mt(br(),gk)}function ze(e){return!(e.length===0||e.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e)||e==="."||e==="..")}function Gs(){let e=Xs();if(!Hs(e))return null;try{let t=mk(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function Dt(){let e=process.env.LMCTL_WORKSPACE;return e!==void 0&&e.length>0&&ze(e)?e:Gs()}function le(e){if(e!==void 0&&e.length>0)return e;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let t=Dt();if(t!==null)return Tr(t);let r=Js();return Hs(r)||!Hs(Xr())?r:Tr(Bf)}function Vs(e,t){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":e??"default"} db: ${t}`}function Ek(e,t=Uf()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function qf(e,t=process.stderr,r=Uf()){Ek(e,r)&&t.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
2
  `)}function Ga(){return Mt(br(),yk)}function Hf(){return Mt(br(),wk)}function Tk(){try{return Hs(Ga())}catch{return!1}}function Jf(e=process.stderr){Tk()&&e.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
- `)}var _k,Wf,hk,gk,Bf,yk,wk,Sr,Je=T(()=>{"use strict";_k=".lmctl",Wf="state.db",hk="workspaces",gk="active-workspace",Bf="default",yk="profiles",wk="active-profile";Sr={default:Bf}});function kk(e){for(let t of vk)if(e.startsWith(t))return!0;if(e.startsWith("172.")){let t=Number(e.split(".")[1]);if(Number.isFinite(t)&&t>=16&&t<=31)return!0}return!!e.startsWith("169.254.")}function Ik(e){let t=e.toLowerCase();return!!(t==="::1"||t==="::"||t.startsWith("fe80:")||t.startsWith("fe80::"))}function Ak(e){let t=e.split(".");if(t.length!==4)return!1;for(let r of t){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function Dn(e){let t=e;for(let{re:r,replacement:n}of Sk)t=t.replace(r,n);return t=t.replace(Nk,r=>!Ak(r)||kk(r)?r:Xf),t=t.replace(xk,r=>Ik(r)?r:Xf),t}function Pn(e){return e.split(`
3
+ `)}var _k,Wf,hk,gk,Bf,yk,wk,Sr,Xe=T(()=>{"use strict";_k=".lmctl",Wf="state.db",hk="workspaces",gk="active-workspace",Bf="default",yk="profiles",wk="active-profile";Sr={default:Bf}});function kk(e){for(let t of vk)if(e.startsWith(t))return!0;if(e.startsWith("172.")){let t=Number(e.split(".")[1]);if(Number.isFinite(t)&&t>=16&&t<=31)return!0}return!!e.startsWith("169.254.")}function Ik(e){let t=e.toLowerCase();return!!(t==="::1"||t==="::"||t.startsWith("fe80:")||t.startsWith("fe80::"))}function Ak(e){let t=e.split(".");if(t.length!==4)return!1;for(let r of t){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function Dn(e){let t=e;for(let{re:r,replacement:n}of Sk)t=t.replace(r,n);return t=t.replace(Nk,r=>!Ak(r)||kk(r)?r:Xf),t=t.replace(xk,r=>Ik(r)?r:Xf),t}function Pn(e){return e.split(`
4
4
  `).map(t=>Dn(t)).join(`
5
5
  `)}function Vf(e,t){let r=e.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:e,value:st}:{key:e,value:Dn(t)}}function rr(e){if(typeof e=="string")return Dn(e);if(Array.isArray(e))return e.map(t=>rr(t));if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?t[r]=typeof n=="string"?st:rr(n):t[r]=rr(n)}return t}return e}function Kf(e,t){for(let{name:r,re:n}of Rk){let s=t.match(n);if(s!==null&&!s[0].includes(st))throw new vr(e,r)}}var st,bk,Xf,Gf,Sk,vk,Nk,xk,Rk,vr,Ks=T(()=>{"use strict";st="[REDACTED]",bk="[REDACTED_EMAIL]",Xf="[REDACTED_IP]",Gf="[USER]",Sk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${st}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${st}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${st}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:st},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:st},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:st},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:st},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${st}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Gf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Gf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:bk}],vk=["127.","10.","192.168.","0.0.0.0"];Nk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,xk=/\b(?:[0-9a-fA-F]{1,4}:){2,7}(?::[0-9a-fA-F]{1,4})+\b|\b(?:[0-9a-fA-F]{1,4}:){3,7}[0-9a-fA-F]{1,4}\b|::1\b|::\b(?=[\s,;"')]|$)/g;Rk=[{name:"sk-ant",re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/},{name:"sk-openai",re:/\bsk-[A-Za-z0-9_\-]{16,}/},{name:"github-pat",re:/\bgh[pousr]_[A-Za-z0-9]{30,}/},{name:"aws-akid",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"bearer",re:/\bBearer\s+[A-Za-z0-9_\-./+=]{8,}/},{name:"email",re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/},{name:"home-path",re:/\/home\/(?!\[USER\])[^/\s"'`]+/},{name:"users-path",re:/\/Users\/(?!\[USER\])[^/\s"'`]+/}],vr=class extends Error{bundlePath;patternName;constructor(t,r){super(`sanitization failed: ${r} pattern matched in ${t}`),this.bundlePath=t,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Va}from"node:child_process";import{readFileSync as Lk}from"node:fs";import{readFile as Ya,stat as Yf}from"node:fs/promises";import{homedir as Ok}from"node:os";import{join as $k}from"node:path";import{fileURLToPath as Ck}from"node:url";function yt(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse(Lk(Ck(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function zf(e){let t=new Set(e.include??Ys),r={};return t.has("serve")&&(r.serve=await jk(e)),t.has("db")&&(r.db=Dk(e)),t.has("runs")&&(r.runs=Pk(e)),t.has("jobs")&&(r.jobs=Fk(e)),t.has("attentions")&&(r.attentions=Uk(e)),t.has("env")&&(r.env=await Wk(e)),t.has("intents")&&(r.intents=await qk(e)),r}async function jk(e){let t=e.pidFile??process.env.LMCTL_PID_FILE,r=e.serveLog??process.env.LMCTL_SERVE_LOG,n=e.logTailLines??1e3,s=null,i="none";if(t!==void 0)try{let d=(await Ya(t,"utf8")).trim(),u=Number.parseInt(d,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await Ya(r,"utf8")).split(`
6
6
  `),f=u.slice(Math.max(0,u.length-n));c=f.length,a=Pn(f.join(`
@@ -12,9 +12,9 @@ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
12
12
  FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:rr(r)}}async function Wk(e){let t=yt(),r=process.version,n=Va("uname",["-a"],{encoding:"utf8"}),s=Pn((n.stdout??"").trim()),i=[],o=e.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await Yf(o);let d=Va("du",["-sh",o],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let a=e.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Yf(a);let d=Va("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":Pn(i.join(`
13
13
  `)),c=[];for(let d of Mk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(Vf(d,u))}return{lmctl_next_version:t,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Bk(){return process.env.LMCTL_INTENT_LOG??$k(Ok(),".lmctl","recent-intents.log")}async function qk(e){let t=e.intentLog??Bk(),r=e.intentLogTailLines??500;try{let s=(await Ya(t,"utf8")).split(`
14
14
  `).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-r));return{source_path:t,tail_lines:i.length,tail:Pn(i.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Ys,Mk,Ka,Fn=T(()=>{"use strict";Ks();Ys=["serve","db","runs","jobs","attentions","env","intents"];Mk=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];Ka=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as em,appendFileSync as Hk,mkdirSync as Jk,existsSync as DH,readdirSync as PH,unlinkSync as FH}from"node:fs";import{join as Zs,dirname as Xk}from"node:path";import{homedir as Gk}from"node:os";function za(){return Zs(Gk(),".lmctl")}function tm(){Gr=!0,process.env.LMCTL_DEBUG="1"}function rm(){return{cliDebug:Gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function nm(e){Gr=e.cliDebug,e.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=e.lmctlDebugEnv}function ce(){if(Gr||process.env.LMCTL_DEBUG==="1")return!0;let e=Date.now();return e-Qf>=Vk&&(Zf=zk(),Qf=e),Zf}function sm(){return Gr||process.env.LMCTL_DEBUG==="1"}function Kk(){let e=new Date,t=e.getTimezoneOffset(),r=t<=0?"+":"-",n=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),s=String(Math.abs(t)%60).padStart(2,"0");return new Date(e.getTime()-t*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Xe(e,t){if(t?.verbose){if(!Gr)return}else if(!t?.always&&!ce())return;try{Yk();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...e};Hk(zs,JSON.stringify(r)+`
16
- `)}catch{}}function Yk(){if(!zs){let t=Kk().slice(0,13).replace("T","-");zs=Zs(za(),`debug-${t}.log`)}Jk(Xk(zs),{recursive:!0})}function Le(...e){Xe({event:"legacy",msg:e.join(" ")})}function wt(...e){Xe({event:"legacy",msg:e.join(" ")},{verbose:!0})}function V(e){Xe(e,{always:!0})}function zk(){return Zk()||Qk()}function Zk(){try{let e=em(Zs(za(),"config.toml"),"utf-8");for(let t of e.split(`
17
- `)){let r=t.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Qk(){try{let e=em(Zs(za(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var Gr,Zf,Qf,Vk,zs,ve=T(()=>{"use strict";Gr=!1,Zf=!1,Qf=0,Vk=5e3;zs=null});import{existsSync as yI}from"node:fs";import{createRequire as wI}from"node:module";function EI(){return Qa===null&&(Qa=wI(import.meta.url)("node:sqlite").DatabaseSync),Qa}function el(e){return e.length===1&&TI(e[0])?[e[0]]:e}function TI(e){if(!nl(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function nl(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Qa,tl,cm,rl,dm=T(()=>{"use strict";Qa=null;tl=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!yI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(EI())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new rl(this.handle.prepare(t))}exec(t){this.handle.exec(t),this.updateTransactionDepth(t)}pragma(t,r){let n=`PRAGMA ${t}`;if(t.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(t){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=t(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=t(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(t){let r=t.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(t.trim())&&(this.transactionDepth=0)}}},cm=tl,rl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...el(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...el(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...el(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&nl(t)?Object.values(t):nl(t)?{...t}:t}}});import{existsSync as bI,mkdirSync as SI,readFileSync as fm}from"node:fs";import{homedir as vI}from"node:os";import{dirname as mm,join as kI,resolve as pm}from"node:path";import{fileURLToPath as II,pathToFileURL as NI}from"node:url";function sl(e){e.dbPath!==":memory:"&&SI(mm(e.dbPath),{recursive:!0});let t=new cm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=gm(t);return r===0&&(t.exec(fm(hm,"utf8")),t.pragma(`user_version = ${AI}`)),RI(t,r),t}function RI(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Ys,Mk,Ka,Fn=T(()=>{"use strict";Ks();Ys=["serve","db","runs","jobs","attentions","env","intents"];Mk=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];Ka=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as em,appendFileSync as Hk,mkdirSync as Jk,existsSync as PH,readdirSync as FH,unlinkSync as UH}from"node:fs";import{join as Zs,dirname as Xk}from"node:path";import{homedir as Gk}from"node:os";function za(){return Zs(Gk(),".lmctl")}function tm(){Gr=!0,process.env.LMCTL_DEBUG="1"}function rm(){return{cliDebug:Gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function nm(e){Gr=e.cliDebug,e.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=e.lmctlDebugEnv}function ce(){if(Gr||process.env.LMCTL_DEBUG==="1")return!0;let e=Date.now();return e-Qf>=Vk&&(Zf=zk(),Qf=e),Zf}function sm(){return Gr||process.env.LMCTL_DEBUG==="1"}function Kk(){let e=new Date,t=e.getTimezoneOffset(),r=t<=0?"+":"-",n=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),s=String(Math.abs(t)%60).padStart(2,"0");return new Date(e.getTime()-t*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function $e(e,t){if(t?.verbose){if(!Gr)return}else if(!t?.always&&!ce())return;try{Yk();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...e};Hk(zs,JSON.stringify(r)+`
16
+ `)}catch{}}function Yk(){if(!zs){let t=Kk().slice(0,13).replace("T","-");zs=Zs(za(),`debug-${t}.log`)}Jk(Xk(zs),{recursive:!0})}function Le(...e){$e({event:"legacy",msg:e.join(" ")})}function wt(...e){$e({event:"legacy",msg:e.join(" ")},{verbose:!0})}function V(e){$e(e,{always:!0})}function zk(){return Zk()||Qk()}function Zk(){try{let e=em(Zs(za(),"config.toml"),"utf-8");for(let t of e.split(`
17
+ `)){let r=t.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Qk(){try{let e=em(Zs(za(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var Gr,Zf,Qf,Vk,zs,Te=T(()=>{"use strict";Gr=!1,Zf=!1,Qf=0,Vk=5e3;zs=null});import{existsSync as yI}from"node:fs";import{createRequire as wI}from"node:module";function EI(){return Qa===null&&(Qa=wI(import.meta.url)("node:sqlite").DatabaseSync),Qa}function el(e){return e.length===1&&TI(e[0])?[e[0]]:e}function TI(e){if(!nl(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function nl(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Qa,tl,cm,rl,dm=T(()=>{"use strict";Qa=null;tl=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!yI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(EI())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new rl(this.handle.prepare(t))}exec(t){this.handle.exec(t),this.updateTransactionDepth(t)}pragma(t,r){let n=`PRAGMA ${t}`;if(t.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(t){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=t(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=t(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(t){let r=t.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(t.trim())&&(this.transactionDepth=0)}}},cm=tl,rl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...el(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...el(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...el(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&nl(t)?Object.values(t):nl(t)?{...t}:t}}});import{existsSync as bI,mkdirSync as SI,readFileSync as fm}from"node:fs";import{homedir as vI}from"node:os";import{dirname as mm,join as kI,resolve as pm}from"node:path";import{fileURLToPath as II,pathToFileURL as NI}from"node:url";function sl(e){e.dbPath!==":memory:"&&SI(mm(e.dbPath),{recursive:!0});let t=new cm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=gm(t);return r===0&&(t.exec(fm(hm,"utf8")),t.pragma(`user_version = ${AI}`)),RI(t,r),t}function RI(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
20
20
  team_name TEXT NOT NULL,
@@ -955,7 +955,7 @@ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
955
955
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
956
956
  `),deleteMailboxMessage:e.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Wn(e){if(Buffer.byteLength(e,"utf8")<=65536)return e;let r=Buffer.byteLength(vm,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(e,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${vm}`}var vm,Im=T(()=>{"use strict";vm=`
957
957
  ...[truncated]`});function Hn(e,t){return JSON.stringify([e,t])}function Nm(e){try{let t=JSON.parse(e);return typeof t.lock_id!="string"||typeof t.teamfile!="string"||typeof t.alias!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||!Array.isArray(t.holder_ips)||!t.holder_ips.every(r=>typeof r=="string")||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,teamfile:t.teamfile,alias:t.alias,holder_pid:t.holder_pid,holder_host:t.holder_host,holder_ips:t.holder_ips,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}var Bn,qn,xm=T(()=>{"use strict";Bn="terminal_lock",qn="member"});function Ft(e){if(!Number.isInteger(e)||(e??0)<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}var Qs=T(()=>{"use strict"});function Vr(e){return typeof e=="string"&&OI.has(e)}function Lm(e){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${e.length>0?e.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${ei[0]}`,` STANCE: ${ei[1]}`,` STANCE: ${ei[2]}`,` STANCE: ${Am}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
958
- `)}var Am,ei,OI,Jn,Rm,il,ti,Xn=T(()=>{"use strict";Am="other",ei=["not_enough_information","dont_know","other_work"],OI=new Set([Am,...ei]),Jn="@abort",Rm="invalid_decision",il="escalation_aborted",ti="workflow_escalation"});import{randomUUID as Om}from"node:crypto";import{hostname as Gn}from"node:os";function Fe(e){return e.provider_resolved??e.provider}function O(){return new Date().toISOString()}function Ie(e){return new ol(sl({dbPath:e.path}))}function $m(e,t,r){let n=Cm(t);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===e)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Cm(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(e)}function Cm(e){let t=$I(e),r=t===null?null:CI(t,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ri(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function $I(e){try{let t=JSON.parse(e);return ri(t)?t:null}catch{return null}}function CI(e,t){let r=e[t];return ri(r)?r:null}function ri(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function MI(e){try{let t=JSON.parse(e);return!ri(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function jI(e,t){return e===null?!0:e.holder_host===Gn()?!Ft(e.holder_pid):e.last_heartbeat<t}function DI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Gn()&&PI(e.delivery_holder_pid)?!Ft(e.delivery_holder_pid):e.delivering_at<t}function PI(e){return Number.isInteger(e)&&(e??0)>0}function FI(e){return{...km(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
958
+ `)}var Am,ei,OI,Jn,Rm,il,ti,Xn=T(()=>{"use strict";Am="other",ei=["not_enough_information","dont_know","other_work"],OI=new Set([Am,...ei]),Jn="@abort",Rm="invalid_decision",il="escalation_aborted",ti="workflow_escalation"});import{randomUUID as Om}from"node:crypto";import{hostname as Gn}from"node:os";function Ue(e){return e.provider_resolved??e.provider}function O(){return new Date().toISOString()}function Ie(e){return new ol(sl({dbPath:e.path}))}function $m(e,t,r){let n=Cm(t);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===e)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Cm(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(e)}function Cm(e){let t=$I(e),r=t===null?null:CI(t,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ri(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function $I(e){try{let t=JSON.parse(e);return ri(t)?t:null}catch{return null}}function CI(e,t){let r=e[t];return ri(r)?r:null}function ri(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function MI(e){try{let t=JSON.parse(e);return!ri(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function jI(e,t){return e===null?!0:e.holder_host===Gn()?!Ft(e.holder_pid):e.last_heartbeat<t}function DI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Gn()&&PI(e.delivery_holder_pid)?!Ft(e.delivery_holder_pid):e.delivering_at<t}function PI(e){return Number.isInteger(e)&&(e??0)>0}function FI(e){return{...km(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
959
959
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
960
960
  VALUES (?, ?, ?, ?, ?)
961
961
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1355,9 +1355,9 @@ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
1355
1355
  error_detail = ?,
1356
1356
  truncated = ?
1357
1357
  WHERE id = ?
1358
- `),...bm(e),...wm(e)}}function UI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var ol,Ze=T(()=>{"use strict";ym();Em();Sm();Im();xm();Qs();Xn();ol=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=FI(t),this.claimTxn=t.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=t.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=t.transaction((r,n,s)=>UI("state_not_found")),this.resumeInteractiveTxn=t.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ti)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Jn&&!a.includes(n))return{resumed:!1,reason:Rm};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,i=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(t,...r){let n=t.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(t).all(...r)}insertWorkflow(t){$m(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,O()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,t.definition,t.author??null,O());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,t.definition),i}upsertWorkflow(t){$m(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(t.name);if(r===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,t.definition,t.author??null,O());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??r.definition_schema_version,s,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,t.definition),this.getWorkflow(r.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,O())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,r){return(r===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,r))??null}findWorkflowByName(t,r){return this.getWorkflowByName(t,r)}insertWorkflowVersion(t,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,r,n??null,O());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,t),this.syncWorkflowTriggers(t,n.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,O()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,r){return this.stmts.setTriggerCursor.run(r,O(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,r){return this.stmts.setTriggerFailure.run(O(),r,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let r=this.stmts.insertTeam.run(t.name,O());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let r=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,O());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,r){return this.stmts.findTeamMemberByAlias.get(t,r)??null}updateTeamMemberSession(t,r){return this.stmts.updateTeamMemberSession.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,r,n){return this.stmts.setMemberState.run(r,n??null,O(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,r){return this.stmts.setMemberPromptSnapshot.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,r){return this.stmts.setMemberProviderResolved.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,r){return this.stmts.setMemberRolePrompt.run(r,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,r){let n=this.stmts.getTeamMember.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let r=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,O());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(t){let r=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",O());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,r){return this.stmts.setProjectIntakeConfig.run(r,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,r){let n=this.stmts.getProject.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let r=JSON.parse(t.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let r=t.condition??null,n=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,r,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,O());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let r=O(),n=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,r={}){return this.stmts.listIssuesForProject.all(t).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(t,r){return this.stmts.claimNextIssue.get(r,O(),t)??null}claimIssue(t,r){return this.stmts.claimIssue.get(r,O(),t)??null}closeIssue(t,r,n){let s=O(),i=this.stmts.closeIssue.get(r,n??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,r){let n=this.stmts.reopenIssue.get(r,O(),t);if(n===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return n}updateIssue(t,r){let n=this.getIssue(t);if(n===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,O(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,r){let n=this.stmts.getWebuiSession.get(t);if(n!==void 0)return n;let s=O();return this.stmts.insertWebuiSession.run(t,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,r){if(this.stmts.setWebuiSessionChatbot.run(r,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,r){let n=Om(),s=O();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=O(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,O())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??O(),t.dedupe_key??null,t.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,O()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=O(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,O(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(O(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??O(),n=t.holder_host??Gn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Pt(t.command),r,t.holder_pid??null,n,s,Pt(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Wn(t.payload),t.created_at??O(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=Gn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!DI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Bn,Hn(t,r),qn);return n===void 0?null:Nm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Bn,Hn(t.teamfile,t.alias),qn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Bn,Hn(t,r),qn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Bn,Hn(t,r),qn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:MI(s.data)}tryAcquireRuntimeProcessLock(t,r,n,s,i=O()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,r,n);if(o!==null&&!jI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Om(),holder_pid:process.pid,holder_host:Gn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,O(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,O())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??O(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,O()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(O(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=O();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,O())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,O())}}});import{realpathSync as WI}from"node:fs";import{resolve as BI}from"node:path";function al(e){let t=BI(e);try{return WI(t)}catch{return t}}var Mm=T(()=>{"use strict"});import{platform as jm}from"node:os";function Et(e){let t=new Vn;for(let r of e)t.registerAdapter(r);return t}var Vn,ll=T(()=>{"use strict";Mm();Vn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=al(t.workspace);i=i.filter(a=>al(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=jm()==="darwin"||jm()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:t,filePattern:s.filePattern});return r}async deleteSession(t,r){let n=await this.resolveSession(t,r);return n?n.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:r=>t.load(r),resolveSessionPath:r=>t.resolvePath(r),deleteSession:r=>t.delete(r),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Dm}from"node:fs";import{createInterface as Pm}from"node:readline";import{stat as qI}from"node:fs/promises";import{homedir as HI}from"node:os";async function*Ue(e){let t=Dm(e,{encoding:"utf-8"}),r=Pm({input:t,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{t.destroy()}}async function $e(e,t){let r=[],n=Dm(e,{encoding:"utf-8"}),s=Pm({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=t)break}}}finally{s.close(),n.destroy()}return r}async function Ne(e){let t=await qI(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function fe(e){return e.replace(/\\n/g,`
1359
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var Te,nr=T(()=>{"use strict";Te=HI()});import{readdir as ni,stat as Fm,unlink as JI}from"node:fs/promises";import{join as Kr,basename as Um}from"node:path";function XI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function GI(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return fe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function Wm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of Ue(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var si,Bm=T(()=>{"use strict";nr();si=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Kr(Te,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ni(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Fm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ni(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Um(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Kr(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,r){let n=await $e(t,50),s=await Ne(t),i="",o,a,l,c,d,u;for(let m of n)if(!XI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=H(p.trim(),80)),d=H(p.trim(),80)}}if(!i)return null;let f=await Wm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of Ue(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:GI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=H(h.trim(),80)),u=H(h.trim(),80),s.push({role:"user",timestamp:g,content:fe(h.trim())})}else if(Array.isArray(h)){for(let S of h)if(S.type==="tool_result"){let y=typeof S.content=="string"?fe(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:S.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let S of h)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:_.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:_.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Wm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await JI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ni(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Fm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ni(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Um(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Kr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await $e(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function ii(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function KI(e,t,r){if(!r)return"";let n=e.tools[t]??cl[t],s=n?.profiles?.[r]?.flags??cl[t]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${t}"`)}function qm(e,t){return!!e.tools[t]}function Hm(e,t,r,n,s){let i=e.tools[t]??cl[t],o;if(i?.agent){let l=ii(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=VI[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ii).join(" ");o=`printf '%s\\n' ${ii(n)} | ${d}`}else o=c.map(ii).join(" ")}let a=KI(e,t,s);return a&&(o+=" "+a),o}var cl,VI,Jm=T(()=>{"use strict";cl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},VI={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]}}});function Xm(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let r=Number(t);return!Number.isFinite(r)||r<=0?6e5:r}var Gm=T(()=>{"use strict"});var YI,he,oi,Tt=T(()=>{"use strict";YI="ACK: waiting for explicit lmctl task.",he=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${YI}`,oi=`send this exact lmctl seed instruction: "${he}"`});function Ut(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function ZI(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Kn]:t}}function We(e,t,r,n="chat"){return{...ZI(Ut(e,t),r),[zI]:n}}var Kn,zI,it=T(()=>{"use strict";Kn="LMCTL_SELF_SESSIONID",zI="LMCTL_LAUNCH_SOURCE"});import{spawn as Vm}from"node:child_process";import{mkdirSync as QI}from"node:fs";var dl,xe,Wt=T(()=>{"use strict";Jm();Gm();Tt();it();dl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===he?r:n)}seed(t,r){return QI(t,{recursive:!0}),new Promise(n=>{let s;try{s=Vm(this.binary,this.seedArgsFor(r),{cwd:t,env:Ut(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
- `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:oi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&qm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new dl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Hm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Xm(r.env),c=Vm(s,{shell:!0,cwd:r.cwd,env:We(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function li(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new qt(e,r,t)}var Qe,be,Bt,ai,qt,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},be=class extends Qe{},Bt=class extends Qe{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},ai=class extends Qe{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},qt=class extends Qe{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as fl from"node:child_process";function t0(e){if(typeof fl.spawnSync=="function")try{fl.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Km(e){return e.exitCode!==null||e.signalCode!==null}function ul(e,t){return Km(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function ot(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??t0;if(Km(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await ul(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await ul(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await ul(e,e0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var e0,ci=T(()=>{"use strict";e0=1e3});function Ym(e){ce()&&Xe({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function sr(e,t){let r=n0[e];if(r)return r[t]??r.yolo}function i0(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function at(e,t,r="yolo"){if(s0.has(e)){Ym(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?sr(e,"plan"):r0[e];if(!n){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw V({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new be(s)}if(!i0(t,n)){let s=n.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw V({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new be(i)}Ym(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var r0,n0,s0,zr=T(()=>{"use strict";Yr();ve();r0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},n0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};s0=new Set(["codex","opencode"])});function zm(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let r=0;r<e.length;r++)r===0?t.push(e[r]):t.push(`
1358
+ `),...bm(e),...wm(e)}}function UI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var ol,Ze=T(()=>{"use strict";ym();Em();Sm();Im();xm();Qs();Xn();ol=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=FI(t),this.claimTxn=t.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=t.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=t.transaction((r,n,s)=>UI("state_not_found")),this.resumeInteractiveTxn=t.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ti)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Jn&&!a.includes(n))return{resumed:!1,reason:Rm};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,i=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(t,...r){let n=t.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(t).all(...r)}insertWorkflow(t){$m(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,O()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,t.definition,t.author??null,O());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,t.definition),i}upsertWorkflow(t){$m(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(t.name);if(r===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,t.definition,t.author??null,O());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??r.definition_schema_version,s,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,t.definition),this.getWorkflow(r.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,O())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,r){return(r===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,r))??null}findWorkflowByName(t,r){return this.getWorkflowByName(t,r)}insertWorkflowVersion(t,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,r,n??null,O());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,t),this.syncWorkflowTriggers(t,n.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,O()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,r){return this.stmts.setTriggerCursor.run(r,O(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,r){return this.stmts.setTriggerFailure.run(O(),r,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let r=this.stmts.insertTeam.run(t.name,O());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let r=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,O());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,r){return this.stmts.findTeamMemberByAlias.get(t,r)??null}updateTeamMemberSession(t,r){return this.stmts.updateTeamMemberSession.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,r,n){return this.stmts.setMemberState.run(r,n??null,O(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,r){return this.stmts.setMemberPromptSnapshot.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,r){return this.stmts.setMemberProviderResolved.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,r){return this.stmts.setMemberRolePrompt.run(r,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,r){let n=this.stmts.getTeamMember.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let r=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,O());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(t){let r=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",O());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,r){return this.stmts.setProjectIntakeConfig.run(r,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,r){let n=this.stmts.getProject.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let r=JSON.parse(t.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let r=t.condition??null,n=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,r,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,O());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let r=O(),n=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,r={}){return this.stmts.listIssuesForProject.all(t).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(t,r){return this.stmts.claimNextIssue.get(r,O(),t)??null}claimIssue(t,r){return this.stmts.claimIssue.get(r,O(),t)??null}closeIssue(t,r,n){let s=O(),i=this.stmts.closeIssue.get(r,n??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,r){let n=this.stmts.reopenIssue.get(r,O(),t);if(n===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return n}updateIssue(t,r){let n=this.getIssue(t);if(n===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,O(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,r){let n=this.stmts.getWebuiSession.get(t);if(n!==void 0)return n;let s=O();return this.stmts.insertWebuiSession.run(t,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,r){if(this.stmts.setWebuiSessionChatbot.run(r,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,r){let n=Om(),s=O();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=O(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,O())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??O(),t.dedupe_key??null,t.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,O()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=O(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,O(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(O(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??O(),n=t.holder_host??Gn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Pt(t.command),r,t.holder_pid??null,n,s,Pt(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Wn(t.payload),t.created_at??O(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=Gn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!DI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Bn,Hn(t,r),qn);return n===void 0?null:Nm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Bn,Hn(t.teamfile,t.alias),qn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Bn,Hn(t,r),qn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Bn,Hn(t,r),qn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:MI(s.data)}tryAcquireRuntimeProcessLock(t,r,n,s,i=O()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,r,n);if(o!==null&&!jI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Om(),holder_pid:process.pid,holder_host:Gn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,O(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,O())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??O(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,O()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(O(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=O();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,O())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,O())}}});import{realpathSync as WI}from"node:fs";import{resolve as BI}from"node:path";function al(e){let t=BI(e);try{return WI(t)}catch{return t}}var Mm=T(()=>{"use strict"});import{platform as jm}from"node:os";function Et(e){let t=new Vn;for(let r of e)t.registerAdapter(r);return t}var Vn,ll=T(()=>{"use strict";Mm();Vn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=al(t.workspace);i=i.filter(a=>al(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=jm()==="darwin"||jm()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:t,filePattern:s.filePattern});return r}async deleteSession(t,r){let n=await this.resolveSession(t,r);return n?n.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:r=>t.load(r),resolveSessionPath:r=>t.resolvePath(r),deleteSession:r=>t.delete(r),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Dm}from"node:fs";import{createInterface as Pm}from"node:readline";import{stat as qI}from"node:fs/promises";import{homedir as HI}from"node:os";async function*We(e){let t=Dm(e,{encoding:"utf-8"}),r=Pm({input:t,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{t.destroy()}}async function Ce(e,t){let r=[],n=Dm(e,{encoding:"utf-8"}),s=Pm({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=t)break}}}finally{s.close(),n.destroy()}return r}async function Ne(e){let t=await qI(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function fe(e){return e.replace(/\\n/g,`
1359
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var be,nr=T(()=>{"use strict";be=HI()});import{readdir as ni,stat as Fm,unlink as JI}from"node:fs/promises";import{join as Kr,basename as Um}from"node:path";function XI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function GI(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return fe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function Wm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of We(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var si,Bm=T(()=>{"use strict";nr();si=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Kr(be,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ni(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Fm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ni(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Um(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Kr(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,r){let n=await Ce(t,50),s=await Ne(t),i="",o,a,l,c,d,u;for(let m of n)if(!XI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=H(p.trim(),80)),d=H(p.trim(),80)}}if(!i)return null;let f=await Wm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of We(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:GI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=H(h.trim(),80)),u=H(h.trim(),80),s.push({role:"user",timestamp:g,content:fe(h.trim())})}else if(Array.isArray(h)){for(let S of h)if(S.type==="tool_result"){let y=typeof S.content=="string"?fe(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:S.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let S of h)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:_.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:_.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Wm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await JI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ni(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Fm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ni(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Um(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Kr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Ce(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function ii(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function KI(e,t,r){if(!r)return"";let n=e.tools[t]??cl[t],s=n?.profiles?.[r]?.flags??cl[t]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${t}"`)}function qm(e,t){return!!e.tools[t]}function Hm(e,t,r,n,s){let i=e.tools[t]??cl[t],o;if(i?.agent){let l=ii(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=VI[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ii).join(" ");o=`printf '%s\\n' ${ii(n)} | ${d}`}else o=c.map(ii).join(" ")}let a=KI(e,t,s);return a&&(o+=" "+a),o}var cl,VI,Jm=T(()=>{"use strict";cl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},VI={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]}}});function Xm(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let r=Number(t);return!Number.isFinite(r)||r<=0?6e5:r}var Gm=T(()=>{"use strict"});var YI,he,oi,Tt=T(()=>{"use strict";YI="ACK: waiting for explicit lmctl task.",he=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${YI}`,oi=`send this exact lmctl seed instruction: "${he}"`});function Ut(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function ZI(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Kn]:t}}function Be(e,t,r,n="chat"){return{...ZI(Ut(e,t),r),[zI]:n}}var Kn,zI,it=T(()=>{"use strict";Kn="LMCTL_SELF_SESSIONID",zI="LMCTL_LAUNCH_SOURCE"});import{spawn as Vm}from"node:child_process";import{mkdirSync as QI}from"node:fs";var dl,xe,Wt=T(()=>{"use strict";Jm();Gm();Tt();it();dl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===he?r:n)}seed(t,r){return QI(t,{recursive:!0}),new Promise(n=>{let s;try{s=Vm(this.binary,this.seedArgsFor(r),{cwd:t,env:Ut(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
+ `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:oi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&qm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new dl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Hm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Xm(r.env),c=Vm(s,{shell:!0,cwd:r.cwd,env:Be(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function li(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new qt(e,r,t)}var Qe,Se,Bt,ai,qt,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},Se=class extends Qe{},Bt=class extends Qe{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},ai=class extends Qe{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},qt=class extends Qe{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as fl from"node:child_process";function t0(e){if(typeof fl.spawnSync=="function")try{fl.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Km(e){return e.exitCode!==null||e.signalCode!==null}function ul(e,t){return Km(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function ot(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??t0;if(Km(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await ul(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await ul(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await ul(e,e0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var e0,ci=T(()=>{"use strict";e0=1e3});function Ym(e){ce()&&$e({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function sr(e,t){let r=n0[e];if(r)return r[t]??r.yolo}function i0(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function at(e,t,r="yolo"){if(s0.has(e)){Ym(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?sr(e,"plan"):r0[e];if(!n){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw V({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new Se(s)}if(!i0(t,n)){let s=n.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw V({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new Se(i)}Ym(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var r0,n0,s0,zr=T(()=>{"use strict";Yr();Te();r0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},n0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};s0=new Set(["codex","opencode"])});function zm(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let r=0;r<e.length;r++)r===0?t.push(e[r]):t.push(`
1361
1361
 
1362
1362
  --- additional response (turn ${r+1} of ${e.length}; likely an injected mid-call notification) ---
1363
1363
 
@@ -1365,44 +1365,44 @@ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
1365
1365
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return t?`Original provider error:
1366
1366
  ${t}
1367
1367
 
1368
- ${r}`:r}function Qm(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||l0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=sr(s,a)??d0[s]??["--dangerously-skip-permissions"];o.push(...l);try{at(s,o,a)}catch(g){return n(g)}if(t.cwd&&!a0(t.cwd))return V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),n(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=o0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.sessionId)}),d=!1;if(t.signal){if(t.signal.aborted)return d=!0,V({event:"transport_abort",provider:s,phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,V({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=ml({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let h=u.sawResult();u.processLine(g),!h&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
1369
- `);f=h.pop()||"";for(let S of h)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new be(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let h=u.finalize();h?(wt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,exitCode:g})):(V({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(c0({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(_+`
1370
- `),wt(`stream-json: prompt sent (${e.length} chars)`)})}var l0,d0,ep=T(()=>{"use strict";Yr();ci();zr();ve();it();pl();pl();l0={claude:"claude",qwen:"qwen"};d0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function di(e={}){return[]}var _l=T(()=>{"use strict"});function hl(e){return e==="plan"?"read-only":"danger-full-access"}function tp(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function gl(){return{agentItems:new Map,resultText:""}}function ui(e,t,r,n){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function yl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function rp(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function wl(){return{pendingCodexError:null}}function El(e,t){let r=rp(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function Tl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var bl=T(()=>{"use strict"});import{spawn as u0}from"node:child_process";import{createInterface as f0}from"node:readline";import{existsSync as m0,readFileSync as p0}from"node:fs";import{fileURLToPath as _0}from"node:url";function g0(){return tp(h0)}function ir(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function y0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
1368
+ ${r}`:r}function Qm(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||l0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=sr(s,a)??d0[s]??["--dangerously-skip-permissions"];o.push(...l);try{at(s,o,a)}catch(g){return n(g)}if(t.cwd&&!a0(t.cwd))return V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),n(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=o0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.sessionId)}),d=!1;if(t.signal){if(t.signal.aborted)return d=!0,V({event:"transport_abort",provider:s,phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,V({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=ml({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let h=u.sawResult();u.processLine(g),!h&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
1369
+ `);f=h.pop()||"";for(let S of h)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new Se(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let h=u.finalize();h?(wt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,exitCode:g})):(V({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(c0({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(_+`
1370
+ `),wt(`stream-json: prompt sent (${e.length} chars)`)})}var l0,d0,ep=T(()=>{"use strict";Yr();ci();zr();Te();it();pl();pl();l0={claude:"claude",qwen:"qwen"};d0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function di(e={}){return[]}var _l=T(()=>{"use strict"});function hl(e){return e==="plan"?"read-only":"danger-full-access"}function tp(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function gl(){return{agentItems:new Map,resultText:""}}function ui(e,t,r,n){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function yl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function rp(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function wl(){return{pendingCodexError:null}}function El(e,t){let r=rp(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function Tl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var bl=T(()=>{"use strict"});import{spawn as u0}from"node:child_process";import{createInterface as f0}from"node:readline";import{existsSync as m0,readFileSync as p0}from"node:fs";import{fileURLToPath as _0}from"node:url";function g0(){return tp(h0)}function ir(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function y0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
1371
1371
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return t?`Original provider error:
1372
1372
  ${t}
1373
1373
 
1374
- ${r}`:r}function np(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?di():[];i.push(...a),ce()&&Le(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=hl(l);try{at("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!m0(t.cwd))return V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),n(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=u0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ot(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:"codex"}),ot(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=f0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",g="",h=!1,S=!1,y=Date.now(),w=gl(),I=wl();function x(W,M={}){return new Promise((A,Q)=>{let B=p++;m.set(B,{resolve:A,reject:Q});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:W,params:M});d.stdin?.write(k+`
1374
+ ${r}`:r}function np(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?di():[];i.push(...a),ce()&&Le(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=hl(l);try{at("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!m0(t.cwd))return V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),n(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=u0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ot(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:"codex"}),ot(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=f0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",g="",h=!1,S=!1,y=Date.now(),w=gl(),I=wl();function x(W,M={}){return new Promise((A,Q)=>{let B=p++;m.set(B,{resolve:A,reject:Q});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:W,params:M});d.stdin?.write(k+`
1375
1375
  `)})}function U(W,M={}){let A=JSON.stringify({jsonrpc:"2.0",method:W,params:M});d.stdin?.write(A+`
1376
- `)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(li(`codex app-server error: ${N}`,k))}else B.resolve(M);t.onEvent?.(M);return}let A=M.method;if(!A){t.onEvent?.(M);return}if(A==="thread/started"){let k=M.params?.thread;k?.id&&(_=k.id)}let Q=ce()?B=>{ir("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=M.params,k=B?.turn;k?.id&&(g=k.id),ui(M,w,t.onDelta,Q),ce()&&ir("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&ir(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=M.params;ce()&&ir("agentMessage/delta",{params:B??null})}ui(M,w,t.onDelta,Q)}if(A==="turn/completed"){let B=M.params;if(ce())for(let[N,L]of w.agentItems.entries())L.buffer&&ir("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});yl(w),ce()&&ir("turn/completed",{params:B??null});let k=Tl(M,I);k.shouldReject?(ce()&&ir("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,h=!0,d.stdin?.end(),n(k.turnError)):(h=!0,d.stdin?.end())}if(A==="error"){let B=El(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";ir(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}t.onEvent?.(M)});let ue="";d.stderr?.on("data",W=>{ue+=W.toString()}),d.on("error",W=>{V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new be(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),d.on("exit",W=>{if(!u&&!S){if(h){r({result:w.resultText,threadId:_,turnId:g,durationMs:Date.now()-y,exitCode:W});return}if(I.pendingCodexError){n(I.pendingCodexError);return}V({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:ue.slice(0,500)}),n(new Error(y0({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",g0()),U("initialized",{}),t.threadId)try{let W=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,Q)=>setTimeout(()=>Q(new Error("resume timeout")),5e3));await Promise.race([W,M]),_=t.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
- `);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){ot(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var h0,sp=T(()=>{"use strict";ve();ve();Yr();ci();zr();_l();ve();it();bl();bl();h0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(p0(_0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as ap,mkdirSync as w0,readFileSync as lp,writeFileSync as ip}from"node:fs";import{join as Yn,resolve as E0}from"node:path";function cp(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Sl(e,t,r={existsSync:ap,readFileSync:lp}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=E0(t,s.sessiondir??t);for(let o of T0(i)){let a=b0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(cp(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function T0(e){return[Yn(e,".opencode","opencode.jsonc"),Yn(e,"opencode.jsonc"),Yn(e,"opencode.json")]}function b0(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(S0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function S0(e){let t="",r=!1,n="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(r){t+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
1376
+ `)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(li(`codex app-server error: ${N}`,k))}else B.resolve(M);t.onEvent?.(M);return}let A=M.method;if(!A){t.onEvent?.(M);return}if(A==="thread/started"){let k=M.params?.thread;k?.id&&(_=k.id)}let Q=ce()?B=>{ir("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=M.params,k=B?.turn;k?.id&&(g=k.id),ui(M,w,t.onDelta,Q),ce()&&ir("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&ir(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=M.params;ce()&&ir("agentMessage/delta",{params:B??null})}ui(M,w,t.onDelta,Q)}if(A==="turn/completed"){let B=M.params;if(ce())for(let[N,L]of w.agentItems.entries())L.buffer&&ir("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});yl(w),ce()&&ir("turn/completed",{params:B??null});let k=Tl(M,I);k.shouldReject?(ce()&&ir("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,h=!0,d.stdin?.end(),n(k.turnError)):(h=!0,d.stdin?.end())}if(A==="error"){let B=El(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";ir(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}t.onEvent?.(M)});let ue="";d.stderr?.on("data",W=>{ue+=W.toString()}),d.on("error",W=>{V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new Se(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),d.on("exit",W=>{if(!u&&!S){if(h){r({result:w.resultText,threadId:_,turnId:g,durationMs:Date.now()-y,exitCode:W});return}if(I.pendingCodexError){n(I.pendingCodexError);return}V({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:ue.slice(0,500)}),n(new Error(y0({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",g0()),U("initialized",{}),t.threadId)try{let W=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,Q)=>setTimeout(()=>Q(new Error("resume timeout")),5e3));await Promise.race([W,M]),_=t.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
+ `);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){ot(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var h0,sp=T(()=>{"use strict";Te();Te();Yr();ci();zr();_l();Te();it();bl();bl();h0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(p0(_0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as ap,mkdirSync as w0,readFileSync as lp,writeFileSync as ip}from"node:fs";import{join as Yn,resolve as E0}from"node:path";function cp(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Sl(e,t,r={existsSync:ap,readFileSync:lp}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=E0(t,s.sessiondir??t);for(let o of T0(i)){let a=b0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(cp(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function T0(e){return[Yn(e,".opencode","opencode.jsonc"),Yn(e,"opencode.jsonc"),Yn(e,"opencode.json")]}function b0(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(S0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function S0(e){let t="",r=!1,n="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(r){t+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
1378
1378
  `;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function fi(e,t={}){let r=Yn(e,".opencode"),n=Yn(r,"opencode.json");if(!ap(n)){w0(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return ip(n,o+`
1379
1379
  `,"utf-8"),!0}let s;try{s=JSON.parse(lp(n,"utf-8"))}catch{return console.log(op.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(op.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),cp(s.permission)||V({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&ip(n,JSON.stringify(s,null,2)+`
1380
- `,"utf-8"),i}var op,mi=T(()=>{"use strict";ve();op={yellow:e=>e}});function fp(e){let t=[...e.matchAll(v0)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return dp(e.slice(n).trimStart())}return dp(A0(e.replace(k0,"")))}function A0(e){let t=I0.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(N0)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function dp(e){let t=[...e.matchAll(x0)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function zn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function mp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function vl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?fp(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=mp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,e.onDelta?.(u)),!0},finalize(){return s?o():null}}}var up,v0,k0,I0,N0,x0,kl=T(()=>{"use strict";up="(?:png|jpe?g|webp|heic|pdf)",v0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${up}\\s*`,"gi"),k0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${up}\\s*`,"i"),I0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,N0=/^STANCE:\s+\S+\s*$/gim,x0=/\[Thought:\s*true\]\s*/gi});import{spawn as R0}from"node:child_process";import{existsSync as L0}from"node:fs";import{createInterface as O0}from"node:readline";function $0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
1380
+ `,"utf-8"),i}var op,mi=T(()=>{"use strict";Te();op={yellow:e=>e}});function fp(e){let t=[...e.matchAll(v0)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return dp(e.slice(n).trimStart())}return dp(A0(e.replace(k0,"")))}function A0(e){let t=I0.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(N0)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function dp(e){let t=[...e.matchAll(x0)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function zn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function mp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function vl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?fp(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=mp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,e.onDelta?.(u)),!0},finalize(){return s?o():null}}}var up,v0,k0,I0,N0,x0,kl=T(()=>{"use strict";up="(?:png|jpe?g|webp|heic|pdf)",v0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${up}\\s*`,"gi"),k0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${up}\\s*`,"i"),I0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,N0=/^STANCE:\s+\S+\s*$/gim,x0=/\[Thought:\s*true\]\s*/gi});import{spawn as R0}from"node:child_process";import{existsSync as L0}from"node:fs";import{createInterface as O0}from"node:readline";function $0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
1381
1381
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return t?`Original provider error:
1382
1382
  ${t}
1383
1383
 
1384
1384
  ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{fi(t.cwd)}catch(y){V({event:"opencode_config_install_failed",cwd:t.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=t.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(t.tool==="gemini"){let y=sr("gemini","plan"),w=sr("gemini","yolo");a=a.filter(I=>!(w??[]).includes(I)),y&&a.push(...y)}else t.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1385
1385
  `);t.model&&t.tool==="gemini"&&a.push("--model",t.model);let l=t.tool==="copilot"?"yolo":o;try{at(t.tool,a,l)}catch(y){return s(y)}if(t.model&&t.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1386
- `),t.cwd&&!L0(t.cwd))return V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=R0(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),ot(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=O0({input:c.stdout}),m=new Map,p=t.sessionId||"",_=vl({tool:t.tool,onDelta:t.onDelta});_.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=M0++;m.set(U,{resolve:I,reject:x});let ue=JSON.stringify({jsonrpc:"2.0",id:U,method:y,params:w});Xe({event:"acp_send",direction:"SEND",provider:t.tool,method:y,id:U,params:w}),c.stdin?.write(ue+`
1387
- `)})}f.on("line",y=>{let w;try{w=JSON.parse(y)}catch{return}if(Xe({event:"acp_recv",direction:"RECV",provider:t.tool,id:typeof w.id=="number"?w.id:void 0,method:typeof w.method=="string"?w.method:void 0,preview:JSON.stringify(w).slice(0,300)}),t.onEvent?.(w),typeof w.id=="number"&&m.has(w.id)){let x=m.get(w.id);if(m.delete(w.id),w.error){let U=w.error,ue=typeof U?.message=="string"&&U.message.length>0?U.message:JSON.stringify(w.error);x.reject(li(`ACP RPC error: ${ue}`,U))}else x.resolve(w);return}let I=w.method;if(I){if(typeof w.id=="number"){V({event:"acp_unhandled_request",provider:t.tool,method:I,id:w.id,params:w.params});let x=JSON.stringify({jsonrpc:"2.0",id:w.id,error:{code:-32601,message:`Method not found: ${I} (lmctl does not implement server-side ACP methods)`}});Xe({event:"acp_send",direction:"SEND",provider:t.tool,replyTo:w.id,error:"method not found"}),c.stdin?.write(x+`
1388
- `);return}_.processMessage(w)}});let h="";c.stderr?.on("data",y=>{h+=y.toString()}),c.on("error",y=>{V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new be(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(u)return;let w=_.finalize();w!==null?n({result:w.result,sessionId:w.sessionId,durationMs:Date.now()-d,stopReason:w.stopReason,exitCode:y}):(V({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:h.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error($0({tool:t.tool,exitCode:y,stderr:h}))))});function S(y,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:y,params:w});c.stdin?.write(I+`
1386
+ `),t.cwd&&!L0(t.cwd))return V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=R0(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),ot(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=O0({input:c.stdout}),m=new Map,p=t.sessionId||"",_=vl({tool:t.tool,onDelta:t.onDelta});_.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=M0++;m.set(U,{resolve:I,reject:x});let ue=JSON.stringify({jsonrpc:"2.0",id:U,method:y,params:w});$e({event:"acp_send",direction:"SEND",provider:t.tool,method:y,id:U,params:w}),c.stdin?.write(ue+`
1387
+ `)})}f.on("line",y=>{let w;try{w=JSON.parse(y)}catch{return}if($e({event:"acp_recv",direction:"RECV",provider:t.tool,id:typeof w.id=="number"?w.id:void 0,method:typeof w.method=="string"?w.method:void 0,preview:JSON.stringify(w).slice(0,300)}),t.onEvent?.(w),typeof w.id=="number"&&m.has(w.id)){let x=m.get(w.id);if(m.delete(w.id),w.error){let U=w.error,ue=typeof U?.message=="string"&&U.message.length>0?U.message:JSON.stringify(w.error);x.reject(li(`ACP RPC error: ${ue}`,U))}else x.resolve(w);return}let I=w.method;if(I){if(typeof w.id=="number"){V({event:"acp_unhandled_request",provider:t.tool,method:I,id:w.id,params:w.params});let x=JSON.stringify({jsonrpc:"2.0",id:w.id,error:{code:-32601,message:`Method not found: ${I} (lmctl does not implement server-side ACP methods)`}});$e({event:"acp_send",direction:"SEND",provider:t.tool,replyTo:w.id,error:"method not found"}),c.stdin?.write(x+`
1388
+ `);return}_.processMessage(w)}});let h="";c.stderr?.on("data",y=>{h+=y.toString()}),c.on("error",y=>{V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new Se(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(u)return;let w=_.finalize();w!==null?n({result:w.result,sessionId:w.sessionId,durationMs:Date.now()-d,stopReason:w.stopReason,exitCode:y}):(V({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:h.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error($0({tool:t.tool,exitCode:y,stderr:h}))))});function S(y,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:y,params:w});c.stdin?.write(I+`
1389
1389
  `)}(async()=>{try{if(await g("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),t.sessionId)try{let I=await g("session/load",{sessionId:t.sessionId,cwd:t.cwd,mcpServers:[]});p=zn(I,t.sessionId),_.setSessionId(p)}catch(I){if(t.requireResume)throw new Error(`Cannot resume session ${t.sessionId} via ACP: ${I instanceof Error?I.message:String(I)}`);process.stderr.write(`[acp] session/load failed for ${t.sessionId}, creating new session
1390
1390
  `);let x=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=zn(x),_.setSessionId(p)}else{let I=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=zn(I),_.setSessionId(p)}if(t.model&&t.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"model",value:t.model}),wt(`acp: set_config_option(model=${t.model}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(model=${t.model}) failed: ${x}
1391
1391
  `)}if(t.effort&&t.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"effort",value:t.effort}),wt(`acp: set_config_option(effort=${t.effort}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(effort=${t.effort}) failed: ${x}
1392
- `)}_.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=_.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){ot(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var C0,M0,_p=T(()=>{"use strict";ve();Yr();ci();zr();mi();ve();it();kl();kl();C0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},M0=1});function pe(e,t=120){let r=e.replace(/\s+/g," ").trim();return r.length>t?r.slice(0,t-1)+"\u2026":r}function hp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=j0){let n=e.keys().next().value;n!==void 0&&e.delete(n)}e.set(r.id,Date.now()),t(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=e.get(r.id);if(n!==void 0){t({...r,elapsedMs:Date.now()-n}),e.delete(r.id);return}}t(r)}}function D0(){let e=new Map;return(t,r)=>{P0(t,hp(e,r))}}function P0(e,t){let r=e.type;if(r==="system"){let n=e.subtype;if(n==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(pe(a,60));let d=c.length>0?c.join(", "):n;t({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(pe(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:n||"system",raw:e});return}if(r==="assistant"||r==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:pe(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=pe(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:pe(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:pe(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1392
+ `)}_.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=_.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){ot(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var C0,M0,_p=T(()=>{"use strict";Te();Yr();ci();zr();mi();Te();it();kl();kl();C0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},M0=1});function pe(e,t=120){let r=e.replace(/\s+/g," ").trim();return r.length>t?r.slice(0,t-1)+"\u2026":r}function hp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=j0){let n=e.keys().next().value;n!==void 0&&e.delete(n)}e.set(r.id,Date.now()),t(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=e.get(r.id);if(n!==void 0){t({...r,elapsedMs:Date.now()-n}),e.delete(r.id);return}}t(r)}}function D0(){let e=new Map;return(t,r)=>{P0(t,hp(e,r))}}function P0(e,t){let r=e.type;if(r==="system"){let n=e.subtype;if(n==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(pe(a,60));let d=c.length>0?c.join(", "):n;t({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(pe(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:n||"system",raw:e});return}if(r==="assistant"||r==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:pe(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=pe(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:pe(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:pe(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1393
1393
  `).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(d=`${f.split(`
1394
- `).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(r==="result"){t({kind:"system",summary:"result",raw:e});return}}async function pi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?D0():void 0,s=await Qm(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:r,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function F0(){let e=new Map;return(t,r)=>{U0(t,hp(e,r))}}function U0(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:pe(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";t({kind:"thinking",summary:pe(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=pe(JSON.stringify(c))),t({kind:"tool_use",tool:o,summary:pe(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")t({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${pe(c,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:i})}}async function Zr(e,t){let r=t.acpTool||t.binary;t.model&&r==="copilot"&&Xe({event:"model_ignored",provider:r,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let n=t.onProgress?F0():void 0,s=await pp(e,{tool:r,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function W0(e,t){let r=e.method;if(!r)return;let n=e.params;if(r==="turn/started"){t({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${pe(o,120)}`}:{kind:"other",summary:`codex error: ${pe(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)t({kind:"tool_use",tool:"Bash",summary:pe(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:pe(c||"(edit)"),id:a})}else{let l=s.status||"done";t({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:pe(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;t(i==="commentary"?{kind:"thinking",summary:pe(s)}:{kind:"text",summary:pe(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&t({kind:"thinking",summary:pe(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1394
+ `).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(r==="result"){t({kind:"system",summary:"result",raw:e});return}}async function pi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?D0():void 0,s=await Qm(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:r,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function F0(){let e=new Map;return(t,r)=>{U0(t,hp(e,r))}}function U0(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:pe(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";t({kind:"thinking",summary:pe(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=pe(JSON.stringify(c))),t({kind:"tool_use",tool:o,summary:pe(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")t({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${pe(c,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:i})}}async function Zr(e,t){let r=t.acpTool||t.binary;t.model&&r==="copilot"&&$e({event:"model_ignored",provider:r,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let n=t.onProgress?F0():void 0,s=await pp(e,{tool:r,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function W0(e,t){let r=e.method;if(!r)return;let n=e.params;if(r==="turn/started"){t({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${pe(o,120)}`}:{kind:"other",summary:`codex error: ${pe(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)t({kind:"tool_use",tool:"Bash",summary:pe(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:pe(c||"(edit)"),id:a})}else{let l=s.status||"done";t({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:pe(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;t(i==="commentary"?{kind:"thinking",summary:pe(s)}:{kind:"text",summary:pe(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&t({kind:"thinking",summary:pe(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1395
1395
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let i=s.split(`
1396
- `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){t({kind:"other",summary:r.slice(5)});return}}async function gp(e,t){let r=await np(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?n=>W0(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var j0,Ir=T(()=>{"use strict";ep();sp();_p();ve();j0=256});function Nl(e){return new Il(e)}var Il,xl=T(()=>{"use strict";Bm();Wt();Ir();Tt();Il=class extends xe{constructor(t){super({provider:new si(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",he,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:pi})}}});import{readdir as B0,stat as yp,unlink as q0}from"node:fs/promises";import{join as Zn,basename as H0}from"node:path";function J0(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Qn(e,t,r){let n=J0(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function wp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function X0(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function _i(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return _i(r)}).filter(r=>r.length>0).join(`
1397
- `);try{return JSON.stringify(e)}catch{return String(e)}}async function Ep(e){let t=0,r=0,n=0,s=0,i=0,o,a;for await(let l of Ue(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=X0(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var hi,Tp=T(()=>{"use strict";nr();hi=class{name="codex";codexDirs;constructor(t={}){let r=[Zn(Te,".codex"),Zn(Te,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let n=[t.codexDir||r[0],t.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Zn(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let r of this.codexDirs){let n=Zn(r,"sessions");try{await yp(n),t.push(n)}catch{}}return t}async discoverSessions(){let t=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&t.push(o)}catch{}}return t}async findSessionFiles(t){let r=[],n;try{n=await B0(t)}catch{return r}for(let s of n){let i=Zn(t,s),o=await yp(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(t){let r=H0(t,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(t){let r=await $e(t,30),n=await Ne(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=H(_.text.trim(),80)),d=H(_.text.trim(),80))}}if(!i)return null;let m=await Ep(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:wp(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u=t,f,m=new Set;for await(let _ of Ue(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=wp(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let S of h.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let y=S.text.trim();c||(c=H(y,80)),d=H(y,80),Qn(s,m,{role:"user",timestamp:g,content:fe(y)})}continue}if(h.role==="assistant"&&h.content){for(let S of h.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"assistant",timestamp:g,content:fe(S.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let S of h.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"system",timestamp:g,content:fe(S.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?fe(_i(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(_i(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let S=h.summary.map(y=>_i(y.text)).join(`
1398
- `);S.trim()&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(h)})}}if(!i)return null;let p=await Ep(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await q0(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await $e(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Rl(e){return new Al(e)}var Al,Ll=T(()=>{"use strict";Tp();Wt();Ir();Tt();Al=class extends xe{constructor(t){super({provider:new hi(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${he}
1396
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){t({kind:"other",summary:r.slice(5)});return}}async function gp(e,t){let r=await np(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?n=>W0(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var j0,Ir=T(()=>{"use strict";ep();sp();_p();Te();j0=256});function Nl(e){return new Il(e)}var Il,xl=T(()=>{"use strict";Bm();Wt();Ir();Tt();Il=class extends xe{constructor(t){super({provider:new si(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",he,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:pi})}}});import{readdir as B0,stat as yp,unlink as q0}from"node:fs/promises";import{join as Zn,basename as H0}from"node:path";function J0(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Qn(e,t,r){let n=J0(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function wp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function X0(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function _i(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return _i(r)}).filter(r=>r.length>0).join(`
1397
+ `);try{return JSON.stringify(e)}catch{return String(e)}}async function Ep(e){let t=0,r=0,n=0,s=0,i=0,o,a;for await(let l of We(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=X0(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var hi,Tp=T(()=>{"use strict";nr();hi=class{name="codex";codexDirs;constructor(t={}){let r=[Zn(be,".codex"),Zn(be,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let n=[t.codexDir||r[0],t.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Zn(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let r of this.codexDirs){let n=Zn(r,"sessions");try{await yp(n),t.push(n)}catch{}}return t}async discoverSessions(){let t=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&t.push(o)}catch{}}return t}async findSessionFiles(t){let r=[],n;try{n=await B0(t)}catch{return r}for(let s of n){let i=Zn(t,s),o=await yp(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(t){let r=H0(t,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(t){let r=await Ce(t,30),n=await Ne(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=H(_.text.trim(),80)),d=H(_.text.trim(),80))}}if(!i)return null;let m=await Ep(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:wp(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u=t,f,m=new Set;for await(let _ of We(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=wp(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let S of h.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let y=S.text.trim();c||(c=H(y,80)),d=H(y,80),Qn(s,m,{role:"user",timestamp:g,content:fe(y)})}continue}if(h.role==="assistant"&&h.content){for(let S of h.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"assistant",timestamp:g,content:fe(S.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let S of h.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"system",timestamp:g,content:fe(S.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?fe(_i(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(_i(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let S=h.summary.map(y=>_i(y.text)).join(`
1398
+ `);S.trim()&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(h)})}}if(!i)return null;let p=await Ep(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await q0(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Ce(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Rl(e){return new Al(e)}var Al,Ll=T(()=>{"use strict";Tp();Wt();Ir();Tt();Al=class extends xe{constructor(t){super({provider:new hi(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${he}
1399
1399
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:gp})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r.slice(0,-1),"--model",t.model,r[r.length-1]]:r}}});function es(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(n=>n.trim().length>0);if(t.length>1)try{let n=JSON.parse(t[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(e)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function gi(e){let t=es(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=e.split(`
1400
1400
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?G0(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function G0(e,t){for(let[r,n]of Object.entries(t))if(n!==void 0){if(r==="tokens"&&bp(e.tokens)&&bp(n)){e.tokens={...e.tokens,...n};continue}e[r]=n}}function bp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Sp(e,t){if(t==="json")return JSON.stringify(e,null,2);let{messages:r,...n}=e,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
1401
1401
  `)+`
1402
- `}var Ol=T(()=>{"use strict"});import{createHash as V0}from"node:crypto";import{readdir as ts,readFile as vp,stat as yi,unlink as K0}from"node:fs/promises";import{join as Ge,basename as Y0,dirname as z0}from"node:path";import{cwd as Z0}from"node:process";function kp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Ip(e){return e==="user"}function $l(e){return e==="gemini"||e==="assistant"}function Nr(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Q0(e){return`${e.sessionId}\0${e.cwd}`}function eN(e,t){let r=e.filePaths??[e.filePath],n=t.filePaths??[t.filePath],s=[...new Set([...r,...n])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function wi(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Np(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!$l(a.type)||!a.tokens)continue;let l=wi(a.tokens.input),c=wi(a.tokens.cached),d=Math.max(l-c,0),u=wi(a.tokens.output),f=wi(a.tokens.thoughts);t+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function tN(e){return V0("sha256").update(e).digest("hex")}function rs(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=z0(r);if(n===r)break;r=n}}var Ei,xp=T(()=>{"use strict";nr();Ol();ve();Ei=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Ge(Te,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=t.claudeDir||Ge(Te,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(Te,".codex"),Ge(Te,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ge(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=Q0(s),o=r.get(i);r.set(i,o?eN(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let h=Nr(g.timestamp),S=g.type,y=fe(kp(g.content));if(Ip(S)){let I=y.trim();I&&(d||(d=H(I,80)),u=H(I,80)),i.push({role:"user",timestamp:h,content:I||y});continue}if($l(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
- `).trim();x&&i.push({role:"thinking",timestamp:Nr(I.timestamp,h),content:fe(x)})}i.push({role:"assistant",timestamp:h,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:h,content:`${w}${y}`.trim()})}let m=Nr(n.startTime,s.createdAt),p=Nr(n.lastUpdated,s.modifiedAt),_=Np(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ip(m.type)){u++;let p=kp(m.content).trim();p&&(l||(l=H(fe(p),80)),c=H(fe(p),80))}else $l(m.type)&&(u++,m.model&&(d=m.model));let f=Np(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Nr(r.startTime,n.createdAt),modifiedAt:Nr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let r=await vp(t,"utf-8");if(es(r)==="unknown")return V({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:r.slice(0,120),message:`gemini session file at ${t} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return gi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=Y0(t).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let t=[],r;try{r=await ts(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Ge(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await K0(r),!0):!1}async resolveSessionFile(t){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Nr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;rs(t,Z0());for(let n of this.extraWorkspacePaths)rs(t,n);for(let n of await this.collectGeminiProjectPaths())rs(t,n);for(let n of await this.collectCodexCwds())rs(t,n);for(let n of await this.collectClaudeCwds())rs(t,n);let r=new Map;for(let n of t)r.set(tN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await vp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await $e(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ts(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),d=(await $e(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await yi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ts(t)}catch{return r}for(let i of s){let o=Ge(t,i),a=await yi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as rN,writeFileSync as nN,mkdirSync as sN}from"node:fs";import{join as iN,dirname as oN}from"node:path";import{randomUUID as aN}from"node:crypto";function Ml(e){return new Cl(e)}var Cl,jl=T(()=>{"use strict";xp();Wt();Ir();Tt();Ol();Cl=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",he,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Zr(r,{...n,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1402
+ `}var Ol=T(()=>{"use strict"});import{createHash as V0}from"node:crypto";import{readdir as ts,readFile as vp,stat as yi,unlink as K0}from"node:fs/promises";import{join as Ge,basename as Y0,dirname as z0}from"node:path";import{cwd as Z0}from"node:process";function kp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Ip(e){return e==="user"}function $l(e){return e==="gemini"||e==="assistant"}function Nr(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Q0(e){return`${e.sessionId}\0${e.cwd}`}function eN(e,t){let r=e.filePaths??[e.filePath],n=t.filePaths??[t.filePath],s=[...new Set([...r,...n])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function wi(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Np(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!$l(a.type)||!a.tokens)continue;let l=wi(a.tokens.input),c=wi(a.tokens.cached),d=Math.max(l-c,0),u=wi(a.tokens.output),f=wi(a.tokens.thoughts);t+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function tN(e){return V0("sha256").update(e).digest("hex")}function rs(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=z0(r);if(n===r)break;r=n}}var Ei,xp=T(()=>{"use strict";nr();Ol();Te();Ei=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Ge(be,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=t.claudeDir||Ge(be,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(be,".codex"),Ge(be,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ge(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=Q0(s),o=r.get(i);r.set(i,o?eN(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let h=Nr(g.timestamp),S=g.type,y=fe(kp(g.content));if(Ip(S)){let I=y.trim();I&&(d||(d=H(I,80)),u=H(I,80)),i.push({role:"user",timestamp:h,content:I||y});continue}if($l(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
+ `).trim();x&&i.push({role:"thinking",timestamp:Nr(I.timestamp,h),content:fe(x)})}i.push({role:"assistant",timestamp:h,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:h,content:`${w}${y}`.trim()})}let m=Nr(n.startTime,s.createdAt),p=Nr(n.lastUpdated,s.modifiedAt),_=Np(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ip(m.type)){u++;let p=kp(m.content).trim();p&&(l||(l=H(fe(p),80)),c=H(fe(p),80))}else $l(m.type)&&(u++,m.model&&(d=m.model));let f=Np(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Nr(r.startTime,n.createdAt),modifiedAt:Nr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let r=await vp(t,"utf-8");if(es(r)==="unknown")return V({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:r.slice(0,120),message:`gemini session file at ${t} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return gi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=Y0(t).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let t=[],r;try{r=await ts(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Ge(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await K0(r),!0):!1}async resolveSessionFile(t){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Nr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;rs(t,Z0());for(let n of this.extraWorkspacePaths)rs(t,n);for(let n of await this.collectGeminiProjectPaths())rs(t,n);for(let n of await this.collectCodexCwds())rs(t,n);for(let n of await this.collectClaudeCwds())rs(t,n);let r=new Map;for(let n of t)r.set(tN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await vp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Ce(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ts(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),d=(await Ce(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await yi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ts(t)}catch{return r}for(let i of s){let o=Ge(t,i),a=await yi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as rN,writeFileSync as nN,mkdirSync as sN}from"node:fs";import{join as iN,dirname as oN}from"node:path";import{randomUUID as aN}from"node:crypto";function Ml(e){return new Cl(e)}var Cl,jl=T(()=>{"use strict";xp();Wt();Ir();Tt();Ol();Cl=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",he,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Zr(r,{...n,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1404
1404
  `)}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:oi,lsCommand:`lmctl ls --provider gemini --sessiondir ${t}`}}async fork(t,r){let n=await this.resolvePath(t);if(!n)return{success:!1,error:`Session file not found for ${t}`};try{let s=rN(n,"utf-8"),i=es(s),o=gi(s),a=aN();o.sessionId=a,o.kind="main";let l=oN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=iN(l,u);return sN(l,{recursive:!0}),nN(f,Sp(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Ap,readFile as lN,rm as cN,stat as Qr}from"node:fs/promises";import{basename as dN,join as lt}from"node:path";function uN(e){let t={};for(let r of e.split(`
1405
- `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function xr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function fN(e){let t=0;for await(let r of Ue(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var Ti,Rp=T(()=>{"use strict";nr();Ti=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||lt(Te,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Ap(this.sessionStateDir)}catch{return t}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Qr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,_,g=n?.id||dN(r)||t;if(i)for await(let h of Ue(s)){let S=xr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(u=h.data.copilotVersion),h.data.startTime&&(_=xr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){d=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let y=h.data.content||"",w=y.trim();w&&(m||(m=H(w,80)),p=H(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(h.type==="assistant.message"&&h.data){let y=(h.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),h.data.toolRequests)for(let w of h.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:w.name||"unknown tool",toolName:w.name,toolInput:w.arguments?JSON.stringify(w.arguments,null,2):void 0,toolCallId:w.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let y=h.data.result?.content||"",w=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:S,content:fe(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let y=h.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=H(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=lt(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await $e(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=xr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context?.cwd&&(d=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(u||(u=h.data.newModel)),h.type==="user.message"&&h.data){let S=(h.data.content||"").trim();S&&(p||(p=H(S,80)),_=H(S,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=H(h,80))}let g=i?await fN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=lt(t,"workspace.yaml");try{let n=await lN(r,"utf-8");return uN(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await cN(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Ap(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=lt(this.sessionStateDir,t);if((await Qr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=lt(this.sessionStateDir,s);(await Qr(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=lt(this.sessionStateDir,s);if(!(await Qr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Dl(e){return new xe({provider:new Ti(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",he,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(t,r)=>Zr(t,{...r,acpTool:"copilot"})})}var Pl=T(()=>{"use strict";Rp();Wt();Ir();Tt()});import{existsSync as Lp,readdirSync as mN,statSync as Op}from"node:fs";import{join as or}from"node:path";import{createRequire as pN}from"node:module";function $p(){return Fl===null&&(Fl=pN(import.meta.url)("node:sqlite").DatabaseSync),Fl}function _N(){let e=process.env.XDG_DATA_HOME||or(Te,".local","share"),t=process.env.XDG_CONFIG_HOME||or(Te,".config");return[or(e,"opencode","opencode.db"),or(t,"opencode","opencode.db")]}function hN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||or(Te,".local","share"),t=or(e,"lmplayer"),r=or(t,"opencode-local.db"),n=[r];try{let s=mN(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>or(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Op(o).mtimeMs-Op(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function gN(e){return e==="lmplayer"?hN():_N()}var Fl,en,Ul=T(()=>{"use strict";nr();Fl=null;en=class{name;startCommand;dbPaths;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=gN(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Lp(t))}openDb(t){return Lp(t)?new($p())(t,{open:!0,readOnly:!0}):null}async discoverSessions(){let t=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1405
+ `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function xr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function fN(e){let t=0;for await(let r of We(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var Ti,Rp=T(()=>{"use strict";nr();Ti=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||lt(be,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Ap(this.sessionStateDir)}catch{return t}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Qr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,_,g=n?.id||dN(r)||t;if(i)for await(let h of We(s)){let S=xr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(u=h.data.copilotVersion),h.data.startTime&&(_=xr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){d=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let y=h.data.content||"",w=y.trim();w&&(m||(m=H(w,80)),p=H(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(h.type==="assistant.message"&&h.data){let y=(h.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),h.data.toolRequests)for(let w of h.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:w.name||"unknown tool",toolName:w.name,toolInput:w.arguments?JSON.stringify(w.arguments,null,2):void 0,toolCallId:w.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let y=h.data.result?.content||"",w=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:S,content:fe(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let y=h.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=H(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=lt(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await Ce(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=xr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context?.cwd&&(d=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(u||(u=h.data.newModel)),h.type==="user.message"&&h.data){let S=(h.data.content||"").trim();S&&(p||(p=H(S,80)),_=H(S,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=H(h,80))}let g=i?await fN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=lt(t,"workspace.yaml");try{let n=await lN(r,"utf-8");return uN(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await cN(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Ap(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=lt(this.sessionStateDir,t);if((await Qr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=lt(this.sessionStateDir,s);(await Qr(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=lt(this.sessionStateDir,s);if(!(await Qr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Dl(e){return new xe({provider:new Ti(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",he,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(t,r)=>Zr(t,{...r,acpTool:"copilot"})})}var Pl=T(()=>{"use strict";Rp();Wt();Ir();Tt()});import{existsSync as Lp,readdirSync as mN,statSync as Op}from"node:fs";import{join as or}from"node:path";import{createRequire as pN}from"node:module";function $p(){return Fl===null&&(Fl=pN(import.meta.url)("node:sqlite").DatabaseSync),Fl}function _N(){let e=process.env.XDG_DATA_HOME||or(be,".local","share"),t=process.env.XDG_CONFIG_HOME||or(be,".config");return[or(e,"opencode","opencode.db"),or(t,"opencode","opencode.db")]}function hN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||or(be,".local","share"),t=or(e,"lmplayer"),r=or(t,"opencode-local.db"),n=[r];try{let s=mN(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>or(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Op(o).mtimeMs-Op(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function gN(e){return e==="lmplayer"?hN():_N()}var Fl,en,Ul=T(()=>{"use strict";nr();Fl=null;en=class{name;startCommand;dbPaths;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=gN(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Lp(t))}openDb(t){return Lp(t)?new($p())(t,{open:!0,readOnly:!0}):null}async discoverSessions(){let t=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1406
1406
  s.time_created, s.time_updated
1407
1407
  FROM session s
1408
1408
  ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
@@ -1415,12 +1415,12 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1415
1415
  FROM session s
1416
1416
  WHERE s.id LIKE ?
1417
1417
  ORDER BY s.time_updated DESC
1418
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Bl(){return new Wl}var Wl,ql=T(()=>{"use strict";Ul();Wt();Ir();Tt();Wl=class extends xe{constructor(){super({provider:new en,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",he],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,r)=>Zr(t,{...r,acpTool:"opencode"})})}seedArgsFor(t){let r=["run"];return t?.model&&r.push("--model",t.model),t?.effort&&r.push("--variant",t.effort),r.push(t?.prompt??he),r}}});import{spawn as yN}from"node:child_process";import{mkdirSync as wN}from"node:fs";function Jl(e){return new Hl(e)}async function EN(e,t){let r=Date.now(),n=Cp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});at("lmplayer",n,t.permissionMode??"yolo");let s=await Mp(t.binary,n,{cwd:t.cwd,env:We(t.env,t.cwd,t.sessionId),signal:t.signal,onText:i=>{t.onProgress?.({kind:"text",summary:i.slice(0,120)}),t.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-r}}function Cp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...sr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Mp(e,t,r){return new Promise((n,s)=>{let i;try{i=yN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let S;try{S=JSON.parse(h)}catch{u.push(g),r.onText?.(g);return}if(!Si(S))return;let y=bi(S,!1);c===void 0&&y!==void 0&&(c=y),d=bi(S,!0)??d;let w=jp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let h=g.toString("utf8");o+=h,l+=h;let S=l.indexOf(`
1418
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Bl(){return new Wl}var Wl,ql=T(()=>{"use strict";Ul();Wt();Ir();Tt();Wl=class extends xe{constructor(){super({provider:new en,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",he],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,r)=>Zr(t,{...r,acpTool:"opencode"})})}seedArgsFor(t){let r=["run"];return t?.model&&r.push("--model",t.model),t?.effort&&r.push("--variant",t.effort),r.push(t?.prompt??he),r}}});import{spawn as yN}from"node:child_process";import{mkdirSync as wN}from"node:fs";function Jl(e){return new Hl(e)}async function EN(e,t){let r=Date.now(),n=Cp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});at("lmplayer",n,t.permissionMode??"yolo");let s=await Mp(t.binary,n,{cwd:t.cwd,env:Be(t.env,t.cwd,t.sessionId),signal:t.signal,onText:i=>{t.onProgress?.({kind:"text",summary:i.slice(0,120)}),t.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-r}}function Cp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...sr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Mp(e,t,r){return new Promise((n,s)=>{let i;try{i=yN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let S;try{S=JSON.parse(h)}catch{u.push(g),r.onText?.(g);return}if(!Si(S))return;let y=bi(S,!1);c===void 0&&y!==void 0&&(c=y),d=bi(S,!0)??d;let w=jp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let h=g.toString("utf8");o+=h,l+=h;let S=l.indexOf(`
1419
1419
  `);for(;S>=0;){let y=l.slice(0,S);l=l.slice(S+1),_(y),S=l.indexOf(`
1420
1420
  `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function jp(e){for(let t of["text","content","delta","output","message"]){let r=e[t];if(typeof r=="string")return r}for(let t of["data","event","payload","part"]){let r=e[t];if(Si(r)){let n=jp(r);if(n)return n}}}function bi(e,t){for(let n of["sessionID","sessionId","session_id"]){let s=e[n];if(typeof s=="string"&&s.length>0)return s}let r=e.session;if(typeof r=="string"&&r.length>0)return r;if(Si(r)){let n=bi(r,t);if(n!==void 0)return n}if(t){let n=e.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=e[n];if(Si(s)){let i=bi(s,t);if(i!==void 0)return i}}}function Si(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Hl,Xl=T(()=>{"use strict";Ul();Wt();Tt();zr();it();Hl=class extends xe{constructor(t){super({provider:new en({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",he],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:EN})}seedArgsFor(t){return Cp({prompt:t?.prompt??he,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){wN(t,{recursive:!0});let n=this.seedArgsFor(r);at("lmplayer",n);try{let s=await Mp(this.binary,n,{cwd:t,env:Ut(void 0,t),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${he}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as vi,readFile as TN,rm as bN}from"node:fs/promises";import{basename as Dp,join as ar}from"node:path";function Pp(e){return e.type==="user"||e.message?.role==="user"}function Fp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function Up(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1421
1421
  `):Array.isArray(t.parts)?t.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1422
- `):"":""}function Wp(e){return e.model||e.message?.model}var ki,Bp=T(()=>{"use strict";nr();ki=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||ar(Te,".qwen")}async discoverSessions(){let t=ar(this.baseDir,"projects"),r;try{r=await vi(t)}catch{return[]}let n=[];for(let s of r){let i=ar(t,s,"chats"),o;try{o=await vi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ar(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await $e(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Pp(u)){let f=Up(u).trim();f&&(l||(l=H(f,80)),c=H(f,80)),d++}if(Fp(u)){let f=Wp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Dp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(t,r){let n=await Ne(t),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of Ue(t)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Pp(f)){let _=Up(f);_.trim()&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Fp(f)){let _=Wp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=ar(this.baseDir,"projects");try{let n=await vi(r),s=[];for(let i of n){let o=ar(r,i,"chats",`${t}.jsonl`);try{return await TN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ar(r,i,"chats"),a;try{a=await vi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Dp(l,".jsonl").startsWith(t)&&s.push(ar(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await bN(r),!0}catch{return!1}}}});function Vl(){return new Gl}var Gl,Kl=T(()=>{"use strict";Bp();Wt();Ir();Tt();Gl=class extends xe{constructor(){super({provider:new ki,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",he,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:pi})}}});import{readdir as qp,readFile as SN,rm as Hp,stat as Jp}from"node:fs/promises";import{basename as Yl,join as Ht}from"node:path";async function vN(e){let t=await Promise.all(e.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...t.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(r=>r.modifiedAt.getTime())))}}function kN(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Xp(e){return e.type==="USER_INPUT"}function Gp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function IN(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Vp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Kp(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function NN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function xN(e){for await(let t of Ue(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=AN(s);if(i)return i}let n=RN(t.content);if(n)return n}return null}function AN(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=t.Cwd??t.cwd??t.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function RN(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Yp(e){if(e.endsWith(".db"))return Yl(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var Ii,zp=T(()=>{"use strict";nr();Ii=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Ht(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ht(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Ht(this.baseDir,"conversations"),r;try{r=await qp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Yl(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return Ht(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return Ht(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Jp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await vN([r,n].filter(Boolean)),o=await this.resolveCwd(t,n),a,l,c,d=0;if(n){let u=await $e(n,80);for(let f of u){let m=Kp(f.content);if(m&&(a=m),Xp(f)){let p=Vp(f.content).trim();p&&(l||(l=H(p,80)),c=H(p,80)),d++}else Gp(f)&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Yp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of Ue(i)){let u=kN(d.created_at,s.modifiedAt),f=Kp(d.content);if(f&&(a=f),Xp(d)){let m=Vp(d.content),p=m.trim();p&&(l||(l=H(p,80)),c=H(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:NN(m.args),toolName:m.name||"tool"});Gp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):IN(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(t){let r=this.conversationPath(t);try{return await Jp(r),r}catch{}let n=Ht(this.baseDir,"conversations");try{let s=[];for(let i of await qp(n)){if(!i.endsWith(".db"))continue;Yl(i,".db").startsWith(t)&&s.push(Ht(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;let n=Yp(r);return n?(await Hp(this.conversationPath(n),{force:!0}),await Hp(Ht(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,r){let n=await this.cwdFromLastConversationCache(t);if(n)return n;if(r){let s=await xN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=Ht(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await SN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as LN}from"node:child_process";function Zl(e){return new zl(e)}async function ON(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",CN(t.timeoutMs)];t.model&&n.push("--model",t.model),at("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await $N(t.binary,n,{cwd:t.cwd,env:We(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-r}}function $N(e,t,r){return new Promise((n,s)=>{let i;try{i=LN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function CN(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var zl,Ql=T(()=>{"use strict";zp();Wt();Tt();it();zr();zl=class extends xe{constructor(t){super({provider:new Ii(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",he,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:ON})}seedArgsFor(t){let r=[...super.seedArgsFor(t)];return t?.model&&r.push("--model",t.model),r}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as MN}from"node:crypto";import{existsSync as jN,mkdirSync as DN,readFileSync as PN,renameSync as FN,writeFileSync as UN}from"node:fs";import{dirname as r_,join as Zp,resolve as ec}from"node:path";function WN(e){return MN("sha256").update(e).digest("hex").slice(0,8)}function BN(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function qN(e,t){let r=t?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function n_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ni(e){return Math.max(1,Math.ceil(e.length/4))}function rn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return ec(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Zp(r_(ec(r)),".lmctl-claude-mock","sessions.json"):Zp(ec(e),".lmctl-claude-mock","sessions.json")}function Qp(){return{schemaVersion:1,sessions:{}}}function ns(e){if(!jN(e))return Qp();try{let t=JSON.parse(PN(e,"utf8")),r=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},n=typeof t.script=="object"&&t.script!==null?t.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return Qp()}}function s_(e,t){DN(r_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;UN(r,`${JSON.stringify(t,null,2)}
1423
- `,"utf8"),FN(r,e)}function HN(e){return{...e,timestamp:e.timestamp.toISOString()}}function JN(e){return{...e,timestamp:new Date(e.timestamp)}}function XN(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(HN)}}function i_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(JN)}}function xi(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=ns(rn(t)).sessions[e];if(s===void 0)return;let i=i_(s);return tn.set(i.sessionId,i),i}function e_(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=ns(t);r.sessions[e.sessionId]=XN({...e,filePath:t}),s_(t,r)}function GN(){let e=ns(rn()),t=Object.values(e.sessions).map(i_);for(let r of t)tn.set(r.sessionId,r);return t}function VN(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[n_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function t_(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function nc(){return new rc}var tn,tc,rc,sc=T(()=>{"use strict";tn=new Map;tc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of GN())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(t_)}async loadSession(t){let r=xi(t);return r===void 0?null:{...t_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return xi(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=ns(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&s_(n,s),r||i}},rc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new tc;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,r){let n=BN(qN(t,r)),s=`mock-${n}-${WN(`${t}:${n}`)}`,i=new Date,o=rn(t),a=xi(s,t),l=r?.prompt??"ClaudeMock seed",c=Ni(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Ni("ACK: ClaudeMock seeded"),e_(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=xi(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ns(rn(r.cwd)),a=VN(t,o)??`ClaudeMock ack: ${n_(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Ni(t),s.totalOutputTokens+=Ni(a),e_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function bt(e){let t=[Nl({claudeDir:e?.claudeDir}),Rl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Ml({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Dl({copilotDir:e?.copilotDir}),Bl(),Jl({lmplayerDbPath:e?.lmplayerDbPath}),Vl(),Zl({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(nc()),t}var ic=T(()=>{"use strict";xl();Ll();jl();Pl();ql();Xl();Kl();Ql();sc();xl();Ll();jl();Pl();ql();Xl();Kl();Ql();sc()});var cc={};ye(cc,{ProviderRegistry:()=>Vn,TransportConnectionError:()=>be,TransportError:()=>Qe,TransportJsonError:()=>ai,TransportProcessError:()=>Bt,TransportRpcError:()=>qt,_resetDefaultRegistryForTests:()=>KN,chat:()=>St,countTokens:()=>lc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>ac,seed:()=>oc});function Ri(){return Ai===null&&(Ai=Et(bt())),Ai}function KN(){Ai=null}function a_(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function St(e){let t=e.registry??Ri(),r=a_(t,e.provider),n={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode},s=await r.sendTurn(e.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function oc(e){let t=e.registry??Ri(),r=a_(t,e.provider),n=await o_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let i=await o_(t,e.provider,e.cwd),o=YN(n,i);return o?{success:!0,sessionId:o}:{success:!0}}async function o_(e,t,r){let n=await e.listAll({provider:t,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function YN(e,t){let r=[];for(let n of t.keys())e.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ac(e={}){return(e.registry??Ri()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function lc(e){let r=await(e.registry??Ri()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Ai,vt=T(()=>{"use strict";ll();ic();ll();ic();Yr();Ai=null});function zN(){return dc===null&&(dc=Et(bt())),dc}async function Li(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await QN(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=ZN(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function ZN(e,t){if(!(e instanceof Se))return nn.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let r=(nn.get(t)??0)+1;return r>=3?(nn.delete(t),"consecutive_timeouts"):(nn.set(t,r),null)}return nn.delete(t),null}async function QN(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=zN(),s;try{let d=await n.resolveSession(e.sessionid);if(!d)return Promise.reject(new Se("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,uc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Se("other",null,`library: session resolution failed: ${l_(d)}`,uc(e.sessionid,e.sessiondir,"unresolved")))}let i=uc(e.sessionid,e.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await St({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new Se("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new Se("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):ex(d,i)}finally{a!==null&&clearTimeout(a)}}function uc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function l_(e){return e instanceof Error?e.message:String(e)}function ex(e,t){if(e instanceof Se)return e;if(e instanceof be){let r=e.cause;return r?.code==="ENOENT_CWD"?new Se("sessiondir_missing",null,e.message,t):r?.code==="ENOENT"?new Se("enoent",null,e.message,t):new Se("other",null,e.message,t)}return e instanceof Bt?new Se("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof qt?new Se("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new Se("other",null,e.message,t):new Se("other",null,l_(e),t)}var Se,dc,nn,Oi=T(()=>{"use strict";vt();Se=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},dc=null;nn=new Map});function c_(){return fc===null&&(fc=Et(bt())),fc}function rx(e,t){if(!tx.test(e))return e;let r=t.getConfig(`workspace.${e}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${e}; run \`lmctl workspace init\` (or set workspace.${e} in lmctl_config)`,["<library>","seed","--provider",e]);return r}async function $i(e){let t=rx(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await nx({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function nx(e){let t=e.member.provider,r=e.member.sessiondir,n=mc("seed",r,t);try{let s=await oc({provider:t,cwd:r,registry:c_()});if(!s.success)throw ix(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:pc(s,n)}}async function d_(e){return sx(e)}async function sx(e){let t=c_(),r=mc("tokens",e.sessionid,"unresolved"),n;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new ke("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof ke?i:pc(i,r)}let s=mc("tokens",e.sessionid,n);try{let i=await lc({sessionId:e.sessionid,provider:n,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof ke?i:pc(i,s)}}function mc(e,t,r){return["<library>",e,t,"--provider",r]}function ix(e,t){let r=e??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,t);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,t);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,t)}return new ke("other",null,r,t)}function pc(e,t){return e instanceof ke?e:e instanceof be?e.cause?.code==="ENOENT"?new ke("enoent",null,e.message,t):new ke("other",null,e.message,t):e instanceof Bt?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof qt?new ke("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ke("other",null,e.message,t):new ke("other",null,e instanceof Error?e.message:String(e),t)}var ke,fc,tx,_c=T(()=>{"use strict";vt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},fc=null;tx=/^provider[123]$/});function Ci(e){return Buffer.from(e,"utf8").toString("base64url")}function is(e){return Buffer.from(e,"base64url").toString("utf8")}async function u_(e,t=r=>d_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of ox(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function f_(e,t,r){let n=m_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ss(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Li({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:p_(e,t,r)}}catch(s){throw e.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function hc(e,t,r){let n=m_(e,t,r);if(n===null)throw new Error("session member not found");let s=await $i({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:p_(e,t,r)}}function ox(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function m_(e,t,r){let n=e.findTeamByName(t);if(n===null)return null;let s=e.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function p_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ss,Mi=T(()=>{"use strict";Oi();_c();ss=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function gc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??lx(t),s=r-n,i=t.query(`
1422
+ `):"":""}function Wp(e){return e.model||e.message?.model}var ki,Bp=T(()=>{"use strict";nr();ki=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||ar(be,".qwen")}async discoverSessions(){let t=ar(this.baseDir,"projects"),r;try{r=await vi(t)}catch{return[]}let n=[];for(let s of r){let i=ar(t,s,"chats"),o;try{o=await vi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ar(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await Ce(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Pp(u)){let f=Up(u).trim();f&&(l||(l=H(f,80)),c=H(f,80)),d++}if(Fp(u)){let f=Wp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Dp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(t,r){let n=await Ne(t),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of We(t)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Pp(f)){let _=Up(f);_.trim()&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Fp(f)){let _=Wp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=ar(this.baseDir,"projects");try{let n=await vi(r),s=[];for(let i of n){let o=ar(r,i,"chats",`${t}.jsonl`);try{return await TN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ar(r,i,"chats"),a;try{a=await vi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Dp(l,".jsonl").startsWith(t)&&s.push(ar(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await bN(r),!0}catch{return!1}}}});function Vl(){return new Gl}var Gl,Kl=T(()=>{"use strict";Bp();Wt();Ir();Tt();Gl=class extends xe{constructor(){super({provider:new ki,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",he,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:pi})}}});import{readdir as qp,readFile as SN,rm as Hp,stat as Jp}from"node:fs/promises";import{basename as Yl,join as Ht}from"node:path";async function vN(e){let t=await Promise.all(e.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...t.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(r=>r.modifiedAt.getTime())))}}function kN(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Xp(e){return e.type==="USER_INPUT"}function Gp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function IN(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Vp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Kp(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function NN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function xN(e){for await(let t of We(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=AN(s);if(i)return i}let n=RN(t.content);if(n)return n}return null}function AN(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=t.Cwd??t.cwd??t.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function RN(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Yp(e){if(e.endsWith(".db"))return Yl(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var Ii,zp=T(()=>{"use strict";nr();Ii=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Ht(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ht(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Ht(this.baseDir,"conversations"),r;try{r=await qp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Yl(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return Ht(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return Ht(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Jp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await vN([r,n].filter(Boolean)),o=await this.resolveCwd(t,n),a,l,c,d=0;if(n){let u=await Ce(n,80);for(let f of u){let m=Kp(f.content);if(m&&(a=m),Xp(f)){let p=Vp(f.content).trim();p&&(l||(l=H(p,80)),c=H(p,80)),d++}else Gp(f)&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Yp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of We(i)){let u=kN(d.created_at,s.modifiedAt),f=Kp(d.content);if(f&&(a=f),Xp(d)){let m=Vp(d.content),p=m.trim();p&&(l||(l=H(p,80)),c=H(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:NN(m.args),toolName:m.name||"tool"});Gp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):IN(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(t){let r=this.conversationPath(t);try{return await Jp(r),r}catch{}let n=Ht(this.baseDir,"conversations");try{let s=[];for(let i of await qp(n)){if(!i.endsWith(".db"))continue;Yl(i,".db").startsWith(t)&&s.push(Ht(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;let n=Yp(r);return n?(await Hp(this.conversationPath(n),{force:!0}),await Hp(Ht(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,r){let n=await this.cwdFromLastConversationCache(t);if(n)return n;if(r){let s=await xN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=Ht(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await SN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as LN}from"node:child_process";function Zl(e){return new zl(e)}async function ON(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",CN(t.timeoutMs)];t.model&&n.push("--model",t.model),at("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await $N(t.binary,n,{cwd:t.cwd,env:Be(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-r}}function $N(e,t,r){return new Promise((n,s)=>{let i;try{i=LN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function CN(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var zl,Ql=T(()=>{"use strict";zp();Wt();Tt();it();zr();zl=class extends xe{constructor(t){super({provider:new Ii(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",he,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:ON})}seedArgsFor(t){let r=[...super.seedArgsFor(t)];return t?.model&&r.push("--model",t.model),r}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as MN}from"node:crypto";import{existsSync as jN,mkdirSync as DN,readFileSync as PN,renameSync as FN,writeFileSync as UN}from"node:fs";import{dirname as r_,join as Zp,resolve as ec}from"node:path";function WN(e){return MN("sha256").update(e).digest("hex").slice(0,8)}function BN(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function qN(e,t){let r=t?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function n_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ni(e){return Math.max(1,Math.ceil(e.length/4))}function rn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return ec(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Zp(r_(ec(r)),".lmctl-claude-mock","sessions.json"):Zp(ec(e),".lmctl-claude-mock","sessions.json")}function Qp(){return{schemaVersion:1,sessions:{}}}function ns(e){if(!jN(e))return Qp();try{let t=JSON.parse(PN(e,"utf8")),r=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},n=typeof t.script=="object"&&t.script!==null?t.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return Qp()}}function s_(e,t){DN(r_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;UN(r,`${JSON.stringify(t,null,2)}
1423
+ `,"utf8"),FN(r,e)}function HN(e){return{...e,timestamp:e.timestamp.toISOString()}}function JN(e){return{...e,timestamp:new Date(e.timestamp)}}function XN(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(HN)}}function i_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(JN)}}function xi(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=ns(rn(t)).sessions[e];if(s===void 0)return;let i=i_(s);return tn.set(i.sessionId,i),i}function e_(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=ns(t);r.sessions[e.sessionId]=XN({...e,filePath:t}),s_(t,r)}function GN(){let e=ns(rn()),t=Object.values(e.sessions).map(i_);for(let r of t)tn.set(r.sessionId,r);return t}function VN(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[n_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function t_(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function nc(){return new rc}var tn,tc,rc,sc=T(()=>{"use strict";tn=new Map;tc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of GN())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(t_)}async loadSession(t){let r=xi(t);return r===void 0?null:{...t_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return xi(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=ns(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&s_(n,s),r||i}},rc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new tc;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,r){let n=BN(qN(t,r)),s=`mock-${n}-${WN(`${t}:${n}`)}`,i=new Date,o=rn(t),a=xi(s,t),l=r?.prompt??"ClaudeMock seed",c=Ni(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Ni("ACK: ClaudeMock seeded"),e_(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=xi(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ns(rn(r.cwd)),a=VN(t,o)??`ClaudeMock ack: ${n_(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Ni(t),s.totalOutputTokens+=Ni(a),e_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function bt(e){let t=[Nl({claudeDir:e?.claudeDir}),Rl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Ml({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Dl({copilotDir:e?.copilotDir}),Bl(),Jl({lmplayerDbPath:e?.lmplayerDbPath}),Vl(),Zl({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(nc()),t}var ic=T(()=>{"use strict";xl();Ll();jl();Pl();ql();Xl();Kl();Ql();sc();xl();Ll();jl();Pl();ql();Xl();Kl();Ql();sc()});var cc={};ye(cc,{ProviderRegistry:()=>Vn,TransportConnectionError:()=>Se,TransportError:()=>Qe,TransportJsonError:()=>ai,TransportProcessError:()=>Bt,TransportRpcError:()=>qt,_resetDefaultRegistryForTests:()=>KN,chat:()=>St,countTokens:()=>lc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>ac,seed:()=>oc});function Ri(){return Ai===null&&(Ai=Et(bt())),Ai}function KN(){Ai=null}function a_(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function St(e){let t=e.registry??Ri(),r=a_(t,e.provider),n={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode},s=await r.sendTurn(e.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function oc(e){let t=e.registry??Ri(),r=a_(t,e.provider),n=await o_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let i=await o_(t,e.provider,e.cwd),o=YN(n,i);return o?{success:!0,sessionId:o}:{success:!0}}async function o_(e,t,r){let n=await e.listAll({provider:t,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function YN(e,t){let r=[];for(let n of t.keys())e.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ac(e={}){return(e.registry??Ri()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function lc(e){let r=await(e.registry??Ri()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Ai,vt=T(()=>{"use strict";ll();ic();ll();ic();Yr();Ai=null});function zN(){return dc===null&&(dc=Et(bt())),dc}async function Li(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await QN(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=ZN(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function ZN(e,t){if(!(e instanceof ve))return nn.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let r=(nn.get(t)??0)+1;return r>=3?(nn.delete(t),"consecutive_timeouts"):(nn.set(t,r),null)}return nn.delete(t),null}async function QN(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=zN(),s;try{let d=await n.resolveSession(e.sessionid);if(!d)return Promise.reject(new ve("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,uc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${l_(d)}`,uc(e.sessionid,e.sessiondir,"unresolved")))}let i=uc(e.sessionid,e.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await St({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new ve("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new ve("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):ex(d,i)}finally{a!==null&&clearTimeout(a)}}function uc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function l_(e){return e instanceof Error?e.message:String(e)}function ex(e,t){if(e instanceof ve)return e;if(e instanceof Se){let r=e.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,e.message,t):r?.code==="ENOENT"?new ve("enoent",null,e.message,t):new ve("other",null,e.message,t)}return e instanceof Bt?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof qt?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ve("other",null,e.message,t):new ve("other",null,l_(e),t)}var ve,dc,nn,Oi=T(()=>{"use strict";vt();ve=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},dc=null;nn=new Map});function c_(){return fc===null&&(fc=Et(bt())),fc}function rx(e,t){if(!tx.test(e))return e;let r=t.getConfig(`workspace.${e}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${e}; run \`lmctl workspace init\` (or set workspace.${e} in lmctl_config)`,["<library>","seed","--provider",e]);return r}async function $i(e){let t=rx(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await nx({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function nx(e){let t=e.member.provider,r=e.member.sessiondir,n=mc("seed",r,t);try{let s=await oc({provider:t,cwd:r,registry:c_()});if(!s.success)throw ix(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:pc(s,n)}}async function d_(e){return sx(e)}async function sx(e){let t=c_(),r=mc("tokens",e.sessionid,"unresolved"),n;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new ke("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof ke?i:pc(i,r)}let s=mc("tokens",e.sessionid,n);try{let i=await lc({sessionId:e.sessionid,provider:n,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof ke?i:pc(i,s)}}function mc(e,t,r){return["<library>",e,t,"--provider",r]}function ix(e,t){let r=e??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,t);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,t);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,t)}return new ke("other",null,r,t)}function pc(e,t){return e instanceof ke?e:e instanceof Se?e.cause?.code==="ENOENT"?new ke("enoent",null,e.message,t):new ke("other",null,e.message,t):e instanceof Bt?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof qt?new ke("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ke("other",null,e.message,t):new ke("other",null,e instanceof Error?e.message:String(e),t)}var ke,fc,tx,_c=T(()=>{"use strict";vt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},fc=null;tx=/^provider[123]$/});function Ci(e){return Buffer.from(e,"utf8").toString("base64url")}function is(e){return Buffer.from(e,"base64url").toString("utf8")}async function u_(e,t=r=>d_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of ox(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function f_(e,t,r){let n=m_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ss(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Li({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:p_(e,t,r)}}catch(s){throw e.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function hc(e,t,r){let n=m_(e,t,r);if(n===null)throw new Error("session member not found");let s=await $i({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:p_(e,t,r)}}function ox(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function m_(e,t,r){let n=e.findTeamByName(t);if(n===null)return null;let s=e.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function p_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ss,Mi=T(()=>{"use strict";Oi();_c();ss=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function gc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??lx(t),s=r-n,i=t.query(`
1424
1424
  SELECT
1425
1425
  isess.id AS interactive_session_id,
1426
1426
  isess.run_id,
@@ -1446,7 +1446,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1446
1446
  JOIN step s ON s.id = isess.step_id
1447
1447
  WHERE isess.status = 'waiting_agent'
1448
1448
  AND r.terminal_state IS NULL
1449
- `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=ux(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=cx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Fe(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,dx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function lx(e){return __(e.getConfig(ji),ax)*1e3}function yc(e,t){return __(e.getConfig(Di),t)}function __(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function cx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function dx(e,t,r,n){return e.query(`SELECT * FROM attention
1449
+ `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=ux(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=cx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Ue(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,dx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function lx(e){return __(e.getConfig(ji),ax)*1e3}function yc(e,t){return __(e.getConfig(Di),t)}function __(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function cx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function dx(e,t,r,n){return e.query(`SELECT * FROM attention
1450
1450
  WHERE kind = 'session_hung'
1451
1451
  AND run_id = ?
1452
1452
  AND acknowledged_at IS NULL`,t).some(i=>{let o=h_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function ux(e,t,r){let n=h_(e);return n===null?null:fx(n,t,r)??mx(n,t,r)}function fx(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(px),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Ar(s.members)?s.members:null,o=i!==null&&Ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function mx(e,t,r){if(!Ar(e.states))return null;let n=e.states[t]??e.states[r];if(!Ar(n))return null;let s=n;if(!Ar(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function px(e){return Ar(e)}function h_(e){if(e===null)return null;try{let t=JSON.parse(e);return Ar(t)?t:null}catch{return null}}function Ar(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ji,Di,ax,wc=T(()=>{"use strict";Ze();ji="monitor.session_hung.elapsed_threshold_seconds",Di="monitor.session_hung.check_interval_ms",ax=600});function Fi(e){let t=e.query(`
@@ -1552,7 +1552,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1552
1552
  AND acknowledged_at IS NULL
1553
1553
  ORDER BY id ASC`,t).map(I=>({kind:I.kind,severity:I.severity,payload:Ix(I.payload)})),w=h.map(I=>{let x=f.get(I),U=p.get(I),ue=Ex(s,I,S,x,U),W=x===void 0?null:Date.parse(x.started_at),M=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN(W??NaN)?null:M!==null&&!Number.isNaN(M)?M-W:ue==="running"||ue==="paused"?n-W:null,Q=x===void 0?null:_.get(x.id)??null,B=Nx(U?.last_activity_at??null,Q,g),k=i===null||U===void 0?void 0:Sx(e,s.team_id,i.definition,U.state_name,x?.state_name??I);return{step_id:x?.id??null,state_id:I,status:ue,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:B,elapsed_ms:A,...k!==void 0?{member:k}:{},...U!==void 0?{interactive_session:{id:U.id,status:U.status,turn_count:U.turn_count,state_name:U.state_name}}:{}}});return{run_id:t,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:bx(s,a,w),submitted_at:a?.enqueued_at??s.started_at,nodes:w,current_node_index:Tx(w,s.terminal_state!==null),related_attentions:y}}function Xi(e,t={}){let r=t.nowMs??Date.now(),n=[],s=e.workflow_name??"?",i=e.workflow_version!==null?`v${e.workflow_version}`:"v?";n.push(`run ${e.run_id} - ${s}, ${i} - ${e.status}`);let o=`${e.submitted_at} (${y_(Date.parse(e.submitted_at),r)} ago)`;n.push(`project: ${e.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${g_(e.submitted_at,e.submitted_at)} submit`);for(let a of e.nodes){let l=a.started_at===null?"[ ]":g_(e.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${Gi(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${d}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${y_(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(e.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of e.related_attentions)n.push(`- ${a.kind}${xx(a.payload)}`)}return`${n.join(`
1554
1554
  `)}
1555
- `}function yx(e,t,r){let n=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function wx(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function Ex(e,t,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&r===t?"paused":"running":n.outcome===null?"failed":"done"}function Tx(e,t){if(e.length===0)return null;let r=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let n=e.findIndex(s=>s.status==="pending");return n>=0?n:e.length-1}function bx(e,t,r){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function Sx(e,t,r,n,s){let i=vx(r,n,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Fe(o)}}function vx(e,t,r){let n=kx(e);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>lr(a)?a.id===t||a.name===t||a.name===r:!1),i=lr(s?.members)?s.members:null,o=i!==null&&lr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(lr(n.states)){let s=n.states[t]??n.states[r];if(!lr(s))return null;let i=lr(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function kx(e){try{let t=JSON.parse(e);return lr(t)?t:null}catch{return null}}function Ix(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function lr(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Nx(...e){let t=e.filter(r=>r!==null&&Number.isFinite(r));return t.length===0?null:Math.max(...t)}function g_(e,t){let r=Date.parse(e),n=Date.parse(t);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Gi(Math.max(0,n-r)).padEnd(6)}]`}function y_(e,t){return Number.isNaN(e)?"?":Gi(Math.max(0,t-e))}function Gi(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60),n=t%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function xx(e){if(!lr(e))return"";let t=typeof e.step_id=="number"?` on step ${e.step_id}`:"",r=typeof e.member_alias=="string"?e.member_alias:null,n=typeof e.provider=="string"?e.provider:null,s=typeof e.elapsed_ms=="number"?`, ${Gi(e.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${t}${i}`}var N_,Jt=T(()=>{"use strict";Ze();N_=`SELECT a.id AS attention_id,
1555
+ `}function yx(e,t,r){let n=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function wx(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function Ex(e,t,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&r===t?"paused":"running":n.outcome===null?"failed":"done"}function Tx(e,t){if(e.length===0)return null;let r=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let n=e.findIndex(s=>s.status==="pending");return n>=0?n:e.length-1}function bx(e,t,r){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function Sx(e,t,r,n,s){let i=vx(r,n,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Ue(o)}}function vx(e,t,r){let n=kx(e);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>lr(a)?a.id===t||a.name===t||a.name===r:!1),i=lr(s?.members)?s.members:null,o=i!==null&&lr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(lr(n.states)){let s=n.states[t]??n.states[r];if(!lr(s))return null;let i=lr(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function kx(e){try{let t=JSON.parse(e);return lr(t)?t:null}catch{return null}}function Ix(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function lr(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Nx(...e){let t=e.filter(r=>r!==null&&Number.isFinite(r));return t.length===0?null:Math.max(...t)}function g_(e,t){let r=Date.parse(e),n=Date.parse(t);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Gi(Math.max(0,n-r)).padEnd(6)}]`}function y_(e,t){return Number.isNaN(e)?"?":Gi(Math.max(0,t-e))}function Gi(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60),n=t%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function xx(e){if(!lr(e))return"";let t=typeof e.step_id=="number"?` on step ${e.step_id}`:"",r=typeof e.member_alias=="string"?e.member_alias:null,n=typeof e.provider=="string"?e.provider:null,s=typeof e.elapsed_ms=="number"?`, ${Gi(e.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${t}${i}`}var N_,Jt=T(()=>{"use strict";Ze();N_=`SELECT a.id AS attention_id,
1556
1556
  a.kind AS kind,
1557
1557
  a.severity AS severity,
1558
1558
  a.created_at AS created_at,
@@ -1719,7 +1719,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1719
1719
  `),2;let d=e.resumeInteractive(l.step_id,a,s);if(!d.resumed)return r.stderr.write(`error: interactive respond failed: ${d.reason} (step_id=${l.step_id})
1720
1720
  `),2;let u=e.acknowledgeAttention(o),f={ok:!0,attention_id:o,step_id:l.step_id,session_status:d.session.status,acknowledged_at:u?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1721
1721
  `):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1722
- `),0}function $_(e,t){let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${e}`;for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}var Ox,$x,C_,Vi,Px,Fx,Ux,Wx,vA,G_=T(()=>{"use strict";Ze();Je();Mi();wc();Jt();Ox="http://127.0.0.1:8787",$x=`usage: lmctl api [--direct] <subcommand> ...
1722
+ `),0}function $_(e,t){let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${e}`;for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}var Ox,$x,C_,Vi,Px,Fx,Ux,Wx,vA,G_=T(()=>{"use strict";Ze();Xe();Mi();wc();Jt();Ox="http://127.0.0.1:8787",$x=`usage: lmctl api [--direct] <subcommand> ...
1723
1723
 
1724
1724
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1725
1725
  workflow shellstep-safe commands also support --direct to use the local DAL
@@ -1841,17 +1841,17 @@ ${s}`;aL(e,o,"utf8")}function dL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1841
1841
  `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Qh(e,t){let r=e.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${t}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function eg(e,t){if(t.length===0)return null;let r=Zh(e,"durable-memory");if(!RL(r))return null;let n;try{n=LL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=OL(Zh(r,i),"utf8");if($L(o).some(l=>t.includes(l))){let l=Qh(o,"name")??i.replace(".md",""),c=Qh(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var tg=T(()=>{"use strict"});function ad(e){let t=e.trim().replace(CL,"").trim();for(let r=0;r<4;r+=1){let n=ML.exec(t);if(n===null)break;t=n[2].trim()}return t}function rg(e){let t=e.trim(),r=jL.exec(t);if(r!==null)return r[2];let n=DL.exec(t);return n!==null?n[0]:null}function _s(e,t){let r=e.split(`
1842
1842
  `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=ad(r[o]),l=id.exec(a);if(l===null)continue;let c=l[1].trim();if(od.test(c))continue;let d=rg(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!t.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=ad(r[o]),l=id.exec(a);if(l===null)break;let c=od.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function ng(e){let t=e.split(`
1843
1843
  `),r=null;for(let n=0;n<t.length;n+=1){let s=ad(t[n]),i=id.exec(s);if(i===null)continue;let o=i[1].trim();if(od.test(o))continue;let a=rg(o);if(a===null||!Vr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var CL,ML,id,od,jL,DL,ld=T(()=>{"use strict";Xn();CL=/^#{1,6}\s+/,ML=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,id=/^STANCE:\s+(.+)$/,od=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,jL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,DL=/^[A-Za-z0-9_-]+/});function sg(e,t,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=e.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else e.insertSessionEvent({run_id:t,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var ig=T(()=>{"use strict"});import{readFileSync as PL}from"node:fs";import{dirname as FL,join as UL}from"node:path";import{fileURLToPath as WL}from"node:url";function HL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function VL(e){let t=[],r=[];for(let n of e)BL.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function KL(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&qL.test(e[r]);)r+=1;if(r>=e.length)return{matched:!1};let n=e[r],s=e.slice(r+1);for(let i of t)if(n===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function YL(e,t){if(e.length===0)return{matched:!1};let r=VL(e);for(let n of r){let s=KL(n,t);if(s.matched)return s}return{matched:!1}}function cd(e){return YL(e,GL)}function zL(e){return e.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,t=>` ${t} `).replace(/(?<!\d)<{1,2}/g,t=>` ${t} `).replace(/\s+/g," ").trim()}function dd(e){return zL(e).split(" ").filter(t=>t.length>0)}var BL,qL,JL,XL,GL,og=T(()=>{"use strict";BL=new Set(["&&","||",";","|",">",">>","<","<<"]),qL=/^[A-Za-z_][A-Za-z0-9_]*=/;JL=FL(WL(import.meta.url)),XL=JSON.parse(PL(UL(JL,"side_effect_classifier.json"),"utf-8")),GL=HL(XL)});function wo(e){return{context:{outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index},outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index}}async function ag(e,t){try{return await $r(ud(e)??e,wo(t))===!0}catch{return!1}}async function Eo(e,t){try{return await $r(ud(e)??e,wo(t))}catch{return}}async function lg(e,t){if(typeof e!="string")return e;let r=ud(e);if(r===null)return e;try{return await $r(r,wo(t))}catch{return}}async function cg(e,t){let r=Array.from(e.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return e;let n="",s=0;for(let i of r){let o=i.index??0;n+=e.slice(s,o);let a=i[1]?.trim()??"";try{n+=ZL(await $r(a,wo(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function ud(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function ZL(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var hs=T(()=>{"use strict";as()});import{existsSync as dg,readdirSync as ug,readFileSync as QL,statSync as fg}from"node:fs";import{join as bo}from"node:path";function mg(e,t,r,n){return Object.assign(e,{stateId:t,state:r,displayName:n})}function q(e,t){return e.dal.insertStep({...t,parent_step_id:e.parent_step_id})}function J(e,t){return t.startsWith("@terminal:")?{kind:"terminal",terminal:t.slice(10)}:e.states[t]===void 0?{kind:"escalate",token:t,reason:`unknown state ref '${t}'`}:{kind:"state",state:t}}function tt(e,t,r,n,s={}){let i=O(),o=q(e,{run_id:e.run_id,state_name:t.name});e.steps_executed+=1,e.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),e.dal.setRunPausedState(e.run_id,`${gs}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Vr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ti,severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify({run_id:e.run_id,step_id:o.id,project_id:e.project.id,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:t.id,name:t.name,type:t.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:eO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function eO(e){return e.length>8e3?`${e.slice(0,8e3)}
1844
- \u2026[truncated ${e.length-8e3} chars]`:e}function X(e,t,r,n){e.outcomes[t]=n,r!==t&&(e.outcomes[r]=n)}function Y(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function pg(e,t){let r=t.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=fr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=fr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=fr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=tO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return cg(n,t)}function tO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function fr(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ys(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=sg(t.dal,t.run_id,()=>i),c=fd(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=dd(S.summary),w=cd(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=S=>{u(S),rO(S,(y,w)=>{m+=y,p+=w})},g=await Li({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:_});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Fe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),nO(t.project,t.dal,f);let h=d.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&t.project.local_path.trim().length>0&&md(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function rO(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=To(s.input_tokens),a=To(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=To(i.input_tokens),a=To(i.output_tokens);(o>0||a>0)&&t(o,a)}}function To(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Vt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=q(e,{run_id:e.run_id,state_name:s});e.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ys({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function mn(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=q(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Lm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1844
+ \u2026[truncated ${e.length-8e3} chars]`:e}function X(e,t,r,n){e.outcomes[t]=n,r!==t&&(e.outcomes[r]=n)}function Y(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function pg(e,t){let r=t.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=fr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=fr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=fr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=tO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return cg(n,t)}function tO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function fr(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ys(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=sg(t.dal,t.run_id,()=>i),c=fd(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=dd(S.summary),w=cd(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=S=>{u(S),rO(S,(y,w)=>{m+=y,p+=w})},g=await Li({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:_});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ue(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),nO(t.project,t.dal,f);let h=d.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&t.project.local_path.trim().length>0&&md(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function rO(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=To(s.input_tokens),a=To(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=To(i.input_tokens),a=To(i.output_tokens);(o>0||a>0)&&t(o,a)}}function To(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Vt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=q(e,{run_id:e.run_id,state_name:s});e.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ys({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function mn(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=q(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Lm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1845
1845
 
1846
- `);try{let p=await ys({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=_s(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Se?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function pn(e,t){return(t?.length??0)>0?eg(e.project.local_path,t):null}function _g(e){return cd(dd(e))}function fd(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
1846
+ `);try{let p=await ys({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=_s(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof ve?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function pn(e,t){return(t?.length??0)>0?eg(e.project.local_path,t):null}function _g(e){return cd(dd(e))}function fd(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
1847
1847
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1848
1848
  ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(r.length===0)return!1;let n=r[0];return e.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function md(e,t){if(!dg(e))return!1;let r=bo(e,"durable-memory");function n(s){let i;try{i=ug(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=bo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(fg(a).mtime>t)return!0}catch{}}return!1}return n(e)}function nO(e,t,r){let n=bo(e.local_path,"durable-memory");if(!dg(n))return;let s;try{s=ug(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=bo(n,i),a;try{a=fg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=QL(o,"utf8")}catch{continue}let c=iO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1849
- `);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function iO(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!sO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var gs,sO,Be=T(()=>{"use strict";Ze();ln();Oi();tg();ld();Xn();ig();og();hs();gs="__paused__:";sO=new Set(["user","feedback","project","reference"])});import{spawnSync as hg}from"node:child_process";function oO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=hg("git",["diff","--quiet"],{cwd:i}).status!==0,a=hg("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),X(e,r,n,Rc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),X(e,r,n,"clean"),J(e.workflow,t.next)}var gg,yg=T(()=>{"use strict";Be();gg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:e=>oO(e,e.state)}});async function aO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;for(let i of t.branches)if(await ag(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),X(e,r,n,"matched"),J(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),X(e,r,n,"no_match"),t.default_next!==void 0?J(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var wg,Eg=T(()=>{"use strict";Be();hs();wg={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async e=>aO(e,e.state)}});async function lO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=pn(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1849
+ `);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function iO(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!sO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var gs,sO,qe=T(()=>{"use strict";Ze();ln();Oi();tg();ld();Xn();ig();og();hs();gs="__paused__:";sO=new Set(["user","feedback","project","reference"])});import{spawnSync as hg}from"node:child_process";function oO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=hg("git",["diff","--quiet"],{cwd:i}).status!==0,a=hg("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),X(e,r,n,Rc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),X(e,r,n,"clean"),J(e.workflow,t.next)}var gg,yg=T(()=>{"use strict";qe();gg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:e=>oO(e,e.state)}});async function aO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;for(let i of t.branches)if(await ag(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),X(e,r,n,"matched"),J(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),X(e,r,n,"no_match"),t.default_next!==void 0?J(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var wg,Eg=T(()=>{"use strict";qe();hs();wg={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async e=>aO(e,e.state)}});async function lO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=pn(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1850
1850
  ${m}`:null).filter(m=>m!==null).join(`
1851
1851
 
1852
- `),c=`${n}:consolidator`,d=await mn(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&X(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?J(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=t.research_artifact_prefix??n;if(e.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),e.dal.finishStep(u.id,"ok","consolidated"),X(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Vt(e,n,m,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.ok)}var Tg,bg=T(()=>{"use strict";Be();Tg={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>lO(e,e.state)}});async function cO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.progress_step_id;e.progress_step_id=s.id;try{let o=await Eo(t.items_from,e),a=mO(o);if(a===null){e.dal.finishStep(s.id,null,`foreach_invalid_items:${t.items_from}`);let f=t.outcomes.any_failed;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await uO(e,t,s.id,a,l):await dO(e,t,s.id,a,l);if(l.routed!==null)return e.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(e.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),X(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return J(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function dO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await vg(e,t,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&t.on_item_failure==="stop"))break}return i}async function uO(e,t,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(t.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await vg(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function vg(e,t,r,n,s,i){let o=e.iteration;e.iteration={item:n,index:s};let a=`${e.displayName}[${s}]`;e.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await e.dispatchState(a,t.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{e.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&e.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":fO(e.outcomes[a]);return e.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:d}}),{index:s,value:n,outcome:d}}function fO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function mO(e){if(!Array.isArray(e))return null;let t=[];for(let r of e)if(typeof r=="string")t.push(r);else if(typeof r=="number"||typeof r=="boolean")t.push(String(r));else return null;return t}var Sg,kg=T(()=>{"use strict";Be();hs();Sg={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>cO(e,e.state)}});async function pO(e,t){let r=e.stateId,n=e.displayName,s=t.termination.timeout_seconds!==void 0?t.termination.timeout_seconds*1e3:void 0,i=e.membersByAlias.get(t.agent.alias);if(i===void 0||i.sessionid===null){let f=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(f.id,null,`missing_agent:${t.agent.alias}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=pn(e,t.durable_memory_tags),a=e.dal.getInteractiveSessionByRunAndState(e.run_id,r);if(a!==null){if(a.status==="done")return e.dal.finishStep(a.step_id,"done","operator_done"),e.outcomes[n]="done",t.write_back_durable_memory&&await Vt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=t.termination.max_turns){e.dal.finishStep(a.step_id,"timeout",`max_turns=${t.termination.max_turns}`),X(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?J(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await ys({context:e,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),X(e,r,n,"done"),t.write_back_durable_memory&&await Vt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done)):(Ig({context:e,state:t,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Se?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}}return{kind:"paused"}}let l=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await Ke(t.agent.initial_prompt_template,e,n),u=o?`${o}
1852
+ `),c=`${n}:consolidator`,d=await mn(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&X(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?J(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=t.research_artifact_prefix??n;if(e.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),e.dal.finishStep(u.id,"ok","consolidated"),X(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Vt(e,n,m,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.ok)}var Tg,bg=T(()=>{"use strict";qe();Tg={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>lO(e,e.state)}});async function cO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.progress_step_id;e.progress_step_id=s.id;try{let o=await Eo(t.items_from,e),a=mO(o);if(a===null){e.dal.finishStep(s.id,null,`foreach_invalid_items:${t.items_from}`);let f=t.outcomes.any_failed;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await uO(e,t,s.id,a,l):await dO(e,t,s.id,a,l);if(l.routed!==null)return e.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(e.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),X(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return J(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function dO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await vg(e,t,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&t.on_item_failure==="stop"))break}return i}async function uO(e,t,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(t.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await vg(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function vg(e,t,r,n,s,i){let o=e.iteration;e.iteration={item:n,index:s};let a=`${e.displayName}[${s}]`;e.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await e.dispatchState(a,t.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{e.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&e.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":fO(e.outcomes[a]);return e.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:d}}),{index:s,value:n,outcome:d}}function fO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function mO(e){if(!Array.isArray(e))return null;let t=[];for(let r of e)if(typeof r=="string")t.push(r);else if(typeof r=="number"||typeof r=="boolean")t.push(String(r));else return null;return t}var Sg,kg=T(()=>{"use strict";qe();hs();Sg={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>cO(e,e.state)}});async function pO(e,t){let r=e.stateId,n=e.displayName,s=t.termination.timeout_seconds!==void 0?t.termination.timeout_seconds*1e3:void 0,i=e.membersByAlias.get(t.agent.alias);if(i===void 0||i.sessionid===null){let f=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(f.id,null,`missing_agent:${t.agent.alias}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=pn(e,t.durable_memory_tags),a=e.dal.getInteractiveSessionByRunAndState(e.run_id,r);if(a!==null){if(a.status==="done")return e.dal.finishStep(a.step_id,"done","operator_done"),e.outcomes[n]="done",t.write_back_durable_memory&&await Vt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=t.termination.max_turns){e.dal.finishStep(a.step_id,"timeout",`max_turns=${t.termination.max_turns}`),X(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?J(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await ys({context:e,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),X(e,r,n,"done"),t.write_back_durable_memory&&await Vt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done)):(Ig({context:e,state:t,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof ve?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}}return{kind:"paused"}}let l=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await Ke(t.agent.initial_prompt_template,e,n),u=o?`${o}
1853
1853
 
1854
- ${d}`:d;try{let f=await ys({context:e,stateId:n,member:i,prompt:u,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:l.id,kind:t.artifact_name,content:f.text}),t.termination.agent_signal!==void 0&&f.text.includes(t.termination.agent_signal)?(e.dal.finishStep(l.id,"done","agent_signal"),e.outcomes[n]="done",t.write_back_durable_memory&&await Vt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done)):(Ig({context:e,state:t,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Se?`chat_${f.kind}`:"chat_other";return e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}}function Ig(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=O();t.dal.setRunPausedState(t.run_id,`${gs}${n}`,a),t.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify(_O({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function _O(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=hO(t,r),c={kind:"free_text",choices:null};return{run_id:t.run_id,step_id:s,state_name:r,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:gO(i,3),paused_at:o,created_run_inputs:fr(t.job.payload)}}function hO(e,t){let r=[],s=e.dal.getRun(e.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=e.dal.getRun(s);if(o===null)break;o.current_state!==null&&r.unshift(o.current_state),s=o.parent_run_id}return r.push(t),r}function gO(e,t){if(typeof e!="string"||e.length===0)return[];let r=e.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-t)}var Ng,xg=T(()=>{"use strict";Oi();Be();Ng={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>pO(e,e.state)}});async function yO(e,t){let r=e.stateId,n=e.displayName,s=pg(e,t.over);if(s===null){let u=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_invalid_items:${t.over}`);let f=t.outcomes.error;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let i=e.workflow.states[t.body];if(i===void 0){let u=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_body_not_found:${t.body}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=s.slice(0,t.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let f=o[u],m=`${n}[${u}]`,p=e.iteration;e.iteration={item:f,index:u};let _;try{_=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let g=wO(e.outcomes[m]);if(a.push({index:u,value:f,outcome:g}),g===null&&t.stop_on_error){l=!0;break}}let c=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let d=l?"error":"ok";if(e.dal.finishStep(c.id,d,JSON.stringify({iterations:a,count:o.length})),X(e,r,n,d),l){let u=t.outcomes.error;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}return J(e.workflow,t.outcomes.ok)}function wO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Ag,Rg=T(()=>{"use strict";Be();Ag={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>yO(e,e.state)}});import{createHash as EO}from"node:crypto";import{existsSync as TO,mkdirSync as bO,readFileSync as SO,writeFileSync as vO}from"node:fs";import{dirname as kO,isAbsolute as Og,normalize as IO,resolve as ws}from"node:path";import{Document as NO,ExternalHyperlink as xO,HeadingLevel as _n,LevelFormat as AO,Packer as RO,Paragraph as mt,Table as LO,TableCell as OO,TableRow as $O,TextRun as pt,WidthType as CO}from"docx";import{marked as MO}from"marked";async function jO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await DO(e,t,n),o=await PO(e,t),a=await FO(e,t.title),l=await HO(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return bO(kO(o),{recursive:!0}),vO(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:EO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${o}`),X(e,r,n,{output_path:o,path:o,bytes:l.length}),J(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),X(e,r,n,{error:o}),J(e.workflow,t.outcomes?.error??"@terminal:error")}}async function DO(e,t,r){if(typeof t.markdown_source!="string"||t.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ke(t.markdown_source,e,r)).trim(),i=(n.length===0?qO(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=WO(e.project.local_path,i);if(o!==null){if(!TO(o))throw new Error(`markdown_source file not found: ${o}`);return So(SO(o,"utf8"))}return So(i)}async function PO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=UO(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function FO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function UO(e,t){let r=ws(e);return IO(Og(t)?ws(t):ws(r,t))}function WO(e,t){return BO(t)?Og(t)?ws(t):ws(e,t):null}function BO(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function qO(e,t){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(t)?.[1];if(n===void 0)return null;let s=Object.entries(e.transcripts).filter(([o])=>o.startsWith(`${n}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return So(s);let i=e.dal.query(`SELECT sa.content
1854
+ ${d}`:d;try{let f=await ys({context:e,stateId:n,member:i,prompt:u,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:l.id,kind:t.artifact_name,content:f.text}),t.termination.agent_signal!==void 0&&f.text.includes(t.termination.agent_signal)?(e.dal.finishStep(l.id,"done","agent_signal"),e.outcomes[n]="done",t.write_back_durable_memory&&await Vt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done)):(Ig({context:e,state:t,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof ve?`chat_${f.kind}`:"chat_other";return e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}}function Ig(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=O();t.dal.setRunPausedState(t.run_id,`${gs}${n}`,a),t.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify(_O({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function _O(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=hO(t,r),c={kind:"free_text",choices:null};return{run_id:t.run_id,step_id:s,state_name:r,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:gO(i,3),paused_at:o,created_run_inputs:fr(t.job.payload)}}function hO(e,t){let r=[],s=e.dal.getRun(e.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=e.dal.getRun(s);if(o===null)break;o.current_state!==null&&r.unshift(o.current_state),s=o.parent_run_id}return r.push(t),r}function gO(e,t){if(typeof e!="string"||e.length===0)return[];let r=e.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-t)}var Ng,xg=T(()=>{"use strict";Oi();qe();Ng={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>pO(e,e.state)}});async function yO(e,t){let r=e.stateId,n=e.displayName,s=pg(e,t.over);if(s===null){let u=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_invalid_items:${t.over}`);let f=t.outcomes.error;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let i=e.workflow.states[t.body];if(i===void 0){let u=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_body_not_found:${t.body}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=s.slice(0,t.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let f=o[u],m=`${n}[${u}]`,p=e.iteration;e.iteration={item:f,index:u};let _;try{_=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let g=wO(e.outcomes[m]);if(a.push({index:u,value:f,outcome:g}),g===null&&t.stop_on_error){l=!0;break}}let c=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let d=l?"error":"ok";if(e.dal.finishStep(c.id,d,JSON.stringify({iterations:a,count:o.length})),X(e,r,n,d),l){let u=t.outcomes.error;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}return J(e.workflow,t.outcomes.ok)}function wO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Ag,Rg=T(()=>{"use strict";qe();Ag={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>yO(e,e.state)}});import{createHash as EO}from"node:crypto";import{existsSync as TO,mkdirSync as bO,readFileSync as SO,writeFileSync as vO}from"node:fs";import{dirname as kO,isAbsolute as Og,normalize as IO,resolve as ws}from"node:path";import{Document as NO,ExternalHyperlink as xO,HeadingLevel as _n,LevelFormat as AO,Packer as RO,Paragraph as mt,Table as LO,TableCell as OO,TableRow as $O,TextRun as pt,WidthType as CO}from"docx";import{marked as MO}from"marked";async function jO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await DO(e,t,n),o=await PO(e,t),a=await FO(e,t.title),l=await HO(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return bO(kO(o),{recursive:!0}),vO(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:EO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${o}`),X(e,r,n,{output_path:o,path:o,bytes:l.length}),J(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),X(e,r,n,{error:o}),J(e.workflow,t.outcomes?.error??"@terminal:error")}}async function DO(e,t,r){if(typeof t.markdown_source!="string"||t.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ke(t.markdown_source,e,r)).trim(),i=(n.length===0?qO(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=WO(e.project.local_path,i);if(o!==null){if(!TO(o))throw new Error(`markdown_source file not found: ${o}`);return So(SO(o,"utf8"))}return So(i)}async function PO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=UO(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function FO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function UO(e,t){let r=ws(e);return IO(Og(t)?ws(t):ws(r,t))}function WO(e,t){return BO(t)?Og(t)?ws(t):ws(e,t):null}function BO(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function qO(e,t){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(t)?.[1];if(n===void 0)return null;let s=Object.entries(e.transcripts).filter(([o])=>o.startsWith(`${n}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return So(s);let i=e.dal.query(`SELECT sa.content
1855
1855
  FROM step_artifact sa
1856
1856
  JOIN step s ON s.id = sa.step_id
1857
1857
  WHERE s.run_id = ?
@@ -1859,11 +1859,11 @@ ${d}`:d;try{let f=await ys({context:e,stateId:n,member:i,prompt:u,stepId:l.id,ti
1859
1859
  AND sa.content IS NOT NULL
1860
1860
  ORDER BY sa.id DESC
1861
1861
  LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:So(i[0].content)}function So(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function HO(e,t){let r=Cg(MO.lexer(e,{gfm:!0})),n=new NO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new mt("")]:r}]});return RO.toBuffer(n)}function Cg(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new mt({heading:zO(r.depth),children:pr(mr(r))}));break;case"paragraph":t.push(new mt({children:pr(mr(r))}));break;case"text":t.push(new mt({children:mr(r).length===0?[new pt(r.text)]:pr(mr(r))}));break;case"blockquote":t.push(...Cg(mr(r)).map(n=>n instanceof mt?n:new mt({children:[new pt(r.text)]})));break;case"list":VO(r)&&t.push(...JO(r));break;case"table":KO(r)&&t.push(XO(r));break;case"code":YO(r)&&t.push(...GO(r));break;case"hr":t.push(new mt(""));break;case"html":r.text.trim().length>0&&t.push(new mt({children:[new pt(r.text)]}));break;default:break}return t}function pr(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new pt({text:n.text,...pd(t)}));break;case"strong":r.push(...pr(mr(n),{...t,bold:!0}));break;case"em":r.push(...pr(mr(n),{...t,italics:!0}));break;case"codespan":r.push(new pt({text:n.text,...pd({...t,code:!0})}));break;case"link":r.push(new xO({link:n.href,children:pr(mr(n),{...t})}));break;case"br":r.push(new pt({text:"",break:1}));break;case"image":r.push(new pt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new pt({text:n.text,strike:!0}));break;default:r.push(new pt({text:n.raw,...pd(t)}));break}return r.length===0?[new pt("")]:r}function pd(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function JO(e){return e.items.map(t=>new mt({children:pr(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Lg(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Lg(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Lg(e){return e.task?`[${e.checked?"x":" "}] `:""}function XO(e){let t=[e.header,...e.rows].map(r=>new $O({children:r.map(n=>new OO({children:[new mt({children:pr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new LO({width:{size:100,type:CO.PERCENTAGE},rows:t})}function GO(e){return e.text.split(`
1862
- `).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function mr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function VO(e){return e.type==="list"&&Array.isArray(e.items)}function KO(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function YO(e){return e.type==="code"&&typeof e.text=="string"}function zO(e){switch(e){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var $g,Mg=T(()=>{"use strict";Be();$g={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async e=>jO(e,e.state)}});import{createHash as ZO}from"node:crypto";import{existsSync as QO,mkdirSync as e$,readFileSync as jg,statSync as t$}from"node:fs";import{dirname as r$,isAbsolute as Dg,normalize as n$,resolve as Es}from"node:path";import{marked as s$}from"marked";import i$ from"write-excel-file/node";async function o$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await a$(e,t),o=l$(t.input_format),a=await c$(e,t),l=await d$(e,t.title),c=o==="markdown"?w$(i):p$(i);await E$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=t$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=ZO("sha256").update(jg(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),X(e,r,n,{output_path:a,path:a,bytes:d}),J(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),X(e,r,n,{error:o}),J(e.workflow,t.outcomes?.error??"@terminal:error")}}async function a$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ke(t.source,e,e.stateId)).trim(),n=f$(e.project.local_path,r);if(n!==null){if(!QO(n))throw new Error(`source file not found: ${n}`);return jg(n,"utf8")}return r}function l$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function c$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=u$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function d$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function u$(e,t){let r=Es(e);return n$(Dg(t)?Es(t):Es(r,t))}function f$(e,t){return m$(t)?Dg(t)?Es(t):Es(e,t):null}function m$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function p$(e){if(e.trim().length===0)return[];let t;try{t=JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!vo(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>_$(r,n))}function _$(e,t){if(!vo(e))throw new Error(`sheets[${t}] must be an object`);let r=h$(e.headers,`sheets[${t}].headers`),n=g$(e.rows,`sheets[${t}].rows`);return{name:typeof e.name=="string"&&e.name.trim().length>0?e.name:`Sheet${t+1}`,headers:r,rows:n,headerStyle:y$(e.styles)}}function h$(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))throw new Error(`${t} must be an array of strings`);return e}function g$(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new Error(`${t} must be an array`);return e.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${t}[${n}] must be an array`);return r.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${t}[${n}][${i}] must be string, number, boolean, or null`)})})}function y$(e){if(!vo(e)||!vo(e.headers))return;let t={};return e.headers.bold===!0&&(t.bold=!0),typeof e.headers.fill=="string"&&(t.fill=e.headers.fill),Object.keys(t).length===0?void 0:t}function w$(e){let t=s$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(N$(s)){n=s.text;continue}x$(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function E$(e){e$(r$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:v$(n.name,t),data:T$(n),columns:S$(n)}));await i$(r).toFile(e.outputPath)}function T$(e){let t=[];if(e.headers.length>0){let r=I$(e.headerStyle?.fill);t.push(e.headers.map(n=>({value:n,type:String,fontWeight:e.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of e.rows)t.push(r.map(b$));return t.length===0?[[{}]]:t}function b$(e){return e===null?{}:typeof e=="string"?{value:e,type:String}:typeof e=="number"?{value:e,type:Number}:typeof e=="boolean"?{value:e,type:Boolean}:{}}function S$(e){let t=Math.max(e.headers.length,...e.rows.map(n=>n.length),1),r=[];for(let n=1;n<=t;n+=1){let s=[e.headers[n-1],...e.rows.map(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function v$(e,t){let r=k$(e),n=r,s=2;for(;t.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return t.add(n.toLowerCase()),n}function k$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function I$(e){if(e===void 0)return null;let t=e.startsWith("#")?e.slice(1):e;return/^[0-9a-fA-F]{6}$/.test(t)?`#${t.toUpperCase()}`:null}function N$(e){return e.type==="heading"&&typeof e.text=="string"}function x$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function vo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Pg,Fg=T(()=>{"use strict";Be();Pg={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async e=>o$(e,e.state)}});import{spawnSync as A$}from"node:child_process";async function L$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(A$("sh",["-c",f.command],{cwd:e.project.local_path}).status!==0){let p=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),X(e,r,n,"fail_pre_check");let _=t.outcomes.fail_pre_check;return _!==void 0?J(e.workflow,_):{kind:"terminal",terminal:Y(e.workflow)}}let i=pn(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await mn(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1862
+ `).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function mr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function VO(e){return e.type==="list"&&Array.isArray(e.items)}function KO(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function YO(e){return e.type==="code"&&typeof e.text=="string"}function zO(e){switch(e){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var $g,Mg=T(()=>{"use strict";qe();$g={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async e=>jO(e,e.state)}});import{createHash as ZO}from"node:crypto";import{existsSync as QO,mkdirSync as e$,readFileSync as jg,statSync as t$}from"node:fs";import{dirname as r$,isAbsolute as Dg,normalize as n$,resolve as Es}from"node:path";import{marked as s$}from"marked";import i$ from"write-excel-file/node";async function o$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await a$(e,t),o=l$(t.input_format),a=await c$(e,t),l=await d$(e,t.title),c=o==="markdown"?w$(i):p$(i);await E$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=t$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=ZO("sha256").update(jg(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),X(e,r,n,{output_path:a,path:a,bytes:d}),J(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),X(e,r,n,{error:o}),J(e.workflow,t.outcomes?.error??"@terminal:error")}}async function a$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ke(t.source,e,e.stateId)).trim(),n=f$(e.project.local_path,r);if(n!==null){if(!QO(n))throw new Error(`source file not found: ${n}`);return jg(n,"utf8")}return r}function l$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function c$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=u$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function d$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function u$(e,t){let r=Es(e);return n$(Dg(t)?Es(t):Es(r,t))}function f$(e,t){return m$(t)?Dg(t)?Es(t):Es(e,t):null}function m$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function p$(e){if(e.trim().length===0)return[];let t;try{t=JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!vo(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>_$(r,n))}function _$(e,t){if(!vo(e))throw new Error(`sheets[${t}] must be an object`);let r=h$(e.headers,`sheets[${t}].headers`),n=g$(e.rows,`sheets[${t}].rows`);return{name:typeof e.name=="string"&&e.name.trim().length>0?e.name:`Sheet${t+1}`,headers:r,rows:n,headerStyle:y$(e.styles)}}function h$(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))throw new Error(`${t} must be an array of strings`);return e}function g$(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new Error(`${t} must be an array`);return e.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${t}[${n}] must be an array`);return r.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${t}[${n}][${i}] must be string, number, boolean, or null`)})})}function y$(e){if(!vo(e)||!vo(e.headers))return;let t={};return e.headers.bold===!0&&(t.bold=!0),typeof e.headers.fill=="string"&&(t.fill=e.headers.fill),Object.keys(t).length===0?void 0:t}function w$(e){let t=s$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(N$(s)){n=s.text;continue}x$(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function E$(e){e$(r$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:v$(n.name,t),data:T$(n),columns:S$(n)}));await i$(r).toFile(e.outputPath)}function T$(e){let t=[];if(e.headers.length>0){let r=I$(e.headerStyle?.fill);t.push(e.headers.map(n=>({value:n,type:String,fontWeight:e.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of e.rows)t.push(r.map(b$));return t.length===0?[[{}]]:t}function b$(e){return e===null?{}:typeof e=="string"?{value:e,type:String}:typeof e=="number"?{value:e,type:Number}:typeof e=="boolean"?{value:e,type:Boolean}:{}}function S$(e){let t=Math.max(e.headers.length,...e.rows.map(n=>n.length),1),r=[];for(let n=1;n<=t;n+=1){let s=[e.headers[n-1],...e.rows.map(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function v$(e,t){let r=k$(e),n=r,s=2;for(;t.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return t.add(n.toLowerCase()),n}function k$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function I$(e){if(e===void 0)return null;let t=e.startsWith("#")?e.slice(1):e;return/^[0-9a-fA-F]{6}$/.test(t)?`#${t.toUpperCase()}`:null}function N$(e){return e.type==="heading"&&typeof e.text=="string"}function x$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function vo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Pg,Fg=T(()=>{"use strict";qe();Pg={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async e=>o$(e,e.state)}});import{spawnSync as A$}from"node:child_process";async function L$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(A$("sh",["-c",f.command],{cwd:e.project.local_path}).status!==0){let p=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),X(e,r,n,"fail_pre_check");let _=t.outcomes.fail_pre_check;return _!==void 0?J(e.workflow,_):{kind:"terminal",terminal:Y(e.workflow)}}let i=pn(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await mn(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1863
1863
  ${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=ng(p.text);if(g!==null){let h=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(h.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let S=Object.keys(t.outcomes_from_stance),y=_s(p.text,S);if(y.outcome===null){let I=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(I.id,null,`unhandled_stance:${y.reason}`),{kind:"escalate",token:"",reason:`no_stance:${y.reason}`}}let w=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(w.id,y.outcome,"outcomes_from_stance"),X(e,r,n,y.outcome),J(e.workflow,t.outcomes_from_stance[y.outcome])}let g=_s(p.text,R$);if(g.outcome!==null){let S=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(S.id,g.outcome,"default_failure_stance"),X(e,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let h=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(h.id,"approve","no_reviewers"),X(e,r,n,"approve"),t.write_back_durable_memory){let S=e.membersByAlias.get(t.coder.alias);S!==void 0&&await Vt(e,n,S,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.approve)}let _=await Promise.all(o.map(g=>mn(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1864
1864
  ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve",`loop=${f}`),X(e,r,n,"approve"),t.write_back_durable_memory){let h=e.membersByAlias.get(t.coder.alias);h!==void 0&&await Vt(e,n,h,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.approve)}if(a=_.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1865
1865
 
1866
- `),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),X(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var R$,Ug,Wg=T(()=>{"use strict";ld();Be();R$=["blocked","failed","aborted"],Ug={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>L$(e,e.state)}});import{spawnSync as O$}from"node:child_process";async function $$(e,t){let r=e.stateId,n=e.displayName,s=await Ke(t.command,e,n),i=fd(e,n),o=_g(s);if(o.matched&&!i){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=O$("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&md(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),X(e,r,n,m),J(e.workflow,p))}var Bg,qg=T(()=>{"use strict";Be();Bg={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async e=>$$(e,e.state)}});async function C$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=ct(i.definition),a=await M$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};X(e,r,n,j$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:J(e.workflow,d)}async function M$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await lg(s,e);r[n]=i===s?await Eo(s,e):i}return r}function j$(e,t,r){let n={};for(let s of r)n[s.name]=D$(e,t,s);return n}function D$(e,t,r){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,r.source_step_id)[0];if(s===void 0)return null;let i=P$(s,r.source_field);if(i.found)return i.value;let a=e.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function P$(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Hg,Jg=T(()=>{"use strict";cs();Be();hs();Hg={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async e=>C$(e,e.state)}});function F$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),X(e,r,n,s),{kind:"terminal",terminal:s}}var Xg,Gg=T(()=>{"use strict";Be();Xg={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:e=>F$(e,e.state)}});async function U$(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",r=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${t}/${r}/issues`);n.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&n.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&n.searchParams.set("since",e.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=W$(e.cursor),a=i.filter(B$).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function W$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function B$(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var Vg,Kg=T(()=>{"use strict";Vg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async e=>U$(e)}});async function q$(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===r?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:t}]}}var Yg,zg=T(()=>{"use strict";Yg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async e=>q$(e)}});function Zg(e){e.register(gg),e.register(Ug),e.register(Tg),e.register(Ng),e.register(Ag),e.register($g),e.register(Pg),e.register(Bg),e.register(wg),e.register(Sg),e.register(Hg),e.register(Xg),e.register(Yg),e.register(Vg)}var Qg=T(()=>{"use strict";yg();Eg();bg();kg();xg();Rg();Mg();Fg();Wg();qg();Jg();Gg();Kg();zg()});function ey(){return ko===null&&(ko=new _d,Zg(ko)),ko}var H$,_d,ko,ty=T(()=>{"use strict";Qg();H$={Review:"lmctl/review",Consolidate:"lmctl/consolidate",Interactive:"lmctl/interactive",Loop:"lmctl/loop",ShellStep:"lmctl/shell-step",AssertRepoClean:"lmctl/assert-repo-clean",Choice:"lmctl/choice",ForEach:"lmctl/foreach",Subflow:"lmctl/subflow",Terminal:"lmctl/terminal"},_d=class{types=new Map;register(t){let r=`${t.description.namespace}/${t.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,t)}get(t){let r=t.includes("/")?t:H$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ko=null});async function sy(e){cy(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let r=e.dal.getProjectByJob(e.job.id);if(r===null)throw new Error(`job ${e.job.id} has no project`);let n=X$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Ts(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=Yh(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(e.members.map(m=>[m.alias,m]));if(Ts(n)){let m=hd({dal:e.dal,workflow:No(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:fr(e.job.payload)??{},team_id:e.team.id}),p=await oy(n,m,o.current_state??n.entry_step_id);return ny(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=hd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:fr(e.job.payload)??{},team_id:e.team.id}),f=await iy(u,o.current_state??n.start_at);return ny(e.dal,r.id,o.id,n.name,f),f}function ny(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function hd(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let i=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await gd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{cy(n);let i=Ts(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=hd({dal:e.dal,workflow:Ts(n)?No(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Ts(n)?oy(n,a,o.current_state??n.entry_step_id):iy(a,o.current_state??n.start_at)}};return t}async function iy(e,t){let r=t;if(r.startsWith(gs))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Kt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=Io(e,Y(e.workflow));if(l.kind==="paused")return Ce(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),Ce(e);if(l.kind==="terminal")return Kt(e,l.terminal);r=l.state;continue}let o,a=ly(e,r);if(a!==null){let l=q(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),X(e,r,r,a),a===Jn)return Kt(e,il);let c=i.outcomes?.[a];o=c!==void 0?J(e.workflow,c):tt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await gd(e,r,i);if(o.kind==="paused")return Ce(e);if(o.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},o.token,o.reason),Ce(e);if(o.kind==="terminal"){let l=Io(e,o.terminal);if(l.kind==="paused")return Ce(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},l.token,l.reason),Ce(e);if(l.kind==="terminal")return Kt(e,l.terminal);r=l.state;continue}r=o.state}e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})});let n=Io(e,Y(e.workflow));return n.kind==="terminal"?Kt(e,n.terminal):Kt(e,Y(e.workflow))}async function oy(e,t,r){let n=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=n.get(i);if(a===void 0)return tt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ce(t);let l=ly(t,a.id);if(l!==null){let m=q(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),X(t,a.id,a.name,l),l===Jn)return Kt(t,il);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Ce(t);i=_;continue}let c=await J$(t,e,a);if(c.kind==="paused")return Ce(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Ce(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=No(e,a);try{let p=Io(t,u);if(p.kind==="paused")return Ce(t);if(p.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ce(t);if(p.kind==="terminal")return Kt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ce(t);i=_.id;continue}finally{t.workflow=m}}if(Vr(u))return tt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ce(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ce(t);i=f}return t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})}),Kt(t,"aborted")}async function J$(e,t,r){let n=ay(t,r),s=e.workflow;e.workflow=No(t,r);try{return await gd(e,r.id,n,r.name)}finally{e.workflow=s}}function ay(e,t){let r=t.parameters,n=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:t.type,...r}}}async function gd(e,t,r,n){let s=ey().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?K$(e,s):void 0,e.progress_step_id=null;try{return await s.execute(mg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function X$(e,t){try{let r=JSON.parse(e);if(V$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Ts(e){return e.definition_schema_version===3}function No(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=ay(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:G$(t.parameters.kind)}),n.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:n,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function G$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function V$(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function K$(e,t){let r=`progress.${t.description.namespace}/${t.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Kt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Xh(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function Ce(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function ly(e,t){let n=e.dal.getRun(e.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function Io(e,t){if(!Y$(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let r=e.workflow.errors;return r===void 0?{kind:"terminal",terminal:t}:(e.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&z$(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Y$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function z$(e,t,r){let n=Z$(e),s=r.capture_evidence&&n!==null?Q$(e,n.id):[];e.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function Z$(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function Q$(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(n=>n.path)}function cy(e){if(!ry.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${ry.join(", ")}`)}var ry,dy=T(()=>{"use strict";cn();Gh();zh();Be();ty();Xn();ry=[1,2,3]});import{readFileSync as eC,readdirSync as tC}from"node:fs";import{basename as rC,join as nC,resolve as sC}from"node:path";function my(e={}){let t=sC(e.workflowsDir??"workflows"),r=tC(t).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:r.map(n=>iC(nC(t,n)))}}function iC(e){let t=rC(e);try{let r=eC(e,"utf8"),n=ct(r);return hy(t,n)}catch(r){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gy(r)}}}function py(e,t){try{let r=ct(t);return hy(e,r)}catch(r){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gy(r)}}}function _y(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
1866
+ `),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),X(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var R$,Ug,Wg=T(()=>{"use strict";ld();qe();R$=["blocked","failed","aborted"],Ug={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>L$(e,e.state)}});import{spawnSync as O$}from"node:child_process";async function $$(e,t){let r=e.stateId,n=e.displayName,s=await Ke(t.command,e,n),i=fd(e,n),o=_g(s);if(o.matched&&!i){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=O$("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&md(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),X(e,r,n,m),J(e.workflow,p))}var Bg,qg=T(()=>{"use strict";qe();Bg={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async e=>$$(e,e.state)}});async function C$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=ct(i.definition),a=await M$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};X(e,r,n,j$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:J(e.workflow,d)}async function M$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await lg(s,e);r[n]=i===s?await Eo(s,e):i}return r}function j$(e,t,r){let n={};for(let s of r)n[s.name]=D$(e,t,s);return n}function D$(e,t,r){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,r.source_step_id)[0];if(s===void 0)return null;let i=P$(s,r.source_field);if(i.found)return i.value;let a=e.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function P$(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Hg,Jg=T(()=>{"use strict";cs();qe();hs();Hg={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async e=>C$(e,e.state)}});function F$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),X(e,r,n,s),{kind:"terminal",terminal:s}}var Xg,Gg=T(()=>{"use strict";qe();Xg={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:e=>F$(e,e.state)}});async function U$(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",r=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${t}/${r}/issues`);n.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&n.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&n.searchParams.set("since",e.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=W$(e.cursor),a=i.filter(B$).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function W$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function B$(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var Vg,Kg=T(()=>{"use strict";Vg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async e=>U$(e)}});async function q$(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===r?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:t}]}}var Yg,zg=T(()=>{"use strict";Yg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async e=>q$(e)}});function Zg(e){e.register(gg),e.register(Ug),e.register(Tg),e.register(Ng),e.register(Ag),e.register($g),e.register(Pg),e.register(Bg),e.register(wg),e.register(Sg),e.register(Hg),e.register(Xg),e.register(Yg),e.register(Vg)}var Qg=T(()=>{"use strict";yg();Eg();bg();kg();xg();Rg();Mg();Fg();Wg();qg();Jg();Gg();Kg();zg()});function ey(){return ko===null&&(ko=new _d,Zg(ko)),ko}var H$,_d,ko,ty=T(()=>{"use strict";Qg();H$={Review:"lmctl/review",Consolidate:"lmctl/consolidate",Interactive:"lmctl/interactive",Loop:"lmctl/loop",ShellStep:"lmctl/shell-step",AssertRepoClean:"lmctl/assert-repo-clean",Choice:"lmctl/choice",ForEach:"lmctl/foreach",Subflow:"lmctl/subflow",Terminal:"lmctl/terminal"},_d=class{types=new Map;register(t){let r=`${t.description.namespace}/${t.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,t)}get(t){let r=t.includes("/")?t:H$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ko=null});async function sy(e){cy(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let r=e.dal.getProjectByJob(e.job.id);if(r===null)throw new Error(`job ${e.job.id} has no project`);let n=X$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Ts(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=Yh(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(e.members.map(m=>[m.alias,m]));if(Ts(n)){let m=hd({dal:e.dal,workflow:No(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:fr(e.job.payload)??{},team_id:e.team.id}),p=await oy(n,m,o.current_state??n.entry_step_id);return ny(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=hd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:fr(e.job.payload)??{},team_id:e.team.id}),f=await iy(u,o.current_state??n.start_at);return ny(e.dal,r.id,o.id,n.name,f),f}function ny(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function hd(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let i=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await gd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{cy(n);let i=Ts(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=hd({dal:e.dal,workflow:Ts(n)?No(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Ts(n)?oy(n,a,o.current_state??n.entry_step_id):iy(a,o.current_state??n.start_at)}};return t}async function iy(e,t){let r=t;if(r.startsWith(gs))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Kt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=Io(e,Y(e.workflow));if(l.kind==="paused")return Me(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(e);if(l.kind==="terminal")return Kt(e,l.terminal);r=l.state;continue}let o,a=ly(e,r);if(a!==null){let l=q(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),X(e,r,r,a),a===Jn)return Kt(e,il);let c=i.outcomes?.[a];o=c!==void 0?J(e.workflow,c):tt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await gd(e,r,i);if(o.kind==="paused")return Me(e);if(o.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},o.token,o.reason),Me(e);if(o.kind==="terminal"){let l=Io(e,o.terminal);if(l.kind==="paused")return Me(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},l.token,l.reason),Me(e);if(l.kind==="terminal")return Kt(e,l.terminal);r=l.state;continue}r=o.state}e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})});let n=Io(e,Y(e.workflow));return n.kind==="terminal"?Kt(e,n.terminal):Kt(e,Y(e.workflow))}async function oy(e,t,r){let n=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=n.get(i);if(a===void 0)return tt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Me(t);let l=ly(t,a.id);if(l!==null){let m=q(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),X(t,a.id,a.name,l),l===Jn)return Kt(t,il);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(t);i=_;continue}let c=await J$(t,e,a);if(c.kind==="paused")return Me(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Me(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=No(e,a);try{let p=Io(t,u);if(p.kind==="paused")return Me(t);if(p.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(t);if(p.kind==="terminal")return Kt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(t);i=_.id;continue}finally{t.workflow=m}}if(Vr(u))return tt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);i=f}return t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})}),Kt(t,"aborted")}async function J$(e,t,r){let n=ay(t,r),s=e.workflow;e.workflow=No(t,r);try{return await gd(e,r.id,n,r.name)}finally{e.workflow=s}}function ay(e,t){let r=t.parameters,n=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:t.type,...r}}}async function gd(e,t,r,n){let s=ey().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?K$(e,s):void 0,e.progress_step_id=null;try{return await s.execute(mg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function X$(e,t){try{let r=JSON.parse(e);if(V$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Ts(e){return e.definition_schema_version===3}function No(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=ay(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:G$(t.parameters.kind)}),n.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:n,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function G$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function V$(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function K$(e,t){let r=`progress.${t.description.namespace}/${t.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Kt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Xh(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function Me(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function ly(e,t){let n=e.dal.getRun(e.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function Io(e,t){if(!Y$(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let r=e.workflow.errors;return r===void 0?{kind:"terminal",terminal:t}:(e.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&z$(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Y$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function z$(e,t,r){let n=Z$(e),s=r.capture_evidence&&n!==null?Q$(e,n.id):[];e.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function Z$(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function Q$(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(n=>n.path)}function cy(e){if(!ry.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${ry.join(", ")}`)}var ry,dy=T(()=>{"use strict";cn();Gh();zh();qe();ty();Xn();ry=[1,2,3]});import{readFileSync as eC,readdirSync as tC}from"node:fs";import{basename as rC,join as nC,resolve as sC}from"node:path";function my(e={}){let t=sC(e.workflowsDir??"workflows"),r=tC(t).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:r.map(n=>iC(nC(t,n)))}}function iC(e){let t=rC(e);try{let r=eC(e,"utf8"),n=ct(r);return hy(t,n)}catch(r){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gy(r)}}}function py(e,t){try{let r=ct(t);return hy(e,r)}catch(r){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gy(r)}}}function _y(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
1867
1867
  `)}
1868
1868
  `}function hy(e,t){let r=aC(t),n=lC(t);if(r===null||n===null)return{file:e,workflow_name:t.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=oC(t.inputs);return s.length>0?{file:e,workflow_name:t.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:e,workflow_name:t.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function oC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function aC(e){return yd(e)?e.entry_step_id:e.start_at}function lC(e){return yd(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function yd(e){return e.definition_schema_version===3}function gy(e){return e instanceof Gt?e.issues.map(t=>`${t.path}: ${t.message}`).join("; "):e instanceof SyntaxError?`JSON parse failed: ${e.message}`:e instanceof Error?e.message:String(e)}function yy(e){let t=new Set;if(yd(e))for(let r of e.steps){let n=r.members??{};uy(n,t)}else for(let r of Object.values(e.states))uy(r,t);return[...t].sort()}function uy(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=fy(i);o!==null&&t.add(o)}for(let s of n){let i=e[s];if(Array.isArray(i))for(let o of i){let a=fy(o);a!==null&&t.add(a)}}}function fy(e){if(e===null||typeof e!="object")return null;let t=e.alias;return typeof t=="string"&&t.length>0?t:null}var xo=T(()=>{"use strict";cs()});function cC({dal:e}){let t=e.listProjects();for(let r of t){let s=e.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,Ao)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=dC(e,r,o);if(a<20)continue;let c=o??"initial",d=`${bs}:${r.id}:${c}`;e.enqueueJob({project_id:r.id,source:Ao,source_ref:bs,payload:JSON.stringify({kind:bs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function dC(e,t,r){let n=e.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1869
1869
  FROM run r
@@ -1955,7 +1955,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1955
1955
  WHERE run_id = ?
1956
1956
  AND acknowledged_at IS NULL
1957
1957
  AND requires_user = 1
1958
- ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Xo=T(()=>{"use strict"});function vw(e,t){e.all("/runtime/*",r=>JM(r.req.raw,t))}async function JM(e,t){try{return Response.json(await XM(e,t))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function XM(e,t){let r=new URL(e.url),n=QM(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return Md(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Go(e,n.id,s[2]),GM(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Go(e,n.id,s[2]);let i=hw(t.dal,s[4]);return _w(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return Md(e),t.dal.listTeams().map(i=>ZM(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=gw(t.dal,yw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead chat body does not match route team");return Ew(e,n.id,o.context),ww(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=gw(t.dal,yw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead message body does not match route team");Ew(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return ww(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Go(e,n.id,s[2]);let i=hw(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new se(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return YM(t.dal,i,a),_w(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ss(e,n.id),t.dal.listWorkflows().map(i=>ej(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ss(e,n.id);let i=rj(t.dal,s[2]);return tj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ss(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return nj(t.dal,i,o).map(l=>bw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ss(e,n.id);let i=Tw(t.dal,s[2]);return bw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ss(e,n.id);let i=Tw(t.dal,s[2]),o=ij(t.dal,i);return{runId:Ud(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function GM(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>kw(e,t,r))}}function _w(e,t,r){let n=kw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:VM(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:KM(e,r)}}function kw(e,t,r){let n=Iw(e,r.id),s=Dd(n);return{id:r.name,workspaceId:t.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function VM(e,t){let r=Iw(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Dd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function KM(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function YM(e,t,r){let n=zM(e,t.id);if(n!==null){let s=Jo(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new se(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=kt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new se(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Iw(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function zM(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",t)[0]??null}function Dd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function hw(e,t){let r=e.findProjectByName(t);if(r===null)throw new se(404,`project not found: ${t}`);return r}function gw(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new se(404,`team not found: ${t}`);return r}function yw(e){return e.startsWith("team:")?e.slice(5):e}function ZM(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ww(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Sw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function QM(e){let t=e.workspaceName??Dt()??Sr.default;return{id:t,name:t}}function Md(e){if(e.headers.get("x-lmctl-workspace-id")!==Sw)throw new se(400,"runtime request requires global-admin workspace identity")}function Go(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new se(400,"runtime workspace identity does not match route")}function Ss(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==t)throw new se(400,"runtime workspace identity does not match server workspace")}function Ew(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Go(e,t,r.workspaceId);return}Md(e)}function Pd(e){return`${En}${Fd(e.name)}`}function Fd(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Ud(e){return`${jd}${e.id}`}function ej(e){let t=Vo(e.definition);return{id:Pd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function tj(e){let t=Vo(e.definition);return{id:Pd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Vo(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function rj(e,t){if(!t.startsWith(En))throw new se(404,`template not found: ${t}`);let r=t.slice(En.length),n=e.listWorkflows().filter(s=>Fd(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new se(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Tw(e,t){if(!t.startsWith(jd))throw new se(404,`run not found: ${t}`);let r=t.slice(jd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new se(404,`run not found: ${t}`);return s}function nj(e,t,r){if(r!==null){if(!r.startsWith(En))return[];let s=r.slice(En.length),i=e.listWorkflows().filter(a=>Fd(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function bw(e,t){let r=e.getWorkflow(t.workflow_id),n=Dd(t),s=sj(r,t);return{id:Ud(t),templateId:r===null?`${En}unknown`:Pd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function sj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Vo(e.definition).nameToId.get(r)??r]}function ij(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Vo(r.definition),s=c=>n.nameToId.get(c)??c,i=Ud(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=oj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function oj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Sw,En,jd,se,Nw=T(()=>{"use strict";Je();Xo();Jt();Sw="global-admin";En="template:",jd="run:";se=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as aj,writeFileSync as lj}from"node:fs";import{randomUUID as xw}from"node:crypto";import{dirname as cj,resolve as Ko,sep as Aw}from"node:path";async function Lw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!pj(n))return e.text("missing image file",400);if(n.size>dj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=_j(s);if(i===null||!(i in Rw))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=uj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Ko(mj()):Ko(o.local_path),l=Ko(a,"uploads",xw()),c=Ko(l,`${xw()}${Rw[i]}`);if(!fj(c,a))return e.text("invalid upload path",400);aj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);lj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function uj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function fj(e,t){let r=t.endsWith(Aw)?t:`${t}${Aw}`;return e.startsWith(r)}function mj(){return cj(le())}function pj(e){return typeof File<"u"&&e instanceof File}function _j(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var dj,Rw,Ow=T(()=>{"use strict";Je();dj=10*1024*1024,Rw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Yo}from"node:fs";import{basename as hj,dirname as gj,extname as yj,isAbsolute as wj,join as Ej,relative as Tj}from"node:path";import{fileURLToPath as bj}from"node:url";import{Hono as Sj}from"hono";import{serveStatic as Nt}from"@hono/node-server/serve-static";function Fw(e){let t=new Sj,r=[],n=e.localWebui!==void 0?Bd(e.localWebui.webuiDir):vj();if(e.localWebui!==void 0&&Hy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=kj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Nt({root:n})),t.use("/vendor/*",s,Nt({root:n})),t.use("/src/*",s,Nt({root:n})),t.get("/",s,Nt({root:n,path:"index.html"})),t.get("/admin",s,Nt({root:n,path:"index.html"})),t.get("/admin/*",s,Nt({root:n,path:"index.html"})),t.get("/terminal",s,Nt({root:n,path:"index.html"})),t.get("/terminal/*",s,Nt({root:n,path:"index.html"})),t.get("/chat",s,Nt({root:n,path:"index.html"})),t.get("/chat/*",s,Nt({root:n,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",Eh()),t.get("/login",s=>s.html(Ae("Login",`
1958
+ ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Xo=T(()=>{"use strict"});function vw(e,t){e.all("/runtime/*",r=>JM(r.req.raw,t))}async function JM(e,t){try{return Response.json(await XM(e,t))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function XM(e,t){let r=new URL(e.url),n=QM(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return Md(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Go(e,n.id,s[2]),GM(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Go(e,n.id,s[2]);let i=hw(t.dal,s[4]);return _w(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return Md(e),t.dal.listTeams().map(i=>ZM(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=gw(t.dal,yw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead chat body does not match route team");return Ew(e,n.id,o.context),ww(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=gw(t.dal,yw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead message body does not match route team");Ew(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return ww(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Go(e,n.id,s[2]);let i=hw(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new se(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return YM(t.dal,i,a),_w(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ss(e,n.id),t.dal.listWorkflows().map(i=>ej(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ss(e,n.id);let i=rj(t.dal,s[2]);return tj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ss(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return nj(t.dal,i,o).map(l=>bw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ss(e,n.id);let i=Tw(t.dal,s[2]);return bw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ss(e,n.id);let i=Tw(t.dal,s[2]),o=ij(t.dal,i);return{runId:Ud(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function GM(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>kw(e,t,r))}}function _w(e,t,r){let n=kw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:VM(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:KM(e,r)}}function kw(e,t,r){let n=Iw(e,r.id),s=Dd(n);return{id:r.name,workspaceId:t.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function VM(e,t){let r=Iw(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Dd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function KM(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function YM(e,t,r){let n=zM(e,t.id);if(n!==null){let s=Jo(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new se(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=kt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new se(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Iw(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function zM(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",t)[0]??null}function Dd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function hw(e,t){let r=e.findProjectByName(t);if(r===null)throw new se(404,`project not found: ${t}`);return r}function gw(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new se(404,`team not found: ${t}`);return r}function yw(e){return e.startsWith("team:")?e.slice(5):e}function ZM(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ww(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Sw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function QM(e){let t=e.workspaceName??Dt()??Sr.default;return{id:t,name:t}}function Md(e){if(e.headers.get("x-lmctl-workspace-id")!==Sw)throw new se(400,"runtime request requires global-admin workspace identity")}function Go(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new se(400,"runtime workspace identity does not match route")}function Ss(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==t)throw new se(400,"runtime workspace identity does not match server workspace")}function Ew(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Go(e,t,r.workspaceId);return}Md(e)}function Pd(e){return`${En}${Fd(e.name)}`}function Fd(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Ud(e){return`${jd}${e.id}`}function ej(e){let t=Vo(e.definition);return{id:Pd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function tj(e){let t=Vo(e.definition);return{id:Pd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Vo(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function rj(e,t){if(!t.startsWith(En))throw new se(404,`template not found: ${t}`);let r=t.slice(En.length),n=e.listWorkflows().filter(s=>Fd(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new se(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Tw(e,t){if(!t.startsWith(jd))throw new se(404,`run not found: ${t}`);let r=t.slice(jd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new se(404,`run not found: ${t}`);return s}function nj(e,t,r){if(r!==null){if(!r.startsWith(En))return[];let s=r.slice(En.length),i=e.listWorkflows().filter(a=>Fd(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function bw(e,t){let r=e.getWorkflow(t.workflow_id),n=Dd(t),s=sj(r,t);return{id:Ud(t),templateId:r===null?`${En}unknown`:Pd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function sj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Vo(e.definition).nameToId.get(r)??r]}function ij(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Vo(r.definition),s=c=>n.nameToId.get(c)??c,i=Ud(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=oj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function oj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Sw,En,jd,se,Nw=T(()=>{"use strict";Xe();Xo();Jt();Sw="global-admin";En="template:",jd="run:";se=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as aj,writeFileSync as lj}from"node:fs";import{randomUUID as xw}from"node:crypto";import{dirname as cj,resolve as Ko,sep as Aw}from"node:path";async function Lw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!pj(n))return e.text("missing image file",400);if(n.size>dj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=_j(s);if(i===null||!(i in Rw))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=uj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Ko(mj()):Ko(o.local_path),l=Ko(a,"uploads",xw()),c=Ko(l,`${xw()}${Rw[i]}`);if(!fj(c,a))return e.text("invalid upload path",400);aj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);lj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function uj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function fj(e,t){let r=t.endsWith(Aw)?t:`${t}${Aw}`;return e.startsWith(r)}function mj(){return cj(le())}function pj(e){return typeof File<"u"&&e instanceof File}function _j(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var dj,Rw,Ow=T(()=>{"use strict";Xe();dj=10*1024*1024,Rw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Yo}from"node:fs";import{basename as hj,dirname as gj,extname as yj,isAbsolute as wj,join as Ej,relative as Tj}from"node:path";import{fileURLToPath as bj}from"node:url";import{Hono as Sj}from"hono";import{serveStatic as Nt}from"@hono/node-server/serve-static";function Fw(e){let t=new Sj,r=[],n=e.localWebui!==void 0?Bd(e.localWebui.webuiDir):vj();if(e.localWebui!==void 0&&Hy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=kj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Nt({root:n})),t.use("/vendor/*",s,Nt({root:n})),t.use("/src/*",s,Nt({root:n})),t.get("/",s,Nt({root:n,path:"index.html"})),t.get("/admin",s,Nt({root:n,path:"index.html"})),t.get("/admin/*",s,Nt({root:n,path:"index.html"})),t.get("/terminal",s,Nt({root:n,path:"index.html"})),t.get("/terminal/*",s,Nt({root:n,path:"index.html"})),t.get("/chat",s,Nt({root:n,path:"index.html"})),t.get("/chat/*",s,Nt({root:n,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",Eh()),t.get("/login",s=>s.html(Ae("Login",`
1959
1959
  <h1>Login</h1>
1960
1960
  <form method="post" action="/login">
1961
1961
  <label>Token <input name="token" type="password"></label>
@@ -2019,8 +2019,8 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
2019
2019
  ORDER BY started_at DESC, id DESC
2020
2020
  LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===zw())?Ft(s.holder_pid)?s:null:Yw(s)?s:null}function Yw(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=eE():!1}function Qw(e,t){return e.holder_pid===null?e.started_at<t:!Ft(e.holder_pid)}function eE(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Vw;let r=Number(t);return!Number.isFinite(r)||r<=0?Vw:r}function iD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return Kw;let r=Number(t);return!Number.isFinite(r)||r<=0?Kw:r}var Vw,Kw,Fr=T(()=>{"use strict";Qs();Vw=8*60*60*1e3,Kw=12e4});async function $(e,t){if(e.dal!==void 0)return t(e.dal);let r=Ie({path:le()});try{return await t(r)}finally{r.close()}}function Z(e,t,r=["--json"]){let n=new Set(t),s=new Set(r),i=[],o={};for(let a=0;a<e.length;a+=1){let l=e[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=e[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function P(e,t){let r=e.flags[t];return typeof r=="string"?r:void 0}function G(e,t){return e.flags[t]===!0}function ae(e,t){e.stdout.write(`${JSON.stringify(t,null,2)}
2021
2021
  `)}function v(e,t){return e.stderr.write(`error: ${t}
2022
- `),1}function Me(e,t){let r=t instanceof Error?t.message:String(t);return e.stderr.write(`internal error: ${r}
2023
- `),2}var Re=T(()=>{"use strict";Ze();Je()});import{hostname as nE}from"node:os";async function Qo(e){let t=e.finalize??"auto";await aE(e.io,e.env);let r=await $(e.io,m=>m.listEnqueuedRequestMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),n=r.length===0?[]:await $(e.io,m=>m.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,nE())),s=oD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??oE(e.sender)});if(s.length===0)throw new Error(`no queued mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);await e.onPromptBuilt?.(s);let i=!1,o=ce(),a=0,l=0,c=0,d={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:s,permissionMode:e.permissionMode,env:e.env,onDelta:m=>{i=!0,o&&(a+=1,c=Buffer.byteLength(m,"utf8"),l+=c),e.onDelta?.(m)},onProgress:m=>e.onProgress?.(m)};e.receiver.model!==void 0&&(d.model=e.receiver.model),e.receiver.effort!==void 0&&(d.effort=e.receiver.effort),d.alias=e.receiver.alias,d.isLead=e.receiver.isLead,e.idleTimeoutMs!==void 0&&(d.timeoutMs=e.idleTimeoutMs);let u;try{u=await St(d)}catch(m){t==="auto"&&await rE(e.io,n.map(_=>_.id));let p=m instanceof Error?m.message:String(m);if(t==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw m}if(o&&Le(JSON.stringify({event:"chat_return",alias:e.receiver.alias,provider:e.receiver.provider,streamed:i,blockCount:a,streamedBytes:l,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:c,tailPreview:u.text.slice(-200)})),u.status==="stalled")return t==="auto"&&await rE(e.io,n.map(m=>m.id)),{status:"stalled",receipt:u.text,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let f=n.map(m=>m.id);return t==="auto"&&await Zo(e.io,f,u.text),{status:"ok",receipt:u.text,prompt:s,queued:n,deliveredIds:f,wroteDelta:i,durationMs:u.durationMs}}async function sE(e){await aE(e.io,e.env);let t=await $(e.io,i=>i.listEnqueuedResponseMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),r=t.length===0?[]:await $(e.io,i=>i.claimMailForDelivery(t.map(o=>o.id),new Date().toISOString(),process.pid,nE())),n=aD(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let s={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:n,permissionMode:e.permissionMode,env:e.env,alias:e.receiver.alias,isLead:e.receiver.isLead};e.receiver.model!==void 0&&(s.model=e.receiver.model),e.receiver.effort!==void 0&&(s.effort=e.receiver.effort),e.idleTimeoutMs!==void 0&&(s.timeoutMs=e.idleTimeoutMs);try{let i=await St(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
2022
+ `),1}function je(e,t){let r=t instanceof Error?t.message:String(t);return e.stderr.write(`internal error: ${r}
2023
+ `),2}var Re=T(()=>{"use strict";Ze();Xe()});import{hostname as nE}from"node:os";async function Qo(e){let t=e.finalize??"auto";await aE(e.io,e.env);let r=await $(e.io,m=>m.listEnqueuedRequestMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),n=r.length===0?[]:await $(e.io,m=>m.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,nE())),s=oD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??oE(e.sender)});if(s.length===0)throw new Error(`no queued mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);await e.onPromptBuilt?.(s);let i=!1,o=ce(),a=0,l=0,c=0,d={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:s,permissionMode:e.permissionMode,env:e.env,onDelta:m=>{i=!0,o&&(a+=1,c=Buffer.byteLength(m,"utf8"),l+=c),e.onDelta?.(m)},onProgress:m=>e.onProgress?.(m)};e.receiver.model!==void 0&&(d.model=e.receiver.model),e.receiver.effort!==void 0&&(d.effort=e.receiver.effort),d.alias=e.receiver.alias,d.isLead=e.receiver.isLead,e.idleTimeoutMs!==void 0&&(d.timeoutMs=e.idleTimeoutMs);let u;try{u=await St(d)}catch(m){t==="auto"&&await rE(e.io,n.map(_=>_.id));let p=m instanceof Error?m.message:String(m);if(t==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw m}if(o&&Le(JSON.stringify({event:"chat_return",alias:e.receiver.alias,provider:e.receiver.provider,streamed:i,blockCount:a,streamedBytes:l,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:c,tailPreview:u.text.slice(-200)})),u.status==="stalled")return t==="auto"&&await rE(e.io,n.map(m=>m.id)),{status:"stalled",receipt:u.text,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let f=n.map(m=>m.id);return t==="auto"&&await Zo(e.io,f,u.text),{status:"ok",receipt:u.text,prompt:s,queued:n,deliveredIds:f,wroteDelta:i,durationMs:u.durationMs}}async function sE(e){await aE(e.io,e.env);let t=await $(e.io,i=>i.listEnqueuedResponseMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),r=t.length===0?[]:await $(e.io,i=>i.claimMailForDelivery(t.map(o=>o.id),new Date().toISOString(),process.pid,nE())),n=aD(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let s={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:n,permissionMode:e.permissionMode,env:e.env,alias:e.receiver.alias,isLead:e.receiver.isLead};e.receiver.model!==void 0&&(s.model=e.receiver.model),e.receiver.effort!==void 0&&(s.effort=e.receiver.effort),e.idleTimeoutMs!==void 0&&(s.timeoutMs=e.idleTimeoutMs);try{let i=await St(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
2024
2024
  ${i.text}`;return await Zo(e.io,r.map(l=>l.id),a),{status:"stalled",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),durationMs:i.durationMs,stalledAfterMs:i.stalledAfterMs}}let o="response delivered; recipient output discarded";return await Zo(e.io,r.map(a=>a.id),o),{status:"ok",receipt:o,prompt:n,queued:r,deliveredIds:r.map(a=>a.id),durationMs:i.durationMs}}catch(i){let o=i instanceof Error?i.message:String(i),a=`response delivery error: ${o}`;return await Zo(e.io,r.map(l=>l.id),a),{status:"error",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),error:o}}}function oD(e,t,r={}){let n=e.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${iE(s)}, sent ${s.created_at}) ---`,s.payload].join(`
2025
2025
  `));return t!==void 0&&n.push([`--- new message (from ${r.newMessageFrom??"operator"}) ---`,t].join(`
2026
2026
  `)),n.join(`
@@ -2030,25 +2030,25 @@ ${i.text}`;return await Zo(e.io,r.map(l=>l.id),a),{status:"stalled",receipt:a,pr
2030
2030
 
2031
2031
  `)}function iE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":oE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function oE(e){return`${e.teamfile}:${e.alias}`}async function Zo(e,t,r){if(t.length!==0)try{await $(e,n=>{n.markMailDelivered(t,r,new Date().toISOString())})}catch(n){e.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
2032
2032
  `)}}async function rE(e,t){if(t.length!==0)try{await $(e,r=>{r.clearMailDelivery(t)})}catch(r){e.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
2033
- `)}}async function aE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-lD(t)).toISOString())})}catch{}}function lD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return tE;let r=Number(t);return!Number.isFinite(r)||r<=0?tE:r}var tE,qd=T(()=>{"use strict";vt();ve();Re();tE=8*60*60*1e3});import{basename as cD}from"node:path";function dE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=mE(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=fD(t.sender,n),i=mD(t.sender,n);i!==null&&i.teamfile===t.root&&!cE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,o],l=s.filter(f=>cE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&t.now.getTime()-c<dD;return{stop:l.length>=1&&d,chain:pD(a)}}function uE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=mE(e,r),s=pE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function gr(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return lE;let r=Number(t);return!Number.isFinite(r)||r<=0?lE:r}function fE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function uD(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function mE(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(uD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function fD(e,t,r={}){let n=new Map;for(let a of t)n.set(Ur(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Ur(e)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let d=Ur(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function pE(e,t){let r=Ur(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Ur(l.sender),d=Ur(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function mD(e,t){let r=pE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function cE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Ur(e){return`${e.teamfile}\0${e.alias}`}function pD(e){return e.map(t=>`${cD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var dD,lE,ea=T(()=>{"use strict";dD=6e4,lE=8*60*60*1e3});function _E(e){if(e.length===0||!e.startsWith("---"))throw new xt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2034
- `);if(t[0]!=="---")throw new xt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new xt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!_D.has(c))throw new xt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ta.join(", ")}`);r[c]=d}if(n===-1)throw new xt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ta)if(r[o]===void 0)throw new xt(`missing required frontmatter key "${o}" \u2014 required: ${ta.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var ta,_D,xt,hE=T(()=>{"use strict";ta=["title","description","members"],_D=new Set(ta),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as hD,writeFileSync as G8,renameSync as V8,existsSync as yE}from"node:fs";import{basename as gD,resolve as bn,dirname as Hd}from"node:path";function wD(e){let t={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(e))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];t[s]=i}return t}function ED(e){return/^\s*_MEMBER_\s+\S/.test(e)}function TD(e){return/^\s*_SESSION_\s+\S/.test(e)}function bD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ra(e){let t=gD(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function je(e){let t=hD(e,"utf-8"),r=Hd(bn(e)),n=Xd(t,ra(e),{baseDir:r,sourcePath:bn(e)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bn(r,s.sessiondir));return n}function Xd(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2033
+ `)}}async function aE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-lD(t)).toISOString())})}catch{}}function lD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return tE;let r=Number(t);return!Number.isFinite(r)||r<=0?tE:r}var tE,qd=T(()=>{"use strict";vt();Te();Re();tE=8*60*60*1e3});import{basename as cD}from"node:path";function dE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=mE(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=fD(t.sender,n),i=mD(t.sender,n);i!==null&&i.teamfile===t.root&&!cE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,o],l=s.filter(f=>cE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&t.now.getTime()-c<dD;return{stop:l.length>=1&&d,chain:pD(a)}}function uE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=mE(e,r),s=pE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function gr(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return lE;let r=Number(t);return!Number.isFinite(r)||r<=0?lE:r}function fE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function uD(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function mE(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(uD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function fD(e,t,r={}){let n=new Map;for(let a of t)n.set(Ur(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Ur(e)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let d=Ur(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function pE(e,t){let r=Ur(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Ur(l.sender),d=Ur(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function mD(e,t){let r=pE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function cE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Ur(e){return`${e.teamfile}\0${e.alias}`}function pD(e){return e.map(t=>`${cD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var dD,lE,ea=T(()=>{"use strict";dD=6e4,lE=8*60*60*1e3});function _E(e){if(e.length===0||!e.startsWith("---"))throw new xt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2034
+ `);if(t[0]!=="---")throw new xt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new xt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!_D.has(c))throw new xt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ta.join(", ")}`);r[c]=d}if(n===-1)throw new xt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ta)if(r[o]===void 0)throw new xt(`missing required frontmatter key "${o}" \u2014 required: ${ta.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var ta,_D,xt,hE=T(()=>{"use strict";ta=["title","description","members"],_D=new Set(ta),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as hD,writeFileSync as V8,renameSync as K8,existsSync as yE}from"node:fs";import{basename as gD,resolve as bn,dirname as Hd}from"node:path";function wD(e){let t={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(e))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];t[s]=i}return t}function ED(e){return/^\s*_MEMBER_\s+\S/.test(e)}function TD(e){return/^\s*_SESSION_\s+\S/.test(e)}function bD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ra(e){let t=gD(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function De(e){let t=hD(e,"utf-8"),r=Hd(bn(e)),n=Xd(t,ra(e),{baseDir:r,sourcePath:bn(e)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bn(r,s.sessiondir));return n}function Xd(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2035
2035
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=_E(i)}catch(l){if(l instanceof xt)s.push(`frontmatter: ${l.message}`);else throw l}let a=e.split(`
2036
2036
  `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(TD(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(bD(c)||!ED(c))continue;let u=wD(c);for(let p of Object.keys(u))if(!gE.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2037
- allowed keys: ${gE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:t,members:n,rawText:e,parseErrors:s,frontmatter:o}}function Gd(e,t){let r=[];for(let i of e.parseErrors)r.push({field:"session",message:i});let n=e.members.filter(i=>i.alias.toLowerCase()===Jd.toLowerCase());n.length>1&&r.push({field:Jd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of e.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=t?bn(t,i.teamfile):bn(i.teamfile);if(!yE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=je(a),c=At(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else yD.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function At(e){return e.members.find(t=>t.alias.toLowerCase()===Jd.toLowerCase())}function Vd(e,t,r,n={}){let s=n.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let i=bn(t,e.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${e.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!yE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${e.alias}")`);let a=je(i),l=At(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Vd(l,Hd(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Hd(i),alias:e.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function na(e,t){return e.members.find(r=>r.alias===t)??e.members.find(r=>r.alias.toLowerCase()===t.toLowerCase())}var Jd,yD,gE,zt=T(()=>{"use strict";hE();Jd="Lead",yD=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);gE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as SD}from"node:crypto";import{existsSync as vs,mkdirSync as vD,readFileSync as TE,realpathSync as kD,writeFileSync as ID}from"node:fs";import{basename as wE,dirname as bE,resolve as SE}from"node:path";function we(e,t){let r=SE(e);if(vs(r))return kD(r);if(t!==void 0){let n=AD(e,r,t);if(n!==null)return n}return r}function EE(e,t){let r=bE(t),n=Xd(e,ra(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=SE(r,s.sessiondir));return n}function De(e,t){let r=we(e,xD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!vs(r)&&"upsertRootTeam"in t&&(vD(bE(r),{recursive:!0}),ID(r,n.raw_text,"utf8")),EE(n.raw_text,r);if(vs(r)){let s=TE(r,"utf8"),i=EE(s,r);return"upsertRootTeam"in t&&RD(i)&&LD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!vs(r))throw new Error(`teamfile not found: ${e}`);return je(r)}function vE(e,t,r){let n=we(e,t),s=t.getRootTeam(n);s===null||!vs(n)||TE(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function xD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function AD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=wE(e),i=ra(e),o=r.listRootTeams().filter(l=>wE(l.teamfile_path)===s||l.name===i);if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${e}" in root-team registry: ${a}; pass an absolute path`)}function RD(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=ND)}function LD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:SD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var ND,Rt=T(()=>{"use strict";zt();ND=5});import{existsSync as OD}from"node:fs";import{dirname as kE}from"node:path";function MD(e){return $D.test(e)||CD.test(e)}function IE(e){return sa.test(e)}function Wr(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),r=e.slice(0,t),n=e.slice(t+1);return!r.endsWith(".lmctl")||!sa.test(n)?null:{teamfile:r,alias:n}}function qe(e,t,r){if(!e.endsWith(".lmctl"))throw new ge(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!IE(t))throw new ge(`lmctl: "${t}" is not a valid alias (must match ${sa.source}).`);let n=we(e,r);if(r===void 0&&!OD(n))throw new ge(`lmctl: teamfile not found: ${e}`);let s;try{s=De(n,r)}catch(o){throw new ge(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let i=na(s,t);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${t}" not found in ${e}.
2037
+ allowed keys: ${gE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:t,members:n,rawText:e,parseErrors:s,frontmatter:o}}function Gd(e,t){let r=[];for(let i of e.parseErrors)r.push({field:"session",message:i});let n=e.members.filter(i=>i.alias.toLowerCase()===Jd.toLowerCase());n.length>1&&r.push({field:Jd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of e.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=t?bn(t,i.teamfile):bn(i.teamfile);if(!yE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=De(a),c=At(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else yD.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function At(e){return e.members.find(t=>t.alias.toLowerCase()===Jd.toLowerCase())}function Vd(e,t,r,n={}){let s=n.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let i=bn(t,e.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${e.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!yE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${e.alias}")`);let a=De(i),l=At(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Vd(l,Hd(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Hd(i),alias:e.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function na(e,t){return e.members.find(r=>r.alias===t)??e.members.find(r=>r.alias.toLowerCase()===t.toLowerCase())}var Jd,yD,gE,zt=T(()=>{"use strict";hE();Jd="Lead",yD=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);gE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as SD}from"node:crypto";import{existsSync as vs,mkdirSync as vD,readFileSync as TE,realpathSync as kD,writeFileSync as ID}from"node:fs";import{basename as wE,dirname as bE,resolve as SE}from"node:path";function we(e,t){let r=SE(e);if(vs(r))return kD(r);if(t!==void 0){let n=AD(e,r,t);if(n!==null)return n}return r}function EE(e,t){let r=bE(t),n=Xd(e,ra(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=SE(r,s.sessiondir));return n}function Pe(e,t){let r=we(e,xD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!vs(r)&&"upsertRootTeam"in t&&(vD(bE(r),{recursive:!0}),ID(r,n.raw_text,"utf8")),EE(n.raw_text,r);if(vs(r)){let s=TE(r,"utf8"),i=EE(s,r);return"upsertRootTeam"in t&&RD(i)&&LD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!vs(r))throw new Error(`teamfile not found: ${e}`);return De(r)}function vE(e,t,r){let n=we(e,t),s=t.getRootTeam(n);s===null||!vs(n)||TE(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function xD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function AD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=wE(e),i=ra(e),o=r.listRootTeams().filter(l=>wE(l.teamfile_path)===s||l.name===i);if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${e}" in root-team registry: ${a}; pass an absolute path`)}function RD(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=ND)}function LD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:SD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var ND,Rt=T(()=>{"use strict";zt();ND=5});import{existsSync as OD}from"node:fs";import{dirname as kE}from"node:path";function MD(e){return $D.test(e)||CD.test(e)}function IE(e){return sa.test(e)}function Wr(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),r=e.slice(0,t),n=e.slice(t+1);return!r.endsWith(".lmctl")||!sa.test(n)?null:{teamfile:r,alias:n}}function He(e,t,r){if(!e.endsWith(".lmctl"))throw new ge(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!IE(t))throw new ge(`lmctl: "${t}" is not a valid alias (must match ${sa.source}).`);let n=we(e,r);if(r===void 0&&!OD(n))throw new ge(`lmctl: teamfile not found: ${e}`);let s;try{s=Pe(n,r)}catch(o){throw new ge(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let i=na(s,t);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${t}" not found in ${e}.
2038
2038
  Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=Vd(i,kE(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ge(`lmctl: alias "${i.alias}" in ${e} has no session ID yet.
2039
2039
  Run: lmctl seed ${e}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??kE(n),isLead:At(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function yr(e,t){let{target:r,alias:n,flags:s}=t;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${e.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Wr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${e.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?IE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${e.name}: "${n}" is not a valid alias (must match ${sa.source}).`}:e.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${e.name}: alias required.
2040
2040
  Use: lmctl ${e.name} ${r}:<alias> or lmctl ${e.name} ${r} <alias>`};if(MD(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: "${r}" is a bare sessionid, but ${e.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
2041
2041
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${e.name}: can't infer target type from "${r}".
2042
2042
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: --session (raw mode) is not supported by ${e.name}.`};let o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${e.name}: a target is required.
2043
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,$D,CD,sa,Lt=T(()=>{"use strict";zt();Rt();ge=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},$D=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,CD=/^ses_[A-Za-z0-9_-]+$/,sa=/^[A-Za-z][A-Za-z0-9_-]*$/});function jD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return NE;let r=Number(t);return!Number.isFinite(r)||r<=0?NE:Math.max(1,Math.trunc(r))}async function AE(e){let t=e.env??process.env,r=e.maxBatches??jD(t),n=qD(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};BD(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(xE(l)));if(o===void 0)break;i.add(xE(o)),s.scanned+=1;let a=await DD(e.dal,n,t,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function xE(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function DD(e,t,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Pr(e,n.receiver_teamfile,n.receiver_alias);if(i.busy)return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};let o=null;try{let a=qe(n.receiver_teamfile,n.receiver_alias,e),l=hr(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:gr()});if(!l.acquired)return{...s,skipped_busy:1};if(o=l.lease,n.message_type==="response"){let d=await sE({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:a.provider,sessionId:a.sessionid,cwd:a.sessiondir,...a.model!==void 0?{model:a.model}:{},...a.effort!==void 0?{effort:a.effort}:{},...a.isLead!==void 0?{isLead:a.isLead}:{}},io:t,permissionMode:"yolo",env:r});return UD(d)}let c=await Qo({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:a.provider,sessionId:a.sessionid,cwd:a.sessiondir,...a.model!==void 0?{model:a.model}:{},...a.effort!==void 0?{effort:a.effort}:{},...a.isLead!==void 0?{isLead:a.isLead}:{}},io:t,permissionMode:"yolo",env:r,finalize:"caller"});return FD(e,c)}catch(a){return PD(e,n,`relay delivery error: ${a instanceof Error?a.message:String(a)}`)}finally{if(o!==null)try{e.releaseAgentInflight(o)}catch{}}}function PD(e,t,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=t.message_type==="response"?e.listEnqueuedResponseMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias):e.listEnqueuedRequestMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias),i=t.message_type==="response"?e.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):e.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function FD(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=WD(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function UD(e){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:e.deliveredIds.length,errors:e.status==="ok"?0:1}}function WD(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
2044
- ${e.receipt}`:`relay delivery error: ${e.error}`}function BD(e,t){let r=t.LMCTL_MAILBOX_DELIVERY_STALE_MS,n=r===void 0||r.trim()===""?NaN:Number(r),s=Number.isFinite(n)&&n>0?n:8*60*60*1e3;e.reclaimStaleMailboxDeliveries(new Date(Date.now()-s).toISOString())}function qD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var NE,RE=T(()=>{"use strict";Fr();qd();ea();Lt();NE=10});function ks(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function LE(e){let t=e.intervalMs??ks(),r=e.runOnceFn??jr,n={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},s=null,i=null,o=null,a=null,l=null;e.startRollupUpdaterFn!==!1&&(l=(e.startRollupUpdaterFn??qw)(e.dal));let c=f=>{n.running&&(s=setTimeout(()=>{u.runCycle().finally(()=>c(t))},f))},d=f=>{n.running&&(i=setTimeout(()=>{a===null&&(a=OE(e.dal,e.monitorSessionActivityFn??gc,t,n).finally(()=>{a=null})),a.finally(()=>d(yc(e.dal,t)))},f))},u={state:n,runCycle:async()=>(o!==null||(o=HD(e.dal,r,e.collectSessionSizesFn??u_,e.scanIntakeFn??lo,e.monitorSessionActivityFn??gc,e.mailboxRelayFn??AE,e.worker_id??"daemon",t,n).finally(()=>{o=null})),o),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),i!==null&&clearTimeout(i),l?.stop(),o!==null&&await o.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=e.firstDelayMs??5e3;c(f),d(f)}return u}async function HD(e,t,r,n,s,i,o,a,l){l.in_flight=!0,l.last_started_at=new Date().toISOString(),l.last_error=null;let c=[],d=0,u=0,f=[],m=null,p=JD();try{for(wy({dal:e}),Xw({dal:e}),f=await n(e);;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;c.push(g)}p=await i({dal:e});let _=await r(e);d=_.recorded,u=_.failed,m=await OE(e,s,a,l)}catch(_){l.last_error=_ instanceof Error?_.message:String(_);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:l.last_error})})}catch{}}finally{l.in_flight=!1,l.cycles+=1,l.last_jobs_processed=c.length,l.last_session_sizes_recorded=d,l.last_session_size_failures=u,l.last_intake_scanned=f.reduce((_,g)=>_+g.scanned,0),l.last_intake_new_jobs=f.reduce((_,g)=>_+g.new_jobs,0),l.last_intake_failures=f.filter(_=>_.error!==void 0).length,l.last_session_hung_detected=m?.hung_detected??0,l.last_mailbox_relay_scanned=p.scanned,l.last_mailbox_relay_delivered=p.delivered,l.last_mailbox_relay_errors=p.errors,l.jobs_processed+=c.length,l.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:d,session_size_failures:u,intake:f,session_monitor:m,mailbox_relay:p}}function JD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function OE(e,t,r,n){let s=yc(e,r),i=Date.now();if(n.last_session_monitor_checked_at!==null){let o=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(o)&&i-o<s)return null}n.last_session_monitor_checked_at=new Date(i).toISOString(),n.last_session_monitor_error=null;try{return await t({dal:e,nowMs:i})}catch(o){n.last_session_monitor_error=o instanceof Error?o.message:String(o);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var Kd=T(()=>{"use strict";Bc();Lo();wd();Mi();Hw();Gw();wc();RE()});function $E(e){let t=e.listMembersInState("in_chat");for(let r of t)e.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var CE=T(()=>{"use strict"});import{mkdirSync as XD,readFileSync as GD,readdirSync as VD,statSync as KD,writeFileSync as YD}from"node:fs";import{dirname as zD,join as jE,sep as ME}from"node:path";function ia(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case DE:return ZD(e,s.input);case PE:return QD(e,s.input);case FE:return eP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Zd,GetObjectCommand:zd,PutObjectCommand:Yd}}}function ZD(e,t){let r=UE(e,t.Key);return XD(zD(r),{recursive:!0}),YD(r,t.Body),{}}function QD(e,t){let r=UE(e,t.Key),n;try{n=GD(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function eP(e,t){let r=t.Prefix??"";WE(r);let s=tP(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function UE(e,t){return WE(t),jE(e,t)}function WE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function tP(e){let t=[],r=(n,s)=>{let i;try{i=VD(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=jE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=ME==="/"?a:a.split(ME).join("/");t.push({key:c,lastModified:KD(l).mtime})}}};return r(e,""),t}var DE,PE,FE,Yd,zd,Zd,Qd=T(()=>{"use strict";DE="localfs-put",PE="localfs-get",FE="localfs-list",Yd=class{input;_localfsTag=DE;constructor(t){this.input=t}},zd=class{input;_localfsTag=PE;constructor(t){this.input=t}},Zd=class{input;_localfsTag=FE;constructor(t){this.input=t}}});function BE(){return{put:0,get:0,list:0}}function eu(e,t=rP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function tu(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var rP,oa,ru=T(()=>{"use strict";rP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};oa=class{counts=BE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=BE(),t}estimateCostUsd(t){return eu(this.counts,t)}}});function qE(e){let t=e.now??Date.now,r=e.timers??nP,n=null,s=null;async function i(){let l=t(),c=tu(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=eu(m);if(n!==c&&p>=e.ceilingUsd){n=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===tu(t())}}}var nP,HE=T(()=>{"use strict";ru();nP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var nu=T(()=>{"use strict";jo();Po();Po()});function sP(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let r=t.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:t.message_id,request:n}}function iP(e){return e.reply_to!==void 0&&e.response!==void 0}function oP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function JE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var aa,Is,XE=T(()=>{"use strict";nu();aa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Is=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new aa("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Yt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(JE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(JE(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let r=new aa;for(let n of t){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(t,r){let n=sP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(iP(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??oP(t)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Yt(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function su(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var GE=T(()=>{"use strict"});function iu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let r of t.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var VE=T(()=>{"use strict"});function au(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let r of t.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let r=t.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var ou,KE=T(()=>{"use strict";ou="daemon:events"});function zE(e){return{kind:"prompt",prompt_id:e.prompt_id??Yt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function lu(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var YE,cu=T(()=>{"use strict";nu();YE="prompt:root"});function Ns(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(QE(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function aP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(QE(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function ZE(e,t=60){if(typeof e!="string"||e==="")return!0;let r=aP(e);return r===null?!0:Date.now()/1e3>=r-t}function QE(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var du=T(()=>{"use strict"});async function la(e){let t=e.fetchImpl??fetch,r=`https://cognito-idp.${e.region}.amazonaws.com/`,n=await t(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":lP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var lP,uu=T(()=>{"use strict";lP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as eT,mkdirSync as tT,readFileSync as rT,writeFileSync as nT}from"node:fs";import{homedir as sT}from"node:os";import{dirname as iT,join as oT}from"node:path";function xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??oT(sT(),".lmctl","device-auth.json")}function aT(){return process.env.LMCTL_TOKEN_PATH??oT(sT(),".lmctl","cli-tokens.json")}function fu(e=xs()){try{let t=JSON.parse(rT(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function lT(e,t=xs()){tT(iT(t),{recursive:!0,mode:448}),nT(t,JSON.stringify(e,null,2));try{eT(t,384)}catch{}}function mu(e,t=aT()){let r={};try{r=JSON.parse(rT(t,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=e.idToken,e.accessToken!==void 0&&(n.accessToken=e.accessToken),e.refreshToken!==void 0&&(n.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(n.expiresAt=e.expiresAt);let s={...r,cognito:n};tT(iT(t),{recursive:!0,mode:448}),nT(t,JSON.stringify(s,null,2));try{eT(t,384)}catch{}}async function cT(e){let t=e.deviceAuthPath??xs(),r=fu(t);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await la({region:e.region,clientId:e.clientId,refreshToken:r.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return mu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??aT()),{idToken:n.idToken,userId:r.userId}}var pu=T(()=>{"use strict";uu()});import{existsSync as cP,realpathSync as dP}from"node:fs";import{dirname as uP}from"node:path";function _u(e){fP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function fP(e){let t=e.payload.root_teamfile;try{t=dP(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Sn(e.store,{rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=mP(t);if("error"in r)return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:r.error,log:e.log}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:hP(e.env??process.env)});if(!n.acquired){let s=_P(r.alias,n.current);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??St)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:c==="error"?null:i.text,status:c,error_detail:l,log:e.log}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function mP(e){if(!cP(e))return{error:`prompt root missing/unreadable: ${e}`};let t=je(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let r=At(t);return r===void 0?{error:`prompt root has no Lead: ${e}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??uP(e)}}async function Sn(e,t){let r=fT(t.message),n=t.response===null?null:fT(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function fT(e){return e.length<=dT?{text:e,truncated:!1}:{text:e.slice(0,dT),truncated:!0}}function pP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function _P(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:pP(e,t)}function hP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return uT;let r=Number(t);return!Number.isFinite(r)||r<=0?uT:r}var dT,uT,mT=T(()=>{"use strict";vt();zt();Fr();dT=256*1024,uT=30*60*1e3});import{chmodSync as wT,existsSync as gP,mkdirSync as ET,readFileSync as fa,writeFileSync as TT}from"node:fs";import{dirname as hu,resolve as ca,join as bT}from"node:path";import{fileURLToPath as yP}from"node:url";import{homedir as ST}from"node:os";import{CognitoIdentityClient as wP,GetIdCommand as EP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as pT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as TP,ListObjectsV2Command as bP,PutObjectCommand as SP,S3Client as _T}from"@aws-sdk/client-s3";function Rs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:xP(e.selfUrl),n={},s;for(let I of r)if(gP(I)){n=NP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??vP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??kP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??IP,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ma,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=ua(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ua(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=ua(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=ua(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),w=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function NP(e){try{let t=fa(e,"utf8"),n=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function xP(e){let t=hu(yP(e??import.meta.url));return[ca(t,"..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","infra","terraform","terraform.tfstate")]}function ua(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function AP(e){let t=RP(e.intervalMs)??vT,r=Math.max(1,Math.trunc(e.limit??500)),n=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function RP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function kT(e){let t=e.tokenPath??bT(ST(),".lmctl","cli-tokens.json"),r=gT(e.tokenPath);if(ZE(r.cognito?.idToken)&&fu()!==null)try{await cT({region:e.region,clientId:e.cognitoClientId??ma,cliTokensPath:t}),r=gT(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Q=A instanceof Error?A.message:String(A);e.log?.(`[mx-mailbox] device-auth refresh failed: ${Q}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await yT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=pT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new _T({region:e.region,credentials:a}),c={ListObjectsV2Command:bP,GetObjectCommand:TP,PutObjectCommand:SP},d=Ns(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=Co(m,"web"),N=0,L;do{let F=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of F.Contents??[]){let C=Mo(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);_=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),Q=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&$P(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),OP(t),o=!1,i=await yT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=pT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new _T({region:e.region,credentials:a}),m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new oa,I=new Dr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(h!==void 0&&su(A.payload)){h.onInbound(A.payload);return}if(S!==void 0&&iu(A.payload)){await S.onInbound(A.payload);return}if(!au(A.payload)){if(y!==void 0&&lu(A.payload)){_u({store:y,payload:A.payload,log:e.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Is({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),S!==void 0&&S.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:ou,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:AP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??vT,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let ue=e.deviceId??i,W=`${u}/usage/`,M;return M=e.usageStore===void 0?void 0:qE({meter:w,store:e.usageStore,userId:u,deviceId:ue,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Q,ceilingUsd:B})=>{e.log?.(`[usage] month ${A} cost $${Q.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(A,Q)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${W}${ue}-${A}.json`,Body:JSON.stringify({...Q,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Q={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:W,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let F=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:L}));if(F.Body===void 0)continue;let j=JSON.parse(await F.Body.transformToString("utf-8"));Q.put+=j.put??0,Q.get+=j.get??0,Q.list+=j.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Q},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){U?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function IT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ia(e.rootDir),r=gn({identityId:As,userId:As,deviceId:hT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:hT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&su(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&iu(c.payload)){await i.onInbound(c.payload);return}if(!au(c.payload)){if(o!==void 0&&lu(c.payload)){_u({store:o,payload:c.payload,log:e.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??da,readIntervalMs:e.readIntervalMs??da,heartbeatIdleMs:e.heartbeatIdleMs??da,backoffReadIntervalMs:e.backoffReadIntervalMs??da});n=new Is({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:ou,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function gT(e){let t=e??bT(ST(),".lmctl","cli-tokens.json");try{let r=fa(t,"utf8");return JSON.parse(r)}catch{return{}}}function LP(e,t){if(t===void 0||t==="")return;let r={};try{let s=fa(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};ET(hu(e),{recursive:!0,mode:448}),TT(e,JSON.stringify(n,null,2));try{wT(e,384)}catch{}}function OP(e){let t={};try{let n=fa(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,ET(hu(e),{recursive:!0,mode:448}),TT(e,JSON.stringify(r,null,2));try{wT(e,384)}catch{}}async function yT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new wP({region:e.region}).send(new EP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{LP(e.tokenPath,r.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${e.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function $P(e){if(e===null||typeof e!="object")return!1;let t=e,r=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof t.message=="string"?t.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var vT,da,ma,vP,kP,IP,As,hT,gu=T(()=>{"use strict";Fo();Qd();ru();HE();XE();GE();VE();KE();cu();jo();du();pu();mT();vT=3e3,da=1e3,ma="79u5jhkk46qofog661c9i0bdcs",vP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",kP="us-east-1_4iUdFggDn",IP="lmctl-next-preview-mailbox-254332045686";As="local",hT="local"});import{spawn as Tu}from"node:child_process";import{createInterface as NT}from"node:readline";var yu,wu,Eu,xT,AT=T(()=>{"use strict";mi();ve();yu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,r){this.ctx=r;let n=Tu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=NT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2043
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,$D,CD,sa,Lt=T(()=>{"use strict";zt();Rt();ge=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},$D=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,CD=/^ses_[A-Za-z0-9_-]+$/,sa=/^[A-Za-z][A-Za-z0-9_-]*$/});function jD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return NE;let r=Number(t);return!Number.isFinite(r)||r<=0?NE:Math.max(1,Math.trunc(r))}async function AE(e){let t=e.env??process.env,r=e.maxBatches??jD(t),n=qD(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};BD(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(xE(l)));if(o===void 0)break;i.add(xE(o)),s.scanned+=1;let a=await DD(e.dal,n,t,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function xE(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function DD(e,t,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Pr(e,n.receiver_teamfile,n.receiver_alias);if(i.busy)return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};let o=null;try{let a=He(n.receiver_teamfile,n.receiver_alias,e),l=hr(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:gr()});if(!l.acquired)return{...s,skipped_busy:1};if(o=l.lease,n.message_type==="response"){let d=await sE({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:a.provider,sessionId:a.sessionid,cwd:a.sessiondir,...a.model!==void 0?{model:a.model}:{},...a.effort!==void 0?{effort:a.effort}:{},...a.isLead!==void 0?{isLead:a.isLead}:{}},io:t,permissionMode:"yolo",env:r});return UD(d)}let c=await Qo({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:a.provider,sessionId:a.sessionid,cwd:a.sessiondir,...a.model!==void 0?{model:a.model}:{},...a.effort!==void 0?{effort:a.effort}:{},...a.isLead!==void 0?{isLead:a.isLead}:{}},io:t,permissionMode:"yolo",env:r,finalize:"caller"});return FD(e,c)}catch(a){return PD(e,n,`relay delivery error: ${a instanceof Error?a.message:String(a)}`)}finally{if(o!==null)try{e.releaseAgentInflight(o)}catch{}}}function PD(e,t,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=t.message_type==="response"?e.listEnqueuedResponseMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias):e.listEnqueuedRequestMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias),i=t.message_type==="response"?e.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):e.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function FD(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=WD(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function UD(e){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:e.deliveredIds.length,errors:e.status==="ok"?0:1}}function WD(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
2044
+ ${e.receipt}`:`relay delivery error: ${e.error}`}function BD(e,t){let r=t.LMCTL_MAILBOX_DELIVERY_STALE_MS,n=r===void 0||r.trim()===""?NaN:Number(r),s=Number.isFinite(n)&&n>0?n:8*60*60*1e3;e.reclaimStaleMailboxDeliveries(new Date(Date.now()-s).toISOString())}function qD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var NE,RE=T(()=>{"use strict";Fr();qd();ea();Lt();NE=10});function ks(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function LE(e){let t=e.intervalMs??ks(),r=e.runOnceFn??jr,n={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},s=null,i=null,o=null,a=null,l=null;e.startRollupUpdaterFn!==!1&&(l=(e.startRollupUpdaterFn??qw)(e.dal));let c=f=>{n.running&&(s=setTimeout(()=>{u.runCycle().finally(()=>c(t))},f))},d=f=>{n.running&&(i=setTimeout(()=>{a===null&&(a=OE(e.dal,e.monitorSessionActivityFn??gc,t,n).finally(()=>{a=null})),a.finally(()=>d(yc(e.dal,t)))},f))},u={state:n,runCycle:async()=>(o!==null||(o=HD(e.dal,r,e.collectSessionSizesFn??u_,e.scanIntakeFn??lo,e.monitorSessionActivityFn??gc,e.mailboxRelayFn??AE,e.worker_id??"daemon",t,n).finally(()=>{o=null})),o),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),i!==null&&clearTimeout(i),l?.stop(),o!==null&&await o.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=e.firstDelayMs??5e3;c(f),d(f)}return u}async function HD(e,t,r,n,s,i,o,a,l){l.in_flight=!0,l.last_started_at=new Date().toISOString(),l.last_error=null;let c=[],d=0,u=0,f=[],m=null,p=JD();try{for(wy({dal:e}),Xw({dal:e}),f=await n(e);;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;c.push(g)}p=await i({dal:e});let _=await r(e);d=_.recorded,u=_.failed,m=await OE(e,s,a,l)}catch(_){l.last_error=_ instanceof Error?_.message:String(_);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:l.last_error})})}catch{}}finally{l.in_flight=!1,l.cycles+=1,l.last_jobs_processed=c.length,l.last_session_sizes_recorded=d,l.last_session_size_failures=u,l.last_intake_scanned=f.reduce((_,g)=>_+g.scanned,0),l.last_intake_new_jobs=f.reduce((_,g)=>_+g.new_jobs,0),l.last_intake_failures=f.filter(_=>_.error!==void 0).length,l.last_session_hung_detected=m?.hung_detected??0,l.last_mailbox_relay_scanned=p.scanned,l.last_mailbox_relay_delivered=p.delivered,l.last_mailbox_relay_errors=p.errors,l.jobs_processed+=c.length,l.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:d,session_size_failures:u,intake:f,session_monitor:m,mailbox_relay:p}}function JD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function OE(e,t,r,n){let s=yc(e,r),i=Date.now();if(n.last_session_monitor_checked_at!==null){let o=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(o)&&i-o<s)return null}n.last_session_monitor_checked_at=new Date(i).toISOString(),n.last_session_monitor_error=null;try{return await t({dal:e,nowMs:i})}catch(o){n.last_session_monitor_error=o instanceof Error?o.message:String(o);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var Kd=T(()=>{"use strict";Bc();Lo();wd();Mi();Hw();Gw();wc();RE()});function $E(e){let t=e.listMembersInState("in_chat");for(let r of t)e.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var CE=T(()=>{"use strict"});import{mkdirSync as XD,readFileSync as GD,readdirSync as VD,statSync as KD,writeFileSync as YD}from"node:fs";import{dirname as zD,join as jE,sep as ME}from"node:path";function ia(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case DE:return ZD(e,s.input);case PE:return QD(e,s.input);case FE:return eP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Zd,GetObjectCommand:zd,PutObjectCommand:Yd}}}function ZD(e,t){let r=UE(e,t.Key);return XD(zD(r),{recursive:!0}),YD(r,t.Body),{}}function QD(e,t){let r=UE(e,t.Key),n;try{n=GD(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function eP(e,t){let r=t.Prefix??"";WE(r);let s=tP(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function UE(e,t){return WE(t),jE(e,t)}function WE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function tP(e){let t=[],r=(n,s)=>{let i;try{i=VD(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=jE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=ME==="/"?a:a.split(ME).join("/");t.push({key:c,lastModified:KD(l).mtime})}}};return r(e,""),t}var DE,PE,FE,Yd,zd,Zd,Qd=T(()=>{"use strict";DE="localfs-put",PE="localfs-get",FE="localfs-list",Yd=class{input;_localfsTag=DE;constructor(t){this.input=t}},zd=class{input;_localfsTag=PE;constructor(t){this.input=t}},Zd=class{input;_localfsTag=FE;constructor(t){this.input=t}}});function BE(){return{put:0,get:0,list:0}}function eu(e,t=rP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function tu(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var rP,oa,ru=T(()=>{"use strict";rP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};oa=class{counts=BE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=BE(),t}estimateCostUsd(t){return eu(this.counts,t)}}});function qE(e){let t=e.now??Date.now,r=e.timers??nP,n=null,s=null;async function i(){let l=t(),c=tu(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=eu(m);if(n!==c&&p>=e.ceilingUsd){n=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===tu(t())}}}var nP,HE=T(()=>{"use strict";ru();nP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var nu=T(()=>{"use strict";jo();Po();Po()});function sP(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let r=t.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:t.message_id,request:n}}function iP(e){return e.reply_to!==void 0&&e.response!==void 0}function oP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function JE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var aa,Is,XE=T(()=>{"use strict";nu();aa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Is=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new aa("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Yt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(JE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(JE(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let r=new aa;for(let n of t){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(t,r){let n=sP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(iP(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??oP(t)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Yt(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function su(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var GE=T(()=>{"use strict"});function iu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let r of t.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var VE=T(()=>{"use strict"});function au(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let r of t.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let r=t.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var ou,KE=T(()=>{"use strict";ou="daemon:events"});function zE(e){return{kind:"prompt",prompt_id:e.prompt_id??Yt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function lu(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var YE,cu=T(()=>{"use strict";nu();YE="prompt:root"});function Ns(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(QE(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function aP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(QE(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function ZE(e,t=60){if(typeof e!="string"||e==="")return!0;let r=aP(e);return r===null?!0:Date.now()/1e3>=r-t}function QE(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var du=T(()=>{"use strict"});async function la(e){let t=e.fetchImpl??fetch,r=`https://cognito-idp.${e.region}.amazonaws.com/`,n=await t(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":lP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var lP,uu=T(()=>{"use strict";lP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as eT,mkdirSync as tT,readFileSync as rT,writeFileSync as nT}from"node:fs";import{homedir as sT}from"node:os";import{dirname as iT,join as oT}from"node:path";function xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??oT(sT(),".lmctl","device-auth.json")}function aT(){return process.env.LMCTL_TOKEN_PATH??oT(sT(),".lmctl","cli-tokens.json")}function fu(e=xs()){try{let t=JSON.parse(rT(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function lT(e,t=xs()){tT(iT(t),{recursive:!0,mode:448}),nT(t,JSON.stringify(e,null,2));try{eT(t,384)}catch{}}function mu(e,t=aT()){let r={};try{r=JSON.parse(rT(t,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=e.idToken,e.accessToken!==void 0&&(n.accessToken=e.accessToken),e.refreshToken!==void 0&&(n.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(n.expiresAt=e.expiresAt);let s={...r,cognito:n};tT(iT(t),{recursive:!0,mode:448}),nT(t,JSON.stringify(s,null,2));try{eT(t,384)}catch{}}async function cT(e){let t=e.deviceAuthPath??xs(),r=fu(t);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await la({region:e.region,clientId:e.clientId,refreshToken:r.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return mu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??aT()),{idToken:n.idToken,userId:r.userId}}var pu=T(()=>{"use strict";uu()});import{existsSync as cP,realpathSync as dP}from"node:fs";import{dirname as uP}from"node:path";function _u(e){fP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function fP(e){let t=e.payload.root_teamfile;try{t=dP(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Sn(e.store,{rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=mP(t);if("error"in r)return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:r.error,log:e.log}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:hP(e.env??process.env)});if(!n.acquired){let s=_P(r.alias,n.current);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??St)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:c==="error"?null:i.text,status:c,error_detail:l,log:e.log}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function mP(e){if(!cP(e))return{error:`prompt root missing/unreadable: ${e}`};let t=De(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let r=At(t);return r===void 0?{error:`prompt root has no Lead: ${e}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??uP(e)}}async function Sn(e,t){let r=fT(t.message),n=t.response===null?null:fT(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function fT(e){return e.length<=dT?{text:e,truncated:!1}:{text:e.slice(0,dT),truncated:!0}}function pP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function _P(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:pP(e,t)}function hP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return uT;let r=Number(t);return!Number.isFinite(r)||r<=0?uT:r}var dT,uT,mT=T(()=>{"use strict";vt();zt();Fr();dT=256*1024,uT=30*60*1e3});import{chmodSync as wT,existsSync as gP,mkdirSync as ET,readFileSync as fa,writeFileSync as TT}from"node:fs";import{dirname as hu,resolve as ca,join as bT}from"node:path";import{fileURLToPath as yP}from"node:url";import{homedir as ST}from"node:os";import{CognitoIdentityClient as wP,GetIdCommand as EP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as pT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as TP,ListObjectsV2Command as bP,PutObjectCommand as SP,S3Client as _T}from"@aws-sdk/client-s3";function Rs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:xP(e.selfUrl),n={},s;for(let I of r)if(gP(I)){n=NP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??vP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??kP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??IP,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ma,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=ua(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ua(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=ua(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=ua(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),w=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function NP(e){try{let t=fa(e,"utf8"),n=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function xP(e){let t=hu(yP(e??import.meta.url));return[ca(t,"..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","infra","terraform","terraform.tfstate")]}function ua(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function AP(e){let t=RP(e.intervalMs)??vT,r=Math.max(1,Math.trunc(e.limit??500)),n=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function RP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function kT(e){let t=e.tokenPath??bT(ST(),".lmctl","cli-tokens.json"),r=gT(e.tokenPath);if(ZE(r.cognito?.idToken)&&fu()!==null)try{await cT({region:e.region,clientId:e.cognitoClientId??ma,cliTokensPath:t}),r=gT(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Q=A instanceof Error?A.message:String(A);e.log?.(`[mx-mailbox] device-auth refresh failed: ${Q}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await yT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=pT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new _T({region:e.region,credentials:a}),c={ListObjectsV2Command:bP,GetObjectCommand:TP,PutObjectCommand:SP},d=Ns(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=Co(m,"web"),N=0,L;do{let F=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of F.Contents??[]){let C=Mo(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);_=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),Q=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&$P(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),OP(t),o=!1,i=await yT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=pT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new _T({region:e.region,credentials:a}),m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new oa,I=new Dr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(h!==void 0&&su(A.payload)){h.onInbound(A.payload);return}if(S!==void 0&&iu(A.payload)){await S.onInbound(A.payload);return}if(!au(A.payload)){if(y!==void 0&&lu(A.payload)){_u({store:y,payload:A.payload,log:e.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Is({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),S!==void 0&&S.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:ou,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:AP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??vT,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let ue=e.deviceId??i,W=`${u}/usage/`,M;return M=e.usageStore===void 0?void 0:qE({meter:w,store:e.usageStore,userId:u,deviceId:ue,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Q,ceilingUsd:B})=>{e.log?.(`[usage] month ${A} cost $${Q.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(A,Q)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${W}${ue}-${A}.json`,Body:JSON.stringify({...Q,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Q={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:W,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let F=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:L}));if(F.Body===void 0)continue;let j=JSON.parse(await F.Body.transformToString("utf-8"));Q.put+=j.put??0,Q.get+=j.get??0,Q.list+=j.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Q},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){U?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function IT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ia(e.rootDir),r=gn({identityId:As,userId:As,deviceId:hT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:hT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&su(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&iu(c.payload)){await i.onInbound(c.payload);return}if(!au(c.payload)){if(o!==void 0&&lu(c.payload)){_u({store:o,payload:c.payload,log:e.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??da,readIntervalMs:e.readIntervalMs??da,heartbeatIdleMs:e.heartbeatIdleMs??da,backoffReadIntervalMs:e.backoffReadIntervalMs??da});n=new Is({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:ou,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function gT(e){let t=e??bT(ST(),".lmctl","cli-tokens.json");try{let r=fa(t,"utf8");return JSON.parse(r)}catch{return{}}}function LP(e,t){if(t===void 0||t==="")return;let r={};try{let s=fa(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};ET(hu(e),{recursive:!0,mode:448}),TT(e,JSON.stringify(n,null,2));try{wT(e,384)}catch{}}function OP(e){let t={};try{let n=fa(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,ET(hu(e),{recursive:!0,mode:448}),TT(e,JSON.stringify(r,null,2));try{wT(e,384)}catch{}}async function yT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new wP({region:e.region}).send(new EP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{LP(e.tokenPath,r.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${e.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function $P(e){if(e===null||typeof e!="object")return!1;let t=e,r=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof t.message=="string"?t.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var vT,da,ma,vP,kP,IP,As,hT,gu=T(()=>{"use strict";Fo();Qd();ru();HE();XE();GE();VE();KE();cu();jo();du();pu();mT();vT=3e3,da=1e3,ma="79u5jhkk46qofog661c9i0bdcs",vP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",kP="us-east-1_4iUdFggDn",IP="lmctl-next-preview-mailbox-254332045686";As="local",hT="local"});import{spawn as Tu}from"node:child_process";import{createInterface as NT}from"node:readline";var yu,wu,Eu,xT,AT=T(()=>{"use strict";mi();Te();yu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,r){this.ctx=r;let n=Tu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=NT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2045
2045
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
2046
2046
  `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(t,r){if(t==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(t==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(t==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(t==="item/started"||t==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:t==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:t,params:r}}}if(t==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(t==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:t,params:r}}}},wu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(t,r){this.ctx=r;let n=Tu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2047
2047
  `);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),n}async sendTurn(t){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:t}});try{this.child.stdin.write(n+`
2048
2048
  `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Eu=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{fi(n)}catch(a){V({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Tu(t.command,t.args,{cwd:n,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=NT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(t){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:t}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2049
2049
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
2050
2050
  `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
2051
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},xT=e=>{switch(e){case"codex":return new yu;case"claude":case"qwen":return new wu;case"gemini":case"copilot":case"opencode":return new Eu;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as CP}from"node:crypto";import{existsSync as xz,mkdirSync as MP,readFileSync as jP,writeFileSync as DP}from"node:fs";import{homedir as PP}from"node:os";import{dirname as FP,join as UP}from"node:path";function pa(){return process.env.LMCTL_DEVICE_FILE??UP(PP(),".lmctl","device.json")}function Br(e=pa()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(jP(e,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function bu(e=pa()){let t=Br(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:CP(),created_at:new Date().toISOString()};return MP(FP(e),{recursive:!0}),DP(e,`${JSON.stringify(r,null,2)}
2051
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},xT=e=>{switch(e){case"codex":return new yu;case"claude":case"qwen":return new wu;case"gemini":case"copilot":case"opencode":return new Eu;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as CP}from"node:crypto";import{existsSync as Az,mkdirSync as MP,readFileSync as jP,writeFileSync as DP}from"node:fs";import{homedir as PP}from"node:os";import{dirname as FP,join as UP}from"node:path";function pa(){return process.env.LMCTL_DEVICE_FILE??UP(PP(),".lmctl","device.json")}function Br(e=pa()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(jP(e,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function bu(e=pa()){let t=Br(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:CP(),created_at:new Date().toISOString()};return MP(FP(e),{recursive:!0}),DP(e,`${JSON.stringify(r,null,2)}
2052
2052
  `,{encoding:"utf8",mode:384}),r}var Su=T(()=>{"use strict"});import*as RT from"node:child_process";function BP(e,t){try{let r=t(e,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function vu(e,t={}){let r=t.spawnSync===void 0&&process.env[qP]==="1",n=t.spawnSync??RT.spawnSync,s=new Set,i=[];for(let o of e){if(s.has(o))continue;s.add(o);let a=_a[o];if(!a){i.push({provider:o,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){i.push({provider:o,binary:a,found:!0,version:"(skipped)"});continue}let l=BP(a,n);l.found?i.push({provider:o,binary:a,found:!0,version:l.version}):i.push({provider:o,binary:a,found:!1,failureMode:l.failureMode})}return i}function LT(e){if(e.binary==="<unknown>")return`unknown provider "${e.provider}" \u2014 no binary mapping (allowed: ${Object.keys(_a).join(", ")})`;let t=WP[e.provider],r=t?` (install via ${t})`:"";return e.failureMode==="runs but failed"?`provider "${e.provider}" binary '${e.binary}' found but \`${e.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${e.provider}" binary '${e.binary}' not installed${r}`}var _a,WP,qP,OT=T(()=>{"use strict";_a={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},WP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};qP="LMCTL_SKIP_BINARY_CHECK"});var BT={};ye(BT,{ProviderBinaryPreflightError:()=>ha,__setProviderBinaryCheckForTest:()=>ZP,bootstrapAgentRestMailbox:()=>MT,publishRegisteredWorkflowsOnStart:()=>CT,resolveLocalMailboxDir:()=>UT,resolveLocalWebuiDir:()=>FT,resolveServeConfig:()=>jT,runProviderBinaryPreflight:()=>PT,runServe:()=>VP,validateServeArgs:()=>WT});import{randomBytes as HP}from"node:crypto";import{existsSync as JP}from"node:fs";import{homedir as XP}from"node:os";import{isAbsolute as $T,resolve as ku}from"node:path";async function VP(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(GP),0;let r=WT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
2053
2053
  `),2;try{PT(t)}catch(y){return 1}let n=Ie({path:le()}),s={portCli:QP(e)},i;try{i=jT({dal:n,cli:s,env:process.env,parsed:r,io:t})}catch(y){return n.close(),t.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
2054
2054
  `),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),$E(n);let o;if(r.localWebui!==void 0){let y=FT(r.localWebui.dir,process.env);if(y===null)return t.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let w=UT(process.env),{s3:I,commands:x}=ia(w);o={webuiDir:y,rootDir:w,s3:I,commands:x},t.stdout.write(`local webui: serving SPA from ${y}; mailbox store ${w}
@@ -2066,7 +2066,7 @@ ${e.receipt}`:`relay delivery error: ${e.error}`}function BD(e,t){let r=t.LMCTL_
2066
2066
  `);return{port:a,apiUrl:u,apiToken:c}}function YP(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function zP(e){let t;try{t=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);e.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new qo({pty:{spawn:t.spawn.bind(t)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:e.log})}function ZP(e){DT=e??vu}function PT(e){let t=Object.keys(_a),r=DT(t),n=r.filter(i=>!i.found);if(n.length>0){for(let i of n)e.stderr.write(`error: ${LT(i)}
2067
2067
  `);throw e.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
2068
2068
  `),new ha(n)}let s=r.map(i=>i.provider).join(", ");e.stdout.write(`providers ready: ${s}
2069
- `)}function FT(e,t){let r=e!==void 0&&e!==""?e:t.LMCTL_LOCAL_WEBUI_DIR!==void 0&&t.LMCTL_LOCAL_WEBUI_DIR!==""?t.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=$T(r)?r:ku(process.cwd(),r);return JP(`${n}/index.html`)?n:null}function UT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?$T(t)?t:ku(process.cwd(),t):ku(XP(),".lmctl","local-mailbox")}function QP(e){for(let t=0;t<e.length;t+=1)if(e[t]==="--port"){let r=e[t+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function WT(e,t=process.env){let r=eF(e);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!t.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function eF(e){let t={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--port"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;t.port=i;continue}if(n==="--bind"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";t.bind=s;continue}if(n==="--no-daemon"){t.noDaemon=!0;continue}if(n==="--insecure-no-auth"){t.insecureNoAuth=!0;continue}if(n==="--webui"){let s=e[r+1];s!==void 0&&!s.startsWith("--")?(t.localWebui={dir:s},r+=1):t.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return t}var GP,ha,DT,qT=T(()=>{"use strict";Ze();Bw();Kd();CE();Hc();gu();Qd();$d();Cd();AT();Su();OT();Je();GP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2069
+ `)}function FT(e,t){let r=e!==void 0&&e!==""?e:t.LMCTL_LOCAL_WEBUI_DIR!==void 0&&t.LMCTL_LOCAL_WEBUI_DIR!==""?t.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=$T(r)?r:ku(process.cwd(),r);return JP(`${n}/index.html`)?n:null}function UT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?$T(t)?t:ku(process.cwd(),t):ku(XP(),".lmctl","local-mailbox")}function QP(e){for(let t=0;t<e.length;t+=1)if(e[t]==="--port"){let r=e[t+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function WT(e,t=process.env){let r=eF(e);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!t.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function eF(e){let t={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--port"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;t.port=i;continue}if(n==="--bind"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";t.bind=s;continue}if(n==="--no-daemon"){t.noDaemon=!0;continue}if(n==="--insecure-no-auth"){t.insecureNoAuth=!0;continue}if(n==="--webui"){let s=e[r+1];s!==void 0&&!s.startsWith("--")?(t.localWebui={dir:s},r+=1):t.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return t}var GP,ha,DT,qT=T(()=>{"use strict";Ze();Bw();Kd();CE();Hc();gu();Qd();$d();Cd();AT();Su();OT();Xe();GP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2070
2070
 
2071
2071
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
2072
2072
  services. Help exits before any port binding or daemon startup.
@@ -2076,19 +2076,19 @@ services. Help exits before any port binding or daemon startup.
2076
2076
  against the local filesystem (no S3, no Cognito) with a fixed
2077
2077
  local identity. Mailbox store defaults to
2078
2078
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
2079
- `;ha=class extends Error{missing;constructor(t){let r=t.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=t}},DT=vu});import{existsSync as tF,mkdirSync as rF,readFileSync as nF,renameSync as sF,unlinkSync as iF,writeFileSync as oF}from"node:fs";import{homedir as JT}from"node:os";import{dirname as Ls,join as _t,resolve as aF}from"node:path";function In(e,t,r){let n=Ls(aF(r)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())wr(_t(o,".mcp.json"),"mcpServers",[vn(),kn()]),a.has("opencode")&&wr(_t(o,".opencode","opencode.json"),"mcp",[KT(),YT()]);for(let o of s)dF(o)}function Iu(e=XT??JT()){return _t(e,".copilot","mcp-config.json")}function GT(e,t){let r={};if(He.existsSync(e)){let i=JSON.parse(He.readFileSync(e,"utf8"));if(!Ot(i))throw new Error(`${e} is not a JSON object`);r=i}let n=Ot(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[i,o]of Object.entries(t)){let a=Ot(n[i])?n[i]:void 0;bF(a,o)||(n[i]=o,s=!0)}return s?(r.mcpServers=n,VT(e,r),{changed:!0}):{changed:!1}}function VT(e,t){He.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,`${JSON.stringify(t,null,2)}
2080
- `,"utf8"),He.renameSync(r,e)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function cF(e,t){He.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,t,"utf8"),He.renameSync(r,e)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!He.existsSync(e))return;let n=JSON.parse(He.readFileSync(e,"utf8"));if(!Ot(n)||!Ot(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,VT(e,n),V({event:"mcp_cleanup",path:e,removed:i})}catch{}}function vn(){return{name:ya,shouldRemove:yF}}function KT(){return{name:ya,shouldRemove:wF}}function kn(){return{name:ga,shouldRemove:hF}}function YT(){return{name:ga,shouldRemove:gF}}function dF(e){let t=XT??JT();switch(e){case"copilot":wr(Iu(t),"mcpServers",[vn(),kn()]);return;case"claude":wr(_t(t,".claude.json"),"mcpServers",[vn(),kn()]);return;case"gemini":wr(_t(t,".gemini","settings.json"),"mcpServers",[vn(),kn()]);return;case"qwen":wr(_t(t,".qwen","settings.json"),"mcpServers",[vn(),kn()]);return;case"agy":wr(_t(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[vn(),kn()]);return;case"opencode":wr(_t(t,".config","opencode","opencode.json"),"mcp",[KT(),YT()]);return;case"codex":uF(_t(t,".codex","config.toml"));return;default:return}}function uF(e){try{if(!He.existsSync(e))return;let t=He.readFileSync(e,"utf8"),r=fF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=zT(l);if(c===null)return;if(c!==void 0){if(HT(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=pF(l);if(d===null)return;if(d!==void 0&&HT(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;cF(e,s.join(`
2081
- `)),V({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function HT(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function fF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=zT(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=mF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==ga&&c[1]!==ya)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=ZT(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=_F(l);if(u===null)return null;d.args=u}t.set(c[1],d)}let n=new Set;for(let[s,i]of t.entries())s===ga&&eb(i.command,i.args)&&n.add(s),s===ya&&tb(i.command,i.args)&&n.add(s);return n}function mF(e,t){if(e.startsWith("mcp_servers"))return wa(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let r=wa(e);return r===null?null:[...t,...r]}function zT(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:wa(t[1])}function pF(e){let t=e.indexOf("=");if(t<0)return;let r=e.slice(0,t).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return wa(r)}function wa(e){let t=[],r=0,n=()=>{for(;r<e.length&&/\s/.test(e[r]);)r+=1};for(;r<e.length;){if(n(),r>=e.length)return null;if(e[r]==='"'){r+=1;let s="",i=!1;for(;r<e.length;){let o=e[r];if(o==="\\"){if(r+1>=e.length)return null;s+=e[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;t.push(s)}else{let s=r;for(;r<e.length&&/[A-Za-z0-9_-]/.test(e[r]);)r+=1;if(r===s)return null;t.push(e.slice(s,r))}if(n(),r>=e.length)break;if(e[r]!==".")return null;r+=1}return t.length>0?t:null}function ZT(e){let t=QT(e).trim();if(t.startsWith('"'))try{let r=JSON.parse(t);return typeof r=="string"?r:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function _F(e){let t=QT(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let r=t.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>ZT(s.trim()));return n.some(s=>s===null)?null:n}function QT(e){let t;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==void 0){if(t==='"'&&n==="\\"){r+=1;continue}n===t&&(t=void 0);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function hF(e){return Ot(e)?e.type==="stdio"&&typeof e.command=="string"&&eb(e.command,e.args):!1}function gF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&nb(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&rb(e.command[0],[e.command[1],e.command[2]])}function yF(e){return Ot(e)?e.type==="stdio"&&tb(e.command,e.args):!1}function wF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&sb(e.command[0])&&e.command[1]==="mcp"}function eb(e,t){return nb(e)&&ib(t)||rb(e,t)}function tb(e,t){return sb(e)&&ib(t)}function rb(e,t){return EF(e)&&Array.isArray(t)&&t.length===2&&TF(t[0])&&t[1]==="mcp"}function nb(e){return typeof e=="string"&&Nu(e)==="lmctl"}function sb(e){return typeof e=="string"&&Nu(e)==="lmctl0"}function EF(e){if(typeof e!="string")return!1;let t=Nu(e).toLowerCase();return t==="node"||t==="node.exe"}function TF(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function Nu(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function ib(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function bF(e,t){return e!==void 0&&Ea(e)===Ea(t)}function Ea(e){return Array.isArray(e)?`[${e.map(t=>Ea(t)).join(",")}]`:Ot(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ea(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ot(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ga,ya,lF,He,XT,Os=T(()=>{"use strict";ve();ga="lmctl",ya="lmctl0",lF={existsSync:tF,mkdirSync:rF,readFileSync:nF,writeFileSync:oF,renameSync:sF,unlinkSync:iF},He=lF});function lb(e){let t=ob(e.registry,e.fromTeamfile);if(t===void 0)return Nn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!ab(t,e.fromAlias))return Nn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=ob(e.registry,e.toTeamfile);return r===void 0?Nn(`target team is not registered in policy graph: ${e.toTeamfile}`):ab(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?Nn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?Nn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Nn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function ob(e,t){return e.teams.find(r=>r.teamfile===t)}function ab(e,t){return e.aliases.some(r=>r===t)}function Nn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var cb=T(()=>{"use strict"});import{randomUUID as SF}from"node:crypto";import{hostname as db,networkInterfaces as vF}from"node:os";function ub(e){let t=(e.now??new Date).toISOString();return{lock_id:SF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??db(),holder_ips:e.ips??AF(),started_at:t,last_heartbeat:t}}function fb(e=process.env){return mb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,kF)}function NF(e=process.env){return mb(e.LMCTL_TERMINAL_LOCK_STALE_MS,IF)}function xu(e,t={}){let r=t.now??new Date,n=t.localHost??db(),s=t.staleMs??NF();if(e.holder_host===n)return(t.isProcessAlive??xF)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(e.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Au(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function mb(e,t){if(e===void 0||e.trim()==="")return t;let r=e.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?t:n}function xF(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}function AF(){let e=new Set;for(let t of Object.values(vF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var kF,IF,Ru=T(()=>{"use strict";kF=15e3,IF=12e4});function RF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2079
+ `;ha=class extends Error{missing;constructor(t){let r=t.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=t}},DT=vu});import{existsSync as tF,mkdirSync as rF,readFileSync as nF,renameSync as sF,unlinkSync as iF,writeFileSync as oF}from"node:fs";import{homedir as JT}from"node:os";import{dirname as Ls,join as _t,resolve as aF}from"node:path";function In(e,t,r){let n=Ls(aF(r)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())wr(_t(o,".mcp.json"),"mcpServers",[vn(),kn()]),a.has("opencode")&&wr(_t(o,".opencode","opencode.json"),"mcp",[KT(),YT()]);for(let o of s)dF(o)}function Iu(e=XT??JT()){return _t(e,".copilot","mcp-config.json")}function GT(e,t){let r={};if(Je.existsSync(e)){let i=JSON.parse(Je.readFileSync(e,"utf8"));if(!Ot(i))throw new Error(`${e} is not a JSON object`);r=i}let n=Ot(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[i,o]of Object.entries(t)){let a=Ot(n[i])?n[i]:void 0;bF(a,o)||(n[i]=o,s=!0)}return s?(r.mcpServers=n,VT(e,r),{changed:!0}):{changed:!1}}function VT(e,t){Je.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(r,`${JSON.stringify(t,null,2)}
2080
+ `,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function cF(e,t){Je.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(r,t,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!Je.existsSync(e))return;let n=JSON.parse(Je.readFileSync(e,"utf8"));if(!Ot(n)||!Ot(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,VT(e,n),V({event:"mcp_cleanup",path:e,removed:i})}catch{}}function vn(){return{name:ya,shouldRemove:yF}}function KT(){return{name:ya,shouldRemove:wF}}function kn(){return{name:ga,shouldRemove:hF}}function YT(){return{name:ga,shouldRemove:gF}}function dF(e){let t=XT??JT();switch(e){case"copilot":wr(Iu(t),"mcpServers",[vn(),kn()]);return;case"claude":wr(_t(t,".claude.json"),"mcpServers",[vn(),kn()]);return;case"gemini":wr(_t(t,".gemini","settings.json"),"mcpServers",[vn(),kn()]);return;case"qwen":wr(_t(t,".qwen","settings.json"),"mcpServers",[vn(),kn()]);return;case"agy":wr(_t(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[vn(),kn()]);return;case"opencode":wr(_t(t,".config","opencode","opencode.json"),"mcp",[KT(),YT()]);return;case"codex":uF(_t(t,".codex","config.toml"));return;default:return}}function uF(e){try{if(!Je.existsSync(e))return;let t=Je.readFileSync(e,"utf8"),r=fF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=zT(l);if(c===null)return;if(c!==void 0){if(HT(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=pF(l);if(d===null)return;if(d!==void 0&&HT(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;cF(e,s.join(`
2081
+ `)),V({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function HT(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function fF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=zT(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=mF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==ga&&c[1]!==ya)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=ZT(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=_F(l);if(u===null)return null;d.args=u}t.set(c[1],d)}let n=new Set;for(let[s,i]of t.entries())s===ga&&eb(i.command,i.args)&&n.add(s),s===ya&&tb(i.command,i.args)&&n.add(s);return n}function mF(e,t){if(e.startsWith("mcp_servers"))return wa(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let r=wa(e);return r===null?null:[...t,...r]}function zT(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:wa(t[1])}function pF(e){let t=e.indexOf("=");if(t<0)return;let r=e.slice(0,t).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return wa(r)}function wa(e){let t=[],r=0,n=()=>{for(;r<e.length&&/\s/.test(e[r]);)r+=1};for(;r<e.length;){if(n(),r>=e.length)return null;if(e[r]==='"'){r+=1;let s="",i=!1;for(;r<e.length;){let o=e[r];if(o==="\\"){if(r+1>=e.length)return null;s+=e[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;t.push(s)}else{let s=r;for(;r<e.length&&/[A-Za-z0-9_-]/.test(e[r]);)r+=1;if(r===s)return null;t.push(e.slice(s,r))}if(n(),r>=e.length)break;if(e[r]!==".")return null;r+=1}return t.length>0?t:null}function ZT(e){let t=QT(e).trim();if(t.startsWith('"'))try{let r=JSON.parse(t);return typeof r=="string"?r:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function _F(e){let t=QT(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let r=t.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>ZT(s.trim()));return n.some(s=>s===null)?null:n}function QT(e){let t;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==void 0){if(t==='"'&&n==="\\"){r+=1;continue}n===t&&(t=void 0);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function hF(e){return Ot(e)?e.type==="stdio"&&typeof e.command=="string"&&eb(e.command,e.args):!1}function gF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&nb(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&rb(e.command[0],[e.command[1],e.command[2]])}function yF(e){return Ot(e)?e.type==="stdio"&&tb(e.command,e.args):!1}function wF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&sb(e.command[0])&&e.command[1]==="mcp"}function eb(e,t){return nb(e)&&ib(t)||rb(e,t)}function tb(e,t){return sb(e)&&ib(t)}function rb(e,t){return EF(e)&&Array.isArray(t)&&t.length===2&&TF(t[0])&&t[1]==="mcp"}function nb(e){return typeof e=="string"&&Nu(e)==="lmctl"}function sb(e){return typeof e=="string"&&Nu(e)==="lmctl0"}function EF(e){if(typeof e!="string")return!1;let t=Nu(e).toLowerCase();return t==="node"||t==="node.exe"}function TF(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function Nu(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function ib(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function bF(e,t){return e!==void 0&&Ea(e)===Ea(t)}function Ea(e){return Array.isArray(e)?`[${e.map(t=>Ea(t)).join(",")}]`:Ot(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ea(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ot(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ga,ya,lF,Je,XT,Os=T(()=>{"use strict";Te();ga="lmctl",ya="lmctl0",lF={existsSync:tF,mkdirSync:rF,readFileSync:nF,writeFileSync:oF,renameSync:sF,unlinkSync:iF},Je=lF});function lb(e){let t=ob(e.registry,e.fromTeamfile);if(t===void 0)return Nn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!ab(t,e.fromAlias))return Nn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=ob(e.registry,e.toTeamfile);return r===void 0?Nn(`target team is not registered in policy graph: ${e.toTeamfile}`):ab(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?Nn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?Nn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Nn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function ob(e,t){return e.teams.find(r=>r.teamfile===t)}function ab(e,t){return e.aliases.some(r=>r===t)}function Nn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var cb=T(()=>{"use strict"});import{randomUUID as SF}from"node:crypto";import{hostname as db,networkInterfaces as vF}from"node:os";function ub(e){let t=(e.now??new Date).toISOString();return{lock_id:SF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??db(),holder_ips:e.ips??AF(),started_at:t,last_heartbeat:t}}function fb(e=process.env){return mb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,kF)}function NF(e=process.env){return mb(e.LMCTL_TERMINAL_LOCK_STALE_MS,IF)}function xu(e,t={}){let r=t.now??new Date,n=t.localHost??db(),s=t.staleMs??NF();if(e.holder_host===n)return(t.isProcessAlive??xF)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(e.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Au(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function mb(e,t){if(e===void 0||e.trim()==="")return t;let r=e.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?t:n}function xF(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}function AF(){let e=new Set;for(let t of Object.values(vF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var kF,IF,Ru=T(()=>{"use strict";kF=15e3,IF=12e4});function RF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2082
2082
  manually, outside a member session that lmctl started. Running lmctl this way is
2083
2083
  not officially supported.
2084
2084
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function $s(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2085
2085
  The session marker may be stale or the team may not be registered in this lmctl database.
2086
2086
  Consulted ${Vs(Dt(),le())}
2087
2087
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function pb(e){return`unknown option --from
2088
- ${RF(e)}`}function _b(e,t){let r=Lu(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Lu(e,t){let r=e[Kn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=De(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ta=T(()=>{"use strict";it();Je();Rt()});function qr(e){let t=Wr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Ou=T(()=>{"use strict";Lt()});async function ka(e){let t=e.onEvent??(()=>{}),r=OF(e.io,t),n=null,s=null,i=null,o,a=null,l=e.prompt;try{let c=await $(r,w=>qe(e.teamfile,e.alias,w)),d=c.teamfile,u=await $(r,w=>UF(w,e.env??process.env)),f=u.sender,m=await WF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await BF(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2089
- `}),i=await MF(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:e.prompt,origin:u.origin}),o=PF(r,i);try{In(r,je(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let _=await wb(r,d,c.alias);if(_!==null){let w=Au(_);if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}if(await $F(r,d,c.alias)){if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let w=await CF(r,d,c.alias),I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}if(f!==null&&f.teamfile!==d){let w=await $(r,I=>dE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=fE(w.chain),x=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:I});return a=Sa(I,x),{status:"error",errorKind:"cycle",message:I,teamChatLogId:x}}}let g=await JF(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator"});if(!g.acquired){let w=Eb(d,c.alias,g.current);if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}s=g.lease;let h=await Qo({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:e.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:w=>t({kind:"delta",chunk:w}),onProgress:w=>t({kind:"progress",alias:c.alias,event:w}),onPromptBuilt:w=>{if(l=w,i!==null)return DF(r,i,w)}});l=h.prompt;let S=h.status==="stalled",y=await xn(r,{...n,message:l,response:S?null:h.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`:null});return a=S?Sa(`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`,y,h.receipt):ba(h.receipt,y),{status:S?"stalled":"ok",replyText:h.receipt,wroteDelta:h.wroteDelta,teamChatLogId:y,durationMs:h.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c),u=n===null?null:await xn(r,{...n,message:l,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${d}`:d});return a=Sa(d,u),{status:"error",errorKind:c instanceof ge?"target":"provider",message:d,teamChatLogId:u}}finally{o!==void 0&&clearInterval(o),s!==null&&await XF(r,s),i!==null&&await jF(r,i,a??Sa("chat turn exited without a terminal outcome",null))}}function OF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function $F(e,t,r){return await $(e,n=>Zw(n,t,r))}async function CF(e,t,r){let n=await wb(e,t,r);if(n!==null)return Au(n);let s=await $(e,i=>i.getAgentInflight(t,r));return s!==null?Eb(t,r,s):`${r} is busy; wait and retry`}async function $u(e,t){return await $(e,r=>r.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,payload:t.payload}))}function Cu(e,t,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:e,message:`mailbox message ${e} enqueued to ${s}`,teamChatLogId:null,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function MF(e,t){try{return(await $(e,n=>n.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:FF(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(r){return ce()&&Le(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function jF(e,t,r){try{await $(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&Le(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function DF(e,t,r){try{await $(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&Le(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function PF(e,t){if(t===null)return;let r=setInterval(()=>{$(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&Le(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},LF);return r.unref?.(),r}function ba(e,t){return{status:"done",result_summary:va(e),error:null,team_chat_log_id:t}}function Mu(e,t){return{status:"busy",result_summary:va(e),error:e,team_chat_log_id:t}}function Sa(e,t,r){return{status:"error",result_summary:va(r===void 0?e:r),error:e,team_chat_log_id:t}}function va(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function FF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function UF(e,t){let r=_b(t,e);if(r.ok)return{sender:qr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error($s("chat"))}async function WF(e,t){if(t.explicitRoot!==void 0)return await $(e,n=>we(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await $(e,n=>uE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function BF(e,t){return await $(e,r=>lb({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:qF(r,t.sender.teamfile,t.receiverTeamfile)}))}function qF(e,t,r){return{teams:[t,r].map(s=>HF(s,e))}}function HF(e,t){let r=De(e,t),n=At(r);return{teamfile:e,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function JF(e,t){return await $(e,r=>{let n=ce(),s=hr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:gr()});return s.acquired?(n&&Le(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:gb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Le(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:gb(s.current)})),{acquired:!1,current:s.current})})}async function wb(e,t,r){return await $(e,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(t,r);if(o===null)return null;if(xu(o).live)return o;let l=n.getAgentInflight(t,r);if(n.clearTerminalLock(t,r,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(t,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(t,r);return s===null?null:xu(s).live?s:null})}function gb(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function XF(e,t){try{await $(e,r=>{r.releaseAgentInflight(t)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2088
+ ${RF(e)}`}function _b(e,t){let r=Lu(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Lu(e,t){let r=e[Kn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=Pe(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ta=T(()=>{"use strict";it();Xe();Rt()});function qr(e){let t=Wr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Ou=T(()=>{"use strict";Lt()});async function ka(e){let t=e.onEvent??(()=>{}),r=OF(e.io,t),n=null,s=null,i=null,o,a=null,l=e.prompt;try{let c=await $(r,w=>He(e.teamfile,e.alias,w)),d=c.teamfile,u=await $(r,w=>UF(w,e.env??process.env)),f=u.sender,m=await WF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await BF(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2089
+ `}),i=await MF(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:e.prompt,origin:u.origin}),o=PF(r,i);try{In(r,De(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let _=await wb(r,d,c.alias);if(_!==null){let w=Au(_);if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}if(await $F(r,d,c.alias)){if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let w=await CF(r,d,c.alias),I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}if(f!==null&&f.teamfile!==d){let w=await $(r,I=>dE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=fE(w.chain),x=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:I});return a=Sa(I,x),{status:"error",errorKind:"cycle",message:I,teamChatLogId:x}}}let g=await JF(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator"});if(!g.acquired){let w=Eb(d,c.alias,g.current);if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}s=g.lease;let h=await Qo({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:e.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:w=>t({kind:"delta",chunk:w}),onProgress:w=>t({kind:"progress",alias:c.alias,event:w}),onPromptBuilt:w=>{if(l=w,i!==null)return DF(r,i,w)}});l=h.prompt;let S=h.status==="stalled",y=await xn(r,{...n,message:l,response:S?null:h.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`:null});return a=S?Sa(`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`,y,h.receipt):ba(h.receipt,y),{status:S?"stalled":"ok",replyText:h.receipt,wroteDelta:h.wroteDelta,teamChatLogId:y,durationMs:h.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c),u=n===null?null:await xn(r,{...n,message:l,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${d}`:d});return a=Sa(d,u),{status:"error",errorKind:c instanceof ge?"target":"provider",message:d,teamChatLogId:u}}finally{o!==void 0&&clearInterval(o),s!==null&&await XF(r,s),i!==null&&await jF(r,i,a??Sa("chat turn exited without a terminal outcome",null))}}function OF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function $F(e,t,r){return await $(e,n=>Zw(n,t,r))}async function CF(e,t,r){let n=await wb(e,t,r);if(n!==null)return Au(n);let s=await $(e,i=>i.getAgentInflight(t,r));return s!==null?Eb(t,r,s):`${r} is busy; wait and retry`}async function $u(e,t){return await $(e,r=>r.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,payload:t.payload}))}function Cu(e,t,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:e,message:`mailbox message ${e} enqueued to ${s}`,teamChatLogId:null,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function MF(e,t){try{return(await $(e,n=>n.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:FF(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(r){return ce()&&Le(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function jF(e,t,r){try{await $(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&Le(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function DF(e,t,r){try{await $(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&Le(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function PF(e,t){if(t===null)return;let r=setInterval(()=>{$(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&Le(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},LF);return r.unref?.(),r}function ba(e,t){return{status:"done",result_summary:va(e),error:null,team_chat_log_id:t}}function Mu(e,t){return{status:"busy",result_summary:va(e),error:e,team_chat_log_id:t}}function Sa(e,t,r){return{status:"error",result_summary:va(r===void 0?e:r),error:e,team_chat_log_id:t}}function va(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function FF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function UF(e,t){let r=_b(t,e);if(r.ok)return{sender:qr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error($s("chat"))}async function WF(e,t){if(t.explicitRoot!==void 0)return await $(e,n=>we(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await $(e,n=>uE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function BF(e,t){return await $(e,r=>lb({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:qF(r,t.sender.teamfile,t.receiverTeamfile)}))}function qF(e,t,r){return{teams:[t,r].map(s=>HF(s,e))}}function HF(e,t){let r=Pe(e,t),n=At(r);return{teamfile:e,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function JF(e,t){return await $(e,r=>{let n=ce(),s=hr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:gr()});return s.acquired?(n&&Le(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:gb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Le(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:gb(s.current)})),{acquired:!1,current:s.current})})}async function wb(e,t,r){return await $(e,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(t,r);if(o===null)return null;if(xu(o).live)return o;let l=n.getAgentInflight(t,r);if(n.clearTerminalLock(t,r,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(t,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(t,r);return s===null?null:xu(s).live?s:null})}function gb(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function XF(e,t){try{await $(e,r=>{r.releaseAgentInflight(t)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2090
2090
  `)}}function Eb(e,t,r){return`${t} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${e}" ${t}`}async function xn(e,t){let r=yb(t.message),n=t.response===null?null:yb(t.response);try{return await $(e,s=>s.insertTeamChatLog({root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,message:r.text,response:n?.text??null,origin:t.origin,status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return e.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2091
- `),null}}function yb(e){return e.length<=hb?{text:e,truncated:!1}:{text:e.slice(0,hb),truncated:!0}}var hb,LF,ju=T(()=>{"use strict";Lt();zt();Os();cb();Rt();ea();ve();Re();Fr();Ru();Ta();Ou();qd();hb=256*1024,LF=3e4});var vb={};ye(vb,{parseIdleTimeoutMs:()=>bb,runChat:()=>VF});async function VF(e,t={stdout:process.stdout,stderr:process.stderr}){let r=t.env??process.env;if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(`${Tb}
2091
+ `),null}}function yb(e){return e.length<=hb?{text:e,truncated:!1}:{text:e.slice(0,hb),truncated:!0}}var hb,LF,ju=T(()=>{"use strict";Lt();zt();Os();cb();Rt();ea();Te();Re();Fr();Ru();Ta();Ou();qd();hb=256*1024,LF=3e4});var vb={};ye(vb,{parseIdleTimeoutMs:()=>bb,runChat:()=>VF});async function VF(e,t={stdout:process.stdout,stderr:process.stderr}){let r=t.env??process.env;if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(`${Tb}
2092
2092
  `),e.length===0?2:0;let n=KF(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
2093
2093
  ${Tb}
2094
2094
  `),2;if(n.runFlag!==void 0){let u=Number.parseInt(n.runFlag,10);return!Number.isFinite(u)||u<=0||String(u)!==n.runFlag?(t.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
@@ -2125,7 +2125,7 @@ ${Tb}
2125
2125
  `),1}}function KF(e){let t=[],r="yolo",n,s,i,o,a,l=!1,c=!1;for(let p=0;p<e.length;p+=1){let _=e[p];if(_==="--permission-mode"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;r=g;continue}if(_==="--idle-timeout"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let h=bb(g);if(typeof h=="string")return h;n=h;continue}if(_==="--session"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(_==="--provider"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --provider";i=g;continue}if(_==="--from"||_.startsWith("--from="))return pb("chat");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --root";o=g;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(_==="--json"){c=!0;continue}if(_==="--run"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --run";a=g;continue}if(_==="--done"){l=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;t.push(_)}if(a!==void 0)return s!==void 0?"--run is mutually exclusive with --session":i!==void 0?"--run is mutually exclusive with --provider":o!==void 0?"--run is mutually exclusive with --root":t.length===0?"a prompt (answer) is required with --run":t.length>1?`--run takes exactly one positional (the answer); got ${t.length}`:{prompt:t[0],permissionMode:r,runFlag:a,done:l,json:c};let d,u,f;if(t.length===0)return"a prompt is required";if(t.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';f=t[0]}else if(t.length===2)d=t[0],f=t[1];else if(t.length===3)d=t[0],u=t[1],f=t[2];else return`too many positionals (${t.length}); expected at most <teamfile> <alias> <prompt>`;if(l)return"--done requires --run";let m={prompt:f,permissionMode:r};return d!==void 0&&(m.target=d),u!==void 0&&(m.alias=u),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),i!==void 0&&(m.providerFlag=i),o!==void 0&&(m.rootFlag=o),c&&(m.json=c),m}function bb(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(t[1]),n=t[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Sb(e,t,r){r.kind==="tool_use"?e.stderr.write(`[${t}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2126
2126
  `):r.kind==="tool_result"?e.stderr.write(`[${t}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
2127
2127
  `):r.kind==="api_retry"&&e.stderr.write(`[${t}] api_retry${r.summary?`: ${r.summary}`:""}
2128
- `)}function YF(e,t){return e.slice(-t)}function zF(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?Sb(e,t.alias,t.event):e.stderr.write(t.message)}var GF,Tb,kb=T(()=>{"use strict";vt();Re();Lt();ju();Ta();ve();Xo();Jt();GF={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Tb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2128
+ `)}function YF(e,t){return e.slice(-t)}function zF(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?Sb(e,t.alias,t.event):e.stderr.write(t.message)}var GF,Tb,kb=T(()=>{"use strict";vt();Re();Lt();ju();Ta();Te();Xo();Jt();GF={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Tb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2129
2129
  lmctl chat <teamfile> <alias> "<prompt>"
2130
2130
  lmctl chat <sessionid> "<prompt>" --provider <name>
2131
2131
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -2133,29 +2133,29 @@ ${Tb}
2133
2133
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
2134
2134
  [--root <teamfile>] [--json]
2135
2135
 
2136
- Send a prompt to a team member or raw provider session, or answer a paused run.`});function Cs(e){for(let t=e.length-1;t>=0;t-=1){let r=e[t],n=ZF.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:QF(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function QF(e,t,r,n,s){if(!Number.isFinite(e.getTime())||t<1||t>12||r<0||r>59)return null;let i=e1(t,n);try{let o=t1(e,s),a=Ib(o.year,o.month,o.day,i,r,s);if(a.getTime()<=e.getTime()){let l=i1(o,1);a=Ib(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function e1(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function t1(e,t){let r=Nb(t,!1).formatToParts(e);return{year:Zt(r,"year"),month:Zt(r,"month"),day:Zt(r,"day")}}function Ib(e,t,r,n,s,i){let o=Date.UTC(e,t-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=r1(new Date(o),i);o=Date.UTC(e,t-1,r,n,s,0,0)-l}return new Date(o)}function r1(e,t){let r=Nb(t,!0).formatToParts(e);return Date.UTC(Zt(r,"year"),Zt(r,"month")-1,Zt(r,"day"),Zt(r,"hour"),Zt(r,"minute"),Zt(r,"second"),0)-e.getTime()}function Nb(e,t){let r=t?s1:n1,n=r.get(e);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(e,s),s}function Zt(e,t){let r=e.find(n=>n.type===t)?.value;if(r===void 0)throw new Error(`missing ${t}`);return Number.parseInt(r,10)}function i1(e,t){let r=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var ZF,n1,s1,Du=T(()=>{"use strict";ZF=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;n1=new Map,s1=new Map});function Ia(e){return o1.has(e)}function Fu(){return Pu===null&&(Pu=Et(bt())),Pu}function Uu(e,t,r={}){if(!Ia(e))return null;try{let n=Fu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?di({warn:()=>{}}):[];return[...i,...o,...xb[e]??[]]}catch{return null}}function Na(e,t){let r=Uu(e,t);return r===null?null:r.join(" ")}function Qt(e,t){return Fu().getSession(e,t)}async function xa(e){return(await Fu().resolveSessions(e)).map(r=>r.provider.name)}var xb,o1,Ab,Pu,An=T(()=>{"use strict";vt();_l();xb={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},o1=new Set(Object.keys(xb)),Ab=/^[\w.:-]+$/;Pu=null});var Ob={};ye(Ob,{runRecover:()=>l1});import{dirname as Rb,resolve as Lb}from"node:path";async function l1(e,t,r={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Wu}
2136
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});function Cs(e){for(let t=e.length-1;t>=0;t-=1){let r=e[t],n=ZF.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:QF(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function QF(e,t,r,n,s){if(!Number.isFinite(e.getTime())||t<1||t>12||r<0||r>59)return null;let i=e1(t,n);try{let o=t1(e,s),a=Ib(o.year,o.month,o.day,i,r,s);if(a.getTime()<=e.getTime()){let l=i1(o,1);a=Ib(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function e1(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function t1(e,t){let r=Nb(t,!1).formatToParts(e);return{year:Zt(r,"year"),month:Zt(r,"month"),day:Zt(r,"day")}}function Ib(e,t,r,n,s,i){let o=Date.UTC(e,t-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=r1(new Date(o),i);o=Date.UTC(e,t-1,r,n,s,0,0)-l}return new Date(o)}function r1(e,t){let r=Nb(t,!0).formatToParts(e);return Date.UTC(Zt(r,"year"),Zt(r,"month")-1,Zt(r,"day"),Zt(r,"hour"),Zt(r,"minute"),Zt(r,"second"),0)-e.getTime()}function Nb(e,t){let r=t?s1:n1,n=r.get(e);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(e,s),s}function Zt(e,t){let r=e.find(n=>n.type===t)?.value;if(r===void 0)throw new Error(`missing ${t}`);return Number.parseInt(r,10)}function i1(e,t){let r=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var ZF,n1,s1,Du=T(()=>{"use strict";ZF=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;n1=new Map,s1=new Map});function Ia(e){return a1.has(e)}function Fu(){return Pu===null&&(Pu=Et(bt())),Pu}function Uu(e,t,r={}){if(!Ia(e))return null;try{let n=Fu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?di({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?o1[e]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:e,model:r.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...xb[e]??[]]}catch{return null}}function Na(e,t,r={}){let n=Uu(e,t,r);return n===null?null:n.join(" ")}function Qt(e,t){return Fu().getSession(e,t)}async function xa(e){return(await Fu().resolveSessions(e)).map(r=>r.provider.name)}var xb,o1,a1,Ab,Pu,An=T(()=>{"use strict";vt();_l();xb={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},o1={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e]},a1=new Set(Object.keys(xb)),Ab=/^[\w.:-]+$/;Pu=null});var Ob={};ye(Ob,{runRecover:()=>c1});import{dirname as Rb,resolve as Lb}from"node:path";async function c1(e,t,r={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Wu}
2137
2137
  `),0;let n=Z(e.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return v(t,`${n.error}
2138
2138
 
2139
2139
  ${Wu}`);if(n.positionals.length===0)return v(t,`recover requires a <teamfile>
2140
2140
 
2141
- ${Wu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Wr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(G(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await c1(t,o,l)}catch(p){if(p instanceof ge)return v(t,p.message);throw p}let d=r.now??new Date,u=G(n,"--dry-run"),f=[];for(let p of c)f.push(await d1(t,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(G(n,"--json"))ae(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(u1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2142
- `)}return m.errors>0?1:0}async function c1(e,t,r){return await $(e,n=>{let s=we(t,n);if(r!==void 0){let i=De(s,n);if(i.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=na(i,r);return o?.teamfile!==void 0?Bu(Lb(Rb(s),o.teamfile),n,new Set):[qe(t,r,n)]}return Bu(s,n,new Set)})}function Bu(e,t,r){let n=we(e,t);if(r.has(n))return[];r.add(n);let s=De(n,t);if(s.parseErrors.length>0)throw new ge(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Bu(Lb(Rb(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(qe(n,o.alias,t))}return i}async function d1(e,t,r){let n;try{let a=await Qt(t.sessionid,t.provider);if(a===null)return $t(t,"session_not_found",null,"session detail not found");n=Cs(a.messages)}catch(a){return $t(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(t,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await $(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return $t(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return $t(t,"would_recover",n,null);let o=await ka({teamfile:t.teamfile,alias:t.alias,prompt:a1,permissionMode:"yolo",io:e,env:process.env});return o.status==="ok"||o.status==="stalled"?$t(t,"recovered",n,null):$t(t,o.status==="busy"?"busy":"send_error",n,o.message)}function $t(e,t,r,n){return{alias:e.alias,teamfile:e.teamfile,provider:e.provider,sessionid:e.sessionid,action:t,sessionLimit:r,reason:n}}function u1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2143
- `}var a1,Wu,$b=T(()=>{"use strict";Du();An();zt();Rt();Lt();ju();Re();a1="Your session limit reset time has passed. Continue your work from the last actionable point.",Wu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2144
- `)});var Ms,J6,qu=T(()=>{"use strict";Ms=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],J6=Ms.length});import{spawn as f1}from"node:child_process";async function Mb(e,t,r){let n=p1.get(e);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return _1(n.name,s)}function _1(e,t){return e==="lmctl_chat"?h1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function h1(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof e.team=="string"?e.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",r,n,t];return ce()&&Le(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),g1(s,process.cwd())}function g1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=f1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=y1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Le(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2145
- `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function y1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Cb;let r=Number(t);return!Number.isFinite(r)||r<=0?Cb:r}function Hu(e,t=process.env){let n=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:m1),i=e.getConfig("api.token")??(t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:null);return{baseUrl:n,token:i}}var m1,Cb,p1,Ju=T(()=>{"use strict";qu();ve();m1="http://127.0.0.1:8787",Cb=30*60*1e3,p1=new Map(Ms.map(e=>[e.name,e]))});async function b1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Xu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:w1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:E1,version:T1}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Ms.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Mb(i,o,t.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${e.method}`}}}}function Xu(e){return`${JSON.stringify(e)}
2146
- `}async function jb(e,t){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){e.io.write(Xu({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await b1(l,e);c.kind==="response"?e.io.write(Xu(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2141
+ ${Wu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Wr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(G(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await d1(t,o,l)}catch(p){if(p instanceof ge)return v(t,p.message);throw p}let d=r.now??new Date,u=G(n,"--dry-run"),f=[];for(let p of c)f.push(await u1(t,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(G(n,"--json"))ae(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(f1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2142
+ `)}return m.errors>0?1:0}async function d1(e,t,r){return await $(e,n=>{let s=we(t,n);if(r!==void 0){let i=Pe(s,n);if(i.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=na(i,r);return o?.teamfile!==void 0?Bu(Lb(Rb(s),o.teamfile),n,new Set):[He(t,r,n)]}return Bu(s,n,new Set)})}function Bu(e,t,r){let n=we(e,t);if(r.has(n))return[];r.add(n);let s=Pe(n,t);if(s.parseErrors.length>0)throw new ge(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Bu(Lb(Rb(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(He(n,o.alias,t))}return i}async function u1(e,t,r){let n;try{let a=await Qt(t.sessionid,t.provider);if(a===null)return $t(t,"session_not_found",null,"session detail not found");n=Cs(a.messages)}catch(a){return $t(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(t,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await $(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return $t(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return $t(t,"would_recover",n,null);let o=await ka({teamfile:t.teamfile,alias:t.alias,prompt:l1,permissionMode:"yolo",io:e,env:process.env});return o.status==="ok"||o.status==="stalled"?$t(t,"recovered",n,null):$t(t,o.status==="busy"?"busy":"send_error",n,o.message)}function $t(e,t,r,n){return{alias:e.alias,teamfile:e.teamfile,provider:e.provider,sessionid:e.sessionid,action:t,sessionLimit:r,reason:n}}function f1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2143
+ `}var l1,Wu,$b=T(()=>{"use strict";Du();An();zt();Rt();Lt();ju();Re();l1="Your session limit reset time has passed. Continue your work from the last actionable point.",Wu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2144
+ `)});var Ms,X6,qu=T(()=>{"use strict";Ms=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],X6=Ms.length});import{spawn as m1}from"node:child_process";async function Mb(e,t,r){let n=_1.get(e);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return h1(n.name,s)}function h1(e,t){return e==="lmctl_chat"?g1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function g1(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof e.team=="string"?e.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",r,n,t];return ce()&&Le(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),y1(s,process.cwd())}function y1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=m1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=w1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Le(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2145
+ `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function w1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Cb;let r=Number(t);return!Number.isFinite(r)||r<=0?Cb:r}function Hu(e,t=process.env){let n=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:p1),i=e.getConfig("api.token")??(t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:null);return{baseUrl:n,token:i}}var p1,Cb,_1,Ju=T(()=>{"use strict";qu();Te();p1="http://127.0.0.1:8787",Cb=30*60*1e3,_1=new Map(Ms.map(e=>[e.name,e]))});async function S1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Xu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:E1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:T1,version:b1}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Ms.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Mb(i,o,t.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${e.method}`}}}}function Xu(e){return`${JSON.stringify(e)}
2146
+ `}async function jb(e,t){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){e.io.write(Xu({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await S1(l,e);c.kind==="response"?e.io.write(Xu(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2147
2147
  `);for(;u!==-1;){let f=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),u=n.indexOf(`
2148
2148
  `)}};t.setEncoding("utf8"),t.on("data",u=>{n+=u,d()}),t.on("end",()=>{n.trim().length>0&&(a=a.then(()=>i(n))),a.finally(()=>c(0))}),t.on("error",u=>{e.io.log?.(`mcp: stdin error: ${u.message}
2149
- `),a.finally(()=>c(1))})})}var w1,E1,T1,Db=T(()=>{"use strict";qu();Ju();w1="2025-06-18",E1="lmctl",T1="0.0.1"});var Fb={};ye(Fb,{runMcp:()=>v1});async function v1(e,t={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(S1),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
2150
- `),2;V({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??k1(),i=1;try{let o=s===void 0?Hu({getConfig:()=>null},process.env):Hu(s,process.env);return i=await jb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{V({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function k1(){let e=le(),t=3;for(let r=1;r<=t;r+=1)try{return Ie({path:e})}catch(n){let s=n instanceof Error?n.message:String(n);if(V({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Pb(s))I1(50*r);else if(!Pb(s))break}}function Pb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function I1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var S1,Ub=T(()=>{"use strict";Ze();Ju();Db();ve();Je();S1=`usage: lmctl mcp
2149
+ `),a.finally(()=>c(1))})})}var E1,T1,b1,Db=T(()=>{"use strict";qu();Ju();E1="2025-06-18",T1="lmctl",b1="0.0.1"});var Fb={};ye(Fb,{runMcp:()=>k1});async function k1(e,t={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(v1),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
2150
+ `),2;V({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??I1(),i=1;try{let o=s===void 0?Hu({getConfig:()=>null},process.env):Hu(s,process.env);return i=await jb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{V({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function I1(){let e=le(),t=3;for(let r=1;r<=t;r+=1)try{return Ie({path:e})}catch(n){let s=n instanceof Error?n.message:String(n);if(V({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Pb(s))N1(50*r);else if(!Pb(s))break}}function Pb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function N1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var v1,Ub=T(()=>{"use strict";Ze();Ju();Db();Te();Xe();v1=`usage: lmctl mcp
2151
2151
 
2152
2152
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2153
2153
  local config, then uses stdin/stdout for JSON-RPC frames.
2154
- `});var Wb={};ye(Wb,{runDevice:()=>D1});import{readFileSync as N1}from"node:fs";import{homedir as x1}from"node:os";import{join as A1}from"node:path";import{CognitoIdentityClient as R1,GetIdCommand as L1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as O1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as $1,ListObjectsV2Command as C1,PutObjectCommand as M1,S3Client as j1}from"@aws-sdk/client-s3";async function D1(e,t={stdout:process.stdout,stderr:process.stderr}){let[r]=e;if(r===void 0||r==="--help"||r==="-h"||r==="help")return t.stdout.write(Gu),0;if(r==="init"){let n=bu();return t.stdout.write(`${n.device_id}
2154
+ `});var Wb={};ye(Wb,{runDevice:()=>P1});import{readFileSync as x1}from"node:fs";import{homedir as A1}from"node:os";import{join as R1}from"node:path";import{CognitoIdentityClient as L1,GetIdCommand as O1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as $1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as C1,ListObjectsV2Command as M1,PutObjectCommand as j1,S3Client as D1}from"@aws-sdk/client-s3";async function P1(e,t={stdout:process.stdout,stderr:process.stderr}){let[r]=e;if(r===void 0||r==="--help"||r==="-h"||r==="help")return t.stdout.write(Gu),0;if(r==="init"){let n=bu();return t.stdout.write(`${n.device_id}
2155
2155
  `),0}if(r==="id"){let n=Br();return n===null?(t.stderr.write(`error: no device id initialized at ${pa()}; run 'lmctl device init'
2156
2156
  `),1):(t.stdout.write(`${n.device_id}
2157
- `),0)}return r==="login"?await P1(e.slice(1),t):r==="prompt"?await U1(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
2158
- `),1)}async function P1(e,t){let r=F1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2157
+ `),0)}return r==="login"?await F1(e.slice(1),t):r==="prompt"?await W1(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
2158
+ `),1)}async function F1(e,t){let r=U1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2159
2159
  ${Gu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2160
2160
  `),1;lT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await la({region:n.config.region,clientId:n.config.cognitoClientId??ma,refreshToken:r.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return t.stderr.write(`error: could not authenticate access key: ${d}
2161
2161
  `),1}let a=Ns(s);if(a!==null&&a!==r.userId)return t.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
@@ -2163,10 +2163,10 @@ ${Gu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox
2163
2163
  device id: ${l.device_id}
2164
2164
  mailbox prefix: ${r.userId}/${l.device_id}/
2165
2165
  access key stored at ${xs()}
2166
- `),0}function F1(e){let t,r;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--user-id"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";t=i;continue}if(s==="--access-key"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;continue}return`unknown argument: ${s}`}return t===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:t,accessKey:r}}async function U1(e,t){let r=W1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2166
+ `),0}function U1(e){let t,r;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--user-id"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";t=i;continue}if(s==="--access-key"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;continue}return`unknown argument: ${s}`}return t===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:t,accessKey:r}}async function W1(e,t){let r=B1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2167
2167
  ${Gu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2168
- `),1;let s=q1();if(s===null)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await B1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=O1({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Br()?.device_id,d=Ns(i)??void 0,u=new Dr({bucket:n.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new j1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:C1,GetObjectCommand:$1,PutObjectCommand:M1},selfRole:"browser",onMessage:async()=>{}}),f=zE({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await u.putMessage({conversation_id:YE,payload:f});return t.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
2169
- `),0}function W1(e){let t,r,n;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--root"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";t=o;continue}if(i==="--text"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return t===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:t,text:r,...n!==void 0?{promptId:n}:{}}}async function B1(e){let r=await new R1({region:e.region}).send(new L1({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function q1(e=process.env.LMCTL_TOKEN_PATH??A1(x1(),".lmctl","cli-tokens.json")){try{return JSON.parse(N1(e,"utf8"))}catch{return null}}var Gu,Bb=T(()=>{"use strict";Su();gu();Fo();cu();du();pu();uu();Gu=`usage: lmctl device <id|init|login|prompt>
2168
+ `),1;let s=H1();if(s===null)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await q1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=$1({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Br()?.device_id,d=Ns(i)??void 0,u=new Dr({bucket:n.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new D1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:M1,GetObjectCommand:C1,PutObjectCommand:j1},selfRole:"browser",onMessage:async()=>{}}),f=zE({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await u.putMessage({conversation_id:YE,payload:f});return t.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
2169
+ `),0}function B1(e){let t,r,n;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--root"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";t=o;continue}if(i==="--text"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return t===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:t,text:r,...n!==void 0?{promptId:n}:{}}}async function q1(e){let r=await new L1({region:e.region}).send(new O1({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function H1(e=process.env.LMCTL_TOKEN_PATH??R1(A1(),".lmctl","cli-tokens.json")){try{return JSON.parse(x1(e,"utf8"))}catch{return null}}var Gu,Bb=T(()=>{"use strict";Su();gu();Fo();cu();du();pu();uu();Gu=`usage: lmctl device <id|init|login|prompt>
2170
2170
  lmctl device login --user-id <sub> --access-key <refreshToken>
2171
2171
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
2172
2172
 
@@ -2176,7 +2176,7 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
2176
2176
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
2177
2177
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
2178
2178
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2179
- `});import{existsSync as qb,mkdirSync as H1,readdirSync as J1,readFileSync as Hb,writeFileSync as X1}from"node:fs";import{join as Rn}from"node:path";import{fileURLToPath as G1}from"node:url";function Ku(e){try{return V1.some(t=>qb(Rn(e,t)))}catch{return!1}}function K1(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function Jb(e,t){e.durable_memory_mode!=="db"?Y1(e):z1(e,t)}function Xb(e){let t=Ku(e),r;try{r=J1(Vu).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function Y1(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Rn(t,"durable-memory");try{H1(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=Xb(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Rn(r,o);if(!qb(a))try{let l=Hb(Rn(Vu,i),"utf8");X1(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function z1(e,t){let r=e.local_path??"",n=Xb(r),s=[];for(let i of n){let o=Rn(Vu,i),a;try{a=Hb(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=K1(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var Vu,V1,Yu=T(()=>{"use strict";Vu=Rn(G1(import.meta.url),"../../config/durable_memory_templates"),V1=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as Z1,mkdirSync as Q1,readdirSync as eU,readFileSync as tU,writeFileSync as rU}from"node:fs";import{join as Aa}from"node:path";import{fileURLToPath as nU}from"node:url";function Vb(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Ku(t))return;let r=Aa(t,"ai-test");try{Q1(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of sU()){let i=s.replace(/\.template$/,""),o=Aa(r,i);if(!Z1(o))try{rU(o,iU(s),"utf8"),n.push(i)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function sU(){try{return eU(Gb).filter(e=>e.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function iU(e){try{return tU(Aa(Gb,e),"utf8")}catch{return oU(e)}}function oU(e){let t=e.replace(/\.template$/,"");return t==="index.md"?`# AI Test Suite - index
2179
+ `});import{existsSync as qb,mkdirSync as J1,readdirSync as X1,readFileSync as Hb,writeFileSync as G1}from"node:fs";import{join as Rn}from"node:path";import{fileURLToPath as V1}from"node:url";function Ku(e){try{return K1.some(t=>qb(Rn(e,t)))}catch{return!1}}function Y1(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function Jb(e,t){e.durable_memory_mode!=="db"?z1(e):Z1(e,t)}function Xb(e){let t=Ku(e),r;try{r=X1(Vu).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function z1(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Rn(t,"durable-memory");try{J1(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=Xb(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Rn(r,o);if(!qb(a))try{let l=Hb(Rn(Vu,i),"utf8");G1(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function Z1(e,t){let r=e.local_path??"",n=Xb(r),s=[];for(let i of n){let o=Rn(Vu,i),a;try{a=Hb(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=Y1(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var Vu,K1,Yu=T(()=>{"use strict";Vu=Rn(V1(import.meta.url),"../../config/durable_memory_templates"),K1=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as Q1,mkdirSync as eU,readdirSync as tU,readFileSync as rU,writeFileSync as nU}from"node:fs";import{join as Aa}from"node:path";import{fileURLToPath as sU}from"node:url";function Vb(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Ku(t))return;let r=Aa(t,"ai-test");try{eU(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of iU()){let i=s.replace(/\.template$/,""),o=Aa(r,i);if(!Q1(o))try{nU(o,oU(s),"utf8"),n.push(i)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function iU(){try{return tU(Gb).filter(e=>e.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function oU(e){try{return rU(Aa(Gb,e),"utf8")}catch{return aU(e)}}function aU(e){let t=e.replace(/\.template$/,"");return t==="index.md"?`# AI Test Suite - index
2180
2180
 
2181
2181
  Add test chapters in this directory.
2182
2182
  `:`---
@@ -2198,9 +2198,9 @@ last_run_id: 0
2198
2198
  ## Expected
2199
2199
 
2200
2200
  ## Cleanup
2201
- `}var Gb,Kb=T(()=>{"use strict";Yu();Gb=Aa(nU(import.meta.url),"../../config/ai_test_templates")});import{createHash as aU}from"node:crypto";import{existsSync as lU,mkdirSync as cU,writeFileSync as dU}from"node:fs";import{dirname as uU,join as Ln}from"node:path";function Ra(e){return typeof e=="string"&&e.startsWith(Yb)}function gU(e){if(!Ra(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Yb.length),r=t.indexOf("/");if(r<=0)throw new ht(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${e}`,"malformed");let n=t.slice(0,r);if(!_U.has(n))throw new ht(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${e}`,"malformed");let s=t.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new ht(`empty name in lmctl:// URI: ${e}`,"malformed");if(/[\\/]|\.\./.test(a))throw new ht(`invalid name in lmctl:// URI (no path separators): ${e}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function yU(e,t,r){if(e==="workflow")return yo(t,r);let n=e==="mcp"?Ln("templates","mcp",`${t}.json`):Ln("templates","skills",t,"SKILL.md");for(let s of rd(r)){let i=Ln(s,n);if(lU(i))return i}return null}function wU(e,t,r){let n=Ln(td(r),mU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function EU(e,t){if(t.trim().length===0)return!1;if(e==="skill")return!0;let r=t.trim();if(e==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function zu(e,t){let{kind:r,name:n,ref:s}=gU(e),i=yU(r,n,t);if(i!==null)return i;let o=`${fU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(pU)})}catch(d){throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=hU.exec(s);if(d!==null){let u=aU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new ht(`lmctl:// '${e}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!EU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=wU(r,n,t);return cU(uU(c),{recursive:!0}),dU(c,l,"utf8"),c}var Yb,fU,mU,pU,_U,ht,hU,zb=T(()=>{"use strict";nd();Yb="lmctl://",fU="https://lmctl.com/templates/",mU=".cache",pU=8e3,_U=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},hU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as nS}from"node:child_process";import{cpSync as Zb,existsSync as ef,mkdirSync as sS,mkdtempSync as TU,readFileSync as iS,statSync as bU,writeFileSync as Zu}from"node:fs";import{homedir as SU,tmpdir as vU}from"node:os";import{basename as Qb,join as rt}from"node:path";function er(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Qu(e,t,r){if(Array.isArray(e)){for(let n of e)Qu(n,t,r);return}if(er(e)){e.alias===t&&(Array.isArray(e.mcp)&&r.mcp.push(...e.mcp),Array.isArray(e.skills)&&r.skills.push(...e.skills));for(let n of Object.values(e))Qu(n,t,r)}}function xU(e,t){let r={mcp:[],skills:[]},n=new Set;for(let i of e.listProjects()){if(i.team_id!==t.team_id)continue;let o=e.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!er(a)||!Array.isArray(a.steps)))for(let l of a.steps)er(l)&&l.members!==void 0&&Qu(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(NU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function AU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function oS(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(kU)})}catch(s){throw new nt(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new nt(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>eS)throw new nt(t,`fetched ${e} exceeds ${eS} bytes`);return n}async function RU(e,t){if(typeof e!="string")return[e];Ra(e)&&(e=await zu(e));let r;if(tf.test(e))r=await oS(e,t);else{if(!ef(e))throw new nt(t,`mcp file not found: ${e}`);r=iS(e,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new nt(t,`mcp source is not JSON: ${e}`)}if(er(n)&&er(n.mcpServers))return Object.entries(n.mcpServers).map(([s,i])=>({name:s,...er(i)?i:{}}));if(er(n)&&typeof n.name=="string")return[n];throw new nt(t,`mcp source ${e} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Oa(e){return e.type==="http"||e.type==="sse"||e.url!==void 0&&e.command===void 0}function La(e,t,r,n){let s=nS(e,t,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new nt(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new nt(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function LU(e,t,r){nS(e,t,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4})}function OU(e,t){return e==="claude"?["mcp","remove",t,"--scope","user"]:["mcp","remove",t]}function $U(e){let t=["mcp","add"];if(Oa(e)){t.push("-t",e.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(e.headers??{}))t.push("-H",`${r}: ${n}`);t.push(e.name,e.url??"")}else{for(let[r,n]of Object.entries(e.env??{}))t.push("-e",`${r}=${n}`);t.push(e.name,e.command??"",...e.args??[])}return t}function CU(e){if(Oa(e))return["mcp","add",e.name,"--url",e.url??""];let t=["mcp","add",e.name];for(let[r,n]of Object.entries(e.env??{}))t.push("--env",`${r}=${n}`);return t.push("--",e.command??"",...e.args??[]),t}function MU(e){let t=rt(process.env.XDG_CONFIG_HOME??rt(On(),".config"),"opencode"),r=rt(t,"opencode.json"),n={};if(ef(r))try{let i=JSON.parse(iS(r,"utf8"));er(i)&&(n=i)}catch{}let s=er(n.mcp)?{...n.mcp}:{};for(let i of e){let{name:o,...a}=i;s[o]=Oa(i)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),sS(t,{recursive:!0}),Zu(r,`${JSON.stringify(n,null,2)}
2202
- `,"utf8")}function jU(e,t){let r={};for(let n of e)r[n.name]=Oa(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{GT(Iu(On()),r)}catch(n){throw new nt(t,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function DU(e){if(typeof e!="string")return e.name;let t=Qb(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?Qb(e.replace(/\/skill\.md$/i,"")):t}async function tS(e,t,r){let n=DU(e),s=rt(t,n);if(sS(s,{recursive:!0}),typeof e!="string")return Zu(rt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Ra(e)&&(e=await zu(e)),tf.test(e))return Zu(rt(s,"SKILL.md"),await oS(e,r),"utf8"),{name:n,dir:s};if(!ef(e))throw new nt(r,`skill path not found: ${e}`);return bU(e).isDirectory()?(Zb(e,s,{recursive:!0}),{name:n,dir:s}):(Zb(e,rt(s,"SKILL.md")),{name:n,dir:s})}async function aS(e){let{dal:t,member:r,stderr:n}=e,s=xU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Fe(r),o=r.sessiondir||e.baseDir||AU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2203
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await RU(c,r.alias));if(i==="opencode")MU(l);else if(i==="copilot")jU(l,r.alias);else if(i==="claude"||i==="gemini"||i==="qwen"||i==="agy"||i==="codex")for(let c of l)if(LU(i,OU(i,c.name),o),i==="claude"){let{name:d,...u}=c;La("claude",["mcp","add-json",d,JSON.stringify(u),"--scope","user"],o,r.alias)}else i==="codex"?La("codex",CU(c),o,r.alias):La(i,$U(c),o,r.alias);else a(`provider ${i} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(i)&&a(`installed ${l.length} MCP server(s) into ${i} (idempotent).`)}if(s.skills.length>0)if(IU.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=TU(rt(vU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!tf.test(c)?c:(await tS(c,l,r.alias)).dir;La(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(rS[i]!==void 0){let l=rS[i]();for(let c of s.skills)await tS(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var nt,tf,kU,eS,IU,NU,On,rS,lS=T(()=>{"use strict";Ze();zb();it();Os();nt=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},tf=/^https?:\/\//i,kU=8e3,eS=1e6,IU=new Set(["opencode"]),NU=e=>JSON.stringify(e),On=()=>process.env.HOME??SU();rS={claude:()=>rt(On(),".claude","skills"),qwen:()=>rt(On(),".qwen","skills"),codex:()=>rt(On(),".codex","skills"),copilot:()=>rt(On(),".copilot","skills")}});var rf,cS=T(()=>{"use strict";rf=`---
2201
+ `}var Gb,Kb=T(()=>{"use strict";Yu();Gb=Aa(sU(import.meta.url),"../../config/ai_test_templates")});import{createHash as lU}from"node:crypto";import{existsSync as cU,mkdirSync as dU,writeFileSync as uU}from"node:fs";import{dirname as fU,join as Ln}from"node:path";function Ra(e){return typeof e=="string"&&e.startsWith(Yb)}function yU(e){if(!Ra(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Yb.length),r=t.indexOf("/");if(r<=0)throw new ht(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${e}`,"malformed");let n=t.slice(0,r);if(!hU.has(n))throw new ht(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${e}`,"malformed");let s=t.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new ht(`empty name in lmctl:// URI: ${e}`,"malformed");if(/[\\/]|\.\./.test(a))throw new ht(`invalid name in lmctl:// URI (no path separators): ${e}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function wU(e,t,r){if(e==="workflow")return yo(t,r);let n=e==="mcp"?Ln("templates","mcp",`${t}.json`):Ln("templates","skills",t,"SKILL.md");for(let s of rd(r)){let i=Ln(s,n);if(cU(i))return i}return null}function EU(e,t,r){let n=Ln(td(r),pU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function TU(e,t){if(t.trim().length===0)return!1;if(e==="skill")return!0;let r=t.trim();if(e==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function zu(e,t){let{kind:r,name:n,ref:s}=yU(e),i=wU(r,n,t);if(i!==null)return i;let o=`${mU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(_U)})}catch(d){throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=gU.exec(s);if(d!==null){let u=lU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new ht(`lmctl:// '${e}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!TU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=EU(r,n,t);return dU(fU(c),{recursive:!0}),uU(c,l,"utf8"),c}var Yb,mU,pU,_U,hU,ht,gU,zb=T(()=>{"use strict";nd();Yb="lmctl://",mU="https://lmctl.com/templates/",pU=".cache",_U=8e3,hU=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},gU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as nS}from"node:child_process";import{cpSync as Zb,existsSync as ef,mkdirSync as sS,mkdtempSync as bU,readFileSync as iS,statSync as SU,writeFileSync as Zu}from"node:fs";import{homedir as vU,tmpdir as kU}from"node:os";import{basename as Qb,join as rt}from"node:path";function er(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Qu(e,t,r){if(Array.isArray(e)){for(let n of e)Qu(n,t,r);return}if(er(e)){e.alias===t&&(Array.isArray(e.mcp)&&r.mcp.push(...e.mcp),Array.isArray(e.skills)&&r.skills.push(...e.skills));for(let n of Object.values(e))Qu(n,t,r)}}function AU(e,t){let r={mcp:[],skills:[]},n=new Set;for(let i of e.listProjects()){if(i.team_id!==t.team_id)continue;let o=e.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!er(a)||!Array.isArray(a.steps)))for(let l of a.steps)er(l)&&l.members!==void 0&&Qu(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(xU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function RU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function oS(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(IU)})}catch(s){throw new nt(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new nt(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>eS)throw new nt(t,`fetched ${e} exceeds ${eS} bytes`);return n}async function LU(e,t){if(typeof e!="string")return[e];Ra(e)&&(e=await zu(e));let r;if(tf.test(e))r=await oS(e,t);else{if(!ef(e))throw new nt(t,`mcp file not found: ${e}`);r=iS(e,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new nt(t,`mcp source is not JSON: ${e}`)}if(er(n)&&er(n.mcpServers))return Object.entries(n.mcpServers).map(([s,i])=>({name:s,...er(i)?i:{}}));if(er(n)&&typeof n.name=="string")return[n];throw new nt(t,`mcp source ${e} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Oa(e){return e.type==="http"||e.type==="sse"||e.url!==void 0&&e.command===void 0}function La(e,t,r,n){let s=nS(e,t,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new nt(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new nt(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function OU(e,t,r){nS(e,t,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4})}function $U(e,t){return e==="claude"?["mcp","remove",t,"--scope","user"]:["mcp","remove",t]}function CU(e){let t=["mcp","add"];if(Oa(e)){t.push("-t",e.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(e.headers??{}))t.push("-H",`${r}: ${n}`);t.push(e.name,e.url??"")}else{for(let[r,n]of Object.entries(e.env??{}))t.push("-e",`${r}=${n}`);t.push(e.name,e.command??"",...e.args??[])}return t}function MU(e){if(Oa(e))return["mcp","add",e.name,"--url",e.url??""];let t=["mcp","add",e.name];for(let[r,n]of Object.entries(e.env??{}))t.push("--env",`${r}=${n}`);return t.push("--",e.command??"",...e.args??[]),t}function jU(e){let t=rt(process.env.XDG_CONFIG_HOME??rt(On(),".config"),"opencode"),r=rt(t,"opencode.json"),n={};if(ef(r))try{let i=JSON.parse(iS(r,"utf8"));er(i)&&(n=i)}catch{}let s=er(n.mcp)?{...n.mcp}:{};for(let i of e){let{name:o,...a}=i;s[o]=Oa(i)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),sS(t,{recursive:!0}),Zu(r,`${JSON.stringify(n,null,2)}
2202
+ `,"utf8")}function DU(e,t){let r={};for(let n of e)r[n.name]=Oa(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{GT(Iu(On()),r)}catch(n){throw new nt(t,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function PU(e){if(typeof e!="string")return e.name;let t=Qb(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?Qb(e.replace(/\/skill\.md$/i,"")):t}async function tS(e,t,r){let n=PU(e),s=rt(t,n);if(sS(s,{recursive:!0}),typeof e!="string")return Zu(rt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Ra(e)&&(e=await zu(e)),tf.test(e))return Zu(rt(s,"SKILL.md"),await oS(e,r),"utf8"),{name:n,dir:s};if(!ef(e))throw new nt(r,`skill path not found: ${e}`);return SU(e).isDirectory()?(Zb(e,s,{recursive:!0}),{name:n,dir:s}):(Zb(e,rt(s,"SKILL.md")),{name:n,dir:s})}async function aS(e){let{dal:t,member:r,stderr:n}=e,s=AU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Ue(r),o=r.sessiondir||e.baseDir||RU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2203
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await LU(c,r.alias));if(i==="opencode")jU(l);else if(i==="copilot")DU(l,r.alias);else if(i==="claude"||i==="gemini"||i==="qwen"||i==="agy"||i==="codex")for(let c of l)if(OU(i,$U(i,c.name),o),i==="claude"){let{name:d,...u}=c;La("claude",["mcp","add-json",d,JSON.stringify(u),"--scope","user"],o,r.alias)}else i==="codex"?La("codex",MU(c),o,r.alias):La(i,CU(c),o,r.alias);else a(`provider ${i} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(i)&&a(`installed ${l.length} MCP server(s) into ${i} (idempotent).`)}if(s.skills.length>0)if(NU.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=bU(rt(kU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!tf.test(c)?c:(await tS(c,l,r.alias)).dir;La(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(rS[i]!==void 0){let l=rS[i]();for(let c of s.skills)await tS(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var nt,tf,IU,eS,NU,xU,On,rS,lS=T(()=>{"use strict";Ze();zb();it();Os();nt=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},tf=/^https?:\/\//i,IU=8e3,eS=1e6,NU=new Set(["opencode"]),xU=e=>JSON.stringify(e),On=()=>process.env.HOME??vU();rS={claude:()=>rt(On(),".claude","skills"),qwen:()=>rt(On(),".qwen","skills"),codex:()=>rt(On(),".codex","skills"),copilot:()=>rt(On(),".copilot","skills")}});var rf,cS=T(()=>{"use strict";rf=`---
2204
2204
 
2205
2205
  # Durable memory \u2014 how to use it
2206
2206
 
@@ -2211,22 +2211,22 @@ ON EVERY NEW TASK:
2211
2211
  2. Pull only the chapters relevant to your current task. Don't load everything.
2212
2212
  3. If you learn something durable (a project convention, a decision, a fact worth preserving), write it back: create/update \`<project>/durable-memory/<descriptive-name>.md\` with YAML frontmatter (name/description/type) + body. The engine syncs the write automatically.
2213
2213
 
2214
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var uS={};ye(uS,{runTeam:()=>UU});import{join as PU}from"node:path";async function UU(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(FU),0;try{return await $(t,async s=>{switch(r){case"create":return BU(n,t,s);case"list":return qU(n,t,s);case"show":return HU(n,t,s);case"add-member":return JU(n,t,s);case"seed":return dS(n,t,s,!1);case"refresh":return dS(n,t,s,!0);case"companion":return GU(n,t,s);case"list-roots":return WU(n,t,s);default:return v(t,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return Me(t,s)}}function WU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,"usage: team list-roots [--json]");let s=r.listRootTeams();return G(n,"--json")?ae(t,s):t.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}`).join(`
2214
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var uS={};ye(uS,{runTeam:()=>WU});import{join as FU}from"node:path";async function WU(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(UU),0;try{return await $(t,async s=>{switch(r){case"create":return qU(n,t,s);case"list":return HU(n,t,s);case"show":return JU(n,t,s);case"add-member":return XU(n,t,s);case"seed":return dS(n,t,s,!1);case"refresh":return dS(n,t,s,!0);case"companion":return VU(n,t,s);case"list-roots":return BU(n,t,s);default:return v(t,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return je(t,s)}}function BU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,"usage: team list-roots [--json]");let s=r.listRootTeams();return G(n,"--json")?ae(t,s):t.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}`).join(`
2215
2215
  `)+(s.length>0?`
2216
- `:"")),0}function BU(e,t,r){let[n]=e;if(n===void 0)return v(t,"usage: team create <name>");let s=r.insertTeam({name:n});return t.stdout.write(`created team ${s.name}
2217
- `),0}function qU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let s=r.listTeams();return G(n,"--json")?ae(t,s):t.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2216
+ `:"")),0}function qU(e,t,r){let[n]=e;if(n===void 0)return v(t,"usage: team create <name>");let s=r.insertTeam({name:n});return t.stdout.write(`created team ${s.name}
2217
+ `),0}function HU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let s=r.listTeams();return G(n,"--json")?ae(t,s):t.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2218
2218
  `)}${s.length>0?`
2219
- `:""}`),0}function HU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(G(n,"--json"))ae(t,{team:i,members:o});else{t.stdout.write(`team ${i.name}
2220
- `);for(let a of o)t.stdout.write(`- ${a.alias} ${Fe(a)} ${a.sessionid??"(unseeded)"}
2221
- `)}return 0}function JU(e,t,r){let n=Z(e,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--alias"),a=P(n,"--provider");if(o===void 0||a===void 0)return v(t,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:P(n,"--model")??null,role:P(n,"--role")??"agent",sessiondir:P(n,"--sessiondir")??PU(br(),"sessions",i.name,o)});return G(n,"--json")?ae(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
2222
- `),0}async function dS(e,t,r,n){let s=Z(e,["--alias"]);if(s.error!==void 0)return v(t,s.error);let[i]=s.positionals;if(i===void 0)return v(t,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return v(t,`team not found: ${i}`);let a=P(s,"--alias");if(n&&a===void 0)return v(t,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=XU(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return v(t,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===o.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=py(f.workflow_name,m.definition);if(p.status==="FAIL")return v(t,`cannot seed team \`${o.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===o.id))Jb(f,r),Vb(f);let d=[],u=!1;for(let f of l){let m=await $i({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let _=p.role_prompt??"",g=_.length>0?`${_}
2219
+ `:""}`),0}function JU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(G(n,"--json"))ae(t,{team:i,members:o});else{t.stdout.write(`team ${i.name}
2220
+ `);for(let a of o)t.stdout.write(`- ${a.alias} ${Ue(a)} ${a.sessionid??"(unseeded)"}
2221
+ `)}return 0}function XU(e,t,r){let n=Z(e,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--alias"),a=P(n,"--provider");if(o===void 0||a===void 0)return v(t,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:P(n,"--model")??null,role:P(n,"--role")??"agent",sessiondir:P(n,"--sessiondir")??FU(br(),"sessions",i.name,o)});return G(n,"--json")?ae(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
2222
+ `),0}async function dS(e,t,r,n){let s=Z(e,["--alias"]);if(s.error!==void 0)return v(t,s.error);let[i]=s.positionals;if(i===void 0)return v(t,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return v(t,`team not found: ${i}`);let a=P(s,"--alias");if(n&&a===void 0)return v(t,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=GU(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return v(t,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===o.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=py(f.workflow_name,m.definition);if(p.status==="FAIL")return v(t,`cannot seed team \`${o.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===o.id))Jb(f,r),Vb(f);let d=[],u=!1;for(let f of l){let m=await $i({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let _=p.role_prompt??"",g=_.length>0?`${_}
2223
2223
 
2224
- ${rf}`:rf;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Na(Fe(p),m.sessionid);h!==null&&t.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2224
+ ${rf}`:rf;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Na(Ue(p),m.sessionid);h!==null&&t.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2225
2225
  ${h}
2226
2226
  `);try{await aS({dal:r,member:p,stderr:t.stderr})}catch(S){u=!0,t.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
2227
2227
  `)}}}return G(s,"--json")?ae(t,d):t.stdout.write(`seeded ${d.length} member(s)
2228
- `),u?1:0}function XU(e,t,r){return e.filter(n=>t!==void 0&&n.alias!==t?!1:r||n.sessionid===null)}function GU(e,t,r){let n=Z(e,["--interpreter","--of"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--interpreter"),a=P(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(t,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(t,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(t,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
2229
- `),0}var FU,fS=T(()=>{"use strict";Je();_c();Yu();Kb();Ze();An();lS();xo();Re();cS();FU=`usage: lmctl team create <name>
2228
+ `),u?1:0}function GU(e,t,r){return e.filter(n=>t!==void 0&&n.alias!==t?!1:r||n.sessionid===null)}function VU(e,t,r){let n=Z(e,["--interpreter","--of"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--interpreter"),a=P(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(t,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(t,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(t,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
2229
+ `),0}var UU,fS=T(()=>{"use strict";Xe();_c();Yu();Kb();Ze();An();lS();xo();Re();cS();UU=`usage: lmctl team create <name>
2230
2230
  lmctl team list [--json]
2231
2231
  lmctl team show <name> [--json]
2232
2232
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2237,8 +2237,8 @@ ${rf}`:rf;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Na(Fe(p),m.sessionid
2237
2237
 
2238
2238
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2239
2239
  refresh to create/update native provider sessions for team members.
2240
- `});var wS={};ye(wS,{applyMaxBytes:()=>$a,renderMessage:()=>gS,runTail:()=>ZU});async function ZU(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${zU}
2241
- `),0;let r=Z(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(t,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?KU:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return v(t,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=G(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?YU:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return v(t,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=P(r,"--run");if(c!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--session")!==void 0)return v(t,"--run is mutually exclusive with --session");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return v(t,`invalid --run "${c}" (expected a positive integer run id)`);try{return await $(t,async p=>QU(t,p,m,i,o,l))}catch(p){return Me(t,p)}}let d=yr(VU,{target:r.positionals[0],alias:r.positionals[1],flags:{session:P(r,"--session"),provider:P(r,"--provider")}});if(d.mode==="error")return v(t,d.message);if(d.mode==="managed")return v(t,"tail managed mode requires --run <id>");let u;if(d.mode==="ai-team")if(d.alias===void 0){let m;try{m=await $(t,g=>we(d.teamfile,g))}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=je(m)}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let _=At(p);if(_===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await $(t,h=>qe(d.teamfile,_.alias,h));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?v(t,g.message):Me(t,g)}}else try{let m=await $(t,p=>qe(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?v(t,m.message):Me(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let _=await xa(m);if(_.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(_.length>1)return v(t,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}u={provider:p,sessionId:m}}let f=await mS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let h=await mS(t,u.provider,u.sessionId,i,f);h>=0&&(f=h)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2240
+ `});var wS={};ye(wS,{applyMaxBytes:()=>$a,renderMessage:()=>gS,runTail:()=>QU});async function QU(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${ZU}
2241
+ `),0;let r=Z(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(t,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?YU:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return v(t,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=G(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?zU:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return v(t,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=P(r,"--run");if(c!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--session")!==void 0)return v(t,"--run is mutually exclusive with --session");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return v(t,`invalid --run "${c}" (expected a positive integer run id)`);try{return await $(t,async p=>eW(t,p,m,i,o,l))}catch(p){return je(t,p)}}let d=yr(KU,{target:r.positionals[0],alias:r.positionals[1],flags:{session:P(r,"--session"),provider:P(r,"--provider")}});if(d.mode==="error")return v(t,d.message);if(d.mode==="managed")return v(t,"tail managed mode requires --run <id>");let u;if(d.mode==="ai-team")if(d.alias===void 0){let m;try{m=await $(t,g=>we(d.teamfile,g))}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=De(m)}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let _=At(p);if(_===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await $(t,h=>He(d.teamfile,_.alias,h));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?v(t,g.message):je(t,g)}}else try{let m=await $(t,p=>He(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?v(t,m.message):je(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let _=await xa(m);if(_.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(_.length>1)return v(t,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}u={provider:p,sessionId:m}}let f=await mS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let h=await mS(t,u.provider,u.sessionId,i,f);h>=0&&(f=h)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2242
2242
  `)}},_=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(_),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function mS(e,t,r,n,s){let i;try{i=await Qt(r,t)}catch(c){return e.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2243
2243
  `),-1}if(i===null)return e.stderr.write(`tail: session not found: ${r} (provider=${t})
2244
2244
  `),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let c=a;c<o.length;c+=1)l+=`${gS(o[c])}
@@ -2247,18 +2247,18 @@ refresh to create/update native provider sessions for team members.
2247
2247
  `).split(`
2248
2248
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${r}: ${i}`:`${r}: ${i}
2249
2249
  ${o.map(a=>` ${a}`).join(`
2250
- `)}`}async function QU(e,t,r,n,s,i){if(t.getRun(r)===null)return v(e,`tail: run ${r}: not found`);let a=t.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${hS(u)}
2250
+ `)}`}async function eW(e,t,r,n,s,i){if(t.getRun(r)===null)return v(e,`tail: run ${r}: not found`);let a=t.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${hS(u)}
2251
2251
  `).join("");e.stdout.write(n.kind==="bytes"?$a(c,n.maxBytes):c);let d=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let m=setInterval(()=>{try{let _=t.listSessionEvents(r,d),g="";for(let h of _)g+=`${hS(h)}
2252
2252
  `,d=h.id;g.length>0&&e.stdout.write(n.kind==="bytes"?$a(g,n.maxBytes):g)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2253
- `)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function $a(e,t){if(t===0||Buffer.byteLength(e,"utf8")<=t)return e;let n=Buffer.byteLength(pS,"utf8");if(n>=t)return _S(e,t);let s=t-n,i=_S(e,s);return`${pS}${i}`}function _S(e,t){if(t<=0)return"";let r=Buffer.from(e,"utf8"),n=Math.max(0,r.length-t);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function hS(e){let t=yS(new Date(e.timestamp_ms))??"",r="";try{let i=JSON.parse(e.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:e.payload.slice(0,200),s=e.step_id===null?"":` step=${e.step_id}`;return`${t} ${e.kind}${s}: ${n}`}function yS(e){if(e===void 0)return;let t=e instanceof Date?e:new Date(e);if(Number.isNaN(t.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())} ${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}var VU,KU,YU,zU,pS,ES=T(()=>{"use strict";An();Re();Lt();zt();Rt();VU={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},KU=4096,YU=2,zU=`usage: lmctl tail [target] [alias]
2253
+ `)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function $a(e,t){if(t===0||Buffer.byteLength(e,"utf8")<=t)return e;let n=Buffer.byteLength(pS,"utf8");if(n>=t)return _S(e,t);let s=t-n,i=_S(e,s);return`${pS}${i}`}function _S(e,t){if(t<=0)return"";let r=Buffer.from(e,"utf8"),n=Math.max(0,r.length-t);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function hS(e){let t=yS(new Date(e.timestamp_ms))??"",r="";try{let i=JSON.parse(e.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:e.payload.slice(0,200),s=e.step_id===null?"":` step=${e.step_id}`;return`${t} ${e.kind}${s}: ${n}`}function yS(e){if(e===void 0)return;let t=e instanceof Date?e:new Date(e);if(Number.isNaN(t.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())} ${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}var KU,YU,zU,ZU,pS,ES=T(()=>{"use strict";An();Re();Lt();zt();Rt();KU={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},YU=4096,zU=2,ZU=`usage: lmctl tail [target] [alias]
2254
2254
  lmctl tail --session <id> [--provider <name>]
2255
2255
  lmctl tail --run <id>
2256
2256
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
2257
2257
 
2258
2258
  Print or watch provider session messages, or follow a managed run timeline.
2259
2259
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;pS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2260
- `});var xS={};ye(xS,{runInfo:()=>sW});import{execFileSync as nf}from"node:child_process";import{dirname as TS,resolve as eW}from"node:path";function nW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function sW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${rW}
2261
- `),0;let r=Z(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=G(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return v(t,`invalid --run "${s}" (expected a positive integer run id)`);try{return await $(t,async u=>oW(t,u,d,n))}catch(u){return Me(t,u)}}let i=yr(tW,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:P(r,"--provider")}});if(i.mode==="error")return v(t,i.message);if(i.mode==="managed")return v(t,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await $(t,u=>we(i.teamfile,u))}catch(u){return v(t,`health: ${u instanceof Error?u.message:String(u)}`)}return aW(t,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await $(t,u=>qe(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof ge?v(t,d.message):Me(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await xa(a);if(d.length===0)return v(t,`health: session "${a}" not found in any provider store`);if(d.length>1)return v(t,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return iW(t,o,a,l,n,c)}async function iW(e,t,r,n,s,i){let o;try{o=await Qt(r,t)}catch(d){return v(e,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return v(e,`health: session not found: ${r} (provider=${t})`);let a=Cs(o.messages),l=i===void 0?null:await lW(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(ae(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
2260
+ `});var xS={};ye(xS,{runInfo:()=>iW});import{execFileSync as nf}from"node:child_process";import{dirname as TS,resolve as tW}from"node:path";function sW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function iW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${nW}
2261
+ `),0;let r=Z(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=G(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return v(t,`invalid --run "${s}" (expected a positive integer run id)`);try{return await $(t,async u=>aW(t,u,d,n))}catch(u){return je(t,u)}}let i=yr(rW,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:P(r,"--provider")}});if(i.mode==="error")return v(t,i.message);if(i.mode==="managed")return v(t,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await $(t,u=>we(i.teamfile,u))}catch(u){return v(t,`health: ${u instanceof Error?u.message:String(u)}`)}return lW(t,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await $(t,u=>He(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof ge?v(t,d.message):je(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await xa(a);if(d.length===0)return v(t,`health: session "${a}" not found in any provider store`);if(d.length>1)return v(t,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return oW(t,o,a,l,n,c)}async function oW(e,t,r,n,s,i){let o;try{o=await Qt(r,t)}catch(d){return v(e,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return v(e,`health: session not found: ${r} (provider=${t})`);let a=Cs(o.messages),l=i===void 0?null:await cW(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(ae(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
2262
2262
  `),e.stdout.write(` Provider: ${o.provider}
2263
2263
  `),n!==void 0&&e.stdout.write(` Alias: ${n}
2264
2264
  `),l!==null&&e.stdout.write(` Liveness: ${sf(l.liveness)}
@@ -2270,7 +2270,7 @@ Print or watch provider session messages, or follow a managed run timeline.
2270
2270
  `),a!==null&&e.stdout.write(` SessionLimit: LIMITED resets_at=${vS(a)}
2271
2271
  `),e.stdout.write(` Created: ${c.createdAt}
2272
2272
  `),e.stdout.write(` Modified: ${c.modifiedAt}
2273
- `),0)}async function oW(e,t,r,n){let s=Rr(t,r);if(s===null)return v(e,`health: run ${r}: not found`);let i=on(t,r),o=t.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(ae(e,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(e.stdout.write(`RUN: ${s.id}
2273
+ `),0)}async function aW(e,t,r,n){let s=Rr(t,r);if(s===null)return v(e,`health: run ${r}: not found`);let i=on(t,r),o=t.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(ae(e,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(e.stdout.write(`RUN: ${s.id}
2274
2274
  `),e.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
2275
2275
  `),e.stdout.write(` Team: ${s.team?.name??"(unknown)"}
2276
2276
  `),e.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -2280,7 +2280,7 @@ Print or watch provider session messages, or follow a managed run timeline.
2280
2280
  `),e.stdout.write(` Steps: ${s.steps.length}
2281
2281
  `),e.stdout.write(` AgentCalls: ${o.agentCallCount}
2282
2282
  `),e.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
2283
- `),0)}async function aW(e,t,r){let n,s;try{let y=await $(e,w=>{let I=De(t,w);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:bS(t,w,new Set,[])}});s=y.teamName,n=y.targets}catch(y){return v(e,`health: ${y instanceof Error?y.message:String(y)}`)}let i=kS(t),o=i.kind==="repo"?i:null,a=await SS(e,n),l=[],c=0,d=o===null?void 0:0,u=o===null?void 0:0;for(let y of n){let w=null;try{w=await Qt(y.sessionid,y.provider)}catch(W){e.stderr.write(`warning: failed to load session "${y.sessionid}" for ${y.reportPath} (${y.provider}): ${W instanceof Error?W.message:String(W)}
2283
+ `),0)}async function lW(e,t,r){let n,s;try{let y=await $(e,w=>{let I=Pe(t,w);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:bS(t,w,new Set,[])}});s=y.teamName,n=y.targets}catch(y){return v(e,`health: ${y instanceof Error?y.message:String(y)}`)}let i=kS(t),o=i.kind==="repo"?i:null,a=await SS(e,n),l=[],c=0,d=o===null?void 0:0,u=o===null?void 0:0;for(let y of n){let w=null;try{w=await Qt(y.sessionid,y.provider)}catch(W){e.stderr.write(`warning: failed to load session "${y.sessionid}" for ${y.reportPath} (${y.provider}): ${W instanceof Error?W.message:String(W)}
2284
2284
  `)}let I=w?.messageCount,x=o===null?void 0:w===null?null:IS(w,o.since),U=o===null?void 0:w===null?null:NS(w)??"n/a",ue=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:y.alias,reportPath:y.reportPath,teamfile:y.teamfile,provider:y.provider,sessionid:y.sessionid,messageCount:I??null,model:w?.model??"(unknown)",lastContext:w?.lastInputTokens,detailLoaded:w!==null,liveness:a.get(of(y.teamfile,y.alias))??af(),sessionLimit:w===null?null:Cs(w.messages),...o!==null?{activitySinceLastCommit:ue,cumulativeTokens:U}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(x==null?d=void 0:d!==void 0&&(d+=x),U==null||U==="n/a"?u=void 0:u!==void 0&&(u+=U))}if(r)return ae(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(y=>({ref:y.ref,timestamp:y.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:y,cumulativeTokens:w,...I})=>({...I,lastContext:I.lastContext??null,...w!==void 0?{cumulativeTokens:w==="n/a"?null:w}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(y=>y.sessionid.length)),m=Math.max(5,...l.map(y=>y.reportPath.length))+1,p=Math.max(8,...l.map(y=>y.provider.length))+1,_=Math.max(5,...l.map(y=>y.model.length))+1,g=Math.max(4,...l.map(y=>sf(y.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
2285
2285
  `),i.kind==="repo"){e.stdout.write(`Git progress:
2286
2286
  `);for(let y of i.commits)e.stdout.write(` ${y.ref}: ${y.timestamp.toISOString()}
@@ -2288,55 +2288,55 @@ Print or watch provider session messages, or follow a managed run timeline.
2288
2288
  `)}else i.reason==="no-commits"?e.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
2289
2289
  `):e.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
2290
2290
  `);e.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2291
- `);let h=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=uW(y.lastContext,y.detailLoaded,nW);(w==="n/a"||y.cumulativeTokens==="n/a")&&(h=!0),e.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(_)}${sf(y.liveness).padEnd(g)}${gt(y.messageCount).padStart(6)} ${w.padStart(12)}`+(o!==null?` ${gt(y.activitySinceLastCommit?.messageCount).padStart(17)} ${gt(y.activitySinceLastCommit?.tokens).padStart(19)} ${dW(y.cumulativeTokens).padStart(19)}`:"")+`
2291
+ `);let h=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=fW(y.lastContext,y.detailLoaded,sW);(w==="n/a"||y.cumulativeTokens==="n/a")&&(h=!0),e.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(_)}${sf(y.liveness).padEnd(g)}${gt(y.messageCount).padStart(6)} ${w.padStart(12)}`+(o!==null?` ${gt(y.activitySinceLastCommit?.messageCount).padStart(17)} ${gt(y.activitySinceLastCommit?.tokens).padStart(19)} ${uW(y.cumulativeTokens).padStart(19)}`:"")+`
2292
2292
  `)}if(e.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(g)}${gt(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${gt(d).padStart(17)} ${gt(null).padStart(19)} ${gt(u).padStart(19)}`:"")+`
2293
2293
  `),h&&e.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2294
2294
  `),S.length>0){e.stdout.write(`Session limits:
2295
2295
  `);for(let y of S)e.stdout.write(` ${y.reportPath}: LIMITED resets_at=${vS(y.sessionLimit)}
2296
- `)}return 0}function bS(e,t,r,n){let s=we(e,t);if(r.has(s))return[];r.add(s);let i=De(s,t);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...bS(eW(TS(s),a.teamfile),t,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function lW(e,t,r){let n=await SS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=kS(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(of(t.teamfile,t.alias))??af(),...i!==null?{activitySinceLastCommit:{messageCount:IS(r,i.since),tokens:null},cumulativeTokens:NS(r)??"n/a"}:{}}}async function SS(e,t){try{let r=await $(e,n=>t.map(s=>{let i=Pr(n,s.teamfile,s.alias);return[of(s.teamfile,s.alias),cW(i)]}));return new Map(r)}catch{return new Map}}function of(e,t){return`${e}\0${t.toLowerCase()}`}function cW(e){return e.busy?e.reason==="terminal-held"?e.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:e.terminalInvocation.id,startedAt:e.terminalInvocation.started_at,lastHeartbeat:e.terminalInvocation.last_heartbeat_at,holderPid:e.terminalInvocation.holder_pid,holderHost:e.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:e.terminalLock.started_at,lastHeartbeat:e.terminalLock.last_heartbeat,holderPid:e.terminalLock.holder_pid,holderHost:e.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:e.inFlight.sender_teamfile,senderAlias:e.inFlight.sender_alias,startedAt:e.inFlight.started_at,activeCount:e.inFlight.active_count,holderPid:e.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:af()}function af(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function sf(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function vS(e){return e.resets_at!==null?e.resets_at:e.timezone!==null?`${e.reset_time} (${e.timezone})`:e.reset_time}function gt(e){return e==null?"unknown":String(e)}function dW(e){return e==="n/a"?e:gt(e)}function uW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function kS(e){let t=TS(e),r;try{nf("git",["-C",t,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:t}}try{r=nf("git",["-C",t,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:t}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:t};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:t,since:s[0].timestamp,commits:s,working:fW(t)}}function fW(e){let t;try{t=nf("git",["-C",e,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of t.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function IS(e,t){let r=t.getTime();return e.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function NS(e){if(e===null)return null;let t=[e.totalInputTokens,e.totalCachedInputTokens,e.totalCacheWriteInputTokens,e.totalOutputTokens,e.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return t.length===0?null:t.reduce((r,n)=>r+n,0)}var tW,rW,AS=T(()=>{"use strict";An();Re();Lt();Rt();Fr();Jt();Du();tW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},rW=`usage: lmctl health [target] [alias]
2296
+ `)}return 0}function bS(e,t,r,n){let s=we(e,t);if(r.has(s))return[];r.add(s);let i=Pe(s,t);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...bS(tW(TS(s),a.teamfile),t,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function cW(e,t,r){let n=await SS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=kS(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(of(t.teamfile,t.alias))??af(),...i!==null?{activitySinceLastCommit:{messageCount:IS(r,i.since),tokens:null},cumulativeTokens:NS(r)??"n/a"}:{}}}async function SS(e,t){try{let r=await $(e,n=>t.map(s=>{let i=Pr(n,s.teamfile,s.alias);return[of(s.teamfile,s.alias),dW(i)]}));return new Map(r)}catch{return new Map}}function of(e,t){return`${e}\0${t.toLowerCase()}`}function dW(e){return e.busy?e.reason==="terminal-held"?e.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:e.terminalInvocation.id,startedAt:e.terminalInvocation.started_at,lastHeartbeat:e.terminalInvocation.last_heartbeat_at,holderPid:e.terminalInvocation.holder_pid,holderHost:e.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:e.terminalLock.started_at,lastHeartbeat:e.terminalLock.last_heartbeat,holderPid:e.terminalLock.holder_pid,holderHost:e.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:e.inFlight.sender_teamfile,senderAlias:e.inFlight.sender_alias,startedAt:e.inFlight.started_at,activeCount:e.inFlight.active_count,holderPid:e.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:af()}function af(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function sf(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function vS(e){return e.resets_at!==null?e.resets_at:e.timezone!==null?`${e.reset_time} (${e.timezone})`:e.reset_time}function gt(e){return e==null?"unknown":String(e)}function uW(e){return e==="n/a"?e:gt(e)}function fW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function kS(e){let t=TS(e),r;try{nf("git",["-C",t,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:t}}try{r=nf("git",["-C",t,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:t}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:t};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:t,since:s[0].timestamp,commits:s,working:mW(t)}}function mW(e){let t;try{t=nf("git",["-C",e,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of t.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function IS(e,t){let r=t.getTime();return e.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function NS(e){if(e===null)return null;let t=[e.totalInputTokens,e.totalCachedInputTokens,e.totalCacheWriteInputTokens,e.totalOutputTokens,e.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return t.length===0?null:t.reduce((r,n)=>r+n,0)}var rW,nW,AS=T(()=>{"use strict";An();Re();Lt();Rt();Fr();Jt();Du();rW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},nW=`usage: lmctl health [target] [alias]
2297
2297
  lmctl health <teamfile> # team rollup
2298
2298
  lmctl health <sessionid> [--provider <name>]
2299
2299
  [--json]
2300
2300
 
2301
- Show provider session details, team rollups, or managed run state/token totals.`});var LS={};ye(LS,{runLs:()=>hW});import{resolve as lf}from"node:path";function _W(e){let t=new Map;for(let r of e){let n=`${r.provider}:${r.sessionId}`,s=t.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&t.set(n,r)}return[...t.values()]}async function hW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${mW}
2302
- `),0;let r=Z(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=G(r,"--json");if(G(r,"--runs")){for(let h of["--provider","--sessiondir"])if(P(r,h)!==void 0)return v(t,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(G(r,h))return v(t,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),_=pW;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(h>RS)return v(t,`--limit ${h} exceeds maximum (${RS})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await $(t,async h=>gW(t,h,_,g))}catch(h){return Me(t,h)}}let o=yW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=G(r,"--recursive"),u=G(r,"--all"),f;try{f=await ac(l?{provider:l}:{})}catch(p){return v(t,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?lf(c):lf(process.cwd());f=f.filter(_=>{let g=lf(_.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=_W(f),a==="json")return ae(t,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
2301
+ Show provider session details, team rollups, or managed run state/token totals.`});var LS={};ye(LS,{runLs:()=>gW});import{resolve as lf}from"node:path";function hW(e){let t=new Map;for(let r of e){let n=`${r.provider}:${r.sessionId}`,s=t.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&t.set(n,r)}return[...t.values()]}async function gW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${pW}
2302
+ `),0;let r=Z(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=G(r,"--json");if(G(r,"--runs")){for(let h of["--provider","--sessiondir"])if(P(r,h)!==void 0)return v(t,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(G(r,h))return v(t,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),_=_W;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(h>RS)return v(t,`--limit ${h} exceeds maximum (${RS})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await $(t,async h=>yW(t,h,_,g))}catch(h){return je(t,h)}}let o=wW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=G(r,"--recursive"),u=G(r,"--all"),f;try{f=await ac(l?{provider:l}:{})}catch(p){return v(t,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?lf(c):lf(process.cwd());f=f.filter(_=>{let g=lf(_.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=hW(f),a==="json")return ae(t,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
2303
2303
  `)}return 0}if(a==="teamfile"){for(let p of f)t.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2304
2304
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));t.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
2305
2305
  `);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;t.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
2306
- `)}return 0}async function gW(e,t,r,n){let s=sn(t,{limit:r});if(n==="json")return ae(e,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return e.stdout.write(`No runs found.
2306
+ `)}return 0}async function yW(e,t,r,n){let s=sn(t,{limit:r});if(n==="json")return ae(e,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return e.stdout.write(`No runs found.
2307
2307
  `),0;e.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
2308
2308
  `);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);e.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
2309
- `)}return 0}function yW(e,t){return e===void 0?{format:t?"json":"teamfile"}:e==="table"||e==="teamfile"||e==="json"?{format:e}:{error:`invalid --format "${e}" (expected: table | teamfile | json)`}}var mW,pW,RS,OS=T(()=>{"use strict";vt();Re();Jt();mW=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
2309
+ `)}return 0}function wW(e,t){return e===void 0?{format:t?"json":"teamfile"}:e==="table"||e==="teamfile"||e==="json"?{format:e}:{error:`invalid --format "${e}" (expected: table | teamfile | json)`}}var pW,_W,RS,OS=T(()=>{"use strict";vt();Re();Jt();pW=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
2310
2310
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2311
2311
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2312
2312
 
2313
- List native provider sessions in scope, or list recent managed runs with --runs.`,pW=50,RS=500});import{existsSync as Ds,readFileSync as $S}from"node:fs";import{homedir as wW}from"node:os";import{dirname as CS,resolve as $n}from"node:path";import{fileURLToPath as EW}from"node:url";function uf(e,t={}){let r=[],n=SW(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=AW(t.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ma??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${LW(o)}`)}return r}function SW(e){if(!e&&js)return js;let t=new Map,r,n=e??vW();if(!Ds(n))return r=`${n} not found`,e||cf(t),e||(js=t),e||(Ma=r),t;let s;try{s=$S(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||cf(t),e||(js=t),e||(Ma=r),t}for(let[i,o]of Object.entries(TW)){let a=NW(s,o),l=xW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&cf(t),e||(js=t),e||(Ma=r),t}function vW(){return kW(CS(EW(import.meta.url)))}function kW(e){let t=IW(e);if(t){let n=$n(t,"durable-memory","model_selection.md");if(Ds(n))return n}let r=[$n(e,"..","..","durable-memory","model_selection.md"),$n(e,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Ds(n))return n;return r[r.length-1]}function IW(e){let t=$n(e);for(;;){if(Ds($n(t,"package.json")))return t;let r=CS(t);if(r===t)return null;t=r}}function cf(e){for(let[t,r]of Object.entries(bW))e.set(t,r)}function NW(e,t){let n=new RegExp(`^## ${OW(t)}\\s*$`,"m").exec(e);if(!n)return"";let s=n.index+n[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function xW(e){let t=new Set;for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function AW(e){let t=e??$n(wW(),".config","opencode","opencode.json");if(!Ds(t))return{available:!0,models:[]};let r;try{r=JSON.parse($S(t,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${t} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:RW(r)}}function RW(e){if(!df(e))return[];let t=Ca(e.provider)??Ca(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!df(s))continue;let i=Ca(s.models)??Ca(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Ca(e){return df(e)?e:null}function df(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function LW(e){return e.length>0?e.join(", "):"(none)"}function OW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var TW,bW,js,Ma,MS=T(()=>{"use strict";TW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},bW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},js=null});import{homedir as $W}from"node:os";import{basename as CW}from"node:path";function ja(e,t){let r=new Set;return{text:e.replace(jW,(s,i)=>{let o=i.trim(),a=MW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function Da(e){return{workdir:e.workdir,teamfile:e.teamfile,date:DW(e.date)}}function DW(e){return e.toISOString().slice(0,10)}var MW,jW,ff=T(()=>{"use strict";MW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=CW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>$W(),date:e=>e.date},jW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Us={};ye(Us,{GEMINI_PROVIDER_NOTICE:()=>FS,_setLintSessiondirFsOpsForTests:()=>JW,_setTeamfileSeedForTests:()=>HW,buildRootTeamRegistrationRow:()=>HS,registerRootTeam:()=>JS,runHire:()=>QW,runLint:()=>ZW,runRefresh:()=>eB,runSeed:()=>BS,sha256Text:()=>qS});import{createHash as PW}from"node:crypto";import{accessSync as FW,constants as jS,existsSync as UW,readFileSync as Ua,realpathSync as _f,statSync as WW,writeFileSync as Fa}from"node:fs";import{dirname as Jr,resolve as PS}from"node:path";function HW(e){US=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),cc)),n=await r(t);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function JW(e){Hr=e===null?hf:{...hf,...e}}function XW(e,t){let r=Jr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=PS(o);if(n.has(a))continue;let l=GW(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function GW(e){try{if(Hr.existsSync(e)){if(!Hr.statSync(e).isDirectory())return"ENOTDIR";Hr.accessSync(e,jS.W_OK);return}let t=YW(e);if(t===void 0)return;if(!Hr.statSync(t).isDirectory())return"ENOTDIR";Hr.accessSync(t,jS.W_OK);return}catch(t){return zW(t)??"permission check failed"}}function VW(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||WS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function KW(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!WS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=XS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function WS(e,t){return DS(e)===DS(t)}function DS(e){let t=PS(e);try{return _f(t)}catch{return t}}function YW(e){let t=e;for(;;){try{if(Hr.existsSync(t))return t}catch{return}let r=Jr(t);if(r===t)return;t=r}}function zW(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function ZW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(BW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2314
- `),2;let r=e[0],n;try{n=await $(t,c=>we(r,c))}catch(c){return Oe(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=je(n)}catch(c){return Oe(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Gd(s,Jr(n)),o=uf(s.members),a=Ua(n,"utf8"),l=ja(a,Da({workdir:Jr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Sl(s.members,Jr(n))),o.push(...XW(s.members,n)),o.push(...VW(s.members,Jr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2313
+ List native provider sessions in scope, or list recent managed runs with --runs.`,_W=50,RS=500});import{existsSync as Ds,readFileSync as $S}from"node:fs";import{homedir as EW}from"node:os";import{dirname as CS,resolve as $n}from"node:path";import{fileURLToPath as TW}from"node:url";function uf(e,t={}){let r=[],n=vW(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=RW(t.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ma??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${OW(o)}`)}return r}function vW(e){if(!e&&js)return js;let t=new Map,r,n=e??kW();if(!Ds(n))return r=`${n} not found`,e||cf(t),e||(js=t),e||(Ma=r),t;let s;try{s=$S(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||cf(t),e||(js=t),e||(Ma=r),t}for(let[i,o]of Object.entries(bW)){let a=xW(s,o),l=AW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&cf(t),e||(js=t),e||(Ma=r),t}function kW(){return IW(CS(TW(import.meta.url)))}function IW(e){let t=NW(e);if(t){let n=$n(t,"durable-memory","model_selection.md");if(Ds(n))return n}let r=[$n(e,"..","..","durable-memory","model_selection.md"),$n(e,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Ds(n))return n;return r[r.length-1]}function NW(e){let t=$n(e);for(;;){if(Ds($n(t,"package.json")))return t;let r=CS(t);if(r===t)return null;t=r}}function cf(e){for(let[t,r]of Object.entries(SW))e.set(t,r)}function xW(e,t){let n=new RegExp(`^## ${$W(t)}\\s*$`,"m").exec(e);if(!n)return"";let s=n.index+n[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function AW(e){let t=new Set;for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function RW(e){let t=e??$n(EW(),".config","opencode","opencode.json");if(!Ds(t))return{available:!0,models:[]};let r;try{r=JSON.parse($S(t,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${t} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:LW(r)}}function LW(e){if(!df(e))return[];let t=Ca(e.provider)??Ca(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!df(s))continue;let i=Ca(s.models)??Ca(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Ca(e){return df(e)?e:null}function df(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function OW(e){return e.length>0?e.join(", "):"(none)"}function $W(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var bW,SW,js,Ma,MS=T(()=>{"use strict";bW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},SW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},js=null});import{homedir as CW}from"node:os";import{basename as MW}from"node:path";function ja(e,t){let r=new Set;return{text:e.replace(DW,(s,i)=>{let o=i.trim(),a=jW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function Da(e){return{workdir:e.workdir,teamfile:e.teamfile,date:PW(e.date)}}function PW(e){return e.toISOString().slice(0,10)}var jW,DW,ff=T(()=>{"use strict";jW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=MW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>CW(),date:e=>e.date},DW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Us={};ye(Us,{GEMINI_PROVIDER_NOTICE:()=>FS,_setLintSessiondirFsOpsForTests:()=>XW,_setTeamfileSeedForTests:()=>JW,buildRootTeamRegistrationRow:()=>HS,registerRootTeam:()=>JS,runHire:()=>eB,runLint:()=>QW,runRefresh:()=>tB,runSeed:()=>BS,sha256Text:()=>qS});import{createHash as FW}from"node:crypto";import{accessSync as UW,constants as jS,existsSync as WW,readFileSync as Ua,realpathSync as _f,statSync as BW,writeFileSync as Fa}from"node:fs";import{dirname as Jr,resolve as PS}from"node:path";function JW(e){US=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),cc)),n=await r(t);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function XW(e){Hr=e===null?hf:{...hf,...e}}function GW(e,t){let r=Jr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=PS(o);if(n.has(a))continue;let l=VW(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function VW(e){try{if(Hr.existsSync(e)){if(!Hr.statSync(e).isDirectory())return"ENOTDIR";Hr.accessSync(e,jS.W_OK);return}let t=zW(e);if(t===void 0)return;if(!Hr.statSync(t).isDirectory())return"ENOTDIR";Hr.accessSync(t,jS.W_OK);return}catch(t){return ZW(t)??"permission check failed"}}function KW(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||WS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function YW(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!WS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=XS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function WS(e,t){return DS(e)===DS(t)}function DS(e){let t=PS(e);try{return _f(t)}catch{return t}}function zW(e){let t=e;for(;;){try{if(Hr.existsSync(t))return t}catch{return}let r=Jr(t);if(r===t)return;t=r}}function ZW(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function QW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(qW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2314
+ `),2;let r=e[0],n;try{n=await $(t,c=>we(r,c))}catch(c){return Oe(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=De(n)}catch(c){return Oe(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Gd(s,Jr(n)),o=uf(s.members),a=Ua(n,"utf8"),l=ja(a,Da({workdir:Jr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Sl(s.members,Jr(n))),o.push(...GW(s.members,n)),o.push(...KW(s.members,Jr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2315
2315
  `);for(let c of s.members)yf([c],t),c.session!==void 0&&c.session.length<Ps&&o.push(`${c.alias}: sessionid is shorter than ${Ps} chars; run lmctl seed to refresh it`);for(let c of o)t.stderr.write(`warning: ${c}
2316
2316
  `);return await $(t,c=>{vE(n,c,d=>t.stderr.write(`${d}
2317
2317
  `))}),i.length>0?1:(t.stdout.write(`ok
2318
- `),0)}async function BS(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(qW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2319
- `),2;let r=e[0],n;try{n=await $(t,h=>we(r,h))}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=_f(n)}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let i=Jr(n),o;try{o=je(n)}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=Ua(n,"utf8").split(`
2320
- `),c=nB(l),d=KW(o.members,l,c,i),u=Gd(o,i);if(u.length>0){yf(o.members,t);for(let h of u)t.stderr.write(`error: ${h.field}: ${h.message}
2318
+ `),0)}async function BS(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(HW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2319
+ `),2;let r=e[0],n;try{n=await $(t,h=>we(r,h))}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=_f(n)}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let i=Jr(n),o;try{o=De(n)}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=Ua(n,"utf8").split(`
2320
+ `),c=sB(l),d=YW(o.members,l,c,i),u=Gd(o,i);if(u.length>0){yf(o.members,t);for(let h of u)t.stderr.write(`error: ${h.field}: ${h.message}
2321
2321
  `);return 1}try{In(t,o,n)}catch{}yf(o.members,t);for(let h of uf(o.members))t.stderr.write(`warning: ${h}
2322
2322
  `);for(let h of Sl(o.members,i))t.stderr.write(`warning: ${h}
2323
2323
  `);let f=0,m=o.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<Ps);for(let h of m)if(!GS(h.provider))return t.stderr.write(`error: ${h.alias}: invalid provider "${h.provider}"
2324
2324
  `),1;for(let h of o.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=Ps){t.stderr.write(`warning: ${h.alias}: existing sessionid preserved; skipping
2325
- `);continue}let S=h.sessiondir??i,y=await US({provider:h.provider,cwd:S,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:tB(n,l.join(`
2325
+ `);continue}let S=h.sessiondir??i,y=await US({provider:h.provider,cwd:S,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:rB(n,l.join(`
2326
2326
  `),o.members)}:{}});if(y.error!==void 0||y.sessionId===void 0||y.sessionId.length<Ps){let x=`provider did not report a sessionid; no new session was found for ${S} (possible provider workspace/cwd mismatch)`;return t.stderr.write(`error: ${h.alias}: seed failed${y.error!==void 0?`: ${y.error}`:`; ${x}`}
2327
2327
  `),1}let w=c.get(h.alias.toLowerCase());if(w===void 0)return t.stderr.write(`error: ${h.alias}: could not find matching _MEMBER_ line to update
2328
- `),1;let I=aB(l[w],"sessionid",y.sessionId);l[w]=I,f+=1,Fa(n,l.join(`
2328
+ `),1;let I=lB(l[w],"sessionid",y.sessionId);l[w]=I,f+=1,Fa(n,l.join(`
2329
2329
  `),"utf8"),t.stdout.write(`${h.alias}: seeded ${y.sessionId} provider=${h.provider} sessiondir=${S}
2330
2330
  `)}let p=l.join(`
2331
- `),_=cB(p,_f(n));(_!==p||d)&&Fa(n,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2332
- `);let g=new Date().toISOString();return await $(t,h=>{JS(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),0}async function QW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Pa),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return pf(t,r.error,Pa);if(r.positionals.length!==2)return pf(t,"expected <teamfile.lmctl> and <alias>",Pa);let[n,s]=r.positionals;if(!oB(s))return Oe(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Oe(t,"hire only applies to non-Lead members");let i=P(r,"--provider");if(i===void 0)return pf(t,"missing value for --provider",Pa);if(!GS(i))return Oe(t,`invalid provider "${i}"`);let o;try{o=await $(t,u=>we(n,u))}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Ua(o,"utf8")}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(iB(a,s))return Oe(t,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),c=[`_MEMBER_ alias=${gf(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${gf(l)}`]].join(" "),d=lB(a,c);return Fa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2331
+ `),_=dB(p,_f(n));(_!==p||d)&&Fa(n,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2332
+ `);let g=new Date().toISOString();return await $(t,h=>{JS(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),0}async function eB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Pa),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return pf(t,r.error,Pa);if(r.positionals.length!==2)return pf(t,"expected <teamfile.lmctl> and <alias>",Pa);let[n,s]=r.positionals;if(!aB(s))return Oe(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Oe(t,"hire only applies to non-Lead members");let i=P(r,"--provider");if(i===void 0)return pf(t,"missing value for --provider",Pa);if(!GS(i))return Oe(t,`invalid provider "${i}"`);let o;try{o=await $(t,u=>we(n,u))}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Ua(o,"utf8")}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(oB(a,s))return Oe(t,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),c=[`_MEMBER_ alias=${gf(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${gf(l)}`]].join(" "),d=cB(a,c);return Fa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2333
2333
  `),t.stdout.write(`Run: lmctl seed ${o}
2334
- `),0}async function eB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(mf),0;let r,n;if(e.length===1){let u=Wr(e[0]);if(u===null)return t.stderr.write(mf),2;r=u.teamfile,n=u.alias}else if(e.length===2)[r,n]=e;else return t.stderr.write(mf),2;let s;try{s=await $(t,u=>we(r,u))}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=Ua(s,"utf8")}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2335
- `),a=sB(o,n);if(a===void 0)return Oe(t,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Fs(l,"teamfile")!==void 0)return Oe(t,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(t.env??process.env)[Kn],d=Fs(l,"sessionid");return c!==void 0&&c.length>0&&d===c?Oe(t,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(o[a]=XS(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Fa(s,o.join(`
2336
- `),"utf8"),BS([s],t))}function qS(e){return PW("sha256").update(e).digest("hex")}function HS(e,t){return{teamfile_path:t.teamfilePath,name:t.name,raw_text:t.rawText,raw_sha256:qS(t.rawText),registered_at:e?.registered_at??t.now,last_seeded_at:t.now}}function JS(e,t){let r=HS(e.getRootTeam(t.teamfilePath),t);return e.upsertRootTeam(r),r}function tB(e,t,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
2337
- `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=rB(i,e);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${e}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${e}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.","- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command and notify you when it completes.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${e}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${e}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${e}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${e}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer lmctl chat; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",t.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
2338
- `)}function rB(e,t){let r=`lmctl chat "${t}" <alias> "your task here"`;switch(e.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: run lmctl chat as the blocking delegation primitive; use Codex-native tool/background behavior when available.";case"gemini":return"- Gemini note: run lmctl chat as the blocking delegation primitive; use Gemini-native tool/background behavior when available.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background completion, use it around the blocking command; otherwise run one blocking lmctl chat turn at a time."}}function nB(e){let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Fs(n,"alias");s!==void 0&&t.set(s.toLowerCase(),r)}return t}function sB(e,t){let r=t.toLowerCase();for(let n=0;n<e.length;n+=1){let s=e[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Fs(s,"alias")?.toLowerCase()===r)return n}}function iB(e,t){for(let r of e.split(`
2339
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===t)return!0;return!1}function oB(e){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(e)}function Fs(e,t){let n=new RegExp(`(?:^|\\s)${t}=(?:"([^"]*)"|(\\S*))`).exec(e);return n===null?void 0:n[1]??n[2]??""}function aB(e,t,r){let n=`${t}=${gf(r)}`,s=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return s.test(e)?e.replace(s,(i,o)=>`${o}${n}`):`${e.trimEnd()} ${n}`}function XS(e,t){let r=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return e.replace(r,"").replace(/\s+/gu," ").trimEnd()}function gf(e){return/[\s"]/u.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}function lB(e,t){let r=e.split(`
2334
+ `),0}async function tB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(mf),0;let r,n;if(e.length===1){let u=Wr(e[0]);if(u===null)return t.stderr.write(mf),2;r=u.teamfile,n=u.alias}else if(e.length===2)[r,n]=e;else return t.stderr.write(mf),2;let s;try{s=await $(t,u=>we(r,u))}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=Ua(s,"utf8")}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2335
+ `),a=iB(o,n);if(a===void 0)return Oe(t,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Fs(l,"teamfile")!==void 0)return Oe(t,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(t.env??process.env)[Kn],d=Fs(l,"sessionid");return c!==void 0&&c.length>0&&d===c?Oe(t,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(o[a]=XS(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Fa(s,o.join(`
2336
+ `),"utf8"),BS([s],t))}function qS(e){return FW("sha256").update(e).digest("hex")}function HS(e,t){return{teamfile_path:t.teamfilePath,name:t.name,raw_text:t.rawText,raw_sha256:qS(t.rawText),registered_at:e?.registered_at??t.now,last_seeded_at:t.now}}function JS(e,t){let r=HS(e.getRootTeam(t.teamfilePath),t);return e.upsertRootTeam(r),r}function rB(e,t,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
2337
+ `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=nB(i,e);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${e}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${e}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.","- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command and notify you when it completes.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${e}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${e}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${e}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${e}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer lmctl chat; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",t.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
2338
+ `)}function nB(e,t){let r=`lmctl chat "${t}" <alias> "your task here"`;switch(e.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: run lmctl chat as the blocking delegation primitive; use Codex-native tool/background behavior when available.";case"gemini":return"- Gemini note: run lmctl chat as the blocking delegation primitive; use Gemini-native tool/background behavior when available.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background completion, use it around the blocking command; otherwise run one blocking lmctl chat turn at a time."}}function sB(e){let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Fs(n,"alias");s!==void 0&&t.set(s.toLowerCase(),r)}return t}function iB(e,t){let r=t.toLowerCase();for(let n=0;n<e.length;n+=1){let s=e[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Fs(s,"alias")?.toLowerCase()===r)return n}}function oB(e,t){for(let r of e.split(`
2339
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===t)return!0;return!1}function aB(e){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(e)}function Fs(e,t){let n=new RegExp(`(?:^|\\s)${t}=(?:"([^"]*)"|(\\S*))`).exec(e);return n===null?void 0:n[1]??n[2]??""}function lB(e,t,r){let n=`${t}=${gf(r)}`,s=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return s.test(e)?e.replace(s,(i,o)=>`${o}${n}`):`${e.trimEnd()} ${n}`}function XS(e,t){let r=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return e.replace(r,"").replace(/\s+/gu," ").trimEnd()}function gf(e){return/[\s"]/u.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}function cB(e,t){let r=e.split(`
2340
2340
  `),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*_MEMBER_(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,t),r.join(`
2341
2341
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let i=r.slice(0,s).join(`
2342
2342
  `),o=r.slice(s).join(`
@@ -2344,7 +2344,7 @@ List native provider sessions in scope, or list recent managed runs with --runs.
2344
2344
 
2345
2345
  `:""}${t}${o.length>0?`
2346
2346
  ${o}`:`
2347
- `}`}function cB(e,t){let r=`#teamfile: ${t}`,n=e.indexOf(`
2347
+ `}`}function dB(e,t){let r=`#teamfile: ${t}`,n=e.indexOf(`
2348
2348
  `),s=n>=0?e.slice(0,n):e,i=n>=0?e.slice(n+1):"";return s===r?e:s.startsWith("#teamfile:")?i.length>0?`${r}
2349
2349
  ${i}`:`${r}
2350
2350
  `:e.length>0?`${r}
@@ -2353,10 +2353,10 @@ ${e}`:`${r}
2353
2353
  `),1}function pf(e,t,r){return e.stderr.write(`error: ${t}
2354
2354
  ${r}`),2}function yf(e,t){for(let r of e)r.teamfile!==void 0&&t.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2355
2355
  `),r.provider==="gemini"&&t.stderr.write(`${FS.replace("%s",r.alias)}
2356
- `)}var Ps,BW,qW,Pa,mf,FS,hf,US,Hr,Ws=T(()=>{"use strict";zt();MS();mi();it();Re();Rt();Lt();Rt();ff();Os();Ps=5,BW=`usage: lmctl lint <teamfile.lmctl>
2356
+ `)}var Ps,qW,HW,Pa,mf,FS,hf,US,Hr,Ws=T(()=>{"use strict";zt();MS();mi();it();Re();Rt();Lt();Rt();ff();Os();Ps=5,qW=`usage: lmctl lint <teamfile.lmctl>
2357
2357
 
2358
2358
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2359
- `,qW=`usage: lmctl seed <teamfile.lmctl>
2359
+ `,HW=`usage: lmctl seed <teamfile.lmctl>
2360
2360
 
2361
2361
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
2362
2362
  member's configured native provider.
@@ -2373,32 +2373,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
2373
2373
  re-seed.
2374
2374
  A member cannot refresh its own running session; run the refresh from a
2375
2375
  meta-Lead or operator shell outside that sessiondir.
2376
- `,FS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',hf={existsSync:UW,statSync:WW,accessSync:FW},US=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),cc)),r=await t(e);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Hr=hf});var ZS={};ye(ZS,{runClone:()=>gB});import{existsSync as wf,mkdirSync as dB,readFileSync as uB,readdirSync as fB,statSync as YS,writeFileSync as mB}from"node:fs";import{basename as VS,dirname as pB,extname as _B,join as zS,resolve as KS}from"node:path";async function gB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(hB),0;if(e.length!==2)return t.stderr.write(`usage: lmctl clone <source> <dest>
2377
- `),2;let[r,n]=e,s,i=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=KS(r);if(!wf(c))throw new Error(`source not found: ${r}`);let u=YS(c).isDirectory()?yB(c):c;s=uB(u,"utf8"),i=u}}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2378
- `),1}let o=KS(n),a=wB(o,i,n);if(wf(a))return t.stderr.write(`error: ${a} already exists.
2379
- `),1;let l=TB(EB(s));return dB(pB(a),{recursive:!0}),mB(a,l,"utf8"),t.stdout.write(`Cloned ${r} -> ${a}
2376
+ `,FS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',hf={existsSync:WW,statSync:BW,accessSync:UW},US=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),cc)),r=await t(e);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Hr=hf});var ZS={};ye(ZS,{runClone:()=>yB});import{existsSync as wf,mkdirSync as uB,readFileSync as fB,readdirSync as mB,statSync as YS,writeFileSync as pB}from"node:fs";import{basename as VS,dirname as _B,extname as hB,join as zS,resolve as KS}from"node:path";async function yB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(gB),0;if(e.length!==2)return t.stderr.write(`usage: lmctl clone <source> <dest>
2377
+ `),2;let[r,n]=e,s,i=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=KS(r);if(!wf(c))throw new Error(`source not found: ${r}`);let u=YS(c).isDirectory()?wB(c):c;s=fB(u,"utf8"),i=u}}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2378
+ `),1}let o=KS(n),a=EB(o,i,n);if(wf(a))return t.stderr.write(`error: ${a} already exists.
2379
+ `),1;let l=bB(TB(s));return uB(_B(a),{recursive:!0}),pB(a,l,"utf8"),t.stdout.write(`Cloned ${r} -> ${a}
2380
2380
  `),t.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
2381
2381
  `),t.stdout.write(`After editing, run: lmctl lint ${a}
2382
2382
  `),t.stdout.write(`Then run: lmctl seed ${a}
2383
- `),0}function yB(e){let t=fB(e).filter(r=>r.endsWith(".lmctl"));if(t.length===0)throw new Error(`no .lmctl files in source directory: ${e}`);if(t.length>1)throw new Error(`multiple .lmctl files in source directory: ${e}; specify the source file explicitly`);return zS(e,t[0])}function wB(e,t,r){if(r.endsWith("/")||wf(e)&&YS(e).isDirectory()){let n=VS(t).endsWith(".lmctl")?VS(t):"team.lmctl";return zS(e,n)}return _B(e)?e:`${e}.lmctl`}function EB(e){return e.split(`
2383
+ `),0}function wB(e){let t=mB(e).filter(r=>r.endsWith(".lmctl"));if(t.length===0)throw new Error(`no .lmctl files in source directory: ${e}`);if(t.length>1)throw new Error(`multiple .lmctl files in source directory: ${e}; specify the source file explicitly`);return zS(e,t[0])}function EB(e,t,r){if(r.endsWith("/")||wf(e)&&YS(e).isDirectory()){let n=VS(t).endsWith(".lmctl")?VS(t):"team.lmctl";return zS(e,n)}return hB(e)?e:`${e}.lmctl`}function TB(e){return e.split(`
2384
2384
  `).map(t=>/^\s*_MEMBER_\s+\S/.test(t)?t.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):t).join(`
2385
- `)}function TB(e){return e.split(`
2385
+ `)}function bB(e){return e.split(`
2386
2386
  `).map(t=>/^\s*_MEMBER_\s+\S/.test(t)?t.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):t).join(`
2387
- `)}var hB,QS=T(()=>{"use strict";hB=`usage: lmctl clone <source> <dest>
2387
+ `)}var gB,QS=T(()=>{"use strict";gB=`usage: lmctl clone <source> <dest>
2388
2388
 
2389
2389
  Copy a teamfile and strip its session ids, producing a static editable template.
2390
2390
 
2391
2391
  Examples:
2392
2392
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
2393
- `});var rv={};ye(rv,{runPlan:()=>xB});import{existsSync as bB,mkdirSync as SB,writeFileSync as vB}from"node:fs";import{basename as ev,extname as tv,join as kB,resolve as IB}from"node:path";async function xB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(NB),0;let r=Z(e,["--team","--provider"],[]);if(r.error!==void 0)return t.stderr.write(`error: ${r.error}
2393
+ `});var rv={};ye(rv,{runPlan:()=>AB});import{existsSync as SB,mkdirSync as vB,writeFileSync as kB}from"node:fs";import{basename as ev,extname as tv,join as IB,resolve as NB}from"node:path";async function AB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(xB),0;let r=Z(e,["--team","--provider"],[]);if(r.error!==void 0)return t.stderr.write(`error: ${r.error}
2394
2394
  `),t.stderr.write(`usage: lmctl plan [options] <directory>
2395
2395
  `),2;if(r.positionals.length!==1)return t.stderr.write(`usage: lmctl plan [options] <directory>
2396
- `),2;let n=IB(r.positionals[0]);SB(n,{recursive:!0});let s=P(r,"--team")??ev(n),i=P(r,"--provider")??"claude",o=kB(n,AB(s));if(bB(o))return t.stderr.write(`error: ${o} already exists.
2397
- `),1;let a=LB({teamName:RB(s),leadProvider:i}),l=ja(a,Da({workdir:n,teamfile:o,date:new Date}));return vB(o,l.text,"utf8"),t.stdout.write(`Created ${o}
2396
+ `),2;let n=NB(r.positionals[0]);vB(n,{recursive:!0});let s=P(r,"--team")??ev(n),i=P(r,"--provider")??"claude",o=IB(n,RB(s));if(SB(o))return t.stderr.write(`error: ${o} already exists.
2397
+ `),1;let a=OB({teamName:LB(s),leadProvider:i}),l=ja(a,Da({workdir:n,teamfile:o,date:new Date}));return kB(o,l.text,"utf8"),t.stdout.write(`Created ${o}
2398
2398
  `),t.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
2399
2399
  `),t.stdout.write(`After editing, run: lmctl lint ${o}
2400
2400
  `),t.stdout.write(`Then run: lmctl seed ${o}
2401
- `),0}function AB(e){return tv(e)?e:`${e}.lmctl`}function RB(e){let t=tv(e);return t?ev(e,t):e}function LB(e){let{teamName:t,leadProvider:r}=e;return`# ${t}
2401
+ `),0}function RB(e){return tv(e)?e:`${e}.lmctl`}function LB(e){let t=tv(e);return t?ev(e,t):e}function OB(e){let{teamName:t,leadProvider:r}=e;return`# ${t}
2402
2402
 
2403
2403
  # Lead operating guide: https://lmctl.com/skills/lmctl-lead.md
2404
2404
 
@@ -2410,7 +2410,7 @@ _MEMBER_ alias=Coder provider=codex
2410
2410
  _MEMBER_ alias=Reviewer1 provider=codex
2411
2411
  _MEMBER_ alias=Reviewer2 provider=${r}
2412
2412
  _MEMBER_ alias=Reviewer3 provider=agy
2413
- `}var NB,nv=T(()=>{"use strict";Re();ff();NB=`usage: lmctl plan [options] <directory>
2413
+ `}var xB,nv=T(()=>{"use strict";Re();ff();xB=`usage: lmctl plan [options] <directory>
2414
2414
 
2415
2415
  Generate a starter lmctl team document template for a directory.
2416
2416
 
@@ -2425,7 +2425,8 @@ Examples:
2425
2425
 
2426
2426
  # Same shape, codex for the Lead and Reviewer2
2427
2427
  lmctl plan ./backend --provider codex
2428
- `});import{execFileSync as OB}from"node:child_process";import{resolve as sv}from"node:path";function $B(e){return e.filter(t=>t.state!=="retired")}function iv(e,t,r){if(r!==void 0){let a=t.findProjectByName(r);return a===null?v(e,`project not found: ${r}`):a}let n=e.cwd??process.cwd(),s;try{s=OB("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=sv(s),o=t.listProjects().find(a=>sv(a.local_path)===i);return o===void 0?v(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function ov(e,t,r,n){if(n!==void 0){let i=t.findTeamByName(n);return i===null?v(e,`team not found: ${n}`):i}let s=t.getTeam(r.team_id);return s===null?v(e,`project ${r.name} has no assigned team; use --team <name>`):s}function av(e,t,r,n){if(n!==void 0){let i=t.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(e,`member not found: ${n}`):i}let s=$B(t.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(e,`team ${r.name} has no active agent member`):s}var lv=T(()=>{"use strict";Re()});var uv={};ye(uv,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>dv,runTerminal:()=>DB});import{spawn as CB}from"node:child_process";import{statSync as MB}from"node:fs";async function DB(e,t){if(e.includes("--help")||e.includes("-h"))return HB(t);let r=Z(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(t,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?G(r,o):P(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await $(t,async o=>{let a=P(r,"--alias"),l=pw(o,s,a);return"err"in l?v(t,l.err):Ef(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(o){return Me(t,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?G(r,l):P(r,l)!==void 0)return v(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=yr(jB,{target:i,alias:o,flags:{}});return a.mode==="error"?v(t,a.message):a.mode!=="ai-team"?v(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(t,"terminal: alias required for the teamfile target"):await $(t,l=>PB(t,a.teamfile,a.alias,l))}try{return await $(t,async s=>{let i=WB(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return G(r,"--size")?qB(t,s,i,o,G(r,"--json")):BB(t,s,i,o)})}catch(s){return Me(t,s)}}async function PB(e,t,r,n){let s;try{s=qe(t,r,n)}catch(d){return d instanceof ge?v(e,d.message):Me(e,d)}let i=hr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:gr()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=ub({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=FB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},fb()),a.unref?.();try{In(e,je(s.teamfile),s.teamfile)}catch{}return c=await Ef(e,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),UB(n,l,c)}}function FB(e,t){try{return e.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:t.teamfile,from_identity:`${t.teamfile}:terminal`,target_teamfile:t.teamfile,target_alias:t.alias,root_teamfile:t.teamfile,cwd:t.sessiondir,command:`lmctl terminal ${t.teamfile} ${t.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:t.provider,sessionid:t.sessionid})}).id}catch{return null}}function UB(e,t,r){if(t!==null)try{e.finishTrackedInvocation(t,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function Ef(e,t){let{provider:r,sessionid:n,sessiondir:s}=t;if(!Ia(r))return v(e,`no resume incantation for provider "${r}"`);if(!Ab.test(n))return v(e,"refusing to resume: malformed sessionid");let i=Uu(r,n,{isLead:t.isLead});if(i===null||i.length===0)return v(e,`no resume incantation for provider "${r}"`);let[o,...a]=i;return await new Promise(l=>{let c=CB(o,a,{stdio:"inherit",cwd:s,env:We(process.env,s,n,"terminal")});c.on("error",d=>{l(v(e,`failed to launch ${o}: ${d.message}`))}),c.on("exit",d=>l(d??0))})}function WB(e,t,r){let n=P(r,"--team");if(n!==void 0){let o=t.findTeamByName(n);return o===null?v(e,`team not found: ${n}`):o}let s=iv(e,t,P(r,"--project"));return typeof s=="number"?s:ov(e,t,s,void 0)}async function BB(e,t,r,n){let s=av(e,t,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?v(e,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Ef(e,{provider:Fe(s),sessionid:i,sessiondir:s.sessiondir})}function dv(e){if(e&&Array.isArray(e.messages)&&e.messages.length>0){let r=e.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:e.messages.length,bytes:null}}let t=e?.filePath;if(t!==void 0)try{let r=MB(t).size;return{chars:r,est:Math.ceil(r/4),messages:e?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function qB(e,t,r,n,s){let i;if(n!==void 0){let a=t.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return v(e,`member not found: ${n}`);i=[a]}else i=t.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=Fe(a),d=null;Ia(c)&&(d=await Qt(l,c));let u=dv(d),f=u.est>Bs;o.push({alias:a.alias,provider:c,sessionid:l,messages:u.messages,bytes:u.bytes,est_tokens:u.est,estimate:!0,over_guide:f,resume_incantation:f?Na(c,l):null})}if(s)return ae(e,{estimate:!0,legend:cv,guide_tokens:Bs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2428
+ `});import{execFileSync as $B}from"node:child_process";import{resolve as sv}from"node:path";function CB(e){return e.filter(t=>t.state!=="retired")}function iv(e,t,r){if(r!==void 0){let a=t.findProjectByName(r);return a===null?v(e,`project not found: ${r}`):a}let n=e.cwd??process.cwd(),s;try{s=$B("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=sv(s),o=t.listProjects().find(a=>sv(a.local_path)===i);return o===void 0?v(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function ov(e,t,r,n){if(n!==void 0){let i=t.findTeamByName(n);return i===null?v(e,`team not found: ${n}`):i}let s=t.getTeam(r.team_id);return s===null?v(e,`project ${r.name} has no assigned team; use --team <name>`):s}function av(e,t,r,n){if(n!==void 0){let i=t.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(e,`member not found: ${n}`):i}let s=CB(t.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(e,`team ${r.name} has no active agent member`):s}var lv=T(()=>{"use strict";Re()});var uv={};ye(uv,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>dv,runTerminal:()=>PB});import{spawn as MB}from"node:child_process";import{statSync as jB}from"node:fs";async function PB(e,t){if(e.includes("--help")||e.includes("-h"))return JB(t);let r=Z(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(t,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?G(r,o):P(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await $(t,async o=>{let a=P(r,"--alias"),l=pw(o,s,a);return"err"in l?v(t,l.err):Ef(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return je(t,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?G(r,l):P(r,l)!==void 0)return v(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=yr(DB,{target:i,alias:o,flags:{}});return a.mode==="error"?v(t,a.message):a.mode!=="ai-team"?v(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(t,"terminal: alias required for the teamfile target"):await $(t,l=>FB(t,a.teamfile,a.alias,l))}try{return await $(t,async s=>{let i=BB(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return G(r,"--size")?HB(t,s,i,o,G(r,"--json")):qB(t,s,i,o)})}catch(s){return je(t,s)}}async function FB(e,t,r,n){let s;try{s=He(t,r,n)}catch(d){return d instanceof ge?v(e,d.message):je(e,d)}let i=hr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:gr()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=ub({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=UB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},fb()),a.unref?.();try{In(e,De(s.teamfile),s.teamfile)}catch{}return c=await Ef(e,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),WB(n,l,c)}}function UB(e,t){try{return e.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:t.teamfile,from_identity:`${t.teamfile}:terminal`,target_teamfile:t.teamfile,target_alias:t.alias,root_teamfile:t.teamfile,cwd:t.sessiondir,command:`lmctl terminal ${t.teamfile} ${t.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:t.provider,sessionid:t.sessionid,...t.model!==void 0?{model:t.model}:{}})}).id}catch{return null}}function WB(e,t,r){if(t!==null)try{e.finishTrackedInvocation(t,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function Ef(e,t){let{provider:r,sessionid:n,sessiondir:s,model:i}=t;if(!Ia(r))return v(e,`no resume incantation for provider "${r}"`);if(!Ab.test(n))return v(e,"refusing to resume: malformed sessionid");let o=Uu(r,n,{isLead:t.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;e.stderr.write(`${d}
2429
+ `),$e({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return v(e,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(c=>{let d=MB(a,l,{stdio:"inherit",cwd:s,env:Be(process.env,s,n,"terminal")});d.on("error",u=>{c(v(e,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function BB(e,t,r){let n=P(r,"--team");if(n!==void 0){let o=t.findTeamByName(n);return o===null?v(e,`team not found: ${n}`):o}let s=iv(e,t,P(r,"--project"));return typeof s=="number"?s:ov(e,t,s,void 0)}async function qB(e,t,r,n){let s=av(e,t,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?v(e,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Ef(e,{provider:Ue(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function dv(e){if(e&&Array.isArray(e.messages)&&e.messages.length>0){let r=e.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:e.messages.length,bytes:null}}let t=e?.filePath;if(t!==void 0)try{let r=jB(t).size;return{chars:r,est:Math.ceil(r/4),messages:e?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function HB(e,t,r,n,s){let i;if(n!==void 0){let a=t.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return v(e,`member not found: ${n}`);i=[a]}else i=t.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=Ue(a),d=a.model??null,u=null;Ia(c)&&(u=await Qt(l,c));let f=dv(u),m=f.est>Bs;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?Na(c,l,d!==null?{model:d}:{}):null})}if(s)return ae(e,{estimate:!0,legend:cv,guide_tokens:Bs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2429
2430
  `),e.stdout.write(`${cv}
2430
2431
  `);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);e.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2431
2432
  `),a.over_guide&&e.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2433,7 +2434,7 @@ Examples:
2433
2434
  session yourself:
2434
2435
  ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
2435
2436
  (or: lmctl terminal --team ${r.name} --alias ${a.alias})
2436
- `)}return 0}function HB(e){return e.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2437
+ `)}return 0}function JB(e){return e.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2437
2438
  lmctl terminal <teamfile> <alias>
2438
2439
  lmctl terminal --run <id> [--alias A]
2439
2440
  lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
@@ -2464,25 +2465,25 @@ Examples:
2464
2465
  tokens it surfaces the resume incantation so YOU can
2465
2466
  open & self-compact. Nothing is ever changed
2466
2467
  automatically; ${Bs} is a guide, not a gate.
2467
- `),0}var jB,Bs,cv,fv=T(()=>{"use strict";Ze();An();Re();lv();Lt();zt();it();Os();Fr();ea();Ru();Xo();jB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,cv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function Tf(e,t){let r=JB[e],n=t("which",[e]);return n.status===0&&(n.stdout??"").toString().trim()!==""?t(e,["--version"]).status===0?{provider:e,status:"ok",detail:"installed, --version OK"}:{provider:e,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:e,status:"skipped",detail:"not installed"}:{provider:e,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var JB,mv=T(()=>{"use strict";JB={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var Ev={};ye(Ev,{initWorkspace:()=>yv,runWorkspace:()=>ZB,setWorkspaceProvider:()=>wv});import{copyFileSync as XB,cpSync as GB,existsSync as Pe,mkdirSync as Er,readdirSync as Sf,renameSync as VB,rmSync as Wa,statSync as Ba,writeFileSync as KB}from"node:fs";import{spawnSync as YB}from"node:child_process";import{homedir as pv}from"node:os";import{dirname as vf,join as qs}from"node:path";async function ZB(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(zB),0;switch(r){case"list":return QB(n,t);case"create":return eq(n,t);case"use":return tq(n,t);case"show":return rq(n,t);case"delete":return nq(n,t);case"migrate":return sq(n,t);case"init":return yv(n,t);case"set-provider":return wv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function hv(){let e=Gs(),t=[],r=new Set,n=Sr.default,s=Pe(Js()),i=Pe(jt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Tr(n):Js(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),Pe(Xr())){let o;try{o=Sf(Xr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!ze(a))continue;let l=!1;try{l=Ba(jt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Tr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function QB(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length!==0)return v(t,"usage: lmctl workspace list");let n=hv();if(G(r,"--json"))return ae(t,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";t.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2468
- `)}return 0}function eq(e,t){let r=Z(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=jt(n);if(Pe(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Xa(n);Er(s,{recursive:!0}),Er(i,{recursive:!0});let o=Tr(n);Er(vf(o),{recursive:!0});let a=Ie({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return G(r,"--json")?ae(t,l):t.stdout.write(`created workspace ${n} at ${s}
2469
- `),0}function tq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace use <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Pe(jt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Xs();return Er(vf(s),{recursive:!0}),KB(s,`${n}
2468
+ `),0}var DB,Bs,cv,fv=T(()=>{"use strict";Ze();An();Re();lv();Lt();zt();it();Os();Fr();ea();Ru();Xo();Te();DB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,cv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function Tf(e,t){let r=XB[e],n=t("which",[e]);return n.status===0&&(n.stdout??"").toString().trim()!==""?t(e,["--version"]).status===0?{provider:e,status:"ok",detail:"installed, --version OK"}:{provider:e,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:e,status:"skipped",detail:"not installed"}:{provider:e,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var XB,mv=T(()=>{"use strict";XB={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var Ev={};ye(Ev,{initWorkspace:()=>yv,runWorkspace:()=>QB,setWorkspaceProvider:()=>wv});import{copyFileSync as GB,cpSync as VB,existsSync as Fe,mkdirSync as Er,readdirSync as Sf,renameSync as KB,rmSync as Wa,statSync as Ba,writeFileSync as YB}from"node:fs";import{spawnSync as zB}from"node:child_process";import{homedir as pv}from"node:os";import{dirname as vf,join as qs}from"node:path";async function QB(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(ZB),0;switch(r){case"list":return eq(n,t);case"create":return tq(n,t);case"use":return rq(n,t);case"show":return nq(n,t);case"delete":return sq(n,t);case"migrate":return iq(n,t);case"init":return yv(n,t);case"set-provider":return wv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function hv(){let e=Gs(),t=[],r=new Set,n=Sr.default,s=Fe(Js()),i=Fe(jt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Tr(n):Js(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),Fe(Xr())){let o;try{o=Sf(Xr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!ze(a))continue;let l=!1;try{l=Ba(jt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Tr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function eq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length!==0)return v(t,"usage: lmctl workspace list");let n=hv();if(G(r,"--json"))return ae(t,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";t.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2469
+ `)}return 0}function tq(e,t){let r=Z(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=jt(n);if(Fe(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Xa(n);Er(s,{recursive:!0}),Er(i,{recursive:!0});let o=Tr(n);Er(vf(o),{recursive:!0});let a=Ie({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return G(r,"--json")?ae(t,l):t.stdout.write(`created workspace ${n} at ${s}
2470
+ `),0}function rq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace use <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Fe(jt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Xs();return Er(vf(s),{recursive:!0}),YB(s,`${n}
2470
2471
  `),G(r,"--json")?ae(t,{active:n,path:s}):t.stdout.write(`active workspace set to ${n}
2471
- `),0}function rq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace show <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);let s=hv().find(d=>d.name===n);if(s===void 0)return v(t,`workspace not found: ${n}`);let i=0;try{i=Pe(s.db_path)?Ba(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(Pe(s.db_path)){let d=Ie({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return G(r,"--json")?ae(t,c):t.stdout.write(`${JSON.stringify(c,null,2)}
2472
- `),0}function nq(e,t){let r=Z(e,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace delete <name> --confirm [--force]");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(!G(r,"--confirm"))return v(t,`refusing to delete workspace ${n} without --confirm`);if(n===Sr.default&&!G(r,"--force"))return v(t,"refusing to delete the default workspace without --force");if(Gs()===n&&!G(r,"--force"))return v(t,`refusing to delete the active workspace (${n}) without --force`);let i=jt(n);return Pe(i)?(Wa(i,{recursive:!0,force:!0}),G(r,"--json")?ae(t,{deleted:n,dir:i}):t.stdout.write(`deleted workspace ${n}
2473
- `),0):v(t,`workspace not found: ${n}`)}function bf(e,t,r){try{VB(e,t);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${e} -> ${t} then removing source
2474
- `),Ba(e).isDirectory()?GB(e,t,{recursive:!0}):XB(e,t),!Pe(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Wa(e,{recursive:!0,force:!0})}function sq(e,t){let r=Z(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=G(r,"--json"),s=Ga(),i=Xr(),o=[],a=(f,m)=>{if(n)ae(t,{migrated:f,reason:m??null,actions:o});else{for(let p of o)t.stdout.write(`${p}
2472
+ `),0}function nq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace show <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);let s=hv().find(d=>d.name===n);if(s===void 0)return v(t,`workspace not found: ${n}`);let i=0;try{i=Fe(s.db_path)?Ba(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(Fe(s.db_path)){let d=Ie({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return G(r,"--json")?ae(t,c):t.stdout.write(`${JSON.stringify(c,null,2)}
2473
+ `),0}function sq(e,t){let r=Z(e,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace delete <name> --confirm [--force]");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(!G(r,"--confirm"))return v(t,`refusing to delete workspace ${n} without --confirm`);if(n===Sr.default&&!G(r,"--force"))return v(t,"refusing to delete the default workspace without --force");if(Gs()===n&&!G(r,"--force"))return v(t,`refusing to delete the active workspace (${n}) without --force`);let i=jt(n);return Fe(i)?(Wa(i,{recursive:!0,force:!0}),G(r,"--json")?ae(t,{deleted:n,dir:i}):t.stdout.write(`deleted workspace ${n}
2474
+ `),0):v(t,`workspace not found: ${n}`)}function bf(e,t,r){try{KB(e,t);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${e} -> ${t} then removing source
2475
+ `),Ba(e).isDirectory()?VB(e,t,{recursive:!0}):GB(e,t),!Fe(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Wa(e,{recursive:!0,force:!0})}function iq(e,t){let r=Z(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=G(r,"--json"),s=Ga(),i=Xr(),o=[],a=(f,m)=>{if(n)ae(t,{migrated:f,reason:m??null,actions:o});else{for(let p of o)t.stdout.write(`${p}
2475
2476
  `);t.stdout.write(f?`migration complete
2476
2477
  `:`${m??"nothing to migrate"}
2477
- `)}return 0};if(!Pe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Sf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ba(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Wa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Pe(i))bf(s,i,t),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>Pe(qs(i,m)));if(f.length>0)return v(t,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(i,{recursive:!0});for(let m of c)bf(qs(s,m),qs(i,m),t),o.push(`moved ${m} -> workspaces/${m}`);try{Sf(s).length===0&&(Wa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Hf(),u=Xs();return Pe(d)&&(Pe(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(bf(d,u,t),o.push("renamed active-profile -> active-workspace"))),a(!0)}function gv(e,t){return YB(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function aq(e){return process.stderr.write(e),new Promise(t=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}t(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function _v(e){return e==="~"?pv():e.startsWith("~/")?qs(pv(),e.slice(2)):e}async function yv(e,t,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Cn.join(", ")}.`].join(`
2478
+ `)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Sf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ba(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Wa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Fe(i))bf(s,i,t),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>Fe(qs(i,m)));if(f.length>0)return v(t,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(i,{recursive:!0});for(let m of c)bf(qs(s,m),qs(i,m),t),o.push(`moved ${m} -> workspaces/${m}`);try{Sf(s).length===0&&(Wa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Hf(),u=Xs();return Fe(d)&&(Fe(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(bf(d,u,t),o.push("renamed active-profile -> active-workspace"))),a(!0)}function gv(e,t){return zB(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function lq(e){return process.stderr.write(e),new Promise(t=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}t(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function _v(e){return e==="~"?pv():e.startsWith("~/")?qs(pv(),e.slice(2)):e}async function yv(e,t,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Cn.join(", ")}.`].join(`
2478
2479
  `)+`
2479
2480
  `),0;let s=Z(e,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return v(t,s.error);if(s.positionals.length!==0)return v(t,n);let i=r.spawn??gv,a=Cn.map(x=>Tf(x,i)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
2480
- `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??aq,d=r.promptLine!==void 0||l,u=x=>(t.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2481
+ `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??lq,d=r.promptLine!==void 0||l,u=x=>(t.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2481
2482
  `),2),f,m=P(s,"--name");if(m!==void 0){if(!ze(m))return t.stderr.write(`error: invalid workspace name: ${m}
2482
2483
  `),2;f=m}else{if(!d)return u("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),U=x.length===0?"default":x;if(ze(U)){f=U;break}t.stderr.write(`invalid workspace name: ${U} (letters/digits/.-_, start alnum, \u226464)
2483
- `)}}let p=jt(f);if(Pe(p))return t.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2484
- `),2;let _,g=P(s,"--basedir"),h=Xa(f);if(g!==void 0)_=_v(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:_v(x)}let S={};for(let x of["provider1","provider2","provider3"]){let U=P(s,`--${x}`),ue=iq[x],W=a.includes(ue)?ue:a[0];if(U!==void 0){if(!a.includes(U))return t.stderr.write(`error: --${x} ${U} is not an available provider (available: ${a.join(", ")})
2485
- `),2;S[x]=U;continue}if(!d)return u(`--${x}`);for(;;){let M=(await c(`${x} (${oq[x]}) [${W}]: `)).trim(),A=M.length===0?W:M;if(a.includes(A)){S[x]=A;break}t.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
2484
+ `)}}let p=jt(f);if(Fe(p))return t.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2485
+ `),2;let _,g=P(s,"--basedir"),h=Xa(f);if(g!==void 0)_=_v(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:_v(x)}let S={};for(let x of["provider1","provider2","provider3"]){let U=P(s,`--${x}`),ue=oq[x],W=a.includes(ue)?ue:a[0];if(U!==void 0){if(!a.includes(U))return t.stderr.write(`error: --${x} ${U} is not an available provider (available: ${a.join(", ")})
2486
+ `),2;S[x]=U;continue}if(!d)return u(`--${x}`);for(;;){let M=(await c(`${x} (${aq[x]}) [${W}]: `)).trim(),A=M.length===0?W:M;if(a.includes(A)){S[x]=A;break}t.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
2486
2487
  `)}}Er(p,{recursive:!0}),Er(_,{recursive:!0});let y=Tr(f);Er(vf(y),{recursive:!0});let w=Ie({path:y});try{w.setConfig("project.docroot",_),w.setConfig("workspace.provider1",S.provider1),w.setConfig("workspace.provider2",S.provider2),w.setConfig("workspace.provider3",S.provider3)}finally{w.close()}let I={name:f,dir:p,db_path:y,basedir:_,providers:{...S}};return G(s,"--json")?ae(t,I):(t.stdout.write(`created workspace ${f} at ${p}
2487
2488
  `),t.stdout.write(` basedir: ${_}
2488
2489
  `),t.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
@@ -2493,7 +2494,7 @@ Examples:
2493
2494
  `),2;let c=r.spawn??gv,d=Cn.map(p=>Tf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(d.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
2494
2495
  `),2;if(!d.includes(o))return t.stderr.write(`error: ${o} is not an available provider (available: ${d.join(", ")})
2495
2496
  `),2;let u=t.dal===void 0,f=t.dal??Ie({path:le()});try{f.setConfig(`workspace.${l}`,o)}finally{u&&f.close()}let m=Dt()??Sr.default;return t.stdout.write(`workspace.${l} = ${o} (workspace: ${m})
2496
- `),0}var zB,Cn,iq,oq,Tv=T(()=>{"use strict";Ze();mv();Re();Je();zB=`usage: lmctl workspace list [--json]
2497
+ `),0}var ZB,Cn,oq,aq,Tv=T(()=>{"use strict";Ze();mv();Re();Xe();ZB=`usage: lmctl workspace list [--json]
2497
2498
  lmctl workspace create <name> [--docroot PATH] [--json]
2498
2499
  lmctl workspace use <name> [--json]
2499
2500
  lmctl workspace show <name> [--json]
@@ -2505,7 +2506,7 @@ Examples:
2505
2506
  Manage isolated workspace state directories, active workspace selection,
2506
2507
  legacy profile migration, and configured provider slots.
2507
2508
  delete requires --confirm; deleting default or active workspaces also requires --force.
2508
- `;Cn=["claude","codex","gemini","qwen"],iq={provider1:"claude",provider2:"codex",provider3:"gemini"},oq={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as lq,randomBytes as cq}from"node:crypto";import{readFile as dq}from"node:fs/promises";function bv(e=new Date,t=cq(4)){let r=e.getUTCFullYear().toString().padStart(4,"0"),n=(e.getUTCMonth()+1).toString().padStart(2,"0"),s=e.getUTCDate().toString().padStart(2,"0"),i=e.getUTCHours().toString().padStart(2,"0"),o=e.getUTCMinutes().toString().padStart(2,"0"),a=e.getUTCSeconds().toString().padStart(2,"0"),l=t.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${i}${o}${a}-${l}`}function uq(e){return lq("sha256").update(e).digest("hex")}async function Sv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await dq(n);return{path:r,sha256:uq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function vv(e){return{ticket_id:e.ticketId,lmctl_next_version:e.lmctlNextVersion,node_version:e.nodeVersion,platform:e.platform,generated_at:e.generatedAt.toISOString(),sanitized:e.sanitized,files:e.files}}var kf=T(()=>{"use strict"});import{spawnSync as kv}from"node:child_process";import{mkdir as If,writeFile as Iv,readFile as fq,rm as Nv}from"node:fs/promises";import{tmpdir as mq}from"node:os";import{dirname as xv,join as Nf}from"node:path";async function Av(e){let t=e.stagingDir??Nf(mq(),`lmctl-diag-${e.ticketId}`),r=Nf(t,`diagnostic-${e.ticketId}`);await If(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=Nf(r,u);if(await If(xv(m),{recursive:!0}),typeof f=="string")await Iv(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Iv(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
2509
+ `;Cn=["claude","codex","gemini","qwen"],oq={provider1:"claude",provider2:"codex",provider3:"gemini"},aq={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as cq,randomBytes as dq}from"node:crypto";import{readFile as uq}from"node:fs/promises";function bv(e=new Date,t=dq(4)){let r=e.getUTCFullYear().toString().padStart(4,"0"),n=(e.getUTCMonth()+1).toString().padStart(2,"0"),s=e.getUTCDate().toString().padStart(2,"0"),i=e.getUTCHours().toString().padStart(2,"0"),o=e.getUTCMinutes().toString().padStart(2,"0"),a=e.getUTCSeconds().toString().padStart(2,"0"),l=t.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${i}${o}${a}-${l}`}function fq(e){return cq("sha256").update(e).digest("hex")}async function Sv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await uq(n);return{path:r,sha256:fq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function vv(e){return{ticket_id:e.ticketId,lmctl_next_version:e.lmctlNextVersion,node_version:e.nodeVersion,platform:e.platform,generated_at:e.generatedAt.toISOString(),sanitized:e.sanitized,files:e.files}}var kf=T(()=>{"use strict"});import{spawnSync as kv}from"node:child_process";import{mkdir as If,writeFile as Iv,readFile as mq,rm as Nv}from"node:fs/promises";import{tmpdir as pq}from"node:os";import{dirname as xv,join as Nf}from"node:path";async function Av(e){let t=e.stagingDir??Nf(pq(),`lmctl-diag-${e.ticketId}`),r=Nf(t,`diagnostic-${e.ticketId}`);await If(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=Nf(r,u);if(await If(xv(m),{recursive:!0}),typeof f=="string")await Iv(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Iv(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
2509
2510
  `;if(e.data.serve!==void 0){let u=e.data.serve,f=u.pid===null?`no daemon (source=${u.pid_source})
2510
2511
  `:`${u.pid}
2511
2512
  # source=${u.pid_source} alive=${String(u.pid_alive)}
@@ -2523,29 +2524,29 @@ delete requires --confirm; deleting default or active workspaces also requires -
2523
2524
  `:`# source=${f}
2524
2525
  # tail_lines=${u.tail_lines}
2525
2526
  `;await s("intents/recent.log",`${m}${u.tail}${u.tail.length>0?`
2526
- `:""}`)}if(await s("README.md",pq(e)),e.sanitized)for(let u of n){let f=await fq(u.absPath);try{Kf(u.bundlePath,f.toString("utf8"))}catch(m){throw await Nv(t,{recursive:!0,force:!0}),m instanceof vr,m}}let o=await Sv(n),a=vv({ticketId:e.ticketId,lmctlNextVersion:e.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:e.generatedAt??new Date,sanitized:e.sanitized,files:o});await s("manifest.json",i(a)),await If(xv(e.outputPath),{recursive:!0});let l=kv("tar",["-czf",e.outputPath,"-C",t,`diagnostic-${e.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=kv("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Nv(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function pq(e){let t=Object.keys(e.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${e.ticketId}`,"",`Generated by lmctl ${e.lmctlNextVersion}.`,"",`Sections included: ${t}`,`Sanitized: ${e.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2527
- `)}var Rv=T(()=>{"use strict";kf();Ks()});import{spawnSync as _q}from"node:child_process";import{stat as hq}from"node:fs/promises";async function Lv(e){try{if(!(await hq(e.bundlePath)).isFile())return{mode:e.mode,ok:!1,message:`bundle not a regular file: ${e.bundlePath}`}}catch(t){return{mode:e.mode,ok:!1,message:`bundle missing: ${t instanceof Error?t.message:String(t)}`}}switch(e.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${e.bundlePath}`,destination:e.bundlePath};case"internal-s3":return gq(e);case"hq":return yq(e)}}function gq(e){let r=_q("which",["aws"],{encoding:"utf8"}).status===0,s=`${e.s3Prefix??"s3://lmctl/diagnostics/"}${e.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${e.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${e.bundlePath} -> ${s}`,destination:s}}function yq(e){let t=e.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${t}/diagnostics/init with ticket ${e.ticketId}`,destination:t}}var Ov=T(()=>{"use strict"});var Cv={};ye(Cv,{parseDiagnoseArgs:()=>$v,runDiagnose:()=>Tq});import{tmpdir as wq}from"node:os";import{join as Eq}from"node:path";async function Tq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${vq()}
2527
+ `:""}`)}if(await s("README.md",_q(e)),e.sanitized)for(let u of n){let f=await mq(u.absPath);try{Kf(u.bundlePath,f.toString("utf8"))}catch(m){throw await Nv(t,{recursive:!0,force:!0}),m instanceof vr,m}}let o=await Sv(n),a=vv({ticketId:e.ticketId,lmctlNextVersion:e.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:e.generatedAt??new Date,sanitized:e.sanitized,files:o});await s("manifest.json",i(a)),await If(xv(e.outputPath),{recursive:!0});let l=kv("tar",["-czf",e.outputPath,"-C",t,`diagnostic-${e.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=kv("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Nv(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function _q(e){let t=Object.keys(e.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${e.ticketId}`,"",`Generated by lmctl ${e.lmctlNextVersion}.`,"",`Sections included: ${t}`,`Sanitized: ${e.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2528
+ `)}var Rv=T(()=>{"use strict";kf();Ks()});import{spawnSync as hq}from"node:child_process";import{stat as gq}from"node:fs/promises";async function Lv(e){try{if(!(await gq(e.bundlePath)).isFile())return{mode:e.mode,ok:!1,message:`bundle not a regular file: ${e.bundlePath}`}}catch(t){return{mode:e.mode,ok:!1,message:`bundle missing: ${t instanceof Error?t.message:String(t)}`}}switch(e.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${e.bundlePath}`,destination:e.bundlePath};case"internal-s3":return yq(e);case"hq":return wq(e)}}function yq(e){let r=hq("which",["aws"],{encoding:"utf8"}).status===0,s=`${e.s3Prefix??"s3://lmctl/diagnostics/"}${e.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${e.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${e.bundlePath} -> ${s}`,destination:s}}function wq(e){let t=e.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${t}/diagnostics/init with ticket ${e.ticketId}`,destination:t}}var Ov=T(()=>{"use strict"});var Cv={};ye(Cv,{parseDiagnoseArgs:()=>$v,runDiagnose:()=>bq});import{tmpdir as Eq}from"node:os";import{join as Tq}from"node:path";async function bq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${kq()}
2528
2529
  `),0;let r=$v(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2529
2530
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return t.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2530
2531
  `),2;if(r.upload&&r.internalS3)return t.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2531
- `),2;let n=bv(),s=r.outputPath??Sq(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await $(t,async o=>{let a=await zf({dal:o,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Av({ticketId:n,data:a,outputPath:s,lmctlNextVersion:yt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof vr)return t.stderr.write(`sanitization failed: ${u.message}
2532
+ `),2;let n=bv(),s=r.outputPath??vq(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await $(t,async o=>{let a=await zf({dal:o,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Av({ticketId:n,data:a,outputPath:s,lmctlNextVersion:yt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof vr)return t.stderr.write(`sanitization failed: ${u.message}
2532
2533
  `),2;throw u}let c=await Lv({mode:i,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),d={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?t.stdout.write(`${JSON.stringify(d,null,2)}
2533
2534
  `):(t.stdout.write(`ticket: ${n}
2534
2535
  `),t.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2535
2536
  `),t.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2536
2537
  `)),c.ok||i==="local"?0:1})}catch(o){return t.stderr.write(`diagnose failed: ${o instanceof Error?o.message:String(o)}
2537
- `),1}}function $v(e){let t={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--output"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --output";t.outputPath=i;continue}if(s==="--upload"){t.upload=!0;continue}if(s==="--internal-s3"){t.internalS3=!0;continue}if(s==="--hq"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --hq";t.hqUrl=i,t.upload=!0;continue}if(s==="--include"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!bq(i))return`unknown section: ${i} (expected one of ${Ys.join(", ")})`;r.push(i);continue}if(s==="--no-sanitize"){t.noSanitize=!0;continue}if(s==="--json"){t.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(t.include=r),t}function bq(e){return Ys.includes(e)}function Sq(e){return Eq(wq(),`lmctl-diag-${e}.tar.gz`)}function vq(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2538
- `)}var Mv=T(()=>{"use strict";Fn();Rv();kf();Ks();Ov();Je();Re()});var Wv={};ye(Wv,{ATTENTION_STATES:()=>Rf,DAEMON_INTERVAL_FAST_MS:()=>Af,REQUIRED_TEAM_ALIASES:()=>jv,chooseDiagnoses:()=>Fv,collectEvidence:()=>Pv,diagnose:()=>Dv,renderReport:()=>Uv,runDiagnosePrompt:()=>Nq});function Dv(e,t){let r=Pv(e,t),n=Fv(r);return Uv(r,n)}function Pv(e,t){let r=t.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:ks(),lastTickAt:null}},s=null;try{s=e.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=Iq(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let i=e.getJob(n.prompt.job_id);if(i!==null&&(n.job.exists=!0,n.job.status=i.status,n.job.attempt_count=i.attempt_count,n.job.last_error=i.last_error,n.job.available_at=i.available_at,n.job.locked_by=i.locked_by,n.job.run_id=i.run_id,i.run_id!==null))try{let o=e.getRun(i.run_id);if(o!==null){n.run.exists=!0,n.run.id=o.id,n.run.current_state=o.current_state,n.run.terminal_state=o.terminal_state,n.run.started_at=o.started_at,n.run.ended_at=o.ended_at;let a="__paused__:";n.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,n.run.paused_at=o.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let i=e.getProject(n.prompt.project_id);if(i!==null){n.project.exists=!0,n.project.id=i.id,n.project.name=i.name,n.project.local_path=i.local_path,n.project.test_command=i.test_command,n.project.workflow_name=i.workflow_name,n.project.team_id=i.team_id;try{n.project.workflow_name_resolves=e.getWorkflowByName(i.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let i=e.listProjectWorkflows(n.project.id);n.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,c=null;try{let u=e.listWorkflows().find(f=>f.id===o.workflow_id);u!==void 0&&(a=u.name,l=u.version,c=u.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let i=e.listTeamMembers(n.project.team_id);for(let a of i)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let o=new Set(i.map(a=>a.alias));n.team.missingAliases=jv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Fv(e){let t=[];if(e.dispatch.sectionAvailable&&!e.dispatch.rowExists)return t.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),t;e.dispatch.rowExists&&e.job.exists&&(e.job.run_id===null||e.job.run_id===void 0)&&!e.run.exists&&t.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),e.daemon.intervalMs>Af&&t.push({cause:`Daemon poll interval is ${e.daemon.intervalMs}ms (${Math.round(e.daemon.intervalMs/1e3)}s); WT/dev expected <=${Af}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),e.project.exists&&e.workflows.sectionAvailable&&e.workflows.count===0&&e.project.workflow_name_resolves!==!0&&t.push({cause:`Project ${e.project.name??`id=${e.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile path."}),e.team.sectionAvailable&&e.team.missingAliases.length>0&&t.push({cause:`Default team (team_id=${e.team.teamId??"?"}) missing required aliases: ${e.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=e.team.sectionAvailable?e.team.members.filter(s=>Rf.has(s.state)):[];if(e.run.exists&&(e.run.paused_step??null)!==null||r.length>0){let s=e.run.paused_step??null,i=r.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;t.push({cause:o,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return e.dispatch.rowExists&&e.job.exists&&!e.run.exists&&e.daemon.workerPid===null&&t.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),t.slice(0,3)}function Uv(e,t){let r=[];if(r.push(`DIAGNOSE ${e.promptId}`),r.push(""),r.push("[PROMPT]"),e.prompt.exists?(r.push(` id: ${e.promptId}`),r.push(` project_id: ${e.prompt.project_id??"?"}`),r.push(` text: ${e.prompt.text_preview??"?"}`),r.push(` created_at: ${e.prompt.created_at??"?"}`),r.push(` completed_at: ${e.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),e.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${e.dispatch.rowExists?"YES":"NO"}`),e.dispatch.rowExists&&(r.push(` job_id: ${e.prompt.job_id??"?"}`),r.push(` dispatched_at: ${e.prompt.created_at??"?"}`),r.push(` last_seen_status: ${kq(e)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),e.job.sectionAvailable?e.job.exists?e.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${e.run.id??"?"}`),r.push(` current_step: ${e.run.current_state??"null"}`),r.push(` status: ${e.run.terminal_state??"in_progress"}`),r.push(` started_at: ${e.run.started_at??"?"}`),r.push(` attempts: ${e.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${e.prompt.job_id??"?"} status=${e.job.status??"?"} attempts=${e.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),e.project.sectionAvailable?e.project.exists?(r.push(` id: ${e.project.id??"?"}`),r.push(` name: ${e.project.name??"?"}`),r.push(` local_path: ${e.project.local_path??"?"}`),r.push(` test_command: ${e.project.test_command??"null"}`),r.push(` default_workflow: ${e.project.workflow_name??"null"}`)):e.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${e.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!e.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(e.workflows.count===0&&e.project.exists&&e.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${e.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${e.workflows.count}`);for(let i of e.workflows.rows)r.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!e.team.sectionAvailable)r.push(" team_member table not accessible");else if(e.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{e.team.members.length===0&&r.push(" (no members)");for(let i of e.team.members)r.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.sessiondir}`);e.team.missingAliases.length>0&&r.push(` ! missing aliases: ${e.team.missingAliases.join(", ")}`)}r.push("");let n=e.team.sectionAvailable?e.team.members.filter(i=>Rf.has(i.state)):[],s=e.run.exists?e.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let i=e.run.paused_at??e.run.started_at??"?";r.push(` paused_step: ${s} (started: ${i})`)}if(n.length>0){let i=n.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${i}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${e.daemon.workerPid===null?"not observable from CLI":String(e.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${e.daemon.intervalMs}`),r.push(` last daemon tick: ${e.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),t.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of t)r.push(` - ${i.cause}`),r.push(` -> ${i.action}`);return r.join(`
2538
+ `),1}}function $v(e){let t={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--output"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --output";t.outputPath=i;continue}if(s==="--upload"){t.upload=!0;continue}if(s==="--internal-s3"){t.internalS3=!0;continue}if(s==="--hq"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --hq";t.hqUrl=i,t.upload=!0;continue}if(s==="--include"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!Sq(i))return`unknown section: ${i} (expected one of ${Ys.join(", ")})`;r.push(i);continue}if(s==="--no-sanitize"){t.noSanitize=!0;continue}if(s==="--json"){t.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(t.include=r),t}function Sq(e){return Ys.includes(e)}function vq(e){return Tq(Eq(),`lmctl-diag-${e}.tar.gz`)}function kq(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2539
+ `)}var Mv=T(()=>{"use strict";Fn();Rv();kf();Ks();Ov();Xe();Re()});var Wv={};ye(Wv,{ATTENTION_STATES:()=>Rf,DAEMON_INTERVAL_FAST_MS:()=>Af,REQUIRED_TEAM_ALIASES:()=>jv,chooseDiagnoses:()=>Fv,collectEvidence:()=>Pv,diagnose:()=>Dv,renderReport:()=>Uv,runDiagnosePrompt:()=>xq});function Dv(e,t){let r=Pv(e,t),n=Fv(r);return Uv(r,n)}function Pv(e,t){let r=t.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:ks(),lastTickAt:null}},s=null;try{s=e.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=Nq(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let i=e.getJob(n.prompt.job_id);if(i!==null&&(n.job.exists=!0,n.job.status=i.status,n.job.attempt_count=i.attempt_count,n.job.last_error=i.last_error,n.job.available_at=i.available_at,n.job.locked_by=i.locked_by,n.job.run_id=i.run_id,i.run_id!==null))try{let o=e.getRun(i.run_id);if(o!==null){n.run.exists=!0,n.run.id=o.id,n.run.current_state=o.current_state,n.run.terminal_state=o.terminal_state,n.run.started_at=o.started_at,n.run.ended_at=o.ended_at;let a="__paused__:";n.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,n.run.paused_at=o.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let i=e.getProject(n.prompt.project_id);if(i!==null){n.project.exists=!0,n.project.id=i.id,n.project.name=i.name,n.project.local_path=i.local_path,n.project.test_command=i.test_command,n.project.workflow_name=i.workflow_name,n.project.team_id=i.team_id;try{n.project.workflow_name_resolves=e.getWorkflowByName(i.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let i=e.listProjectWorkflows(n.project.id);n.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,c=null;try{let u=e.listWorkflows().find(f=>f.id===o.workflow_id);u!==void 0&&(a=u.name,l=u.version,c=u.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let i=e.listTeamMembers(n.project.team_id);for(let a of i)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let o=new Set(i.map(a=>a.alias));n.team.missingAliases=jv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Fv(e){let t=[];if(e.dispatch.sectionAvailable&&!e.dispatch.rowExists)return t.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),t;e.dispatch.rowExists&&e.job.exists&&(e.job.run_id===null||e.job.run_id===void 0)&&!e.run.exists&&t.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),e.daemon.intervalMs>Af&&t.push({cause:`Daemon poll interval is ${e.daemon.intervalMs}ms (${Math.round(e.daemon.intervalMs/1e3)}s); WT/dev expected <=${Af}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),e.project.exists&&e.workflows.sectionAvailable&&e.workflows.count===0&&e.project.workflow_name_resolves!==!0&&t.push({cause:`Project ${e.project.name??`id=${e.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile path."}),e.team.sectionAvailable&&e.team.missingAliases.length>0&&t.push({cause:`Default team (team_id=${e.team.teamId??"?"}) missing required aliases: ${e.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=e.team.sectionAvailable?e.team.members.filter(s=>Rf.has(s.state)):[];if(e.run.exists&&(e.run.paused_step??null)!==null||r.length>0){let s=e.run.paused_step??null,i=r.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;t.push({cause:o,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return e.dispatch.rowExists&&e.job.exists&&!e.run.exists&&e.daemon.workerPid===null&&t.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),t.slice(0,3)}function Uv(e,t){let r=[];if(r.push(`DIAGNOSE ${e.promptId}`),r.push(""),r.push("[PROMPT]"),e.prompt.exists?(r.push(` id: ${e.promptId}`),r.push(` project_id: ${e.prompt.project_id??"?"}`),r.push(` text: ${e.prompt.text_preview??"?"}`),r.push(` created_at: ${e.prompt.created_at??"?"}`),r.push(` completed_at: ${e.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),e.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${e.dispatch.rowExists?"YES":"NO"}`),e.dispatch.rowExists&&(r.push(` job_id: ${e.prompt.job_id??"?"}`),r.push(` dispatched_at: ${e.prompt.created_at??"?"}`),r.push(` last_seen_status: ${Iq(e)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),e.job.sectionAvailable?e.job.exists?e.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${e.run.id??"?"}`),r.push(` current_step: ${e.run.current_state??"null"}`),r.push(` status: ${e.run.terminal_state??"in_progress"}`),r.push(` started_at: ${e.run.started_at??"?"}`),r.push(` attempts: ${e.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${e.prompt.job_id??"?"} status=${e.job.status??"?"} attempts=${e.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),e.project.sectionAvailable?e.project.exists?(r.push(` id: ${e.project.id??"?"}`),r.push(` name: ${e.project.name??"?"}`),r.push(` local_path: ${e.project.local_path??"?"}`),r.push(` test_command: ${e.project.test_command??"null"}`),r.push(` default_workflow: ${e.project.workflow_name??"null"}`)):e.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${e.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!e.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(e.workflows.count===0&&e.project.exists&&e.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${e.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${e.workflows.count}`);for(let i of e.workflows.rows)r.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!e.team.sectionAvailable)r.push(" team_member table not accessible");else if(e.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{e.team.members.length===0&&r.push(" (no members)");for(let i of e.team.members)r.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.sessiondir}`);e.team.missingAliases.length>0&&r.push(` ! missing aliases: ${e.team.missingAliases.join(", ")}`)}r.push("");let n=e.team.sectionAvailable?e.team.members.filter(i=>Rf.has(i.state)):[],s=e.run.exists?e.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let i=e.run.paused_at??e.run.started_at??"?";r.push(` paused_step: ${s} (started: ${i})`)}if(n.length>0){let i=n.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${i}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${e.daemon.workerPid===null?"not observable from CLI":String(e.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${e.daemon.intervalMs}`),r.push(` last daemon tick: ${e.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),t.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of t)r.push(` - ${i.cause}`),r.push(` -> ${i.action}`);return r.join(`
2539
2540
  `)+`
2540
- `}function kq(e){return e.dispatch.rowExists?e.prompt.completed_at!==null&&e.prompt.completed_at!==void 0?"done":e.job.exists?e.run.exists?e.run.terminal_state!==null&&e.run.terminal_state!==void 0?`terminal:${e.run.terminal_state}`:`running:${e.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function Iq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function Nq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${xf()}
2541
+ `}function Iq(e){return e.dispatch.rowExists?e.prompt.completed_at!==null&&e.prompt.completed_at!==void 0?"done":e.job.exists?e.run.exists?e.run.terminal_state!==null&&e.run.terminal_state!==void 0?`terminal:${e.run.terminal_state}`:`running:${e.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function Nq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function xq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${xf()}
2541
2542
  `),0;let r=[];for(let s of e){if(s.startsWith("--"))return t.stderr.write(`error: unknown flag: ${s}
2542
2543
  `),t.stderr.write(`${xf()}
2543
2544
  `),2;r.push(s)}if(r.length!==1)return t.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2544
2545
  `),t.stderr.write(`${xf()}
2545
2546
  `),2;let n=r[0];try{return await $(t,s=>(t.stdout.write(Dv(s,n)),0))}catch(s){return t.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2546
2547
  `),1}}function xf(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
2547
- `)}var jv,Af,Rf,Bv=T(()=>{"use strict";Kd();Re();jv=["Coder","Reviewer1","Polisher"],Af=3e4,Rf=new Set(["attention_needed","paused","escalation"])});var ak={};ye(ak,{appendIntent:()=>rk,resolveIntentLogPath:()=>tk,runStatus:()=>Uq});import{appendFileSync as xq,mkdirSync as Aq}from"node:fs";import{homedir as Rq,hostname as Lq}from"node:os";import{basename as Oq,dirname as ek,isAbsolute as $q,join as Cq,resolve as Mq}from"node:path";function tk(){return process.env.LMCTL_INTENT_LOG??Cq(Rq(),".lmctl","recent-intents.log")}function rk(e){try{let t=tk();Aq(ek(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});xq(t,`${r}
2548
- `)}catch{}}async function Uq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(jq),0;let r=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(t,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Z(e,["--since"],["--json"]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,`unknown argument: ${n.positionals[0]}`);let s=G(n,"--json"),i=pH(P(n,"--since"));if("error"in i)return v(t,i.error);try{let o=t.env??process.env;if(s){let a=await $(t,l=>Vv(l,o));ae(t,a)}else{let a=await $(t,l=>Zq(Vv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return rk({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}function Vv(e,t){let r=Lu(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error($s("status"));return Bq(e)}return Wq(e,r.identity)}function Wq(e,t){let r=qr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error($s("status"));let s=De(n.teamfile_path,e);return{scope:"self",identity:r.value,...nk(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(i=>Hq(e,n.teamfile_path,i)),activity:{from_me:Of(Lf(e,{from:r.value})).map(i=>$f(i,e)),to_me:Of(Lf(e,{target_teamfile:r.teamfile,target_alias:r.alias})).map(i=>$f(i,e))},mailbox:{outbound:qa(Xq(e,r.teamfile,r.alias),"outbound"),inbound_pending:qa(Gq(e,r.teamfile,r.alias),"inbound")},waiting_on:Vq(e,r.teamfile,r.alias).map(sk)}}function nk(){return{workspace:Dt(),db_path:le()}}function Bq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...nk(),teams:t.map(r=>qq(e,r)),activity:Of(Lf(e)).map(r=>$f(r,e)),mailbox:{pending_outbound:qa(Kv(e,"sender"),"outbound"),pending_inbound:qa(Kv(e,"receiver"),"inbound")},waiting_on:Kq(e).map(sk)}}function qq(e,t){let r=0;try{r=De(t.teamfile_path,e).members.length}catch{r=0}return{name:t.name,teamfile:t.teamfile_path,member_count:r,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at}}function Hq(e,t,r){let n=r.teamfile===void 0?null:we($q(r.teamfile)?r.teamfile:Mq(ek(t),r.teamfile),e),s=Pr(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?Jq(e,t,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:t,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function Jq(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2548
+ `)}var jv,Af,Rf,Bv=T(()=>{"use strict";Kd();Re();jv=["Coder","Reviewer1","Polisher"],Af=3e4,Rf=new Set(["attention_needed","paused","escalation"])});var ak={};ye(ak,{appendIntent:()=>rk,resolveIntentLogPath:()=>tk,runStatus:()=>Wq});import{appendFileSync as Aq,mkdirSync as Rq}from"node:fs";import{homedir as Lq,hostname as Oq}from"node:os";import{basename as $q,dirname as ek,isAbsolute as Cq,join as Mq,resolve as jq}from"node:path";function tk(){return process.env.LMCTL_INTENT_LOG??Mq(Lq(),".lmctl","recent-intents.log")}function rk(e){try{let t=tk();Rq(ek(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});Aq(t,`${r}
2549
+ `)}catch{}}async function Wq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(Dq),0;let r=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(t,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Z(e,["--since"],["--json"]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,`unknown argument: ${n.positionals[0]}`);let s=G(n,"--json"),i=_H(P(n,"--since"));if("error"in i)return v(t,i.error);try{let o=t.env??process.env;if(s){let a=await $(t,l=>Vv(l,o));ae(t,a)}else{let a=await $(t,l=>Qq(Vv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return rk({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}function Vv(e,t){let r=Lu(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error($s("status"));return qq(e)}return Bq(e,r.identity)}function Bq(e,t){let r=qr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error($s("status"));let s=Pe(n.teamfile_path,e);return{scope:"self",identity:r.value,...nk(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(i=>Jq(e,n.teamfile_path,i)),activity:{from_me:Of(Lf(e,{from:r.value})).map(i=>$f(i,e)),to_me:Of(Lf(e,{target_teamfile:r.teamfile,target_alias:r.alias})).map(i=>$f(i,e))},mailbox:{outbound:qa(Gq(e,r.teamfile,r.alias),"outbound"),inbound_pending:qa(Vq(e,r.teamfile,r.alias),"inbound")},waiting_on:Kq(e,r.teamfile,r.alias).map(sk)}}function nk(){return{workspace:Dt(),db_path:le()}}function qq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...nk(),teams:t.map(r=>Hq(e,r)),activity:Of(Lf(e)).map(r=>$f(r,e)),mailbox:{pending_outbound:qa(Kv(e,"sender"),"outbound"),pending_inbound:qa(Kv(e,"receiver"),"inbound")},waiting_on:Yq(e).map(sk)}}function Hq(e,t){let r=0;try{r=Pe(t.teamfile_path,e).members.length}catch{r=0}return{name:t.name,teamfile:t.teamfile_path,member_count:r,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at}}function Jq(e,t,r){let n=r.teamfile===void 0?null:we(Cq(r.teamfile)?r.teamfile:jq(ek(t),r.teamfile),e),s=Pr(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?Xq(e,t,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:t,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function Xq(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2549
2550
  SELECT * FROM tracked_invocation
2550
2551
  WHERE kind = 'chat'
2551
2552
  AND status = 'running'
@@ -2555,18 +2556,18 @@ delete requires --confirm; deleting default or active workspaces also requires -
2555
2556
  AND holder_pid IS ?
2556
2557
  ORDER BY started_at DESC, id DESC
2557
2558
  LIMIT 5
2558
- `).all(t,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:fH(o.request_payload)}}function Lf(e,t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(t.target_teamfile)),t.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(t.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return e.db.prepare(`
2559
+ `).all(t,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:mH(o.request_payload)}}function Lf(e,t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(t.target_teamfile)),t.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(t.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return e.db.prepare(`
2559
2560
  SELECT * FROM tracked_invocation
2560
2561
  ${s}
2561
2562
  ORDER BY started_at DESC, id DESC
2562
- `).all(...n)}function Xq(e,t,r){return e.db.prepare(`
2563
+ `).all(...n)}function Gq(e,t,r){return e.db.prepare(`
2563
2564
  SELECT * FROM agent_mailbox
2564
2565
  WHERE sender_teamfile = ?
2565
2566
  AND sender_alias = ?
2566
2567
  AND delivered_at IS NULL
2567
2568
  AND delivering_at IS NULL
2568
2569
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
2569
- `).all(t,r)}function Gq(e,t,r){return e.db.prepare(`
2570
+ `).all(t,r)}function Vq(e,t,r){return e.db.prepare(`
2570
2571
  SELECT * FROM agent_mailbox
2571
2572
  WHERE receiver_teamfile = ?
2572
2573
  AND receiver_alias = ?
@@ -2578,13 +2579,23 @@ delete requires --confirm; deleting default or active workspaces also requires -
2578
2579
  WHERE delivered_at IS NULL
2579
2580
  AND delivering_at IS NULL
2580
2581
  ORDER BY ${r}
2581
- `).all()}function Vq(e,t,r){return e.db.prepare(`
2582
+ `).all()}function Kq(e,t,r){return e.db.prepare(`
2582
2583
  SELECT * FROM agent_mailbox
2583
2584
  WHERE sender_teamfile = ?
2584
2585
  AND sender_alias = ?
2585
2586
  AND (
2586
2587
  delivered_at IS NULL
2587
- OR (delivered_at IS NOT NULL AND (receipt IS NULL OR receipt = ''))
2588
+ OR (
2589
+ delivered_at IS NOT NULL
2590
+ AND message_type = 'request'
2591
+ AND (receipt IS NULL OR receipt = '')
2592
+ AND NOT EXISTS (
2593
+ SELECT 1
2594
+ FROM agent_mailbox AS response
2595
+ WHERE response.message_type = 'response'
2596
+ AND response.request_mailbox_id = agent_mailbox.id
2597
+ )
2598
+ )
2588
2599
  )
2589
2600
  ORDER BY
2590
2601
  CASE
@@ -2592,19 +2603,29 @@ delete requires --confirm; deleting default or active workspaces also requires -
2592
2603
  ELSE delivered_at
2593
2604
  END ASC,
2594
2605
  id ASC
2595
- `).all(t,r)}function Kq(e){return e.db.prepare(`
2606
+ `).all(t,r)}function Yq(e){return e.db.prepare(`
2596
2607
  SELECT * FROM agent_mailbox
2597
2608
  WHERE delivered_at IS NULL
2598
- OR (delivered_at IS NOT NULL AND (receipt IS NULL OR receipt = ''))
2609
+ OR (
2610
+ delivered_at IS NOT NULL
2611
+ AND message_type = 'request'
2612
+ AND (receipt IS NULL OR receipt = '')
2613
+ AND NOT EXISTS (
2614
+ SELECT 1
2615
+ FROM agent_mailbox AS response
2616
+ WHERE response.message_type = 'response'
2617
+ AND response.request_mailbox_id = agent_mailbox.id
2618
+ )
2619
+ )
2599
2620
  ORDER BY
2600
2621
  CASE
2601
2622
  WHEN delivered_at IS NULL THEN created_at
2602
2623
  ELSE delivered_at
2603
2624
  END ASC,
2604
2625
  id ASC
2605
- `).all()}function Of(e){let t=Date.now();return e.filter(r=>r.status!=="running"||!Yq(r,t,Pq))}function Yq(e,t,r){if(e.holder_host===Lq()&&zq(e.holder_pid))return!Ft(e.holder_pid);let n=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(n)&&t-n>r}function zq(e){return Number.isInteger(e)&&(e??0)>0}function sk(e){let t=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:t?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,age_basis_at:t?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function $f(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,mailbox_delivery:null,from_identity:e.from_identity,target:e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,started_at:e.started_at,ended_at:e.ended_at,result:Qv(e.result_summary),error:Qv(e.error)};return r.mailbox_delivery=oH(r,t),r}function qa(e,t){let r=new Map;for(let n of e){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=t==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function Zq(e,t){return e.scope==="self"?Qq(e,t):eH(e,t)}function Qq(e,t){let r=[];r.push(`identity: ${e.identity}`),r.push(`team: ${e.team.name}`),r.push(`teamfile: ${e.team.teamfile}`),r.push(""),r.push("members:"),e.members.length===0&&r.push(" none");for(let n of e.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),ok(r,e.waiting_on,"self"),r.push(""),r.push("activity from me:"),Cf(r,Mf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Cf(r,Mf(e.activity.to_me,t.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Ha(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Ha(r,e.mailbox.inbound_pending),r.push(""),r.push(ik(e)),r.join(`
2606
- `)}function eH(e,t){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),e.teams.length===0&&r.push(" none");for(let n of e.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),ok(r,e.waiting_on,"workspace"),r.push(""),r.push("recent activity:"),Cf(r,Mf(e.activity,t.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),Ha(r,e.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Ha(r,e.mailbox.pending_inbound),r.push(""),r.push(ik(e)),r.join(`
2607
- `)}function ik(e){return Vs(e.workspace,e.db_path)}function Cf(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(Zv).sort(sH),s=n.length===0?t:t.filter(i=>!Zv(i));for(let i of n.slice(0,Hv))zv(e,i,r);jf(e,n.length,Hv,"more open delegations");for(let i of s.slice(0,qv))zv(e,i,r);jf(e,s.length,qv,"older")}function ok(e,t,r){if(t.length===0){e.push(" none");return}let n=tH(t,Dq);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${tr(s.sender)} -> ${tr(s.receiver)}`:tr(s.receiver);e.push(` ${i} - ${s.state} ${mH(s.age_basis_at)} (#${s.id}, ${s.message_type})`)}nH(e,t,n)}function tH(e,t){let r=[...e].sort(Yv);if(r.length<=t)return r;let n=r.slice(0,t),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=rH(n);a>=0&&(n[a]=o)}return n.sort(Yv)}function rH(e){let t=new Map;for(let r of e)t.set(r.state,(t.get(r.state)??0)+1);for(let r=e.length-1;r>=0;r-=1)if((t.get(e[r].state)??0)>1)return r;return-1}function nH(e,t,r){let n=new Set(r.map(l=>l.id)),s=t.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);e.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function Yv(e,t){let r=Date.parse(e.age_basis_at),n=Date.parse(t.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:e.id-t.id}function Mf(e,t){let r=Date.parse(t);return Number.isFinite(r)?e.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):e}function zv(e,t,r){let n=dH(t,r),s=t.status==="running"?`since ${t.started_at}`:`ended ${t.ended_at??t.started_at}`,i=t.error??t.result,o=i===null?"":` "${uH(i)}"`;e.push(` #${t.id} ${iH(t)} ${t.kind}${n} ${s}${o}`)}function Zv(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function sH(e,t){let r=Date.parse(e.started_at)-Date.parse(t.started_at);return Number.isFinite(r)&&r!==0?r:e.id-t.id}function iH(e){return e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function oH(e,t){let r=aH(e,t);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function aH(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=qr(e.from_identity),n=qr(e.target)}catch{return null}for(let s of lH(e.result)){let i=t.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&cH(i,e))return i}return null}function lH(e){let t=new Set,r=[];for(let n of e.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||t.has(s)||(t.add(s),r.push(s))}return r}function cH(e,t){let r=Date.parse(t.started_at),n=Date.parse(t.ended_at??t.started_at),s=Date.parse(e.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function dH(e,t){if(t==="from-me")return e.target===null?"":` -> ${tr(e.target)}`;if(t==="to-me")return` from ${tr(e.from_identity)}`;let r=e.target===null?"":` -> ${tr(e.target)}`;return` from ${tr(e.from_identity)}${r}`}function jf(e,t,r,n){let s=t-r;s>0&&e.push(` (+${s} ${n} -- use --json)`)}function Ha(e,t){if(t.length===0){e.push(" none");return}for(let r of t.slice(0,Jv)){let n=r.sender??"operator";e.push(` ${tr(n)} -> ${tr(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}jf(e,t.length,Jv,"more lanes")}function Qv(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function uH(e){let t=e.replace(/\s+/g," ").trim();return t.length<=Xv?t:`${t.slice(0,Xv-3)}...`}function fH(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=Gv?t:`${t.slice(0,Gv-3)}...`}function mH(e){let t=Date.parse(e);if(!Number.isFinite(t))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function tr(e){if(e==="operator")return e;try{let t=qr(e);return`${Oq(t.teamfile)}:${t.alias}`}catch{return e}}function pH(e){if(e===void 0)return{iso:new Date(Date.now()-Fq).toISOString()};let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}}var jq,qv,Hv,Jv,Dq,Pq,Fq,Xv,Gv,lk=T(()=>{"use strict";Fr();Qs();Re();Ou();Je();Ta();Rt();jq=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2626
+ `).all()}function Of(e){let t=Date.now();return e.filter(r=>r.status!=="running"||!zq(r,t,Fq))}function zq(e,t,r){if(e.holder_host===Oq()&&Zq(e.holder_pid))return!Ft(e.holder_pid);let n=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(n)&&t-n>r}function Zq(e){return Number.isInteger(e)&&(e??0)>0}function sk(e){let t=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:t?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,age_basis_at:t?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function $f(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,mailbox_delivery:null,from_identity:e.from_identity,target:e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,started_at:e.started_at,ended_at:e.ended_at,result:Qv(e.result_summary),error:Qv(e.error)};return r.mailbox_delivery=aH(r,t),r}function qa(e,t){let r=new Map;for(let n of e){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=t==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function Qq(e,t){return e.scope==="self"?eH(e,t):tH(e,t)}function eH(e,t){let r=[];r.push(`identity: ${e.identity}`),r.push(`team: ${e.team.name}`),r.push(`teamfile: ${e.team.teamfile}`),r.push(""),r.push("members:"),e.members.length===0&&r.push(" none");for(let n of e.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),ok(r,e.waiting_on,"self"),r.push(""),r.push("activity from me:"),Cf(r,Mf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Cf(r,Mf(e.activity.to_me,t.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Ha(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Ha(r,e.mailbox.inbound_pending),r.push(""),r.push(ik(e)),r.join(`
2627
+ `)}function tH(e,t){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),e.teams.length===0&&r.push(" none");for(let n of e.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),ok(r,e.waiting_on,"workspace"),r.push(""),r.push("recent activity:"),Cf(r,Mf(e.activity,t.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),Ha(r,e.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Ha(r,e.mailbox.pending_inbound),r.push(""),r.push(ik(e)),r.join(`
2628
+ `)}function ik(e){return Vs(e.workspace,e.db_path)}function Cf(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(Zv).sort(iH),s=n.length===0?t:t.filter(i=>!Zv(i));for(let i of n.slice(0,Hv))zv(e,i,r);jf(e,n.length,Hv,"more open delegations");for(let i of s.slice(0,qv))zv(e,i,r);jf(e,s.length,qv,"older")}function ok(e,t,r){if(t.length===0){e.push(" none");return}let n=rH(t,Pq);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${tr(s.sender)} -> ${tr(s.receiver)}`:tr(s.receiver);e.push(` ${i} - ${s.state} ${pH(s.age_basis_at)} (#${s.id}, ${s.message_type})`)}sH(e,t,n)}function rH(e,t){let r=[...e].sort(Yv);if(r.length<=t)return r;let n=r.slice(0,t),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=nH(n);a>=0&&(n[a]=o)}return n.sort(Yv)}function nH(e){let t=new Map;for(let r of e)t.set(r.state,(t.get(r.state)??0)+1);for(let r=e.length-1;r>=0;r-=1)if((t.get(e[r].state)??0)>1)return r;return-1}function sH(e,t,r){let n=new Set(r.map(l=>l.id)),s=t.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);e.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function Yv(e,t){let r=Date.parse(e.age_basis_at),n=Date.parse(t.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:e.id-t.id}function Mf(e,t){let r=Date.parse(t);return Number.isFinite(r)?e.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):e}function zv(e,t,r){let n=uH(t,r),s=t.status==="running"?`since ${t.started_at}`:`ended ${t.ended_at??t.started_at}`,i=t.error??t.result,o=i===null?"":` "${fH(i)}"`;e.push(` #${t.id} ${oH(t)} ${t.kind}${n} ${s}${o}`)}function Zv(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function iH(e,t){let r=Date.parse(e.started_at)-Date.parse(t.started_at);return Number.isFinite(r)&&r!==0?r:e.id-t.id}function oH(e){return e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function aH(e,t){let r=lH(e,t);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function lH(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=qr(e.from_identity),n=qr(e.target)}catch{return null}for(let s of cH(e.result)){let i=t.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&dH(i,e))return i}return null}function cH(e){let t=new Set,r=[];for(let n of e.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||t.has(s)||(t.add(s),r.push(s))}return r}function dH(e,t){let r=Date.parse(t.started_at),n=Date.parse(t.ended_at??t.started_at),s=Date.parse(e.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function uH(e,t){if(t==="from-me")return e.target===null?"":` -> ${tr(e.target)}`;if(t==="to-me")return` from ${tr(e.from_identity)}`;let r=e.target===null?"":` -> ${tr(e.target)}`;return` from ${tr(e.from_identity)}${r}`}function jf(e,t,r,n){let s=t-r;s>0&&e.push(` (+${s} ${n} -- use --json)`)}function Ha(e,t){if(t.length===0){e.push(" none");return}for(let r of t.slice(0,Jv)){let n=r.sender??"operator";e.push(` ${tr(n)} -> ${tr(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}jf(e,t.length,Jv,"more lanes")}function Qv(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function fH(e){let t=e.replace(/\s+/g," ").trim();return t.length<=Xv?t:`${t.slice(0,Xv-3)}...`}function mH(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=Gv?t:`${t.slice(0,Gv-3)}...`}function pH(e){let t=Date.parse(e);if(!Number.isFinite(t))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function tr(e){if(e==="operator")return e;try{let t=qr(e);return`${$q(t.teamfile)}:${t.alias}`}catch{return e}}function _H(e){if(e===void 0)return{iso:new Date(Date.now()-Uq).toISOString()};let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}}var Dq,qv,Hv,Jv,Pq,Fq,Uq,Xv,Gv,lk=T(()=>{"use strict";Fr();Qs();Re();Ou();Xe();Ta();Rt();Dq=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2608
2629
 
2609
2630
  Show this member's team, busy/idle roster, recent tracked activity, and mailbox
2610
2631
  state. From a plain operator shell, show a workspace-level team/activity summary.
@@ -2612,7 +2633,7 @@ state. From a plain operator shell, show a workspace-level team/activity summary
2612
2633
  Text output shows recent activity from the last 24h by default. Use --since 7d
2613
2634
  or an ISO timestamp to widen the investigation window. --json returns complete,
2614
2635
  uncapped data.
2615
- `,qv=5,Hv=5,Jv=5,Dq=5,Pq=8*60*60*1e3,Fq=24*60*60*1e3,Xv=72,Gv=80});Je();Fn();ve();import{pathToFileURL as _H}from"node:url";import{mkdirSync as rI,readFileSync as nI,renameSync as sI,writeFileSync as iI}from"node:fs";import{homedir as oI}from"node:os";import{dirname as aI,join as lI}from"node:path";function om(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function eI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function tI(e,t){return!eI(e)||om(e)?null:`${t} must use https://: ${e}`}async function am(e,t){let r=tI(e,t.description);if(r!==null||!om(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw im(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw im(e,t.description,n,a)}}finally{clearTimeout(i)}}function im(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Fn();var cI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",dI=60*60*1e3,uI=1500;function fI(){let e=process.env.HOME??oI();return lI(e,".lmctl",".update-check.json")}function mI(e){return e.isTTY===!0}function pI(e,t){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function Za(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!mI(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function _I(e,t){try{let r=JSON.parse(nI(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<dI)return r.latest}catch{}return null}function hI(e,t){rI(aI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;iI(r,`${JSON.stringify(t)}
2636
+ `,qv=5,Hv=5,Jv=5,Pq=5,Fq=8*60*60*1e3,Uq=24*60*60*1e3,Xv=72,Gv=80});Xe();Fn();Te();import{pathToFileURL as hH}from"node:url";import{mkdirSync as rI,readFileSync as nI,renameSync as sI,writeFileSync as iI}from"node:fs";import{homedir as oI}from"node:os";import{dirname as aI,join as lI}from"node:path";function om(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function eI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function tI(e,t){return!eI(e)||om(e)?null:`${t} must use https://: ${e}`}async function am(e,t){let r=tI(e,t.description);if(r!==null||!om(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw im(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw im(e,t.description,n,a)}}finally{clearTimeout(i)}}function im(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Fn();var cI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",dI=60*60*1e3,uI=1500;function fI(){let e=process.env.HOME??oI();return lI(e,".lmctl",".update-check.json")}function mI(e){return e.isTTY===!0}function pI(e,t){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function Za(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!mI(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function _I(e,t){try{let r=JSON.parse(nI(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<dI)return r.latest}catch{}return null}function hI(e,t){rI(aI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;iI(r,`${JSON.stringify(t)}
2616
2637
  `,"utf8"),sI(r,e)}async function gI(){let e=await am(cI,{description:"lmctl npm metadata",timeoutMs:uI}),t=JSON.parse(e.toString("utf8"));if(typeof t.version!="string"||t.version.trim()==="")throw new Error("registry response missing version");return t.version}async function lm(e,t=[],r={}){try{if(Za(t,e))return;let n=r.now?.()??Date.now(),s=r.cachePath??fI();if(_I(s,n)!==null)return;let o=await(r.fetchLatest??gI)();try{hI(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??yt();pI(o,a)>0&&e.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
2617
2638
  `)}catch{}}var Mn=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2618
2639
  `,Df=`${Mn}
@@ -2665,14 +2686,14 @@ ${Mn}Run 'lmctl help' for usage.
2665
2686
  ${Mn}Run 'lmctl help' for usage.
2666
2687
  `),1):(e.stderr.write(`error: unknown command: ${t}
2667
2688
  ${Mn}Run 'lmctl help' for usage.
2668
- `),1)}async function hH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=rm();try{return await gH(e,t)}finally{nm(r)}}async function gH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--db"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Pf(t,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Pf(t,"missing value for --workspace");if(!ze(c))return Pf(t,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){tm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return t.stdout.write(`lmctl ${yt()}
2669
- `),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Df),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Df),0):ck.has(a)?dk(a,[...l,"--help"],t):uk(t,a)}qf(le(),t.stderr),Jf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Df),0;let o=Date.now();Ff(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await dk(s,i,t);return Ff(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),ck.has(s)&&!Za(r,t)&&await lm(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Ff(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:wH(l)}),yH(a,s,i,t)}}function Ff(e,t,r){Xe({event:e,record_kind:"cli_action",command:e,argv:t,cwd:process.cwd(),db_path:le(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:yt(),node_version:process.version,...r})}function yH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
2689
+ `),1)}async function gH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=rm();try{return await yH(e,t)}finally{nm(r)}}async function yH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--db"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Pf(t,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Pf(t,"missing value for --workspace");if(!ze(c))return Pf(t,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){tm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return t.stdout.write(`lmctl ${yt()}
2690
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Df),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Df),0):ck.has(a)?dk(a,[...l,"--help"],t):uk(t,a)}qf(le(),t.stderr),Jf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Df),0;let o=Date.now();Ff(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await dk(s,i,t);return Ff(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),ck.has(s)&&!Za(r,t)&&await lm(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Ff(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:EH(l)}),wH(a,s,i,t)}}function Ff(e,t,r){$e({event:e,record_kind:"cli_action",command:e,argv:t,cwd:process.cwd(),db_path:le(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:yt(),node_version:process.version,...r})}function wH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
2670
2691
  `),sm()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
2671
2692
  `),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
2672
- `),1)}function wH(e){let t=[],r=e.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));t.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return t}async function dk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(G_(),X_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(qT(),BT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(kb(),vb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>($b(),Ob));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(fS(),uS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(ES(),wS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(AS(),xS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(OS(),LS));return n(t,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(QS(),ZS));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(nv(),rv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(fv(),uv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Tv(),Ev));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Mv(),Cv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Bv(),Wv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(lk(),ak));return n(t,r)}case"db":return EH(t,r);default:return uk(r,e)}}function EH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2693
+ `),1)}function EH(e){let t=[],r=e.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));t.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return t}async function dk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(G_(),X_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(qT(),BT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(kb(),vb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>($b(),Ob));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(fS(),uS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(ES(),wS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(AS(),xS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(OS(),LS));return n(t,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(QS(),ZS));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(nv(),rv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(fv(),uv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Tv(),Ev));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Mv(),Cv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Bv(),Wv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(lk(),ak));return n(t,r)}case"db":return TH(t,r);default:return uk(r,e)}}function TH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2673
2694
 
2674
2695
  Database utilities. The downgrade command is currently a documented stub;
2675
2696
  restore from backup for rollback and use normal migrations for forward changes.
2676
2697
  `),0):r==="downgrade"?(t.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
2677
2698
  `),1):(t.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
2678
- `),1)}if(process.argv[1]!==void 0&&import.meta.url===_H(process.argv[1]).href){let e=await hH(process.argv.slice(2));process.exitCode=e}export{hH as runCli};
2699
+ `),1)}if(process.argv[1]!==void 0&&import.meta.url===hH(process.argv[1]).href){let e=await gH(process.argv.slice(2));process.exitCode=e}export{gH as runCli};